home *** CD-ROM | disk | FTP | other *** search
/ jppd.dyndns.org / jppd.dyndns.org.tar / jppd.dyndns.org / QUERYPRO / Impressora_PDF / converter.exe / GPLGS / type1ops.ps < prev    next >
Text File  |  2002-02-22  |  8KB  |  238 lines

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