% Copyright (C) 1990, 1992, 1997, 1999 Aladdin Enterprises. All rights reserved. % % This program is free software; you can redistribute it and/or modify it % under the terms of the GNU General Public License as published by the % Free Software Foundation; either version 2 of the License, or (at your % option) any later version. % % This program is distributed in the hope that it will be useful, but % WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General % Public License for more details. % % You should have received a copy of the GNU General Public License along % with this program; if not, write to the Free Software Foundation, Inc., % 59 Temple Place, Suite 330, Boston, MA, 02111-1307. % $Id: pcharstr.ps,v 1.2.6.1.2.1 2003/04/12 14:02:39 giles Exp $ % pcharstr.ps % Print the CharStrings and Subrs (if present) from a Type 1 font, % in either a PostScript-like or a C-compatible form, % depending on whether CSFormat is defined as /PS or /C. % Load the Type 1 utilities. (type1ops.ps) runlibfile % Define the printing procedures for PostScript-like output. /pcs_ps_dict mark /, {( ) print} /charname {==only} /csbegin {} /beginchars {(%---------------- CharStrings\n) print} /charbegin {==only} /char1 {( ) print ==only} /endchars {} /beginsubrs {(%---------------- Subrs\n) print} /subrbegin {=only} /endsubrs {} /beginboxes {(%---------------- Encoding & metrics\n) print} /notdefbox {} /boxbegin {=only ( ) print} /boxend {(\n) print} /endboxes {(%----------------\n) print} .dicttomark readonly def % Define the printing procedures for C-like output. /pcs_c_dict mark /, {(, ) print} /charname {(") print =only (") print} /csbegin {counttomark =only ,} /beginchars {(\nconstdata int CSCharData[] = {\n) print} /charbegin {pop} /char1 {=only ,} /endchars { (-1\n};\nconstdata char *CSCharNames[] = {\n) print CharStrings {pop charname ,} forall (0\n};\n) print } /beginsubrs {(\nconstdata int CSSubrs[] = {\n) print} /subrbegin {pop} /endsubrs {(-1\n};\n) print} /beginboxes {(\nconstdata type1_box CSboxes[] = {\n) print} /notdefbox {( {""},\n) print} /boxbegin {pop ( {) print} /boxend {(},) =} /endboxes {( {0}\n};\n) print} .dicttomark readonly def /printcs { dup type /stringtype eq { printcs1 (\n) print } { ( ) print == } ifelse } bind def /printcs1 { save exch lenIV 0 ge { 4330 exch dup length string .type1decrypt exch pop dup length lenIV sub lenIV exch getinterval } if 0 () /SubFileDecode filter mark exch charstack_read csbegin counttomark 1 sub -1 0 { index char1 } for cleartomark restore } bind def /printfont { pcs_ps_dict /CSFormat where { pop CSFormat /C eq { pop pcs_c_dict } if } if begin currentfont begin Private begin 10 dict begin % Print the CharStrings and Subrs beginchars CharStrings { exch charbegin printcs } forall endchars /Subrs where { pop % the dictionary beginsubrs 0 1 Subrs length 1 sub { dup subrbegin Subrs exch get printcs } for endsubrs } if % Print the bounding boxes gsave nulldevice FontMatrix matrix invertmatrix concat beginboxes 0 1 Encoding length 1 sub { dup Encoding exch get dup /.notdef eq { pop pop notdefbox } { 1 index boxbegin charname , ( ) dup 0 4 -1 roll put newpath 0 0 moveto false charpath pathbbox ({) print 4 -1 roll =only , 3 -1 roll =only , exch =only , =only (}) print boxend } ifelse } for endboxes grestore end end end end } bind def