[comp.sources.unix] v12i058: A PostScript interpreter, Part09/18

rsalz@uunet.UU.NET (Rich Salz) (11/06/87)

Submitted-by: Crispin Goswell <caag@vd.rl.ac.uk>
Posting-number: Volume 12, Issue 58
Archive-name: postscript/part09

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 9 (of 18)."
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'postscript/fonts/Times/russian.r' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'postscript/fonts/Times/russian.r'\"
else
echo shar: Extracting \"'postscript/fonts/Times/russian.r'\" \(11645 characters\)
sed "s/^X//" >'postscript/fonts/Times/russian.r' <<'END_OF_FILE'
XCharStrings
X/2901
X<C53D
X453E
X443E
X443D
X453C
X473B
X4B3B
X4D3C
X4E3D
X4F3F
X4F46
X5048
X5149
XCE3D
X4E46
X4F48
X5149
X5249
XCE3F
X4D40
X4741
X4442
X4344
X4346
X4448
X4749
X4A49
X4C48
X4E46
XC741
X4542
X4444
X4446
X4548
X4749
X>
Xput
XMetrics
X/2901
X[-3
X20]
Xput
XCharStrings
X/2902
X<D034
X4F35
X4937
X4639
X443C
X433F
X4343
X4446
X4648
X4949
X4B49
X4E48
X5046
X5143
X5141
X503E
X4E3C
X4B3B
X493B
X463C
X443E
X4341
XD034
X4F36
X4D37
X4938
X463A
X443C
XC93B
X473C
X453E
X4441
X4443
X4546
X4748
X4949
XCB49
X4D48
X4F46
X5043
X5041
X4F3E
X4D3C
X4B3B
X>
Xput
XMetrics
X/2902
X[2
X20]
Xput
XCharStrings
X/2903
X<C53B
X4549
XC63B
X4649
XC23B
X4D3B
X503C
X513E
X513F
X5041
X4D42
XCD3B
X4F3C
X503E
X503F
X4F41
X4D42
XC642
X4D42
X5043
X5145
X5146
X5048
X4D49
X4249
XCD42
X4F43
X5045
X5046
X4F48
X4D49
X>
Xput
XMetrics
X/2903
X[-2
X20]
Xput
XCharStrings
X/2904
X<C53B
X4549
XC63B
X4649
XC23B
X503B
X5040
X4F3B
XC249
X4949
X>
Xput
XMetrics
X/2904
X[-2
X18]
Xput
XCharStrings
X/2905
X<C83B
X483F
X4745
X4648
X4549
XD13B
X5149
XD23B
X5249
XC53B
X553B
XC349
X424E
X4249
X5549
X554E
X5449
X>
Xput
XMetrics
X/2905
X[-2
X23]
Xput
XCharStrings
X/2906
X<C441
X5041
X503F
X4F3D
X4E3C
X4C3B
X493B
X463C
X443E
X4341
X4343
X4446
X4648
X4949
X4B49
X4E48
X5046
XCF41
X4F3E
X4E3C
XC93B
X473C
X453E
X4441
X4443
X4546
X4748
X4949
X>
Xput
XMetrics
X/2906
X[-3
X19]
Xput
XCharStrings
X/2907
X<CD3B
X4D49
XCE3B
X4E49
XCA3B
X513B
XC53C
X443D
X433C
X443B
X453B
X463C
X4840
X4941
X4B42
X5042
X5241
X5340
X553C
X563B
X573B
X583C
X573D
X563C
XCB42
X4943
X4844
X4648
X4549
XCB42
X4944
X4748
X4649
X4449
X4348
X4246
XD042
X5243
X5344
X5548
X5649
XD042
X5244
X5448
X5549
X5749
X5848
X5946
XCA49
X5149
X>
Xput
XMetrics
X/2907
X[-2
X27]
Xput
XCharStrings
X/2908
X<C43D
X433B
X433F
X443D
X453C
X473B
X4B3B
X4E3C
X4F3E
X4F3F
X4E41
X4B42
XCB3B
X4D3C
X4E3E
X4E3F
X4D41
X4B42
XC842
X4B42
X4E43
X4F45
X4F46
X4E48
X4B49
X4749
X4448
X4346
X4345
X4444
X4545
X4446
XCB42
X4D43
X4E45
X4E46
X4D48
X4B49
X>
Xput
XMetrics
X/2908
X[-3
X18]
Xput
XCharStrings
X/2909
X<C53B
X4549
XC63B
X4649
XD03B
X5049
XD13B
X5149
XC23B
X493B
XCD3B
X543B
XC249
X4949
XCD49
X5449
XD03C
X4648
X>
Xput
XMetrics
X/2909
X[-2
X22]
Xput
XCharStrings
X/2910
X<C53B
X4549
XC63B
X4649
XD03B
X5049
XD13B
X5149
XC23B
X493B
XCD3B
X543B
XC249
X4949
XCD49
X5449
XD03C
X4648
XC835
X4834
X4734
X4735
X4837
X4A38
X4C38
X4E37
X4F35
X>
Xput
XMetrics
X/2910
X[1
X22]
Xput
XCharStrings
X/2911
X<C53B
X4549
XC63B
X4649
XC23B
X493B
XC642
X4842
X4B41
X4C40
X4E3C
X4F3B
X503B
X513C
X503D
X4F3C
XC842
X4B43
X4C44
X4E48
X4F49
XC842
X4A43
X4B44
X4D48
X4E49
X5049
X5148
X5246
XC249
X4949
X>
Xput
XMetrics
X/2911
X[-2
X20]
Xput
XCharStrings
X/2912
X<C73B
X473F
X4645
X4548
X4449
X4349
X4248
X4347
X4448
XD03B
X5049
XD13B
X5149
XC43B
X543B
XCD49
X5449
X>
Xput
XMetrics
X/2912
X[-2
X22]
Xput
XCharStrings
X/2913
X<C53B
X4549
XC53B
X4B49
XC63B
X4B47
XD13B
X4B49
XD13B
X5149
XD23B
X5249
XC23B
X463B
XD13B
X553B
XC249
X4849
XCE49
X5549
X>
Xput
XMetrics
X/2913
X[-2
X23]
Xput
XCharStrings
X/2914
X<C53B
X4549
XC63B
X4649
XD03B
X5049
XD13B
X5149
XC23B
X493B
XCD3B
X543B
XC642
X5042
XC249
X4949
XCD49
X5449
X>
Xput
XMetrics
X/2914
X[-2
X22]
Xput
XCharStrings
X/2915
X<C93B
X463C
X443E
X4341
X4343
X4446
X4648
X4949
X4B49
X4E48
X5046
X5143
X5141
X503E
X4E3C
X4B3B
X493B
XC93B
X473C
X453E
X4441
X4443
X4546
X4748
X4949
XCB49
X4D48
X4F46
X5043
X5041
X4F3E
X4D3C
X4B3B
X>
Xput
XMetrics
X/2915
X[-3
X20]
Xput
XCharStrings
X/2916
X<C53B
X4549
XC63B
X4649
XD03B
X5049
XD13B
X5149
XC23B
X543B
XC249
X4949
XCD49
X5449
X>
Xput
XMetrics
X/2916
X[-2
X22]
Xput
XCharStrings
X/2917
X<C53B
X4550
XC63B
X4650
XC63E
X483C
X4A3B
X4C3B
X4F3C
X513E
X5241
X5243
X5146
X4F48
X4C49
X4A49
X4848
X4646
XCC3B
X4E3C
X503E
X5141
X5143
X5046
X4E48
X4C49
XC23B
X463B
XC250
X4950
X>
Xput
XMetrics
X/2917
X[-2
X21]
Xput
XCharStrings
X/2918
X<CF3E
X4E3F
X4F40
X503F
X503E
X4E3C
X4C3B
X493B
X463C
X443E
X4341
X4343
X4446
X4648
X4949
X4B49
X4E48
X5046
XC93B
X473C
X453E
X4441
X4443
X4546
X4748
X4949
X>
Xput
XMetrics
X/2918
X[-3
X19]
Xput
XCharStrings
X/2919
X<C93B
X4949
XCA3B
X4A49
XC43B
X4340
X433B
X503B
X5040
X4F3B
XC649
X4D49
X>
Xput
XMetrics
X/2919
X[-3
X19]
Xput
XCharStrings
X/2920
X<C33B
X4949
XC43B
X4947
XCF3B
X4949
X474D
X454F
X4350
X4250
X414F
X424E
X434F
XC13B
X473B
XCB3B
X513B
X>
Xput
XMetrics
X/2920
X[-1
X18]
Xput
XCharStrings
X/2921
X<CA34
X4A50
XCB34
X4B50
XC734
X4B34
XCA3E
X493C
X483B
X463B
X443C
X433F
X4345
X4448
X4649
X4849
X4948
X4A46
XC63B
X453C
X443F
X4445
X4548
X4649
XCF3B
X503C
X513F
X5145
X5048
X4F49
XCB3E
X4C3C
X4D3B
X4F3B
X513C
X523F
X5245
X5148
X4F49
X4D49
X4C48
X4B46
XC750
X4E50
X>
Xput
XMetrics
X/2921
X[2
X21]
Xput
XCharStrings
X/2922
X<C43B
X4F49
XC53B
X5049
XD03B
X4449
XC23B
X483B
XCC3B
X523B
XC249
X4849
XCC49
X5249
X>
Xput
XMetrics
X/2922
X[-2
X20]
Xput
XCharStrings
X/2923
X<C53B
X4549
XC63B
X4649
XD03B
X5049
XD13B
X5149
XC23B
X493B
XCD3B
X543B
XC249
X5449
X544E
X5349
X>
Xput
XMetrics
X/2923
X[-2
X22]
Xput
XCharStrings
X/2924
X<C53B
X4542
X4644
X4945
X4B45
X4E44
X5042
XC63B
X4642
X4744
X4945
XD03B
X5049
XD13B
X5149
XC23B
X493B
XCD3B
X543B
XCD49
X5449
X>
Xput
XMetrics
X/2924
X[-2
X22]
Xput
XCharStrings
X/2925
X<C53B
X4549
XC63B
X4649
XCF3B
X4F49
XD03B
X5049
XD93B
X5949
XDA3B
X5A49
XC23B
X493B
XCC3B
X533B
XD63B
X5D3B
XC249
X5D49
X>
Xput
XMetrics
X/2925
X[-2
X31]
Xput
XCharStrings
X/2926
X<C53B
X4549
XC63B
X4649
XCF3B
X4F49
XD03B
X5049
XD93B
X5949
XDA3B
X5A49
XC23B
X493B
XCC3B
X533B
XD63B
X5D3B
XC249
X5D49
X5D4E
X5C49
X>
Xput
XMetrics
X/2926
X[-2
X31]
Xput
XCharStrings
X/2927
X<C93B
X4949
XCA3B
X4A49
XC43B
X4340
X433B
X4D3B
XCA42
X4E42
X5143
X5245
X5246
X5148
X4E49
X4649
XCE42
X5043
X5145
X5146
X5048
X4E49
X>
Xput
XMetrics
X/2927
X[-3
X21]
Xput
XCharStrings
X/2928
X<C53B
X4549
XC63B
X4649
XC23B
X493B
XC642
X4A42
X4D43
X4E45
X4E46
X4D48
X4A49
X4249
XCA42
X4C43
X4D45
X4D46
X4C48
X4A49
XD43B
X5449
XD53B
X5549
XD13B
X583B
XD149
X5849
X>
Xput
XMetrics
X/2928
X[-2
X26]
Xput
XCharStrings
X/2929
X<C53B
X4549
XC63B
X4649
XC23B
X493B
XC642
X4A42
X4D43
X4E45
X4E46
X4D48
X4A49
X4249
XCA42
X4C43
X4D45
X4D46
X4C48
X4A49
X>
Xput
XMetrics
X/2929
X[-2
X17]
Xput
XCharStrings
X/2930
X<C43D
X433B
X433F
X443D
X453C
X473B
X4A3B
X4D3C
X4F3E
X5041
X5043
X4F46
X4D48
X4A49
X4749
X4548
X4346
X4345
X4444
X4545
X4446
XCA3B
X4C3C
X4E3E
X4F41
X4F43
X4E46
X4C48
X4A49
XC942
X4F42
X>
Xput
XMetrics
X/2930
X[-3
X19]
Xput
XCharStrings
X/2931
X<C53B
X4549
XC63B
X4649
XC23B
X493B
XC249
X4949
XD23B
X4F3C
X4D3E
X4C41
X4C43
X4D46
X4F48
X5249
X5449
X5748
X5946
X5A43
X5A41
X593E
X573C
X543B
X523B
XD23B
X503C
X4E3E
X4D41
X4D43
X4E46
X5048
X5249
XD449
X5648
X5846
X5943
X5941
X583E
X563C
X543B
XC642
X4C42
X>
Xput
XMetrics
X/2931
X[-2
X29]
Xput
XCharStrings
X/2932
X<CF3B
X4F49
XD03B
X5049
XD33B
X483B
X453C
X443E
X443F
X4541
X4842
X4F42
XC83B
X463C
X453E
X453F
X4641
X4842
XCD42
X4A43
X4944
X4748
X4649
XCD42
X4B43
X4A44
X4848
X4749
X4549
X4448
X4346
XCC49
X5349
X>
Xput
XMetrics
X/2932
X[-3
X21]
Xput
XCharStrings
X/2801
X<CA34
X4349
XCA34
X5149
XCA37
X5049
XC543
X4E43
XC149
X4749
XCD49
X5349
X>
Xput
XMetrics
X/2801
X[2
X20]
Xput
XCharStrings
X/2802
X<C534
X4549
XC634
X4649
XC234
X5234
X523A
X5134
XC63E
X4E3E
X513F
X5240
X5342
X5345
X5247
X5148
X4E49
X4249
XCE3E
X503F
X5140
X5242
X5245
X5147
X5048
X4E49
X>
Xput
XMetrics
X/2802
X[1
X22]
Xput
XCharStrings
X/2803
X<C534
X4549
XC634
X4649
XC234
X4E34
X5135
X5236
X5338
X533A
X523C
X513D
X4E3E
XCE34
X5035
X5136
X5238
X523A
X513C
X503D
X4E3E
XC63E
X4E3E
X513F
X5240
X5342
X5345
X5247
X5148
X4E49
X4249
XCE3E
X503F
X5140
X5242
X5245
X5147
X5048
X4E49
X>
Xput
XMetrics
X/2803
X[1
X22]
Xput
XCharStrings
X/2804
X<C534
X4549
XC634
X4649
XC234
X5134
X513A
X5034
XC249
X4949
X>
Xput
XMetrics
X/2804
X[3
X18]
Xput
XCharStrings
X/2805
X<C834
X483A
X4742
X4646
X4548
X4449
XD234
X5249
XD334
X5349
XC534
X5634
XC149
X5649
XC149
X4150
XC249
X4150
XD549
X5650
XD649
X5650
X>
Xput
XMetrics
X/2805
X[0
X24]
Xput
XCharStrings
X/2806
X<C534
X4549
XC634
X4649
XCC3A
X4C42
XC234
X5234
X523A
X5134
XC63E
X4C3E
XC249
X5249
X5243
X5149
X>
Xput
XMetrics
X/2806
X[1
X21]
Xput
XCharStrings
X/2807
X<CF34
X4F49
XD034
X5049
XCC34
X5334
XC435
X4536
X4437
X4336
X4335
X4434
X4534
X4635
X4737
X483B
X493D
X4B3E
X543E
X563D
X573B
X5837
X5935
X5A34
X5B34
X5C35
X5C36
X5B37
X5A36
X5B35
XCB3E
X493F
X4841
X4746
X4648
X4549
XCB3E
X4A3F
X4941
X4846
X4748
X4649
X4449
X4348
X4246
XD43E
X563F
X5741
X5846
X5948
X5A49
XD43E
X553F
X5641
X5746
X5848
X5949
X5B49
X5C48
X5D46
XCC49
X5349
X>
Xput
XMetrics
X/2807
X[-2
X31]
Xput
XCharStrings
X/2808
X<C437
X4334
X433A
X4437
X4635
X4834
X4C34
X4F35
X5037
X503A
X4F3C
X4C3D
X493D
XCC34
X4E35
X4F37
X4F3A
X4E3C
X4C3D
XCC3D
X4E3E
X5040
X5142
X5145
X5047
X4F48
X4C49
X4749
X4548
X4447
X4345
X4344
X4443
X4544
X4445
XCF3F
X5042
X5045
X4F47
X4E48
X4C49
X>
Xput
XMetrics
X/2808
X[2
X20]
Xput
XCharStrings
X/2809
X<C534
X4549
XC634
X4649
XD234
X5249
XD334
X5349
XC234
X4934
XCF34
X5634
XD236
X4647
XC249
X4949
XCF49
X5649
X>
Xput
XMetrics
X/2809
X[0
X24]
Xput
XCharStrings
X/2810
X<C534
X4549
XC634
X4649
XD234
X5249
XD334
X5349
XC234
X4934
XCF34
X5634
XD236
X4647
XC249
X4949
XCF49
X5649
XC82E
X482D
X472D
X472E
X4830
X4A31
X4E31
X5030
X512E
X>
Xput
XMetrics
X/2810
X[7
X24]
Xput
XCharStrings
X/2811
X<C534
X4549
XC634
X4649
XC234
X4934
XC63E
X4D3E
X4F3D
X503B
X5137
X5235
X5334
X5434
X5535
X5536
X5437
X5336
X5435
XCD3E
X4F3F
X5041
X5146
X5248
X5349
XCD3E
X4E3F
X4F41
X5046
X5148
X5249
X5449
X5548
X5646
XC249
X4949
X>
Xput
XMetrics
X/2811
X[0
X24]
Xput
XCharStrings
X/2812
X<C834
X483A
X4742
X4646
X4548
X4449
X4349
X4248
X4247
X4346
X4447
X4348
XD334
X5349
XD434
X5449
XC534
X5734
XD049
X5749
X>
Xput
XMetrics
X/2812
X[-1
X25]
Xput
XCharStrings
X/2813
X<C534
X4549
XC634
X4C46
XC534
X4C49
XD334
X4C49
XD334
X5349
XD434
X5449
XC234
X4634
XD334
X5734
XC249
X4849
XD049
X5749
X>
Xput
XMetrics
X/2813
X[0
X25]
Xput
XCharStrings
X/2814
X<C534
X4549
XC634
X4649
XD234
X5249
XD334
X5349
XC234
X4934
XCF34
X5634
XC63E
X523E
XC249
X4949
XCF49
X5649
X>
Xput
XMetrics
X/2814
X[0
X24]
Xput
XCharStrings
X/2815
X<CA34
X4735
X4537
X4439
X433D
X4340
X4444
X4546
X4748
X4A49
X4C49
X4F48
X5146
X5244
X5340
X533D
X5239
X5137
X4F35
X4C34
X4A34
XCA34
X4835
X4637
X4539
X443D
X4440
X4544
X4646
X4848
X4A49
XCC49
X4E48
X5046
X5144
X5240
X523D
X5139
X5037
X4E35
X4C34
X>
Xput
XMetrics
X/2815
X[1
X22]
Xput
XCharStrings
X/2816
X<C534
X4549
XC634
X4649
XD234
X5249
XD334
X5349
XC234
X5634
XC249
X4949
XCF49
X5649
X>
Xput
XMetrics
X/2816
X[0
X24]
Xput
XCharStrings
X/2817
X<C534
X4549
XC634
X4649
XC234
X4E34
X5135
X5236
X5338
X533B
X523D
X513E
X4E3F
X463F
XCE34
X5035
X5136
X5238
X523B
X513D
X503E
X4E3F
XC249
X4949
X>
Xput
XMetrics
X/2817
X[1
X22]
Xput
XCharStrings
X/2818
X<D137
X523A
X5234
X5137
X4F35
X4C34
X4A34
X4735
X4537
X4439
X433C
X4341
X4444
X4546
X4748
X4A49
X4C49
X4F48
X5146
X5244
XCA34
X4835
X4637
X4539
X443C
X4441
X4544
X4646
X4848
X4A49
X>
Xput
XMetrics
X/2818
X[1
X21]
Xput
XCharStrings
X/2819
X<C934
X4949
XCA34
X4A49
XC334
X423A
X4234
X5134
X513A
X5034
XC649
X4D49
X>
Xput
XMetrics
X/2819
X[3
X19]
Xput
XCharStrings
X/2820
X<C334
X4A44
XC434
X4B44
XD234
X4B44
X4947
X4848
X4649
X4549
X4448
X4447
X4546
X4647
X4548
XC134
X4734
XCE34
X5434
X>
Xput
XMetrics
X/2820
X[2
X21]
Xput
XCharStrings
X/2821
X<CC34
X4C49
XCD34
X4D49
XC934
X5034
XCA37
X4638
X443A
X433D
X4340
X4443
X4645
X4A46
X4F46
X5345
X5543
X5640
X563D
X553A
X5338
X4F37
X4A37
XCA37
X4738
X453A
X443D
X4440
X4543
X4745
X4A46
XCF46
X5245
X5443
X5540
X553D
X543A
X5238
X4F37
XC949
X5049
X>
Xput
XMetrics
X/2821
X[0
X25]
Xput
XCharStrings
X/2822
X<C334
X5049
XC434
X5149
XD134
X4349
XC134
X4734
XCD34
X5334
XC149
X4749
XCD49
X5349
X>
Xput
XMetrics
X/2822
X[2
X20]
Xput
XCharStrings
X/2823
X<C534
X4549
XC634
X4649
XD234
X5249
XD334
X5349
XC234
X4934
XCF34
X5634
XC249
X5649
XD549
X5650
XD649
X5650
X>
Xput
XMetrics
X/2823
X[0
X24]
Xput
XCharStrings
X/2824
X<C534
X453F
X4641
X4942
X4C42
X4F41
X513F
XC634
X463F
X4741
X4942
XD134
X5149
XD234
X5249
XC234
X4934
XCE34
X5534
XCE49
X5549
X>
Xput
XMetrics
X/2824
X[0
X23]
Xput
XCharStrings
X/2825
X<C534
X4549
XC634
X4649
XD034
X5049
XD134
X5149
XDB34
X5B49
XDC34
X5C49
XC234
X4934
XCD34
X5434
XD834
X5F34
XC249
X5F49
X>
Xput
XMetrics
X/2825
X[-2
X33]
Xput
XCharStrings
X/2826
X<C534
X4549
XC634
X4649
XD034
X5049
XD134
X5149
XDB34
X5B49
XDC34
X5C49
XC234
X4934
XCD34
X5434
XD834
X5F34
XC249
X5F49
XDE49
X5F50
XDF49
X5F50
X>
Xput
XMetrics
X/2826
X[-2
X33]
Xput
XCharStrings
X/2827
X<CA34
X4A49
XCB34
X4B49
XC334
X423A
X4234
X4E34
XCB3E
X523E
X553F
X5640
X5742
X5745
X5647
X5548
X5249
X4749
XD23E
X543F
X5540
X5642
X5645
X5547
X5448
X5249
X>
Xput
XMetrics
X/2827
X[0
X26]
Xput
XCharStrings
X/2828
X<C534
X4549
XC634
X4649
XC234
X4934
XC63E
X4D3E
X503F
X5140
X5242
X5245
X5147
X5048
X4D49
X4249
XCD3E
X4F3F
X5040
X5142
X5145
X5047
X4F48
X4D49
XD834
X5849
XD934
X5949
XD534
X5C34
XD549
X5C49
X>
Xput
XMetrics
X/2828
X[-2
X30]
Xput
XCharStrings
X/2829
X<C534
X4549
XC634
X4649
XC234
X4934
XC63E
X4D3E
X503F
X5140
X5242
X5245
X5147
X5048
X4D49
X4249
XCD3E
X4F3F
X5040
X5142
X5145
X5047
X4F48
X4D49
X>
Xput
XMetrics
X/2829
X[2
X21]
Xput
XCharStrings
X/2830
X<C437
X4334
X433A
X4437
X4635
X4934
X4B34
X4E35
X5037
X5139
X523C
X5241
X5144
X5046
X4E48
X4B49
X4849
X4548
X4447
X4345
X4344
X4443
X4544
X4445
XCB34
X4D35
X4F37
X5039
X513C
X5141
X5044
X4F46
X4D48
X4B49
XC83E
X513E
X>
Xput
XMetrics
X/2830
X[2
X21]
Xput
XCharStrings
X/2831
X<C534
X4549
XC634
X4649
XC234
X4934
XC249
X4949
XD334
X5035
X4E37
X4D39
X4C3D
X4C40
X4D44
X4E46
X5048
X5349
X5549
X5848
X5A46
X5B44
X5C40
X5C3D
X5B39
X5A37
X5835
X5534
X5334
XD334
X5135
X4F37
X4E39
X4D3D
X4D40
X4E44
X4F46
X5148
X5349
XD549
X5748
X5946
X5A44
X5B40
X5B3D
X5A39
X5937
X5735
X5534
XC63E
X4C3E
X>
Xput
XMetrics
X/2831
X[-2
X31]
Xput
XCharStrings
X/2832
X<D034
X5049
XD134
X5149
XD434
X4834
X4535
X4436
X4338
X433A
X443C
X453D
X483E
X503E
XC834
X4635
X4536
X4438
X443A
X453C
X463D
X483E
XCB3E
X493F
X4840
X4547
X4448
X4348
X4247
XC93F
X4841
X4648
X4549
X4349
X4247
X4246
XCD49
X5449
X>
Xput
XMetrics
X/2832
X[1
X22]
Xput
END_OF_FILE
if test 11645 -ne `wc -c <'postscript/fonts/Times/russian.r'`; then
    echo shar: \"'postscript/fonts/Times/russian.r'\" unpacked with wrong size!
fi
# end of 'postscript/fonts/Times/russian.r'
fi
if test -f 'source/image.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'source/image.c'\"
else
echo shar: Extracting \"'source/image.c'\" \(11874 characters\)
sed "s/^X//" >'source/image.c' <<'END_OF_FILE'
X/*
X * Copyright (C) Rutherford Appleton Laboratory 1987
X * 
X * This source may be copied, distributed, altered or used, but not sold for profit
X * or incorporated into a product except under licence from the author.
X * It is not in the public domain.
X * This notice should remain in the source unaltered, and any changes to the source
X * made by persons other than the author should be marked as such.
X * 
X *	Crispin Goswell @ Rutherford Appleton Laboratory caag@uk.ac.rl.vd
X */
X#include "main.h"
X#include "graphics.h"
X
Xstatic int RealImage ();
Xstatic int RealImageMask ();
X
Xstruct hardware *ScaleBitmap ();
X
XInitImage ()
X {
X 	InstallOp ("realimage",		RealImage,	5, 0, 0, 0, Integer, Integer, Integer, Array, String);
X 	InstallOp ("realimagemask",	RealImageMask,	5, 0, 0, 0, Integer, Integer, Boolean, Array, String);
X }
X
Xstatic int RealImageMask (width, height, invert, mat, string) Object width, height, invert, mat, string;
X {
X 	Matrix m, m2;
X 	Vector origin, right, bottom;
X 	int w = BodyInteger (width), h = BodyInteger (height);
X 	int inv = BodyBoolean (invert), l = lengthString (string);
X 	int dwidth, dheight;
X 	unsigned char *s = BodyString (string);
X 	
X  	VOID GSave ();
X	if (!ExtractMatrix (&m, mat))
X 		return Error (PTypeCheck);
X 	if (l != (w + 7) / 8 * h || w < 0 || h < 0)
X 		return Error (PRangeCheck);
X 	if (w == 0 || h == 0)
X 		return TRUE;
X 	m = MatInvert (m);
X 	gstate->CTM = m2 = MatMult (m, gstate->CTM);
X 	origin = Transform (NewVector (0.0, 0.0, 1.0), m2);
X 	right  = Transform (NewVector ((float) w, 0.0, 1.0), m2);
X 	bottom = Transform (NewVector (0.0, (float) h, 1.0), m2);
X 	/* fprintf (stderr, "origin = (%g, %g), right = (%g, %g), bottom = (%g, %g)\n", origin.vx, origin.vy, right.vx, right.vy, bottom.vx, bottom.vy);
X 	fprintf (stderr, "matrix == [%g %g %g %g %g %g]\n", m2.A, m2.B, m2.C, m2.D, m2.tx, m2.ty);*/
X 	
X 	dwidth = right.vx - origin.vx; dheight = bottom.vy - origin.vy;
X 	
X 	if (origin.vx == bottom.vx && origin.vy == right.vy &&
X 			dwidth > 0 && dheight > 0/* && dwidth >= w && dheight >= h*/)
X 	 {		/* simple orientation */
X 	 	struct hardware *from, *to;
X 	 	
X 	 	from = HardwareFromString (s, w, h);
X 	 	if (!inv)
X 	 		BitBlt (from, from,
X 	 			NewDevicePoint (0, 0), NewDevicePoint (0, 0),
X 	 			HardwareExtent (from), ROP_NOTSOURCE);
X 		if (dwidth != w || dheight != h)
X 		 {
X 	 		to = ScaleBitmap (from, (float) dwidth / w, (float) dheight / h);
X 	 		DestroyHardware (from);
X 	 	 }
X 	 	else
X 	 		to = from;
X 	 	
X 	 	Paint (to, gstate->device->dev,
X 	 		NewDevicePoint (0, 0),
X 	 		NewDevicePoint ((int) origin.vx, (int) origin.vy),
X 	 		NewDevicePoint (dwidth, dheight),
X 	 		gstate->colour);
X 	 	DestroyHardware (to);
X 	 }
X 	else
X 		DrawBitmap (s, w, h, inv);
X	VOID GRestore ();
X	
X	return TRUE;
X }
X
XDrawBitmap (s, width, height, inv) unsigned char *s; int width, height, inv;
X {
X 	int w, h;
X 	
X 	VOID PNewPath ();
X 	
X 	for (h = 0; h < height; h++)
X 		for (w = 0; w < width; w++)
X 		 	if (((s [h * (width >> 3) + (w >> 3)] & (1 << (7 - (w & 0x7)))) != 0) == inv)
X  		 	 	FillUnitBox (w, h);
X }
X
Xvoid Tile (t, h) struct hardware *t, *h;
X {
X 	DevicePoint xt, xh;
X 	int i, sw, sh;
X 	
X 	xt = HardwareExtent (t);
X 	xh = HardwareExtent (h);
X 	
X  	BitBlt (t, h, NewDevicePoint (0, 0), NewDevicePoint (0, 0), xt, ROP_SOURCE);
X 	
X 	sw = xt.dx;
X	for (i = sw;;)
X 	 {
X 		BitBlt (h, h, NewDevicePoint (0, 0), NewDevicePoint (i, 0), NewDevicePoint (sw, xt.dy), ROP_SOURCE);
X 		if (i >= xh.dx)
X 			break;
X 		i += sw;
X 		sw <<= 1;
X 	 }
X 	
X 	sh = xt.dy;
X	for (i = sh;;)
X 	 {
X 		BitBlt (h, h, NewDevicePoint (0, 0), NewDevicePoint (0, i), NewDevicePoint (xh.dx, sh), ROP_SOURCE);
X 		if (i >= xh.dy)
X 			break;
X 		i += sh;
X 		sh <<= 1;
X 	 }
X }
X
Xvoid FillMask (h, mask, width) struct hardware *h; char mask; int width;
X {
X 	struct hardware *m;
X 	
X 	mask <<= 8 - width;
X 	
X 	m = HardwareFromString (&mask, width, 1);
X 	
X 	Tile (m, h);
X 	
X 	DestroyHardware (m);
X }
X
Xstruct hardware *UnpaddedHardwareFromString (s, w, h) unsigned char *s; int w, h;
X {
X 	struct hardware *thin;
X 	struct hardware *res;
X 	int i;
X 	
X 	if (w & 7 == 0)
X 		return HardwareFromString (s, w, h);
X 	
X 	thin = HardwareFromString (s, w * h, 1);
X 	res = NewBitmapHardware (w, h);
X 	
X 	for (i = 0; i < h; i++)
X 		BitBlt (thin, res, NewDevicePoint (i * w, 0), NewDevicePoint (0, i), NewDevicePoint (w, 1), ROP_SOURCE);
X 	
X 	DestroyHardware (thin);
X 	return res;
X }
X
Xstatic void VerticalReverseImage (h) struct hardware *h;
X {
X 	DevicePoint ex;
X 	int i, n;
X 	
X 	ex = HardwareExtent (h);
X 	
X 	n = ex.dy;
X 	
X 	for (i = 0; i < n / 2; i++)
X 		BitBlt (h, h, NewDevicePoint (0, i), NewDevicePoint (0, n - i - 1), NewDevicePoint (ex.dx, 1), ROP_XOR),
X 		BitBlt (h, h, NewDevicePoint (0, n - i - 1), NewDevicePoint (0, i), NewDevicePoint (ex.dx, 1), ROP_XOR),
X 		BitBlt (h, h, NewDevicePoint (0, i), NewDevicePoint (0, n - i - 1), NewDevicePoint (ex.dx, 1), ROP_XOR);
X }
X
Xstatic int RealImage (width, height, depth, mat, string) Object width, height, depth, mat, string;
X {
X 	Matrix m, m2;
X 	Vector origin, right, bottom;
X 	int w = BodyInteger (width), h = BodyInteger (height);
X 	int vrev = 0, dep = BodyInteger (depth), l = lengthString (string);
X 	int dwidth, dheight;
X 	unsigned char *s = BodyString (string);
X 	
X   	VOID GSave ();
X	if (!ExtractMatrix (&m, mat))
X 		return Error (PTypeCheck);
X 	if (l != (w * dep + 7) / 8 * h || w < 0 || h < 0)
X 		return Error (PRangeCheck);
X 	if (w == 0 || h == 0)
X 		return TRUE;
X  	m = MatInvert (m);
X 	gstate->CTM = m2 = MatMult (m, gstate->CTM);
X 	origin = Transform (NewVector (0.0, 0.0, 1.0), m2);
X 	right  = Transform (NewVector ((float) w, 0.0, 1.0), m2);
X 	bottom = Transform (NewVector (0.0, (float) h, 1.0), m2);
X 	
X	dwidth = right.vx - origin.vx; dheight = bottom.vy - origin.vy;
X	
X	if (dheight < 0)
X		origin.vy += dheight, right.vy += dheight, ++vrev, dheight = -dheight;
X	
X	/* fprintf (stderr, "origin.vx = %g, origin.vy = %g, bottom.vx = %g, right.vy = %g, dwidth = %d, dheight = %d, w = %d, h = %d\n",
X			origin.vx, origin.vy, bottom.vx, right.vy, dwidth, dheight, w, h); */
X 	
X 	if (dep != 16 && (int) origin.vx == (int) bottom.vx && (int) origin.vy == (int) right.vy &&
X 			dwidth > 0 && dheight > 0/* && dwidth >= w && dheight >= h */)
X 	 {		/* simple orientation */
X 	 	struct hardware *from , *to;
X 	 	
X 	 	if (dep == 1)
X 	 	 {
X 	 		from = HardwareFromString (s, w, h);
X 	 		if (vrev)
X 	 			VerticalReverseImage (from);
X 			if (dwidth != w || dheight != h)
X 			 {
X 	 			to = ScaleBitmap (from, (float) dwidth / w, (float) dheight / h);
X 	 			DestroyHardware (from);
X 	 		 }
X 	 		else
X 	 			to = from;
X 	 		
X			Paint (to, gstate->device->dev,
X				NewDevicePoint (0, 0), NewDevicePoint ((int) origin.vx, (int) origin.vy),
X				NewDevicePoint (dwidth, dheight),
X				NewGray (1.0));
X			BitBlt (to, to,
X				NewDevicePoint (0, 0), NewDevicePoint (0, 0),
X				NewDevicePoint (dwidth, dheight),
X				ROP_NOTSOURCE);
X			Paint (to, gstate->device->dev,
X				NewDevicePoint (0, 0), NewDevicePoint ((int) origin.vx, (int) origin.vy),
X				NewDevicePoint (dwidth, dheight),
X				NewGray (0.0));
X 	 		DestroyHardware (to);
X 	 	 }
X 	 	else
X 	 	 {
X 	 		struct hardware *mask, *new, *temp;
X 	 	 	int i, j;
X 	 	 	
X 	 	 	from = HardwareFromString (s, w * dep, h);
X  	 		if (vrev)
X 	 			VerticalReverseImage (from);
X 	 	 	new = HardwareFromString (s, w, h);
X	 	 	mask = NewBitmapHardware (w * dep, h);
X 	 	 	temp = NewBitmapHardware (w * dep, h);
X 	 	 	
X 	 	 	for (i = 0; i < (1<<dep); i++)
X 	 	 	 {
X 	 	 	 	FillMask (mask, i, dep);
X	 	 	 	
X	 	 	 	BitBlt (from, mask, NewDevicePoint (0, 0), NewDevicePoint (0, 0), HardwareExtent (from), ROP_NXOR);
X	 	 	 	BitBlt (NULL, temp, NewDevicePoint (0, 0), NewDevicePoint (0, 0), HardwareExtent (temp), ROP_TRUE);
X 	 	 	 	for (j = 0; j < dep; j++)
X 	 	 	 		BitBlt (mask, temp, NewDevicePoint (j, 0), NewDevicePoint (0, 0), HardwareExtent (mask), ROP_AND);
X 	 	 	 	for (j = 0; j < w; j++)
X 	 	 	 		BitBlt (temp, new, NewDevicePoint (j * dep, 0), NewDevicePoint (j, 0), NewDevicePoint (1, h), ROP_SOURCE);
X 	 	 	 	to = ScaleBitmap (new, (float) dwidth / w, (float) dheight / h);
X		  	 	Paint (to, gstate->device->dev,
X		 	 		NewDevicePoint (0, 0),
X		 	 		NewDevicePoint ((int) origin.vx, (int) origin.vy),
X		 	 		NewDevicePoint (dwidth, dheight),
X		 	 		NewGray ((float) i / ((1 << dep) - 1)));
X		 	 	DestroyHardware (to);
X	 	 	 }
X 	 		DestroyHardware (from);
X 	 		DestroyHardware (mask);
X 	 		DestroyHardware (temp);
X 	 		DestroyHardware (new);
X 	 	 }
X 	 }
X 	else
X 	 {
X 	 	if (vrev)
X 	 		origin.vy += dheight, right.vy += dheight, dheight = -dheight;
X 		DrawColourBitmap (s, w, h, dep);
X 	 }
X	VOID GRestore ();
X	
X	return TRUE;
X }
X
Xstatic log2[] = { 0, 0, 1, 0, 2, 0, 0, 0, 3 };
Xstatic mask[] = { 0, 0x80, 0xc0, 0, 0xf0, 0, 0, 0, 0xff };
X
XDrawColourBitmap (s, width, height, depth) unsigned char *s; int width, height, depth;
X {
X 	int w, h, c;
X 	
X 	VOID PNewPath ();
X 	
X 	if (depth == 16)
X 		for (h = 0; h < height; h++)
X 			for (w = 0; w < width; w++)
X 		 	 {
X 		 	 	gstate->colour = NewColour (0.0, 0.0, (float) ((s [h * (width << 1) + (w << 1)] << 8) |
X 		 	 						s [h * (width << 1) + (w << 1) + 1]) / (1 << 16));
X 		 	 	FillUnitBox (w, h);
X 		 	 }
X 	else
X 		for (c = 0; c < 1 << depth; c++)
X 		 {
X  		 	gstate->colour = NewColour (0.0, 0.0, (float) c / ((1 << depth) - 1));
X			for (h = 0; h < height; h++)
X 				for (w = 0; w < width; w++)
X 				 {
X 			 		int foo = 3 - log2 [depth];
X 			 		int byte = s [h * (width >> foo) + (w >> foo)];
X 			 		int shift = (w & ((1 << foo) - 1)) * depth;
X 			 		if (c == ((byte & (mask [depth] >> shift)) >> (8 - (shift + depth))))
X 		 	 			FillUnitBox (w, h);
X 		 		 }
X 		  }
X }
X
XFillUnitBox (w, h) int w, h;
X {
X 	VOID MoveTo (gstate->path, ExtToInt (NewPoint ((float ) w, (float ) h)));
X	VOID LineTo (gstate->path, ExtToInt (NewPoint ((float ) w+1, (float ) h)));
X	VOID LineTo (gstate->path, ExtToInt (NewPoint ((float ) w+1, (float ) h+1)));
X	VOID LineTo (gstate->path, ExtToInt (NewPoint ((float ) w, (float ) h+1)));
X	VOID ClosePath (gstate->path);
X	VOID Fill ();
X  }
X
Xstruct hardware *ScaleBitmap (from, xscale, yscale) struct hardware *from; float xscale, yscale;
X {	 	 	
X	struct hardware *middle, *middle2, *high, *high2;
X	int i, w, h, dwidth, dheight, ixscale, iyscale;
X	DevicePoint extent;
X	
X	extent = HardwareExtent (from);
X	w = extent.dx; h = extent.dy;
X	dwidth = w * xscale + 0.5; dheight = h * yscale + 0.5;
X	
X	if (dwidth > w)
X	 {
X		middle = NewBitmapHardware (dwidth, h);
X		for (i = 0; i < w; i++)
X			BitBlt (from, 	middle,
X				NewDevicePoint (i, 0), NewDevicePoint ((int) (i*xscale), 0),
X				NewDevicePoint (1, h),
X				ROP_OR);
X		middle2 = NewBitmapHardware (dwidth, h);
X		ixscale = (int) ((float) dwidth / w + 0.5); 
X		for (i = 0; i < ixscale + 1; i++)
X			BitBlt (middle, middle2,
X				NewDevicePoint (0, 0), NewDevicePoint (i, 0),
X				NewDevicePoint (dwidth - ixscale + 1, h),
X				ROP_OR);
X		DestroyHardware (middle);
X	 }
X	else
X	 {
X	 	middle2 = NewBitmapHardware (dwidth, h);
X		for (i = 0; i < dwidth; i++)
X			BitBlt (from, 	middle2,
X				NewDevicePoint ((int) (i/xscale), 0), NewDevicePoint (i, 0),
X				NewDevicePoint (1, h),
X				ROP_OR);
X	 }
X	
X	if (dheight > h)
X	 {
X		high = NewBitmapHardware (dwidth, dheight);
X		for (i = 0; i < h; i++)
X			BitBlt (middle2, high,
X				NewDevicePoint (0, i), NewDevicePoint (0, (int) (i*yscale)),
X				NewDevicePoint (dwidth, 1),
X				ROP_OR);
X		DestroyHardware (middle2);
X		
X		high2 = NewBitmapHardware (dwidth, dheight);
X		iyscale = (int) ((float) dheight / h + 0.5);
X		for (i = 0; i < iyscale + 1; i++)
X			BitBlt (high, 	high2, 
X				NewDevicePoint (0, 0), NewDevicePoint (0, i),
X				NewDevicePoint (dwidth, dheight - iyscale + 1),
X				ROP_OR);
X		DestroyHardware (high);
X	 }
X	else
X	 {
X		high2 = NewBitmapHardware (dwidth, dheight);
X		for (i = 0; i < dheight; i++)
X			BitBlt (middle2, high2,
X				NewDevicePoint (0, (int) (i/yscale)), NewDevicePoint (0, i),
X				NewDevicePoint (dwidth, 1),
X				ROP_OR);
X	 }
X 	return high2;
X }
END_OF_FILE
if test 11874 -ne `wc -c <'source/image.c'`; then
    echo shar: \"'source/image.c'\" unpacked with wrong size!
fi
# end of 'source/image.c'
fi
if test -f 'source/state.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'source/state.c'\"
else
echo shar: Extracting \"'source/state.c'\" \(10995 characters\)
sed "s/^X//" >'source/state.c' <<'END_OF_FILE'
X/*
X * Copyright (C) Rutherford Appleton Laboratory 1987
X * 
X * This source may be copied, distributed, altered or used, but not sold for profit
X * or incorporated into a product except under licence from the author.
X * It is not in the public domain.
X * This notice should remain in the source unaltered, and any changes to the source
X * made by persons other than the author should be marked as such.
X * 
X *	Crispin Goswell @ Rutherford Appleton Laboratory caag@uk.ac.rl.vd
X */
X#include "main.h"
X#include "graphics.h"
X
Xextern int InitGraphics ();
Xint ErasePage ();
Xstatic int CopyPage ();
X
Xstatic int SetLineWidth ();
Xstatic int GetLineWidth ();
Xstatic int SetLineCap ();
Xstatic int GetLineCap ();
Xstatic int SetLineJoin ();
Xstatic int GetLineJoin ();
Xstatic int SetDash ();
Xstatic int GetDash ();
Xstatic int SetFlat ();
Xstatic int GetFlat ();
Xstatic int SetMiterLimit ();
Xstatic int GetMiterLimit ();
Xstatic int SetHSB ();
Xstatic int GetHSB ();
Xstatic int SetRGB ();
Xstatic int GetRGB ();
X
Xstatic int PSetRealScreen ();
Xstatic int PBuildScreen ();
Xstatic int PScreenSize ();
Xstatic int GetScreen ();
X
Xstatic int PSetRealTransfer ();
Xstatic int PGetTransfer ();
Xstatic int PTransferSize ();
X
Xstatic int SetGray ();
Xstatic int GetGray ();
X
Xstatic int SetFillMethod ();
Xstatic int GetFillMethod ();
Xstatic int SetStrokeMethod ();
Xstatic int GetStrokeMethod ();
X
Xint fill_method = 1, stroke_method = 0;
X
XInitState ()
X {
X  	InstallOp ("erasepage",		ErasePage,	0, 0, 0, 0);
X 	InstallOp ("copypage",		CopyPage,	0, 0, 0, 0);
X	InstallOp ("setlinewidth",	SetLineWidth,	1, 0, 0, 0, Float);
X 	InstallOp ("currentlinewidth",	GetLineWidth,	0, 1, 0, 0);
X 	InstallOp ("setlinecap",	SetLineCap,	1, 0, 0, 0, Integer);
X 	InstallOp ("currentlinecap",	GetLineCap,	0, 1, 0, 0);
X 	InstallOp ("setlinejoin",	SetLineJoin,	1, 0, 0, 0, Integer);
X 	InstallOp ("currentlinejoin",	GetLineJoin,	0, 1, 0, 0);
X 	InstallOp ("setdash",		SetDash,	2, 0, 0, 0, Array, Float);
X 	InstallOp ("currentdash",	GetDash,	0, 2, 0, 2);
X 	InstallOp ("setflat",		SetFlat,	1, 0, 0, 0, Float);
X 	InstallOp ("currentflat",	GetFlat,	0, 1, 0, 0);
X 	InstallOp ("setmiterlimit",	SetMiterLimit,	1, 0, 0, 0, Float);
X 	InstallOp ("currentmiterlimit",	GetMiterLimit,	0, 1, 0, 0);
X 	
X 	InstallOp ("setgray",		SetGray,	1, 0, 0, 0, Float);
X 	InstallOp ("currentgray",	GetGray,	0, 1, 0, 0);
X 	InstallOp ("sethsbcolor",	SetHSB,		3, 0, 0, 0, Float, Float, Float);
X 	InstallOp ("currenthsbcolor",	GetHSB,		0, 3, 0, 0);
X 	InstallOp ("setrgbcolor",	SetRGB,		3, 0, 0, 0, Float, Float, Float);
X 	InstallOp ("currentrgbcolor",	GetRGB,		0, 3, 0, 0);
X 	
X  	InstallOp ("screensize",	PScreenSize,	2, 1, 0, 0, Float, Float);
X  	InstallOp ("buildscreen",	PBuildScreen,	2, 2, 0, 0, Float, Float);
X  	InstallOp ("setrealscreen",	PSetRealScreen,	4, 0, 0, 0, Float, Float, Array, Array);
X	InstallOp ("currentscreen",	GetScreen,	0, 3, 0, 0);
X	
X 	InstallOp ("setrealtransfer",	PSetRealTransfer,	2, 0, 0, 0, Array, Array);
X 	InstallOp ("currenttransfer",	PGetTransfer,	0, 1, 0, 0);
X 	InstallOp ("transfersize",	PTransferSize,	0, 1, 0, 0);
X 	
X 	InstallOp ("setfillmethod",	SetFillMethod,	1, 0, 0, 0, Integer);
X 	InstallOp ("currentfillmethod",	GetFillMethod,	0, 1, 0, 0);
X 	InstallOp ("setstrokemethod",	SetStrokeMethod,	1, 0, 0, 0, Integer);
X 	InstallOp ("currentstrokemethod",GetStrokeMethod,	0, 1, 0, 0);
X 	InstallOp ("initgraphics",	InitGraphics,	0, 0, 0, 0);
X
X	VOID InitGraphics ();
X }
X
Xint InitGraphics ()
X {
X 	VOID PInitMatrix ();		/* initmatrix */
X 	VOID InitClip ();		/* initclip */
X 	VOID PNewPath ();		/* newpath */
X 	
X 	gstate->colour = NewColour (0.0, 0.0, 0.0);	/* 0 setgray */
X 	gstate->line_width = 1;		/* 1 setlinewidth */
X 	gstate->line_cap = CBUTT;	/* setlinecap */
X 	gstate->line_join = JMITRE;	/* setlinejoin */
X 	gstate->dash_length = 0;	/* [] 0 setdash */
X 	gstate->dash_offset = 0;	
X 	gstate->miter_limit = 10;	/* 10 setmiterlimit */
X 	InitShowContext ();
X 	
X 	return TRUE;
X }
X
Xint ErasePage ()
X {
X	Paint (NULL, gstate->device->dev,
X		NewDevicePoint (0, 0), NewDevicePoint (0, 0),
X		HardwareExtent (gstate->device->dev),
X		White);
X 	return TRUE;
X }
X
Xstatic int CopyPage ()
X {
X 	return TRUE;
X }
X
Xstatic int SetLineWidth (width) Object width;
X {
X 	gstate->line_width = BodyReal (width);
X 	return TRUE;
X }
X
Xstatic int GetLineWidth ()
X {
X 	return Push (OpStack, MakeReal (gstate->line_width));
X }
X
Xstatic int SetLineCap (cap) Object cap;
X {
X 	int v = BodyInteger (cap);
X 	
X 	if (v < 0 || v > 2)
X 		return Error (PRangeCheck);
X 	gstate->line_cap = v;
X 	return TRUE;
X }
X
Xstatic int GetLineCap ()
X {
X 	return Push (OpStack, MakeInteger (gstate->line_cap));
X }
X
Xstatic int SetLineJoin (join) Object join;
X {
X 	int v = BodyInteger (join);
X 	
X 	if (v < 0 || v > 2)
X 		return Error (PRangeCheck);
X 	gstate->line_join = v;
X 	return TRUE;
X }
X
Xstatic int GetLineJoin ()
X {
X  	return Push (OpStack, MakeInteger (gstate->line_join));
X }
X
Xstatic int SetDash (array, offset) Object array, offset;
X {
X 	Object *v = BodyArray (array);
X	int i, length = lengthArray (array);
X	float sum = 0;
X	
X 	if (length > MAXDASH)
X  		return Error (PLimitCheck);
X  	if (length == 0)
X  	 {
X  	 	gstate->dash_length = 0;
X  	 	return TRUE;
X  	 }
X  	for (i = 0; i < length; i++)
X  	 {
X  	 	float val;
X  	 	
X  		if (TypeOf (v[i]) == Real)
X  			val = BodyReal(v[i]);
X  		else if (TypeOf (v[i]) == Integer)
X  			val = (float) BodyInteger (v[i]);
X  		else
X    			return Error (PLimitCheck);
X 	 	if (val < 0)
X 	 		return Error (PRangeCheck);
X 	 	sum += val;
X    	 }
X  	if (sum == 0)
X 		return Error (PRangeCheck);
X   	 
X 	gstate->dash_length = length;
X 	gstate->dash_offset = BodyReal (offset);
X 	for (i = 0; i < length; i++)
X 	 {
X	 	if (TypeOf (v[i]) == Integer)
X 	 		gstate->dash_array [i] = BodyInteger (v[i]);
X 	 	else
X 	 		gstate->dash_array [i] = BodyReal (v[i]);
X 	 }
X 	return TRUE;
X }
X
Xstatic int GetDash ()
X {
X 	int i;
X 	if (!OpCheck (0, gstate->dash_length + 1))
X 		return FALSE;
X 	VOID Push (OpStack, Marker);
X 	for (i = 0; i < gstate->dash_length; i++)
X 		VOID Push (OpStack, MakeReal (gstate->dash_array[i]));
X 	VOID Push (ExecStack, MakeReal (gstate->dash_offset));
X 	VOID Push (ExecStack, Cvx (Rbracket));
X 	return TRUE;
X }
X
Xstatic int SetFlat (flat) Object flat;
X {
X 	gstate->flatness = BodyReal (flat);
X 	return TRUE;
X }
X
Xstatic int GetFlat ()
X {
X 	return Push (OpStack, MakeInteger (gstate->flatness));
X }
X
Xstatic int SetMiterLimit (miter) Object miter;
X {
X 	float m = BodyReal (miter);
X 	
X 	if (m < 1)
X 		return Error (PRangeCheck);
X 	gstate->miter_limit = m;
X 	return TRUE;
X }
X
Xstatic int GetMiterLimit ()
X {
X 	return Push (OpStack, MakeReal (gstate->miter_limit));
X }
X
Xstatic int SetGray (gray) Object gray;
X {
X 	float g = BodyReal (gray);
X 	
X 	if (g < 0 || g > 1)
X 		return Error (PRangeCheck);
X	gstate->colour = NewGray (g);
X 	
X	return TRUE;
X }
X
Xstatic int GetGray ()
X {
X 	return Push (OpStack, MakeReal (Brightness (gstate->colour)));
X }
X
Xstatic int SetHSB (hue, sat, bright) Object hue, sat, bright;
X {
X 	float h = BodyReal (hue), s = BodyReal (sat), b = BodyReal (bright);
X 	if (h < 0 || h > 1 || s < 0 || s > 1 || b < 0 || b > 1)
X 		return Error (PRangeCheck);
X 	gstate->colour = NewHSBColour (h, s, b);
X 	return TRUE;
X }
X
Xstatic int SetRGB (red, green, blue) Object red, green, blue;
X {
X 	float R = BodyReal (red), G = BodyReal (green), B = BodyReal (blue);
X 	
X 	if (R < 0 || R > 1 || G < 0 || G > 1 || B < 0 || B > 1)
X 		return Error (PRangeCheck);
X 	
X 	gstate->colour = NewRGBColour (R, G, B);
X 	return TRUE;
X }
X
Xstatic int GetHSB ()
X {
X 	float h, s, b;
X 	
X 	ColourHSB (gstate->colour, &h, &s, &b);
X 	VOID Push (OpStack, MakeReal (h));
X 	VOID Push (OpStack, MakeReal (s));
X 	VOID Push (OpStack, MakeReal (b));
X 	
X 	return TRUE;
X }
X
Xstatic int GetRGB ()
X {
X 	float R, G, B;
X	
X	ColourRGB (gstate->colour, &R, &G, &B);
X 	VOID Push (OpStack, MakeReal (R));
X 	VOID Push (OpStack, MakeReal (G));
X 	VOID Push (OpStack, MakeReal (B));
X 	
X	return TRUE;
X }
X
Xstatic int PScreenSize (freq, rot) Object freq, rot;
X {
X 	return Push (OpStack, MakeInteger (ScreenSize (BodyReal (freq), BodyReal (rot))));
X }
X
Xstatic int PBuildScreen (freq, rot) Object freq, rot;
X {
X 	float f = BodyReal (freq), r = BodyReal (rot);
X 	int i, ss = ScreenSize (f, r);
X 	float	*x = (float *) Malloc (sizeof (float) * ss),
X 		*y = (float *) Malloc (sizeof (float) * ss);
X 	
X 	Object *px = (Object *) Malloc (sizeof (Object) * ss),
X  		*py = (Object *) Malloc (sizeof (Object) * ss);
X	
X 	BuildScreen (f, r, x, y);
X 	
X 	for (i = 0; i < ss; i++)
X 	 {
X 	 	px [i] = MakeReal (x[i]);
X 	 	py [i] = MakeReal (y[i]);
X 	 }
X 	Free ((char *) x);
X 	Free ((char *) y);
X 	
X 	return Push (OpStack, MakeArray (px, ss)) && Push (OpStack, MakeArray (py, ss));
X }
X
Xstatic int PSetRealScreen (freq, rot, spot, thresh) Object freq, rot, spot, thresh;
X {
X 	float f = BodyReal (freq), r = BodyReal (rot);
X 	int i, ss = ScreenSize (f, r);
X 	float *th = (float *) Malloc (sizeof (float) * ss);
X 	
X 	gstate->screen.frequency 	= f;
X 	gstate->screen.rotation 	= r;
X 	gstate->screen.spot_function 	= spot;
X 	
X 	if (lengthArray (thresh) != ss)
X 	 {
X 	 	free ((char *) th);
X 	 	return Error (PRangeCheck);
X 	 }
X 	
X 	for (i = 0; i < ss; i++)
X 	 {
X 	 	Object a;
X 	 	
X 	 	a = getArray (thresh, i);
X 	 	if (TypeOf (a) != Real)
X 	 	 {
X 	 	 	Free ((char *) th);
X 	 		return Error (PTypeCheck);
X 	 	 }
X 	 	
X 		th[i] = BodyReal (a);
X 	 }
X 	if (gstate->screen.count == 1)	/* allows 0 to mean 'not assigned yet' */
X 		Free ((char *) gstate->screen.thresh);
X 	gstate->screen.thresh = th;
X 	gstate->screen.count = 1;
X 	
X 	SetScreen (f, r, th);
X 	
X 	return TRUE;
X }
X
Xstatic int GetScreen ()
X {
X 	VOID Push (OpStack, MakeReal (gstate->screen.frequency));
X 	VOID Push (OpStack, MakeReal (gstate->screen.rotation));
X 	VOID Push (OpStack, gstate->screen.spot_function);
X 	return TRUE;
X }
X
Xstatic int PSetRealTransfer (transfer, values) Object transfer, values;
X {
X 	Object v;
X 	int i, size = TransferSize ();
X 	float *val;
X 	
X 	if (lengthArray (values) != size)
X 		return Error (PRangeCheck);
X 	
X 	val = (float *) Malloc (sizeof (float) * size);
X 	for (i = 0; i < size; i++)
X 	 {
X 	 	v = getArray (values, i);
X 	 	if (TypeOf (v) == Real)
X 	 		val [i] = BodyReal (v);
X 	 	else
X 	 	 {
X 	 	 	Free ((char *) val);
X 	 	 	return Error (PTypeCheck);
X 	 	 }
X 	 }
X 	
X 	if (gstate->transfer.tcount == 1)
X 	 	Free ((char *) gstate->transfer.tran);
X 	gstate->transfer.transfn = transfer;
X 	gstate->transfer.tran = val;
X 	gstate->transfer.tcount = 1;
X 	
X 	SetTransfer (val);
X 	
X 	return TRUE;
X }
X
Xstatic int PGetTransfer ()
X {
X 	return Push (OpStack, gstate->transfer.transfn);
X }
X
Xstatic int PTransferSize ()
X {
X	return Push (OpStack, MakeInteger (TransferSize ()));
X }
X
Xstatic int SetFillMethod (method) Object method;
X {
X 	fill_method = BodyInteger (method);
X 	return TRUE;
X }
X
Xstatic int GetFillMethod ()
X {
X 	return Push (OpStack, MakeInteger (fill_method));
X }
X
Xstatic int SetStrokeMethod (method) Object method;
X {
X 	stroke_method = BodyInteger (method);
X 	return TRUE;
X }
X
Xstatic int GetStrokeMethod ()
X {
X 	return Push (OpStack, MakeInteger (stroke_method));
X }
END_OF_FILE
if test 10995 -ne `wc -c <'source/state.c'`; then
    echo shar: \"'source/state.c'\" unpacked with wrong size!
fi
# end of 'source/state.c'
fi
if test -f 'source/stroke.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'source/stroke.c'\"
else
echo shar: Extracting \"'source/stroke.c'\" \(11211 characters\)
sed "s/^X//" >'source/stroke.c' <<'END_OF_FILE'
X/*
X * Copyright (C) Rutherford Appleton Laboratory 1987
X * 
X * This source may be copied, distributed, altered or used, but not sold for profit
X * or incorporated into a product except under licence from the author.
X * It is not in the public domain.
X * This notice should remain in the source unaltered, and any changes to the source
X * made by persons other than the author should be marked as such.
X * 
X *	Crispin Goswell @ Rutherford Appleton Laboratory caag@uk.ac.rl.vd
X */
X#include "main.h"
X
X#include "graphics.h"
X
Xint PStrokePath ();
X
Xint in_stroke = FALSE;
X
Xint Stroke ();
X
XInitStroke ()
X {
X 	InstallOp ("strokepath",	PStrokePath,	0, 0, 0, 0);
X 	InstallOp ("stroke",		Stroke,		0, 0, 0, 0);
X }
X
Xint Stroke ()
X {
X 	int res;
X 	
X 	if (!PFlattenPath ())
X 		return FALSE;
X 	if (EmptyPath (gstate->path))
X 		return TRUE;
X 	if (gstate->device->dev == NULL)
X 		return PNewPath ();
X 	if (ThinStroke ())
X 		return TRUE;
X 	in_stroke = TRUE;
X 	res = PStrokePath () && Fill ();
X	VOID PNewPath ();
X	in_stroke = FALSE;
X	
X	return res;
X }
X
Xfloat Magnitude (v) Vector v;
X {
X 	return sqrt (v.vx * v.vx + v.vy * v.vy);
X }
X
Xstatic void Dash ()
X {
X 	Matrix m;
X 	Path p, new = NewPath (), last_move, last_dash;
X 	HardPoint move, here, next;
X 	Vector v, unit;
X 	int marking, start_marking = TRUE, index, start_index = 0;
X 	float dash_left, start_dash_left = gstate->dash_offset;
X 	float umag, dmag;
X 	
X 	m = gstate->CTM;
X 	m = NewMatrix (m.A, m.B, m.C, m.D, 0.0, 0.0);
X 	
X 	while (start_dash_left > gstate->dash_array [start_index])
X 	 {
X 	 	start_dash_left -= gstate->dash_array [start_index];
X 	 	if (++start_index == gstate->dash_length)
X 	 		start_index = 0;
X 	 	start_marking = !start_marking;
X 	 }
X 	start_dash_left = gstate->dash_array [start_index] - start_dash_left;
X 	
X 	for (p = gstate->path->next; p != gstate->path; p = p->next)
X 	 switch (p->ptype)
X 	  {
X 	  	case EMove:
X 	  		index = start_index;
X 	  		marking = start_marking;
X 	  		dash_left = start_dash_left;
X 	  		here = move = p->pe.point;
X 	  		VOID MoveTo (new, here);
X 	  		last_move = last_dash = new->last;
X 	  		break;
X 	  	
X 	  	case ELine:
X 	  	case EClose:
X 	  		next = p->ptype == ELine ? p->pe.point : move;
X 	  		v = NewVector (next.hx - here.hx, next.hy - here.hy, 1.0);
X 	  		dmag = Magnitude (v);
X 	  		if (dmag == 0)
X 	  		 {
X 	  		 	here = next;
X 	  			break;
X 	  		 }
X 	  		umag = Magnitude (ITransform (v, m));
X 	  		unit = NewVector (v.vx / umag, v.vy / umag, 1.0);
X 	  		while (umag > dash_left)
X 	  		 {
X 	  		 	here.hx += unit.vx * dash_left;
X 	  		 	here.hy += unit.vy * dash_left;
X 	  		 	(*(marking ? LineTo : MoveTo)) (new, here);
X 	  		 	if (!marking)
X 	  		 		last_dash = new->last;
X 	  		 	marking = !marking;
X 	  		 	umag -= dash_left;
X 	  		 	if (++index == gstate->dash_length)
X 	  		 		index = 0;
X 	  		 	dash_left = gstate->dash_array [index];
X 	  		 }
X 	  		if (p->ptype == ELine)
X 	  		 {
X 	  		 	dash_left -= umag;
X 	  		 	if (marking)
X 	  		 		VOID LineTo (new, next);
X 	  		 }
X 	  		else
X 	  		 {
X 	  		 	if (marking)
X 	  		 	 {
X 	  		 	 	if (start_marking)
X 	  		 	 		if (last_dash == last_move)
X 	  		 	 			ClosePath (new);
X 	  		 	 		else
X 	  		 	 		 {
X	  		 	 		 /*	LineTo (new, move);	*/
X 	  		 	 			MoveChunk (last_move, last_dash, new->last);
X 	  		 	 		 }
X 	  		 	 	else
X 	  		 	 		VOID LineTo (new, move);
X 	  		 	 }
X 	  		 }
X 	  		here = next;
X 	  		break;
X 	  	
X 	  	default:
X 	  		Panic ("Dash: unknown Path Element type");
X 	  }
X 	PathFree (gstate->path);
X 	gstate->path = new;
X 	gstate->cp = new->next->pe.point;
X }
X
XMoveChunk (dest, begin, end) Path dest, begin, end;
X {
X	dest->ptype = ELine;
X	end->next->last = begin->last;
X	begin->last->next = end->next;
X	dest->last->next = begin;
X	
X	end->next = dest;
X	begin->last = dest->last;
X	dest->last = end;
X }
X
X/*
X * is 'b' to the left of 'a' ? if 'a' carries into 'b' ?
X *
X *			   /
X *			  /
X *			 b
X *			/
X *		       /
X * --------- a -------o
X * 
X */
X
Xleftof (a, b) float a, b;
X {
X	return Normalise (b - a) > 0;
X }
X
XMiter (new, last_angle, angle, width) Path new; float last_angle, angle, width;
X {
X 	Matrix old;
X 	float diff;
X	
X	old = gstate->CTM;
X	if (leftof (last_angle, angle))
X	 {
X	 	diff = angle - last_angle;
X		VOID MoveTo (new, ExtToInt (NewPoint (0.0, 0.0)));
X		gstate->CTM = Rotate (gstate->CTM, -diff);
X		VOID LineTo (new, ExtToInt (NewPoint (0.0, -width / 2)));
X		gstate->CTM = Rotate (gstate->CTM, diff / 2);
X		VOID LineTo (new, ExtToInt (NewPoint (0.0, -(width / 2) / cos (diff / 2))));
X		gstate->CTM = old;
X		VOID LineTo (new, ExtToInt (NewPoint (0.0, -width / 2)));
X	 }	
X	else
X	 {
X	 	diff = last_angle - angle;
X		VOID MoveTo (new, ExtToInt (NewPoint (0.0, 0.0)));
X		VOID LineTo (new, ExtToInt (NewPoint (0.0, width / 2)));
X		gstate->CTM = Rotate (gstate->CTM, diff / 2);
X		VOID LineTo (new, ExtToInt (NewPoint (0.0, (width / 2) / cos (diff / 2))));
X		gstate->CTM = Rotate (gstate->CTM, diff / 2);
X		VOID LineTo (new, ExtToInt (NewPoint (0.0, width / 2)));
X		gstate->CTM = old;
X	 }
X	ClosePath (new);
X }
X
XBevel (new, last_angle, angle, width) Path new; float last_angle, angle, width;
X {
X 	Matrix old;
X 	float diff;
X	
X	old = gstate->CTM;
X	if (leftof (last_angle, angle))
X	 {
X	 	diff = angle - last_angle;
X		VOID MoveTo (new, ExtToInt (NewPoint (0.0, 0.0)));
X		gstate->CTM = Rotate (gstate->CTM, -diff);
X		VOID LineTo (new, ExtToInt (NewPoint (0.0, -width / 2)));
X		gstate->CTM = old;
X		VOID LineTo (new, ExtToInt (NewPoint (0.0, -width / 2)));
X	 }
X	else
X	 {
X	 	diff = last_angle - angle;
X		VOID MoveTo (new, ExtToInt (NewPoint (0.0, 0.0)));
X		VOID LineTo (new, ExtToInt (NewPoint (0.0, width / 2)));
X		gstate->CTM = Rotate (gstate->CTM, diff);
X		VOID LineTo (new, ExtToInt (NewPoint (0.0, width / 2)));
X		gstate->CTM = old;
X	 }
X	ClosePath (new);
X }
X
XBeginCap (new, width) Path new; float width;
X {
X	switch (gstate->line_cap)
X	 {
X	 	case CBUTT: break;
X	 	
X	 	case CSQUARE:
X	 		VOID MoveTo (new, ExtToInt (NewPoint (0.0, -width / 2)));
X	 		VOID LineTo (new, ExtToInt (NewPoint (0.0, width / 2)));
X	 		VOID LineTo (new, ExtToInt (NewPoint (-width / 2, width / 2)));
X	 		VOID LineTo (new, ExtToInt (NewPoint (-width / 2, -width / 2)));
X	 		ClosePath (new);
X	 		break;
X	 		
X	 	case CROUND:
X	 		VOID MoveTo (new, ExtToInt (NewPoint (0.0, width / 2)));
X	 		Arc (new, 1, NewPoint (0.0, 0.0), width / 2, PI / 2, 3 * PI / 2);
X	 		ClosePath (new);
X	 		break;
X	 		
X	 	default:
X	 		Panic ("BeginCap  - unknown line cap encountered");
X	 }
X }
X
XLineJoin (new, width, last_angle, angle) Path new; float width, last_angle, angle;
X {
X 	float ang, sa;
X 	
X	switch (gstate->line_join)
X	 {
X	 	case JMITRE:
X	 		ang = Normalise (leftof (last_angle, angle) ? angle - last_angle : last_angle - angle);
X	 		ang = ang < 0 ? -ang : ang;
X	 		ang = ang > PI / 2 ? PI - ang : ang;
X	 		sa = sin (ang / 2);
X	 		if (sa != 0 && 1 / sa <= gstate->miter_limit && 1 / sa >= -gstate->miter_limit)
X	 			Miter (new, last_angle, angle, width);
X	 		else
X	 			Bevel (new, last_angle, angle, width);
X	 		
X	 		break;
X	 	
X	 	case JROUND:
X	 		VOID MoveTo (new, ExtToInt (NewPoint (width / 2, 0.0)));
X	 		Arc (new, 1, NewPoint (0.0, 0.0), width / 2, 0.0, 2 * PI);
X	 		ClosePath (new);
X	 		break;
X	 	
X	 	case JBEVEL: Bevel (new, last_angle, angle, width); break;
X	 	
X	 	default:
X	 		Panic ("LineJoin  - unknown line join encountered");
X	 }
X }
X
XEndCap (new, width, length) Path new; float width, length;
X {
X	switch (gstate->line_cap)
X	 {
X	 	case CBUTT: break;
X	 	
X	 	case CSQUARE:
X	 		VOID MoveTo (new, ExtToInt (NewPoint (length, -width / 2)));
X	 		VOID LineTo (new, ExtToInt (NewPoint (length + width / 2, -width / 2)));
X	 		VOID LineTo (new, ExtToInt (NewPoint (length + width / 2, width / 2)));
X	 		VOID LineTo (new, ExtToInt (NewPoint (length, width / 2)));
X	 		ClosePath (new);
X	 		break;
X	 		
X	 	case CROUND:
X	 		VOID MoveTo (new, ExtToInt (NewPoint (length, -width / 2)));
X	 		Arc (new, 1, NewPoint (length, 0.0), width / 2, -PI / 2, PI / 2);
X	 		ClosePath (new);
X	 		break;
X	 		
X	 	default:
X	 		Panic ("StrokeLineEnd  - unknown line cap encountered");
X	 }
X }
X
Xstatic float move_angle;
Xstatic Matrix move_matrix;
X
Xfloat LineSegment (p, new, ehere, enow, width, last_angle, last_type) Path p, new; Point ehere, enow; float width, last_angle; enum pelem_type last_type;
X {
X 	float angle = atan2 (enow.y - ehere.y, enow.x - ehere.x),
X 		length = sqrt ((enow.y - ehere.y) * (enow.y - ehere.y) + (enow.x - ehere.x) * (enow.x - ehere.x));
X	Matrix old;
X	
X	old = gstate->CTM;
X	
X	gstate->CTM = Rotate (Translate (gstate->CTM, ehere.x, ehere.y), angle);
X	VOID MoveTo (new, ExtToInt (NewPoint (0.0, -width / 2)));
X	VOID LineTo (new, ExtToInt (NewPoint (length, -width / 2)));
X	VOID LineTo (new, ExtToInt (NewPoint (length, width / 2)));
X	VOID LineTo (new, ExtToInt (NewPoint (0.0, width / 2)));
X	ClosePath (new);
X	
X	if (last_type == EMove)
X	 {
X	 	move_angle = angle;
X		move_matrix = gstate->CTM;
X	 }
X	else if (last_type == ELine)
X		LineJoin (new, width, last_angle, angle);
X	
X	if (p->ptype == EClose)
X	 {
X		if (last_type == ELine)
X		 {
X		 	gstate->CTM = move_matrix;
X			LineJoin (new, width, angle, move_angle);
X		 }
X	 }
X	else if (p->next->ptype == EMove || p->next->ptype == EHeader)
X	 {
X		EndCap (new, width, length);
X	 	gstate->CTM = move_matrix;
X	 	BeginCap (new, width);
X	 }
X	
X	gstate->CTM = old;
X	return angle;
X }
X
Xint PStrokePath ()
X {
X 	Path p, new = NewPath ();
X 	HardPoint prev, here, move;
X 	enum pelem_type last_type = EHeader;
X 	float angle, last_angle, width = gstate->line_width;
X 	
X 	PFlattenPath ();
X 	if (gstate->dash_length != 0)
X 		Dash ();
X 	for (p = gstate->path->next; p != gstate->path; last_type = p->ptype, p = p->next)
X 	 {
X	 	switch (p->ptype)
X	 	 {
X	 	  	case EMove:
X			 	prev = here;
X			 	move = here = p->pe.point;
X			 	break;
X			 	
X	 	  	case EClose:
X	 	  		if (last_type == EMove)
X	 	  			break;
X				angle = LineSegment (p, new, IntToExt (here), IntToExt (move), width, last_angle, last_type);
X			 	prev = here;
X			 	here = move;
X			 	last_type = EHeader;
X			 	break;
X			 	
X	 	  	case ELine:
X				angle = LineSegment (p, new, IntToExt (here), IntToExt (p->pe.point), width, last_angle, last_type);
X			 	prev = here;
X			 	here = p->pe.point;
X	 	  		break;
X	 	  		
X	 	  	default:
X	 	  		Panic ("unknown path element type in StrokePath");
X	 	 }
X	 	last_type = p->ptype;
X	 	last_angle = angle;
X	 }
X 	PathFree (gstate->path);
X 	gstate->path = new;
X 	return TRUE;
X }
X
Xint ThinStroke ()
X {
X 	Path p;
X 	Vector v;
X 	HardPoint here, prev;
X 	
X 	if (stroke_method != STROKE_THIN)
X 		return FALSE; /* not used - get better results with area fill */
X 	v = Transform (NewVector (gstate->line_width, gstate->line_width, 0.0), gstate->CTM);
X 	if (fabs (v.vx) > 1.1 || fabs (v.vy) > 1.1)
X 		return FALSE;
X 	if (gstate->dash_length != 0)
X 		Dash ();
X 	for (p = gstate->path->next; p != gstate->path; p = p->next)
X 	 switch (p->ptype)
X 	  {
X 	  	case EMove:
X 	  		here = prev = p->pe.point;
X 	  		break;
X 	  	
X 	  	case ELine:
X 	  		DevicePaintLine (gstate->device, prev, p->pe.point, gstate->colour);
X 	  		prev = p->pe.point;
X 	  		break;
X 	  	
X 	  	case EClose:
X 	  		DevicePaintLine (gstate->device, prev, here, gstate->colour);
X  	  		prev = here;
X	  		break;
X 	  		
X	 	default:
X	 	  	Panic ("unknown path element type in ThinStroke");
X 	  }
X	VOID PNewPath ();
X	
X	return TRUE;
X }
END_OF_FILE
if test 11211 -ne `wc -c <'source/stroke.c'`; then
    echo shar: \"'source/stroke.c'\" unpacked with wrong size!
fi
# end of 'source/stroke.c'
fi
echo shar: End of archive 9 \(of 18\).
cp /dev/null ark9isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 18 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
 e ; d