% Copyright (C) 1990, 1992, 1997, 1999 Aladdin Enterprises. All rights reserved. % % This software is provided AS-IS with no warranty, either express or % implied. % % This software is distributed under license and may not be copied, % modified or distributed except as expressly authorized under the terms % of the license contained in the file LICENSE in this distribution. % % For more information about licensing, please refer to % http://www.ghostscript.com/licensing/. For information on % commercial licensing, go to http://www.artifex.com/licensing/ or % contact Artifex Software, Inc., 101 Lucas Valley Road #110, % San Rafael, CA 94903, U.S.A., +1(415)492-9861. % $Id: pcharstr.ps,v 1.4 2002/02/21 21:49:28 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