type1ops.ps 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. % Copyright (C) 1992, 1997, 1998, 1999 Aladdin Enterprises. All rights reserved.
  2. %
  3. % This software is provided AS-IS with no warranty, either express or
  4. % implied.
  5. %
  6. % This software is distributed under license and may not be copied,
  7. % modified or distributed except as expressly authorized under the terms
  8. % of the license contained in the file LICENSE in this distribution.
  9. %
  10. % For more information about licensing, please refer to
  11. % http://www.ghostscript.com/licensing/. For information on
  12. % commercial licensing, go to http://www.artifex.com/licensing/ or
  13. % contact Artifex Software, Inc., 101 Lucas Valley Road #110,
  14. % San Rafael, CA 94903, U.S.A., +1(415)492-9861.
  15. % $Id: type1ops.ps,v 1.4 2002/02/21 21:49:28 giles Exp $
  16. % type1ops.ps
  17. % Define the Type 1 and Type 2 font opcodes for use by Ghostscript utilities.
  18. % Define the default value of lenIV.
  19. % Note that this expects the current font to be on the dictionary stack.
  20. /lenIV { FontType 2 eq { -1 } { 4 } ifelse } def
  21. % ---------------- Encoding ---------------- %
  22. /Type1encode 70 dict
  23. % Data types
  24. dup /nulltype {
  25. pop ()
  26. } put
  27. dup /nametype {
  28. Type1encode exch get
  29. } put
  30. dup /stringtype {
  31. } put
  32. dup /integertype {
  33. dup dup -107 ge exch 107 le and {
  34. 139 add (x) dup 0 4 -1 roll put
  35. } {
  36. dup dup -1131 ge exch 1131 le and {
  37. dup 0 ge { 16#f694 } { neg 16#fa94 } ifelse add
  38. (xx) dup dup 0 4 index -8 bitshift put
  39. 1 4 -1 roll 255 and put
  40. } {
  41. (\377xxxx) 1 1 4 {
  42. dup 8 mul 32 sub 3 index exch bitshift 255 and
  43. 2 index 3 1 roll put
  44. } for exch pop
  45. } ifelse
  46. } ifelse
  47. } put
  48. % Operators
  49. % Identical or similar in Type 1 and Type 2.
  50. /c_hstem 1 def dup /hstem <01> put
  51. /c_vstem 3 def dup /vstem <03> put
  52. /c_vmoveto 4 def dup /vmoveto <04> put
  53. /c_rlineto 5 def dup /rlineto <05> put
  54. /c_hlineto 6 def dup /hlineto <06> put
  55. /c_vlineto 7 def dup /vlineto <07> put
  56. /c_rrcurveto 8 def dup /rrcurveto <08> put
  57. /c_callsubr 10 def /s_callsubr <0a> def dup /callsubr s_callsubr put
  58. /c_return 11 def dup /return <0b> put
  59. /c_escape 12 def
  60. /ce_div 12 def /s_div <0c0c> def dup /div s_div put
  61. /c_endchar 14 def /s_endchar <0e> def dup /endchar s_endchar put
  62. /c_rmoveto 21 def dup /rmoveto <15> put
  63. /c_hmoveto 22 def dup /hmoveto <16> put
  64. /c_vhcurveto 30 def dup /vhcurveto <1e> put
  65. /c_hvcurveto 31 def dup /hvcurveto <1f> put
  66. % Only in Type 1.
  67. /c_closepath 9 def dup /closepath <09> put
  68. /c_hsbw 13 def /s_hsbw <0d> def dup /hsbw s_hsbw put
  69. /ce_dotsection 0 def /s_dotsection <0c06> def dup /dotsection s_dotsection put
  70. /ce_vstem3 1 def /s_vstem3 <0c01> def dup /vstem3 s_vstem3 put
  71. /ce_hstem3 2 def /s_hstem3 <0c02> def dup /hstem3 s_hstem3 put
  72. /ce_seac 6 def /s_seac <0c06> def dup /seac s_seac put
  73. /ce_sbw 7 def /s_sbw <0c07> def dup /sbw s_sbw put
  74. /ce_callothersubr 16 def /s_callothersubr <0c10> def dup /callothersubr s_callothersubr put
  75. /ce_pop 17 def /s_pop <0c11> def dup /pop s_pop put
  76. /ce_setcurrentpoint 33 def /s_setcurrentpoint <0c21> def dup /setcurrentpoint s_setcurrentpoint put
  77. /s_setcurrentpoint_hmoveto s_setcurrentpoint <8b16> concatstrings def
  78. % Only in Type 2.
  79. dup /blend <10> put
  80. dup /hstemhm <12> put
  81. dup /hintmask <13> put
  82. dup /cntrmask <14> put
  83. dup /vstemhm <17> put
  84. dup /rcurveline <18> put
  85. dup /rlinecurve <19> put
  86. dup /vvcurveto <1a> put
  87. dup /hhcurveto <1b> put
  88. dup /callgsubr <1d> put
  89. dup /and <0c03> put
  90. dup /or <0c04> put
  91. dup /not <0c05> put
  92. dup /store <0c08> put
  93. dup /abs <0c09> put
  94. dup /add <0c0a> put
  95. dup /sub <0c0b> put
  96. dup /load <0c0d> put
  97. dup /neg <0c0c> put
  98. dup /eq <0c0f> put
  99. dup /drop <0c12> put
  100. dup /put <0c14> put
  101. dup /get <0c15> put
  102. dup /ifelse <0c16> put
  103. dup /random <0c17> put
  104. dup /mul <0c18> put
  105. dup /sqrt <0c1a> put
  106. dup /dup <0c1b> put
  107. dup /exch <0c1c> put
  108. dup /index <0c1d> put
  109. dup /roll <0c1e> put
  110. dup /hflex <0c22> put
  111. dup /flex <0c23> put
  112. dup /hflex1 <0c24> put
  113. dup /flex1 <0c25> put
  114. readonly def
  115. % ---------------- Decoding ---------------- %
  116. /Type1decode 512 array
  117. Type1encode {
  118. dup type /stringtype eq {
  119. dup length 1 eq { 0 get } { 1 get 256 add } ifelse
  120. % stack: array key code
  121. exch 2 index 3 1 roll put
  122. } {
  123. pop pop
  124. } ifelse
  125. } forall
  126. dup 12 {
  127. dup read pop dup Type1decode exch 256 add get dup null ne
  128. { exch pop }
  129. { pop 2 string dup 0 12 put dup 1 4 -1 roll put }
  130. ifelse
  131. } put
  132. dup 28 { % Type 2 only
  133. dup read pop 128 xor 128 sub 8 bitshift
  134. 1 index read pop add
  135. } put
  136. 32 1 246 { 2 copy dup 139 sub put pop } for
  137. dup 247 { dup read pop 108 add } put
  138. dup 248 { dup read pop 364 add } put
  139. dup 249 { dup read pop 620 add } put
  140. dup 250 { dup read pop 876 add } put
  141. dup 251 { dup read pop 108 add neg } put
  142. dup 252 { dup read pop 364 add neg } put
  143. dup 253 { dup read pop 620 add neg } put
  144. dup 254 { dup read pop 876 add neg } put
  145. dup 255 { % Different for Type 1 and Type 2
  146. dup read pop 128 xor 128 sub
  147. 3 { 8 bitshift 1 index read pop add } repeat
  148. FontType 2 eq { 65536.0 div } if
  149. } put
  150. readonly def
  151. % ---------------- Procedures ---------------- %
  152. % For these utilities, a CharString is represented by a sequence of
  153. % integers, reals, strings, and names, either in an array or on the stack.
  154. % Integers and reals represent themselves; strings are other data that
  155. % appears in the CharString; names are CharString operator names.
  156. % A CharString in an array is called a "charproc"; a CharString on
  157. % the stack is called a "charstack", and is delimited by a mark.
  158. % Individual elements are called "chartokens".
  159. % ------ Encoding ------ %
  160. % Get the string for a chartoken.
  161. % Note that this string may be overwritten by the next call.
  162. /chartoken_string { % <chartoken> chartoken_string <string>
  163. dup type Type1encode exch get exec
  164. } bind def
  165. % Compute the length of a CharString.
  166. /chartoken_length { % <chartoken> chartoken_length <length>
  167. chartoken_string length
  168. } bind def
  169. /charproc_length { % <charproc> charproc_length <length>
  170. 0 exch { chartoken_length add } forall
  171. } bind def
  172. /charstack_length { % <charstack> charstack_length <charstack> <length>
  173. counttomark 0 exch -1 1 { index chartoken_length add } for
  174. } bind def
  175. % Write a CharString to a file. Normally this will be a NullEncode filter
  176. % writing on a string of the correct length.
  177. /chartoken_write { % <file> <chartoken> chartoken_write -
  178. chartoken_string writestring
  179. } bind def
  180. /charproc_write { % <file> <charproc> charproc_write -
  181. { 1 index exch chartoken_write } forall pop
  182. } bind def
  183. % Note that the arguments of charstack_write are backwards.
  184. /charstack_write { % <charstack> <file> charstack_write -
  185. counttomark 1 sub -1 1 { index 1 index exch chartoken_write } for
  186. cleartomark
  187. } bind def
  188. % Convert a charproc or charstack to an *un*encrypted CharString.
  189. /charproc_string { % <charproc> charproc_string <string>
  190. mark exch aload pop charstack_string
  191. } bind def
  192. /charstack_string { % <charstack> charstack_string <string>
  193. charstack_length lenIV 0 gt {
  194. lenIV add string
  195. dup dup length lenIV sub lenIV exch getinterval % skip lenIV
  196. } {
  197. string
  198. } ifelse
  199. /NullEncode filter
  200. exch 1 index counttomark 1 add 2 roll
  201. charstack_write closefile
  202. % lenIV 0 ge { 4330 exch dup .type1encrypt exch pop readonly } if
  203. } bind def
  204. % ------ Decoding ------ %
  205. % Decode a CharString (unencrypted).
  206. /charstack_read { % <file> charstack_read <no-mark-charstack>
  207. { dup read not { pop exit } if
  208. Type1decode 1 index get dup null eq {
  209. pop 1 string dup 0 4 -1 roll put
  210. } {
  211. exch pop exec
  212. } ifelse exch
  213. } loop
  214. } bind def