home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume12 / postscript / part09 < prev    next >
Encoding:
Internet Message Format  |  1987-11-05  |  50.9 KB

  1. Subject:  v12i058:  A PostScript interpreter, Part09/18
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rs@uunet.UU.NET
  5.  
  6. Submitted-by: Crispin Goswell <caag@vd.rl.ac.uk>
  7. Posting-number: Volume 12, Issue 58
  8. Archive-name: postscript/part09
  9.  
  10. #! /bin/sh
  11. # This is a shell archive.  Remove anything before this line, then unpack
  12. # it by saving it into a file and typing "sh file".  To overwrite existing
  13. # files, type "sh file -c".  You can also feed this as standard input via
  14. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  15. # will see the following message at the end:
  16. #        "End of archive 9 (of 18)."
  17. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  18. if test -f 'postscript/fonts/Times/russian.r' -a "${1}" != "-c" ; then 
  19.   echo shar: Will not clobber existing file \"'postscript/fonts/Times/russian.r'\"
  20. else
  21. echo shar: Extracting \"'postscript/fonts/Times/russian.r'\" \(11645 characters\)
  22. sed "s/^X//" >'postscript/fonts/Times/russian.r' <<'END_OF_FILE'
  23. XCharStrings
  24. X/2901
  25. X<C53D
  26. X453E
  27. X443E
  28. X443D
  29. X453C
  30. X473B
  31. X4B3B
  32. X4D3C
  33. X4E3D
  34. X4F3F
  35. X4F46
  36. X5048
  37. X5149
  38. XCE3D
  39. X4E46
  40. X4F48
  41. X5149
  42. X5249
  43. XCE3F
  44. X4D40
  45. X4741
  46. X4442
  47. X4344
  48. X4346
  49. X4448
  50. X4749
  51. X4A49
  52. X4C48
  53. X4E46
  54. XC741
  55. X4542
  56. X4444
  57. X4446
  58. X4548
  59. X4749
  60. X>
  61. Xput
  62. XMetrics
  63. X/2901
  64. X[-3
  65. X20]
  66. Xput
  67. XCharStrings
  68. X/2902
  69. X<D034
  70. X4F35
  71. X4937
  72. X4639
  73. X443C
  74. X433F
  75. X4343
  76. X4446
  77. X4648
  78. X4949
  79. X4B49
  80. X4E48
  81. X5046
  82. X5143
  83. X5141
  84. X503E
  85. X4E3C
  86. X4B3B
  87. X493B
  88. X463C
  89. X443E
  90. X4341
  91. XD034
  92. X4F36
  93. X4D37
  94. X4938
  95. X463A
  96. X443C
  97. XC93B
  98. X473C
  99. X453E
  100. X4441
  101. X4443
  102. X4546
  103. X4748
  104. X4949
  105. XCB49
  106. X4D48
  107. X4F46
  108. X5043
  109. X5041
  110. X4F3E
  111. X4D3C
  112. X4B3B
  113. X>
  114. Xput
  115. XMetrics
  116. X/2902
  117. X[2
  118. X20]
  119. Xput
  120. XCharStrings
  121. X/2903
  122. X<C53B
  123. X4549
  124. XC63B
  125. X4649
  126. XC23B
  127. X4D3B
  128. X503C
  129. X513E
  130. X513F
  131. X5041
  132. X4D42
  133. XCD3B
  134. X4F3C
  135. X503E
  136. X503F
  137. X4F41
  138. X4D42
  139. XC642
  140. X4D42
  141. X5043
  142. X5145
  143. X5146
  144. X5048
  145. X4D49
  146. X4249
  147. XCD42
  148. X4F43
  149. X5045
  150. X5046
  151. X4F48
  152. X4D49
  153. X>
  154. Xput
  155. XMetrics
  156. X/2903
  157. X[-2
  158. X20]
  159. Xput
  160. XCharStrings
  161. X/2904
  162. X<C53B
  163. X4549
  164. XC63B
  165. X4649
  166. XC23B
  167. X503B
  168. X5040
  169. X4F3B
  170. XC249
  171. X4949
  172. X>
  173. Xput
  174. XMetrics
  175. X/2904
  176. X[-2
  177. X18]
  178. Xput
  179. XCharStrings
  180. X/2905
  181. X<C83B
  182. X483F
  183. X4745
  184. X4648
  185. X4549
  186. XD13B
  187. X5149
  188. XD23B
  189. X5249
  190. XC53B
  191. X553B
  192. XC349
  193. X424E
  194. X4249
  195. X5549
  196. X554E
  197. X5449
  198. X>
  199. Xput
  200. XMetrics
  201. X/2905
  202. X[-2
  203. X23]
  204. Xput
  205. XCharStrings
  206. X/2906
  207. X<C441
  208. X5041
  209. X503F
  210. X4F3D
  211. X4E3C
  212. X4C3B
  213. X493B
  214. X463C
  215. X443E
  216. X4341
  217. X4343
  218. X4446
  219. X4648
  220. X4949
  221. X4B49
  222. X4E48
  223. X5046
  224. XCF41
  225. X4F3E
  226. X4E3C
  227. XC93B
  228. X473C
  229. X453E
  230. X4441
  231. X4443
  232. X4546
  233. X4748
  234. X4949
  235. X>
  236. Xput
  237. XMetrics
  238. X/2906
  239. X[-3
  240. X19]
  241. Xput
  242. XCharStrings
  243. X/2907
  244. X<CD3B
  245. X4D49
  246. XCE3B
  247. X4E49
  248. XCA3B
  249. X513B
  250. XC53C
  251. X443D
  252. X433C
  253. X443B
  254. X453B
  255. X463C
  256. X4840
  257. X4941
  258. X4B42
  259. X5042
  260. X5241
  261. X5340
  262. X553C
  263. X563B
  264. X573B
  265. X583C
  266. X573D
  267. X563C
  268. XCB42
  269. X4943
  270. X4844
  271. X4648
  272. X4549
  273. XCB42
  274. X4944
  275. X4748
  276. X4649
  277. X4449
  278. X4348
  279. X4246
  280. XD042
  281. X5243
  282. X5344
  283. X5548
  284. X5649
  285. XD042
  286. X5244
  287. X5448
  288. X5549
  289. X5749
  290. X5848
  291. X5946
  292. XCA49
  293. X5149
  294. X>
  295. Xput
  296. XMetrics
  297. X/2907
  298. X[-2
  299. X27]
  300. Xput
  301. XCharStrings
  302. X/2908
  303. X<C43D
  304. X433B
  305. X433F
  306. X443D
  307. X453C
  308. X473B
  309. X4B3B
  310. X4E3C
  311. X4F3E
  312. X4F3F
  313. X4E41
  314. X4B42
  315. XCB3B
  316. X4D3C
  317. X4E3E
  318. X4E3F
  319. X4D41
  320. X4B42
  321. XC842
  322. X4B42
  323. X4E43
  324. X4F45
  325. X4F46
  326. X4E48
  327. X4B49
  328. X4749
  329. X4448
  330. X4346
  331. X4345
  332. X4444
  333. X4545
  334. X4446
  335. XCB42
  336. X4D43
  337. X4E45
  338. X4E46
  339. X4D48
  340. X4B49
  341. X>
  342. Xput
  343. XMetrics
  344. X/2908
  345. X[-3
  346. X18]
  347. Xput
  348. XCharStrings
  349. X/2909
  350. X<C53B
  351. X4549
  352. XC63B
  353. X4649
  354. XD03B
  355. X5049
  356. XD13B
  357. X5149
  358. XC23B
  359. X493B
  360. XCD3B
  361. X543B
  362. XC249
  363. X4949
  364. XCD49
  365. X5449
  366. XD03C
  367. X4648
  368. X>
  369. Xput
  370. XMetrics
  371. X/2909
  372. X[-2
  373. X22]
  374. Xput
  375. XCharStrings
  376. X/2910
  377. X<C53B
  378. X4549
  379. XC63B
  380. X4649
  381. XD03B
  382. X5049
  383. XD13B
  384. X5149
  385. XC23B
  386. X493B
  387. XCD3B
  388. X543B
  389. XC249
  390. X4949
  391. XCD49
  392. X5449
  393. XD03C
  394. X4648
  395. XC835
  396. X4834
  397. X4734
  398. X4735
  399. X4837
  400. X4A38
  401. X4C38
  402. X4E37
  403. X4F35
  404. X>
  405. Xput
  406. XMetrics
  407. X/2910
  408. X[1
  409. X22]
  410. Xput
  411. XCharStrings
  412. X/2911
  413. X<C53B
  414. X4549
  415. XC63B
  416. X4649
  417. XC23B
  418. X493B
  419. XC642
  420. X4842
  421. X4B41
  422. X4C40
  423. X4E3C
  424. X4F3B
  425. X503B
  426. X513C
  427. X503D
  428. X4F3C
  429. XC842
  430. X4B43
  431. X4C44
  432. X4E48
  433. X4F49
  434. XC842
  435. X4A43
  436. X4B44
  437. X4D48
  438. X4E49
  439. X5049
  440. X5148
  441. X5246
  442. XC249
  443. X4949
  444. X>
  445. Xput
  446. XMetrics
  447. X/2911
  448. X[-2
  449. X20]
  450. Xput
  451. XCharStrings
  452. X/2912
  453. X<C73B
  454. X473F
  455. X4645
  456. X4548
  457. X4449
  458. X4349
  459. X4248
  460. X4347
  461. X4448
  462. XD03B
  463. X5049
  464. XD13B
  465. X5149
  466. XC43B
  467. X543B
  468. XCD49
  469. X5449
  470. X>
  471. Xput
  472. XMetrics
  473. X/2912
  474. X[-2
  475. X22]
  476. Xput
  477. XCharStrings
  478. X/2913
  479. X<C53B
  480. X4549
  481. XC53B
  482. X4B49
  483. XC63B
  484. X4B47
  485. XD13B
  486. X4B49
  487. XD13B
  488. X5149
  489. XD23B
  490. X5249
  491. XC23B
  492. X463B
  493. XD13B
  494. X553B
  495. XC249
  496. X4849
  497. XCE49
  498. X5549
  499. X>
  500. Xput
  501. XMetrics
  502. X/2913
  503. X[-2
  504. X23]
  505. Xput
  506. XCharStrings
  507. X/2914
  508. X<C53B
  509. X4549
  510. XC63B
  511. X4649
  512. XD03B
  513. X5049
  514. XD13B
  515. X5149
  516. XC23B
  517. X493B
  518. XCD3B
  519. X543B
  520. XC642
  521. X5042
  522. XC249
  523. X4949
  524. XCD49
  525. X5449
  526. X>
  527. Xput
  528. XMetrics
  529. X/2914
  530. X[-2
  531. X22]
  532. Xput
  533. XCharStrings
  534. X/2915
  535. X<C93B
  536. X463C
  537. X443E
  538. X4341
  539. X4343
  540. X4446
  541. X4648
  542. X4949
  543. X4B49
  544. X4E48
  545. X5046
  546. X5143
  547. X5141
  548. X503E
  549. X4E3C
  550. X4B3B
  551. X493B
  552. XC93B
  553. X473C
  554. X453E
  555. X4441
  556. X4443
  557. X4546
  558. X4748
  559. X4949
  560. XCB49
  561. X4D48
  562. X4F46
  563. X5043
  564. X5041
  565. X4F3E
  566. X4D3C
  567. X4B3B
  568. X>
  569. Xput
  570. XMetrics
  571. X/2915
  572. X[-3
  573. X20]
  574. Xput
  575. XCharStrings
  576. X/2916
  577. X<C53B
  578. X4549
  579. XC63B
  580. X4649
  581. XD03B
  582. X5049
  583. XD13B
  584. X5149
  585. XC23B
  586. X543B
  587. XC249
  588. X4949
  589. XCD49
  590. X5449
  591. X>
  592. Xput
  593. XMetrics
  594. X/2916
  595. X[-2
  596. X22]
  597. Xput
  598. XCharStrings
  599. X/2917
  600. X<C53B
  601. X4550
  602. XC63B
  603. X4650
  604. XC63E
  605. X483C
  606. X4A3B
  607. X4C3B
  608. X4F3C
  609. X513E
  610. X5241
  611. X5243
  612. X5146
  613. X4F48
  614. X4C49
  615. X4A49
  616. X4848
  617. X4646
  618. XCC3B
  619. X4E3C
  620. X503E
  621. X5141
  622. X5143
  623. X5046
  624. X4E48
  625. X4C49
  626. XC23B
  627. X463B
  628. XC250
  629. X4950
  630. X>
  631. Xput
  632. XMetrics
  633. X/2917
  634. X[-2
  635. X21]
  636. Xput
  637. XCharStrings
  638. X/2918
  639. X<CF3E
  640. X4E3F
  641. X4F40
  642. X503F
  643. X503E
  644. X4E3C
  645. X4C3B
  646. X493B
  647. X463C
  648. X443E
  649. X4341
  650. X4343
  651. X4446
  652. X4648
  653. X4949
  654. X4B49
  655. X4E48
  656. X5046
  657. XC93B
  658. X473C
  659. X453E
  660. X4441
  661. X4443
  662. X4546
  663. X4748
  664. X4949
  665. X>
  666. Xput
  667. XMetrics
  668. X/2918
  669. X[-3
  670. X19]
  671. Xput
  672. XCharStrings
  673. X/2919
  674. X<C93B
  675. X4949
  676. XCA3B
  677. X4A49
  678. XC43B
  679. X4340
  680. X433B
  681. X503B
  682. X5040
  683. X4F3B
  684. XC649
  685. X4D49
  686. X>
  687. Xput
  688. XMetrics
  689. X/2919
  690. X[-3
  691. X19]
  692. Xput
  693. XCharStrings
  694. X/2920
  695. X<C33B
  696. X4949
  697. XC43B
  698. X4947
  699. XCF3B
  700. X4949
  701. X474D
  702. X454F
  703. X4350
  704. X4250
  705. X414F
  706. X424E
  707. X434F
  708. XC13B
  709. X473B
  710. XCB3B
  711. X513B
  712. X>
  713. Xput
  714. XMetrics
  715. X/2920
  716. X[-1
  717. X18]
  718. Xput
  719. XCharStrings
  720. X/2921
  721. X<CA34
  722. X4A50
  723. XCB34
  724. X4B50
  725. XC734
  726. X4B34
  727. XCA3E
  728. X493C
  729. X483B
  730. X463B
  731. X443C
  732. X433F
  733. X4345
  734. X4448
  735. X4649
  736. X4849
  737. X4948
  738. X4A46
  739. XC63B
  740. X453C
  741. X443F
  742. X4445
  743. X4548
  744. X4649
  745. XCF3B
  746. X503C
  747. X513F
  748. X5145
  749. X5048
  750. X4F49
  751. XCB3E
  752. X4C3C
  753. X4D3B
  754. X4F3B
  755. X513C
  756. X523F
  757. X5245
  758. X5148
  759. X4F49
  760. X4D49
  761. X4C48
  762. X4B46
  763. XC750
  764. X4E50
  765. X>
  766. Xput
  767. XMetrics
  768. X/2921
  769. X[2
  770. X21]
  771. Xput
  772. XCharStrings
  773. X/2922
  774. X<C43B
  775. X4F49
  776. XC53B
  777. X5049
  778. XD03B
  779. X4449
  780. XC23B
  781. X483B
  782. XCC3B
  783. X523B
  784. XC249
  785. X4849
  786. XCC49
  787. X5249
  788. X>
  789. Xput
  790. XMetrics
  791. X/2922
  792. X[-2
  793. X20]
  794. Xput
  795. XCharStrings
  796. X/2923
  797. X<C53B
  798. X4549
  799. XC63B
  800. X4649
  801. XD03B
  802. X5049
  803. XD13B
  804. X5149
  805. XC23B
  806. X493B
  807. XCD3B
  808. X543B
  809. XC249
  810. X5449
  811. X544E
  812. X5349
  813. X>
  814. Xput
  815. XMetrics
  816. X/2923
  817. X[-2
  818. X22]
  819. Xput
  820. XCharStrings
  821. X/2924
  822. X<C53B
  823. X4542
  824. X4644
  825. X4945
  826. X4B45
  827. X4E44
  828. X5042
  829. XC63B
  830. X4642
  831. X4744
  832. X4945
  833. XD03B
  834. X5049
  835. XD13B
  836. X5149
  837. XC23B
  838. X493B
  839. XCD3B
  840. X543B
  841. XCD49
  842. X5449
  843. X>
  844. Xput
  845. XMetrics
  846. X/2924
  847. X[-2
  848. X22]
  849. Xput
  850. XCharStrings
  851. X/2925
  852. X<C53B
  853. X4549
  854. XC63B
  855. X4649
  856. XCF3B
  857. X4F49
  858. XD03B
  859. X5049
  860. XD93B
  861. X5949
  862. XDA3B
  863. X5A49
  864. XC23B
  865. X493B
  866. XCC3B
  867. X533B
  868. XD63B
  869. X5D3B
  870. XC249
  871. X5D49
  872. X>
  873. Xput
  874. XMetrics
  875. X/2925
  876. X[-2
  877. X31]
  878. Xput
  879. XCharStrings
  880. X/2926
  881. X<C53B
  882. X4549
  883. XC63B
  884. X4649
  885. XCF3B
  886. X4F49
  887. XD03B
  888. X5049
  889. XD93B
  890. X5949
  891. XDA3B
  892. X5A49
  893. XC23B
  894. X493B
  895. XCC3B
  896. X533B
  897. XD63B
  898. X5D3B
  899. XC249
  900. X5D49
  901. X5D4E
  902. X5C49
  903. X>
  904. Xput
  905. XMetrics
  906. X/2926
  907. X[-2
  908. X31]
  909. Xput
  910. XCharStrings
  911. X/2927
  912. X<C93B
  913. X4949
  914. XCA3B
  915. X4A49
  916. XC43B
  917. X4340
  918. X433B
  919. X4D3B
  920. XCA42
  921. X4E42
  922. X5143
  923. X5245
  924. X5246
  925. X5148
  926. X4E49
  927. X4649
  928. XCE42
  929. X5043
  930. X5145
  931. X5146
  932. X5048
  933. X4E49
  934. X>
  935. Xput
  936. XMetrics
  937. X/2927
  938. X[-3
  939. X21]
  940. Xput
  941. XCharStrings
  942. X/2928
  943. X<C53B
  944. X4549
  945. XC63B
  946. X4649
  947. XC23B
  948. X493B
  949. XC642
  950. X4A42
  951. X4D43
  952. X4E45
  953. X4E46
  954. X4D48
  955. X4A49
  956. X4249
  957. XCA42
  958. X4C43
  959. X4D45
  960. X4D46
  961. X4C48
  962. X4A49
  963. XD43B
  964. X5449
  965. XD53B
  966. X5549
  967. XD13B
  968. X583B
  969. XD149
  970. X5849
  971. X>
  972. Xput
  973. XMetrics
  974. X/2928
  975. X[-2
  976. X26]
  977. Xput
  978. XCharStrings
  979. X/2929
  980. X<C53B
  981. X4549
  982. XC63B
  983. X4649
  984. XC23B
  985. X493B
  986. XC642
  987. X4A42
  988. X4D43
  989. X4E45
  990. X4E46
  991. X4D48
  992. X4A49
  993. X4249
  994. XCA42
  995. X4C43
  996. X4D45
  997. X4D46
  998. X4C48
  999. X4A49
  1000. X>
  1001. Xput
  1002. XMetrics
  1003. X/2929
  1004. X[-2
  1005. X17]
  1006. Xput
  1007. XCharStrings
  1008. X/2930
  1009. X<C43D
  1010. X433B
  1011. X433F
  1012. X443D
  1013. X453C
  1014. X473B
  1015. X4A3B
  1016. X4D3C
  1017. X4F3E
  1018. X5041
  1019. X5043
  1020. X4F46
  1021. X4D48
  1022. X4A49
  1023. X4749
  1024. X4548
  1025. X4346
  1026. X4345
  1027. X4444
  1028. X4545
  1029. X4446
  1030. XCA3B
  1031. X4C3C
  1032. X4E3E
  1033. X4F41
  1034. X4F43
  1035. X4E46
  1036. X4C48
  1037. X4A49
  1038. XC942
  1039. X4F42
  1040. X>
  1041. Xput
  1042. XMetrics
  1043. X/2930
  1044. X[-3
  1045. X19]
  1046. Xput
  1047. XCharStrings
  1048. X/2931
  1049. X<C53B
  1050. X4549
  1051. XC63B
  1052. X4649
  1053. XC23B
  1054. X493B
  1055. XC249
  1056. X4949
  1057. XD23B
  1058. X4F3C
  1059. X4D3E
  1060. X4C41
  1061. X4C43
  1062. X4D46
  1063. X4F48
  1064. X5249
  1065. X5449
  1066. X5748
  1067. X5946
  1068. X5A43
  1069. X5A41
  1070. X593E
  1071. X573C
  1072. X543B
  1073. X523B
  1074. XD23B
  1075. X503C
  1076. X4E3E
  1077. X4D41
  1078. X4D43
  1079. X4E46
  1080. X5048
  1081. X5249
  1082. XD449
  1083. X5648
  1084. X5846
  1085. X5943
  1086. X5941
  1087. X583E
  1088. X563C
  1089. X543B
  1090. XC642
  1091. X4C42
  1092. X>
  1093. Xput
  1094. XMetrics
  1095. X/2931
  1096. X[-2
  1097. X29]
  1098. Xput
  1099. XCharStrings
  1100. X/2932
  1101. X<CF3B
  1102. X4F49
  1103. XD03B
  1104. X5049
  1105. XD33B
  1106. X483B
  1107. X453C
  1108. X443E
  1109. X443F
  1110. X4541
  1111. X4842
  1112. X4F42
  1113. XC83B
  1114. X463C
  1115. X453E
  1116. X453F
  1117. X4641
  1118. X4842
  1119. XCD42
  1120. X4A43
  1121. X4944
  1122. X4748
  1123. X4649
  1124. XCD42
  1125. X4B43
  1126. X4A44
  1127. X4848
  1128. X4749
  1129. X4549
  1130. X4448
  1131. X4346
  1132. XCC49
  1133. X5349
  1134. X>
  1135. Xput
  1136. XMetrics
  1137. X/2932
  1138. X[-3
  1139. X21]
  1140. Xput
  1141. XCharStrings
  1142. X/2801
  1143. X<CA34
  1144. X4349
  1145. XCA34
  1146. X5149
  1147. XCA37
  1148. X5049
  1149. XC543
  1150. X4E43
  1151. XC149
  1152. X4749
  1153. XCD49
  1154. X5349
  1155. X>
  1156. Xput
  1157. XMetrics
  1158. X/2801
  1159. X[2
  1160. X20]
  1161. Xput
  1162. XCharStrings
  1163. X/2802
  1164. X<C534
  1165. X4549
  1166. XC634
  1167. X4649
  1168. XC234
  1169. X5234
  1170. X523A
  1171. X5134
  1172. XC63E
  1173. X4E3E
  1174. X513F
  1175. X5240
  1176. X5342
  1177. X5345
  1178. X5247
  1179. X5148
  1180. X4E49
  1181. X4249
  1182. XCE3E
  1183. X503F
  1184. X5140
  1185. X5242
  1186. X5245
  1187. X5147
  1188. X5048
  1189. X4E49
  1190. X>
  1191. Xput
  1192. XMetrics
  1193. X/2802
  1194. X[1
  1195. X22]
  1196. Xput
  1197. XCharStrings
  1198. X/2803
  1199. X<C534
  1200. X4549
  1201. XC634
  1202. X4649
  1203. XC234
  1204. X4E34
  1205. X5135
  1206. X5236
  1207. X5338
  1208. X533A
  1209. X523C
  1210. X513D
  1211. X4E3E
  1212. XCE34
  1213. X5035
  1214. X5136
  1215. X5238
  1216. X523A
  1217. X513C
  1218. X503D
  1219. X4E3E
  1220. XC63E
  1221. X4E3E
  1222. X513F
  1223. X5240
  1224. X5342
  1225. X5345
  1226. X5247
  1227. X5148
  1228. X4E49
  1229. X4249
  1230. XCE3E
  1231. X503F
  1232. X5140
  1233. X5242
  1234. X5245
  1235. X5147
  1236. X5048
  1237. X4E49
  1238. X>
  1239. Xput
  1240. XMetrics
  1241. X/2803
  1242. X[1
  1243. X22]
  1244. Xput
  1245. XCharStrings
  1246. X/2804
  1247. X<C534
  1248. X4549
  1249. XC634
  1250. X4649
  1251. XC234
  1252. X5134
  1253. X513A
  1254. X5034
  1255. XC249
  1256. X4949
  1257. X>
  1258. Xput
  1259. XMetrics
  1260. X/2804
  1261. X[3
  1262. X18]
  1263. Xput
  1264. XCharStrings
  1265. X/2805
  1266. X<C834
  1267. X483A
  1268. X4742
  1269. X4646
  1270. X4548
  1271. X4449
  1272. XD234
  1273. X5249
  1274. XD334
  1275. X5349
  1276. XC534
  1277. X5634
  1278. XC149
  1279. X5649
  1280. XC149
  1281. X4150
  1282. XC249
  1283. X4150
  1284. XD549
  1285. X5650
  1286. XD649
  1287. X5650
  1288. X>
  1289. Xput
  1290. XMetrics
  1291. X/2805
  1292. X[0
  1293. X24]
  1294. Xput
  1295. XCharStrings
  1296. X/2806
  1297. X<C534
  1298. X4549
  1299. XC634
  1300. X4649
  1301. XCC3A
  1302. X4C42
  1303. XC234
  1304. X5234
  1305. X523A
  1306. X5134
  1307. XC63E
  1308. X4C3E
  1309. XC249
  1310. X5249
  1311. X5243
  1312. X5149
  1313. X>
  1314. Xput
  1315. XMetrics
  1316. X/2806
  1317. X[1
  1318. X21]
  1319. Xput
  1320. XCharStrings
  1321. X/2807
  1322. X<CF34
  1323. X4F49
  1324. XD034
  1325. X5049
  1326. XCC34
  1327. X5334
  1328. XC435
  1329. X4536
  1330. X4437
  1331. X4336
  1332. X4335
  1333. X4434
  1334. X4534
  1335. X4635
  1336. X4737
  1337. X483B
  1338. X493D
  1339. X4B3E
  1340. X543E
  1341. X563D
  1342. X573B
  1343. X5837
  1344. X5935
  1345. X5A34
  1346. X5B34
  1347. X5C35
  1348. X5C36
  1349. X5B37
  1350. X5A36
  1351. X5B35
  1352. XCB3E
  1353. X493F
  1354. X4841
  1355. X4746
  1356. X4648
  1357. X4549
  1358. XCB3E
  1359. X4A3F
  1360. X4941
  1361. X4846
  1362. X4748
  1363. X4649
  1364. X4449
  1365. X4348
  1366. X4246
  1367. XD43E
  1368. X563F
  1369. X5741
  1370. X5846
  1371. X5948
  1372. X5A49
  1373. XD43E
  1374. X553F
  1375. X5641
  1376. X5746
  1377. X5848
  1378. X5949
  1379. X5B49
  1380. X5C48
  1381. X5D46
  1382. XCC49
  1383. X5349
  1384. X>
  1385. Xput
  1386. XMetrics
  1387. X/2807
  1388. X[-2
  1389. X31]
  1390. Xput
  1391. XCharStrings
  1392. X/2808
  1393. X<C437
  1394. X4334
  1395. X433A
  1396. X4437
  1397. X4635
  1398. X4834
  1399. X4C34
  1400. X4F35
  1401. X5037
  1402. X503A
  1403. X4F3C
  1404. X4C3D
  1405. X493D
  1406. XCC34
  1407. X4E35
  1408. X4F37
  1409. X4F3A
  1410. X4E3C
  1411. X4C3D
  1412. XCC3D
  1413. X4E3E
  1414. X5040
  1415. X5142
  1416. X5145
  1417. X5047
  1418. X4F48
  1419. X4C49
  1420. X4749
  1421. X4548
  1422. X4447
  1423. X4345
  1424. X4344
  1425. X4443
  1426. X4544
  1427. X4445
  1428. XCF3F
  1429. X5042
  1430. X5045
  1431. X4F47
  1432. X4E48
  1433. X4C49
  1434. X>
  1435. Xput
  1436. XMetrics
  1437. X/2808
  1438. X[2
  1439. X20]
  1440. Xput
  1441. XCharStrings
  1442. X/2809
  1443. X<C534
  1444. X4549
  1445. XC634
  1446. X4649
  1447. XD234
  1448. X5249
  1449. XD334
  1450. X5349
  1451. XC234
  1452. X4934
  1453. XCF34
  1454. X5634
  1455. XD236
  1456. X4647
  1457. XC249
  1458. X4949
  1459. XCF49
  1460. X5649
  1461. X>
  1462. Xput
  1463. XMetrics
  1464. X/2809
  1465. X[0
  1466. X24]
  1467. Xput
  1468. XCharStrings
  1469. X/2810
  1470. X<C534
  1471. X4549
  1472. XC634
  1473. X4649
  1474. XD234
  1475. X5249
  1476. XD334
  1477. X5349
  1478. XC234
  1479. X4934
  1480. XCF34
  1481. X5634
  1482. XD236
  1483. X4647
  1484. XC249
  1485. X4949
  1486. XCF49
  1487. X5649
  1488. XC82E
  1489. X482D
  1490. X472D
  1491. X472E
  1492. X4830
  1493. X4A31
  1494. X4E31
  1495. X5030
  1496. X512E
  1497. X>
  1498. Xput
  1499. XMetrics
  1500. X/2810
  1501. X[7
  1502. X24]
  1503. Xput
  1504. XCharStrings
  1505. X/2811
  1506. X<C534
  1507. X4549
  1508. XC634
  1509. X4649
  1510. XC234
  1511. X4934
  1512. XC63E
  1513. X4D3E
  1514. X4F3D
  1515. X503B
  1516. X5137
  1517. X5235
  1518. X5334
  1519. X5434
  1520. X5535
  1521. X5536
  1522. X5437
  1523. X5336
  1524. X5435
  1525. XCD3E
  1526. X4F3F
  1527. X5041
  1528. X5146
  1529. X5248
  1530. X5349
  1531. XCD3E
  1532. X4E3F
  1533. X4F41
  1534. X5046
  1535. X5148
  1536. X5249
  1537. X5449
  1538. X5548
  1539. X5646
  1540. XC249
  1541. X4949
  1542. X>
  1543. Xput
  1544. XMetrics
  1545. X/2811
  1546. X[0
  1547. X24]
  1548. Xput
  1549. XCharStrings
  1550. X/2812
  1551. X<C834
  1552. X483A
  1553. X4742
  1554. X4646
  1555. X4548
  1556. X4449
  1557. X4349
  1558. X4248
  1559. X4247
  1560. X4346
  1561. X4447
  1562. X4348
  1563. XD334
  1564. X5349
  1565. XD434
  1566. X5449
  1567. XC534
  1568. X5734
  1569. XD049
  1570. X5749
  1571. X>
  1572. Xput
  1573. XMetrics
  1574. X/2812
  1575. X[-1
  1576. X25]
  1577. Xput
  1578. XCharStrings
  1579. X/2813
  1580. X<C534
  1581. X4549
  1582. XC634
  1583. X4C46
  1584. XC534
  1585. X4C49
  1586. XD334
  1587. X4C49
  1588. XD334
  1589. X5349
  1590. XD434
  1591. X5449
  1592. XC234
  1593. X4634
  1594. XD334
  1595. X5734
  1596. XC249
  1597. X4849
  1598. XD049
  1599. X5749
  1600. X>
  1601. Xput
  1602. XMetrics
  1603. X/2813
  1604. X[0
  1605. X25]
  1606. Xput
  1607. XCharStrings
  1608. X/2814
  1609. X<C534
  1610. X4549
  1611. XC634
  1612. X4649
  1613. XD234
  1614. X5249
  1615. XD334
  1616. X5349
  1617. XC234
  1618. X4934
  1619. XCF34
  1620. X5634
  1621. XC63E
  1622. X523E
  1623. XC249
  1624. X4949
  1625. XCF49
  1626. X5649
  1627. X>
  1628. Xput
  1629. XMetrics
  1630. X/2814
  1631. X[0
  1632. X24]
  1633. Xput
  1634. XCharStrings
  1635. X/2815
  1636. X<CA34
  1637. X4735
  1638. X4537
  1639. X4439
  1640. X433D
  1641. X4340
  1642. X4444
  1643. X4546
  1644. X4748
  1645. X4A49
  1646. X4C49
  1647. X4F48
  1648. X5146
  1649. X5244
  1650. X5340
  1651. X533D
  1652. X5239
  1653. X5137
  1654. X4F35
  1655. X4C34
  1656. X4A34
  1657. XCA34
  1658. X4835
  1659. X4637
  1660. X4539
  1661. X443D
  1662. X4440
  1663. X4544
  1664. X4646
  1665. X4848
  1666. X4A49
  1667. XCC49
  1668. X4E48
  1669. X5046
  1670. X5144
  1671. X5240
  1672. X523D
  1673. X5139
  1674. X5037
  1675. X4E35
  1676. X4C34
  1677. X>
  1678. Xput
  1679. XMetrics
  1680. X/2815
  1681. X[1
  1682. X22]
  1683. Xput
  1684. XCharStrings
  1685. X/2816
  1686. X<C534
  1687. X4549
  1688. XC634
  1689. X4649
  1690. XD234
  1691. X5249
  1692. XD334
  1693. X5349
  1694. XC234
  1695. X5634
  1696. XC249
  1697. X4949
  1698. XCF49
  1699. X5649
  1700. X>
  1701. Xput
  1702. XMetrics
  1703. X/2816
  1704. X[0
  1705. X24]
  1706. Xput
  1707. XCharStrings
  1708. X/2817
  1709. X<C534
  1710. X4549
  1711. XC634
  1712. X4649
  1713. XC234
  1714. X4E34
  1715. X5135
  1716. X5236
  1717. X5338
  1718. X533B
  1719. X523D
  1720. X513E
  1721. X4E3F
  1722. X463F
  1723. XCE34
  1724. X5035
  1725. X5136
  1726. X5238
  1727. X523B
  1728. X513D
  1729. X503E
  1730. X4E3F
  1731. XC249
  1732. X4949
  1733. X>
  1734. Xput
  1735. XMetrics
  1736. X/2817
  1737. X[1
  1738. X22]
  1739. Xput
  1740. XCharStrings
  1741. X/2818
  1742. X<D137
  1743. X523A
  1744. X5234
  1745. X5137
  1746. X4F35
  1747. X4C34
  1748. X4A34
  1749. X4735
  1750. X4537
  1751. X4439
  1752. X433C
  1753. X4341
  1754. X4444
  1755. X4546
  1756. X4748
  1757. X4A49
  1758. X4C49
  1759. X4F48
  1760. X5146
  1761. X5244
  1762. XCA34
  1763. X4835
  1764. X4637
  1765. X4539
  1766. X443C
  1767. X4441
  1768. X4544
  1769. X4646
  1770. X4848
  1771. X4A49
  1772. X>
  1773. Xput
  1774. XMetrics
  1775. X/2818
  1776. X[1
  1777. X21]
  1778. Xput
  1779. XCharStrings
  1780. X/2819
  1781. X<C934
  1782. X4949
  1783. XCA34
  1784. X4A49
  1785. XC334
  1786. X423A
  1787. X4234
  1788. X5134
  1789. X513A
  1790. X5034
  1791. XC649
  1792. X4D49
  1793. X>
  1794. Xput
  1795. XMetrics
  1796. X/2819
  1797. X[3
  1798. X19]
  1799. Xput
  1800. XCharStrings
  1801. X/2820
  1802. X<C334
  1803. X4A44
  1804. XC434
  1805. X4B44
  1806. XD234
  1807. X4B44
  1808. X4947
  1809. X4848
  1810. X4649
  1811. X4549
  1812. X4448
  1813. X4447
  1814. X4546
  1815. X4647
  1816. X4548
  1817. XC134
  1818. X4734
  1819. XCE34
  1820. X5434
  1821. X>
  1822. Xput
  1823. XMetrics
  1824. X/2820
  1825. X[2
  1826. X21]
  1827. Xput
  1828. XCharStrings
  1829. X/2821
  1830. X<CC34
  1831. X4C49
  1832. XCD34
  1833. X4D49
  1834. XC934
  1835. X5034
  1836. XCA37
  1837. X4638
  1838. X443A
  1839. X433D
  1840. X4340
  1841. X4443
  1842. X4645
  1843. X4A46
  1844. X4F46
  1845. X5345
  1846. X5543
  1847. X5640
  1848. X563D
  1849. X553A
  1850. X5338
  1851. X4F37
  1852. X4A37
  1853. XCA37
  1854. X4738
  1855. X453A
  1856. X443D
  1857. X4440
  1858. X4543
  1859. X4745
  1860. X4A46
  1861. XCF46
  1862. X5245
  1863. X5443
  1864. X5540
  1865. X553D
  1866. X543A
  1867. X5238
  1868. X4F37
  1869. XC949
  1870. X5049
  1871. X>
  1872. Xput
  1873. XMetrics
  1874. X/2821
  1875. X[0
  1876. X25]
  1877. Xput
  1878. XCharStrings
  1879. X/2822
  1880. X<C334
  1881. X5049
  1882. XC434
  1883. X5149
  1884. XD134
  1885. X4349
  1886. XC134
  1887. X4734
  1888. XCD34
  1889. X5334
  1890. XC149
  1891. X4749
  1892. XCD49
  1893. X5349
  1894. X>
  1895. Xput
  1896. XMetrics
  1897. X/2822
  1898. X[2
  1899. X20]
  1900. Xput
  1901. XCharStrings
  1902. X/2823
  1903. X<C534
  1904. X4549
  1905. XC634
  1906. X4649
  1907. XD234
  1908. X5249
  1909. XD334
  1910. X5349
  1911. XC234
  1912. X4934
  1913. XCF34
  1914. X5634
  1915. XC249
  1916. X5649
  1917. XD549
  1918. X5650
  1919. XD649
  1920. X5650
  1921. X>
  1922. Xput
  1923. XMetrics
  1924. X/2823
  1925. X[0
  1926. X24]
  1927. Xput
  1928. XCharStrings
  1929. X/2824
  1930. X<C534
  1931. X453F
  1932. X4641
  1933. X4942
  1934. X4C42
  1935. X4F41
  1936. X513F
  1937. XC634
  1938. X463F
  1939. X4741
  1940. X4942
  1941. XD134
  1942. X5149
  1943. XD234
  1944. X5249
  1945. XC234
  1946. X4934
  1947. XCE34
  1948. X5534
  1949. XCE49
  1950. X5549
  1951. X>
  1952. Xput
  1953. XMetrics
  1954. X/2824
  1955. X[0
  1956. X23]
  1957. Xput
  1958. XCharStrings
  1959. X/2825
  1960. X<C534
  1961. X4549
  1962. XC634
  1963. X4649
  1964. XD034
  1965. X5049
  1966. XD134
  1967. X5149
  1968. XDB34
  1969. X5B49
  1970. XDC34
  1971. X5C49
  1972. XC234
  1973. X4934
  1974. XCD34
  1975. X5434
  1976. XD834
  1977. X5F34
  1978. XC249
  1979. X5F49
  1980. X>
  1981. Xput
  1982. XMetrics
  1983. X/2825
  1984. X[-2
  1985. X33]
  1986. Xput
  1987. XCharStrings
  1988. X/2826
  1989. X<C534
  1990. X4549
  1991. XC634
  1992. X4649
  1993. XD034
  1994. X5049
  1995. XD134
  1996. X5149
  1997. XDB34
  1998. X5B49
  1999. XDC34
  2000. X5C49
  2001. XC234
  2002. X4934
  2003. XCD34
  2004. X5434
  2005. XD834
  2006. X5F34
  2007. XC249
  2008. X5F49
  2009. XDE49
  2010. X5F50
  2011. XDF49
  2012. X5F50
  2013. X>
  2014. Xput
  2015. XMetrics
  2016. X/2826
  2017. X[-2
  2018. X33]
  2019. Xput
  2020. XCharStrings
  2021. X/2827
  2022. X<CA34
  2023. X4A49
  2024. XCB34
  2025. X4B49
  2026. XC334
  2027. X423A
  2028. X4234
  2029. X4E34
  2030. XCB3E
  2031. X523E
  2032. X553F
  2033. X5640
  2034. X5742
  2035. X5745
  2036. X5647
  2037. X5548
  2038. X5249
  2039. X4749
  2040. XD23E
  2041. X543F
  2042. X5540
  2043. X5642
  2044. X5645
  2045. X5547
  2046. X5448
  2047. X5249
  2048. X>
  2049. Xput
  2050. XMetrics
  2051. X/2827
  2052. X[0
  2053. X26]
  2054. Xput
  2055. XCharStrings
  2056. X/2828
  2057. X<C534
  2058. X4549
  2059. XC634
  2060. X4649
  2061. XC234
  2062. X4934
  2063. XC63E
  2064. X4D3E
  2065. X503F
  2066. X5140
  2067. X5242
  2068. X5245
  2069. X5147
  2070. X5048
  2071. X4D49
  2072. X4249
  2073. XCD3E
  2074. X4F3F
  2075. X5040
  2076. X5142
  2077. X5145
  2078. X5047
  2079. X4F48
  2080. X4D49
  2081. XD834
  2082. X5849
  2083. XD934
  2084. X5949
  2085. XD534
  2086. X5C34
  2087. XD549
  2088. X5C49
  2089. X>
  2090. Xput
  2091. XMetrics
  2092. X/2828
  2093. X[-2
  2094. X30]
  2095. Xput
  2096. XCharStrings
  2097. X/2829
  2098. X<C534
  2099. X4549
  2100. XC634
  2101. X4649
  2102. XC234
  2103. X4934
  2104. XC63E
  2105. X4D3E
  2106. X503F
  2107. X5140
  2108. X5242
  2109. X5245
  2110. X5147
  2111. X5048
  2112. X4D49
  2113. X4249
  2114. XCD3E
  2115. X4F3F
  2116. X5040
  2117. X5142
  2118. X5145
  2119. X5047
  2120. X4F48
  2121. X4D49
  2122. X>
  2123. Xput
  2124. XMetrics
  2125. X/2829
  2126. X[2
  2127. X21]
  2128. Xput
  2129. XCharStrings
  2130. X/2830
  2131. X<C437
  2132. X4334
  2133. X433A
  2134. X4437
  2135. X4635
  2136. X4934
  2137. X4B34
  2138. X4E35
  2139. X5037
  2140. X5139
  2141. X523C
  2142. X5241
  2143. X5144
  2144. X5046
  2145. X4E48
  2146. X4B49
  2147. X4849
  2148. X4548
  2149. X4447
  2150. X4345
  2151. X4344
  2152. X4443
  2153. X4544
  2154. X4445
  2155. XCB34
  2156. X4D35
  2157. X4F37
  2158. X5039
  2159. X513C
  2160. X5141
  2161. X5044
  2162. X4F46
  2163. X4D48
  2164. X4B49
  2165. XC83E
  2166. X513E
  2167. X>
  2168. Xput
  2169. XMetrics
  2170. X/2830
  2171. X[2
  2172. X21]
  2173. Xput
  2174. XCharStrings
  2175. X/2831
  2176. X<C534
  2177. X4549
  2178. XC634
  2179. X4649
  2180. XC234
  2181. X4934
  2182. XC249
  2183. X4949
  2184. XD334
  2185. X5035
  2186. X4E37
  2187. X4D39
  2188. X4C3D
  2189. X4C40
  2190. X4D44
  2191. X4E46
  2192. X5048
  2193. X5349
  2194. X5549
  2195. X5848
  2196. X5A46
  2197. X5B44
  2198. X5C40
  2199. X5C3D
  2200. X5B39
  2201. X5A37
  2202. X5835
  2203. X5534
  2204. X5334
  2205. XD334
  2206. X5135
  2207. X4F37
  2208. X4E39
  2209. X4D3D
  2210. X4D40
  2211. X4E44
  2212. X4F46
  2213. X5148
  2214. X5349
  2215. XD549
  2216. X5748
  2217. X5946
  2218. X5A44
  2219. X5B40
  2220. X5B3D
  2221. X5A39
  2222. X5937
  2223. X5735
  2224. X5534
  2225. XC63E
  2226. X4C3E
  2227. X>
  2228. Xput
  2229. XMetrics
  2230. X/2831
  2231. X[-2
  2232. X31]
  2233. Xput
  2234. XCharStrings
  2235. X/2832
  2236. X<D034
  2237. X5049
  2238. XD134
  2239. X5149
  2240. XD434
  2241. X4834
  2242. X4535
  2243. X4436
  2244. X4338
  2245. X433A
  2246. X443C
  2247. X453D
  2248. X483E
  2249. X503E
  2250. XC834
  2251. X4635
  2252. X4536
  2253. X4438
  2254. X443A
  2255. X453C
  2256. X463D
  2257. X483E
  2258. XCB3E
  2259. X493F
  2260. X4840
  2261. X4547
  2262. X4448
  2263. X4348
  2264. X4247
  2265. XC93F
  2266. X4841
  2267. X4648
  2268. X4549
  2269. X4349
  2270. X4247
  2271. X4246
  2272. XCD49
  2273. X5449
  2274. X>
  2275. Xput
  2276. XMetrics
  2277. X/2832
  2278. X[1
  2279. X22]
  2280. Xput
  2281. END_OF_FILE
  2282. if test 11645 -ne `wc -c <'postscript/fonts/Times/russian.r'`; then
  2283.     echo shar: \"'postscript/fonts/Times/russian.r'\" unpacked with wrong size!
  2284. fi
  2285. # end of 'postscript/fonts/Times/russian.r'
  2286. fi
  2287. if test -f 'source/image.c' -a "${1}" != "-c" ; then 
  2288.   echo shar: Will not clobber existing file \"'source/image.c'\"
  2289. else
  2290. echo shar: Extracting \"'source/image.c'\" \(11874 characters\)
  2291. sed "s/^X//" >'source/image.c' <<'END_OF_FILE'
  2292. X/*
  2293. X * Copyright (C) Rutherford Appleton Laboratory 1987
  2294. X * 
  2295. X * This source may be copied, distributed, altered or used, but not sold for profit
  2296. X * or incorporated into a product except under licence from the author.
  2297. X * It is not in the public domain.
  2298. X * This notice should remain in the source unaltered, and any changes to the source
  2299. X * made by persons other than the author should be marked as such.
  2300. X * 
  2301. X *    Crispin Goswell @ Rutherford Appleton Laboratory caag@uk.ac.rl.vd
  2302. X */
  2303. X#include "main.h"
  2304. X#include "graphics.h"
  2305. X
  2306. Xstatic int RealImage ();
  2307. Xstatic int RealImageMask ();
  2308. X
  2309. Xstruct hardware *ScaleBitmap ();
  2310. X
  2311. XInitImage ()
  2312. X {
  2313. X     InstallOp ("realimage",        RealImage,    5, 0, 0, 0, Integer, Integer, Integer, Array, String);
  2314. X     InstallOp ("realimagemask",    RealImageMask,    5, 0, 0, 0, Integer, Integer, Boolean, Array, String);
  2315. X }
  2316. X
  2317. Xstatic int RealImageMask (width, height, invert, mat, string) Object width, height, invert, mat, string;
  2318. X {
  2319. X     Matrix m, m2;
  2320. X     Vector origin, right, bottom;
  2321. X     int w = BodyInteger (width), h = BodyInteger (height);
  2322. X     int inv = BodyBoolean (invert), l = lengthString (string);
  2323. X     int dwidth, dheight;
  2324. X     unsigned char *s = BodyString (string);
  2325. X     
  2326. X      VOID GSave ();
  2327. X    if (!ExtractMatrix (&m, mat))
  2328. X         return Error (PTypeCheck);
  2329. X     if (l != (w + 7) / 8 * h || w < 0 || h < 0)
  2330. X         return Error (PRangeCheck);
  2331. X     if (w == 0 || h == 0)
  2332. X         return TRUE;
  2333. X     m = MatInvert (m);
  2334. X     gstate->CTM = m2 = MatMult (m, gstate->CTM);
  2335. X     origin = Transform (NewVector (0.0, 0.0, 1.0), m2);
  2336. X     right  = Transform (NewVector ((float) w, 0.0, 1.0), m2);
  2337. X     bottom = Transform (NewVector (0.0, (float) h, 1.0), m2);
  2338. 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);
  2339. X     fprintf (stderr, "matrix == [%g %g %g %g %g %g]\n", m2.A, m2.B, m2.C, m2.D, m2.tx, m2.ty);*/
  2340. X     
  2341. X     dwidth = right.vx - origin.vx; dheight = bottom.vy - origin.vy;
  2342. X     
  2343. X     if (origin.vx == bottom.vx && origin.vy == right.vy &&
  2344. X             dwidth > 0 && dheight > 0/* && dwidth >= w && dheight >= h*/)
  2345. X      {        /* simple orientation */
  2346. X          struct hardware *from, *to;
  2347. X          
  2348. X          from = HardwareFromString (s, w, h);
  2349. X          if (!inv)
  2350. X              BitBlt (from, from,
  2351. X                  NewDevicePoint (0, 0), NewDevicePoint (0, 0),
  2352. X                  HardwareExtent (from), ROP_NOTSOURCE);
  2353. X         if (dwidth != w || dheight != h)
  2354. X          {
  2355. X              to = ScaleBitmap (from, (float) dwidth / w, (float) dheight / h);
  2356. X              DestroyHardware (from);
  2357. X           }
  2358. X          else
  2359. X              to = from;
  2360. X          
  2361. X          Paint (to, gstate->device->dev,
  2362. X              NewDevicePoint (0, 0),
  2363. X              NewDevicePoint ((int) origin.vx, (int) origin.vy),
  2364. X              NewDevicePoint (dwidth, dheight),
  2365. X              gstate->colour);
  2366. X          DestroyHardware (to);
  2367. X      }
  2368. X     else
  2369. X         DrawBitmap (s, w, h, inv);
  2370. X    VOID GRestore ();
  2371. X    
  2372. X    return TRUE;
  2373. X }
  2374. X
  2375. XDrawBitmap (s, width, height, inv) unsigned char *s; int width, height, inv;
  2376. X {
  2377. X     int w, h;
  2378. X     
  2379. X     VOID PNewPath ();
  2380. X     
  2381. X     for (h = 0; h < height; h++)
  2382. X         for (w = 0; w < width; w++)
  2383. X              if (((s [h * (width >> 3) + (w >> 3)] & (1 << (7 - (w & 0x7)))) != 0) == inv)
  2384. X                    FillUnitBox (w, h);
  2385. X }
  2386. X
  2387. Xvoid Tile (t, h) struct hardware *t, *h;
  2388. X {
  2389. X     DevicePoint xt, xh;
  2390. X     int i, sw, sh;
  2391. X     
  2392. X     xt = HardwareExtent (t);
  2393. X     xh = HardwareExtent (h);
  2394. X     
  2395. X      BitBlt (t, h, NewDevicePoint (0, 0), NewDevicePoint (0, 0), xt, ROP_SOURCE);
  2396. X     
  2397. X     sw = xt.dx;
  2398. X    for (i = sw;;)
  2399. X      {
  2400. X         BitBlt (h, h, NewDevicePoint (0, 0), NewDevicePoint (i, 0), NewDevicePoint (sw, xt.dy), ROP_SOURCE);
  2401. X         if (i >= xh.dx)
  2402. X             break;
  2403. X         i += sw;
  2404. X         sw <<= 1;
  2405. X      }
  2406. X     
  2407. X     sh = xt.dy;
  2408. X    for (i = sh;;)
  2409. X      {
  2410. X         BitBlt (h, h, NewDevicePoint (0, 0), NewDevicePoint (0, i), NewDevicePoint (xh.dx, sh), ROP_SOURCE);
  2411. X         if (i >= xh.dy)
  2412. X             break;
  2413. X         i += sh;
  2414. X         sh <<= 1;
  2415. X      }
  2416. X }
  2417. X
  2418. Xvoid FillMask (h, mask, width) struct hardware *h; char mask; int width;
  2419. X {
  2420. X     struct hardware *m;
  2421. X     
  2422. X     mask <<= 8 - width;
  2423. X     
  2424. X     m = HardwareFromString (&mask, width, 1);
  2425. X     
  2426. X     Tile (m, h);
  2427. X     
  2428. X     DestroyHardware (m);
  2429. X }
  2430. X
  2431. Xstruct hardware *UnpaddedHardwareFromString (s, w, h) unsigned char *s; int w, h;
  2432. X {
  2433. X     struct hardware *thin;
  2434. X     struct hardware *res;
  2435. X     int i;
  2436. X     
  2437. X     if (w & 7 == 0)
  2438. X         return HardwareFromString (s, w, h);
  2439. X     
  2440. X     thin = HardwareFromString (s, w * h, 1);
  2441. X     res = NewBitmapHardware (w, h);
  2442. X     
  2443. X     for (i = 0; i < h; i++)
  2444. X         BitBlt (thin, res, NewDevicePoint (i * w, 0), NewDevicePoint (0, i), NewDevicePoint (w, 1), ROP_SOURCE);
  2445. X     
  2446. X     DestroyHardware (thin);
  2447. X     return res;
  2448. X }
  2449. X
  2450. Xstatic void VerticalReverseImage (h) struct hardware *h;
  2451. X {
  2452. X     DevicePoint ex;
  2453. X     int i, n;
  2454. X     
  2455. X     ex = HardwareExtent (h);
  2456. X     
  2457. X     n = ex.dy;
  2458. X     
  2459. X     for (i = 0; i < n / 2; i++)
  2460. X         BitBlt (h, h, NewDevicePoint (0, i), NewDevicePoint (0, n - i - 1), NewDevicePoint (ex.dx, 1), ROP_XOR),
  2461. X         BitBlt (h, h, NewDevicePoint (0, n - i - 1), NewDevicePoint (0, i), NewDevicePoint (ex.dx, 1), ROP_XOR),
  2462. X         BitBlt (h, h, NewDevicePoint (0, i), NewDevicePoint (0, n - i - 1), NewDevicePoint (ex.dx, 1), ROP_XOR);
  2463. X }
  2464. X
  2465. Xstatic int RealImage (width, height, depth, mat, string) Object width, height, depth, mat, string;
  2466. X {
  2467. X     Matrix m, m2;
  2468. X     Vector origin, right, bottom;
  2469. X     int w = BodyInteger (width), h = BodyInteger (height);
  2470. X     int vrev = 0, dep = BodyInteger (depth), l = lengthString (string);
  2471. X     int dwidth, dheight;
  2472. X     unsigned char *s = BodyString (string);
  2473. X     
  2474. X       VOID GSave ();
  2475. X    if (!ExtractMatrix (&m, mat))
  2476. X         return Error (PTypeCheck);
  2477. X     if (l != (w * dep + 7) / 8 * h || w < 0 || h < 0)
  2478. X         return Error (PRangeCheck);
  2479. X     if (w == 0 || h == 0)
  2480. X         return TRUE;
  2481. X      m = MatInvert (m);
  2482. X     gstate->CTM = m2 = MatMult (m, gstate->CTM);
  2483. X     origin = Transform (NewVector (0.0, 0.0, 1.0), m2);
  2484. X     right  = Transform (NewVector ((float) w, 0.0, 1.0), m2);
  2485. X     bottom = Transform (NewVector (0.0, (float) h, 1.0), m2);
  2486. X     
  2487. X    dwidth = right.vx - origin.vx; dheight = bottom.vy - origin.vy;
  2488. X    
  2489. X    if (dheight < 0)
  2490. X        origin.vy += dheight, right.vy += dheight, ++vrev, dheight = -dheight;
  2491. X    
  2492. X    /* fprintf (stderr, "origin.vx = %g, origin.vy = %g, bottom.vx = %g, right.vy = %g, dwidth = %d, dheight = %d, w = %d, h = %d\n",
  2493. X            origin.vx, origin.vy, bottom.vx, right.vy, dwidth, dheight, w, h); */
  2494. X     
  2495. X     if (dep != 16 && (int) origin.vx == (int) bottom.vx && (int) origin.vy == (int) right.vy &&
  2496. X             dwidth > 0 && dheight > 0/* && dwidth >= w && dheight >= h */)
  2497. X      {        /* simple orientation */
  2498. X          struct hardware *from , *to;
  2499. X          
  2500. X          if (dep == 1)
  2501. X           {
  2502. X              from = HardwareFromString (s, w, h);
  2503. X              if (vrev)
  2504. X                  VerticalReverseImage (from);
  2505. X             if (dwidth != w || dheight != h)
  2506. X              {
  2507. X                  to = ScaleBitmap (from, (float) dwidth / w, (float) dheight / h);
  2508. X                  DestroyHardware (from);
  2509. X               }
  2510. X              else
  2511. X                  to = from;
  2512. X              
  2513. X            Paint (to, gstate->device->dev,
  2514. X                NewDevicePoint (0, 0), NewDevicePoint ((int) origin.vx, (int) origin.vy),
  2515. X                NewDevicePoint (dwidth, dheight),
  2516. X                NewGray (1.0));
  2517. X            BitBlt (to, to,
  2518. X                NewDevicePoint (0, 0), NewDevicePoint (0, 0),
  2519. X                NewDevicePoint (dwidth, dheight),
  2520. X                ROP_NOTSOURCE);
  2521. X            Paint (to, gstate->device->dev,
  2522. X                NewDevicePoint (0, 0), NewDevicePoint ((int) origin.vx, (int) origin.vy),
  2523. X                NewDevicePoint (dwidth, dheight),
  2524. X                NewGray (0.0));
  2525. X              DestroyHardware (to);
  2526. X           }
  2527. X          else
  2528. X           {
  2529. X              struct hardware *mask, *new, *temp;
  2530. X               int i, j;
  2531. X               
  2532. X               from = HardwareFromString (s, w * dep, h);
  2533. X               if (vrev)
  2534. X                  VerticalReverseImage (from);
  2535. X               new = HardwareFromString (s, w, h);
  2536. X              mask = NewBitmapHardware (w * dep, h);
  2537. X               temp = NewBitmapHardware (w * dep, h);
  2538. X               
  2539. X               for (i = 0; i < (1<<dep); i++)
  2540. X                {
  2541. X                    FillMask (mask, i, dep);
  2542. X                   
  2543. X                   BitBlt (from, mask, NewDevicePoint (0, 0), NewDevicePoint (0, 0), HardwareExtent (from), ROP_NXOR);
  2544. X                   BitBlt (NULL, temp, NewDevicePoint (0, 0), NewDevicePoint (0, 0), HardwareExtent (temp), ROP_TRUE);
  2545. X                    for (j = 0; j < dep; j++)
  2546. X                        BitBlt (mask, temp, NewDevicePoint (j, 0), NewDevicePoint (0, 0), HardwareExtent (mask), ROP_AND);
  2547. X                    for (j = 0; j < w; j++)
  2548. X                        BitBlt (temp, new, NewDevicePoint (j * dep, 0), NewDevicePoint (j, 0), NewDevicePoint (1, h), ROP_SOURCE);
  2549. X                    to = ScaleBitmap (new, (float) dwidth / w, (float) dheight / h);
  2550. X                   Paint (to, gstate->device->dev,
  2551. X                      NewDevicePoint (0, 0),
  2552. X                      NewDevicePoint ((int) origin.vx, (int) origin.vy),
  2553. X                      NewDevicePoint (dwidth, dheight),
  2554. X                      NewGray ((float) i / ((1 << dep) - 1)));
  2555. X                  DestroyHardware (to);
  2556. X               }
  2557. X              DestroyHardware (from);
  2558. X              DestroyHardware (mask);
  2559. X              DestroyHardware (temp);
  2560. X              DestroyHardware (new);
  2561. X           }
  2562. X      }
  2563. X     else
  2564. X      {
  2565. X          if (vrev)
  2566. X              origin.vy += dheight, right.vy += dheight, dheight = -dheight;
  2567. X         DrawColourBitmap (s, w, h, dep);
  2568. X      }
  2569. X    VOID GRestore ();
  2570. X    
  2571. X    return TRUE;
  2572. X }
  2573. X
  2574. Xstatic log2[] = { 0, 0, 1, 0, 2, 0, 0, 0, 3 };
  2575. Xstatic mask[] = { 0, 0x80, 0xc0, 0, 0xf0, 0, 0, 0, 0xff };
  2576. X
  2577. XDrawColourBitmap (s, width, height, depth) unsigned char *s; int width, height, depth;
  2578. X {
  2579. X     int w, h, c;
  2580. X     
  2581. X     VOID PNewPath ();
  2582. X     
  2583. X     if (depth == 16)
  2584. X         for (h = 0; h < height; h++)
  2585. X             for (w = 0; w < width; w++)
  2586. X               {
  2587. X                   gstate->colour = NewColour (0.0, 0.0, (float) ((s [h * (width << 1) + (w << 1)] << 8) |
  2588. X                                       s [h * (width << 1) + (w << 1) + 1]) / (1 << 16));
  2589. X                   FillUnitBox (w, h);
  2590. X               }
  2591. X     else
  2592. X         for (c = 0; c < 1 << depth; c++)
  2593. X          {
  2594. X               gstate->colour = NewColour (0.0, 0.0, (float) c / ((1 << depth) - 1));
  2595. X            for (h = 0; h < height; h++)
  2596. X                 for (w = 0; w < width; w++)
  2597. X                  {
  2598. X                      int foo = 3 - log2 [depth];
  2599. X                      int byte = s [h * (width >> foo) + (w >> foo)];
  2600. X                      int shift = (w & ((1 << foo) - 1)) * depth;
  2601. X                      if (c == ((byte & (mask [depth] >> shift)) >> (8 - (shift + depth))))
  2602. X                           FillUnitBox (w, h);
  2603. X                   }
  2604. X           }
  2605. X }
  2606. X
  2607. XFillUnitBox (w, h) int w, h;
  2608. X {
  2609. X     VOID MoveTo (gstate->path, ExtToInt (NewPoint ((float ) w, (float ) h)));
  2610. X    VOID LineTo (gstate->path, ExtToInt (NewPoint ((float ) w+1, (float ) h)));
  2611. X    VOID LineTo (gstate->path, ExtToInt (NewPoint ((float ) w+1, (float ) h+1)));
  2612. X    VOID LineTo (gstate->path, ExtToInt (NewPoint ((float ) w, (float ) h+1)));
  2613. X    VOID ClosePath (gstate->path);
  2614. X    VOID Fill ();
  2615. X  }
  2616. X
  2617. Xstruct hardware *ScaleBitmap (from, xscale, yscale) struct hardware *from; float xscale, yscale;
  2618. X {              
  2619. X    struct hardware *middle, *middle2, *high, *high2;
  2620. X    int i, w, h, dwidth, dheight, ixscale, iyscale;
  2621. X    DevicePoint extent;
  2622. X    
  2623. X    extent = HardwareExtent (from);
  2624. X    w = extent.dx; h = extent.dy;
  2625. X    dwidth = w * xscale + 0.5; dheight = h * yscale + 0.5;
  2626. X    
  2627. X    if (dwidth > w)
  2628. X     {
  2629. X        middle = NewBitmapHardware (dwidth, h);
  2630. X        for (i = 0; i < w; i++)
  2631. X            BitBlt (from,     middle,
  2632. X                NewDevicePoint (i, 0), NewDevicePoint ((int) (i*xscale), 0),
  2633. X                NewDevicePoint (1, h),
  2634. X                ROP_OR);
  2635. X        middle2 = NewBitmapHardware (dwidth, h);
  2636. X        ixscale = (int) ((float) dwidth / w + 0.5); 
  2637. X        for (i = 0; i < ixscale + 1; i++)
  2638. X            BitBlt (middle, middle2,
  2639. X                NewDevicePoint (0, 0), NewDevicePoint (i, 0),
  2640. X                NewDevicePoint (dwidth - ixscale + 1, h),
  2641. X                ROP_OR);
  2642. X        DestroyHardware (middle);
  2643. X     }
  2644. X    else
  2645. X     {
  2646. X         middle2 = NewBitmapHardware (dwidth, h);
  2647. X        for (i = 0; i < dwidth; i++)
  2648. X            BitBlt (from,     middle2,
  2649. X                NewDevicePoint ((int) (i/xscale), 0), NewDevicePoint (i, 0),
  2650. X                NewDevicePoint (1, h),
  2651. X                ROP_OR);
  2652. X     }
  2653. X    
  2654. X    if (dheight > h)
  2655. X     {
  2656. X        high = NewBitmapHardware (dwidth, dheight);
  2657. X        for (i = 0; i < h; i++)
  2658. X            BitBlt (middle2, high,
  2659. X                NewDevicePoint (0, i), NewDevicePoint (0, (int) (i*yscale)),
  2660. X                NewDevicePoint (dwidth, 1),
  2661. X                ROP_OR);
  2662. X        DestroyHardware (middle2);
  2663. X        
  2664. X        high2 = NewBitmapHardware (dwidth, dheight);
  2665. X        iyscale = (int) ((float) dheight / h + 0.5);
  2666. X        for (i = 0; i < iyscale + 1; i++)
  2667. X            BitBlt (high,     high2, 
  2668. X                NewDevicePoint (0, 0), NewDevicePoint (0, i),
  2669. X                NewDevicePoint (dwidth, dheight - iyscale + 1),
  2670. X                ROP_OR);
  2671. X        DestroyHardware (high);
  2672. X     }
  2673. X    else
  2674. X     {
  2675. X        high2 = NewBitmapHardware (dwidth, dheight);
  2676. X        for (i = 0; i < dheight; i++)
  2677. X            BitBlt (middle2, high2,
  2678. X                NewDevicePoint (0, (int) (i/yscale)), NewDevicePoint (0, i),
  2679. X                NewDevicePoint (dwidth, 1),
  2680. X                ROP_OR);
  2681. X     }
  2682. X     return high2;
  2683. X }
  2684. END_OF_FILE
  2685. if test 11874 -ne `wc -c <'source/image.c'`; then
  2686.     echo shar: \"'source/image.c'\" unpacked with wrong size!
  2687. fi
  2688. # end of 'source/image.c'
  2689. fi
  2690. if test -f 'source/state.c' -a "${1}" != "-c" ; then 
  2691.   echo shar: Will not clobber existing file \"'source/state.c'\"
  2692. else
  2693. echo shar: Extracting \"'source/state.c'\" \(10995 characters\)
  2694. sed "s/^X//" >'source/state.c' <<'END_OF_FILE'
  2695. X/*
  2696. X * Copyright (C) Rutherford Appleton Laboratory 1987
  2697. X * 
  2698. X * This source may be copied, distributed, altered or used, but not sold for profit
  2699. X * or incorporated into a product except under licence from the author.
  2700. X * It is not in the public domain.
  2701. X * This notice should remain in the source unaltered, and any changes to the source
  2702. X * made by persons other than the author should be marked as such.
  2703. X * 
  2704. X *    Crispin Goswell @ Rutherford Appleton Laboratory caag@uk.ac.rl.vd
  2705. X */
  2706. X#include "main.h"
  2707. X#include "graphics.h"
  2708. X
  2709. Xextern int InitGraphics ();
  2710. Xint ErasePage ();
  2711. Xstatic int CopyPage ();
  2712. X
  2713. Xstatic int SetLineWidth ();
  2714. Xstatic int GetLineWidth ();
  2715. Xstatic int SetLineCap ();
  2716. Xstatic int GetLineCap ();
  2717. Xstatic int SetLineJoin ();
  2718. Xstatic int GetLineJoin ();
  2719. Xstatic int SetDash ();
  2720. Xstatic int GetDash ();
  2721. Xstatic int SetFlat ();
  2722. Xstatic int GetFlat ();
  2723. Xstatic int SetMiterLimit ();
  2724. Xstatic int GetMiterLimit ();
  2725. Xstatic int SetHSB ();
  2726. Xstatic int GetHSB ();
  2727. Xstatic int SetRGB ();
  2728. Xstatic int GetRGB ();
  2729. X
  2730. Xstatic int PSetRealScreen ();
  2731. Xstatic int PBuildScreen ();
  2732. Xstatic int PScreenSize ();
  2733. Xstatic int GetScreen ();
  2734. X
  2735. Xstatic int PSetRealTransfer ();
  2736. Xstatic int PGetTransfer ();
  2737. Xstatic int PTransferSize ();
  2738. X
  2739. Xstatic int SetGray ();
  2740. Xstatic int GetGray ();
  2741. X
  2742. Xstatic int SetFillMethod ();
  2743. Xstatic int GetFillMethod ();
  2744. Xstatic int SetStrokeMethod ();
  2745. Xstatic int GetStrokeMethod ();
  2746. X
  2747. Xint fill_method = 1, stroke_method = 0;
  2748. X
  2749. XInitState ()
  2750. X {
  2751. X      InstallOp ("erasepage",        ErasePage,    0, 0, 0, 0);
  2752. X     InstallOp ("copypage",        CopyPage,    0, 0, 0, 0);
  2753. X    InstallOp ("setlinewidth",    SetLineWidth,    1, 0, 0, 0, Float);
  2754. X     InstallOp ("currentlinewidth",    GetLineWidth,    0, 1, 0, 0);
  2755. X     InstallOp ("setlinecap",    SetLineCap,    1, 0, 0, 0, Integer);
  2756. X     InstallOp ("currentlinecap",    GetLineCap,    0, 1, 0, 0);
  2757. X     InstallOp ("setlinejoin",    SetLineJoin,    1, 0, 0, 0, Integer);
  2758. X     InstallOp ("currentlinejoin",    GetLineJoin,    0, 1, 0, 0);
  2759. X     InstallOp ("setdash",        SetDash,    2, 0, 0, 0, Array, Float);
  2760. X     InstallOp ("currentdash",    GetDash,    0, 2, 0, 2);
  2761. X     InstallOp ("setflat",        SetFlat,    1, 0, 0, 0, Float);
  2762. X     InstallOp ("currentflat",    GetFlat,    0, 1, 0, 0);
  2763. X     InstallOp ("setmiterlimit",    SetMiterLimit,    1, 0, 0, 0, Float);
  2764. X     InstallOp ("currentmiterlimit",    GetMiterLimit,    0, 1, 0, 0);
  2765. X     
  2766. X     InstallOp ("setgray",        SetGray,    1, 0, 0, 0, Float);
  2767. X     InstallOp ("currentgray",    GetGray,    0, 1, 0, 0);
  2768. X     InstallOp ("sethsbcolor",    SetHSB,        3, 0, 0, 0, Float, Float, Float);
  2769. X     InstallOp ("currenthsbcolor",    GetHSB,        0, 3, 0, 0);
  2770. X     InstallOp ("setrgbcolor",    SetRGB,        3, 0, 0, 0, Float, Float, Float);
  2771. X     InstallOp ("currentrgbcolor",    GetRGB,        0, 3, 0, 0);
  2772. X     
  2773. X      InstallOp ("screensize",    PScreenSize,    2, 1, 0, 0, Float, Float);
  2774. X      InstallOp ("buildscreen",    PBuildScreen,    2, 2, 0, 0, Float, Float);
  2775. X      InstallOp ("setrealscreen",    PSetRealScreen,    4, 0, 0, 0, Float, Float, Array, Array);
  2776. X    InstallOp ("currentscreen",    GetScreen,    0, 3, 0, 0);
  2777. X    
  2778. X     InstallOp ("setrealtransfer",    PSetRealTransfer,    2, 0, 0, 0, Array, Array);
  2779. X     InstallOp ("currenttransfer",    PGetTransfer,    0, 1, 0, 0);
  2780. X     InstallOp ("transfersize",    PTransferSize,    0, 1, 0, 0);
  2781. X     
  2782. X     InstallOp ("setfillmethod",    SetFillMethod,    1, 0, 0, 0, Integer);
  2783. X     InstallOp ("currentfillmethod",    GetFillMethod,    0, 1, 0, 0);
  2784. X     InstallOp ("setstrokemethod",    SetStrokeMethod,    1, 0, 0, 0, Integer);
  2785. X     InstallOp ("currentstrokemethod",GetStrokeMethod,    0, 1, 0, 0);
  2786. X     InstallOp ("initgraphics",    InitGraphics,    0, 0, 0, 0);
  2787. X
  2788. X    VOID InitGraphics ();
  2789. X }
  2790. X
  2791. Xint InitGraphics ()
  2792. X {
  2793. X     VOID PInitMatrix ();        /* initmatrix */
  2794. X     VOID InitClip ();        /* initclip */
  2795. X     VOID PNewPath ();        /* newpath */
  2796. X     
  2797. X     gstate->colour = NewColour (0.0, 0.0, 0.0);    /* 0 setgray */
  2798. X     gstate->line_width = 1;        /* 1 setlinewidth */
  2799. X     gstate->line_cap = CBUTT;    /* setlinecap */
  2800. X     gstate->line_join = JMITRE;    /* setlinejoin */
  2801. X     gstate->dash_length = 0;    /* [] 0 setdash */
  2802. X     gstate->dash_offset = 0;    
  2803. X     gstate->miter_limit = 10;    /* 10 setmiterlimit */
  2804. X     InitShowContext ();
  2805. X     
  2806. X     return TRUE;
  2807. X }
  2808. X
  2809. Xint ErasePage ()
  2810. X {
  2811. X    Paint (NULL, gstate->device->dev,
  2812. X        NewDevicePoint (0, 0), NewDevicePoint (0, 0),
  2813. X        HardwareExtent (gstate->device->dev),
  2814. X        White);
  2815. X     return TRUE;
  2816. X }
  2817. X
  2818. Xstatic int CopyPage ()
  2819. X {
  2820. X     return TRUE;
  2821. X }
  2822. X
  2823. Xstatic int SetLineWidth (width) Object width;
  2824. X {
  2825. X     gstate->line_width = BodyReal (width);
  2826. X     return TRUE;
  2827. X }
  2828. X
  2829. Xstatic int GetLineWidth ()
  2830. X {
  2831. X     return Push (OpStack, MakeReal (gstate->line_width));
  2832. X }
  2833. X
  2834. Xstatic int SetLineCap (cap) Object cap;
  2835. X {
  2836. X     int v = BodyInteger (cap);
  2837. X     
  2838. X     if (v < 0 || v > 2)
  2839. X         return Error (PRangeCheck);
  2840. X     gstate->line_cap = v;
  2841. X     return TRUE;
  2842. X }
  2843. X
  2844. Xstatic int GetLineCap ()
  2845. X {
  2846. X     return Push (OpStack, MakeInteger (gstate->line_cap));
  2847. X }
  2848. X
  2849. Xstatic int SetLineJoin (join) Object join;
  2850. X {
  2851. X     int v = BodyInteger (join);
  2852. X     
  2853. X     if (v < 0 || v > 2)
  2854. X         return Error (PRangeCheck);
  2855. X     gstate->line_join = v;
  2856. X     return TRUE;
  2857. X }
  2858. X
  2859. Xstatic int GetLineJoin ()
  2860. X {
  2861. X      return Push (OpStack, MakeInteger (gstate->line_join));
  2862. X }
  2863. X
  2864. Xstatic int SetDash (array, offset) Object array, offset;
  2865. X {
  2866. X     Object *v = BodyArray (array);
  2867. X    int i, length = lengthArray (array);
  2868. X    float sum = 0;
  2869. X    
  2870. X     if (length > MAXDASH)
  2871. X          return Error (PLimitCheck);
  2872. X      if (length == 0)
  2873. X       {
  2874. X           gstate->dash_length = 0;
  2875. X           return TRUE;
  2876. X       }
  2877. X      for (i = 0; i < length; i++)
  2878. X       {
  2879. X           float val;
  2880. X           
  2881. X          if (TypeOf (v[i]) == Real)
  2882. X              val = BodyReal(v[i]);
  2883. X          else if (TypeOf (v[i]) == Integer)
  2884. X              val = (float) BodyInteger (v[i]);
  2885. X          else
  2886. X                return Error (PLimitCheck);
  2887. X          if (val < 0)
  2888. X              return Error (PRangeCheck);
  2889. X          sum += val;
  2890. X         }
  2891. X      if (sum == 0)
  2892. X         return Error (PRangeCheck);
  2893. X        
  2894. X     gstate->dash_length = length;
  2895. X     gstate->dash_offset = BodyReal (offset);
  2896. X     for (i = 0; i < length; i++)
  2897. X      {
  2898. X         if (TypeOf (v[i]) == Integer)
  2899. X              gstate->dash_array [i] = BodyInteger (v[i]);
  2900. X          else
  2901. X              gstate->dash_array [i] = BodyReal (v[i]);
  2902. X      }
  2903. X     return TRUE;
  2904. X }
  2905. X
  2906. Xstatic int GetDash ()
  2907. X {
  2908. X     int i;
  2909. X     if (!OpCheck (0, gstate->dash_length + 1))
  2910. X         return FALSE;
  2911. X     VOID Push (OpStack, Marker);
  2912. X     for (i = 0; i < gstate->dash_length; i++)
  2913. X         VOID Push (OpStack, MakeReal (gstate->dash_array[i]));
  2914. X     VOID Push (ExecStack, MakeReal (gstate->dash_offset));
  2915. X     VOID Push (ExecStack, Cvx (Rbracket));
  2916. X     return TRUE;
  2917. X }
  2918. X
  2919. Xstatic int SetFlat (flat) Object flat;
  2920. X {
  2921. X     gstate->flatness = BodyReal (flat);
  2922. X     return TRUE;
  2923. X }
  2924. X
  2925. Xstatic int GetFlat ()
  2926. X {
  2927. X     return Push (OpStack, MakeInteger (gstate->flatness));
  2928. X }
  2929. X
  2930. Xstatic int SetMiterLimit (miter) Object miter;
  2931. X {
  2932. X     float m = BodyReal (miter);
  2933. X     
  2934. X     if (m < 1)
  2935. X         return Error (PRangeCheck);
  2936. X     gstate->miter_limit = m;
  2937. X     return TRUE;
  2938. X }
  2939. X
  2940. Xstatic int GetMiterLimit ()
  2941. X {
  2942. X     return Push (OpStack, MakeReal (gstate->miter_limit));
  2943. X }
  2944. X
  2945. Xstatic int SetGray (gray) Object gray;
  2946. X {
  2947. X     float g = BodyReal (gray);
  2948. X     
  2949. X     if (g < 0 || g > 1)
  2950. X         return Error (PRangeCheck);
  2951. X    gstate->colour = NewGray (g);
  2952. X     
  2953. X    return TRUE;
  2954. X }
  2955. X
  2956. Xstatic int GetGray ()
  2957. X {
  2958. X     return Push (OpStack, MakeReal (Brightness (gstate->colour)));
  2959. X }
  2960. X
  2961. Xstatic int SetHSB (hue, sat, bright) Object hue, sat, bright;
  2962. X {
  2963. X     float h = BodyReal (hue), s = BodyReal (sat), b = BodyReal (bright);
  2964. X     if (h < 0 || h > 1 || s < 0 || s > 1 || b < 0 || b > 1)
  2965. X         return Error (PRangeCheck);
  2966. X     gstate->colour = NewHSBColour (h, s, b);
  2967. X     return TRUE;
  2968. X }
  2969. X
  2970. Xstatic int SetRGB (red, green, blue) Object red, green, blue;
  2971. X {
  2972. X     float R = BodyReal (red), G = BodyReal (green), B = BodyReal (blue);
  2973. X     
  2974. X     if (R < 0 || R > 1 || G < 0 || G > 1 || B < 0 || B > 1)
  2975. X         return Error (PRangeCheck);
  2976. X     
  2977. X     gstate->colour = NewRGBColour (R, G, B);
  2978. X     return TRUE;
  2979. X }
  2980. X
  2981. Xstatic int GetHSB ()
  2982. X {
  2983. X     float h, s, b;
  2984. X     
  2985. X     ColourHSB (gstate->colour, &h, &s, &b);
  2986. X     VOID Push (OpStack, MakeReal (h));
  2987. X     VOID Push (OpStack, MakeReal (s));
  2988. X     VOID Push (OpStack, MakeReal (b));
  2989. X     
  2990. X     return TRUE;
  2991. X }
  2992. X
  2993. Xstatic int GetRGB ()
  2994. X {
  2995. X     float R, G, B;
  2996. X    
  2997. X    ColourRGB (gstate->colour, &R, &G, &B);
  2998. X     VOID Push (OpStack, MakeReal (R));
  2999. X     VOID Push (OpStack, MakeReal (G));
  3000. X     VOID Push (OpStack, MakeReal (B));
  3001. X     
  3002. X    return TRUE;
  3003. X }
  3004. X
  3005. Xstatic int PScreenSize (freq, rot) Object freq, rot;
  3006. X {
  3007. X     return Push (OpStack, MakeInteger (ScreenSize (BodyReal (freq), BodyReal (rot))));
  3008. X }
  3009. X
  3010. Xstatic int PBuildScreen (freq, rot) Object freq, rot;
  3011. X {
  3012. X     float f = BodyReal (freq), r = BodyReal (rot);
  3013. X     int i, ss = ScreenSize (f, r);
  3014. X     float    *x = (float *) Malloc (sizeof (float) * ss),
  3015. X         *y = (float *) Malloc (sizeof (float) * ss);
  3016. X     
  3017. X     Object *px = (Object *) Malloc (sizeof (Object) * ss),
  3018. X          *py = (Object *) Malloc (sizeof (Object) * ss);
  3019. X    
  3020. X     BuildScreen (f, r, x, y);
  3021. X     
  3022. X     for (i = 0; i < ss; i++)
  3023. X      {
  3024. X          px [i] = MakeReal (x[i]);
  3025. X          py [i] = MakeReal (y[i]);
  3026. X      }
  3027. X     Free ((char *) x);
  3028. X     Free ((char *) y);
  3029. X     
  3030. X     return Push (OpStack, MakeArray (px, ss)) && Push (OpStack, MakeArray (py, ss));
  3031. X }
  3032. X
  3033. Xstatic int PSetRealScreen (freq, rot, spot, thresh) Object freq, rot, spot, thresh;
  3034. X {
  3035. X     float f = BodyReal (freq), r = BodyReal (rot);
  3036. X     int i, ss = ScreenSize (f, r);
  3037. X     float *th = (float *) Malloc (sizeof (float) * ss);
  3038. X     
  3039. X     gstate->screen.frequency     = f;
  3040. X     gstate->screen.rotation     = r;
  3041. X     gstate->screen.spot_function     = spot;
  3042. X     
  3043. X     if (lengthArray (thresh) != ss)
  3044. X      {
  3045. X          free ((char *) th);
  3046. X          return Error (PRangeCheck);
  3047. X      }
  3048. X     
  3049. X     for (i = 0; i < ss; i++)
  3050. X      {
  3051. X          Object a;
  3052. X          
  3053. X          a = getArray (thresh, i);
  3054. X          if (TypeOf (a) != Real)
  3055. X           {
  3056. X               Free ((char *) th);
  3057. X              return Error (PTypeCheck);
  3058. X           }
  3059. X          
  3060. X         th[i] = BodyReal (a);
  3061. X      }
  3062. X     if (gstate->screen.count == 1)    /* allows 0 to mean 'not assigned yet' */
  3063. X         Free ((char *) gstate->screen.thresh);
  3064. X     gstate->screen.thresh = th;
  3065. X     gstate->screen.count = 1;
  3066. X     
  3067. X     SetScreen (f, r, th);
  3068. X     
  3069. X     return TRUE;
  3070. X }
  3071. X
  3072. Xstatic int GetScreen ()
  3073. X {
  3074. X     VOID Push (OpStack, MakeReal (gstate->screen.frequency));
  3075. X     VOID Push (OpStack, MakeReal (gstate->screen.rotation));
  3076. X     VOID Push (OpStack, gstate->screen.spot_function);
  3077. X     return TRUE;
  3078. X }
  3079. X
  3080. Xstatic int PSetRealTransfer (transfer, values) Object transfer, values;
  3081. X {
  3082. X     Object v;
  3083. X     int i, size = TransferSize ();
  3084. X     float *val;
  3085. X     
  3086. X     if (lengthArray (values) != size)
  3087. X         return Error (PRangeCheck);
  3088. X     
  3089. X     val = (float *) Malloc (sizeof (float) * size);
  3090. X     for (i = 0; i < size; i++)
  3091. X      {
  3092. X          v = getArray (values, i);
  3093. X          if (TypeOf (v) == Real)
  3094. X              val [i] = BodyReal (v);
  3095. X          else
  3096. X           {
  3097. X               Free ((char *) val);
  3098. X               return Error (PTypeCheck);
  3099. X           }
  3100. X      }
  3101. X     
  3102. X     if (gstate->transfer.tcount == 1)
  3103. X          Free ((char *) gstate->transfer.tran);
  3104. X     gstate->transfer.transfn = transfer;
  3105. X     gstate->transfer.tran = val;
  3106. X     gstate->transfer.tcount = 1;
  3107. X     
  3108. X     SetTransfer (val);
  3109. X     
  3110. X     return TRUE;
  3111. X }
  3112. X
  3113. Xstatic int PGetTransfer ()
  3114. X {
  3115. X     return Push (OpStack, gstate->transfer.transfn);
  3116. X }
  3117. X
  3118. Xstatic int PTransferSize ()
  3119. X {
  3120. X    return Push (OpStack, MakeInteger (TransferSize ()));
  3121. X }
  3122. X
  3123. Xstatic int SetFillMethod (method) Object method;
  3124. X {
  3125. X     fill_method = BodyInteger (method);
  3126. X     return TRUE;
  3127. X }
  3128. X
  3129. Xstatic int GetFillMethod ()
  3130. X {
  3131. X     return Push (OpStack, MakeInteger (fill_method));
  3132. X }
  3133. X
  3134. Xstatic int SetStrokeMethod (method) Object method;
  3135. X {
  3136. X     stroke_method = BodyInteger (method);
  3137. X     return TRUE;
  3138. X }
  3139. X
  3140. Xstatic int GetStrokeMethod ()
  3141. X {
  3142. X     return Push (OpStack, MakeInteger (stroke_method));
  3143. X }
  3144. END_OF_FILE
  3145. if test 10995 -ne `wc -c <'source/state.c'`; then
  3146.     echo shar: \"'source/state.c'\" unpacked with wrong size!
  3147. fi
  3148. # end of 'source/state.c'
  3149. fi
  3150. if test -f 'source/stroke.c' -a "${1}" != "-c" ; then 
  3151.   echo shar: Will not clobber existing file \"'source/stroke.c'\"
  3152. else
  3153. echo shar: Extracting \"'source/stroke.c'\" \(11211 characters\)
  3154. sed "s/^X//" >'source/stroke.c' <<'END_OF_FILE'
  3155. X/*
  3156. X * Copyright (C) Rutherford Appleton Laboratory 1987
  3157. X * 
  3158. X * This source may be copied, distributed, altered or used, but not sold for profit
  3159. X * or incorporated into a product except under licence from the author.
  3160. X * It is not in the public domain.
  3161. X * This notice should remain in the source unaltered, and any changes to the source
  3162. X * made by persons other than the author should be marked as such.
  3163. X * 
  3164. X *    Crispin Goswell @ Rutherford Appleton Laboratory caag@uk.ac.rl.vd
  3165. X */
  3166. X#include "main.h"
  3167. X
  3168. X#include "graphics.h"
  3169. X
  3170. Xint PStrokePath ();
  3171. X
  3172. Xint in_stroke = FALSE;
  3173. X
  3174. Xint Stroke ();
  3175. X
  3176. XInitStroke ()
  3177. X {
  3178. X     InstallOp ("strokepath",    PStrokePath,    0, 0, 0, 0);
  3179. X     InstallOp ("stroke",        Stroke,        0, 0, 0, 0);
  3180. X }
  3181. X
  3182. Xint Stroke ()
  3183. X {
  3184. X     int res;
  3185. X     
  3186. X     if (!PFlattenPath ())
  3187. X         return FALSE;
  3188. X     if (EmptyPath (gstate->path))
  3189. X         return TRUE;
  3190. X     if (gstate->device->dev == NULL)
  3191. X         return PNewPath ();
  3192. X     if (ThinStroke ())
  3193. X         return TRUE;
  3194. X     in_stroke = TRUE;
  3195. X     res = PStrokePath () && Fill ();
  3196. X    VOID PNewPath ();
  3197. X    in_stroke = FALSE;
  3198. X    
  3199. X    return res;
  3200. X }
  3201. X
  3202. Xfloat Magnitude (v) Vector v;
  3203. X {
  3204. X     return sqrt (v.vx * v.vx + v.vy * v.vy);
  3205. X }
  3206. X
  3207. Xstatic void Dash ()
  3208. X {
  3209. X     Matrix m;
  3210. X     Path p, new = NewPath (), last_move, last_dash;
  3211. X     HardPoint move, here, next;
  3212. X     Vector v, unit;
  3213. X     int marking, start_marking = TRUE, index, start_index = 0;
  3214. X     float dash_left, start_dash_left = gstate->dash_offset;
  3215. X     float umag, dmag;
  3216. X     
  3217. X     m = gstate->CTM;
  3218. X     m = NewMatrix (m.A, m.B, m.C, m.D, 0.0, 0.0);
  3219. X     
  3220. X     while (start_dash_left > gstate->dash_array [start_index])
  3221. X      {
  3222. X          start_dash_left -= gstate->dash_array [start_index];
  3223. X          if (++start_index == gstate->dash_length)
  3224. X              start_index = 0;
  3225. X          start_marking = !start_marking;
  3226. X      }
  3227. X     start_dash_left = gstate->dash_array [start_index] - start_dash_left;
  3228. X     
  3229. X     for (p = gstate->path->next; p != gstate->path; p = p->next)
  3230. X      switch (p->ptype)
  3231. X       {
  3232. X           case EMove:
  3233. X               index = start_index;
  3234. X               marking = start_marking;
  3235. X               dash_left = start_dash_left;
  3236. X               here = move = p->pe.point;
  3237. X               VOID MoveTo (new, here);
  3238. X               last_move = last_dash = new->last;
  3239. X               break;
  3240. X           
  3241. X           case ELine:
  3242. X           case EClose:
  3243. X               next = p->ptype == ELine ? p->pe.point : move;
  3244. X               v = NewVector (next.hx - here.hx, next.hy - here.hy, 1.0);
  3245. X               dmag = Magnitude (v);
  3246. X               if (dmag == 0)
  3247. X                {
  3248. X                    here = next;
  3249. X                   break;
  3250. X                }
  3251. X               umag = Magnitude (ITransform (v, m));
  3252. X               unit = NewVector (v.vx / umag, v.vy / umag, 1.0);
  3253. X               while (umag > dash_left)
  3254. X                {
  3255. X                    here.hx += unit.vx * dash_left;
  3256. X                    here.hy += unit.vy * dash_left;
  3257. X                    (*(marking ? LineTo : MoveTo)) (new, here);
  3258. X                    if (!marking)
  3259. X                        last_dash = new->last;
  3260. X                    marking = !marking;
  3261. X                    umag -= dash_left;
  3262. X                    if (++index == gstate->dash_length)
  3263. X                        index = 0;
  3264. X                    dash_left = gstate->dash_array [index];
  3265. X                }
  3266. X               if (p->ptype == ELine)
  3267. X                {
  3268. X                    dash_left -= umag;
  3269. X                    if (marking)
  3270. X                        VOID LineTo (new, next);
  3271. X                }
  3272. X               else
  3273. X                {
  3274. X                    if (marking)
  3275. X                     {
  3276. X                         if (start_marking)
  3277. X                             if (last_dash == last_move)
  3278. X                                 ClosePath (new);
  3279. X                             else
  3280. X                              {
  3281. X                             /*    LineTo (new, move);    */
  3282. X                                 MoveChunk (last_move, last_dash, new->last);
  3283. X                              }
  3284. X                         else
  3285. X                             VOID LineTo (new, move);
  3286. X                     }
  3287. X                }
  3288. X               here = next;
  3289. X               break;
  3290. X           
  3291. X           default:
  3292. X               Panic ("Dash: unknown Path Element type");
  3293. X       }
  3294. X     PathFree (gstate->path);
  3295. X     gstate->path = new;
  3296. X     gstate->cp = new->next->pe.point;
  3297. X }
  3298. X
  3299. XMoveChunk (dest, begin, end) Path dest, begin, end;
  3300. X {
  3301. X    dest->ptype = ELine;
  3302. X    end->next->last = begin->last;
  3303. X    begin->last->next = end->next;
  3304. X    dest->last->next = begin;
  3305. X    
  3306. X    end->next = dest;
  3307. X    begin->last = dest->last;
  3308. X    dest->last = end;
  3309. X }
  3310. X
  3311. X/*
  3312. X * is 'b' to the left of 'a' ? if 'a' carries into 'b' ?
  3313. X *
  3314. X *               /
  3315. X *              /
  3316. X *             b
  3317. X *            /
  3318. X *               /
  3319. X * --------- a -------o
  3320. X * 
  3321. X */
  3322. X
  3323. Xleftof (a, b) float a, b;
  3324. X {
  3325. X    return Normalise (b - a) > 0;
  3326. X }
  3327. X
  3328. XMiter (new, last_angle, angle, width) Path new; float last_angle, angle, width;
  3329. X {
  3330. X     Matrix old;
  3331. X     float diff;
  3332. X    
  3333. X    old = gstate->CTM;
  3334. X    if (leftof (last_angle, angle))
  3335. X     {
  3336. X         diff = angle - last_angle;
  3337. X        VOID MoveTo (new, ExtToInt (NewPoint (0.0, 0.0)));
  3338. X        gstate->CTM = Rotate (gstate->CTM, -diff);
  3339. X        VOID LineTo (new, ExtToInt (NewPoint (0.0, -width / 2)));
  3340. X        gstate->CTM = Rotate (gstate->CTM, diff / 2);
  3341. X        VOID LineTo (new, ExtToInt (NewPoint (0.0, -(width / 2) / cos (diff / 2))));
  3342. X        gstate->CTM = old;
  3343. X        VOID LineTo (new, ExtToInt (NewPoint (0.0, -width / 2)));
  3344. X     }    
  3345. X    else
  3346. X     {
  3347. X         diff = last_angle - angle;
  3348. X        VOID MoveTo (new, ExtToInt (NewPoint (0.0, 0.0)));
  3349. X        VOID LineTo (new, ExtToInt (NewPoint (0.0, width / 2)));
  3350. X        gstate->CTM = Rotate (gstate->CTM, diff / 2);
  3351. X        VOID LineTo (new, ExtToInt (NewPoint (0.0, (width / 2) / cos (diff / 2))));
  3352. X        gstate->CTM = Rotate (gstate->CTM, diff / 2);
  3353. X        VOID LineTo (new, ExtToInt (NewPoint (0.0, width / 2)));
  3354. X        gstate->CTM = old;
  3355. X     }
  3356. X    ClosePath (new);
  3357. X }
  3358. X
  3359. XBevel (new, last_angle, angle, width) Path new; float last_angle, angle, width;
  3360. X {
  3361. X     Matrix old;
  3362. X     float diff;
  3363. X    
  3364. X    old = gstate->CTM;
  3365. X    if (leftof (last_angle, angle))
  3366. X     {
  3367. X         diff = angle - last_angle;
  3368. X        VOID MoveTo (new, ExtToInt (NewPoint (0.0, 0.0)));
  3369. X        gstate->CTM = Rotate (gstate->CTM, -diff);
  3370. X        VOID LineTo (new, ExtToInt (NewPoint (0.0, -width / 2)));
  3371. X        gstate->CTM = old;
  3372. X        VOID LineTo (new, ExtToInt (NewPoint (0.0, -width / 2)));
  3373. X     }
  3374. X    else
  3375. X     {
  3376. X         diff = last_angle - angle;
  3377. X        VOID MoveTo (new, ExtToInt (NewPoint (0.0, 0.0)));
  3378. X        VOID LineTo (new, ExtToInt (NewPoint (0.0, width / 2)));
  3379. X        gstate->CTM = Rotate (gstate->CTM, diff);
  3380. X        VOID LineTo (new, ExtToInt (NewPoint (0.0, width / 2)));
  3381. X        gstate->CTM = old;
  3382. X     }
  3383. X    ClosePath (new);
  3384. X }
  3385. X
  3386. XBeginCap (new, width) Path new; float width;
  3387. X {
  3388. X    switch (gstate->line_cap)
  3389. X     {
  3390. X         case CBUTT: break;
  3391. X         
  3392. X         case CSQUARE:
  3393. X             VOID MoveTo (new, ExtToInt (NewPoint (0.0, -width / 2)));
  3394. X             VOID LineTo (new, ExtToInt (NewPoint (0.0, width / 2)));
  3395. X             VOID LineTo (new, ExtToInt (NewPoint (-width / 2, width / 2)));
  3396. X             VOID LineTo (new, ExtToInt (NewPoint (-width / 2, -width / 2)));
  3397. X             ClosePath (new);
  3398. X             break;
  3399. X             
  3400. X         case CROUND:
  3401. X             VOID MoveTo (new, ExtToInt (NewPoint (0.0, width / 2)));
  3402. X             Arc (new, 1, NewPoint (0.0, 0.0), width / 2, PI / 2, 3 * PI / 2);
  3403. X             ClosePath (new);
  3404. X             break;
  3405. X             
  3406. X         default:
  3407. X             Panic ("BeginCap  - unknown line cap encountered");
  3408. X     }
  3409. X }
  3410. X
  3411. XLineJoin (new, width, last_angle, angle) Path new; float width, last_angle, angle;
  3412. X {
  3413. X     float ang, sa;
  3414. X     
  3415. X    switch (gstate->line_join)
  3416. X     {
  3417. X         case JMITRE:
  3418. X             ang = Normalise (leftof (last_angle, angle) ? angle - last_angle : last_angle - angle);
  3419. X             ang = ang < 0 ? -ang : ang;
  3420. X             ang = ang > PI / 2 ? PI - ang : ang;
  3421. X             sa = sin (ang / 2);
  3422. X             if (sa != 0 && 1 / sa <= gstate->miter_limit && 1 / sa >= -gstate->miter_limit)
  3423. X                 Miter (new, last_angle, angle, width);
  3424. X             else
  3425. X                 Bevel (new, last_angle, angle, width);
  3426. X             
  3427. X             break;
  3428. X         
  3429. X         case JROUND:
  3430. X             VOID MoveTo (new, ExtToInt (NewPoint (width / 2, 0.0)));
  3431. X             Arc (new, 1, NewPoint (0.0, 0.0), width / 2, 0.0, 2 * PI);
  3432. X             ClosePath (new);
  3433. X             break;
  3434. X         
  3435. X         case JBEVEL: Bevel (new, last_angle, angle, width); break;
  3436. X         
  3437. X         default:
  3438. X             Panic ("LineJoin  - unknown line join encountered");
  3439. X     }
  3440. X }
  3441. X
  3442. XEndCap (new, width, length) Path new; float width, length;
  3443. X {
  3444. X    switch (gstate->line_cap)
  3445. X     {
  3446. X         case CBUTT: break;
  3447. X         
  3448. X         case CSQUARE:
  3449. X             VOID MoveTo (new, ExtToInt (NewPoint (length, -width / 2)));
  3450. X             VOID LineTo (new, ExtToInt (NewPoint (length + width / 2, -width / 2)));
  3451. X             VOID LineTo (new, ExtToInt (NewPoint (length + width / 2, width / 2)));
  3452. X             VOID LineTo (new, ExtToInt (NewPoint (length, width / 2)));
  3453. X             ClosePath (new);
  3454. X             break;
  3455. X             
  3456. X         case CROUND:
  3457. X             VOID MoveTo (new, ExtToInt (NewPoint (length, -width / 2)));
  3458. X             Arc (new, 1, NewPoint (length, 0.0), width / 2, -PI / 2, PI / 2);
  3459. X             ClosePath (new);
  3460. X             break;
  3461. X             
  3462. X         default:
  3463. X             Panic ("StrokeLineEnd  - unknown line cap encountered");
  3464. X     }
  3465. X }
  3466. X
  3467. Xstatic float move_angle;
  3468. Xstatic Matrix move_matrix;
  3469. X
  3470. 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;
  3471. X {
  3472. X     float angle = atan2 (enow.y - ehere.y, enow.x - ehere.x),
  3473. X         length = sqrt ((enow.y - ehere.y) * (enow.y - ehere.y) + (enow.x - ehere.x) * (enow.x - ehere.x));
  3474. X    Matrix old;
  3475. X    
  3476. X    old = gstate->CTM;
  3477. X    
  3478. X    gstate->CTM = Rotate (Translate (gstate->CTM, ehere.x, ehere.y), angle);
  3479. X    VOID MoveTo (new, ExtToInt (NewPoint (0.0, -width / 2)));
  3480. X    VOID LineTo (new, ExtToInt (NewPoint (length, -width / 2)));
  3481. X    VOID LineTo (new, ExtToInt (NewPoint (length, width / 2)));
  3482. X    VOID LineTo (new, ExtToInt (NewPoint (0.0, width / 2)));
  3483. X    ClosePath (new);
  3484. X    
  3485. X    if (last_type == EMove)
  3486. X     {
  3487. X         move_angle = angle;
  3488. X        move_matrix = gstate->CTM;
  3489. X     }
  3490. X    else if (last_type == ELine)
  3491. X        LineJoin (new, width, last_angle, angle);
  3492. X    
  3493. X    if (p->ptype == EClose)
  3494. X     {
  3495. X        if (last_type == ELine)
  3496. X         {
  3497. X             gstate->CTM = move_matrix;
  3498. X            LineJoin (new, width, angle, move_angle);
  3499. X         }
  3500. X     }
  3501. X    else if (p->next->ptype == EMove || p->next->ptype == EHeader)
  3502. X     {
  3503. X        EndCap (new, width, length);
  3504. X         gstate->CTM = move_matrix;
  3505. X         BeginCap (new, width);
  3506. X     }
  3507. X    
  3508. X    gstate->CTM = old;
  3509. X    return angle;
  3510. X }
  3511. X
  3512. Xint PStrokePath ()
  3513. X {
  3514. X     Path p, new = NewPath ();
  3515. X     HardPoint prev, here, move;
  3516. X     enum pelem_type last_type = EHeader;
  3517. X     float angle, last_angle, width = gstate->line_width;
  3518. X     
  3519. X     PFlattenPath ();
  3520. X     if (gstate->dash_length != 0)
  3521. X         Dash ();
  3522. X     for (p = gstate->path->next; p != gstate->path; last_type = p->ptype, p = p->next)
  3523. X      {
  3524. X         switch (p->ptype)
  3525. X          {
  3526. X               case EMove:
  3527. X                 prev = here;
  3528. X                 move = here = p->pe.point;
  3529. X                 break;
  3530. X                 
  3531. X               case EClose:
  3532. X                   if (last_type == EMove)
  3533. X                       break;
  3534. X                angle = LineSegment (p, new, IntToExt (here), IntToExt (move), width, last_angle, last_type);
  3535. X                 prev = here;
  3536. X                 here = move;
  3537. X                 last_type = EHeader;
  3538. X                 break;
  3539. X                 
  3540. X               case ELine:
  3541. X                angle = LineSegment (p, new, IntToExt (here), IntToExt (p->pe.point), width, last_angle, last_type);
  3542. X                 prev = here;
  3543. X                 here = p->pe.point;
  3544. X                   break;
  3545. X                   
  3546. X               default:
  3547. X                   Panic ("unknown path element type in StrokePath");
  3548. X          }
  3549. X         last_type = p->ptype;
  3550. X         last_angle = angle;
  3551. X     }
  3552. X     PathFree (gstate->path);
  3553. X     gstate->path = new;
  3554. X     return TRUE;
  3555. X }
  3556. X
  3557. Xint ThinStroke ()
  3558. X {
  3559. X     Path p;
  3560. X     Vector v;
  3561. X     HardPoint here, prev;
  3562. X     
  3563. X     if (stroke_method != STROKE_THIN)
  3564. X         return FALSE; /* not used - get better results with area fill */
  3565. X     v = Transform (NewVector (gstate->line_width, gstate->line_width, 0.0), gstate->CTM);
  3566. X     if (fabs (v.vx) > 1.1 || fabs (v.vy) > 1.1)
  3567. X         return FALSE;
  3568. X     if (gstate->dash_length != 0)
  3569. X         Dash ();
  3570. X     for (p = gstate->path->next; p != gstate->path; p = p->next)
  3571. X      switch (p->ptype)
  3572. X       {
  3573. X           case EMove:
  3574. X               here = prev = p->pe.point;
  3575. X               break;
  3576. X           
  3577. X           case ELine:
  3578. X               DevicePaintLine (gstate->device, prev, p->pe.point, gstate->colour);
  3579. X               prev = p->pe.point;
  3580. X               break;
  3581. X           
  3582. X           case EClose:
  3583. X               DevicePaintLine (gstate->device, prev, here, gstate->colour);
  3584. X                prev = here;
  3585. X              break;
  3586. X               
  3587. X         default:
  3588. X               Panic ("unknown path element type in ThinStroke");
  3589. X       }
  3590. X    VOID PNewPath ();
  3591. X    
  3592. X    return TRUE;
  3593. X }
  3594. END_OF_FILE
  3595. if test 11211 -ne `wc -c <'source/stroke.c'`; then
  3596.     echo shar: \"'source/stroke.c'\" unpacked with wrong size!
  3597. fi
  3598. # end of 'source/stroke.c'
  3599. fi
  3600. echo shar: End of archive 9 \(of 18\).
  3601. cp /dev/null ark9isdone
  3602. MISSING=""
  3603. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ; do
  3604.     if test ! -f ark${I}isdone ; then
  3605.     MISSING="${MISSING} ${I}"
  3606.     fi
  3607. done
  3608. if test "${MISSING}" = "" ; then
  3609.     echo You have unpacked all 18 archives.
  3610.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  3611. else
  3612.     echo You still need to unpack the following archives:
  3613.     echo "        " ${MISSING}
  3614. fi
  3615. ##  End of shell archive.
  3616. exit 0
  3617.