home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 21 / AACD 21.iso / AACD / Utilities / Ghostscript / lib / type1ops.ps < prev    next >
Encoding:
Text File  |  2000-12-05  |  7.6 KB  |  240 lines

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