henesyinit from p9fd787fda5 years agoHistory
239 lines · 7.6 KB · Text
RawDownload
%    Copyright (C) 1992, 1997, 1998, 1999 Aladdin Enterprises.  All rights reserved.% % This file is part of Aladdin Ghostscript.% % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author% or distributor accepts any responsibility for the consequences of using it,% or for whether it serves any particular purpose or works at all, unless he% or she says so in writing.  Refer to the Aladdin Ghostscript Free Public% License (the "License") for full details.% % Every copy of Aladdin Ghostscript must include a copy of the License,% normally in a plain ASCII text file named PUBLIC.  The License grants you% the right to copy, modify and redistribute Aladdin Ghostscript, but only% under certain conditions described in the License.  Among other things, the% License requires that the copyright notice and this notice be preserved on% all copies. % $Id: type1ops.ps,v 1.1 2000/03/09 08:40:40 lpd Exp $% type1ops.ps% Define the Type 1 and Type 2 font opcodes for use by Ghostscript utilities. % Define the default value of lenIV.% Note that this expects the current font to be on the dictionary stack. /lenIV { FontType 2 eq { -1 } { 4 } ifelse } def % ---------------- Encoding ---------------- % /Type1encode 70 dict 	% Data types dup /nulltype {  pop ()} putdup /nametype {  Type1encode exch get} putdup /stringtype {} putdup /integertype {  dup dup -107 ge exch 107 le and {    139 add (x) dup 0 4 -1 roll put  } {    dup dup -1131 ge exch 1131 le and {      dup 0 ge { 16#f694 } { neg 16#fa94 } ifelse add      (xx) dup dup 0 4 index -8 bitshift put      1 4 -1 roll 255 and put    } {      (\377xxxx) 1 1 4 {	dup 8 mul 32 sub 3 index exch bitshift 255 and	2 index 3 1 roll put      } for exch pop    } ifelse  } ifelse} put 	% Operators % Identical or similar in Type 1 and Type 2./c_hstem 1 def   dup /hstem <01> put/c_vstem 3 def   dup /vstem <03> put/c_vmoveto 4 def   dup /vmoveto <04> put/c_rlineto 5 def   dup /rlineto <05> put/c_hlineto 6 def   dup /hlineto <06> put/c_vlineto 7 def   dup /vlineto <07> put/c_rrcurveto 8 def   dup /rrcurveto <08> put/c_callsubr 10 def   /s_callsubr <0a> def   dup /callsubr s_callsubr put/c_return 11 def   dup /return <0b> put/c_escape 12 def  /ce_div 12 def   /s_div <0c0c> def   dup /div s_div put/c_endchar 14 def   /s_endchar <0e> def   dup /endchar s_endchar put/c_rmoveto 21 def   dup /rmoveto <15> put/c_hmoveto 22 def   dup /hmoveto <16> put/c_vhcurveto 30 def   dup /vhcurveto <1e> put/c_hvcurveto 31 def   dup /hvcurveto <1f> put% Only in Type 1./c_closepath 9 def   dup /closepath <09> put/c_hsbw 13 def   /s_hsbw <0d> def   dup /hsbw s_hsbw put  /ce_dotsection 0 def   /s_dotsection <0c06> def   dup /dotsection s_dotsection put  /ce_vstem3 1 def   /s_vstem3 <0c01> def   dup /vstem3 s_vstem3 put  /ce_hstem3 2 def   /s_hstem3 <0c02> def   dup /hstem3 s_hstem3 put  /ce_seac 6 def   /s_seac <0c06> def	dup /seac s_seac put  /ce_sbw 7 def   /s_sbw <0c07> def   dup /sbw s_sbw put  /ce_callothersubr 16 def   /s_callothersubr <0c10> def   dup /callothersubr s_callothersubr put  /ce_pop 17 def   /s_pop <0c11> def   dup /pop s_pop put  /ce_setcurrentpoint 33 def   /s_setcurrentpoint <0c21> def   dup /setcurrentpoint s_setcurrentpoint put  /s_setcurrentpoint_hmoveto s_setcurrentpoint <8b16> concatstrings def% Only in Type 2.dup /blend <10> putdup /hstemhm <12> putdup /hintmask <13> putdup /cntrmask <14> putdup /vstemhm <17> putdup /rcurveline <18> putdup /rlinecurve <19> putdup /vvcurveto <1a> putdup /hhcurveto <1b> putdup /callgsubr <1d> put  dup /and <0c03> put  dup /or <0c04> put  dup /not <0c05> put  dup /store <0c08> put  dup /abs <0c09> put  dup /add <0c0a> put  dup /sub <0c0b> put  dup /load <0c0d> put  dup /neg <0c0c> put  dup /eq <0c0f> put  dup /drop <0c12> put  dup /put <0c14> put  dup /get <0c15> put  dup /ifelse <0c16> put  dup /random <0c17> put  dup /mul <0c18> put  dup /sqrt <0c1a> put  dup /dup <0c1b> put  dup /exch <0c1c> put  dup /index <0c1d> put  dup /roll <0c1e> put  dup /hflex <0c22> put  dup /flex <0c23> put  dup /hflex1 <0c24> put  dup /flex1 <0c25> put readonly def % ---------------- Decoding ---------------- % /Type1decode 512 array Type1encode {  dup type /stringtype eq {    dup length 1 eq { 0 get } { 1 get 256 add } ifelse		% stack: array key code    exch 2 index 3 1 roll put  } {    pop pop  } ifelse} forall dup 12 {  dup read pop dup Type1decode exch 256 add get dup null ne    { exch pop }    { pop 2 string dup 0 12 put dup 1 4 -1 roll put }  ifelse} putdup 28 {		% Type 2 only  dup read pop 128 xor 128 sub 8 bitshift  1 index read pop add} put32 1 246 { 2 copy dup 139 sub put pop } fordup 247 { dup read pop 108 add } putdup 248 { dup read pop 364 add } putdup 249 { dup read pop 620 add } putdup 250 { dup read pop 876 add } putdup 251 { dup read pop 108 add neg } putdup 252 { dup read pop 364 add neg } putdup 253 { dup read pop 620 add neg } putdup 254 { dup read pop 876 add neg } putdup 255 {		% Different for Type 1 and Type 2  dup read pop 128 xor 128 sub  3 { 8 bitshift 1 index read pop add } repeat  FontType 2 eq { 65536.0 div } if} put readonly def % ---------------- Procedures ---------------- % % For these utilities, a CharString is represented by a sequence of% integers, reals, strings, and names, either in an array or on the stack.% Integers and reals represent themselves; strings are other data that% appears in the CharString; names are CharString operator names.% A CharString in an array is called a "charproc"; a CharString on% the stack is called a "charstack", and is delimited by a mark.% Individual elements are called "chartokens". % ------ Encoding ------ % % Get the string for a chartoken.% Note that this string may be overwritten by the next call./chartoken_string {	% <chartoken> chartoken_string <string>  dup type Type1encode exch get exec} bind def% Compute the length of a CharString./chartoken_length {	% <chartoken> chartoken_length <length>  chartoken_string length} bind def/charproc_length {	% <charproc> charproc_length <length>  0 exch { chartoken_length add } forall} bind def/charstack_length {	% <charstack> charstack_length <charstack> <length>  counttomark 0 exch -1 1 { index chartoken_length add } for} bind def % Write a CharString to a file.  Normally this will be a NullEncode filter% writing on a string of the correct length./chartoken_write {	% <file> <chartoken> chartoken_write -  chartoken_string writestring} bind def/charproc_write {	% <file> <charproc> charproc_write -  { 1 index exch chartoken_write } forall pop} bind def% Note that the arguments of charstack_write are backwards./charstack_write {	% <charstack> <file> charstack_write -  counttomark 1 sub -1 1 { index 1 index exch chartoken_write } for  cleartomark} bind def % Convert a charproc or charstack to an *un*encrypted CharString./charproc_string {	% <charproc> charproc_string <string>  mark exch aload pop charstack_string} bind def/charstack_string {	% <charstack> charstack_string <string>  charstack_length lenIV 0 gt {    lenIV add string    dup dup length lenIV sub lenIV exch getinterval	% skip lenIV  } {    string  } ifelse  /NullEncode filter  exch 1 index counttomark 1 add 2 roll  charstack_write closefile%   lenIV 0 ge { 4330 exch dup .type1encrypt exch pop readonly } if} bind def % ------ Decoding ------ % % Decode a CharString (unencrypted)./charstack_read {	% <file> charstack_read <no-mark-charstack>  { dup read not { pop exit } if    Type1decode 1 index get dup null eq {      pop 1 string dup 0 4 -1 roll put    } {      exch pop exec    } ifelse exch  } loop} bind def