diff options
54 files changed, 1369 insertions, 6633 deletions
diff --git a/Master/source/ghostscript-9.21.tar.xz b/Master/source/ghostscript-9.22.tar.xz Binary files differindex b0bc4556f1d..5678eb512e3 100644 --- a/Master/source/ghostscript-9.21.tar.xz +++ b/Master/source/ghostscript-9.22.tar.xz diff --git a/Master/tlpkg/tlgs/README.TEXLIVE b/Master/tlpkg/tlgs/README.TEXLIVE index 7c40a93296a..8358312554a 100644 --- a/Master/tlpkg/tlgs/README.TEXLIVE +++ b/Master/tlpkg/tlgs/README.TEXLIVE @@ -1,5 +1,5 @@ -This directory contains a subset of the Ghostscript 9.21 distribution +This directory contains a subset of the Ghostscript 9.22 distribution for Windows. The only purpose of this package is to support programs shipped with TeX Live. It's not intended for general use. @@ -24,6 +24,8 @@ Changes: * kanji directory copied from w23tex. + * Binaries compiled by Akira Kakuto with --disable-compile-inits. + This version of Ghostscript will not be installed on your system and will not interfere with other versions of Ghostscript which might be installed already. diff --git a/Master/tlpkg/tlgs/Resource/IdiomSet/Pscript5Idiom b/Master/tlpkg/tlgs/Resource/IdiomSet/Pscript5Idiom index e22a946e593..021603f3341 100644 --- a/Master/tlpkg/tlgs/Resource/IdiomSet/Pscript5Idiom +++ b/Master/tlpkg/tlgs/Resource/IdiomSet/Pscript5Idiom @@ -137,8 +137,8 @@ currentuserparams /IdiomRecognition get /Decode[0 1]def}{/Decode[0 1 0 1 0 1 0 1]def}ifelse}ifelse/DataSource{PaintData}def end/ImageDict exch def/PaintProc{begin ImageDict image end}b currentdict mx makepattern setpattern end fEOFill{eofill}{fill} ifelse grestore - } - } + } ifelse + }bind ] /mask_pbf [ diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_cet.ps b/Master/tlpkg/tlgs/Resource/Init/gs_cet.ps index 8eb79bb06e0..d3e1686409b 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_cet.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_cet.ps @@ -21,7 +21,7 @@ currentglobal //true setglobal /serialnumber dup {233640} readonly .makeoperator put % match CPSI 3017.102 Tek shows serialnumber 1401788461 systemdict /deviceinfo undef % for CET 20-23-1 % /UNROLLFORMS true put % CET files do unreasonable things inside forms -} superexec +} 1183615869 internaldict /superexec get exec /UNROLLFORMS true def diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_dps1.ps b/Master/tlpkg/tlgs/Resource/Init/gs_dps1.ps index a57bb94ed3b..a4d6dda2a5c 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_dps1.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_dps1.ps @@ -55,8 +55,7 @@ level2dict begin { //SharedFontDirectory } { /LocalFontDirectory .systemvar } % can't embed ref to local VM ifelse .forceput pop % LocalFontDirectory is local, systemdict is global - } .bind odef % must bind .forceput and .setglobal - % even if NOBIND in effect + } .bind odef % Don't just copy (load) the definition of .setglobal: % it gets redefined for LL3. /setshared { /.setglobal .systemvar exec } odef @@ -86,7 +85,7 @@ level2dict begin % definition, copy it into the local directory. //systemdict /SharedFontDirectory .knownget { 1 index .knownget - { .FontDirectory 2 index 3 -1 roll { put } //superexec } % readonly + { .FontDirectory 2 index 3 -1 roll { put } systemdict /superexec known {//superexec}{1183615869 internaldict /superexec get exec} ifelse } % readonly if } if @@ -102,7 +101,7 @@ level2dict begin % Furthermore, if FAKEFONTS is in effect, we want global real fonts to % override fake local ones. We handle this by brute force. /restore % <save> restore - - { dup //restore % bind even if NOBIND + { dup //restore /LocalFontDirectory .systemvar FAKEFONTS { mark diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_fonts.ps b/Master/tlpkg/tlgs/Resource/Init/gs_fonts.ps index a3da615cb3f..1f4c9eda288 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_fonts.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_fonts.ps @@ -519,11 +519,11 @@ buildfontdict 3 /.buildfont3 cvx put % the font in LocalFontDirectory. .currentglobal { //systemdict /LocalFontDirectory .knownget - { 2 index 2 index { .growput } //superexec } % readonly + { 2 index 2 index { .growput } systemdict /superexec known {//superexec}{1183615869 internaldict /superexec get exec} ifelse } % readonly if } if - dup .FontDirectory 4 -2 roll { .growput } //superexec % readonly + dup .FontDirectory 4 -2 roll { .growput } systemdict /superexec known {//superexec}{1183615869 internaldict /superexec get exec} ifelse % readonly % If the font originated as a resource, register it. currentfile .currentresourcefile eq { dup .registerfont } if readonly @@ -1193,7 +1193,7 @@ currentdict /.putgstringcopy .undef .FontDirectory 1 index known not { 2 dict dup /FontName 3 index put dup /FontType 1 put - .FontDirectory 3 1 roll { put } //superexec % readonly + .FontDirectory 3 1 roll { put } systemdict /superexec known {//superexec}{1183615869 internaldict /superexec get exec} ifelse % readonly } { pop } ifelse diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_img.ps b/Master/tlpkg/tlgs/Resource/Init/gs_img.ps index f2b0f6287da..e1cd6279323 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_img.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_img.ps @@ -746,119 +746,4 @@ if end % img_utils_dict -% Conditionally turn image interpolation on or off. -% INTERPOLATE is not yet set, handle all cases -currentdict /INTERPOLATE known -currentdict /DOTERPOLATE known or -currentdict /NOTERPOLATE known or not { - currentfile 1 (%END INTERPOLATE) .subfiledecode flushfile -} if - -/.interpolate { - dup /Interpolate .knownget not { //false } if - /INTERPOLATE .systemvar ne { - dup gcheck .currentglobal exch .setglobal - exch dup length dict copy - dup /Interpolate /INTERPOLATE .systemvar put - exch .setglobal - } if -} .bind odef - -/colorimage - { /INTERPOLATE .systemvar - { .currentglobal % w h bit [] {}...{} multi ncomp glob - //false .setglobal - 9 dict begin % w h bit [] {}...{} multi ncomp glob - 2 .argindex { 1 index 7 add } { 8 } ifelse - dup .argindex pop % check # of arguments - copy gsave pop % preserve the arguments - { 0 /DeviceGray 0 /DeviceRGB /DeviceCMYK } - 1 index get setcolorspace % ... glob w h bit [] {}...{} multi ncomp - {0 1 0 1 0 1 0 1} - 1 index 2 mul 0 exch % ... glob w h bit [] {}...{} multi ncomp {0 1 ...} 0 2*ncomp - getinterval /Decode exch def % ... glob w h bit [] {}...{} multi ncomp - exch dup % ... glob w h bit [] {}...{} ncomp multi multi - /MultipleDataSources exch def % ... glob w h bit [] {}...{} ncomp multi - { array astore} { pop } ifelse % ... glob w h bit [] [{}...{}] - /DataSource exch def % ... glob w h bit [] - /ImageMatrix exch def % ... glob w h bit - /BitsPerComponent exch def % ... glob w h - /Height exch def % ... glob w - /Width exch def % ... glob - /ImageType 1 def - /Interpolate //true def - .setglobal currentdict end % ... <<>> - image grestore - exch { 4 add } { 6 } ifelse - { pop } repeat % - - } - { colorimage - } - ifelse - } .bind odef - -/image - { dup type /dicttype eq - { dup /ImageType get 3 eq - { .currentglobal //false .setglobal exch - dup length dict copy begin .setglobal - /DataDict DataDict .interpolate def - /MaskDict MaskDict .interpolate def - currentdict end - } - { .interpolate - } - ifelse - image - } - { /INTERPOLATE .systemvar - { 4 .argindex pop % check # of args - .currentglobal //false .setglobal - 8 dict begin .setglobal - /ImageType 1 def - /DataSource 1 index def - /ImageMatrix 2 index def - /BitsPerComponent 3 index def - /Decode {0 1} def - /Height 4 index def - /Width 5 index def - /Interpolate //true def - currentdict end - gsave /DeviceGray setcolorspace image grestore - 5 { pop } repeat - } - { image - } - ifelse - } - ifelse - } .bind odef - -/imagemask { - dup type /dicttype eq { - .interpolate imagemask - } { - /INTERPOLATE .systemvar { - 4 .argindex pop % check # of args - .currentglobal //false .setglobal - 8 dict begin .setglobal - /ImageType 1 def - /DataSource 1 index def - /ImageMatrix 2 index def - /BitsPerComponent 1 def - 2 index { {1 0} } { {0 1} } ifelse /Decode exch def - /Height 4 index def - /Width 5 index def - /Interpolate //true def - currentdict end imagemask 5 { pop } repeat - } { - imagemask - } ifelse - } ifelse -} .bind odef - -currentdict /.interpolate .undef - -%END INTERPOLATE - .setglobal % restore VM mode diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps b/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps index a1deb5891a4..e2bffba377e 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps @@ -58,7 +58,7 @@ languagelevel dup 2 .max .setlanguagelevel /.bind /.bind_ load odef % note that .bind_ will get bound currentdict /.bindscratch .undef -DELAYBIND NOBIND or not { +DELAYBIND not { % We can't just do % /bind /.bind load def % because then /bind load == prints --.bind-- . diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_statd.ps b/Master/tlpkg/tlgs/Resource/Init/gs_statd.ps index 18dfced1499..dbcf05199c9 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_statd.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_statd.ps @@ -59,7 +59,7 @@ statusdict begin % shrunk by 25 units on all 4 sides. /note /letter load def % End of Adobe-defined page sizes -STRICT { (%END SIZES) .skipeof } if + % Other page sizes % ISO standard paper sizes /a0 {2384 3370 //.setpagesize exec} bind def diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_ttf.ps b/Master/tlpkg/tlgs/Resource/Init/gs_ttf.ps index ebacc6bbd0d..8cb5b390c57 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_ttf.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_ttf.ps @@ -435,7 +435,7 @@ currentdict /woff_tag_dict .undef } bind def % Each procedure in this dictionary is called as follows: -% <encodingtable> proc <glypharray> +% <encodingtable> proc <glyph dictionary> /cmapformats mark 0 { % Apple standard 1-to-1 mapping. 6 256 getinterval_from_stringarray @@ -538,35 +538,20 @@ currentdict /woff_tag_dict .undef /putglyph { glyphs code 3 -1 roll put /code code 1 add def } bind def - % Do a first pass to compute the size of the glyphs array. - /numcodes 0 def /glyphs 0 dict def - 0 0 2 nseg2 3 sub { - % Stack: /glyphs numglyphs i2 - /i2 exch def - /scode startc i2 getu16a def - /ecode endc i2 getu16a def - - % Bug 693538: More undocumented nonsense: in cases where scode == ecode, - % see Bug 691326 below *except*, it seems when both are zero - scode 0 eq ecode 0 eq and not { - scode ecode 1 add gt { % Bug 691326. - /ecode scode 1 add def % Acrobat does this contrary to TTF spec that - } if % requires such intervals to be ignored. - numcodes scode firstcode sub - % Hack for fonts that have only 0x0000 and 0xf000 ranges - %dup 16#e000 ge { 255 and } if - % the previous line is obstructive to CJK fonts, so it was removed - exch sub 0 .max ecode scode sub 1 add add - exch 1 index add exch - numcodes add /numcodes exch def - } if - } for pop - - % Now fill in the array. /numcodes 0 def /code 0 def - 0 2 nseg2 3 sub { + % neg2 is number of segments x 2. A format 4 cmap, with usable + % mappings cannot (according to the spec) have only 1 segment, + % since format 4 requires a closing segment with start and end + % codes being 0xffff. Unfortunately, we have found badly subsetted + % TTF fonts which have one segment with valid mappings, and no + % closing segment. + % In such a case, force the loop to work as though as we have two + % segments - this works as we don't rely on the terminating segment + % but use the loop counter to spot completion - effrectively, we + % ignore the closing segment when it's present, anyway. + 0 2 nseg2 dup 4 lt {pop 4}if 3 sub { /i2 exch def /scode startc i2 getu16a def /ecode endc i2 getu16a def @@ -633,8 +618,8 @@ currentdict /woff_tag_dict .undef } bind .dicttomark readonly def % cmapformats -% <cmaptab> cmaparray <glypharray> -/cmaparray { +% <cmaptab> cmapdict <glyph dictionary> +/cmapdict { dup 0 getu16a cmapformats exch .knownget { TTFDEBUG { (cmap: format ) print 1 index 0 getu16a = flush @@ -1389,7 +1374,7 @@ mark def } if - /cmapa cmaptab cmaparray def + /cmapa cmaptab cmapdict def % Some badly designed Chinese fonts have a post table % in which all glyphs other than 0 are named .null. % Use CharStrings to keep track of the reverse map from @@ -1436,7 +1421,7 @@ mark TTFDEBUG { (\n1 setting alias: ) print dup ==only ( to be the same as ) print 2 index //== exec } if - 7 index 2 index 3 -1 roll exch //.growput superexec + 7 index 2 index 3 -1 roll exch //.growput systemdict /superexec known {//superexec}{1183615869 internaldict /superexec get exec} ifelse } forall pop pop pop } @@ -1454,7 +1439,7 @@ mark exch pop TTFDEBUG { (\n2 setting alias: ) print 1 index ==only ( to use glyph index: ) print dup //== exec } if - 5 index 3 1 roll //.growput superexec + 5 index 3 1 roll //.growput systemdict /superexec known {//superexec}{1183615869 internaldict /superexec get exec} ifelse //false } { @@ -1471,7 +1456,7 @@ mark { % CharStrings(dict) isunicode(boolean) cmap(dict) RAGL(dict) gname(name) codep(integer) gindex(integer) TTFDEBUG { (\3 nsetting alias: ) print 1 index ==only ( to be index: ) print dup //== exec } if - exch pop 5 index 3 1 roll //.growput superexec + exch pop 5 index 3 1 roll //.growput systemdict /superexec known {//superexec}{1183615869 internaldict /superexec get exec} ifelse } { pop pop @@ -1626,7 +1611,7 @@ currentdict /postalias undef mark .ttkeys /NumGlyphs numloca - /TT_cmap cmaptab cmaparray + /TT_cmap cmaptab cmapdict /file_table_pos file_table_pos /Decoding Decoding .dicttomark @@ -1645,7 +1630,7 @@ currentdict /postalias undef mark .ttkeys /NumGlyphs numloca - /TT_cmap cmaptab cmaparray + /TT_cmap cmaptab cmapdict % /file_table_pos file_table_pos /Decoding Decoding .dicttomark @@ -1767,9 +1752,8 @@ currentdict /postalias undef % <chartoglyphmap> <subcmap> <AGL> .pdfmapchars /CharStrings <charstrings> /.pdfmapchars { - exch cmaparray /cmapencoding exch def % c2g + exch cmapdict /cmapencoding exch def % c2g /CharStrings 0 dict % c2g /CS <<>> - % Add glyphs of <AGL>*<subcmap> : 3 2 roll { % /CS <<>> v dup type /arraytype eq { % /CS <<>> /name [] @@ -1806,13 +1790,12 @@ currentdict /postalias undef } forall dup /.notdef 0 put - } bind def % <subtable> .pdfmapsymbolic /Encoding [] /CharStrings <<>> /.pdfmapsymbolic { //true /.render_notdef gput - cmaparray + cmapdict dup length 1 add dict begin [ 64 { /.notdef /.notdef /.notdef /.notdef } repeat ] exch { % [] char glyph @@ -1845,7 +1828,7 @@ currentdict /postalias undef % The following algorithms are per the PDF 1.7 Reference. TTFDEBUG { (.pdfcharkeys beg) = } if - % if the flags say symbolic, *and* the font contains a symbol + % if the flags say symbolic, *and* the font contains a symbol or UCS-2 % cmap table, ignore Encoding if there is one, treat as symbolic. % If the flags say symbolic, and the font doesn't have a symbol cmap % and we have an Encoding, treat it as non-symbolic @@ -1853,7 +1836,20 @@ currentdict /postalias undef % Finally, if none of that works, remove the Encoding, and treat it % as non-symbolic. is_symbolic { - <00030000> .findcmap { //true } { prebuilt_encoding //null eq { <00010000> .findcmap}{//false}ifelse } ifelse { + <00030000> .findcmap + { //true } + { + prebuilt_encoding //null eq { + <00030001> .findcmap + {//true} + {<00010000> .findcmap} + ifelse + } + {//false} + ifelse + } ifelse + + { .pdfmapsymbolic /prebuilt_encoding //null def //false diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_type1.ps b/Master/tlpkg/tlgs/Resource/Init/gs_type1.ps index 772bb7163ff..dbd9bf38a44 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_type1.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_type1.ps @@ -116,7 +116,7 @@ { % scratch(string) RAGL(dict) AGL(dict) CharStrings(dict) cstring gname aglname CFFDEBUG { (\nsetting alias: ) print dup ==only ( to be the same as glyph: ) print 1 index //== exec } if - 3 index exch 3 index //.growput superexec + 3 index exch 3 index //.growput systemdict /superexec known {//superexec}{1183615869 internaldict /superexec get exec} ifelse % scratch(string) RAGL(dict) AGL(dict) CharStrings(dict) cstring gname } {pop} ifelse @@ -135,7 +135,7 @@ 3 1 roll pop pop } if pop - dup /.AGLprocessed~GS //true //.growput superexec + dup /.AGLprocessed~GS //true //.growput systemdict /superexec known {//superexec}{1183615869 internaldict /superexec get exec} ifelse } if %% We need to excute the C .buildfont1 in a stopped context so that, if there diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps index bdfe9ee8feb..f2ae2dec3ef 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps @@ -774,6 +774,11 @@ currentdict /no_debug_dict undef % When resolving an object reference, we stop at the endobj or endstream. /resolveopdict mark valueopdict { } forall + /xref { % Bug 697761 + ( **** Error: Encountered 'xref' while expecting 'endobj'.\n) pdfformaterror + ( Treating this as a missing 'endobj', output may be incorrect.\n) pdfformaterror + endobj exit + } bind /endstream { endobj exit } bind /endobj { endobj exit } bind /endjobj { % Bug 689876. @@ -786,9 +791,13 @@ currentdict /no_debug_dict undef ( Output may be incorrect.\n) pdfformaterror endobj exit } bind + /obj { % OmniForm generates PDF file with endobj missing in some % objects. AR ignores this. So we have to do it too. - /obj { pop pop endobj exit } bind + ( **** Error: Encountered 'obj' while expecting 'endobj'.\n) pdfformaterror + ( Treating this as a missing 'endobj', output may be incorrect.\n) pdfformaterror + pop pop endobj exit + } bind .dicttomark readonly def /resolveR { % <object#> <generation#> resolveR <object> @@ -849,12 +858,13 @@ currentdict /no_debug_dict undef dup type /dicttype eq % For dictionaries only { - dup /Type .knownget % make sure the dictionary has a type + dup /Type known % make sure the dictionary has a type { - dup /Font eq exch /FontDescriptor eq or % and ensure its a Font or FontDescriptor - {dup 3 -1 roll /.gs.pdfobj# exch put} - {exch pop} - ifelse + %% We must not add to *all* dictionaries, because some of them are handled by + %% executing all the key/value pairs, and adding a integer causes problems + %% Since we only use this number for font identification, or checking self-references, + %% we only need it for dictionaries with a Type, and these are always handled more carefully. + dup 3 -1 roll /.gs.pdfobj# exch put } {exch pop} ifelse @@ -889,11 +899,6 @@ currentdict /no_debug_dict undef % may have preceded the EOL, such as spaces or tabs. Thus we back up one % character and scan until we find the \n terminator. /stream { % <dict> stream <modified_dict> - dup /Length knownoget { - 0 eq { - dup /Filter undef % don't confuse any filters that require data - } if - } if dup /F known dup PDFsource PDFfile eq or { not { dup /File PDFfile put diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps index 88da2de7485..68a56a3674b 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps @@ -26,34 +26,6 @@ pdfdict begin % PDF graphics operations, even though this is too liberal. /drawopdict 100 dict def -/SetGroupExtGStateDict -<< - /AlphaIsShape //AIS - /FillConstantAlpha //ca - % We don't have to worry about the enumeration order, even - % with the color/space settings, since we only store, not - % not set them. - /FillColor //sc1 - /FillColorSpace { /FillColorSpace gput } bind - /FillOverprint //op - /SoftMask //SMask - /StrokeConstantAlpha //CA - /StrokeColor //SC1 - /StrokeColorSpace { /StrokeColorSpace gput } bind - /StrokeOverprint //OP - /TextSpacing //Tc - % We can't use //Tz as we've stored the value we actually use, - % not value * 100 (see /Tz in pdf_ops.ps) - /TextHScaling { /TextHScaling gput } bind - /Leading //TD - /TextFont { /TextFont gput} bind - /TextLineMatrix { /TextLineMatrix gput } bind - /TextMatrix { /TextMatrix gput } bind - /TextRise { /TextRise gput } bind - /TextRenderingMode { /TextRenderingMode gput } bind - /WordSpacing //Tw ->> def - % ================================ Graphics ================================ % % ---------------- Functions ---------------- % @@ -156,6 +128,20 @@ pdfdict begin 1 index /Default eq { exch pop } { pop resolveidfnproc } ifelse } bdef +%% A BBox where width or height (or both) is 0 should still paint one pixel +%% See the ISO 32000-2:2017 spec, section 8.7.4.3, p228 'BBox' and 8.7.3.1 +/FixPatternBBox +{ + dup aload pop + 3 index 2 index sub 0 eq { + 3 index 0.000001 add 3 -1 roll pop exch + } if + 2 index 1 index sub 0 eq { + 2 index 0.000001 add exch pop + }if + 5 -1 roll astore +}bind def + % ---------------- Shadings ---------------- % /shrdict mark @@ -177,6 +163,7 @@ pdfdict begin /BBox { dup dup dup aload pop normrect_elems 5 -1 roll astore + FixPatternBBox } bind /ColorSpace { resolvecolorspace @@ -472,6 +459,13 @@ end /AIS { AIS } /BM { BM } /TK { TK } + /UseBlackPtComp { UseBlackPtComp } + /HTO { + % PDF 2.0, supposed to be 'similar' to halftone phase but using a different + % co-ordiate system. Treat the same for now and fix if anyone ever complains. + aload pop transform cvi exch cvi exch 2 array astore + dup sethalftonephases .swapcolors sethalftonephases .swapcolors + } .dicttomark readonly def /gs { % <gsres> gs - Page /ExtGState rget { @@ -502,7 +496,8 @@ end dup /None eq 1 index //null eq or PDFusingtransparency not or { pop //null - SoftMask //null ne { + + .currentSMask //null ne { % get rid of the current SMask (Bug 695471) false % colorspace not set << /Subtype /None >> % Special type for this purpose @@ -558,18 +553,9 @@ end /GroupGState gstate currentgstate 6 2 roll grestore /GroupMat matrix currentmatrix 8 2 roll - /GroupExtGState 1 dict - //SetGroupExtGStateDict - { - exch dup where - { - exch get 2 index 3 1 roll put - } - { - pop pop - } ifelse - } forall - 10 2 roll +% /GroupExtGState 1 dict +% 10 2 roll + /.execmaskgroup cvx 2 packedarray cvx /Draw exch 3 2 roll pop .dicttomark @@ -634,48 +620,62 @@ def 3 -1 roll dup dup 4 1 roll /BBox get aload pop .begintransparencymaskgroup exch dup /Resources knownoget { oforce } { 2 dict } ifelse - 3 -1 roll dup /GroupGState .knownget { 2 index /GroupGState 3 -1 roll put} if - /GroupExtGState .knownget { 1 index /GroupExtGState 3 -1 roll put} if + 3 -1 roll /GroupGState .knownget { 1 index /GroupGState 3 -1 roll put} if exch //false resolvestream - 1 index exch .execgroup + 1 index exch + + %% Get the current colour space and colour values (as an array), we need to pass these to .execgroup + %% as well, so that it can restore them, in case the colour space gets changed by transparency + %% graphics state stuff. + mark currentcolor counttomark array astore exch pop + currentcolorspace 4 2 roll + + .execgroup % We have to remove these in case the Form XObject is subsequently used as % a form rather than a group - they remain in the paramdict for the SMask % so this will all still work if the SMask is re-evaluated. - dup /GroupGState undef - /GroupExtGState undef + /GroupGState undef + .endtransparencymask PDFfile exch setfileposition mark exch /OverrideICC exch .dicttomark setuserparams .setuseciecolor setcolorspace setcolor setmatrix end % restore colorspace, color and ExtGState (end) - /SoftMask where pop /SoftMask //true put % special setting to tell us it has been rendered + .currentSMask /Processed //true put % special setting to tell us it has been rendered } bdef % Paint a Form+Group XObject, either for a transparency mask or for a Do. -/.execgroup { % <resdict> <stream> .execgroup - +/.execgroup { % [colour values] <colour space> <resdict> <stream> .execgroup - pdfemptycount 3 1 roll - /pdfemptycount count 3 sub store + /pdfemptycount count 5 sub store gsave //nodict begin % We have to set the gstate correctly for lazy evaluation of a softmask group. - % we also must preserve the color(space) as setup in .execmaskgroup. + % we also must restore the color(space) as setup in .execmaskgroup or paintformgroup. % This stuff must be done here, as .execmaskgroup can't use gsave/grestore to % manipulate the gstates, due to the requirements of .begintransparencymaskgroup. % We also must set the ExtGState values. % It may seem redundant to do the color(space) twice (once here and once in % .execmaskgroup) but we have to set it in .execmaskgroup for the background % color and set it here once in the correct gstate. - mark currentcolor currentcolorspace counttomark 2 add index dup + 1 index /GroupGState .knownget { setgstate } if - /GroupExtGState .knownget { { exch exec } forall } if - setcolorspace setcolor pop + newpath //null SMask 1 .setopacityalpha 1 .setshapealpha 1 CA 1 ca /Compatible .setblendmode % Execute the body of the Form, similar to DoForm. - pdfopdict .pdfruncontext + pdfopdict + + %% Restore the colour space (passed in on the stack) and current colour + %% + 6 -2 roll + setcolorspace + aload pop setcolor + + .pdfruncontext end grestore /pdfemptycount exch store } bdef @@ -694,6 +694,11 @@ def % .paintgroupform implements the Form PaintProc in the case where the % Form XObject dictionary includes a Group key. See .paintform below. /.paintgroupform { % <resdict> <stream> <formdict> .paintgroupform - + %% Pass the current color space, and an array with the current color vales + %% as arguments to .execgroup + mark currentcolor counttomark array astore exch pop + currentcolorspace 5 2 roll + dup /Group oget exch /BBox oget % Stack: resdict stream groupdict bbox .beginformgroup @@ -730,7 +735,8 @@ def DataDict /Matte knownoget { /Matte exch def } if - AlphaIsShape { /ShapeMaskDict } { /OpacityMaskDict } ifelse exch def + .currentalphaisshape + { /ShapeMaskDict } { /OpacityMaskDict } ifelse exch def /ColorSpace DataDict /ColorSpace get def } bdef @@ -1055,13 +1061,16 @@ currentdict end readonly def } { % For uncolored patterns, we have to unbind the current % color and color space before running the PaintProc. - //null sc1 //null SC1 + % Not true since moving the ExtGState parameters into the gstate. + % //null sc1 //null SC1 } ifelse % Save old values on opstack, set pdfemptycount to new value. pdfemptycount countdictstack mark - /pdfemptycount count 3 sub def 5 3 roll + %% We can't simply 'def' into the dictionary saved by 'q' above, we need to + %% call gput to copy it and store inside it. Stupid or what.... + /pdfemptycount count 3 sub gput 5 3 roll % % Stack: ... <old emptycount> <dictcount> mark <patdict> <resdict> % | @@ -1074,11 +1083,51 @@ currentdict end readonly def { countdictstack 2 index le { exit } if currentdict /n known not or - Q - } loop { - ( **** Error: Pattern stream has unbalanced q/Q operators \(too many q's\)\n) - pdfformaterror - ( Output may be incorrect.\n) pdfformaterror + currentdict /n known currentdict /self known or{ + Q + }{ + (\n **** Error: File has unbalanced q/Q operators \(too many Q's\)\n Output may be incorrect.\n) + pdfdict /.Qqwarning_issued .knownget + { + { + pop + } + { + currentglobal pdfdict gcheck .setglobal + pdfdict /.Qqwarning_issued //true .forceput + .setglobal + pdfformaterror + } ifelse + } + { + currentglobal pdfdict gcheck .setglobal + pdfdict /.Qqwarning_issued //true .forceput + .setglobal + pdfformaterror + } ifelse + end + } ifelse + } loop + { + (\n **** Error: File has unbalanced q/Q operators \(too many q's\)\n Output may be incorrect.\n) + pdfdict /.Qqwarning_issued .knownget + { + { + pop + } + { + currentglobal pdfdict gcheck .setglobal + pdfdict /.Qqwarning_issued //true .forceput + .setglobal + pdfformaterror + } ifelse + } + { + currentglobal pdfdict gcheck .setglobal + pdfdict /.Qqwarning_issued //true .forceput + .setglobal + pdfformaterror + } ifelse } if pop @@ -1150,7 +1199,7 @@ currentdict end readonly def 2 index /Resources knownoget { oforce } { 0 dict } ifelse /.pdfpaintproc cvx ] cvx put - dup /BBox 2 copy knownoget { normrect put } { pop pop } ifelse + dup /BBox 2 copy knownoget { normrect FixPatternBBox put } { pop pop } ifelse dup /.pattern_uses_transparency 1 index patternusestransparency put PDFDEBUG { pdfdict /PDFSTEPcount .knownget { 1 le } { //true } ifelse { (%Pattern: ) print dup === flush } if } if } bdef @@ -1189,7 +1238,12 @@ drawopdict begin /sc { .incachedevice { .pdfcount { pop } repeat //ignore_color_op pdfformaterror } { - scresolve { sc*_and_set } { sc1_and_set } ifelse + scresolve 1 index //null eq { + pop pop + //ignore_color_op pdfformaterror + } { + { sc*_and_set } { sc1_and_set } ifelse + } ifelse } ifelse } bdef @@ -1233,7 +1287,12 @@ drawopdict begin /SC { .incachedevice { .pdfcount { pop } repeat //ignore_color_op pdfformaterror } { - scresolve { SC*_and_set } { SC1_and_set } ifelse + scresolve 1 index //null eq { + pop pop + //ignore_color_op pdfformaterror + }{ + { SC*_and_set } { SC1_and_set } ifelse + }ifelse } ifelse } bdef @@ -1300,7 +1359,7 @@ drawopdict begin setfillstate resolvesh //sh_save 0 save put PDFusingtransparency { - SoftMask //null ne { + .currentSMask //null ne { //sh_group 1 index /BBox knownoget { { oforce } forall @@ -1327,7 +1386,7 @@ drawopdict begin { .endtransparencygroup .setopacityalpha .setblendmode % end the CompatibleOverprint group } if - SoftMask //null ne { + .currentSMask //null ne { .endtransparencygroup } if } { @@ -1359,7 +1418,7 @@ end /CIEBasedABC { 1 get /RangeABC knownoget not { //01_3 } if } bind /CalGray { pop //01_1 } bind /CalRGB { pop //01_3 } bind - /Lab { 1 get /Range knownoget not { [-100 100 -100 100] } if } bind + /Lab { 1 get /Range knownoget not { [-100 100 -100 100] } {aload pop 0 100 6 2 roll 6 array astore}ifelse } bind /ICCBased { 1 oget dup /Range knownoget { exch pop @@ -2024,7 +2083,7 @@ currentdict /last-ditch-bpc-csp undef ColorSpace dup type /arraytype eq { 0 oget } if /Indexed eq BitsPerComponent 1 eq and { - % AR9 treats Indexed 1 bpc images specially. Bug 692852. + % AR9 treats Indexed 1 bpc images specially. Bug 692852 see also 697919 and 689717. dup 0 oget dup 0 lt exch 1 BitsPerComponent bitshift ge or { % First component is invalid - AR9 ignores the mask @@ -2037,7 +2096,33 @@ currentdict /last-ditch-bpc-csp undef % AR5, AR9 do this for most cases. Bug 690786. [ exch { 1 BitsPerComponent bitshift 1 sub and } forall ] } ifelse - } if + } { + ColorSpace dup type /arraytype eq { 0 oget } if /DeviceGray eq + BitsPerComponent 1 eq and { + %% For DeviceGray, try clamping the values to 0 and 1 respectively + dup 0 oget + dup 0 lt exch 1 gt or { + dup 0 oget + dup 0 lt { + pop dup 0 0 put + }{ + dup 0 1 put + } ifelse + } if + dup 1 oget + dup 0 lt exch 1 gt or { + dup 1 oget + dup 0 lt { + pop dup 0 0 put + }{ + dup 0 1 put + } ifelse + } if + }{ + % AR5, AR9 do this for most cases. Bug 690786. + [ exch { 1 BitsPerComponent bitshift 1 sub and } forall ] + } ifelse + } ifelse dup //null ne { /MaskColor exch def } { @@ -2089,7 +2174,7 @@ currentdict /last-ditch-bpc-csp undef .begintransparencymaskimage PDFfile fileposition exch gsave //nodict begin - //null /SoftMask gput + //null .setSMask 1 .setopacityalpha 1 .setshapealpha 1 CA 1 ca /Compatible .setblendmode @@ -2109,7 +2194,7 @@ currentdict /last-ditch-bpc-csp undef % on our lazy evaulation of SMask groups false << /Subtype /None >> 0 0 0 0 .begintransparencymaskgroup } { - SoftMask //null ne { + .currentSMask //null ne { % the image doesn't have an SMask, but the ExtGState does, force a group. << /Subtype /Group /Isolated //true >> 0 0 1 1 .begintransparencygroup doimage @@ -2128,6 +2213,44 @@ currentdict /last-ditch-bpc-csp undef } bdef } if +/ValidateDecode { % <<image dict>> -imagemask- ValidateDecode <<image dict>> + exch + dup /Decode .knownget { + dup length % -imagemask- <<image dict>> [Decode] length + 4 -1 roll % <<image dict>> [Decode] length -imagemask- + { + 1 % ImageMask Decode arrays must be [0 1] or [1 0] + } + { + mark currentcolor counttomark % <<image dict>> [Decode] length [ ... component_count + dup 2 add 1 roll % <<image dict>> [Decode] length component_count [ .... + cleartomark % <<image dict>> [Decode] length component_count + } ifelse + 2 mul dup % <<image dict>> [Decode] length comp_count*2 comp_count*2 + 3 1 roll % <<image dict>> [Decode] comp_count*2 length comp_count*2 + eq { % <<image dict>> length of Decode matches colour space requirement + pop pop % <<image dict>> remove [Decode] and comp_count*2 + }{ % <<image dict>> Decode array incorrect + dup 2 index length % <<image dict>> [Decode] comp_count*2 comp_count*2 length + exch sub 0 gt { % Decode is too long + (\n **** Warning: Decode array for an image is too long\n) pdfformatwarning + ( Output may be incorrect.\n) pdfformatwarning + 0 exch % <<image dict>> [Decode] 0 comp_count*2 + getinterval % <<image dict>> [subarray of Decode] + 1 index exch /Decode exch % <<image dict>> <<image dict>> /Decode [subarray] + put % <<image dict>> + }{ + % Decode is too short, Acrobat throws errors on this + (\n **** ERROR: Decode array for an image is too short\n) pdfformaterror + ( Output may be incorrect.\n) pdfformaterror + pop pop % remove [Decode] and comp_count*2 + } ifelse + } ifelse + } { + exch pop + }ifelse +}bdef + /doimage { % <imagemask> doimage - % imagedict is currentdict, gets popped from dstack //null checkOPtrans { @@ -2160,8 +2283,8 @@ currentdict /last-ditch-bpc-csp undef makemaskimage } if % Stack: datasource imagemask - { currentdict end setfillstate { imagemask } } - { ColorSpace setgcolorspace currentdict end setfillblend { image } } + { currentdict end setfillstate true ValidateDecode { imagemask } } + { ColorSpace setgcolorspace currentdict end setfillblend false ValidateDecode { image } } ifelse PDFSTOPONERROR { exec //false } { stopped } ifelse { dup type /dicttype eq { pop } if % Sometimes image fails to restore the stack @@ -2451,7 +2574,61 @@ currentdict end readonly def //ocg_pocs exch get exec % bool } ifelse } { - /OFF known not % OFF is inserted by process_trailer_attrs + dup /OFF known not % OFF is inserted by process_trailer_attrs + { + %% /OC is not in the OCProperties /OFF array, so we need to + %% test its usage. We may eventually have to add a /ON to the dictionary + %% if the OCProperties /ON array defines the /OC, I think that should override + % the Usage, but I don't have an example to test. + /Usage .knownget { + oforce + /Printed where { + /Printed get + } { + //false + }ifelse + { + %% We are behaving as a printer, check the Print state + /Print .knownget { + /PrintState .knownget { + oforce + /OFF eq { + //false + }{ + //true + } ifelse + }{ + //true + } ifelse + }{ + %% If we don't know, assume its visible + //true + } ifelse + }{ + %% We are behaving as a viewer, check the View state + /View .knownget { + oforce + /ViewState .knownget { + /OFF eq { + //false + }{ + //true + } ifelse + }{ + //true + } ifelse + }{ + %% If we don't know, assume its visible + //true + } ifelse + } ifelse + }{ + %% If we don't know, assume its visible + //true + } ifelse + }{ + pop //false + }ifelse } ifelse } { /OFF known not % OFF is inserted by process_trailer_attrs @@ -2480,30 +2657,72 @@ drawopdict begin } if setfillblend PDFfile fileposition exch % pos /Name - dup Page /XObject rget { - exch pop % pos obj - OFFlevels length 0 eq { - dup /OC knownoget { ocg-is-visible } { //true } ifelse - } { + + % Bug #698226, Acrobat signals an error for recursive XObjects in a PDF file + % but continues. This is true even if the XObject is not a simple self-reference + % (eg /Fm1 -> /Fm2 -> /Fm3 -> /Fm1). + % Normally when dealing with recursion we would put a dictionary on the stack, store the + % object numbers encoutnered in it, and check each new object number to see if we've + % already seen it. This doesn't work well for XObjects, because the operand stack can be + % in any state when we run a Do. So we make a new dictionary in pdfdict to hold the + % object numbers. + % We also don't usually know the object number of a Form, we just get given its name + % so we need a new routine to return the object number. This is because the parent XObject + % might reference teh object by one name, while the child references it by another, we + % can't permit clashes. + % + % Start by getting the object number for a Form XObject + dup Page /XObject obj_get dup 0 eq not { + % Now get the recording dictionary and see if that object number has been seen + pdfdict /Recursive_XObject_D get 1 index known { + ( **** Error: Recursive XObject detected, ignoring ") print 1 index 256 string cvs print (", object number ) print 256 string cvs print (\n) print + ( Output may be incorrect.\n) pdfformaterror //false - } ifelse { - dup /Subtype oget //xobjectprocs exch get % pos obj {proc} - % Don't leave extra objects on the stack while executing - % the definition of the form. - 3 -1 roll % obj {proc} pos - 2 .execn % pos + }{ + % We haven't seen it yet, so record it. + pdfdict /Recursive_XObject_D get 1 index null put + 3 1 roll + //true + }ifelse + } + { + % I don't think this should be possible, but just in case + ( **** Error: Unable to determine object number for ) print exch 256 string cvs print ( so ignoring it) print + ( Output may be incorrect.\n) pdfformaterror + //false + } ifelse + + % If we could get the object number, and we haven't already seen it, then execute it. + { + dup Page /XObject rget { + exch pop % pos obj + OFFlevels length 0 eq { + dup /OC knownoget { ocg-is-visible } { //true } ifelse + } { + //false + } ifelse { + dup /Subtype oget //xobjectprocs exch get % pos obj {proc} + % Don't leave extra objects on the stack while executing + % the definition of the form. + 3 -1 roll % obj {proc} pos + 2 .execn % pos + } { + pop % pos + } ifelse } { - pop % pos + % This should cause an error, but Acrobat Reader can + % continue, so we do too. + ( **** Error: Undefined XObject resource: ) + exch =string cvs concatstrings (\n) concatstrings + pdfformaterror + ( Output may be incorrect.\n) pdfformaterror } ifelse - } { - % This should cause an error, but Acrobat Reader can - % continue, so we do too. - ( **** Error: Undefined XObject resource: ) - exch =string cvs concatstrings (\n) concatstrings - pdfformaterror - ( Output may be incorrect.\n) pdfformaterror + PDFfile exch setfileposition + pdfdict /Recursive_XObject_D get exch undef + }{ + % Otherwise ignore it and tidy up the stacks + pop pop } ifelse - PDFfile exch setfileposition } bdef end @@ -2854,11 +3073,15 @@ end dup (BT ) writestring 1 index /DA fget not { 1 index /V fget { - <FEFF> anchorsearch{ - pop pop /FallBackFont /Identity-UTF16-H [/CIDFallBack] composefont 12 scalefont setfont - }{ + <EFBBBF> anchorsearch { pop /Helvetica findfont 12 scalefont setfont - } ifelse + } { + <FEFF> anchorsearch { + pop pop /FallBackFont /Identity-UTF16-H [/CIDFallBack] composefont 12 scalefont setfont + } { + pop /Helvetica findfont 12 scalefont setfont + }ifelse + }ifelse } if () }if @@ -2894,11 +3117,18 @@ end //false exch NeedAppearances { dup /FT fget { - /Tx eq { - dup /V oknown { - pop not 1 - } if - } if + dup /Tx eq { + pop + dup /V oknown { + pop not 1 + } if + } { + /Ch eq { + dup /V oknown { + pop not 1 + } if + } if + } ifelse } if } if pop @@ -2920,6 +3150,7 @@ end % dup /AP undef % } if % } if + dup /AP knownoget { dup /N known not { ( **** Error: Appearance dictionary (AP) lacks the mandatory normal (N) appearance.\n) @@ -3264,6 +3495,12 @@ currentdict /set_bc_color undef /emptydict 0 dict readonly def /Highlight { +% technically we should apply an appearance stream if we have one, but if we do +% some test files don't match Acrobat. PDF 2.0 says appearance streams are mandatory, +% and take precedence over generatig new ones, so we may need to revisit this. +% dup /AP oknown { +% //true +% }{ 0 setlinecap dup annotsetcolor { /QuadPoints knownoget { @@ -3287,6 +3524,7 @@ currentdict /set_bc_color undef } if } if //false +% } ifelse } bdef currentdict /emptydict undef currentdict /highlight-arc undef @@ -3402,7 +3640,7 @@ currentdict /set_bc_color undef { gsave - dup annotrect (rectclip from freetext annotation) == flush rectclip + dup annotrect rectclip dup /CA knownoget { .setopacityalpha @@ -3684,7 +3922,7 @@ currentdict /set_bc_color undef 2 index 2 div add exch 3 index 2 div add exch translate % dx dy - 50 div exch 190 div .min dup scale + 50 div exch 190 div .min dup 0.0 eq {pop 1.0} if dup scale /Name knownoget not { /Draft } if //stamp_dict 1 index known not { exch pop /Draft exch } if @@ -3700,24 +3938,124 @@ currentdict /set_bc_color undef } ifelse } bdef - currentdict /quadpoints2basis undef + /Popup { + dup /Open oknown { + dup /Open get { + dup /AP oknown { + //true + }{ + gsave + newpath + 0.05 setlinewidth + dup /Parent .knownget { + oforce + } { + dup /P .knownget { + oforce + } { + dup + } ifelse + } ifelse + /C .knownget { + aload pop + }{ + 1 1 0 + }ifelse + setrgbcolor + dup /Rect get + dup aload pop + 2 index sub + exch 3 index sub exch + 4 copy + gsave 1 setgray rectfill grestore + gsave 0 setgray rectstroke grestore + 1 index /Parent .knownget { + oforce + }{ + 1 index /P .knownget { + oforce + }{ + 1 index + } ifelse + }ifelse + dup + /Contents .knownget { + gsave + 0 setgray + /Helvetica findfont 9 scalefont setfont + 2 index aload pop 3 1 roll pop pop 30 sub exch 5 add exch + moveto show + grestore + } if + exch + dup aload pop 3 -1 roll pop exch 2 index sub -15 + 4 copy rectfill + 0 setgray rectstroke + exch + /T .knownget { + gsave + 0 setgray + /Helvetica findfont 9 scalefont setfont + dup stringwidth pop + 2 index aload pop pop exch pop exch sub + exch sub 2 div 2 index aload pop 3 1 roll pop pop 11 sub 3 1 roll add exch moveto + show + grestore + } if + grestore + //false + } ifelse + } { + pop //false + }ifelse + } { + pop //false + }ifelse + } bdef + +currentdict /quadpoints2basis undef currentdict end readonly def +/.PDFDrawAnnotType? +{ + //false exch + /ShowAnnotTypes where + { + /ShowAnnotTypes get + { + dup /* eq exch 2 index eq or + { + pop //true exch + exit + } if + } forall + pop + } + {pop pop //true} + ifelse +} bind def + /drawannot { % <annot> drawannot - dup annotvisible { gsave dup dup /Subtype knownoget { - //drawannottypes exch .knownget { exec } { //true } ifelse + dup //.PDFDrawAnnotType? exec { - dup calc_annot_scale 2 copy mul 0 ne - { - 3 -1 roll drawwidget - } + //drawannottypes exch .knownget { exec } { //true } ifelse { - ( **** Error: ignoring annotation with scale factor of 0\n) pdfformaterror - ( Output may be incorrect.\n) pdfformaterror - }ifelse % Draw rejected annots as widgets - } if % type known + dup calc_annot_scale 2 copy mul 0 ne + { + 3 -1 roll drawwidget + } + { + ( **** Error: ignoring annotation with scale factor of 0\n) pdfformaterror + ( Output may be incorrect.\n) pdfformaterror + }ifelse % Draw rejected annots as widgets + } if % type known + } + { + pop + }ifelse } { pop ( **** Error: Ignoring /Annot dict without required /Subtype entry.\n) @@ -3909,17 +4247,22 @@ currentdict end readonly def dup annotvisible { gsave dup dup /Subtype knownoget { - //preserveannottypes exch .knownget { exec } { //true } ifelse + dup //.PDFDrawAnnotType? exec { - dup calc_annot_scale 2 copy mul 0 ne - { - 3 -1 roll drawwidget - } + //preserveannottypes exch .knownget { exec } { //true } ifelse { - ( **** Error: ignoring annotation with scale factor of 0\n) pdfformaterror - ( Output may be incorrect.\n) pdfformaterror - }ifelse % Draw rejected annots as widgets - } if % type known + dup calc_annot_scale 2 copy mul 0 ne + { + 3 -1 roll drawwidget + } + { + ( **** Error: ignoring annotation with scale factor of 0\n) pdfformaterror + ( Output may be incorrect.\n) pdfformaterror + }ifelse % Draw rejected annots as widgets + } if + } + {pop} ifelse + % type known } { pop ( **** Error: Ignoring /Annot dict without required /Subtype entry.\n) @@ -3931,6 +4274,7 @@ currentdict end readonly def } bdef currentdict /preserveannottypes undef +currentdict /.PDFDrawAnnotType? undef % ============================ AcroForm fields ============================ % @@ -4013,8 +4357,8 @@ currentdict /preserveannottypes undef { 1 index exch write== } forall dup 3 index /MaxLen pget not { 0 } if write= dup 3 index /V pget not { - 3 index /DV pget not { () } if write== - } if + 3 index /DV pget not { () } if + } if write== dup 3 index /Ff pget not { 0 } if write= dup 3 index /Q pget not { 0 } if write= dup (Tform ET) write= @@ -4026,7 +4370,51 @@ currentdict /preserveannottypes undef } bdef /Ch { - (Ch is not yet implemened) //== exec + dup /AP known 3 index /NeedAppearances knownoget not { //true } if not and { + dup 1 1 3 -1 roll drawwidget + } { + %% If we don't have a NeedApperances, treat as true, because Acrobat + %% always regenerates Appearances anyway. + 2 index /NeedAppearances knownoget not { //true } if { + dup /AP << /N 10 dict dup cvx begin >> put + /Subtype /Form def + /BBox [ 0 0 4 index /Rect oget { oforce } forall 3 -1 roll sub abs 3 1 roll sub abs exch ] def + /Resources 3 index /DR pget not { 0 dict } if def + /File 1000 string dup 3 1 roll def + /Length 1000 def + % <acroform> <field> <annot> (string) + /NullEncode filter % <acroform> <field> <annot> file + + dup (BT ) writestring + 2 index /DA pget not { () } if + [ exch + { token { + dup /Tf eq { + 2 index 0 eq { + /BBox load 3 get + 0.75 mul % empirical constant + 4 -1 roll pop 3 1 roll + } if + } if + exch + } { + exit + } ifelse + } loop + ] + { 1 index exch write== } forall + dup 3 index /MaxLen pget not { 0 } if write= + dup 3 index /V pget not { + 3 index /DV pget not { () } if + } if write== + dup 3 index /Ff pget not { 0 } if write= + dup 3 index /Q pget not { 0 } if write= + dup (Tform ET) write= + end + closefile % <acroform> <field> <annot> + dup 1 1 3 -1 roll drawwidget + } if + } ifelse } bdef /Sig { diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps index 7060dbce6f0..02a3b0f6602 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps @@ -268,7 +268,6 @@ currentdict /known_symbolic_fonts undef /getfontmetrics { % <font-resource> <font> <Encoding|null> getfontmetrics % <font-resource> <font> <Encoding|null> % <Metrics|null> <GlyphMap|null> - 2 index /Widths oknown { dup //null eq { pop dup /Encoding get } if 7 dict begin @@ -871,7 +870,9 @@ setglobal { 0 1 2 index length 1 sub { - dup 2 index exch get dup 0 gt % We ignore entries of zero in the widths array + dup 2 index exch get + dup type /packedarraytype eq {exec} if % Handle entries which are indirect references (seriously ? !!) + dup 0 gt % We ignore entries of zero in the widths array { exch 5 index add % add FirstChar to the idx to get a char code dup 64 gt 1 index 91 lt and % we only want to consider A~Z and.... @@ -986,48 +987,62 @@ setglobal .dicttomark readonly def % When Type 1 font reading procedure is executing, a copy of this dictionary is current. -% We have to do something special about embedded fonts that execute definefont -% more than once -- that is the function of topFontDict. +% topFontDict allows us to *attempt* to handle the case where a Type 1 font definition +% does not start by creating it's own dictionary (i.e. a number of the keys end up in +% the currentdict rather than the font dictionary). % The whole type1 stream can be executed directly. There's no need to process % Length1, 2, 3 keys. /readtype1dict 10 dict dup begin - /definefont { - exch pop + /prev_definefont /definefont load def - /topFontDict where { - { /FontType % in PLRM order - /FontMatrix - /FontName - /FontInfo - /WMode - /Encoding - /FontBBox - /UniqueID - /XUID - /PaintType - /StrokeWidth - /Metrics - /Metrics2 - /CDevProc - /CharStrings - /Private - /WeightVector - } { - 2 copy .knownget { - % Stack: font topFontDict /key val - 3 index 3 1 roll put + /definefont { + % if a font defines any keys outside it's own dictionary, + % this attempts to cope by copying them into the font dictionary + [ + /FontType % in PLRM order + /FontMatrix + /FontName + /FontInfo + /WMode + /Encoding + /FontBBox + /UniqueID + /XUID + /PaintType + /StrokeWidth + /Metrics + /Metrics2 + /CDevProc + /CharStrings + /Private + /WeightVector + ] + { + 2 copy known + {pop} + { + dup where + { + 1 index get + 2 index + 3 1 roll put dup /MisplacedKey 0 put - } { - pop - } ifelse - } forall - /MisplacedKey known { - ( **** Warning: Type 1 font defines some of the keys in the external scope.\n) - pdfformatwarning - } if + } + {pop} ifelse + } ifelse + } forall + dup /MisplacedKey known { + ( **** Warning: Type 1 font defines some required keys outside the font dictionary.\n) + pdfformatwarning } if + dup /CharStrings get /.notdef known not { + dup /CharStrings get + /.notdef <9E35CED7FFD3622F09> put + ( **** Warning: Type 1 font has no /.notdef entry in /CharString dictionary.\n) + pdfformatwarning + } if dup /UniqueID .knownget { dup dup 0 lt exch 16#ffffff gt or { ( **** Warning: Ignoring invalid /UniqueID = ) exch =string cvs @@ -1037,17 +1052,11 @@ setglobal pop } ifelse } if - dup /CharStrings get /.notdef known not { - dup /CharStrings get - /.notdef <9E35CED7FFD3622F09> put - ( **** Warning: Type 1 font has no /.notdef entry in /CharString dictionary.\n) - pdfformatwarning - } if - .completefont + prev_definefont } bdef /undef_proc_warning { - /Repaired //true store % flag that we have warnings + /Repaired //true store % flag that we have warnings UndefProcList exch 2 copy .knownget { 1 add } { 1 } ifelse put } bdef @@ -1182,18 +1191,48 @@ currentdict /eexec_pdf_param_dict .undef % the character code to access the Widths. /BuildChar { % Stack: font charcode - 1 index begin 3 dict begin + 1 index begin 4 dict begin /Font 3 -1 roll def /CharCode 1 index def Encoding exch get CharProcs exch knownoget { - { //false resolvestream + dup /Length get 0 eq { + pop + %% Detect a 0 length stream. If this occurs + %% then we won't execute d0 or d1, and so won't adjust the + %% character width. So, pretend we got a + %% null d1, just so that we can adjust using the /Widths + %% (Bug 697805) + 0 0 0 0 0 0 + pdfopdict /d1 get exec + }{ + { //false resolvestream % Stack: filepos stream % Don't let setgcolor set the color inside the BuildGlyph % procedure, because this causes an /undefined error. - q //null /FillColor gput //null /StrokeColor gput - Font /Resources get exch pdfopdict .pdfruncontext - Q - } PDFfile fileposition 2 .execn % Keep pdfcount valid. - PDFfile exch setfileposition + q + %% This is (currently) needed to make sure that the current dictionary, which is + %% 'nodict' because we did a gsave, is writeable. If we don't execute gput + %% to make a writeable copy then it is a no access dicitonary and the 'def' + %% below will fail. It would be nice to fix the cases of this someday, but + %% we use 'nodict'[ to store other PDF state stuff that isn't gstate, and we + %% probably always will, so it may well be more trouble than its worth. + /Dummy false gput + Font /Resources get exch pdfopdict + /BuildCharDictDepth countdictstack def + .pdfruncontext + countdictstack BuildCharDictDepth sub + { + pdfdict /.Qqwarning_issued .knownget {not}{//true} ifelse + { + (\n **** Warning: Type 3 glyph has unbalanced q/Q operators \(too many q's\)\n Output may be incorrect.\n) + pdfformatwarning + pdfdict /.Qqwarning_issued //true .forceput + } if + Q + } repeat + Q + } PDFfile fileposition 2 .execn % Keep pdfcount valid. + PDFfile exch setfileposition + } ifelse } { % PDF Type 3 fonts don't use .notdef % d1 implementation adjusts the width as needed @@ -2282,12 +2321,7 @@ currentdict /bndef undef % in multipage documents. /patch_font_XUID % <font dict> <patch> patch_font_XUID <font dict'> { - %% Allow users to specify that we should not care about font object numbers - %% that is, don't patch the XUID with the object number and filename. - /PDFDontUseFontObjectNum where {/PDFDontUseFontObjectNum get}{//false}ifelse - %% Do not modify the XUID if we don't have an object number (see above) - 1 index //null eq - or + dup //null eq {pop} { pdfdict /InputPDFFileName .knownget {.CRCHashFilenameAndObject} if diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps index 85b5848e160..a16f5806734 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps @@ -85,6 +85,9 @@ pdfdict begin pdfformaterror ( Output may be incorrect.\n) pdfformaterror } bind + + /Recursive_XObject_D 1 dict def + .dicttomark readonly def % ======================== Main program ======================== % @@ -948,9 +951,17 @@ currentdict /xref-char-dict undef %% Bug #695883 the test file has an XRefStm which points beyond the end of the file. %% We check that here and simply fall back to thje classic xref if this error occurs. dup PDFfilelen lt{ - readpdf15xref pop + PDFSTOPONERROR not { + mark exch {readpdf15xref pop} stopped + { + ( **** Error: This hybrid file's XRefStm does not point to a valid stream.\n Ignoring error, output may be incorrect.\n) pdfformaterror + } if + cleartomark + } { + readpdf15xref pop + } ifelse } { - ( **** Error: This hybrid file's XRefStm points beyond the end of file.\n Ignoring error, output may be incorrect.\n) pdfformaterror + ( **** Error: This hybrid file's XRefStm points beyond the end of file.\n Ignoring error, output may be incorrect.\n) pdfformaterror pop }ifelse } if @@ -1129,7 +1140,37 @@ currentdict /xref-char-dict undef ( **** ) stderrprint stderrprint } ifelse } ifelse - } if + } { + % If the user told us to use a named OutputIntent + systemdict /UseOutputIntent .knownget { + cvn + Trailer /Root oget /OutputIntents knownoget { + { + dup /OutputConditionIdentifier get cvn + dup /Custom eq { + pop + dup /Info get cvn + }if + 2 index eq { + %% Found the required OutputIntent + /DestOutputProfile knownoget { + [ /ICCBased 3 -1 roll ] ICCBased-resolve + 1 get .set_outputintent + () + } if + pop + exit + }{ + pop + } ifelse + } + forall + pop + }{ + pop + }ifelse + } if + }ifelse Trailer /Root knownoget { /PageLabels knownoget { %% Currenlty only the pdfwrite device can handle PageLabels %% because we deal with these using putparams, not pdfmarks @@ -1283,6 +1324,8 @@ currentdict /xref-char-dict undef % Read any previous cross-reference tables. When we are done, % verify that the entries in the xref tables are valid if NoVerifyXref % is not defined. + /PrevArray [] def % Empty array, we use this to detect circular /Prev entries in xref (see below) + % For some reqason, leaving this on the stack messes up seom files. Trailer { /Prev knownoget not { % If no previous xref table then ... Classic-xref { @@ -1290,10 +1333,43 @@ currentdict /xref-char-dict undef } if exit } if + + %% This code is used to detect circular references in xref tables. Every time + %% we detect a /Prev in the xref, we check the given offset of the /Prev xref + %% against a list of all previously encountered /Prev offsets. If we find that + %% we have previously seen this one, we raise an error, stop processing the xref + %% but carry on with the PDF file (unless PDFSTOPONERROR is true). + //false exch PrevArray %% Used to determine if the looop found a circular ref + { %% //false offset 'array entry' + 1 index eq { + exch pop //true exch %% We've seen this offset before, pop the false and replace with true + exit %% //true offset + } if + } forall + + exch %% [...] offset bool + { + (\n **** Error: Circular /Prev entry while reading xref.\n Aborting xref read, output may be incorrect.\n) + pdfformaterror + PDFSTOPONERROR { + /readxref /syntaxerror cvx signalerror + } if + pop exit %% [...] and then exit this loop + } if + + PrevArray dup %% offset [...] [...] + length 1 add array %% offset [...] [ ] + dup 3 1 roll %% offset [ ] [...] [ ] + copy pop %% offset [... ] + dup dup length 1 sub %% offset [... ] [... ] index + 3 index %% offset [... ] [... ] index offset + put /PrevArray exch def + { readxref } PDFSTOPONERROR not { .internalstopped { recover_xref_data % Read failed. Attempt to recover xref data. + /PrevArray where {/PrevArray undef} if %% remove the array we were using to detect circular references exit % Exit loop since recover gets all obj data. } if % If readxref stopped } { @@ -1312,6 +1388,7 @@ currentdict /xref-char-dict undef } ifelse } forall } loop % Loop to previous trailer + /PrevArray where {/PrevArray undef} if %% remove the array we were using to detect circular references } if /NumObjects Objects length def % To check that obj# < NumObjects @@ -1584,10 +1661,32 @@ currentdict /xref-char-dict undef { 2 copy knownoget { exch pop exch pop //true } - { exch /Parent knownoget - { exch pget } + { + %% Check to see if there's a Parent + 1 index + 3 1 roll + exch /Parent knownoget + { + %% If there is a Parent, check to see if this dictionary has a stored object number + 3 -1 roll /.gs.pdfobj# .knownget { + %% if it does, check the Parent as wwell + 1 index /.gs.pdfobj# .knownget { + %% Both have object numbers, are they the same (ie its self-referencing) + eq { + pop pop + //false + }{ + exch pget + }ifelse + }{ + pop exch pget + }ifelse + } { + exch pget + }ifelse + } % finally see if the key is (misplaced) in the Root Catalog dict - { dup Trailer /Root oget exch knownoget dup { + { exch pop dup Trailer /Root oget exch knownoget dup { 3 -1 roll ( **** Error: The /) pdfformaterror 50 string cvs pdfformaterror ( key is missing from the Page tree.\n) pdfformaterror ( Output may be incorrect.\n) pdfformaterror @@ -1600,6 +1699,30 @@ currentdict /xref-char-dict undef ifelse } bind def +/obj_get { + LocalResources 1 index knownoget { + dup 4 index known { + 3 index get + 0 get 4 1 roll pop pop pop + } if + } { + 1 index /Resources pget { + 1 index knownoget { + dup 4 index known { + 3 index get + 0 get 4 1 roll pop pop pop + }{ + pop pop pop 0 + }ifelse + }{ + pop pop pop 0 + } ifelse + } { + pop pop pop 0 + }ifelse + }ifelse +}bind def + % Get the value of a resource on a given page. /rget { % <resname> <pagedict> <restype> rget <value> -true- % <resname> <pagedict> <restype> rget -false- @@ -2109,14 +2232,61 @@ end readonly def /MediaBox exch get_media_box pop } { oforce_elems % <<pdict>> /SomeBox x0 y0 x1 y1 + %% Complicated stuff. We need to use the 'Box' we identified (if any), but we + %% need to clamp the boundaries of the 'Box' to the MediaBox. This appears to + %% be what Acrobat does. The complication arises because the Box values don't + %% have to be sensibly positive, its permissible to have the MediaBox set up + %% so that it extends down and left instead of up and right. We take care of the + %% content when we st up the CTM, but we do need to make sure that we clamp + %% the BoundingBox, and that means we need to take direcitonality into account... + 6 -1 roll get_media_box { % /SomeBox x0 y0 x1 y1 [MediaBox] aload pop % /SomeBox x0 y0 x1 y1 X0 Y0 X1 Y1 - 5 -1 roll .min exch % /SomeBox x0 y0 x1 X0 Y0 mY1 X1 - 5 -1 roll .min exch % /SomeBox x0 y0 X0 Y0 mX1 mY1 - 4 2 roll % /SomeBox x0 y0 mX1 mY1 X0 Y0 - 5 -1 roll .max exch % /SomeBox x0 mX1 mY1 mY0 X0 - 5 -1 roll .max exch % /SomeBox mX1 mY1 mX0 mY0 - 4 2 roll % /SomeBox mX0 mY0 mX1 mY1 + + %% Start with the width, get the X0 and X1 values of the MediaBox + 3 index % /SomeBox x0 y0 x1 y1 X0 Y0 X1 Y1 X0 + 2 index % /SomeBox x0 y0 x1 y1 X0 Y0 X1 Y1 X0 X1 + gt { + %% Media extends to left + 4 -1 roll % /SomeBox x0 y0 x1 y1 Y0 X1 Y1 X0 + 8 -1 roll % /SomeBox y0 x1 y1 Y0 X1 Y1 X0 x0 + .min % /SomeBox y0 x1 y1 Y0 X1 Y1 mX0 + 7 1 roll % /SomeBox mX0 y0 x1 y1 Y0 X1 Y1 + exch % /SomeBox mX0 y0 x1 y1 Y0 Y1 X1 + 5 -1 roll % /SomeBox mX0 y0 y1 Y0 Y1 X1 x1 + .max % /SomeBox mX0 y0 y1 Y0 Y1 mX1 + 5 1 roll % /SomeBox mX0 mX1 y0 y1 Y0 Y1 + }{ + %% Media extends to right + 4 -1 roll % /SomeBox x0 y0 x1 y1 Y0 X1 Y1 X0 + 8 -1 roll % /SomeBox y0 x1 y1 Y0 X1 Y1 X0 x0 + .max % /SomeBox y0 x1 y1 Y0 X1 Y1 mX0 + 7 1 roll % /SomeBox mX0 y0 x1 y1 Y0 X1 Y1 + exch % /SomeBox mX0 y0 x1 y1 Y0 Y1 X1 + 5 -1 roll % /SomeBox mX0 y0 y1 Y0 Y1 X1 x1 + .min % /SomeBox mX0 y0 y1 Y0 Y1 mX1 + 5 1 roll % /SomeBox mX0 mX1 y0 y1 Y0 Y1 + } ifelse + + %% Now deal with the height + 2 copy % /SomeBox mX0 mX1 y0 y1 Y0 Y1 Y0 Y1 + gt { + %% Media extends down + exch % /SomeBox mX0 mX1 y0 y1 Y1 Y0 + 4 -1 roll % /SomeBox mX0 mX1 y1 Y1 Y0 y0 + .min % /SomeBox mX0 mX1 y1 Y1 mY0 + 3 1 roll % /SomeBox mX0 mX1 mY0 y1 Y1 + .max % /SomeBox mX0 mX1 mY0 mY1 + }{ + %% Media extends up + exch % /SomeBox mX0 mX1 y0 y1 Y1 Y0 + 4 -1 roll % /SomeBox mX0 mX1 y1 Y1 Y0 y0 + .max % /SomeBox mX0 mX1 y1 Y1 mY0 + 3 1 roll % /SomeBox mX0 mX1 mY0 y1 Y1 + .min % /SomeBox mX0 mX1 mY0 mY1 + } ifelse + exch % /SomeBox mX0 mX1 mY1 mY0 + 3 1 roll % /SomeBox mX0 mY0 mX1 mY1 } { pop } ifelse @@ -2268,6 +2438,37 @@ currentdict /PDF2PS_matrix_key undef % is not actually used on the page. currentpagedevice /PageSpotColors known { /PageSpotColors 2 index countspotcolors def } if + % If the user told us to use a named OutputIntent + systemdict /UseOutputIntent .knownget { + cvn + % Check to see if this page has such an OutputIntent + 2 index /OutputIntents knownoget { + { + dup /OutputConditionIdentifier get cvn + dup /Custom eq { + pop + dup /Info get cvn + }if + 2 index eq { + %% Found the required OutputIntent + /DestOutputProfile knownoget { + [ /ICCBased 3 -1 roll ] ICCBased-resolve + 1 get .set_outputintent + () + } if + pop + exit + }{ + pop + } ifelse + } + forall + pop + }{ + pop + }ifelse + } if + % Let the device know if we will be using PDF 1.4 transparency. % The clist logic may need to adjust the size of bands. 1 index pageusestransparency /PageUsesTransparency exch def @@ -2541,7 +2742,22 @@ currentdict /PDF2PS_matrix_key undef } { dup //false exch { 4 dict 1 index resourceusestransparency { pop not exit } if - /Parent knownoget not { exit } if + %% Check the current dictionary and its Parent (if any) to see + %% if they both have stored object numbers. If they do then + %% check the numbers, don't allow self-references. + dup /Parent knownoget not { pop exit } + { + exch /.gs.pdfobj# .knownget + { + 1 index /.gs.pdfobj# .knownget { + eq { + pop exit + }if + }{ + pop + }ifelse + }if + } ifelse } loop % Also check for transparency in the annotation (if not in resources). { pop //true } { annotsusetransparency } ifelse @@ -2884,74 +3100,87 @@ currentdict /PDF2PS_matrix_key undef } if } bind def -%%<Objectdict> <calling obj_num> pdfform_detect_cspacesub <boolean> +%% <loopdict> <Objectdict> <calling obj_num> pdfform_detect_cspacesub <boolean> %% /pdf_object_detect_cspacesub { - exch %% <calling obj_num> <Objectdict> - dup pdf_colorspace_detect_cspacesub { - pop //true - }{ %% <calling obj_num> <Objectdict> - /Resources knownoget { %% <calling obj_num> <Resourcesdict> - /XObject knownoget { %% <calling obj_num> <XObjectdict> - //false exch %% <calling obj_num> <XObjectdict> false - %% We have files where the XObject Resource is not a dictionary - dup type /dicttype eq { %% <calling obj_num> <XObjectdict> false - - %% check each Xobject entry in the dictionary, - %% forall purs a key/value pair on the stack for us. - %% - { %% <calling obj_num> <XObjectdict> false key value - exch pop %% <calling obj_num> <XObjectdict> false value - - %% If this is an indirect reference, check if its the smae object - %% as the current one. If its not indirect, make the object number 0 - %% for comparison purposes. - dup type /packedarraytype eq { - dup 0 get dup 4 index - eq - } { - 0 false - }ifelse + %% use loop operator for an exitable context + %% we need this to detect recursion/looping + { + exch %% <loopdict> <calling obj_num> <Objectdict> + dup pdf_colorspace_detect_cspacesub { + pop pop //true exit + }{ %% <loopdict> <calling obj_num> <Objectdict> + /Resources knownoget { %% <loopdict> <calling obj_num> <Resourcesdict> + 2 index 1 index known { + %% We've already seen this object, ignore it and exit + pop pop //false exit + }{ + 2 index 1 index //null put + } ifelse - %% <calling obj_num> <XObjectdict> false value <form object or 0 if not indirect> <boolean> - not { - %% swap object number and value, and dereference value - exch oforce - %% Apparently we have files where the content of the XObject Resource dictionary is null - dup //null ne { - %% and files where the indivudal XObjects are not dictionaries - dup type /dicttype eq { - dup /Subtype get /Form eq { - exch - pdf_object_detect_cspacesub { - pop //true exit - } if - } { + /XObject knownoget { %% <loopdict> <calling obj_num> <XObjectdict> + //false exch %% <loopdict> <calling obj_num> <XObjectdict> false + %% We have files where the XObject Resource is not a dictionary + dup type /dicttype eq { %% <loopdict> <calling obj_num> <XObjectdict> false + + %% check each Xobject entry in the dictionary, + %% forall purs a key/value pair on the stack for us. + %% + { %% <loopdict> <calling obj_num> <XObjectdict> false key value + exch pop %% <loopdict> <calling obj_num> <XObjectdict> false value + + %% If this is an indirect reference, check if its the smae object + %% as the current one. If its not indirect, make the object number 0 + %% for comparison purposes. + dup type /packedarraytype eq { + dup 0 get dup 4 index + eq + } { + 0 false + }ifelse + + %% <calling obj_num> <XObjectdict> false value <form object or 0 if not indirect> <boolean> + not { + %% swap object number and value, and dereference value + exch oforce + %% Apparently we have files where the content of the XObject Resource dictionary is null + dup //null ne { + %% and files where the indivudal XObjects are not dictionaries + dup type /dicttype eq { + dup /Subtype get /Form eq { + exch + 4 index 3 1 roll pdf_object_detect_cspacesub { + pop //true exit + } if + } { + pop pop + }ifelse + }{ pop pop - }ifelse + } ifelse }{ pop pop - } ifelse + } + ifelse }{ pop pop - } - ifelse - }{ - pop pop - } ifelse - } forall - }{ - pop + } ifelse + } forall + }{ + pop + }ifelse + } { + %% No forms, so can't be any Default* spaces + //false }ifelse } { - %% No forms, so can't be any Default* spaces //false - }ifelse - } { - //false + } ifelse } ifelse - } ifelse - %% Remove the calling object ID, return our boolean + %% Remove the calling object ID, return our boolean + exch pop exit + } loop + %% remove and discard the loopdict exch pop } bind def @@ -2966,12 +3195,11 @@ currentdict /PDF2PS_matrix_key undef % not using UseCIEColor with pdfwrite. % /pdfshowpage_detect_cspacesub { - dup 0 pdf_object_detect_cspacesub + dup 0 1 dict 3 1 roll pdf_object_detect_cspacesub /HighLevelDevice /GetDeviceParam .special_op { exch pop not exch pop }if - } bind def % @@ -3110,3 +3338,36 @@ currentdict /PDF2PS_matrix_key undef end % pdfdict .setglobal + +DELAYBIND not { +%% This list of operators are used internally by various parts of the Ghostscript PDF interpreter. +%% Since each operator is a potential security vulnerability, and any operator listed here +%% is not required once the initislisation is complete and functions are bound, we undefine +%% the ones that aren't needed at runtime. +[ +/.pdfawidthshow /.pdfwidthshow +/.setfillcolor /.setfillcolorspace /.setstrokecolor /.setstrokecolorspace /.currentrenderingintent /.setrenderingintent +/.currenttextrenderingmode /.settextspacing /.currenttextspacing /.settextleading /.currenttextleading +/.settextrise /.currenttextrise /.setwordspacing /.currentwordspacing /.settexthscaling /.currenttexthscaling +/.settextlinematrix /.currenttextlinematrix /.currenttextmatrix /.settextmatrix /.currentblendmode +/.currentopacityalpha /.currentshapealpha /.currenttextknockout +/.pushextendedgstate /.popextendedgstate /.begintransparencytextgroup +/.endtransparencytextgroup /.begintransparencymaskgroup /.begintransparencymaskimage /.endtransparencymask /.image3x +/.abortpdf14devicefilter /.pdfinkpath /.pdfFormName /.setstrokeconstantalpha +/.setfillconstantalpha /.setalphaisshape /.currentalphaisshape +/.settextspacing /.currenttextspacing /.settextleading /.currenttextleading /.settextrise /.currenttextrise +/.setwordspacing /.currentwordspacing /.settexthscaling /.currenttexthscaling + +% Used by our own test suite files +%/.pushpdf14devicefilter % transparency-example.ps +%/.poppdf14devicefilter % transparency-example.ps +%/.setopacityalpha % transparency-example.ps +%/.setshapealpha % transparency-example.ps +%/.endtransparencygroup % transparency-example.ps + +% undefining these causes errors/incorrect output +%/.settextrenderingmode /.setblendmode /.begintransparencygroup /.settextknockout /check_r6_password /.setstrokeoverprint /.setfilloverprint +%/.currentstrokeoverprint /.currentfilloverprint /.currentfillconstantalpha /.currentstrokeconstantalpha +] +{systemdict exch .undef} forall +} if diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps index ba53b54cd7e..fabef68a90a 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps @@ -211,76 +211,69 @@ currentdict /gput_always_allow .undef } ifelse } bdef -% Save most of graphic state attributes. -% - get-gs-attrs ... -/get-gs-attrs { - currentsmoothness - currentflat - currentoverprint - currentstrokeadjust - currentdash - currentmiterlimit - currentlinejoin - currentlinecap - currentlinewidth - currentfont - currentcolor - currentcolorspace - { currentpoint } stopped - matrix currentmatrix -} bdef - -% Restore most of graphic state attributes. -% ... get-gs-attrs - -/set-gs-attrs { - setmatrix - { newpath } { moveto } ifelse - setcolorspace - setcolor - setfont - setlinewidth - setlinecap - setlinejoin - setmiterlimit - setdash - setstrokeadjust - setoverprint - setflat - setsmoothness -} bdef - % ---------------- Color setting ---------------- % -/fcput % <color> <colorspace> fcput - - { /FillColorSpace gput /FillColor gput - } bdef -/scput % <color> <colorspace> scput - - { /StrokeColorSpace gput /StrokeColor gput - } bdef -/csput % <colorspace> csput - - { csset 2 copy fcput scput - } bdef - -/csdevgray [/DeviceGray] readonly def -/csdevrgb [/DeviceRGB] readonly def -/csdevcmyk [/DeviceCMYK] readonly def -/cspattern [/Pattern] readonly def /nullpatternproc { pop } bdef /nullpattern mark /PatternType 1 /PaintType 1 /TilingType 3 /BBox [0 0 1 1] /XStep 1 /YStep 1 /PaintProc //nullpatternproc .dicttomark readonly def -% Each entry in the color space dictionary is a procedure of the form -% <cspace> -proc- <cspace> <initial-color> +/PDFsetpattern { + % Since multiple patterns may share + % same data stream, we need to ensure + % that the stream is at 0 position. + % Making this consistently with resolveshading, + % which applies ReusableStreamDecode filter + % to the PS stream, which represents the + % PDF stream in dynamics. + + dup /Shading knownoget { + dup /ShadingType oget 4 ge { + /DataSource knownoget { + dup type /filetype eq { + 0 setfileposition + } { + pop + } ifelse + } if + } { + pop + } ifelse + } if + + % Associate pattern instance with the default qstate for the context. + % A single pattren object can be reused in several contexts. + dup DefaultQstate .knownget { + exch pop + } { + % But don't update read-only initial null pattern. + dup /PaintProc .knownget { //nullpatternproc ne } { //true } ifelse { + dup dup /Matrix knownoget not { { 1 0 0 1 0 0 } } if + + gsave + .currentfillconstantalpha + .currentstrokeconstantalpha + DefaultQstate setqstate + .setstrokeconstantalpha + .setfillconstantalpha + makepattern + grestore + + dup 3 1 roll + DefaultQstate exch put + } if + } ifelse +} bdef + /CSdict mark - /DeviceGray { pop //csdevgray 0 } bind - /DeviceRGB { pop //csdevrgb [0 0 0] cvx } bind - /DeviceCMYK { pop //csdevcmyk [0 0 0 1] cvx } bind + /DeviceGray { 0 } bind + /DeviceRGB { [0 0 0] cvx } bind + /DeviceCMYK { [0 0 0 1] cvx } bind /CIEBasedA { 0 } bind /CIEBasedABC { [0 0 0] cvx } bind - /CalGray { pop //csdevgray 0 } bind - /CalRGB { pop //csdevrgb [0 0 0] cvx } bind + /CalGray { pop /DeviceGray 0 } bind + /CalRGB { pop /DeviceRGB [0 0 0] cvx } bind /Lab {[0 0 0] cvx } bind /ICCBased { [ 1 index 1 oget /N get { 0 } repeat ] cvx } bind /Separation { 1 } bind @@ -288,91 +281,111 @@ currentdict /gput_always_allow .undef [ 1 index 1 get length { 1 } repeat ] cvx } bind /Indexed { 0 } bind - /Pattern { - dup type /nametype eq 1 index length 1 eq or { - pop //cspattern //nullpattern matrix makepattern - } { - //nullpattern matrix makepattern 1 index 1 get csset - % Stack: patternspace nullpattern basecolor basespace - pop [ 3 1 roll dup type /arraytype eq { aload pop } if - counttomark -1 roll ] cvx - } ifelse - } bind + /Pattern { //nullpattern matrix makepattern } bind .dicttomark readonly def -/csset % <cspace> csset <color> <cspace> - { dup dup type /nametype ne { 0 get } if //CSdict exch get exec exch - } bdef -/g { //csdevgray fcput } bdef -/G { //csdevgray scput } bdef -/rg { 3 array astore cvx //csdevrgb fcput } bdef -/RG { 3 array astore cvx //csdevrgb scput } bdef -/k { 4 array astore cvx //csdevcmyk fcput } bdef -/K { 4 array astore cvx //csdevcmyk scput } bdef -%% -%% Bug #694412, we set the colour space immediately now. Previously we -%% only set the colour space and colour when a stroke or fill took place. -%% if that happened inside a gsave/grestore we could end up setting the -%% same colour space many times, which is a problem if its an expensive -%% space, like ICCBased. -%% -/cs { csset dup setgcolorspace fcput } bdef -/CS { csset dup .swapcolors setgcolorspace .swapcolors scput } bdef -/ri { //.renderingintentdict exch .knownget { .setrenderingintent } if } bdef -% We have to break up sc according to the number of operands. -%% -%% Also Bug #694412, we need to set the actual colour in response to the -%% PDF operators as well. However, the transparenmcy code also uses the -%% original calls (sc, SC, sc1, SC1, sc* and SC*) and so we create -%% a duplicate set which do the same as the originals, but se the current -%% colour as well. -%% -/sc1_and_set { /FillColor gput FillColor FillColorSpace setgcolor} bdef -/sc1 { /FillColor gput } bdef -/SC1_and_set {/StrokeColor gput .swapcolors StrokeColor StrokeColorSpace setgcolor .swapcolors } bdef -/SC1 { /StrokeColor gput } bdef -% We have to avoid storing into a color array associated with an outer -% gsave level, so we do a kind of "copy on write". -/sc* { - currentdict /FillColor .knownget { - astore pop - } { - /FillColor load - % FillColor may contain either a single value or an array. - dup type /arraytype eq { length }{ pop 1 } ifelse - array astore cvx /FillColor gput - } ifelse -} bdef -/SC* { - currentdict /StrokeColor .knownget { - astore pop - } { - /StrokeColor load - % StrokeColor may contain either a single value or an array. - dup type /arraytype eq { length }{ pop 1 } ifelse - array astore cvx /StrokeColor gput - } ifelse -} bdef +/ri {//.renderingintentdict exch .knownget { .setrenderingintent } if } bdef +/g {/DeviceGray .setfillcolorspace .setfillcolor } bdef +/G {/DeviceGray .setstrokecolorspace .setstrokecolor} bdef +/rg {/DeviceRGB .setfillcolorspace .setfillcolor} bdef +/RG {/DeviceRGB .setstrokecolorspace .setstrokecolor} bdef +/k {/DeviceCMYK .setfillcolorspace .setfillcolor} bdef +/K {/DeviceCMYK .setstrokecolorspace .setstrokecolor} bdef +/cs {dup dup type /nametype ne { 0 get } if //CSdict exch get exec exch .setfillcolorspace exec .setfillcolor} bdef +/CS {dup dup type /nametype ne { 0 get } if //CSdict exch get exec exch .setstrokecolorspace exec .setstrokecolor} bdef +/sc {.setfillcolor} bdef +/SC {.setstrokecolor} bdef +/sc* {.setfillcolor} bdef +/SC* {.setstrokecolor} bdef /sc*_and_set { - sc* - FillColor FillColorSpace setgcolor + dup type /dicttype eq + { + dup /Type known + { + dup /Type get /Pattern eq {PDFsetpattern} if + } + { + dup /PatternType known {PDFsetpattern} if + } ifelse + } if + .setfillcolor } bdef /SC*_and_set { - SC* - .swapcolors StrokeColor StrokeColorSpace setgcolor .swapcolors + dup type /dicttype eq + { + dup /Type known + { + dup /Type get /Pattern eq {PDFsetpattern} if + } + { + dup /PatternType known {PDFsetpattern} if + } ifelse + } if + .setstrokecolor +} bdef +/sc1 {.setfillcolor} bdef +/SC1 {.setstrokecolor} bdef +/sc1_and_set { + dup type /dicttype eq + { + dup /Type known + { + dup /Type get /Pattern eq {PDFsetpattern} if + } + { + dup /PatternType known {PDFsetpattern} if + } ifelse + } if + .setfillcolor +} bdef +/SC1_and_set { + dup type /dicttype eq + { + dup /Type known + { + dup /Type get /Pattern eq {PDFsetpattern} if + } + { + dup /PatternType known {PDFsetpattern} if + } ifelse + } if + .setstrokecolor } bdef +/csput {dup dup type /nametype ne { 0 get } if //CSdict exch get exec exch 2 copy .setfillcolorspace exec .setfillcolor .setstrokecolorspace exec .setstrokecolor} bdef +/csset {dup dup type /nametype ne { 0 get } if //CSdict exch get exec exch} bdef + +% ---------------- Color setting ---------------- % + % ---------------- Overprint/transparency setting ---------------- % -/op { /FillOverprint gput } bdef % NB pdf_draw:gsparamdict handled /OP with no /op -/OP { /StrokeOverprint gput } bdef +/op { .setfilloverprint +} bdef % NB pdf_draw:gsparamdict handled /OP with no /op +/OP { .setstrokeoverprint +} bdef /OPM { /.setoverprintmode where { pop dup .setoverprintmode .swapcolors .setoverprintmode .swapcolors } { pop } ifelse } bdef -/ca { /FillConstantAlpha gput } bdef -/CA { /StrokeConstantAlpha gput } bdef -/SMask { /SoftMask gput } bdef -/AIS { /AlphaIsShape gput } bdef +/ca { .setfillconstantalpha } bdef +/CA { .setstrokeconstantalpha } bdef +/SMask { + dup type /booleantype eq { + .currentSMask type /dicttype eq { + .currentSMask /Processed 2 index .forceput + } { + .setSMask + }ifelse + }{ + .setSMask + }ifelse + + %% This is some craziness to do with annotations and graphics states + %% the original nodict can't be written to, and we haven't (I think) done + %% a gsave, so we haven't copied it to /self, if we don't do that here + %% then transparent annotations cause an invalid access error. + currentdict //nodict eq {/self dup load end 5 dict begin def} if +} bdef +/AIS { .setalphaisshape } bdef /BM { /.setblendmode where { pop [ exch dup type /nametype ne { aload pop } if /Normal ] { @@ -386,13 +399,19 @@ currentdict /gput_always_allow .undef /.settextknockout where { pop .settextknockout } { pop } ifelse } bdef +/UseBlackPtComp { + %% Our implementation of black point compensation uses 0 or 1, not a boolean + /.setblackptcomp where {pop false eq {0}{1}ifelse .setblackptcomp }{ pop } ifelse +} bdef + % ---------------- Color installation ---------------- % % Establish a given color (and color space) as current. /.settransparencyparams { % <alpha> <smask> .settransparencyparams - PDFusingtransparency { /.begintransparencygroup where { - pop AlphaIsShape { + pop .currentalphaisshape + { 1 .setopacityalpha exch .setshapealpha 1 } { 1 .setshapealpha exch .setopacityalpha 0 @@ -415,23 +434,28 @@ currentdict /gput_always_allow .undef dup /Draw get exec } ifelse } { - dup /Draw get exec + dup /Processed .knownget { + { + pop pop + } { + dup /Draw get exec + }ifelse + }{ + dup /Draw get exec + } ifelse } ifelse } bdef % (Non-mask) images must execute setfillblend. /setfillblend { - FillOverprint setoverprint - FillConstantAlpha SoftMask .settransparencyparams + .currentfillconstantalpha + .currentSMask .settransparencyparams } def /setfillstate { - FillColor FillColorSpace setgcolor setfillblend + setfillblend } def - /setstrokestate { - .swapcolors - StrokeColor StrokeColorSpace setgcolor StrokeOverprint setoverprint - StrokeConstantAlpha SoftMask .settransparencyparams - .swapcolors + .currentstrokeconstantalpha + .currentSMask .settransparencyparams } def /Cdict 15 dict dup begin % <color...> <colorspace> -proc- - /DeviceGray { pop setgray } bdef @@ -530,7 +554,16 @@ currentdict /gput_always_allow .undef % But don't update read-only initial null pattern. dup /PaintProc .knownget { //nullpatternproc ne } { //true } ifelse { dup dup /Matrix knownoget not { { 1 0 0 1 0 0 } } if - gsave DefaultQstate setqstate makepattern grestore + + gsave + .currentfillconstantalpha + .currentstrokeconstantalpha + DefaultQstate setqstate + .setstrokeconstantalpha + .setfillconstantalpha + makepattern + grestore + dup 3 1 roll DefaultQstate exch put } if @@ -582,8 +615,10 @@ end def pop currentcolorspace 1 get % use the base space } if known { - /stroke ne { FillOverprint } { StrokeOverprint } ifelse - .currentblendmode dup /Normal eq exch /Compatible eq or not and + /stroke ne { .currentfilloverprint + } { .currentstrokeoverprint + } ifelse + .currentblendmode dup /Normal eq exch /Compatible eq or not and } { pop //false } ifelse @@ -592,23 +627,25 @@ end def /fsexec % <fillop|strokeop> fsexec - { PDFusingtransparency { - SoftMask //null ne { + .currentSMask //null ne { mark /Subtype /Group /Isolated //true .dicttomark pathbbox .begintransparencygroup + .currentshapealpha .currentopacityalpha 3 -1 roll % avoid double application + 1 .setopacityalpha 1 .setshapealpha } if dup checkOPtrans exch 1 index { % We need to push a non-isolated, non-knockout transparency group and % perform the operation in CompatibleOverprint mode, then end the % transparency group. Do the begintransparencygroup step here. mark /Subtype /Group /Isolated //false .dicttomark pathbbox .begintransparencygroup - exch .currentblendmode exch .currentopacityalpha exch 4 -1 roll % save current values + .currentblendmode .currentopacityalpha 4 -2 roll % save current values /CompatibleOverprint .setblendmode 1 .setopacityalpha } if cvx exec { .endtransparencygroup .setopacityalpha .setblendmode % end the CompatibleOverprint group } if - SoftMask //null ne { - .endtransparencygroup + .currentSMask //null ne { + .endtransparencygroup .setopacityalpha .setshapealpha } if } { cvx exec @@ -792,29 +829,72 @@ end def % Clipping: -/Wdict 4 dict dup begin +/Wdict 8 dict dup begin /S { OFFlevels length 0 eq { gsave setstrokestate .swapcolors stroke .swapcolors grestore } if n } bdef /f { OFFlevels length 0 eq { gsave setfillstate fill grestore } if n } bdef /f* { OFFlevels length 0 eq { gsave setfillstate eofill grestore } if n } bdef +/B { + OFFlevels length 0 eq { + PDFusingtransparency { + % knockout trans group around the filled and stroked object + mark + /Isolated //true /Knockout //true + .dicttomark + % strokepath will return empty path (no currentpoint) if nothing is stroked + gsave {strokepath pathbbox } stopped grestore not + { + 1 .setopacityalpha + .begintransparencygroup + gsave setfillstate fill grestore + setstrokestate .swapcolors /stroke fsexec .swapcolors + .endtransparencygroup + } { + newpath pop + } ifelse + } { + gsave setfillstate fill grestore + setstrokestate .swapcolors /stroke fsexec .swapcolors + } ifelse + } if + n +} bdef +/b { closepath B } bdef +/B* { + OFFlevels length 0 eq { + PDFusingtransparency { + % knockout trans group around the filled and stroked object + mark + /Isolated //true /Knockout //true + .dicttomark + % strokepath will return empty path (no currentpoint) if nothing is stroked + gsave {strokepath pathbbox} stopped grestore not { + 1 .setopacityalpha + .begintransparencygroup + gsave setfillstate eofill grestore + setstrokestate .swapcolors /stroke fsexec .swapcolors + .endtransparencygroup + } { newpath pop } ifelse + } { + gsave setfillstate eofill grestore + setstrokestate .swapcolors /stroke fsexec .swapcolors + } ifelse + } if + n +} bdef +/b { closepath B* } bdef /n { end { currentpoint } stopped not { pop pop clip } if newpath } bdef end readonly def /W { //Wdict begin } bdef -/W*dict 4 dict dup begin +/W*dict 8 dict dup begin Wdict { def } forall /n { end { currentpoint } stopped not { pop pop eoclip } if newpath } bdef end readonly def /W* { //W*dict begin } bdef - % ---------------- Text control ---------------- % /textbeginpage - { /TextSpacing 0 def % 0 Tc - /TextLeading 0 def % 0 TL - /TextRenderingMode 0 def % 0 Tr - /TextRise 0 def % 0 Ts - /WordSpacing 0 def % 0 Tw - /TextHScaling 1.0 def % 100 Tz - /TextFont //null def + { + 1.0 .settexthscaling /FontMatrixNonHV //false def /Show { showfirst } def /TextFillStateNeeded //true def @@ -844,7 +924,8 @@ end readonly def /settextmatrix { matrix currentmatrix - TextMatrix concat + matrix .currenttextmatrix + concat TestDegenerateCTM { (\n **** Error: Degenerate text matrix detected, ignoring Tm operation\n) pdfformaterror ( Output may be incorrect.\n) pdfformaterror @@ -852,9 +933,11 @@ end readonly def } { pop } ifelse - TextHScaling 1 ne { TextHScaling 1 scale } if - TextRise 0 ne { 0 TextRise translate } if - TextFont dup //null eq { pop } { setfont } ifelse + .currenttexthscaling + 1 ne { .currenttexthscaling + 1 scale } if + .currenttextrise 0 ne { 0 .currenttextrise + translate } if } bdef /settextstate { @@ -879,14 +962,22 @@ end readonly def /settextposition { % Update the TextMatrix translation. gsave TextSaveMatrix setmatrix - {currentpoint} stopped not { TextRise sub TextMatrix 4 2 getinterval astore pop + {currentpoint} stopped not { + .currenttextrise + sub + matrix .currenttextmatrix + dup 5 4 -1 roll put + dup 4 4 -1 roll put + .settextmatrix % We would like to do "grestore currentpoint translate" % here, but some PDF files set a singular text matrix % (0 0 0 0 <x> <y> Tm), so we can't do this. - TextTempMatrix identmatrix setmatrix currentpoint - grestore - TextTempMatrix currentmatrix 4 2 getinterval astore pop - TextTempMatrix setmatrix + TextTempMatrix identmatrix setmatrix currentpoint + matrix .currenttextmatrix + grestore + .settextmatrix + TextTempMatrix currentmatrix 4 2 getinterval astore pop + TextTempMatrix setmatrix } { ( **** Error: Invalid currentpoint, probable degenerate CTM.\n) pdfformaterror ( Ignroing error, output may be incorrect.\n) pdfformaterror @@ -932,10 +1023,9 @@ end readonly def currentdict end /.W exch def } if - currentdict /TextLineMatrix .knownget - { identmatrix pop TextMatrix identmatrix pop } - { matrix /TextLineMatrix gput matrix /TextMatrix gput } - ifelse + matrix .settextlinematrix + matrix .settextmatrix + { showfirst } /Show gput currentdict /TextSaveMatrix .knownget not { matrix dup /TextSaveMatrix gput @@ -957,7 +1047,7 @@ end readonly def /ET_NO_TXT_KO { currentdict /TextSaveMatrix known { - TextRenderingMode 4 ge { .currentfilladjust 0 .setfilladjust clip .setfilladjust} if + .currenttextrenderingmode 4 ge { .currentfilladjust 0 .setfilladjust clip .setfilladjust} if newpath TextSaveMatrix setmatrix currentdict /TextSaveMatrix undef @@ -988,11 +1078,11 @@ end readonly def } if } bdef -/Tc { /TextSpacing gput { showfirst } /Show gput } bdef -/TL { /TextLeading gput } bdef -/Tr { dup .settextrenderingmode /TextRenderingMode gput { showfirst } /Show gput } bdef -/Ts { /TextRise gput settextstate } bdef -/Tw { /WordSpacing gput { showfirst } /Show gput } bdef +/Tc { .settextspacing { showfirst } /Show gput } bdef +/TL { .settextleading } bdef +/Tr { .settextrenderingmode { showfirst } /Show gput } bdef +/Ts { .settextrise settextstate } bdef +/Tw { .setwordspacing { showfirst } /Show gput } bdef /Tz { dup 0 eq { (\n **** Error: Invalid 0.0 horizontal text scaling given for Tz\n) @@ -1001,7 +1091,8 @@ end readonly def pop 0.00000001 % handle invalid scale by using a really small value }{ 100 div - }ifelse /TextHScaling gput settextstate} bdef + }ifelse .settexthscaling %/TextHScaling gput + settextstate} bdef % ---------------- Font control ---------------- % @@ -1080,7 +1171,7 @@ end readonly def } { pop } ifelse - /TextFont gput settextstate + setfont } bdef % Copy a font, removing its FID. If changed is true, also remove @@ -1210,11 +1301,17 @@ end readonly def ( Output may be incorrect.\n) pdfformaterror pop 0 } if - TextLineMatrix transform TextLineMatrix 4 2 getinterval astore pop - TextLineMatrix TextMatrix copy pop settextstate + matrix .currenttextlinematrix transform + matrix .currenttextlinematrix + dup 3 -1 roll 5 exch put + dup 3 -1 roll 4 exch put + .settextlinematrix + matrix .currenttextlinematrix .settextmatrix + + settextstate } bdef -/TD { dup neg /TextLeading gput Td } bdef -/T* { 0 TextLeading neg Td } bdef +/TD { dup neg .settextleading Td } bdef +/T* { 0 .currenttextleading neg Td } bdef /Tm { 5 index 0 ne 3 index 0 ne and 5 index 0 ne 5 index 0 ne and or not { @@ -1226,7 +1323,9 @@ end readonly def 0.00000001 0 0 0.00000001 6 -2 roll }if - TextLineMatrix astore TextMatrix copy pop settextstate + matrix .currenttextlinematrix astore .settextlinematrix + matrix .currenttextlinematrix .settextmatrix + settextstate } bdef % ---------------- Text painting ---------------- % @@ -1329,8 +1428,8 @@ end readonly def //false }ifelse { - TextRenderingMode 1 eq TextRenderingMode 2 eq or - TextRenderingMode 5 eq TextRenderingMode 6 eq or or { + .currenttextrenderingmode 1 eq .currenttextrenderingmode 2 eq or + .currenttextrenderingmode 5 eq .currenttextrenderingmode 6 eq or or { setstrokestate % Need to set the stroke width to a value which gives the correct % width under pdfwrite. Pdfwrite uses (in text mode) an identity @@ -1360,7 +1459,7 @@ end readonly def /TextTransSetup { % showarg path_valid TextTransSetup false showarg % showarg path_valid false TextTransSetup prev_BM prev_opacity true showarg % NB: if 'show' is used, then we use the clippath, but a smaller bbox is preferred - SoftMask //null ne { + .currentSMask //null ne { dup mark /Subtype /Group /Isolated //true .dicttomark exch { pathbbox } { gsave clippath pathbbox grestore } ifelse .begintransparencygroup @@ -1385,13 +1484,15 @@ end readonly def .endtransparencygroup OPsavedict dup /saveOA get .setopacityalpha /saveBM get .setblendmode } if - SoftMask //null ne { + .currentSMask //null ne { .endtransparencygroup } if } bind def /setshowstate - { WordSpacing 0 eq TextSpacing 0 eq and FontMatrixNonHV not and + { + .currentwordspacing 0 eq .currenttextspacing + 0 eq and FontMatrixNonHV not and { % Check to see if the current device supports Tr /PreserveTrMode /GetDeviceParam .special_op { @@ -1400,16 +1501,16 @@ end readonly def //false }ifelse { - pdfwrite_textrenderingprocs TextRenderingMode get + pdfwrite_textrenderingprocs .currenttextrenderingmode get } { - TextRenderingMode 0 eq - currentfont /FontType get 3 eq TextRenderingMode 3 eq not + .currenttextrenderingmode 0 eq + currentfont /FontType get 3 eq .currenttextrenderingmode 3 eq not and or { { settextfillstate //false TextTransSetup show TextTransTeardown } } { - TextRenderingMode 3 eq { + .currenttextrenderingmode 3 eq { % Some PDF files execute 'tm' with a singular matrix, % and then use the text rendering mode 3. % The graphics library currently cannot handle text @@ -1437,7 +1538,7 @@ end readonly def moveto } } { - { //false charpath textrenderingprocs TextRenderingMode get exec } + { //false charpath textrenderingprocs .currenttextrenderingmode get exec } } ifelse } ifelse } ifelse @@ -1446,7 +1547,7 @@ end readonly def % If we are doing a plain old fill, or no text at all, *or* we are going to % a device supporting text rendering modes, then go through this route. % - TextRenderingMode 0 eq TextRenderingMode 3 eq or + .currenttextrenderingmode 0 eq .currenttextrenderingmode 3 eq or currentfont /FontType get 3 eq or /PreserveTrMode /GetDeviceParam .special_op { @@ -1455,7 +1556,7 @@ end readonly def //false }ifelse % pdfwrite can't handle rendering modes which involve clipping - TextRenderingMode 4 lt and or + .currenttextrenderingmode 4 lt and or % Tr was set to graphic state. { FontMatrixNonHV { @@ -1464,7 +1565,7 @@ end readonly def currentlinewidth exch setstrokeforTrpreservation settextfillstate //false TextTransSetup - [ TextSpacing WordSpacing 3 index + [ .currenttextspacing .currentwordspacing 3 index { % str [... weach wword c undef|ythis xthis|undef exch % will be removed, unless FontMatrix.xx/yy == 0 (FontMatrixNonHV already true) Vexch pop % str [... weach wword c wthis @@ -1480,20 +1581,23 @@ end readonly def setlinewidth TextTransTeardown } } { - WordSpacing 0 eq { + .currentwordspacing + 0 eq { { { setstrokeforTrpreservation - settextfillstate //false TextTransSetup TextSpacing 0 Vexch 3 -1 roll ashow TextTransTeardown + settextfillstate //false TextTransSetup .currenttextspacing + 0 Vexch 3 -1 roll ashow TextTransTeardown } currentlinewidth { setlinewidth } 3 .execn } } { - TextSpacing 0 eq { + .currenttextspacing 0 eq { { % preserve current line width around possible stroke setup { setstrokeforTrpreservation - settextfillstate //false TextTransSetup WordSpacing 0 Vexch 32 4 -1 roll .pdfwidthshow + settextfillstate //false TextTransSetup .currentwordspacing + 0 Vexch 32 4 -1 roll .pdfwidthshow TextTransTeardown } currentlinewidth @@ -1503,8 +1607,9 @@ end readonly def } { { % preserve current line width around possible stroke setup { setstrokeforTrpreservation - settextfillstate //false TextTransSetup WordSpacing 0 Vexch 32 - TextSpacing 0 Vexch 6 -1 roll .pdfawidthshow TextTransTeardown + settextfillstate //false TextTransSetup .currentwordspacing + 0 Vexch 32 + .currenttextspacing 0 Vexch 6 -1 roll .pdfawidthshow TextTransTeardown } currentlinewidth { setlinewidth } @@ -1516,7 +1621,8 @@ end readonly def } { { currentlinewidth exch - WordSpacing TextSpacing + .currentwordspacing + .currenttextspacing % Implement the combination of t3 and false charpath. % Note that we must use cshow for this, because we % can't parse multi-byte strings any other way. @@ -1543,7 +1649,7 @@ end readonly def % or we wouldn't be here. Subtract 4 from the Tr and preserve % that mode, then do a charpath so the clip path gets set up % correctly. - gsave TextRenderingMode 4 sub .settextrenderingmode + gsave .currenttextrenderingmode 4 sub .settextrenderingmode setstrokeforTrpreservation setstrokestate settextfillstate //false TextTransSetup dup show grestore TextTransTeardown } if //false charpath @@ -1569,7 +1675,7 @@ end readonly def }{ //true }ifelse { - textrenderingprocs TextRenderingMode get exec + textrenderingprocs .currenttextrenderingmode get exec } if setlinewidth } @@ -1588,9 +1694,7 @@ end readonly def OFFlevels length 0 eq { exec } { - gsave get-gs-attrs nulldevice set-gs-attrs - exec - get-gs-attrs grestore set-gs-attrs + gsave nulldevice exec grestore } ifelse //true /TextFillStateNeeded gput } bdef @@ -1610,9 +1714,7 @@ end readonly def OFFlevels length 0 eq { exec } { - gsave get-gs-attrs nulldevice set-gs-attrs - exec - get-gs-attrs grestore set-gs-attrs + gsave nulldevice exec grestore } ifelse //true /TextFillStateNeeded gput } bdef @@ -1741,9 +1843,13 @@ end readonly def 2 0 moveto % start at bottom left of rect counttomark 1 1 3 -1 roll { % for every string pop gsave - <FEFF> anchorsearch { - pop - } if + <EFBBBF> anchorsearch { + pop + } { + <FEFF> anchorsearch { + pop + } if + } ifelse Show grestore % pop loop counter, show string (saving current point) counttomark 1 add index 0 exch rmoveto % get line height, move that amount vertically. } for @@ -1755,9 +1861,13 @@ end readonly def 2 0 moveto % start at bottom left of rect counttomark 1 1 3 -1 roll { % for every string pop gsave % pop loop counter - <FEFF> anchorsearch { - pop - } if + <EFBBBF> anchorsearch { + pop + } { + <FEFF> anchorsearch { + pop + } if + } ifelse dup stringwidth pop counttomark 5 add index % get rectangle width exch sub 2 div 0 rmoveto % subtract width of string, divide by 2 move that amount Show grestore % show string @@ -1770,9 +1880,13 @@ end readonly def 2 0 moveto % start at bottom left of rect counttomark 1 1 3 -1 roll { % for every string pop gsave % pop loop counter - <FEFF> anchorsearch { + <EFBBBF> anchorsearch { pop - } if + } { + <FEFF> anchorsearch { + pop + } if + } ifelse dup stringwidth pop counttomark 5 add index % get rectangle width exch sub 2 sub 0 rmoveto % subtract width of string,move that amount Show grestore % show string @@ -1790,9 +1904,13 @@ end readonly def 0 exch moveto % MaxLen (V) Ff Q dx 1 index 0 ne { 3 index - <FEFF> anchorsearch { - pop - } if + <EFBBBF> anchorsearch { + pop + } { + <FEFF> anchorsearch { + pop + } if + } ifelse stringwidth pop % MaxLen (V) Ff Q dx w sub exch 1 eq { 2 div } { 2 sub } ifelse % MaxLen (V) Ff (dx-w)/2 0 rmoveto % MaxLen (V) Ff @@ -1802,9 +1920,13 @@ end readonly def 2 0 rmoveto } ifelse exch pop - <FEFF> anchorsearch { + <EFBBBF> anchorsearch { pop - } if + } { + <FEFF> anchorsearch { + pop + } if + } ifelse Show % - } ifelse } ifelse diff --git a/Master/tlpkg/tlgs/bin/gsdll32.dll b/Master/tlpkg/tlgs/bin/gsdll32.dll Binary files differindex 33790e4d0f9..16681d74f1b 100755 --- a/Master/tlpkg/tlgs/bin/gsdll32.dll +++ b/Master/tlpkg/tlgs/bin/gsdll32.dll diff --git a/Master/tlpkg/tlgs/bin/gsdll32.lib b/Master/tlpkg/tlgs/bin/gsdll32.lib Binary files differindex 90b1b74bb9f..40ea8d94934 100644 --- a/Master/tlpkg/tlgs/bin/gsdll32.lib +++ b/Master/tlpkg/tlgs/bin/gsdll32.lib diff --git a/Master/tlpkg/tlgs/bin/gswin32.exe b/Master/tlpkg/tlgs/bin/gswin32.exe Binary files differindex 30c5552dd9a..f34ad66378f 100755 --- a/Master/tlpkg/tlgs/bin/gswin32.exe +++ b/Master/tlpkg/tlgs/bin/gswin32.exe diff --git a/Master/tlpkg/tlgs/bin/gswin32c.exe b/Master/tlpkg/tlgs/bin/gswin32c.exe Binary files differindex a3739bd4cc7..cf0e655ce2b 100755 --- a/Master/tlpkg/tlgs/bin/gswin32c.exe +++ b/Master/tlpkg/tlgs/bin/gswin32c.exe diff --git a/Master/tlpkg/tlgs/iccprofiles/default_cmyk.icc b/Master/tlpkg/tlgs/iccprofiles/default_cmyk.icc Binary files differindex 00d4ae0e042..fce61bf2bcb 100644 --- a/Master/tlpkg/tlgs/iccprofiles/default_cmyk.icc +++ b/Master/tlpkg/tlgs/iccprofiles/default_cmyk.icc diff --git a/Master/tlpkg/tlgs/iccprofiles/default_rgb.icc b/Master/tlpkg/tlgs/iccprofiles/default_rgb.icc Binary files differindex 627e8feb0ec..055997234cc 100644 --- a/Master/tlpkg/tlgs/iccprofiles/default_rgb.icc +++ b/Master/tlpkg/tlgs/iccprofiles/default_rgb.icc diff --git a/Master/tlpkg/tlgs/iccprofiles/gray_to_k.icc b/Master/tlpkg/tlgs/iccprofiles/gray_to_k.icc Binary files differindex bb52dd937e9..c9f585d2660 100644 --- a/Master/tlpkg/tlgs/iccprofiles/gray_to_k.icc +++ b/Master/tlpkg/tlgs/iccprofiles/gray_to_k.icc diff --git a/Master/tlpkg/tlgs/iccprofiles/lab.icc b/Master/tlpkg/tlgs/iccprofiles/lab.icc Binary files differindex cd34beb967b..df5c56c127b 100644 --- a/Master/tlpkg/tlgs/iccprofiles/lab.icc +++ b/Master/tlpkg/tlgs/iccprofiles/lab.icc diff --git a/Master/tlpkg/tlgs/iccprofiles/ps_cmyk.icc b/Master/tlpkg/tlgs/iccprofiles/ps_cmyk.icc Binary files differindex 3c35d710587..ebb0dc0a2eb 100644 --- a/Master/tlpkg/tlgs/iccprofiles/ps_cmyk.icc +++ b/Master/tlpkg/tlgs/iccprofiles/ps_cmyk.icc diff --git a/Master/tlpkg/tlgs/iccprofiles/ps_gray.icc b/Master/tlpkg/tlgs/iccprofiles/ps_gray.icc Binary files differindex e670a2fb16c..00e65458878 100644 --- a/Master/tlpkg/tlgs/iccprofiles/ps_gray.icc +++ b/Master/tlpkg/tlgs/iccprofiles/ps_gray.icc diff --git a/Master/tlpkg/tlgs/iccprofiles/ps_rgb.icc b/Master/tlpkg/tlgs/iccprofiles/ps_rgb.icc Binary files differindex 645542ceed9..1bbaaf539e9 100644 --- a/Master/tlpkg/tlgs/iccprofiles/ps_rgb.icc +++ b/Master/tlpkg/tlgs/iccprofiles/ps_rgb.icc diff --git a/Master/tlpkg/tlgs/iccprofiles/srgb.icc b/Master/tlpkg/tlgs/iccprofiles/srgb.icc Binary files differindex 627e8feb0ec..055997234cc 100644 --- a/Master/tlpkg/tlgs/iccprofiles/srgb.icc +++ b/Master/tlpkg/tlgs/iccprofiles/srgb.icc diff --git a/Master/tlpkg/tlgs/lib/addxchar.ps b/Master/tlpkg/tlgs/lib/addxchar.ps deleted file mode 100644 index d9027d6046c..00000000000 --- a/Master/tlpkg/tlgs/lib/addxchar.ps +++ /dev/null @@ -1,356 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% Add the Central European and other Adobe extended Latin characters to a -% Type 1 font. -% Requires -dWRITESYSTEMDICT to disable access protection. - -(type1ops.ps) runlibfile - -% ---------------- Utilities ---------------- % - -/addce_dict 50 dict def -addce_dict begin - -% Define the added copyright notice. -/addednotice (. Portions Copyright (C) 2012 Artifex Software Inc.) def - -% Open a font for modification by removing the FID and changing the -% FontName. Removing UniqueID and XUID is not necessary, since we -% will only be adding characters. -/openfont { % <name> <font> openfont <name> <font'> - dup length dict copy - dup /FID undef - dup /FontName 3 index put -} def - -% Do the equivalent of false charpath for a glyph. -% This should really be an operator! -/glyphpath { % <glyph> glyphpath - - currentfont /Encoding get 0 3 -1 roll put - <00> false charpath -} def - -% Do the equivalent of charpath + pathbbox for a glyph. -/glyphbbox { % <glyph> glyphbbox <llx> <lly> <urx> <ury> - % We cache this value, because it's expensive to compute. - BBoxes 1 index .knownget { - exch pop - } { - gsave newpath 0 0 moveto dup glyphpath [pathbbox] grestore - BBoxes 3 -1 roll 2 index put - } ifelse aload pop -} def - -% Get the side bearing and width for a glyph. -/glyphsbw { % <glyph> glyphsbw <lsbx> <wx> - % We cache this value, because it's expensive to compute. - SBW 1 index .knownget { - exch pop - } { - dup glyphcs { dup /hsbw eq { pop exit } if } forall - 2 array astore - SBW 3 -1 roll 2 index put - } ifelse aload pop -} def - -% Get the CharString for a glyph, as an array. -/glyphcs { % <glyph> glyphcs <array> - CharStrings exch get - 4330 exch dup length string .type1decrypt exch pop - dup length lenIV sub lenIV exch getinterval - 0 () /SubFileDecode filter [ exch charstack_read ] -} def - -% Find an occurrence of a value in an array. -/asearch { % <array> <value> asearch <index> true - % <array> <value> asearch false - false 0 4 2 roll exch { - % Stack: false index value element - 2 copy eq { pop pop exch not exch dup exit } if - exch 1 add exch - } forall pop pop -} def - -% Convert an array back to a CharString. -/csdef { % <glyph> <array> csdef - - charproc_string - 4330 exch dup .type1encrypt exch pop readonly - CharStrings 3 1 roll put -} def - -% Split an accented character name. -/splitaccented { % <Baccent> splitaccented <Baccent> <B> <accent> - dup =string cvs - dup 0 1 getinterval cvn - exch dup length 1 sub 1 exch getinterval cvn -} def - -% Begin the definition of a 'seac' character. -% Defines accent, base, abox, bbox. -% The initial dx lines up the origins of the base and the accent. -/beginseac { % <bchar> <achar> beginseac - % -mark- <lsbx> <wx> /hsbw <asb> <dx> - /accent exch def /base exch def - /abox [accent glyphbbox] def - /bbox [base glyphbbox] def - [ base glyphsbw /hsbw accent glyphsbw pop - dup 4 index sub -} def - -% Center the accent over the base of a 'seac' character. -/centeraccent { % <dx> centeraccent <adx> - bbox 2 get bbox 0 get add 2 div - abox 2 get abox 0 get add 2 div - sub add -} def - -% Finish the definition of a 'seac' character. -/finishseac { % <charname> -mark- ... <adx> <ady> finishseac - - exch cvi exch cvi - charindex base get charindex accent get /seac ] csdef -} def - -% ---------------- Main program ---------------- % - -% Define accented characters that can be made with seac, -% with the accent centered over the character. -/seacchars [ - /Abreve /Amacron - /Cacute /Ccaron /Dcaron - /Ecaron /Edotaccent /Emacron - /Gbreve - /Idotaccent /Imacron - /Lacute - /Nacute /Ncaron - /Ohungarumlaut /Omacron - /Racute /Rcaron - /Sacute /Scedilla - /Tcaron - /Uhungarumlaut /Umacron /Uogonek /Uring - /Zacute /Zdotaccent - /abreve /amacron - /cacute /ccaron - /ecaron /edotaccent /emacron - /gbreve - /lacute - /nacute /ncaron - /ohungarumlaut /omacron - /racute /rcaron - /sacute /scedilla - /uhungarumlaut /umacron /uring - /zacute /zdotaccent -] def - -% Define seac characters where the accent lines up with the right -% edge of the character. -/seacrightchars [ - /Aogonek /Eogonek /Iogonek /aogonek /eogonek /iogonek /uogonek -] def - -% Define seac characters where the caron becomes an appended quoteright. -/seaccaronchars [ - /dcaron /lcaron /tcaron -] def - -% Define seac characters using commaaccent. -/seaccommachars [ - /Gcommaaccent /Kcommaaccent /Lcommaaccent /Ncommaaccent /Rcommaaccent - /Scommaaccent /Tcommaaccent - /gcommaaccent /kcommaaccent /lcommaaccent /ncommaaccent /rcommaaccent - /scommaaccent /tcommaaccent -] def - -% Define the characters copied from the Symbol font. -/symbolchars [ - /Delta /greaterequal /lessequal /lozenge /notequal /partialdiff - /summation -] def - -% Define the procedures for editing the commaaccent character. -% Delete all the hints, since it's too hard to adjust them. -/caedit mark - /rmoveto { exch commatop sub cvi exch } - /hstem { pop pop pop } - /vstem 1 index - /callothersubr { - dup 3 eq { 4 { pop } repeat /skip true def } if - } - /pop { skip { pop /skip false def } if } -.dicttomark def - -/addce { % <name> <font> addce <font'> - 20 dict begin - /origfont 1 index def - openfont - dup /CharStrings 2 copy get dup length dict copy put - dup /Encoding 2 copy get dup length array copy put - dup /FontInfo 2 copy get dup length dict copy put - definefont /font exch def - currentdict font end begin begin - font 1000 scalefont setfont - /symbolfont /Symbol findfont def - /BBoxes CharStrings length dict def - /SBW CharStrings length dict def - - /italfactor FontInfo /ItalicAngle .knownget { - neg dup sin exch cos div - } { - 0 - } ifelse def - - % Invert the Encoding (needed for seac). - - /charindex 256 dict def - 0 1 255 { - charindex exch Encoding 1 index get exch put - } for - - % Add the commaaccent character, by moving the comma downward. - - /comma glyphbbox /commatop exch def pop pop pop - /comma glyphcs - /skip false def - [ exch { caedit 1 index .knownget { exec } if } forall ] - /commaaccent exch csdef - - % Add the accented characters that can be made with seac. - - seacchars { - splitaccented beginseac - centeraccent - % If the accent would collide with the base character, - % raise it a little. - abox 1 get bbox 3 get sub dup 0 le { - % ... but not if the accent is in the low position. - abox 1 get 0 gt { - neg 60 add - % Adjust the X position if italic. - dup italfactor mul 3 -1 roll add exch - } { - pop 0 - } ifelse - } { - pop 0 - } ifelse - finishseac - } forall - - seacrightchars { - splitaccented beginseac - bbox 2 get abox 2 get sub add % line up right edges - 0 finishseac - } forall - - /dcroat /d /hyphen beginseac - bbox 2 get abox 2 get sub add % line up right edges - 0 finishseac - - /imacron /dotlessi /macron beginseac - centeraccent - 0 finishseac - - /Lcaron /L /quoteright beginseac - bbox 2 get abox 2 get sub add % line up right edges - 0 finishseac - - seaccaronchars { - dup =string cvs 0 1 getinterval cvn /quoteright beginseac - % Move the quote to the right of the character. - bbox 2 get abox 0 get sub 50 add add - % Adjust the character width as well. - 4 -1 roll abox 2 get abox 0 get sub 50 add add cvi 4 1 roll - 0 finishseac - } forall - - seaccommachars { - dup =string cvs 0 1 getinterval cvn /comma beginseac - centeraccent - commatop neg - % Lower the accent if the character extends below - % the baseline - bbox 1 get 0 .min add - finishseac - } forall - - % Add the characters from the Symbol font. - % We should scale them to match the FontBBox, but we don't. - - symbolchars { - symbolfont /CharStrings get 1 index get - CharStrings 3 1 roll put - } forall - - % Add the one remaining character. - - CharStrings /Dcroat CharStrings /Eth get put - - % Recompute the FontBBox, since some of the accented characters - % may have enlarged it. - - /llx 1000 def /lly 1000 def /urx 0 def /ury 0 def - CharStrings { - pop glyphbbox - ury .max /ury exch def urx .max /urx exch def - lly .min /lly exch def llx .min /llx exch def - } forall - /FontBBox llx cvi lly cvi urx ceiling cvi ury ceiling cvi 4 packedarray def - - % Restore the Encoding and wrap up. - - [/Copyright /Notice] { - FontInfo 1 index .knownget { - addednotice concatstrings FontInfo 3 1 roll put - } { - pop - } ifelse - } forall - FontName font openfont - dup /Encoding origfont /Encoding get put - definefont - - end end -} def - -currentdict end readonly pop % addce_dict - -/addce { addce_dict begin addce end } def - -% ---------------- Integration ---------------- % - -% We would like to patch the font loader so that it adds the extended -% Latin characters automatically. We haven't done this yet. - -% ---------------- Test program ---------------- % - -/TEST where { pop TEST } { false } ifelse { - /FONT where { pop } { /FONT /Palatino-Italic def } ifelse - (unprot.ps) runlibfile - unprot - (wrfont.ps) runlibfile - wrfont_dict begin - /eexec_encrypt true def - /binary_CharStrings true def - end - save - FONT findfont - /Latin-CE exch addce setfont - (t.ce.pfb) (w) file dup writefont closefile - restore - (prfont.ps) runlibfile - (t.ce.pfb) (r) file .loadfont - /Latin-CE DoFont - quit -} if diff --git a/Master/tlpkg/tlgs/lib/decrypt.ps b/Master/tlpkg/tlgs/lib/decrypt.ps deleted file mode 100644 index 92249182885..00000000000 --- a/Master/tlpkg/tlgs/lib/decrypt.ps +++ /dev/null @@ -1,14 +0,0 @@ -%! -% Decrypt an eexec-encoded file. - -(t.in) (r) file /in exch def -(t.out) (w) file /out exch def -256 string /buf exch def -55665 % eexec encryption seed - { in buf readhexstring /more exch def - dup .type1decrypt out exch writestring - more not { exit } if - } loop -in closefile -out closefile -quit diff --git a/Master/tlpkg/tlgs/lib/font2c.ps b/Master/tlpkg/tlgs/lib/font2c.ps deleted file mode 100644 index dffc24745e0..00000000000 --- a/Master/tlpkg/tlgs/lib/font2c.ps +++ /dev/null @@ -1,674 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% font2c.ps -% Write out a PostScript Type 0 or Type 1 font as C code -% that can be linked with the interpreter. -% This even works on protected fonts, if you use the -dWRITESYSTEMDICT -% switch in the command line. The code is reentrant and location- -% independent and has no external references, so it can be put into -% a sharable library even on VMS. - -/font2cdict 100 dict dup begin - -% Define the maximum string length that all compilers will accept. -% This must be approximately -% min(max line length, max string literal length) / 4 - 5. - -/max_wcs 50 def - -% Define a temporary file for writing out procedures. -/wtempname (_.tmp) def - -% ------ Protection utilities ------ % - -% Protection values are represented by a mask: -/a_noaccess 0 def -/a_executeonly 1 def -/a_readonly 3 def -/a_all 7 def -/prot_names - [ (0) (a_execute) null (a_readonly) null null null (a_all) - ] def -/prot_opers - [ {noaccess} {executeonly} {} {readonly} {} {} {} {} - ] def - -% Get the protection of an object. - /getpa - { dup wcheck - { pop a_all } - { % Check for executeonly or noaccess objects in protected. - dup protected exch known - { protected exch get } - { pop a_readonly } - ifelse - } - ifelse - } bind def - -% Get the protection appropriate for (all the) values in a dictionary. - /getva - { a_noaccess exch - { exch pop - dup type dup /stringtype eq 1 index /arraytype eq or - exch /packedarraytype eq or - { getpa a_readonly and or } - { pop pop a_all exit } - ifelse - } - forall - } bind def - -% Keep track of executeonly and noaccess objects, -% but don't let the protection actually take effect. -.currentglobal -false .setglobal % so protected can reference local objs -/protected % do first so // will work - systemdict wcheck { 1500 dict } { 1 dict } ifelse -def -systemdict wcheck not - { (Warning: you will not be able to convert protected fonts.\n) print - (If you need to convert a protected font, please\n) print - (restart the program and specify the -dWRITESYSTEMDICT switch.\n) print - flush - (%end) .skipeof - } -if -userdict begin - /executeonly - { dup //protected exch //a_executeonly put readonly - } bind def - /noaccess - { dup //protected exch //a_noaccess put readonly - } bind def -end -true .setglobal -systemdict begin - /executeonly - { userdict /executeonly get exec - } bind odef - /noaccess - { userdict /noaccess get exec - } bind odef -end -%end -.setglobal - -% ------ Output utilities ------ % - -% By convention, the output file is named cfile. - -% Define some utilities for writing the output file. - /wtstring 100 string def - /wb {cfile exch write} bind def - /ws {cfile exch writestring} bind def - /wl {ws (\n) ws} bind def - /wt {wtstring cvs ws} bind def - -% Write a C string. Some compilers have unreasonably small limits on -% the length of a string literal or the length of a line, so every place -% that uses wcs must either know that the string is short, -% or be prepared to use wcca instead. - /wbx - { 8#1000 add 8 (0000) cvrs dup 0 (\\) 0 get put ws - } bind def - /wcst - [ - 32 { /wbx load } repeat - 95 { /wb load } repeat - 129 { /wbx load } repeat - ] def - ("\\) { wcst exch { (\\) ws wb } put } forall - /wcs - { (") ws { dup wcst exch get exec } forall (") ws - } bind def - /can_wcs % Test if can use wcs - { length max_wcs le - } bind def - /wncs % name -> C string - { wtstring cvs wcs - } bind def -% Write a C string as an array of character values. -% We only need this because of line and literal length limitations. - /wca % <string> <prefix> <suffix> wca - - { 0 4 -2 roll exch - { % Stack: suffix n prefix char - exch ws - exch dup 19 ge { () wl pop 0 } if 1 add - exch dup 32 ge 1 index 126 le and - { 39 wb dup 39 eq 1 index 92 eq or { 92 wb } if wb 39 wb } - { wt } - ifelse (,) - } forall - pop pop ws - } bind def - /wcca % <string> wcca - - { ({\n) (}) wca - } bind def - -% Write object protection attributes. Note that dictionaries and arrays are -% the only objects that can be writable. - /wpa - { dup xcheck { (a_executable|) ws } if - dup type dup /dicttype eq exch /arraytype eq or - { getpa } - { getpa a_readonly and } - ifelse prot_names exch get ws - } bind def - /wva - { getva prot_names exch get ws - } bind def - -% ------ Object writing ------ % - - /wnstring 128 string def - -% Convert an object to a string to be scanned at a later time. - /cvos % <obj> cvos <string> - { % We'd like to use == and write directly to a string, - % but we can't do the former because of operators, - % and we can't do the latter because we can't predict - % how long the string would have to be.... - wtempname (w) file dup 3 -1 roll wproc closefile - wtempname status pop pop pop exch pop string - wtempname (r) file dup 3 -1 roll readstring pop exch closefile - } bind def - -% Write a string/name or null as an element of a string/name/null array. -% Convert any other kind of value to a token to be read back in. - /wsn - { dup null eq - { pop (\t255,255,) wl - } - { dup type /nametype eq { wnstring cvs } if - dup type /stringtype ne { cvos (255,) ws } if - dup length 256 idiv wt (,) ws - dup length 256 mod wt - (,) (,\n) wca - } - ifelse - } bind def -% Write a packed string/name/null array. - /wsna % <name> <(string|name|null)*> wsna - - { (\tstatic const unsigned char ) ws exch wt ([] = {) wl - { wsn } forall - (\t0\n};) wl - } bind def - -% Write a number or an array of numbers, as refs. -/isnumber - { type dup /integertype eq exch /realtype eq or - } bind def -/wnums - { dup isnumber - { (real_v\() ws wt (\),) ws } - { { wnums } forall } - ifelse - } bind def - -% Test whether a procedure or unusual array can be written (printed). -/iswx 4 dict dup begin - /arraytype { { iswproc } isall } def - /nametype { pop true } def - /operatortype { pop true } def % assume it has been bound in - /packedarraytype /arraytype load def -end def -/iswnx 6 dict dup begin - /arraytype { { iswproc } isall } def - /integertype { pop true } def - /nametype { pop true } def - /realtype { pop true } def - /stringtype { pop true } def - /packedarraytype /arraytype load def -end def -/iswproc % <obj> iswproc <bool> - { dup xcheck { iswx } { iswnx } ifelse - 1 index type .knownget { exec } { pop false } ifelse - } bind def - -% Write a printable procedure (one for which iswproc returns true). -/wproca 3 dict dup begin - /arraytype - { 1 index ({) writestring - { 1 index ( ) writestring 1 index exch wproc } forall - (}) writestring - } bind def - /packedarraytype /arraytype load def - /operatortype { .writecvs } bind def % assume binding would work -end def -/wproc % <file> <proc> wproc - - { dup type wproca exch .knownget { exec } { write==only } ifelse - } bind def - -% Write a named object. Return true if this was possible. -% Legal types are: boolean, integer, name, real, string, -% array of (integer, integer+real, name, null+string), -% and certain procedures and other arrays (see iswproc above). -% All other objects are either handled specially or ignored. - /isall % <array> <proc> isall <bool> - { true 3 -1 roll - { 2 index exec not { pop false exit } if } - forall exch pop - } bind def - /wott 8 dict dup begin - /arraytype - { woatt - { aload pop 2 index 2 index exec - { exch pop exec exit } - { pop pop } - ifelse - } - forall - } bind def - /booleantype - { { (\tmake_true\(&) } { (\tmake_false\(&) } ifelse ws - wt (\);) wl true - } bind def - /integertype - { (\tmake_int\(&) ws exch wt (, ) ws - wt (\);) wl true - } bind def - /nametype - { (\tcode = (*pprocs->name_create)\(i_ctx_p, &) ws exch wt - (, ) ws wnstring cvs wcs % OK, names are short - (\);) wl - (\tif ( code < 0 ) return code;) wl - true - } bind def - /packedarraytype - /arraytype load def - /realtype - { (\tmake_real\(&) ws exch wt (, (float)) ws - wt (\);) wl true - } bind def - /stringtype - { ({\tstatic const unsigned char s_[] = ) ws - dup dup can_wcs { wcs } { wcca } ifelse - (;) wl - (\tmake_const_string\(&) ws exch wt - (, a_readonly, ) ws length wt (, (const byte *)s_\);) wl - (}) wl true - } bind def - end def -% Write some other kind of object, if known. - /wother - { dup otherobjs exch known - { otherobjs exch get (\t) ws exch wt ( = ) ws wt (;) wl true } - { pop pop false } - ifelse - } bind def -% Top-level procedure. - /wo % name obj -> OK - { dup type wott exch .knownget { exec } { wother } ifelse - } bind def - -% Write an array (called by wo). - /wap % <name> <array> wap - - { dup xcheck not 1 index wcheck not and 1 index rcheck and - { pop pop } - { (\tr_set_attrs\(&) ws exch wt (, ) ws wpa (\);) wl } - ifelse - } bind def - /wnuma { % <name> <array> <element_C_type> <<type>_v> wnuma - - ({\tstatic const ref_\() ws exch ws (\) a_[] = {) wl exch - % Stack: name type_v array - dup length 0 eq { - (\t) ws 1 index ws (\(0\)) wl - } { - dup { - (\t) ws 2 index ws (\() ws wt (\),) wl - } forall - } ifelse exch pop - % Stack: name array - (\t};) wl - dup wcheck { - (\tcode = (*pprocs->scalar_array_create)\(i_ctx_p, &) ws exch wt - (, (const ref *)a_, ) ws dup length wt - (, ) ws wpa (\);) wl - (\tif ( code < 0 ) return code;) wl - } { - (\tmake_const_array\(&) ws exch wt - (, avm_foreign|) ws dup wpa (, ) ws length wt - (, (const ref *)a_\);) wl - } ifelse - (}) wl - } bind def - /woatt [ - % Integers - { { { type /integertype eq } isall } - { (long) (integer_v) wnuma true } - } - % Integers + reals - { { { type dup /integertype eq exch /realtype eq or } isall } - { (float) (real_v) wnuma true } - } - % Strings + nulls - { { { type dup /nulltype eq exch /stringtype eq or } isall } - { ({) ws dup (sa_) exch wsna - (\tcode = (*pprocs->string_array_create)\(i_ctx_p, &) ws exch wt - (, \(const char *\)sa_, ) ws dup length wt (, ) ws wpa (\);) wl - (\tif ( code < 0 ) return code;) wl - (}) wl true - } - } - % Names - { { { type /nametype eq } isall } - { ({) ws dup (na_) exch wsna - (\tcode = (*pprocs->name_array_create)\(i_ctx_p, &) ws 1 index wt - (, \(const char *\)na_, ) ws dup length wt (\);) wl - (\tif ( code < 0 ) return code;) wl - wap (}) wl true - } - } - % Procedure - { { iswproc } - { dup cvos - % Stack: name proc string - ({\tstatic const unsigned char s_[] = ) ws - dup dup can_wcs { wcs } { wcca } ifelse - (;) wl - (\tcode = (*pprocs->ref_from_string)\(i_ctx_p, &) ws 2 index wt - (, \(const char *\)s_, ) ws length wt (\);) wl - (\tif ( code < 0 ) return code;) wl - wap (}) wl true - wtempname deletefile - } - } - % Default - { { pop true } - { wother } - } - ] def - -% Write a named dictionary. We assume the ref is already declared. - /wd % <name> <dict> <extra> wd - - { 3 1 roll - ({) ws - (\tref v_[) ws dup length wt (];) wl - dup [ exch - { counttomark 2 sub wtstring cvs - (v_[) exch concatstrings (]) concatstrings exch wo not - { (Skipping ) print ==only (....\n) print } - if - } forall - ] - % Stack: array of keys (names) - ({) ws dup (str_keys_) exch wsna - (\tstatic const cfont_dict_keys keys_ =) wl - (\t { 0, 0, ) ws length wt (, ) ws 3 -1 roll wt (, ) ws - dup wpa (, ) ws dup wva ( };) wl pop - (\tcode = \(*pprocs->ref_dict_create\)\(i_ctx_p, &) ws wt - (, &keys_, \(const char *\)str_keys_, v_\);) wl - (\tif ( code < 0 ) return code;) wl - (}) wl - (}) wl - } bind def - -% Write character dictionary keys. -% We save a lot of space by abbreviating keys which appear in -% StandardEncoding or ISOLatin1Encoding. -% Writes code to declare and initialize enc_keys_, str_keys, and keys_. -/wcdkeys % <dict> wcdkeys - - { % Write keys present in StandardEncoding or ISOLatin1Encoding, - % pushing other keys on the o-stack. - (static const charindex enc_keys_[] = {) wl - dup [ exch 0 exch - { pop decoding 1 index known - { decoding exch get ({) ws dup -8 bitshift wt - (,) ws 255 and wt (}, ) ws - 1 add dup 5 mod 0 eq { (\n) ws } if - } - { exch } - ifelse - } - forall pop - ] - ({0,0}\n};) wl - % Write other keys. - (str_keys_) exch wsna - % Write the declaration for keys_. - (static const cfont_dict_keys keys_ = {) wl - (\tenc_keys_, countof\(enc_keys_\) - 1,) wl - (\t) ws dup length wt ( - \(countof\(enc_keys_\) - 1\), 0, ) ws - dup wpa (, ) ws wva () wl - (};) wl - } bind def - -% Enumerate character dictionary values in the same order that -% the keys appear in enc_keys_ and str_keys_. -% <proc> is called with each value in turn. -/cdforall % <dict> <proc> cdforall - - { 2 copy - { decoding 3 index known - { 3 -1 roll pop exec } - { pop pop pop } - ifelse - } - /exec cvx 3 packedarray cvx - /forall cvx - 5 -2 roll - { decoding 3 index known - { pop pop pop } - { 3 -1 roll pop exec } - ifelse - } - /exec cvx 3 packedarray cvx - /forall cvx - 6 packedarray cvx exec - } bind def - -% ------ Writers for special objects ------ % - -/writespecial 10 dict dup begin - - /FontInfo { 0 wd } def - - /Private { 0 wd } def - - /CharStrings - { ({) wl - dup wcdkeys - (static const unsigned char values_[] = {) wl - { wsn } cdforall - (\t0\n};) wl - (\tcode = \(*pprocs->string_dict_create\)\(i_ctx_p, &) ws wt - (, &keys_, (const char *)str_keys_, \(const char *\)values_\);) wl - (\tif ( code < 0 ) return code;) wl - (}) wl - } bind def - - /Metrics - { ({) wl - dup wcdkeys - (static const ref_(float) values_[] = {) wl - dup { (\t) ws wnums () wl } cdforall - (\t0\n};) wl - (static const unsigned char lengths_[] = {) wl - { (\t) ws dup isnumber - { pop 0 } - { length 1 add } - ifelse wt (,) wl - } cdforall - (\t0\n};) wl - (\tcode = \(*pprocs->num_dict_create\)\(i_ctx_p, &) ws wt - (, &keys_, str_keys_, (const ref *)values_, lengths_\);) wl - (\tif ( code < 0 ) return code;) wl - (}) wl - } bind def - - /Metrics2 /Metrics load def - - /FDepVector pop % (converted to a list of font names) - -end def - -% ------ The main program ------ % - -% Construct an inverse dictionary of encodings. -[ /StandardEncoding /ISOLatin1Encoding - /SymbolEncoding /DingbatsEncoding - /KanjiSubEncoding -] -dup length dict begin - { mark exch dup { .findencoding exch def } stopped cleartomark - } forall -currentdict end /encodingnames exch def - -% Invert the StandardEncoding and ISOLatin1Encoding vectors. -512 dict begin - 0 1 255 { dup ISOLatin1Encoding exch get exch 256 add def } for - 0 1 255 { dup StandardEncoding exch get exch def } for -currentdict end /decoding exch def - -/writefont % cfilename procname -> [writes the current font] - { (gsf_) exch concatstrings - /fontprocname exch def - /cfname exch def - /cfile cfname (w) file def - -% Remove unwanted keys from the font. - currentfont dup length dict begin { def } forall - { /FID /MIDVector /CurMID } { currentdict exch undef } forall - /Font currentdict end def - -% Replace the FDepVector with a list of font names. - Font /FDepVector .knownget - { [ exch { /FontName get } forall ] - Font /FDepVector 3 -1 roll put - } - if - -% Find all the special objects we know about. -% wo uses this to write out references to otherwise intractable objects. - /otherobjs writespecial length dict dup begin - writespecial - { pop Font 1 index .knownget { exch def } { pop } ifelse - } - forall - end def - -% Define a dummy FontInfo, in case the font doesn't have one. - /FontInfo 0 dict def - -% Write out the boilerplate. - Font begin - (/****************************************************************) wl - ( Portions of this file are subject to the following notice(s):) wl - systemdict /copyright get wl - FontInfo /Notice .knownget - { (----------------------------------------------------------------) wl wl - } if - (****************************************************************/) wl - () wl - (/* ) ws cfname ws ( */) wl - (/* This file was created by the ) ws product ws ( font2c utility. */) wl - () wl - (#undef DEBUG) wl - (#include "ccfont.h") wl - () wl - -% Write the procedure prologue. - (#ifdef __PROTOTYPES__) wl - (ccfont_proc\() ws fontprocname ws (\);) wl - (int) wl - fontprocname ws ((i_ctx_t *i_ctx_p, const cfont_procs *pprocs, ref *pfont)) wl - (#else) wl - (int) wl - fontprocname ws ((i_ctx_p, pprocs, pfont) i_ctx_t *i_ctx_p; const cfont_procs *pprocs; ref *pfont;) wl - (#endif) wl - ({\tint code;) wl - (\tref Font;) wl - otherobjs - { exch pop (\tref ) ws wt (;) wl } - forall - -% Write out the special objects. - otherobjs - { exch writespecial 2 index get exec - } - forall - -% Write out the main font dictionary. -% If possible, substitute the encoding name for the encoding; -% PostScript code will fix this up. - { /Encoding /PrefEnc } - { Font 1 index .knownget - { encodingnames exch .knownget { def } { pop } ifelse } - { pop } - ifelse - } - forall - (Font) Font FontType 0 eq { 5 } { 1 } ifelse wd - -% Finish the procedural initialization code. - (\t*pfont = Font;) wl - (\treturn 0;) wl - (}) wl - end % Font - - cfile closefile - - } bind def - -end def % font2cdict - -% Compute the procedure name from the font name. -% Replace all non-alphanumeric characters with '_'. -/makefontprocnamemap 256 string - 0 1 255 { 2 copy 95 put pop } for - (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz) - { 2 copy dup put pop } forall -readonly def -/makefontprocname % <fontname> makefontprocname <procnamestring> - { dup length string cvs - dup length 1 sub -1 0 - { % Stack: string index - 2 copy 2 copy get //makefontprocnamemap exch get put pop - } - for - } def - -/writefont { font2cdict begin writefont end } def - -% If the program was invoked from the command line, run it now. -[ shellarguments - { counttomark dup 2 eq exch 3 eq or - { counttomark -1 roll cvn - (Converting ) print dup =only ( font.\n) print flush - % Ensure that we get a clean copy of the font from the - % file system. - 2 { % do both local and global - currentglobal not setglobal - dup undefinefont - } repeat - findfont setfont - (FontName is ) print currentfont /FontName get ==only (.\n) print flush - counttomark 1 eq - { % Construct the procedure name from the file name. - currentfont /FontName get makefontprocname - } - if - writefont - (Done.\n) print flush - } - { cleartomark - (Usage: font2c fontname cfilename.c [shortname]\n) print - ( e.g.: font2c Courier cour.c\n) print flush - mark - } - ifelse - } -if pop diff --git a/Master/tlpkg/tlgs/lib/font2pcl.ps b/Master/tlpkg/tlgs/lib/font2pcl.ps deleted file mode 100644 index df0c92d7279..00000000000 --- a/Master/tlpkg/tlgs/lib/font2pcl.ps +++ /dev/null @@ -1,600 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% font2pcl.ps -% Write out a font as a PCL bitmap font. - -/pcldict 60 dict def - -% Write out the current font as a PCL bitmap font. -% The current transformation matrix defines the font size and orientation. - -/WriteResolution? false def % true=use "resolution bound font" format, - % false=use older format - -/LJ4 false def % true=use LJ4 Typeface code - % false=use LJIIP/IID/IIIx Typeface code - -pcldict begin % internal procedures - -/findstring % <string> <substring> findstring <bool> - { search { pop pop pop true } { pop false } ifelse - } def - - % Determine which set of keywords is present in a string. - % The last keyword set must be empty. - -/keysearch % <string> <array of arrays of keywords> keysearch <index> - { 0 1 2 index length 1 sub - { 2 copy get true exch - { % Stack: <string> <a.a.k.> <index> <bool> <keyword> - 4 index exch findstring and - } - forall - { 0 exch getinterval exit - } - if pop - } - for - exch pop length % invalid index if missing - } def - - % Determine the device height of a string in quarter-dots. - -/charheight % <string> charheight <int> - { gsave newpath 0 0 moveto false charpath - pathbbox exch pop exch sub exch pop 0 exch grestore - dtransform add abs 4 mul cvi - } def - - % Compute an integer version of the transformed FontBBox. - -/inflate % <num> inflate <num> - { dup 0 gt { ceiling } { floor } ifelse - } def -/ixbbox % - ixbbox <llx> <lly> <urx> <ury> - { /FontBBox load aload pop % might be executable or literal - 4 2 roll transform exch truncate cvi exch truncate cvi - 4 2 roll transform exch inflate cvi exch inflate cvi - } def - - % Determine the original font of a possibly transformed font. - % Since some badly behaved PostScript files construct transformed - % fonts "by hand", we can't just rely on the OrigFont pointers. - % Instead, if a font with the given name exists, and if its - % entries for FontType and UniqueID match those of the font we - % obtain by following the OrigFont chain, we use that font. - -/origfont - { { dup /OrigFont known not { exit } if /OrigFont get } loop - FontDirectory 1 index /FontName get .knownget - { % Stack: origfont namedfont - 1 index /FontType get 1 index /FontType get eq - { 1 index /UniqueID .knownget - { 1 index /UniqueID .knownget - { eq { exch } if } - { pop } - ifelse - } - if - } - if pop - } - if - } def - - % Determine the bounding box of the current device's image. - % Free variables: row, zerow. - -/devbbox % <rw> <rh> devbbox <ymin> <ymax1> <xmin> <xmax1> - { % Find top and bottom whitespace. - dup - { dup 0 eq { exit } if 1 sub - dup currentdevice exch row copyscanlines - zerow ne { 1 add exit } if - } - loop % ymax1 - 0 - { 2 copy eq { exit } if - dup currentdevice exch row copyscanlines - zerow ne { exit } if - 1 add - } - loop % ymin - exch - % Find left and right whitespace. - 3 index 0 - % Stack: rw rh ymin ymax1 xmin xmax1 - 3 index 1 4 index 1 sub - { currentdevice exch row copyscanlines .findzeros - exch 4 1 roll .max 3 1 roll .min exch - } - for % xmin xmax1 - % Special check: xmin > xmax1 if height = 0 - 2 copy gt { exch pop dup } if - 6 -2 roll pop pop - - } def - - % Write values on outfile. - - /w1 { 255 and outfile exch write } def - /w2 { dup -8 bitshift w1 w1 } def - /wbyte % <byte> <label> wbyte - { VDEBUG { print ( =byte= ) print dup == flush } { pop } ifelse w1 - } def - /wword % <word16> <label> wword - { VDEBUG { print ( =word= ) print dup == flush } { pop } ifelse w2 - } def - /wdword % <word32> <label> wdword - { VDEBUG { print ( =dword= ) print dup == flush } { pop } ifelse - dup -16 bitshift w2 w2 - } def - -/style.posture.keys - [ { (Italic) } { (Oblique) } - { } - ] def -/style.posture.values <010100> def - -/style.appearance.width.keys - [ { (Ultra) (Compressed) } - { (Extra) (Compressed) } - { (Extra) (Condensed) } - { (Extra) (Extended) } - { (Extra) (Expanded) } - { (Compressed) } - { (Condensed) } - { (Extended) } - { (Expanded) } - { } - ] def -/style.appearance.width.values <04030207070201060600> def - -/width.type.keys - [ { (Ultra) (Compressed) } - { (Extra) (Compressed) } - { (Extra) (Condensed) } - { (Extra) (Expanded) } - { (Compressed) } - { (Condensed) } - { (Expanded) } - { } - ] def -/width.type.values <fbfcfd03fdfe0200> def - -/stroke.weight.keys - [ { (Ultra) (Thin) } - { (Ultra) (Black) } - { (Extra) (Thin) } - { (Extra) (Light) } - { (Extra) (Bold) } - { (Extra) (Black) } - { (Demi) (Light) } - { (Demi) (Bold) } - { (Semi) (Light) } - { (Semi) (Bold) } - { (Thin) } - { (Light) } - { (Bold) } - { (Black) } - { } - ] def -/stroke.weight.values <f907fafc0406fe02ff01fbfd030500> def - -/vendor.keys - [ { (Agfa) } - { (Bitstream) } - { (Linotype) } - { (Monotype) } - { (Adobe) } - { } - ] def -/vendor.default.index 4 def % might as well be Adobe -/old.vendor.values <020406080a00> def -/new.vendor.values <010203040500> def -/vendor.initials (CBLMA\000) def - -currentdict readonly end pop % pcldict - -% Convert and write a PCL font for the current font and transformation. - -% Write the font header. We split this off only to avoid overflowing -% the limit on the maximum size of a procedure. -% Free variables: outfile uury u0y rw rh orientation uh ully -/writefontheader - { outfile (\033\)s) writestring - outfile 64 WriteResolution? { 4 add } if - Copyright length add write==only - outfile (W) writestring - WriteResolution? { 20 68 } { 0 64 } ifelse - (Font Descriptor Size) wword - (Header Format) wbyte - 1 (Font Type) wbyte - FullName style.posture.keys keysearch style.posture.values exch get - FullName style.appearance.width.keys keysearch - style.appearance.width.values exch get 4 mul add - PaintType 2 eq { 32 add } if - /style exch def - style -8 bitshift (Style MSB) wbyte - 0 (Reserved) wbyte - /baseline uury 1 sub u0y sub def - baseline (Baseline Position) wword - rw (Cell Width) wword - rh (Cell Height) wword - orientation (Orientation) wbyte - FontInfo /isFixedPitch .knownget not { false } if - { 0 } { 1 } ifelse (Spacing) wbyte - % Use loop/exit to fake a multiple-exit block. - { Encoding StandardEncoding eq { 10 (J) exit } if - Encoding ISOLatin1Encoding eq { 11 (J) exit } if - Encoding SymbolEncoding eq { 19 (M) exit } if - Encoding DingbatsEncoding eq { 10 (L) exit } if -% (Warning: unknown Encoding, using ISOLatin1.\n) print flush - 11 (J) exit - } - loop - 0 get 64 sub exch 32 mul add (Symbol Set) wword - ( ) stringwidth pop 0 dtransform add abs 4 mul - /pitch exch def - pitch cvi (Pitch) wword - uh 4 mul (Height) wword % Height - (x) charheight (x-Height) wword - FullName width.type.keys keysearch - width.type.values exch get (Width Type) wbyte - style 255 and (Style LSB) wbyte - FullName stroke.weight.keys keysearch - stroke.weight.values exch get (Stroke Weight) wbyte - FullName vendor.keys keysearch - dup vendor.initials exch get 0 eq - { % No vendor in FullName, try Notice - pop Copyright vendor.keys keysearch - dup vendor.initials exch get 0 eq { pop vendor.default.index } if - } - if - /vendor.index exch def - 0 (Typeface LSB) wbyte % punt - 0 (Typeface MSB) wbyte % punt - 0 (Serif Style) wbyte % punt - 2 (Quality) wbyte - 0 (Placement) wbyte - gsave FontMatrix concat rot neg rotate - /ulwidth - FontInfo /UnderlineThickness .knownget - { 0 exch dtransform exch pop abs } - { resolution 100 div } - ifelse def - FontInfo /UnderlinePosition .knownget - { 0 exch transform exch pop negY ulwidth 2 div add } - { ully ulwidth add } - ifelse u0y sub - round cvi 1 .max 255 .min (Underline Position) wbyte - ulwidth round cvi 1 .max 255 .min (Underline Thickness) wbyte - grestore - uh 1.2 mul 4 mul cvi (Text Height) wword - (average lowercase character) dup stringwidth - pop 0 dtransform add abs - exch length div 4 mul cvi (Text Width) wword - 0 - { dup Encoding exch get /.notdef ne { exit } if - 1 add - } - loop (First Code) wword - 255 - { dup Encoding exch get /.notdef ne { exit } if - 1 sub - } - loop (Last Code) wword - pitch dup cvi sub 256 mul cvi (Pitch Extended) wbyte - 0 (Height Extended) wbyte - 0 (Cap Height) wword % (default) - currentfont /UniqueID known { UniqueID } { 0 } ifelse - 16#c1000000 add (Font Number (Adobe UniqueID)) wdword - FontName length 16 .max string - dup FontName exch cvs pop - outfile exch 0 16 getinterval writestring % Font Name - WriteResolution? - { resolution dup (X Resolution) wword (Y Resolution) wword - } - if - outfile Copyright writestring % Copyright - } def - -/writePCL % <fontfile> <resolution> writePCL - - { - save - currentfont begin - pcldict begin - 80 dict begin % allow for recursion - /saved exch def - /resolution exch def - /outfile exch def - matrix currentmatrix dup 4 0 put dup 5 0 put setmatrix - - % Supply some default values so we don't have to check later. - - currentfont /FontInfo known not { /FontInfo 1 dict def } if - currentfont /FontName known not { /FontName () def } if - /Copyright FontInfo /Notice .knownget not { () } if def - /FullName - FontInfo /FullName .knownget not - { FontName dup length string cvs } - if def - - % Determine the original font, and its relationship to this one. - - /OrigFont currentfont origfont def - /OrigMatrix OrigFont /FontMatrix get def - /OrigMatrixInverse OrigMatrix matrix invertmatrix def - /ScaleMatrix matrix currentfont OrigFont ne - { FontMatrix exch OrigMatrixInverse exch concatmatrix - } if - def - /CurrentScaleMatrix - matrix currentmatrix - matrix defaultmatrix - dup 0 get 1 index 3 get mul 0 lt - 1 index dup 1 get exch 2 get mul 0 gt or - /flipY exch def - dup invertmatrix - dup concatmatrix - def - /negY flipY { {neg} } { {} } ifelse def - - % Print debugging information. - - /CDEBUG where { pop } { /CDEBUG false def } ifelse - /VDEBUG where { pop } { /VDEBUG false def } ifelse - CDEBUG { /VDEBUG true def } if - DEBUG - { (currentmatrix: ) print matrix currentmatrix == - (defaultmatrix: ) print matrix defaultmatrix == - (flipY: ) print flipY == - (scaling matrix: ) print CurrentScaleMatrix == - (FontMatrix: ) print FontMatrix == - (FontBBox: ) print /FontBBox load == - currentfont OrigFont ne - { OrigFont /FontName .knownget { (orig FontName: ) print == } if - (orig FontMatrix: ) print OrigMatrix == - } if - currentfont /ScaleMatrix .knownget { (ScaleMatrix: ) print == } if - gsave - FontMatrix concat - (combined matrix: ) print matrix currentmatrix == - grestore - flush - } if - - % Determine the orientation. - - ScaleMatrix matrix currentmatrix dup concatmatrix - 0 1 3 - { 1 index 1 get 0 eq 2 index 2 get 0 eq and 2 index 0 get 0 gt and - { exit } if - pop -90 matrix rotate exch dup concatmatrix - } - for - dup type /integertype ne - { (Only rotations by multiples of 90 degrees are supported:\n) print - == flush - saved end end end restore stop - } - if - /orientation exch def - /rot orientation 90 mul def - DEBUG { (orientation: ) print orientation == flush } if - - dup dup 0 get exch 3 get negY sub abs 0.5 ge - { (Only identical scaling in X and Y is supported:\n) print - exch flipY 3 array astore == - currentdevice .devicename == - matrix defaultmatrix == flush - saved end end end restore stop - } - if pop - - % Determine the font metrics, in the PCL character coordinate system, - % which has +Y going towards the top of the page. - - gsave - FontMatrix concat - 0 0 transform - negY round cvi /r0y exch def - round cvi /r0x exch def - ixbbox - negY /rury exch def /rurx exch def - negY /rlly exch def /rllx exch def - /rminx rllx rurx .min def - /rminy rlly negY rury negY .min def - /rw rurx rllx sub abs def - /rh rury rlly sub abs def - gsave rot neg rotate - 0 0 transform - negY round cvi /u0y exch def - round cvi /u0x exch def - ixbbox - negY /uury exch def /uurx exch def - negY /ully exch def /ullx exch def - /uw uurx ullx sub def - /uh uury ully sub def - grestore - DEBUG - { (rmatrix: ) print matrix currentmatrix == - (rFontBBox: ) print [rllx rlly rurx rury] == - (uFontBBox: ) print [ullx ully uurx uury] == - flush - } if - grestore - - % Disable the character cache, to avoid excessive allocation - % and memory sandbars. - - mark cachestatus /upper exch def - cleartomark 0 setcachelimit - - % Write the font header. - - writefontheader - - % Establish an image device for rasterizing characters. - - matrix currentmatrix - dup 4 rminx neg put - dup 5 rminy neg put - % Round the width up to a multiple of 8 - % so we don't get garbage bits in the last byte of each row. - rw 7 add -8 and rh <ff 00> makeimagedevice - /cdevice exch def - nulldevice % prevent page device switching - cdevice setdevice - - % Rasterize each character in turn. - - /raster rw 7 add 8 idiv def - /row raster string def - /zerow row length string def - 0 1 Encoding length 1 sub - { /cindex exch def - Encoding cindex get /.notdef ne - { VDEBUG { Encoding cindex get == flush } if - erasepage initgraphics - 0 0 moveto currentpoint transform add - ( ) dup 0 cindex put show - currentpoint transform add exch sub round cvi - /cwidth exch abs def - rw rh devbbox - VDEBUG - { (image bbox: ) print 4 copy 4 2 roll 4 array astore == flush - } if - % Save the device bounding box. - % Note that this is in current device coordinates, - % not PCL (right-handed) coordinates. - /bqx exch def /bpx exch def /bqy exch def /bpy exch def - % Re-render with the character justified to (0,0). - % This may be either the lower left or the upper left corner. - bpx neg bpy neg idtransform moveto - erasepage - VDEBUG { (show point: ) print [ currentpoint transform ] == flush } if - ( ) dup 0 cindex put show - % Find the bounding box. Note that xmin and ymin are now 0, - % xmax1 = xw, and ymax1 = yh. - rw rh devbbox - /xw exch def - % xmin or ymin can be non-zero only if the character is blank. - xw 0 eq - { pop } - { dup 0 ne { (Non-zero xmin! ) print = } { pop } ifelse } - ifelse - /yh exch def - yh 0 eq - { pop } - { dup 0 ne { (Non-zero ymin! ) print = } { pop } ifelse } - ifelse - - /xbw xw 7 add 8 idiv def - /xright raster 8 mul xw sub def - % Write the Character Code command. - outfile (\033*c) writestring - outfile cindex write==only - outfile (E) writestring - % Write the Character Definition command. - outfile (\033\(s) writestring - yh xbw mul 16 add - outfile exch write=only - % Record the character position for the .PCM file. - /cfpos outfile fileposition 1 add def - outfile (W\004\000\016\001) writestring - orientation (Orientation) wbyte 0 (Reserved) wbyte - rminx bpx add r0x sub (Left Offset) wword - flipY { rminy bpy add neg } { rminy bqy add } ifelse r0y sub - (Top Offset) wword - xw (Character Width) wword - yh (Character Height) wword - cwidth orientation 2 ge { neg } if 4 mul (Delta X) wword - % Write the character data. - flipY { 0 1 yh 1 sub } { yh 1 sub -1 0 } ifelse - { cdevice exch row copyscanlines - 0 xbw getinterval - CDEBUG - { dup - { 8 - { dup 128 ge { (+) } { (.) } ifelse print - 127 and 1 bitshift - } - repeat pop - } - forall (\n) print - } - if - outfile exch writestring - } - for - } - { /bpx 0 def /bpy 0 def /bqx 0 def /bqy 0 def - /cwidth 0 def - /cfpos 0 def - } - ifelse - - } - for - - % Wrap up. - - upper setcachelimit - outfile closefile - - nulldevice % prevent page device switching - saved end end end restore - - } def - -% Provide definitions for testing with older or non-custom interpreters. - -/.findzeros where { pop (%END) .skipeof } if -/.findzeros - { userdict begin /zs exch def /zl zs length def - 0 { dup zl ge { exit } if dup zs exch get 0 ne { exit } if 1 add } loop - zl { dup 0 eq { exit } if dup 1 sub zs exch get 0 ne { exit } if 1 sub } loop - exch 3 bitshift exch 3 bitshift - 2 copy lt - { exch zs 1 index -3 bitshift get - { dup 16#80 and 0 ne { exit } if exch 1 add exch 1 bitshift } loop pop - exch zs 1 index -3 bitshift 1 sub get - { dup 1 and 0 ne { exit } if exch 1 sub exch -1 bitshift } loop pop - } - if end - } bind def -%END - -/write=only where { pop (%END) .skipeof } if -/w=s 128 string def -/write=only - { w=s cvs writestring - } bind def -%END - -%**************** Test -/PCLTEST where { - pop - /DEBUG true def - /CDEBUG true def - /VDEBUG true def - /Times-Roman findfont 10 scalefont setfont - (t.pcf) (w) file - 300 72 div dup scale - 300 writePCL - flush quit -} if diff --git a/Master/tlpkg/tlgs/lib/gs_pfile.ps b/Master/tlpkg/tlgs/lib/gs_pfile.ps deleted file mode 100644 index 1118d8aa567..00000000000 --- a/Master/tlpkg/tlgs/lib/gs_pfile.ps +++ /dev/null @@ -1,126 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% Runtime support for minimum-space fonts and packed files. - -% ****** NOTE: This file must be kept consistent with -% ****** packfile.ps and wrfont.ps. - -% ---------------- Packed file support ---------------- % - -% A packed file is the concatenation of several file groups, each of which -% is the result of compressing several files concatenated together. -% The packed file begins with a procedure that creates an appropriate -% decoding filter for each file group, as follows: -% <group-subfile-filter> -proc- <group-decode-filter> -% Thus, accessing an individual file requires 4 parameters: -% the starting address and length of the outer compressed file, -% and the starting address and length of the inner file. -/.packedfilefilter % <file> <ostart> <olength> <istart> <ilength> - % .packedfilefilter <filter> - { 4 index systemdict begin token pop end 6 1 roll - % Stack: fproc file ostart olength istart ilength - 4 index 5 -1 roll setfileposition - % Stack: fproc file olength istart ilength - 4 -2 roll () /SubFileDecode filter - % Stack: fproc istart ilength ofilter - 4 -1 roll exec - % Filters don't support setfileposition, so we must skip data - % by reading it into a buffer. We rely on the fact that - % save/restore don't affect file positions. - % Stack: istart ilength dfilter - save exch 64000 string - % Stack: istart ilength save dfilter scratch - 4 index 1 index length idiv { 2 copy readstring pop pop } repeat - 2 copy 0 8 -1 roll 2 index length mod getinterval readstring pop pop pop - % Stack: ilength save dfilter - exch restore exch () /SubFileDecode filter - } bind def - -% Run a packed library file. -/.runpackedlibfile % <filename> <ostart> <olength> <istart> <ilength> - % .runpackedlibfile - { 5 -1 roll findlibfile - { exch pop dup 6 2 roll .packedfilefilter - currentobjectformat exch 1 setobjectformat run - setobjectformat closefile - } - { 5 1 roll /findlibfile .systemvar /undefinedfilename signalerror - } - ifelse - } bind def - -% ---------------- Compacted font support ---------------- % - -% Compacted fonts written by wrfont.ps depend on the existence and -% specifications of the procedures and data in this section. - -/.compactfontdefault mark - /PaintType 0 - /FontMatrix [0.001 0 0 0.001 0 0] readonly - /FontType 1 - /Encoding StandardEncoding -.dicttomark readonly def - -/.checkexistingfont % <fontname> <uid> <privatesize> <fontsize> - % .checkexistingfont - % {} (<font> on d-stack) - % <fontname> <uid> <privatesize> <fontsize> - % .checkexistingfont - % -save- --restore-- (<font> on d-stack) - { FontDirectory 4 index .knownget - { dup /UniqueID .knownget - { 4 index eq exch /FontType get 1 eq and } - { pop false } - ifelse - } - { false - } - ifelse - { save /restore load 6 2 roll } - { {} 5 1 roll } - ifelse - dict //.compactfontdefault exch .copydict begin - dict /Private exch def - Private begin - /MinFeature {16 16} def - /Password 5839 def - /UniqueID 1 index def - end - /UniqueID exch def - /FontName exch def - } bind def - -/.knownEncodings [ - ISOLatin1Encoding - StandardEncoding - SymbolEncoding -] readonly def - -/.readCharStrings % <count> <encrypt> .readCharStrings <dict> - { exch dup dict dup 3 -1 roll - { currentfile token pop dup type /integertype eq - { dup -8 bitshift //.knownEncodings exch get exch 255 and get } if - currentfile token pop dup type /nametype eq - { 2 index exch get - } - { % Stack: encrypt dict dict key value - 4 index { 4330 exch dup .type1encrypt exch pop } if - readonly - } - ifelse put dup - } - repeat pop exch pop - } bind def diff --git a/Master/tlpkg/tlgs/lib/gs_rdlin.ps b/Master/tlpkg/tlgs/lib/gs_rdlin.ps deleted file mode 100644 index aefd6d00438..00000000000 --- a/Master/tlpkg/tlgs/lib/gs_rdlin.ps +++ /dev/null @@ -1,19 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% Patch for systems with readline support in the interpreter. - -% Disable the prompt message, since readline will generate it. -/.promptmsg { } def diff --git a/Master/tlpkg/tlgs/lib/impath.ps b/Master/tlpkg/tlgs/lib/impath.ps deleted file mode 100644 index 8ddc1ef1a89..00000000000 --- a/Master/tlpkg/tlgs/lib/impath.ps +++ /dev/null @@ -1,178 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% impath.ps -% Reverse-rasterize a bitmap to produce a Type 1 outline. -% (This was formerly a Ghostscript operator implemented in C.) - -% <image> <width> <height> <wx> <wy> <ox> <oy> <string> -% type1imagepath <substring> -% Converts an image (bitmap) description of a character into -% a scalable description in Adobe Type 1 format. The -% current transformation matrix should be the same as the -% FontMatrix of the font in which this character will be -% used: this establishes the scaling relationship between -% image pixels (the image is assumed to be 1 unit high in -% user space) and the character coordinate system used in -% the scalable description. wx and wy are the character -% width, and ox and oy are the character origin relative -% to the lower left corner of the bitmap, in *pixels*. -% The image is assumed to be stored in left-to-right, -% top-to-bottom order. Note that this is not consistent -% with the `image' operator's interpretation of the CTM. -% All coordinates in the scalable description are rounded to -% integers, so the coefficients in the FontMatrix should -% be on the order of 1/N for some value of N that is -% either a multiple of the height/width or is large -% compared to the width and height. (There is a -% convention, which some PostScript programs rely on, that -% N=1000.) -% Note that the encoded description has *not* been subjected -% to CharString encryption, which is necessary before the -% description can be given to type1addpath: to do this, -% follow the type1imagepath with -% 4330 exch dup .type1encrypt exch pop -% If the description is too complex to fit into the supplied -% string, a limitcheck error results. A good rule of -% thumb is that the size of the string should be about 6 -% times the number of 1-bits in the image that are not -% completely surrounded by other 1-bits. - -% Import the Type 1 opcodes. -(type1ops.ps) runlibfile - -100 dict -dup /type1imagepath_dict exch def -begin - -/rc { round cvi } bind def -/moving [/rmoveto /hmoveto /vmoveto] def -/drawing [/rlineto /hlineto /vlineto] def - -% Convert the current path to a Type 1 token array. -/putxy % x y ops -> cs_elements - { 3 -1 roll dup x sub rc exch /x exch def - 3 -1 roll dup y sub rc exch /y exch def - % stack: ops dx dy - dup 0 eq - { % dy = 0, use hmoveto/lineto - pop exch 1 get - } - { 1 index 0 eq - { % dx = 0, use vmoveto/lineto - exch pop exch 2 get - } - { % use rmoveto/rlineto - 3 -1 roll 0 get - } - ifelse - } - ifelse - } bind def -/pathtotype1 % -> charstack - { 3 dict begin /x 0 def /y 0 def - mark - { moving putxy - } - { drawing putxy - } - { % Convert curve to relative form - x y 3 - { exch neg 7 index add rc - exch neg 6 index add rc - 8 -2 roll - } - repeat /y exch def /x exch def - 1 index 0 eq 5 index 0 eq and % dy1=dx3=0, hv - { 5 -1 roll pop exch pop /hvcurveto - } - { dup 0 eq 6 index 0 eq and % dx1=dy3=0, vh - { 6 -1 roll pop pop /vhcurveto - } - { /rrcurveto % none of the above - } - ifelse - } - ifelse - } - { /closepath - } - pathforall end - } bind def - -end % type1imagepath_dict - -% The main program -/type1imagepath % image width height wx wy ox oy string -> - % substring - { type1imagepath_dict begin - /tsave save def - /ostring exch def - /oy exch def /ox exch def - /wy exch def /wx exch def - /height exch def /width exch def - /data exch def - - /ofilter ostring /NullEncode filter def - /raster width 7 add 8 idiv def - -% Construct the coordinate transformation. - height dup scale - matrix currentmatrix matrix invertmatrix setmatrix - -% Determine the left side bearing. - /lsbx width - 0 1 width 1 sub - { dup dup 8 idiv 0 exch - raster raster height mul 1 sub - { data exch get or } - for exch 8 mod bitshift 128 and 0 ne - { exch pop exit } - if pop - } - for def - -% Compute and encode the origin, width, and side bearing. - mark - ox oy dtransform - rc /opty exch def rc /optx exch def - wx wy dtransform - rc /iwy exch def rc /iwx exch def - lsbx ox sub 0 dtransform - rc /ilsby exch def rc /ilsbx exch def - ilsbx - iwy 0 ne ilsby 0 ne or - { ilsby iwx iwy /sbw } - { iwx /hsbw } - ifelse - ofilter charstack_write - -% Flip over the Y axis, because the image is stored top-to-bottom. - [1 0 0 -1 0 height] concat -% Account for the character origin. - lsbx oy translate -% Trace the outline. - newpath - width height data .imagepath - gsave matrix setmatrix pathtotype1 grestore - ofilter charstack_write -% Terminate the output - mark /endchar ofilter charstack_write - - ofilter .fileposition ofilter closefile % flush buffers - ostring 0 3 -1 roll getinterval - tsave restore - end - } bind def diff --git a/Master/tlpkg/tlgs/lib/level1.ps b/Master/tlpkg/tlgs/lib/level1.ps deleted file mode 100644 index b4c53c1a453..00000000000 --- a/Master/tlpkg/tlgs/lib/level1.ps +++ /dev/null @@ -1,2 +0,0 @@ -%! -/.setlanguagelevel where { pop 1 .setlanguagelevel } if diff --git a/Master/tlpkg/tlgs/lib/markhint.ps b/Master/tlpkg/tlgs/lib/markhint.ps deleted file mode 100644 index f83d62d85af..00000000000 --- a/Master/tlpkg/tlgs/lib/markhint.ps +++ /dev/null @@ -1,129 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% markhint.ps -% Draw the hints for a Type 1 font. - -(type1ops.ps) runlibfile - -/mhsetup % <matrix> <print> mhsetup - - { /mhprint exch def - /mhmx exch def - /mhdash 0 9 gsave initmatrix dtransform grestore idtransform add abs def - gsave - clippath pathbbox - 2 index sub /bbh exch def - 2 index sub /bbw exch def - /bby exch def - /bbx exch def - grestore - } def - -/markfonthints % <matrix> <print> markfonthints - - { mhsetup - } def - -/hmark % <y> hmark - - { bbx exch moveto bbw 0 rlineto stroke - } def -/hsmark % <y0> <dy> hsmark - - { 1 index add exch gsave - [mhdash] 0 setdash 0 exch mhmx transform exch pop hmark - [mhdash 2 div dup 2 mul] 0 setdash 0 exch mhmx transform exch pop hmark - grestore - } def -/vmark % <x> vmark - - { bby moveto 0 bbh rlineto stroke - } def -/vsmark % <x0> <dx> vsmark - - { 1 index add exch gsave - [mhdash] mhdash setdash 0 mhmx transform pop vmark - [mhdash 2 div dup 2 mul] 0 setdash 0 mhmx transform pop vmark - grestore - } def -/pmark % <x> <y> pmark - - { newpath 0 4.5 gsave initmatrix dtransform grestore idtransform add abs - 0 360 arc stroke - } def -/mchdict mark - /hsbw { pop 0 mhmx transform translate 0 0 pmark } - /sbw { pop pop mhmx transform translate 0 0 pmark } - /hstem - { mhprint { (hstem ) print 2 copy 2 packedarray == } if - hsmark - } - /vstem - { mhprint { (vstem ) print 2 copy 2 packedarray == } if - vsmark - } - /hstem3 - { mhprint { (hstem3 ) print 6 copy 6 packedarray == } if - 3 { hsmark } repeat - } - /vstem3 - { mhprint { (vstem3 ) print 6 copy 6 packedarray == } if - 3 { vsmark } repeat - } - /div - { div - } - /callothersubr - { 3 eq - { pop - mhprint { (replace) = } if - % We're replacing hints; lighten the color. - currentrgbcolor 3 { 2 mul 3 div 3 1 roll } repeat setrgbcolor - } - { { pop } repeat - } ifelse - } - /callsubr - { Private /Subrs get exch get mchinterp - } - /pop - { - } - /return - { - } -.dicttomark def - -/mchinterp % <charstring> mchinterp - - { 4330 exch dup length string .type1decrypt exch pop - dup length lenIV sub lenIV exch getinterval - 0 () /SubFileDecode filter - mark exch charstack_read ] - { dup type /nametype eq - { mchdict exch .knownget { exec } { cleartomark mark } ifelse - } - if - } - forall - } def - -/markcharhints % <charname> <matrix> <print> markcharhints - - { mhsetup - gsave mark - /Private currentfont /Private get def - Private rcheck % make sure we won't get an access error - { /lenIV Private /lenIV .knownget not { 4 } if def - currentfont /CharStrings get 3 -1 roll get mchinterp - } - { (Sorry, this font is protected; I can't show the hints.\n) print flush - exch - } - ifelse - cleartomark grestore - } def diff --git a/Master/tlpkg/tlgs/lib/markpath.ps b/Master/tlpkg/tlgs/lib/markpath.ps deleted file mode 100644 index 4aec660c177..00000000000 --- a/Master/tlpkg/tlgs/lib/markpath.ps +++ /dev/null @@ -1,58 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% markpath.ps -% Mark the corners of a path, drawing it slowly if desired. - -/Delay where { pop } { /Delay 0 def } ifelse -/setxy0 - { currentpoint /y0 exch def /x0 exch def - } def -/bip - { epsx epsy idtransform /ey exch def /ex exch def - currentpoint ex 2 div ey 2 div rlineto currentpoint 0 ey neg rlineto - ex neg 0 rlineto 0 ey rlineto lineto lineto - stroke - } def -/dally - { Delay { } repeat - Delay 0 ne { flushpage } if - } def -/movebip - { /xs 2 index def /ys 1 index def - gsave newpath mpmx transform moveto setxy0 bip grestore - } def -/linebip - { gsave newpath x0 y0 moveto mpmx transform lineto setxy0 bip dally grestore - } def -/curvebip - { gsave newpath x0 y0 moveto 5 index 5 index mpmx transform lineto bip - 2 copy mpmx transform moveto 3 index 3 index mpmx transform lineto bip - x0 y0 moveto - 3 { mpmx transform 6 2 roll } repeat - curveto setxy0 bip dally grestore - } def -/closebip - { xs ys linebip - } def - -/markpath % <matrix> markpath - - { /mpmx exch def - gsave initgraphics 9 dup dtransform grestore - /epsy exch def /epsx exch def - gsave 0 setlinewidth - { movebip } { linebip } { curvebip } { closebip } pathforall - grestore - } def diff --git a/Master/tlpkg/tlgs/lib/packfile.ps b/Master/tlpkg/tlgs/lib/packfile.ps deleted file mode 100644 index 8bad56f6dff..00000000000 --- a/Master/tlpkg/tlgs/lib/packfile.ps +++ /dev/null @@ -1,332 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% packfile.ps -% Pack groups of files together, with compression, for use in -% storage-scarce environments. - -% ****** NOTE: This file must be kept consistent with gs_pfile.ps. - -% ---------------- Huffman coding utilities ---------------- % - -% We count runs of zeros, and individual byte frequencies separately -% depending on whether they follow or do not follow a run of zeros. -/zruns 256 array def -/zfreq 256 array def -/nzfreq 256 array def -/maxcode 13 def % max code length, must be between 10 and 16 -/maxzrun 100 def % max length of zero run, must be <= 100 -/statbuf 10000 string def - -% Initialize statistics. -/initstats % - initstats - - { 0 1 255 { zruns exch 0 put } for - 0 1 255 { zfreq exch 0 put } for - 0 1 255 { nzfreq exch 0 put } for - } bind def - -% Accumulate statistics from an individual file. -/addstats % <file> addstats - - { 0 - { 1 index //statbuf readstring 3 1 roll - % Stack: file eof numzeros data - { dup 0 eq - { pop 1 add - } - { 1 index 0 ne - { exch 255 .min - //zruns exch 2 copy get 1 add put - 0 exch //zfreq - } - { //nzfreq - } - ifelse - exch 2 copy get 1 add put - } - ifelse - } forall - exch not { exit } if (.) print flush - } loop - pop closefile - } bind def - -% Compute the Huffman codes from the statistics. -/statcodes % - statcodes <array> - { maxcode 1 add 256 add maxzrun 2 sub add 1 add array % full array - dup maxcode 1 add dup 2 index length exch sub getinterval % data - % Put statistics into array - dup 0 1 255 - { zfreq 1 index get nzfreq 2 index get add put dup - } for - 0 zruns 1 get put - 256 zruns 2 maxzrun 2 sub getinterval putinterval - dup dup length 1 sub 1 put % EOD - maxcode .computecodes - } bind def - -% ---------------- File handling ---------------- % - -% Copy one file to another. -% Close the input file, but not the output file. -/copyfile % <infile> <outfile> copyfile <outfile> <length> - { 0 mark statbuf - { 4 index 1 index readstring - exch 5 index 1 index writestring - length 5 -1 roll add 4 1 roll - not { exit } if (.) print flush - } loop - cleartomark 3 -1 roll closefile dup == flush - } bind def - -% Represent a Type 1 font in its most compressed format. -% Requires -dWRITESYSTEMDICT to run. -% Does not close the output file. -(wrfont.ps) runlibfile -/compressfont % <fontname> <outfile> compressfont <outfile> - { exch save - systemdict /executeonly /readonly load put - systemdict /noaccess /readonly load put - systemdict readonly pop - wrfont_dict begin - /binary_CharStrings true def - /binary_tokens true def - /encrypt_CharStrings false def - /standard_only false def - /use_lenIV 0 def - /smallest_output true def - end - exch findfont setfont - 1 index writefont - restore - } bind def - -% ---------------- Main program ---------------- % - -% Find the length of a file. -/filelength % <filename> filelength <length> - { status { pop pop exch pop } { -1 } ifelse - } bind def - -% Define the header string for a compressed file. -/beginfilestring -({dup token pop exch[/MaxCodeLength 2 index token pop/Tables 4 index token pop -/EndOfData true/EncodeZeroRuns 256 .dicttomark -/BoundedHuffmanDecode filter/MoveToFrontDecode filter -[/BlockSize 4 -1 roll .dicttomark/BWBlockSortDecode filter -}) readonly def - -% Write a 16-bit big-endian non-negative integer on a file. -/write16 % <file> <int> write16 - - { 2 copy -8 bitshift write 255 and write - } bind def - -% Compress a group of files together. -% Return a dictionary in which the keys are the input file names -% and the values are [startpos length] in the uncompressed concatenation. -% Does not open or close the output file. -/tempname (t.em) def -/packfiles % <filenames> <outfile> packfiles <outfile> <posdict> - { % Concatenate files to a temporary file. - tempname (w) file - dup /MoveToFrontEncode filter - dup << - /BlockSize 1000000 - >> /BWBlockSortEncode filter - % Stack: filenames outfile tempfile mtfe bwe - 5 -1 roll dup length dict 0 6 2 roll - { % Stack: outfile posdict pos tempfile mtfe bwe infilename - dup ==only dup (r) file 2 index copyfile exch pop - dup 7 index 4 2 roll 7 index exch 2 array astore put - 5 -1 roll add 4 1 roll - } forall - closefile closefile closefile pop exch - % Stack: posdict outfile - % Compute an optimal Huffman code. - initstats - tempname (r) file addstats - % Actually compress the file. - % Write the decompression information on the output first. - dup tempname filelength write== - dup maxcode write== - % Write the code table as a homogenous number array. - statcodes exch - dup 149 write dup 32 write dup 2 index length write16 - exch { 2 copy write16 pop } forall - dup << - /MaxCodeLength maxcode - /EndOfData true - /EncodeZeroRuns 256 - /Tables statcodes - >> /BoundedHuffmanEncode filter - tempname (r) file exch copyfile pop closefile - exch - } bind def - -% Squeeze a font to a .cpf file in anticipation of compression. -/squeezefont % <fontname> squeezefont <filename.cpf> - { dup type /nametype ne { cvn } if - dup - { dup type /stringtype eq { exit } if - Fontmap exch get - } - loop - % Stack: fontname filename - dup dup - { (.) search not { exit } if - exch pop exch 3 -1 roll pop - } - loop - % Stack: fontname filename noextname extension - exch - { (/) search not { (\\) search not { exit } if } if - pop pop - } - loop - % If the font extension is anything other than - % .pfa or .pfb, we assume it can't be rewritten - % using compressfont. - % Stack: fontname filename extension basename - (.cpf) concatstrings dup 5 1 roll (w) file - % Stack: outfilename fontname filename extension outfile - exch dup (pfa) eq exch (pfb) eq or - % Stack: outfilename fontname filename outfile bool - { exch pop compressfont - } - { 3 -1 roll pop - exch findlibfile pop exch pop - exch copyfile pop - } - ifelse closefile - } bind def - -% ---------------- Production code ---------------- % - -% The following code constructs a packed version of the commercial-quality -% fonts available from Artifex Software Inc. To use this code: -% - If desired, change the output file names below. -% - Make sure you have the synthetic font data (fontmap.shs and the -% *.ps files for the commercial fonts) in a directory that is on -% Ghostscript's search path. -% - Construct the packed fonts by running -% gs -dNODISPLAY -dWRITESYSTEMDICT packfile.ps -% - If desired, move the output files to the directory that will be -% used at run time. You no longer need the *.pfb or *.ps files -% for the original fonts; however, you do still need the Fontmap -% for these fonts, because it defines the font name aliases. -% - Add the following line to the end of gs_fonts.ps: -% (ALL.cmp) run -% (substituting the definition of allmapname if you changed it). - -% Define the output file names. The extensions are arbitrary; -% any legal file name is allowed. -/allname (ALL.cff) def % the compressed font file -/allmapname (ALL.cmp) def % the Fontmap override file - -% Load an alternate Fontmap that references the synthetic oblique and -% narrow fonts. -true .setglobal -(fontmap.shs) findlibfile pop exch pop .loadFontmap -false .setglobal - -% Define the packaging of fonts into font groups. -% Fewer larger groups compress better, but make decompression slower. -/Lists [ -[ % The oblique and narrow fonts are synthetic, - % and take very little space. - /AvantGarde-BookOblique /AvantGarde-DemiOblique - /Courier-Oblique /Courier-BoldOblique - /Helvetica-Oblique /Helvetica-BoldOblique - /Helvetica-Narrow /Helvetica-Narrow-Oblique - /Helvetica-Narrow-Bold /Helvetica-Narrow-BoldOblique -] -[/AvantGarde-Book /AvantGarde-Demi - /Bookman-Light] [/Bookman-LightItalic - /Bookman-Demi /Bookman-DemiItalic - /Courier] [/Courier-Bold - /Helvetica /Helvetica-Bold] -[/NewCenturySchlbk-Roman /NewCenturySchlbk-Italic - /NewCenturySchlbk-Bold /NewCenturySchlbk-BoldItalic] -[/Palatino-Roman /Palatino-Italic - /Palatino-Bold /Palatino-BoldItalic] -[/Times-Roman /Times-Italic - /Times-Bold /Times-BoldItalic] -[/Symbol - /ZapfChancery-MediumItalic - /ZapfDingbats] -] def - -% We need to register the fonts under their true names, not aliases. -/Lists Lists mark exch - { mark exch - { { Fontmap 1 index get dup type /nametype ne { pop exit } if - exch pop - } - loop - } - forall ] - } -forall ] def - -% Squeeze the fonts to their .cpf format. -(Squeezing... ) print flush -/fdict mark -Lists - { { dup squeezefont } forall } forall -.dicttomark def -(done.\n) print flush - -% Invert fdict. -/f2dict fdict length dict def -fdict { exch f2dict 3 1 roll put } forall - -% Construct the compressed font file. -(Creating ) print allname print (... ) print flush -/posdict fdict length dict def -/all allname (w) file def -all beginfilestring writestring -Lists - { dup == flush - /fbegin all fileposition def - mark exch { fdict exch get } forall ] - all packfiles exch pop - /flength all fileposition fbegin sub def - { fbegin flength 3 -1 roll aload pop 4 packedarray - exch f2dict exch get exch posdict 3 1 roll put - } - forall - } -forall -all closefile -(done.\n) print flush - -% Write the Fontmap addendum for accessing compressed fonts. -(Writing ) print allmapname print (... ) print flush -allmapname (w) file -dup (%! -/.runpackedlibfile where{pop}{(gs_pfile.ps)runlibfile}ifelse -.currentglobal true .setglobal -) writestring -posdict - { exch 2 index exch write==only exch dup ({) writestring - dup allname write==only - exch { 1 index dup ( ) writestring exch write==only } forall - dup ( .runpackedlibfile}bind .definefontmap -) writestring - } -forall -dup (.setglobal -) writestring -closefile -(done.\n) print flush diff --git a/Master/tlpkg/tlgs/lib/pcharstr.ps b/Master/tlpkg/tlgs/lib/pcharstr.ps deleted file mode 100644 index 7f38fc96670..00000000000 --- a/Master/tlpkg/tlgs/lib/pcharstr.ps +++ /dev/null @@ -1,125 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% 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 diff --git a/Master/tlpkg/tlgs/lib/pdfwrite.ps b/Master/tlpkg/tlgs/lib/pdfwrite.ps deleted file mode 100644 index 8aa9dca1d4d..00000000000 --- a/Master/tlpkg/tlgs/lib/pdfwrite.ps +++ /dev/null @@ -1,396 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% Writer for transmuting PDF files. - -% NOTES: -% We do editing by replacing objects (in the cache) and then doing a -% simple recursive walk with object renumbering. -% Free variables: -% RMap [per input file] (dict): input_obj# => output_obj# -% PDFfile (file): current input file -% OFile (file): current output file -% XRef (dict): output_obj# => output_file_pos -% ToWrite: 0..N-1 => [obj# gen#] - -.languagelevel 2 .setlanguagelevel -.currentglobal true .setglobal - -/PDFWRDEBUG where { pop } { /PDFWRDEBUG false def } ifelse - -% ======== Long dictionary support =============== % - -% The key must be a non-negative iteger. - -/ld_dict { % <len> ld_dict <ldict> - pop << 0 <<>> >> -} bind def - -/ld_length { % <ldict> ld_length <length> - 0 exch { exch pop length add } forall -} bind def - -/ld_get { % <ldict> <key> ld_get <any> - dup 3 1 roll -15 bitshift get exch get -} bind def - -/ld_put { % <ldict> <key> <any> ld_put - - 3 1 roll dup % any ldict key key - 4 1 roll -15 bitshift % key any ldict key>>15 - 2 copy known { - get % key any subdict - 3 1 roll put % - - } { - 64 dict dup 6 1 roll % <<>> key any ldict key>>15 <<>> - put put - } ifelse % - -} bind def - -/ld_known { % <ldict> <key> ld_known <bool> - dup 3 1 roll -15 bitshift % key <<>> key<<15 - 2 copy known { - get exch known - } { - pop pop pop //false - } ifelse -} bind def - -/ld_knownget { % <ldict> <key> ld_known false | <any> true - dup 3 1 roll -15 bitshift % key <<>> key<<15 - 2 copy known { - get exch .knownget - } { - pop pop pop //false - } ifelse -} bind def - -/ld_def { % <key> <any> ld_def - - currentdict 3 1 roll ld_put -} bind def - -/ld_forall { % <ldict> <proc} ld_forall - - { forall exch pop } aload pop - 4 2 roll 4 packedarray cvx forall -} bind def - -/ld_clone { % <ldict> ld_clone <ldict copy> - << exch { dup length dict copy } forall >> -} bind def - -% ================ Object mapping ================ % - -% Initialize the object number and location map. -/omapinit { % - omapinit - - /RMap 100 ld_dict def - /XRef 100 ld_dict def - PDFWRDEBUG { (omapinit) = } if -} bind def - -% Map an object number. -/omapnew { % <oldobj#> omap <newobj#> <isnew> - RMap 1 index ld_knownget { - exch pop //false - } { - PDFWRDEBUG { (omap\() print dup =only } if - RMap dup ld_length 1 add % old# <<>> len+1 - 2 index exch dup % old# <<>> old# len+1 len+1 - 5 1 roll % len+1 old# <<>> old# len+1 - ld_put pop //true % len+1 true - PDFWRDEBUG { (\) = ) print 1 index = } if - } ifelse -} bind def -/omap { % <oldobj#> omap <newobj#> - omapnew pop -} bind def - -% Save and restore the object map. -% Note that currentomap either returns a copy or calls omapinit. -/currentomap { % <copy> currentomap <omap> - { - [RMap ld_clone XRef ld_clone] - } { - [RMap XRef] omapinit - } ifelse -} bind def -/setomap { % <omap> setomap - - aload pop /XRef exch def /RMap exch def - PDFWRDEBUG { - (setomap: #Xref = ) print XRef ld_length =only - (, #RMap = ) print RMap ld_length = - } if -} bind def - -% ================ Writing ================ % - -% ---------------- Low-level output ---------------- % - -% Write a string on the output file. -/ows { % <string> ows - - OFile exch writestring -} bind def - -% ---------------- Scalars ---------------- % - -% Note that the '#' character isn't legal in a name unless it is a prefix -% for a hex encoded character (for PDF 1.2 and later). The following assumes -% that the names are already valid PDF 1.2+ names so that we can treat the -% '#' as a legal character. The next two hex characters are already in the -% set of valid name characters. PDF 1.1 and earlier allowed spaces in names -% which probably wouldn't make it past the tokenizer anyway. -/pdfnamechars - (!"$&'*+,-.0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\\^_`abcdefghijklmnopqrstuvwxyz|~) -readonly def -/pdfwritename { % <name> pdfwritename - - (/) ows .namestring { - ( ) dup 0 4 -1 roll put - //pdfnamechars 1 index search { - pop pop pop - } { - pop 0 get 256 add 16 =string cvrs - dup 0 (#) 0 get put - } ifelse ows - } forall -} bind def - -% ---------------- Composite objects ---------------- % - -/pdfwriteprocs mark - /resolveR { pdfwriteref } - /O { pdfwritenewref } -.dicttomark readonly def -/pdfwritearray { % <array> pdfwritearray - - dup xcheck { - aload pop //pdfwriteprocs exch get exec - } { - % Because of a bug in Acrobat's parser for linearization parameters, - % we have to include some whitespace after the opening [ (!). - ([ ) ows { pdfwritevalue (\n) ows } forall (]) ows - } ifelse -} bind def - -/pdfwritedict { % <dict> pdfwritedict - - dup xcheck { - pdfwritestream - } { - (<<) ows { - exch pdfwritevalue ( ) ows pdfwritevalue (\n) ows - } forall (>>) ows - } ifelse -} bind def - -% ---------------- References ---------------- % - -/pdfwritenewref { % <newobj#> pdfwritenewref - - OFile exch write=only ( 0 R) ows -} bind def - -/pdfwriteref { % <obj#> <gen#> pdfwriteref - - 1 index omapnew { - ToWrite dup length 5 -2 roll 2 packedarray put - } { - exch pop exch pop - } ifelse - pdfwritenewref -} bind def - -/pdfcopystring 200 string def -/pdfwritestream { % <streamdict> pdfwritestream - - % Remove File, FilePosition, and StreamKey; - % optimize by replacing an indirect Length. - dup dup length dict copy - % Stack: origdict dict - dup /File undef dup /FilePosition undef dup /StreamKey undef - dup /Length known { - dup /Length get dup oforce ne { - dup /Length 2 copy oget put - } if - } { - 1 index /File get dup - 3 index /FilePosition get setfileposition - dup 0 (endstream) /SubFileDecode filter flushfile - .fileposition 9 sub - 2 index /FilePosition get sub - 1 index exch /Length exch put - } ifelse - exch dup /File get dup 3 -1 roll /FilePosition get setfileposition - pdfcopystream -} bind def - -% We put copying the stream contents in separate procedures so that we -% can replace this function if desired. -/pdfcopybytes { % <fromfile> <tofile> <length> pdfcopybytes - - { - dup 0 eq { exit } if - //pdfcopystring 0 2 index 2 index length .min getinterval - 3 index exch readstring 3 1 roll - 3 index 1 index writestring length sub exch not { exit } if - } loop pop pop pop -} bind def -/pdfcopystream { % <newstreamdict> <file> pdfcopystream - - % (file has been positioned) - 1 index pdfwritevalue (stream\n) ows - exch /Length get OFile exch pdfcopybytes - (endstream) ows -} bind def - -% ---------------- General values/objects ---------------- % - -/pdfwritetypes mark - % Scalars - /nulltype { pop (null) ows } bind - /integertype { =string cvs ows } bind - /booleantype 1 index - /realtype { - =string cvs - (e) search { % PDF has no exponential format - exch pop % exp pre - exch cvi exch - (-) anchorsearch { ows } if - (.) search { - exch pop % exp (frac) (int) - 1 index length % exp (frac) (int) len - 3 1 roll % exp len (frac) (int) - exch concatstrings % exp len (int_frac) - 3 1 roll sub % (int_frac) exp-len - exch % exp-len (int_frac) - } if % exp (mant) - 1 index 0 ge { - ows { (0) ows } repeat (.) ows - } { - dup length % exp (mant) len - 3 -1 roll add % (mant) exp+len - dup 0 le { - (0.) ows neg { (0) ows } repeat ows - } { - 2 copy 0 exch getinterval ows - (.) ows - 1 index length 1 index sub getinterval ows - } ifelse - } ifelse - } { - ows - } ifelse - } bind - /stringtype { OFile exch write===only } bind - /nametype { pdfwritename } bind - % Composite/reference objects - /arraytype { pdfwritearray } bind - /packedarraytype 1 index - /dicttype { pdfwritedict } bind -.dicttomark readonly def - -/pdfwritevalue { % <obj> pdfwritevalue - - PDFWRDEBUG { (****Writing: ) print dup === flush } if - //pdfwritetypes 1 index type get exec -} bind def - -% We make pdfwriteobjdef a separate procedure for external use. -/pdfwriteobjheader { % <newobj#> pdfwriteobjheader - - XRef 1 index OFile .fileposition ld_put - PDFWRDEBUG { (XRef\() print dup =only (\) = ) print XRef 1 index ld_get = } if - OFile exch write=only ( 0 obj\n) ows -} bind def -/pdfwriteobjdef { % <newobj#> <value> pdfwriteobjdef - - exch pdfwriteobjheader - pdfwritevalue (\nendobj\n) ows -} bind def -/pdfwriteobj { % <obj#> <gen#> pdfwriteobj - - 1 index exch resolveR exch omap exch pdfwriteobjdef -} bind def - -% ---------------- File-level entities ---------------- % - -% Write a PDF file header. -% Free variables: OFile, PDFversion. -/pdfwriteheader { % - pdfwriteheader - - (%PDF-) ows OFile PDFversion write= - (%\347\363\317\323\n) ows -} bind def - -% Write a cross-reference table and trailer. -/pdfwritexref { % <firstobj#> <#objs> pdfwritexref - - (xref\n) ows - OFile 2 index write=only ( ) ows OFile 1 index write= - 1 index add 1 sub 1 exch { - dup 0 eq { - pop (0000000000 65535 f \n) ows - } { - XRef exch ld_get 1000000000 add =string cvs - dup 0 (0) 0 get put - ows ( 00000 n \n) ows - } ifelse - } for -} bind def -/pdfwritetrailer { % <trailer> pdfwritetrailer - - (trailer\n) ows - % Since we always write a complete "classic" xref, the Trailer may need to be adjusted: - % - remove keys that pertain to xref-streams and hybrid-xref PDFs; - % - if it's a PDF stream, turn it into a PDF dict by removing keys used for - % PDF streams (both standard and GS-specific), and the executable attribute - dup /XRefStm known 1 index xcheck or { - dup length dict copy - dup {/Type/Index/W /XRefStm /Filter/DecodeParms/Length/File/FilePosition} { - undef dup - } forall pop - % note: the executable attribute is "removed" by not being copied - } if - pdfwritevalue - (\n) ows -} bind def -/pdfwritestartxref { % <startpos> pdfwritestartxref - - (startxref\n) ows OFile exch write= - (%%EOF\n) ows -} bind def - -% ================ Top-level control ================ % - -/pdfwrite { % <file> <trailer> pdfwrite - - 10 dict begin - /trailer exch def - /OFile exch def - /ToWrite 100 dict def - omapinit - - % Write the PDF file header. - - pdfwriteheader - - % Write the objects. - - trailer { - exch pop dup xcheck { % The only executable objects are references. - aload pop pop pdfwriteobj - } { - pop - } ifelse - } forall - % Walk the object graph. - { - ToWrite dup length dup 0 eq { pop pop exit } if - 1 sub 2 copy get 3 1 roll undef aload pop pdfwriteobj - } loop - - % Write the xref table and trailer. - - /xref OFile fileposition def - 0 XRef ld_length 1 add pdfwritexref - trailer dup length 1 add dict copy trailer xcheck { cvx } if - dup /Size XRef ld_length 1 add put pdfwritetrailer - xref pdfwritestartxref - - end -} bind def - -.setglobal .setlanguagelevel diff --git a/Master/tlpkg/tlgs/lib/ps2ascii.ps b/Master/tlpkg/tlgs/lib/ps2ascii.ps deleted file mode 100644 index 2b0e2d58109..00000000000 --- a/Master/tlpkg/tlgs/lib/ps2ascii.ps +++ /dev/null @@ -1,1523 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% Extract the ASCII text from a PostScript file. Nothing is displayed. -% Instead, ASCII information is written to stdout. The idea is similar to -% Glenn Reid's `distillery', only a lot more simple-minded, and less robust. - -% If SIMPLE is defined, just the text is written, with a guess at line -% breaks and word spacing. If SIMPLE is not defined, lines are written -% to stdout as follows: -% -% F <height> <width> (<fontname>) -% Indicate the font height and the width of a space. -% -% P -% Indicate the end of the page. -% -% S <x> <y> (<string>) <width> -% Display a string. -% -% <width> and <height> are integer dimensions in units of 1/720". -% <x> and <y> are integer coordinates, in units of 1/720", with the origin -% at the lower left. -% <string> and <fontname> are strings represented with the standard -% PostScript escape conventions. - -% If COMPLEX is defined, the following additional types of lines are -% written to stdout. -% -% C <r> <g> <b> -% Indicate the current color. -% -% I <x> <y> <width> <height> -% Note the presence of an image. -% -% R <x> <y> <width> <height> -% Fill a rectangle. -% -% <r>, <g>, and <b> are RGB values expressed as integers between 0 and 1000. -% -% Note that future versions of this program (in COMPLEX mode) may add -% other output elements, so programs parsing the output should be -% prepared to ignore elements that they do not recognize. - -% Note that this code will only work in all cases if systemdict is writable -% and if `binding' the definitions of operators defined as procedures -% is deferred. For this reason, it is normally invoked with -% gs -q -dNODISPLAY -dDELAYBIND -dWRITESYSTEMDICT ps2ascii.ps - -% Thanks to: -% J Greely <jgreely@cis.ohio-state.edu> for improvements to this code; -% Jerry Whelan <jerryw@abode.ccd.bnl.gov> for motivating other improvements; -% David M. Jones <dmjones@theory.lcs.mit.edu> for improvements noted below. - -%% Additional modifications by David M. Jones -%% (dmjones@theory.lcs.mit.edu), December 23, 1997 -%% -%% (a) Rewrote forall loop at the end of .show.write. This fixes a -%% stack leakage problem, but the changes are more significant -%% than that. -%% -%% .char.map includes the names of all characters in the -%% StandardEncoding, ISOLatin1Encoding, OT1Encoding and -%% T1Encoding vectors. Thus, if the Encoding vector for the -%% current font contains a name that is not in .char.map, it's -%% redundant to check if the Encoding vector is equal to one of -%% the known vectors. Previous versions of ps2ascii would give -%% up at this point, and substitute an asterisk (*) for the -%% character. I've taken the liberty of instead using the -%% OT1Encoding vector to translate the character, on the grounds -%% that in the cases I'm most interested in, a font without a -%% useful Encoding vector was most likely created by a DVI to PS -%% converter such as dvips or DVILASER (and OT1Encoding is -%% largely compatible with StandardEncoding anyway). [Note that -%% this does not make my earlier changes to support dvips (see -%% fix (a) under my 1996 changes) completely obsolete, since -%% there's additional useful information I can extract in that -%% case.] -%% -%% Overall, this should provide better support for some documents -%% (e.g, DVILASER documents will no longer be translated into a -%% series of *'s) without breaking any other documents any worse -%% than they already were broken. -%% -%% (b) Fixed two bugs in dvips.df-tail: (1) changed "dup 127" to "dup -%% 128" to fix fencepost error, and (2) gave each font it's own -%% FontName rather than having all fonts share the same name. -%% -%% (c) Added one further refinement to the heuristic for detecting -%% paragraph breaks: do not ever start a new paragraph after a -%% line ending in a hyphen. -%% -%% (d) Added a bunch of missing letters from the T1Encoding, -%% OT1Encoding and ISOLatin1Encoding vectors to .letter.chars to -%% improve hyphen-elimination algorithm. This still won't help -%% if there's no useful Encoding vector. -%% -%% NOTE: A better solution to the problem of missing Encoding vectors -%% might be to redefine definefont to check whether the Encoding -%% vector is sensible and, if not, replace it by a default. This -%% would alleviate the need for constant tests in the .show.write -%% loop, as well as automatically solving the problem noted in fix -%% (d) above, and the similar problem with .break.chars. This should -%% be investigated. Also, the hyphen-elimination algorithm really -%% needs to be looked at carefully and rethought. - -%%* Modifications to ps2ascii.ps by David M. Jones -%%* (dmjones@theory.lcs.mit.edu), June 25-July 8, 1996 - -%%* Modifications: -%%* -%%* (a) added code to give better support for dvips files by providing -%%* FontBBox's, FontName's and Encoding vectors for downloaded -%%* bitmap fonts. This is done by using dvips's start-hook to -%%* overwrite the df-tail and D procedures that dvips uses to -%%* define its Type 3 bitmap fonts. Thus, this change should -%%* provide better support for dvips-generated PS files without -%%* affecting the handling of other documents. -%%* -%%* (b) Fixed two bugs that could potentially affect any PS file, not -%%* just those created by dvips: (1) added missing "get" operator -%%* in .show.write and (2) fixed bug that caused a hyphen at the -%%* end of a line to be replaced by a space rather than begin -%%* deleted. Note that the first bug was a source of stack -%%* leakage, causing ps2ascii to run out of operand stack space -%%* occasionally. -%%* -%%* Search for "%%* BF" to find these modifications. -%%* -%%* (c) Improved the heuristic for determining whether a line break -%%* has occurred and whether a line break represents a paragraph -%%* break. Previously, any change in the vertical position caused -%%* a line break; now a line break is only registered if the -%%* change is larger than the height of the current font. This -%%* means that superscripts, subscripts, and such things as -%%* shifted accents generated by TeX won't cause line breaks. -%%* Paragraph-recognition is now done by comparing the indentation -%%* of the new line to the indentation of the previous line and by -%%* comparing the vertical distance between the new line and the -%%* previous line to the vertical distance between the previous -%%* line and its predecessor. -%%* -%%* (d) Added a hook for renaming the files where stdout and stderr -%%* go. -%%* -%%* In general, my additions or changes to the code are described in -%%* comments beginning with "%%*". However, there are numerous other -%%* places where I have either re-formatted code or added comments to -%%* the code while I was trying to understand it. These are usually -%%* not specially marked. -%%* - -/QUIET true def -systemdict wcheck { systemdict } { userdict } ifelse begin -/.max where { pop } { /.max { 2 copy lt { exch } if pop } bind def } ifelse -/COMPLEX dup where { pop true } { false } ifelse def -/SIMPLE dup where { pop true } { false } ifelse def -/setglobal where - { pop currentglobal /setglobal load true setglobal } - { { } } -ifelse - -% Define a way to store and retrieve integers that survives save/restore. -/.i.string0 (0 ) def -/.i.string .i.string0 length string def -/.iget { cvi } bind def -/.iput { exch //.i.string exch copy cvs pop } bind def -/.inew { //.i.string0 dup length string copy } bind def - -% We only want to redefine operators if they are defined already. - -/codef { 1 index where { pop def } { pop pop } ifelse } def - -% Redefine the end-of-page operators. - -/erasepage { } codef -/copypage { SIMPLE { (\014) } { (P\n) } ifelse //print } codef -/showpage { copypage erasepage initgraphics } codef - -% Redefine the fill operators to detect rectangles. - -/.orderrect % <llx> <lly> <urx> <ury> .orderrect <llx> <lly> <w> <h> - { % Ensure llx <= urx, lly <= ury. - 1 index 4 index lt { 4 2 roll } if - dup 3 index lt { 3 1 roll exch } if - exch 3 index sub exch 2 index sub - } odef -/.fillcomplex - { % Do a first pass to see if the path is all rectangles in - % the output coordinate system. We don't worry about overlapping - % rectangles that might be partially not filled. - % Stack: mark llx0 lly0 urx0 ury0 ... true mark x0 y0 ... - mark true mark - % Add a final moveto so we pick up any trailing unclosed subpath. - 0 0 itransform moveto - { .coord counttomark 2 gt - { counttomark 4 gt { .fillcheckrect } { 4 2 roll pop pop } ifelse } - if - } - { .coord } - { cleartomark not mark exit } - { counttomark -2 roll 2 copy counttomark 2 roll .fillcheckrect } - pathforall cleartomark - { .showcolor counttomark 4 idiv - { counttomark -4 roll .orderrect - (R ) //print .show==4 - } - repeat pop - } - { cleartomark - } - ifelse - } odef -/.fillcheckrect - { % Check whether the current subpath is a rectangle. - % If it is, add it to the list of rectangles being accumulated; - % if not exit the .fillcomplex loop. - % The subpath has not been closed. - % Stack: as in .fillcomplex, + newx newy - counttomark 10 eq { 9 index 9 index 4 2 roll } if - counttomark 12 ne { cleartomark not mark exit } if - 12 2 roll - % Check for the two possible forms of rectangles: - % x0 y0 x0 y1 x1 y1 x1 y0 x0 y0 - % x0 y0 x1 y0 x1 y1 x0 y1 x0 y0 - 9 index 2 index eq 9 index 2 index eq and - 10 index 9 index eq - { % Check for first form. - 7 index 6 index eq and 6 index 5 index eq and 3 index 2 index eq and - } - { % Check for second form. - 9 index 8 index eq and - 8 index 7 index eq and 5 index 4 index eq and 4 index 3 index eq and - } - ifelse not { cleartomark not mark exit } if - % We have a rectangle. - pop pop pop pop 4 2 roll pop pop 8 4 roll - } odef -/eofill { COMPLEX { .fillcomplex } if newpath } codef -/fill { COMPLEX { .fillcomplex } if newpath } codef -/rectfill { gsave newpath .rectappend fill grestore } codef -/ueofill { gsave newpath uappend eofill grestore } codef -/ufill { gsave newpath uappend fill grestore } codef - -% Redefine the stroke operators to detect rectangles. - -/rectstroke - { gsave newpath - dup type dup /arraytype eq exch /packedarraytype eq or - { dup length 6 eq { exch .rectappend concat } { .rectappend } ifelse } - { .rectappend } - ifelse stroke grestore - } codef -/.strokeline % <fromx> <fromy> <tox> <toy> .strokeline <tox> <toy> - % Note: fromx and fromy are in output coordinates; - % tox and toy are in user coordinates. - { .coord 2 copy 6 2 roll .orderrect - % Add in the line width. Assume square or round caps. - currentlinewidth 2 div dup .dcoord add abs 1 .max 5 1 roll - 4 index add 4 1 roll 4 index add 4 1 roll - 4 index sub 4 1 roll 5 -1 roll sub 4 1 roll - (R ) //print .show==4 - } odef -/.strokecomplex - { % Do a first pass to see if the path is all horizontal and vertical - % lines in the output coordinate system. - % Stack: true mark origx origy curx cury - true mark null null null null - { .coord 6 2 roll pop pop pop pop 2 copy } - { .coord 1 index 4 index eq 1 index 4 index eq or - { 4 2 roll pop pop } - { cleartomark not mark exit } - ifelse - } - { cleartomark not mark exit } - { counttomark -2 roll 2 copy counttomark 2 roll - 1 index 4 index eq 1 index 4 index eq or - { pop pop 2 copy } - { cleartomark not mark exit } - ifelse - } - pathforall cleartomark - 0 currentlinewidth .dcoord 0 eq exch 0 eq or and - % Do the second pass to write out the rectangles. - % Stack: origx origy curx cury - { .showcolor null null null null - { 6 2 roll pop pop pop pop 2 copy .coord } - { .strokeline } - { } - { 3 index 3 index .strokeline } - pathforall pop pop pop pop - } - if - } odef -/stroke { COMPLEX { .strokecomplex } if newpath } codef -/ustroke - { gsave newpath - dup length 6 eq { exch uappend concat } { uappend } ifelse - stroke grestore - } codef - -% The image operators must read the input and note the dimensions. -% Eventually we should redefine these to detect 1-bit-high all-black images, -% since this is how dvips does underlining (!). - -/.noteimagerect % <width> <height> <matrix> .noteimagerect - - { COMPLEX - { gsave setmatrix itransform 0 0 itransform - grestore .coord 4 2 roll .coord .orderrect - (I ) //print .show==4 - } - { pop pop pop - } - ifelse - } odef -/colorimage where - { pop /colorimage - { 1 index - { dup 6 add index 1 index 6 add index 2 index 5 add index } - { 6 index 6 index 5 index } - ifelse .noteimagerect gsave nulldevice //colorimage grestore - } codef - } if -/.noteimage % Arguments as for image[mask] - { dup type /dicttype eq - { dup /Width get 1 index /Height get 2 index /ImageMatrix get } - { 4 index 4 index 3 index } - ifelse .noteimagerect - } odef -/image { .noteimage gsave nulldevice //image grestore } codef -/imagemask { .noteimage gsave nulldevice //imagemask grestore } codef - -% Output the current color if necessary. -/.color.r .inew def - .color.r -1 .iput % make sure we write the color at the beginning -/.color.g .inew def -/.color.b .inew def -/.showcolor - { COMPLEX - { currentrgbcolor - 1000 mul round cvi - 3 1 roll 1000 mul round cvi - exch 1000 mul round cvi - % Stack: b g r - dup //.color.r .iget eq - 2 index //.color.g .iget eq and - 3 index //.color.b .iget eq and - { pop pop pop - } - { (C ) //print - dup //.color.r exch .iput .show==only - ( ) //print dup //.color.g exch .iput .show==only - ( ) //print dup //.color.b exch .iput .show==only - (\n) //print - } - ifelse - } - if - } bind def - -% Redefine `show'. - -% Set things up so our output will be in tenths of a point, with origin at -% lower left. This isolates us from the peculiarities of individual devices. - -/.show.ident.matrix matrix def -/.show.ident { % - .show.ident <scale> <matrix> -% //.show.ident.matrix defaultmatrix -% % Assume the original transformation is well-behaved. -% 0.1 0 2 index dtransform abs exch abs .max /.show.scale exch def -% 0.1 dup 3 -1 roll scale - gsave initmatrix - % Assume the original transformation is well-behaved... - 0.1 0 dtransform abs exch abs .max - 0.1 dup scale .show.ident.matrix currentmatrix - % ... but undo any rotation into landscape orientation. - dup 0 get 0 eq { - 1 get dup abs div 90 mul rotate - .show.ident.matrix currentmatrix - } if - grestore -} bind def - -/.coord { % <x> <y> .coord <x'> <y'> - transform .show.ident exch pop itransform - exch round cvi exch round cvi -} odef - -/.dcoord { % <dx> <dy> .coord <dx'> <dy'> - % Transforming distances is trickier, because - % the coordinate system might be rotated. - .show.ident pop 3 1 roll - exch 0 dtransform - dup mul exch dup mul add sqrt - 2 index div round cvi - exch 0 exch dtransform - dup mul exch dup mul add sqrt - 3 -1 roll div round cvi -} odef - -% Remember the current X, Y, and height. -/.show.x .inew def -/.show.y .inew def -/.show.height .inew def - -% Remember the last character of the previous string; if it was a -% hyphen preceded by a letter, we didn't output the hyphen. - -/.show.last (\000) def - -% Remember the current font. -/.font.name 130 string def -/.font.name.length .inew def -/.font.height .inew def -/.font.width .inew def - -%%* Also remember indentation of current line and previous vertical -%%* skip - -/.show.indent .inew def -/.show.dy .inew def - -% We have to redirect stdout somehow.... - -/.show.stdout { (%stdout) (w) file } bind def - -% Make sure writing will work even if a program uses =string. -/.show.string =string length string def -/.show.=string =string length string def -/.show==only - { //=string //.show.=string copy pop - dup type /stringtype eq - { dup length //.show.string length le - { dup rcheck { //.show.string copy } if - } if - } if - .show.stdout exch write==only - //.show.=string //=string copy pop - } odef -/.show==4 - { 4 -1 roll .show==only ( ) //print - 3 -1 roll .show==only ( ) //print - exch .show==only ( ) //print - .show==only (\n) //print - } odef - -/.showwidth % Same as stringwidth, but disable COMPLEX so that - % we don't try to detect rectangles during BuildChar. - { COMPLEX - { /COMPLEX false def stringwidth /COMPLEX true def } - { stringwidth } - ifelse - } odef - -/.showfont % <string> .showfont <string> - { gsave - % Try getting the height and width of the font from the FontBBox. - currentfont /FontBBox .knownget not { {0 0 0 0} } if - aload pop % llx lly urx ury - exch 4 -1 roll % lly ury urx llx - sub % lly ury dx - 3 1 roll exch % dx ury lly - sub % dx dy - 2 copy .max 0 ne - { currentfont /FontMatrix get dtransform - } - { pop pop - % Fonts produced by dvips, among other applications, have - % BuildChar procedures that bomb out when given unexpected - % characters, and there is no way to determine whether a given - % character will do this. So for Type 1 fonts, we measure a - % typical character ('X'); for others, we punt. - currentfont /FontType get 1 eq - { (X) .showwidth pop dup 1.3 mul - } - { % No safe way to get the character size. Punt. - 0 0 - } - ifelse - } - ifelse .dcoord exch - currentfont /FontName .knownget not { () } if - dup type /stringtype ne { //.show.string cvs } if - grestore - % Stack: height width fontname - SIMPLE - { pop pop //.show.height exch .iput } - { 2 index //.font.height .iget eq - 2 index //.font.width .iget eq and - 1 index //.font.name 0 //.font.name.length .iget getinterval eq and - { pop pop pop - } - { (F ) //print - 3 -1 roll dup //.font.height exch .iput .show==only ( ) //print - exch dup //.font.width exch .iput .show==only ( ) //print - dup length //.font.name.length exch .iput - //.font.name cvs .show==only (\n) //print - } - ifelse - } - ifelse - } odef - -% Define the letters -- characters which, if they occur followed by a hyphen -% at the end of a line, cause the hyphen and line break to be ignored. -/.letter.chars 100 dict def -mark - 65 1 90 { dup 32 add } for - counttomark - { StandardEncoding exch get .letter.chars exch dup put } - repeat -pop - -%%* Add the rest of the letters from the [O]T1Encoding and -%%* ISOLatin1Encoding vectors - -mark - /AE - /Aacute - /Abreve - /Acircumflex - /Adieresis - /Agrave - /Aogonek - /Aring - /Atilde - /Cacute - /Ccaron - /Ccedilla - /Dcaron - /Eacute - /Ecaron - /Ecircumflex - /Edieresis - /Egrave - /Eng - /Eogonek - /Eth - /Gbreve - /Germandbls - /IJ - /Iacute - /Icircumflex - /Idieresis - /Idot - /Igrave - /Lacute - /Lcaron - /Lslash - /Nacute - /Ncaron - /Ntilde - /OE - /Oacute - /Ocircumflex - /Odieresis - /Ograve - /Ohungarumlaut - /Oslash - /Otilde - /Racute - /Rcaron - /Sacute - /Scaron - /Scedilla - /Tcaron - /Tcedilla - /Thorn - /Uacute - /Ucircumflex - /Udieresis - /Ugrave - /Uhungarumlaut - /Uring - /Yacute - /Ydieresis - /Zacute - /Zcaron - /Zdot - /aacute - /abreve - /acircumflex - /adieresis - /ae - /agrave - /aogonek - /aring - /atilde - /cacute - /ccaron - /ccedilla - /dbar - /dcaron - /dotlessi - /dotlessj - /eacute - /ecaron - /ecircumflex - /edieresis - /egrave - /eng - /eogonek - /eth - /exclamdown - /ff - /ffi - /ffl - /fi - /fl - /gbreve - /germandbls - /iacute - /icircumflex - /idieresis - /igrave - /ij - /lacute - /lcaron - /lslash - /nacute - /ncaron - /ntilde - /oacute - /ocircumflex - /odieresis - /oe - /ograve - /ohungarumlaut - /oslash - /otilde - /questiondown - /racute - /rcaron - /sacute - /scaron - /scedilla - /section - /sterling - /tcaron - /tcedilla - /thorn - /uacute - /ucircumflex - /udieresis - /ugrave - /uhungarumlaut - /uring - /yacute - /ydieresis - /zacute - /zcaron - /zdot -counttomark - { .letter.chars exch dup put } -repeat -pop - -% Define a set of characters which, if they occur at the start of a line, -% are taken as indicating a paragraph break. -/.break.chars 50 dict def -mark - /bullet /dagger /daggerdbl /periodcentered /section - counttomark - { .break.chars exch dup put } - repeat -pop - -% Define character translation to ASCII. -% We have to do this for the entire character set. - -/.char.map 500 dict def - -/.chars.def { counttomark 2 idiv { .char.map 3 1 roll put } repeat pop } def - -% Encode the printable ASCII characters. - -mark 32 1 126 - { 1 string dup 0 4 -1 roll put - dup 0 get StandardEncoding exch get exch - } -for .chars.def - - % Encode accents. -mark - /acute (') - /caron (^) - /cedilla (,) - /circumflex (^) - /dieresis (") - /grave (`) - /ring (*) - /tilde (~) -.chars.def - - % Encode the ISO accented characters. -mark 192 1 255 - { ISOLatin1Encoding exch get =string cvs - dup 0 1 getinterval 1 index dup length 1 sub 1 exch getinterval - .char.map 2 index known .char.map 2 index known and - { .char.map 3 -1 roll get .char.map 3 -1 roll get concatstrings - .char.map 3 1 roll put - } - { pop pop pop - } - ifelse - } -for .chars.def - -% Encode the remaining standard and ISO alphabetic characters. - -mark - /AE (AE) /Eth (DH) /OE (OE) /Thorn (Th) - /ae (ae) /eth (dh) - /ffi (ffi) /ffl (ffl) /fi (fi) /fl (fl) - /germandbls (ss) /oe (oe) /thorn (th) -.chars.def - -% Encode the other standard and ISO characters. - -mark - /brokenbar (|) /bullet (*) /copyright ((C)) /currency (#) - /dagger (#) /daggerdbl (##) /degree (o) /divide (/) /dotaccent (.) - /dotlessi (i) - /ellipsis (...) /emdash (--) /endash (-) /exclamdown (!) - /florin (f) /fraction (/) - /guillemotleft (<<) /guillemotright (>>) - /guilsinglleft (<) /guilsinglright (>) /hungarumlaut ("") /logicalnot (~) - /macron (_) /minus (-) /mu (u) /multiply (*) - /ogonek (,) /onehalf (1/2) /onequarter (1/4) /onesuperior (1) - /ordfeminine (-a) /ordmasculine (-o) - /paragraph (||) /periodcentered (*) /perthousand (o/oo) /plusminus (+-) - /questiondown (?) /quotedblbase (") /quotedblleft (") /quotedblright (") - /quotesinglbase (,) /quotesingle (') /registered ((R)) - /section ($) /sterling (#) - /threequarters (3/4) /threesuperior (3) /trademark ((TM)) /twosuperior (2) - /yen (Y) -.chars.def - -% Encode a few common Symbol characters. - -mark - /asteriskmath (*) /copyrightsans ((C)) /copyrightserif ((C)) - /greaterequal (>=) /lessequal (<=) /registersans ((R)) /registerserif ((R)) - /trademarksans ((TM)) /trademarkserif ((TM)) -.chars.def - -%%* Add a few characters from StandardEncoding and ISOLatin1Encoding -%%* that were missing. - -mark - /cent (c) - /guilsinglleft (<) - /guilsinglright (>) - /breve (*) - /Lslash (L/) - /lslash (l/) -.chars.def - -%%* Define the OT1Encoding and T1Encoding vectors for use with dvips -%%* files. Unfortunately, there's no way of telling what font is -%%* really being used within a dvips document, so we can't provide an -%%* appropriate encoding for each individual font. Instead, we'll -%%* just provide support for the two most popular text encodings, the -%%* OT1 and T1 encodings, and just accept the fact that any font not -%%* using one of those encodings will be rendered as gibberish. -%%* -%%* OT1 is Knuth's 7-bit encoding for the CMR text fonts, while T1 -%%* (aka the Cork encoding) is the 8-bit encoding used by the DC -%%* fonts, a preliminary version of the proposed Extended Computer -%%* Modern fonts. Unfortunately, T1 is not a strict extension of OT1; -%%* they differ in positions 8#000 through 8#040, 8#074, 8#076, 8#134, -%%* 8#137, 8#173, 8#174, 8#175 and 8#177, so we can't use the same -%%* vector for both. -%%* -%%* Of course, we also can't reliably tell the difference between an -%%* OT1-encoded font and a T1-encoded font based on the information in -%%* a dvips-created PostScript file. As a best-guess solution, we'll -%%* use the T1 encoding if the font contains any characters in -%%* positions above 8#177 and the OT1 encoding if it doesn't. - -/T1Encoding 256 array def - -/OT1Encoding 256 array def - -%%* T1Encoding shares a lot with StandardEncoding, so let's start -%%* there. - -StandardEncoding T1Encoding copy pop - -/OT1.encode { - counttomark - 2 idiv - { OT1Encoding 3 1 roll put } - repeat - cleartomark -} def - -/T1.encode { - counttomark - 2 idiv - { T1Encoding 3 1 roll put } - repeat - cleartomark -} def - -mark - 8#000 /grave - 8#001 /acute - 8#002 /circumflex - 8#003 /tilde - 8#004 /dieresis - 8#005 /hungarumlaut - 8#006 /ring - 8#007 /caron - - 8#010 /breve - 8#011 /macron - 8#012 /dotaccent - 8#013 /cedilla - 8#014 /ogonek - 8#015 /quotesinglbase - 8#016 /guilsinglleft - 8#017 /guilsinglright - - 8#020 /quotedblleft - 8#021 /quotedblright - 8#022 /quotedblbase - 8#023 /guillemotleft - 8#024 /guillemotright - 8#025 /endash - 8#026 /emdash - 8#027 /cwm - - 8#030 /perthousandzero - 8#031 /dotlessi - 8#032 /dotlessj - 8#033 /ff - 8#034 /fi - 8#035 /fl - 8#036 /ffi - 8#037 /ffl - -%% 8#040 through 8#176 follow StandardEncoding - - 8#177 /hyphen -T1.encode - -mark - 8#200 /Abreve - 8#201 /Aogonek - 8#202 /Cacute - 8#203 /Ccaron - 8#204 /Dcaron - 8#205 /Ecaron - 8#206 /Eogonek - 8#207 /Gbreve - 8#210 /Lacute - 8#211 /Lcaron - 8#212 /Lslash - 8#213 /Nacute - 8#214 /Ncaron - 8#215 /Eng - 8#216 /Ohungarumlaut - 8#217 /Racute - 8#220 /Rcaron - 8#221 /Sacute - 8#222 /Scaron - 8#223 /Scedilla - 8#224 /Tcaron - 8#225 /Tcedilla - 8#226 /Uhungarumlaut - 8#227 /Uring - 8#230 /Ydieresis - 8#231 /Zacute - 8#232 /Zcaron - 8#233 /Zdot - 8#234 /IJ - 8#235 /Idot - 8#236 /dbar - 8#237 /section - 8#240 /abreve - 8#241 /aogonek - 8#242 /cacute - 8#243 /ccaron - 8#244 /dcaron - 8#245 /ecaron - 8#246 /eogonek - 8#247 /gbreve - 8#250 /lacute - 8#251 /lcaron - 8#252 /lslash - 8#253 /nacute - 8#254 /ncaron - 8#255 /eng - 8#256 /ohungarumlaut - 8#257 /racute - 8#260 /rcaron - 8#261 /sacute - 8#262 /scaron - 8#263 /scedilla - 8#264 /tcaron - 8#265 /tcedilla - 8#266 /uhungarumlaut - 8#267 /uring - 8#270 /ydieresis - 8#271 /zacute - 8#272 /zcaron - 8#273 /zdot - 8#274 /ij - 8#275 /exclamdown - 8#276 /questiondown - 8#277 /sterling - - 8#300 /Agrave - 8#301 /Aacute - 8#302 /Acircumflex - 8#303 /Atilde - 8#304 /Adieresis - 8#305 /Aring - 8#306 /AE - 8#307 /Ccedilla - 8#310 /Egrave - 8#311 /Eacute - 8#312 /Ecircumflex - 8#313 /Edieresis - 8#314 /Igrave - 8#315 /Iacute - 8#316 /Icircumflex - 8#317 /Idieresis - 8#320 /Eth - 8#321 /Ntilde - 8#322 /Ograve - 8#323 /Oacute - 8#324 /Ocircumflex - 8#325 /Otilde - 8#326 /Odieresis - 8#327 /OE - 8#330 /Oslash - 8#331 /Ugrave - 8#332 /Uacute - 8#333 /Ucircumflex - 8#334 /Udieresis - 8#335 /Yacute - 8#336 /Thorn - 8#337 /Germandbls - - 8#340 /agrave - 8#341 /aacute - 8#342 /acircumflex - 8#343 /atilde - 8#344 /adieresis - 8#345 /aring - 8#346 /ae - 8#347 /ccedilla - 8#350 /egrave - 8#351 /eacute - 8#352 /ecircumflex - 8#353 /edieresis - 8#354 /igrave - 8#355 /iacute - 8#356 /icircumflex - 8#357 /idieresis - 8#360 /eth - 8#361 /ntilde - 8#362 /ograve - 8#363 /oacute - 8#364 /ocircumflex - 8#365 /otilde - 8#366 /odieresis - 8#367 /oe - 8#370 /oslash - 8#371 /ugrave - 8#372 /uacute - 8#373 /ucircumflex - 8#374 /udieresis - 8#375 /yacute - 8#376 /thorn - 8#377 /germandbls - -T1.encode - -%%* Now copy OT1Encoding into T1Encoding and make a few changes. - -T1Encoding OT1Encoding copy pop - -mark - 8#000 /Gamma - 8#001 /Delta - 8#002 /Theta - 8#003 /Lambda - 8#004 /Xi - 8#005 /Pi - 8#006 /Sigma - 8#007 /Upsilon - - 8#010 /Phi - 8#011 /Psi - 8#012 /Omega - 8#013 /ff - 8#014 /fi - 8#015 /fl - 8#016 /ffi - 8#017 /ffl - - 8#020 /dotlessi - 8#021 /dotlessj - 8#022 /grave - 8#023 /acute - 8#024 /caron - 8#025 /breve - 8#026 /macron - 8#027 /ring - - 8#030 /cedilla - 8#031 /germandbls - 8#032 /ae - 8#033 /oe - 8#034 /oslash - 8#035 /AE - 8#036 /OE - 8#037 /Oslash - - 8#040 /polishslash - - 8#042 /quotedblright - - 8#074 /exclamdown - 8#076 /questiondown - - 8#134 /quotedblleft - 8#137 /dotaccent - - 8#173 /endash - 8#174 /emdash - 8#175 /hungarumlaut - 8#177 /dieresis -OT1.encode - -%%* And add a few characters from the OT1Encoding - -mark - /Gamma (\\Gamma ) - /Delta (\\Delta ) - /Theta (\\Theta ) - /Lambda (\\Lambda ) - /Xi (\\Xi ) - /Pi (\\Pi ) - /Sigma (\\Sigma ) - /Upsilon (\\Upsilon ) - - /Phi (\\Phi ) - /Psi (\\Psi ) - /Omega (\\Omega ) - - /dotlessj (j) - /ff (ff) - - /cwm () - - /perthousandzero (0) - - /polishslash () - - /Abreve (A*) - /Aogonek (A,) - /Cacute (C') - /Ccaron (C^) - /Dcaron (D^) - /Ecaron (E^) - /Eogonek (E,) - /Gbreve (G*) - /Lacute (L') - /Lcaron (L^) - /Nacute (N') - /Ncaron (N^) - /Eng (NG) - /Ohungarumlaut (O"") - /Racute (R') - /Rcaron (R^) - /Sacute (S') - /Scaron (S^) - /Scedilla (S,) - /Tcaron (T^) - /Tcedilla (T,) - /Uhungarumlaut (U"") - /Uring (U*) - /Ydieresis (Y") - /Zacute (Z') - /Zcaron (Z^) - /Zdot (Z.) - /IJ (IJ) - /Idot (I.) - /dbar (d-) - /abreve (a*) - /aogonek (a,) - /cacute (c') - /ccaron (c^) - /dcaron (d^) - /ecaron (e^) - /eogonek (e,) - /gbreve (g*) - /lacute (l') - /lcaron (l^) - /nacute (n') - /ncaron (n^) - /eng (ng) - /ohungarumlaut (o"") - /racute (r') - /rcaron (r^) - /sacute (s') - /scaron (s^) - /scedilla (s,) - /tcaron (t^) - /tcedilla (t,) - /uhungarumlaut (u"") - /uring (u*) - /zacute (z') - /zcaron (z^) - /zdot (z.) - /ij (ij) - /Germandbls (SS) -.chars.def - -%%* We extend the df-tail command to stick in an Encoding vector (see -%%* above for a discussion of the T1 and OT1 encodings), put in a -%%* FontName (which will just be dvips's name for the font, i.e., Fa, -%%* Fb, etc.) and give each font a separate FontBBox instead of -%%* letting them all share a single one. - -/dvips.df-tail % id numcc maxcc df-tail - { - /nn 9 dict N - nn begin - %% - %% Choose an encoding based on the highest position occupied. - %% - dup 128 gt { T1Encoding } { OT1Encoding } ifelse - /Encoding X - /FontType 3 N - %% - %% It's ok for all the fonts to share a FontMatrix, but they - %% need to have separate FontBBoxes - %% - /FontMatrix fntrx N - /FontBBox [0 0 0 0] N - string /base X - array /BitMaps X - %% - %% And let's throw in a FontName for good measure - %% - dup ( ) cvs - %% - %% Make sure each font gets it own private FontName. -- dmj, - %% 12/23/97 - %% - dup length string copy - /FontName X - /BuildChar {CharBuilder} N - end - dup { /foo setfont } - 2 array copy cvx N - load - 0 nn put - /ctr 0 N - [ -} def - -%%* This is functionally equivalent to dvips's /D procedure, but it -%%* also calculates the Font Bounding Box while defining the -%%* characters. - -/dvips.D % char-data ch D - : define character bitmap in current font -{ - /cc X % char-data - dup type /stringtype ne {]} if % char-data - - /ch-xoff where - { pop } - { dup /Cd exch def - /ch-width { Cw } def - /ch-height { Ch } def - /ch-xoff { Cx } def - /ch-yoff { Cy } def - /ch-dx { Cdx } def - } ifelse - /ch-data X - nn /base get cc ctr put % (adds ctr to cc'th position of BASE) - nn /BitMaps get - ctr - ch-data % BitMaps ctr char-data - sf 1 ne { - dup dup length 1 sub dup 2 index S get sf div put - } if - put % puts char-data into BitMaps at index ctr - /ctr ctr 1 add N -%% -%% Make sure the Font Bounding Box encloses the Bounding Box of the -%% current character -%% - nn /FontBBox get % BB - - dup % calculate new llx - dup 0 get - ch-xoff - .min - 0 exch put - - dup % calculate new lly - dup 1 get - ch-yoff ch-height sub - .min - 1 exch put - - dup % calculate new urx - dup 2 get - ch-dx ch-width add - .max - 2 exch put - - dup 3 get % calculate new ury - ch-yoff - .max - 3 exch put - -} def - -%%* Define start-hook to replace df-tail and D by our versions. -%%* Unfortunately, the user can redefine start-hook and thus bypass -%%* these changes, but I don't see an obvious way around that. - -userdict /start-hook { - TeXDict /df-tail /dvips.df-tail load bind put - TeXDict /D /dvips.D load bind put -} put - -%%* Introduce a symbolic constant for hyphens. (Need to make -%%* allowance for hyphen being in different place?) - -/.hyphen 45 def - -% Write out a string. If it ends in a letter and a hyphen, -% don't write the hyphen, and set .show.last to a hyphen; -% otherwise, set .show.last to the character (or \000 if it was a hyphen). -/.show.write % <string> - { - dup length 1 ge - { dup dup length 1 sub get % string last_char - dup .hyphen eq % string last_char hyphen? - { % string last_char - 1 index length 1 gt - { 1 index dup length 2 sub get } - { //.show.last 0 get } - ifelse % string last_char prev-char - currentfont /Encoding get exch get % look up prev-char - //.letter.chars exch known % is it a letter? - { % Remove the hyphen % string last_char - exch % last_char string - dup length 1 sub % last_char string len-1 - 0 exch getinterval % last_char string-1 - exch % string-1 last_char - } - { pop 0 } % string 0 - ifelse - } - if - //.show.last 0 3 -1 roll put % store last_char - % in .show.last - % If .show.last == - % hyphen, then - % last char of - % previous string - % was a hyphen - } - if % string - currentfont /FontType get 0 ne - { - { % begin forall % c - dup % c c - currentfont /Encoding get % c c vec - exch get % c name - dup //.char.map exch known % c name bool - { exch pop } - { pop OT1Encoding exch get } - ifelse % name - //.char.map exch get % translation - .show.stdout exch writestring - } - forall - } - { (\0) dup 0 get 0 eq - { 0 1 put - (%stderr) (w) file dup - (*** Warning: composite font characters dumped without decoding.\n) writestring - closefile - } - { pop - } - ifelse - .show.stdout exch writestring - } - ifelse -} odef - -/.showstring1 { % string - currentpoint .coord % string x y - 3 -1 roll dup .showwidth % x y string dx dy - 1 index % x y string dx dy dx - 0 rmoveto % x y string dx dy - .dcoord pop % x y string width - SIMPLE - { % x y string width - 2 index % x y string width y - //.show.y .iget % x y string width y old.y - %%* - %%* Replaced test "has y changed" by "has y changed by more - %%* than the current font height" so that subscripts and - %%* superscripts won't cause line/paragraph breaks - %%* - sub abs dup % x y string width dy dy - //.show.height .iget - gt - { % x y string width dy - - %%* Vertical position has changed by more than the font - %%* height, so we now try to figure out whether we've - %%* started a new paragraph or merely a new line, using a - %%* variety of heuristics. - - %%* If any of the following is true, we start a new - %%* paragraph: - - %%* (a) the current vertical shift is more than 1.1 times - %%* the previous vertical shift, where 1.1 is an - %%* arbitrarily chosen factor that could probably be - %%* refined. - - dup % x y string width dy dy - //.show.dy .iget 1.1 mul - gt - exch - - %%* Save the new vertical shift - - //.show.dy exch .iput - - %%* (b) The vertical shift is more than 1.3 times the - %%* "size" of the current font. I've removed this - %%* test since it's not really very useful. - -%%* //.show.dy .iget -%%* //.show.height .iget 1.4 mul -%%* gt % x y string width bool -%%* .show.height .iget 0 gt and % only perform test if font -%%* % height is nonzero -%%* or - - %%* (c) the first character of the new line is one of the - %%* .break.chars - - 2 index length % x y string width newpar? len - 0 gt % x y string width newpar? len>0? - { - 2 index 0 get % x y string width newpar? s - currentfont /Encoding get - exch get % x y string width newpar? s_enc - //.break.chars exch known { pop true } if - } - if % x y string width newpar? - - %%* (d) The indentation of the new line is greater than - %%* the indentation of the previous line. - - 4 index - //.show.indent .iget - gt - or - - %%* HOWEVER, if the line ends in a hyphen, we do NOT begin - %%* a new paragraph (cf. comment at end of BF2). --dmj, - %%* 12/23/97 - - //.show.last 0 get .hyphen ne - and - - % newpar? - { (\n\n) } % Paragraph - { % Line - %%* - %%* BF2: If last character on a line is - %%* a hyphen, we omit the hyphen and - %%* run the lines together. Of - %%* course, this will fail if a word - %%* with an explicit hyphen (e.g., - %%* X-ray) is split across two lines. - %%* Oh, well. (What should we do - %%* about a hyphen that ends a - %%* "paragraph"? Perhaps that should - %%* inhibit a paragraph break.) - %%* - //.show.last 0 get .hyphen eq - { () } - { (\n) } - ifelse % x y string width char - } - ifelse - //print - - //.show.y 3 index .iput % x y string width - //.show.x 4 index .iput % x y string width - //.show.indent 4 index .iput - } - { % x y string width dy - % If the word processor split a hyphenated word within - % the same line, put out the hyphen now. - pop - //.show.last 0 get .hyphen eq { (-) //print } if - } - ifelse - %%* - %%* If have moved more than 1 point to - %%* the right, interpret it as a - %%* space? This need to be looked at - %%* more closely. - %%* - 3 index % x y string width x - //.show.x .iget 10 add gt % x y string width bool - { ( ) //print } - if - % x y string width - 4 1 roll % width x y string - .show.write pop % width x - add //.show.x exch .iput % <empty> - } - { (S ) //print .show==4 } - ifelse -} odef - -/.showstring - { dup () eq { pop } { .showstring1 } ifelse - } bind def - -% Redefine all the string display operators. - -/show { - .showfont - .showcolor - .showstring -} codef - -% We define all the other operators in terms of .show1. - -/.show1.string ( ) def -/.show1 { //.show1.string exch 0 exch put //.show1.string .showstring } odef -/ashow - { .showfont .showcolor - { .show1 2 copy rmoveto } forall - pop pop - } codef -/awidthshow - { .showfont .showcolor - { dup .show1 4 index eq { 4 index 4 index rmoveto } if - 2 copy rmoveto - } - forall - pop pop pop pop pop - } codef -/widthshow - { .showfont .showcolor - //.show1.string 0 4 -1 roll put - { //.show1.string search not { exit } if - .showstring .showstring - 2 index 2 index rmoveto - } loop - .showstring pop pop - } codef -/kshow - { .showfont .showcolor - %**************** Should construct a closure, in case the procedure - %**************** affects the o-stack. - { .show1 dup exec } forall pop - } codef - -% We don't really do the right thing with the Level 2 show operators, -% but we do something semi-reasonable. -/xshow { pop show } codef -/yshow { pop show } codef -/xyshow { pop show } codef -/glyphshow - { currentfont /Encoding .knownget not { {} } if - 0 1 2 index length 1 sub - { % Stack: glyph encoding index - 2 copy get 3 index eq { exch pop exch pop null exit } if - pop - } - for null eq { (X) dup 0 4 -1 roll put show } { pop } ifelse - } codef - -end - -% Bind the operators we just defined, and all the others if we didn't -% do it before. - -DELAYBIND { .bindnow } if - -% Make systemdict read-only if it wasn't already. - -systemdict wcheck { systemdict readonly pop } if - -% Restore the current local/global VM mode. - -exec diff --git a/Master/tlpkg/tlgs/lib/ps2epsi.ps b/Master/tlpkg/tlgs/lib/ps2epsi.ps index 35c203a85c6..65d5b862e00 100644 --- a/Master/tlpkg/tlgs/lib/ps2epsi.ps +++ b/Master/tlpkg/tlgs/lib/ps2epsi.ps @@ -164,7 +164,9 @@ ps2edict begin dup rm gt % If the new index is greater, we save index and element { /rm exch def } { pop } ifelse - } if + } { + pop + } ifelse } for % Write out the magic string and bounding box information diff --git a/Master/tlpkg/tlgs/lib/quit.ps b/Master/tlpkg/tlgs/lib/quit.ps deleted file mode 100644 index ff604669be5..00000000000 --- a/Master/tlpkg/tlgs/lib/quit.ps +++ /dev/null @@ -1 +0,0 @@ -quit diff --git a/Master/tlpkg/tlgs/lib/showchar.ps b/Master/tlpkg/tlgs/lib/showchar.ps deleted file mode 100644 index 32a71c6862b..00000000000 --- a/Master/tlpkg/tlgs/lib/showchar.ps +++ /dev/null @@ -1,92 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% showchar.ps -% Show the outline and rasterized forms of a character. - -/F where { pop } { /F /Times-Roman def } ifelse -/P where { pop } { /P 16 def } ifelse -/Rx where { pop } { /Rx 100 def } ifelse -/Ry where { pop } { /Ry 100 def } ifelse -/Cs where { pop } { /Cs (M) def } ifelse -/Pr where { pop } { /Pr false def } ifelse -/Delay where { pop } { /Delay 0 def } ifelse - -0 setgray -(markpath.ps) runlibfile -(markhint.ps) runlibfile -/mmx [1 0 0 1 0 0] def -/getpath % - getpath <pathproc> - { [ - { /moveto cvx } { /lineto cvx } { /curveto cvx } { /closepath cvx } - pathforall - ] cvx - } def -/bitselectfont % <fontname> <scale> bitselectfont - - { exch findfont exch scalefont setfont - % Compute the bounding box in device coordinates. - gsave [Rx 72 div 0 0 Ry 72 div 0 0] setmatrix - currentfont /FontMatrix get concat - currentfont /FontBBox get aload pop - transform ceiling cvi /ury exch def ceiling cvi /urx exch def - transform floor cvi /lly exch def floor cvi /llx exch def - /bbx urx llx sub def /bby ury lly sub def - grestore - } def -/bitshow % <string> bitshow - - { /S exch def gsave - /W bbx 8 add 7 or 1 add def - /H bby 8 add def - /buf W 8 idiv string def - /M [Rx 72 div 0 0 Ry -72 div 4 llx sub H 4 sub] def - M W H <ff 00> makeimagedevice - /dev exch def - gsave dev setdevice - newpath 0 lly idtransform moveto - 0 setgray - gsave - /hpath S false charpath getpath def - grestore - S show grestore - 20 20 translate - 50000 Rx Ry .max P mul div dup scale - 0.7 setgray - 0 W H true M - { dup 1 add exch dev exch buf copyscanlines - } imagemask pop - 0 setlinewidth - gsave 0.5 1 0.5 setrgbcolor hpath exec mmx markpath grestore - 0 0.5 1 setrgbcolor hpath exec stroke - % Show the hints for Type 1 fonts also. - currentfont /FontType get 1 eq - { gsave 1 0 0 setrgbcolor - 0 lly M idtransform translate - currentfont /FontMatrix get - dup Pr markfonthints - currentfont /Encoding get S 0 get get exch Pr markcharhints - grestore - } - if - } def -F P bitselectfont -/S1 1 string def -Cs - { /C exch def - currentfont /Encoding get C get /.notdef ne - { save S1 0 C put S1 bitshow - showpage restore - } if - } forall -quit diff --git a/Master/tlpkg/tlgs/lib/showpage.ps b/Master/tlpkg/tlgs/lib/showpage.ps deleted file mode 100644 index 97a4789f75d..00000000000 --- a/Master/tlpkg/tlgs/lib/showpage.ps +++ /dev/null @@ -1 +0,0 @@ -showpage diff --git a/Master/tlpkg/tlgs/lib/traceop.ps b/Master/tlpkg/tlgs/lib/traceop.ps index 0b655df04de..6d5509b10fb 100644 --- a/Master/tlpkg/tlgs/lib/traceop.ps +++ b/Master/tlpkg/tlgs/lib/traceop.ps @@ -25,7 +25,7 @@ /traceflush true def currentpacking true setpacking -.currentglobal true .setglobal +currentglobal true setglobal % Define the default "before" action /tracebefore { vmstatus 3 traceprint pop pop pop } def @@ -56,7 +56,7 @@ currentpacking true setpacking pop userdict } if /.tddict exch def /.tdict exch def /.tname exch cvlit def - .currentglobal [ + currentglobal [ .tname /=only cvx ( ) /print cvx /.tpre load /traceprint cvx /traceend cvx .tdict .tname get /.tdef 1 index cvlit def @@ -66,17 +66,17 @@ currentpacking true setpacking } if } if /.tpost load /traceprint cvx () /= cvx /traceend cvx - .tdef gcheck /.tpre load gcheck and /.tpost load gcheck and .setglobal + .tdef gcheck /.tpre load gcheck and /.tpost load gcheck and setglobal ] cvx .tdef type /operatortype eq { .tname exch .makeoperator } if - exch .setglobal + exch setglobal .tddict exch .tname exch put end % userdict } bind def /tracebind /bind load def % in case someone wants to put it back /bind { } def % disable -.setglobal +setglobal setpacking diff --git a/Master/tlpkg/tlgs/lib/type1enc.ps b/Master/tlpkg/tlgs/lib/type1enc.ps deleted file mode 100644 index 42be0cfb218..00000000000 --- a/Master/tlpkg/tlgs/lib/type1enc.ps +++ /dev/null @@ -1,64 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% type1enc.ps -% PostScript language versions of the Type 1 encryption/decryption algorithms. - -% This file is normally not needed with Ghostscript, since Ghostscript -% implements these algorithms in C. For the specifications, see Chapter 7 of -% "Adobe Type 1 Font Format," ISBN 0-201-57044-0, published by Addison-Wesley. - -/.type1crypt % <R> <from> <to> <proc> .type1crypt <R'> <to> - % (auxiliary procedure) - { 4 1 roll - 0 2 index length getinterval - 0 1 2 index length 1 sub - { % Stack: proc R from to index - 2 index 1 index get % proc R from to index C/P - 4 index -8 bitshift xor 3 copy put % proc R from to index P/C - 5 index exec % proc R from to C - -% Compute R' = ((R + C) * 52845 + 22719) mod 65536 -% without exceeding a 31-bit integer magnitude, given that -% 0 <= R <= 65535 and 0 <= C <= 255. - - 4 -1 roll add - dup 20077 mul % 52845 - 32768 - exch 1 and 15 bitshift add % only care about 16 low-order bits - 22719 add 65535 and 3 1 roll - } - for exch pop 3 -1 roll pop - } bind def - -% <state> <fromString> <toString> .type1encrypt <newState> <toSubstring> -% Encrypts fromString according to the algorithm for Adobe -% Type 1 fonts, writing the result into toString. -% toString must be at least as long as fromString or a -% rangecheck error occurs. state is the initial state of -% the encryption algorithm (a 16-bit non-negative -% integer); newState is the new state of the algorithm. - -/.type1encrypt - { { exch pop } .type1crypt - } bind def - -% <state> <fromString> <toString> .type1decrypt <newState> <toSubstring> -% Decrypts fromString according to the algorithm for Adobe -% Type 1 fonts, writing the result into toString. Other -% specifications are as for type1encrypt. - -/.type1decrypt - { { pop 2 index exch get } .type1crypt - } bind def diff --git a/Master/tlpkg/tlgs/lib/type1ops.ps b/Master/tlpkg/tlgs/lib/type1ops.ps deleted file mode 100644 index ce9d8d9431e..00000000000 --- a/Master/tlpkg/tlgs/lib/type1ops.ps +++ /dev/null @@ -1,236 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% 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 () -} put -dup /nametype { - Type1encode exch get -} put -dup /stringtype { -} put -dup /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> put -dup /hstemhm <12> put -dup /hintmask <13> put -dup /cntrmask <14> put -dup /vstemhm <17> put -dup /rcurveline <18> put -dup /rlinecurve <19> put -dup /vvcurveto <1a> put -dup /hhcurveto <1b> put -dup /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 -} put -dup 28 { % Type 2 only - dup read pop 128 xor 128 sub 8 bitshift - 1 index read pop add -} put -32 1 246 { 2 copy dup 139 sub put pop } for -dup 247 { dup read pop 108 add } put -dup 248 { dup read pop 364 add } put -dup 249 { dup read pop 620 add } put -dup 250 { dup read pop 876 add } put -dup 251 { dup read pop 108 add neg } put -dup 252 { dup read pop 364 add neg } put -dup 253 { dup read pop 620 add neg } put -dup 254 { dup read pop 876 add neg } put -dup 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 diff --git a/Master/tlpkg/tlgs/lib/unprot.ps b/Master/tlpkg/tlgs/lib/unprot.ps deleted file mode 100644 index d5b1d19ff7a..00000000000 --- a/Master/tlpkg/tlgs/lib/unprot.ps +++ /dev/null @@ -1,66 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% Disable all access checks. This is useful for printing out -% eexec-encrypted Type 1 fonts, and similar purposes. - -systemdict wcheck - { /protdict systemdict def - } - { (Please restart Ghostscript with the -dWRITESYSTEMDICT switch.\n) print - (Some access checks will remain active if you do not do this.\n) print - flush - /protdict userdict def - } -ifelse - -% The procedures we're about to define will go in systemdict, -% so they must be allocated in global VM. - -.currentglobal true .setglobal - -protdict begin - /readonly. /readonly load def - /executeonly. /executeonly load def - /noaccess. /noaccess load def - /readonly { } odef - /readonly.. /readonly load def - /executeonly { } odef - /executeonly.. /executeonly load def - /noaccess { } odef - /noaccess.. /noaccess load def -end - -% Disable the access checks. - -/unprot - { protdict begin - /readonly /readonly.. load def - /executeonly /executeonly.. load def - /noaccess /noaccess.. load def - end - } bind def - -% Re-enable the access checks. - -/reprot - { protdict begin - /readonly /readonly. load def - /executeonly /executeonly. load def - /noaccess /noaccess. load def - end - } bind def - -.setglobal diff --git a/Master/tlpkg/tlgs/lib/viewmiff.ps b/Master/tlpkg/tlgs/lib/viewmiff.ps index 01855090348..4c918ea6859 100644 --- a/Master/tlpkg/tlgs/lib/viewmiff.ps +++ b/Master/tlpkg/tlgs/lib/viewmiff.ps @@ -100,7 +100,7 @@ { f token pop dup (:) eq { pop exit } if dup type /nametype eq { - .namestring (=) search { + 1024 string cvs (=) search { exch pop miffwords exch .knownget { exec } { pop } ifelse } { pop % who knows? diff --git a/Master/tlpkg/tlgs/lib/viewpbm.ps b/Master/tlpkg/tlgs/lib/viewpbm.ps index 177f22bb63e..60d5782da1d 100644 --- a/Master/tlpkg/tlgs/lib/viewpbm.ps +++ b/Master/tlpkg/tlgs/lib/viewpbm.ps @@ -128,10 +128,10 @@ % show the tags as pseudo-color image /ncomp 1 def /invert false def /maxv 1 def [ /Indexed /DeviceRGB 255 - % TEXT=1, IMAGE=2, PATH=4, UNTOUCHED=8 - % red green blue gray + % UNTOUCHED=0, TEXT=1, IMAGE=2, PATH=4 + % gray red green blue 768 string - dup 0 <000000 ff0000 00ff00 ffff00 0000ff ff00ff 00ffff ffffff cccccc> putinterval + dup 0 <cccccc ff0000 00ff00 ffff00 0000ff ff00ff 00ffff ffffff 000000> putinterval ] setcolorspace w h { readstring pop @@ -190,7 +190,7 @@ pop /FITPAGE where {/FITPAGE get}{false} ifelse { - Width 72 mul SCALE mul Height 72 mul SCALE mul + Width SCALE mul Height SCALE mul } { % Map pixels SCALE-for-1. Assume orthogonal transformation. diff --git a/Master/tlpkg/tlgs/lib/wftopfa.ps b/Master/tlpkg/tlgs/lib/wftopfa.ps deleted file mode 100644 index 005eaf83f53..00000000000 --- a/Master/tlpkg/tlgs/lib/wftopfa.ps +++ /dev/null @@ -1,302 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% wftopfa.ps -% Convert a Wadalab base font to .PFA (or .PFB) format. - -(gs_ksb_e.ps) runlibfile -(wrfont.ps) runlibfile - -/wftopfa_dict 100 dict def -wftopfa_dict begin - -/KanjiSubEncoding dup .findencoding def - -% Initialize parameters. -/init % - init - - { /chars 256 dict def - /version (001.001) def - /highcode 0 def - /StdHW [32] def - /StdVW [32] def - /UniqueID 20000000 def - /FontBase (Wadalab) def - /StdEncMode false def - /CustomEncMode false def - /Binary false def - /Encrypt true def - } bind def - -% Read definitions. -/rdstring 5000 string def -/readdefs % <filename> readdefs - - { (r) file - { dup rdstring readline not { pop exit } if - dup length 15 ge - { dup dup length 7 sub 7 getinterval (> CompD) eq - { token pop exch token pop exch pop - dup 0 get /highcode exch def - exch chars 3 1 roll put - } - { pop - } - ifelse - } - { pop - } - ifelse - } - loop closefile - } bind def - -% Write out the final font. -/writepfa - { 4 string highcode 16#1000 add 16 2 index cvrs 0 (.r) putinterval - FontBase exch concatstrings /fullname exch def - UniqueID 20000000 eq { /UniqueID 4990000 highcode add def } if - /encoding CustomEncMode - { KanjiSubEncoding } - { StdEncMode { StandardEncoding } { ISOLatin1Encoding } ifelse } - ifelse def - - /Font 30 dict def - Font begin - /FontInfo 20 dict def - FontInfo begin - - % Write the clear text part. - - /CreationDate (%Calendar%) currentdevparams - dup /Weekday get {(Sun )(Mon )(Tue )(Wed )(Thu )(Fri )(Sat )} exch get - 1 index /Month get 1 sub - {(Jan)(Feb)(Mar)(Apr)(May)(Jun)(Jul)(Aug)(Sep)(Oct)(Nov)(Dec)} exch get - concatstrings - {{/Day ( )} {/Hour ( )} {/Minute (:)} {/Second (:)} {/Year ( )}} - { dup 1 get 3 -1 roll exch concatstrings exch - 0 get 2 index exch get - dup 10 lt { =string cvs (0) exch concatstrings } { =string cvs } ifelse - concatstrings - } - forall exch pop readonly def - /VMusage 100000 def - /version version readonly def - /Notice (No copyright on this font. Original available from moe.ipl.t.u-tokyo.ac.jp:/Font. Converted by wftopfa.ps (Artifex Software Inc).) readonly def - /FullName fullname readonly def - /FamilyName FontBase readonly def - /Weight (Regular) readonly def - /ItalicAngle 0 def - /isFixedPitch true def - /UnderlinePosition 0 def - /UnderlineThickness 0 def - - end % FontInfo - - /FontName fullname cvn def - /Encoding encoding def - /PaintType 0 def - /FontType 1 def - /FontMatrix [.001 0 0 .001 0 -0.16] readonly def - /UniqueID UniqueID def - /FontBBox [0 0 1000 1000] readonly def - - /Private 20 dict def - Private begin - - /-| {string currentfile exch readstring pop} readonly def - /|- {readonly def} readonly def - /| {readonly put} readonly def - /BlueValues [] readonly def - /OtherBlues [] readonly def - /MinFeature {16 16} readonly def - /StdHW StdHW def - /StdVW StdVW def - /ForceBold false def - /password 5839 def - /UniqueID UniqueID def - /OtherSubrs [] readonly def - /Subrs [ - (\020\2771p|\020\024\020=-\223D\\\342R) readonly - (\020\2771py\274\366Uz) readonly - (\020\2771py\275\304\236i) readonly - (\020\2771p\371) readonly - (\020\2771p~\266+6\034\3446z) readonly - ] readonly def - - end % Private - - /CharStrings 256 dict def - chars - { exch =string cvs - dup 0 get highcode eq - { 1 get encoding exch get exch CharStrings 3 1 roll put } - { pop pop } - ifelse - } - forall - - end % Font - - Font /FontName get Font definefont setfont - (%stdout) (w) file writefont - } bind def - -% Scan the command line and process files. -/options mark - /version { 2 copy get /version exch def 1 add } bind - /StdHW { 2 copy get cvx exec /StdHW exch def 1 add } bind - /StdVW { 2 copy get cvx exec /StdVW exch def 1 add } bind - /UniqueId { 2 copy get cvi /UniqueID exch def 1 add } bind - /UniqueID 1 index - /FontBase { 2 copy get /FontBase exch def 1 add } bind - /StdEnc { /StdEncMode true def } bind - /CustomEnc { /CustomEncMode true def } bind - /Binary { /Binary true def } bind - /noEncrypt { /Encrypt false def } bind -.dicttomark def -/wftopfa % [(arg1) ...] wftopfa - - { init dup 0 - { dup 2 index length ge { exit } if - 2 copy get exch 1 add exch - options 1 index .knownget { exch pop exec } { readdefs } ifelse - } - loop pop pop - wrfont_dict /binary_CharStrings Binary put - wrfont_dict /eexec_encrypt Encrypt put - wrfont_dict /name_all_Encodings CustomEncMode put - writepfa - } bind def - -end % wftopfa_dict - -/wftopfa - { mark exch wftopfa_dict begin /saved save def { wftopfa } exec false%stopped - { cleartomark true } { cleartomark false } ifelse - saved end restore { stop } if - } bind def - -[ shellarguments - { ] wftopfa } - { pop } -ifelse - -% ---------------- Root font ---------------- % - -% Define the Encoding for the root font. -/wfrootencoding -% \x00-\x3F - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 1 2 3 4 5 6 7 8 0 0 0 0 0 0 0 - 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 -% \x40-\x7F - 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 - 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 - 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 - 73 74 75 76 77 0 0 0 0 0 0 0 0 0 0 0 -% \x80-\xFF -128 copy -256 packedarray def - -% Define the template for the root font dictionary. -/wfrootfontdict mark - /FontType 0 - /FontMatrix [1 0 0 1 0 0] - /FMapType 2 - /Encoding wfrootencoding -.dicttomark def - -% Define a dummy (placeholder) Type 1 font for the FDepVector. -/type1dummyfont % <fontname> type1dummyfont <font> - { mark /FontName 3 -1 roll - /FontType 1 - /FontMatrix [.001 0 0 .001 0 0] - /FontBBox [0 0 1000 1000] - /Encoding /KanjiSubEncoding findencoding - /CharStrings 0 dict - /Private mark /BlueValues [] /password 5839 .dicttomark - .dicttomark dup /FontName get exch definefont - } bind def - -% Write a root font. Again, wrfont.ps does most of the work. -/makerootfont % <rootname> makerootfont <font> - { wfrootfontdict dup length 4 add % FontName, FDepVector, PrefEnc, FID - dict copy begin - cvlit /FontName exch def - 4 dict begin - /len FontName length def - /str len 4 add string def - FontName str cvs pop - str len (.r) putinterval - /FDepVector [ 16#21 1 16#74 - { dup wfrootencoding exch get 0 eq - { pop - } - { 16 str len 2 add 2 getinterval cvrs pop - str cvn type1dummyfont - } - ifelse - } - for end counttomark -1 roll dup counttomark 2 roll - ] def - FontName currentdict end definefont - } bind def -/writerootfont % <rootname> writerootfont - - { save exch makerootfont setfont (%stdout) (w) file writefont restore - } bind def - -% ---------------- Converting entire fonts ---------------- % - -% Define the directory where the Wadalab fonts are stored. -/wfdir (/home/ghost/kanji/w) def - -% Convert an entire Wadalab font. -/writeentirefont % <fontname> <template*> writeentirefont - - { 2 dict begin - /templates exch def - /fontname exch def - [ templates - { wfdir (/) concatstrings exch concatstrings { copystring } - 8192 string filenameforall - } - forall - wfdir (/wadalab-sym/*.ps) concatstrings { copystring } - 8192 string filenameforall - ] - (%!\n) print - { /currentuserparams where - { pop currentuserparams /VMReclaim get -2 vmreclaim { vmreclaim } } - { { } } - ifelse - } == (exec\n) print - (/KanjiSubEncoding ) print /KanjiSubEncoding findencoding == - (readonly def\n) print - { (%stderr) (w) file dup 2 index write== flushfile - mark exch (CustomEnc) (Binary) (noEncrypt) - (FontBase) fontname counttomark -1 roll ] wftopfa - } - forall - fontname cvn writerootfont - (exec\n) print - end - } def % don't bind, so we can print the procedure - -% Convert the Wadalab JIS 1&2 SaiMincho font. -% To invoke this from the command line, -% gs -dNODISPLAY -q wftopfa.ps -c writeSaiMincho0 flush quit >wmin0.ps -% To make the resulting font loadable on demand, add to the Fontmap file: -% /Wadalab-SaiMincho (wmin0.ps) ; -/writeSaiMincho0 - { (Wadalab-SaiMincho) [ (wadalab-mincho-0-8/*.ps) ] writeentirefont - } bind def diff --git a/Master/tlpkg/tlgs/lib/wrfont.ps b/Master/tlpkg/tlgs/lib/wrfont.ps deleted file mode 100644 index eeab341ac28..00000000000 --- a/Master/tlpkg/tlgs/lib/wrfont.ps +++ /dev/null @@ -1,664 +0,0 @@ -% Copyright (C) 2001-2012 Artifex Software, Inc. -% 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. -% -% Refer to licensing information at http://www.artifex.com or contact -% Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, -% CA 94903, U.S.A., +1(415)492-9861, for further information. -% - -% wrfont.ps -% Write out a Type 1 font in readable, reloadable form. -% Note that this does NOT work on protected fonts, such as Adobe fonts -% (unless you have loaded unprot.ps first, in which case you may be -% violating the Adobe license). - -% ****** NOTE: This file must be kept consistent with gs_pfile.ps. - -/wrfont_dict 100 dict def -wrfont_dict begin - -% ------ Options ------ % - -% Define whether to use eexec encryption for the font. -% eexec encryption is only useful for compatibility with Adobe Type Manager -% and other programs; it only slows Ghostscript down. - /eexec_encrypt false def - -% Define whether to write out the CharStrings in binary or in hex. -% Binary takes less space on the file, but isn't guaranteed portable. - /binary_CharStrings false def - -% Define whether to use binary token encodings when possible. -% Binary tokens are smaller and load faster, but are a Level 2 feature. - /binary_tokens false def - -% Define whether to encrypt the CharStrings on the file. (CharStrings -% are always encrypted in memory.) Unencrypted CharStrings load about -% 20% slower, but make the files compress much better for transport. - /encrypt_CharStrings true def - -% Define whether the font must provide standard PostScript language -% equivalents for any facilities it uses that are provided in Ghostscript -% but are not part of the standard PostScript language. - /standard_only true def - -% Define the value of lenIV to use in writing out the font. -% use_lenIV = 0 produces the smallest output, but this may not be -% compatible with old Adobe interpreters. use_lenIV = -1 means -% use the value of lenIV from the font. - /use_lenIV -1 def - -% Define whether to produce the smallest possible output, relying -% as much as possible on Ghostscript-specific support code. -% Taking full advantage of this requires the following settings: -% binary_CharStrings = true, binary_tokens = true, standard_only = false. - /smallest_output false def - -% Define whether to write out all currently known Encodings by name, -% or only StandardEncoding and ISOLatin1Encoding. - /name_all_Encodings false def - -% ---------------- Runtime support ---------------- % - -/.packedfilefilter where - { pop } - { (gs_pfile.ps) runlibfile } -ifelse - -% ------ Output utilities ------ % - -% By convention, the output file is named psfile. - -% Define some utilities for writing the output file. - /wtstring 2000 string def - /wb {psfile exch write} bind def - /wnb {/wb load repeat} bind def - /w1 {psfile exch write} bind def - /ws {psfile exch writestring} bind def - /wl {ws (\n) ws} bind def - /wt {wtstring cvs ws ( ) ws} bind def - /wd % Write a dictionary. - { dup length wo {dict dup begin} wol { we } forall - {end} wol - } bind def - /wld % Write a large dictionary more efficiently. - % Ignore the readonly attributes. - { dup length wo {dict dup begin} wol - 0 exch - { exch wo wo () wl - 1 add dup 200 eq - { wo ({def} repeat) wl 0 } - if - } - forall - dup 0 ne - { wo ({def} repeat) wl } - { pop } - ifelse - (end) ws - } bind def - /we % Write a dictionary entry. - { exch wo wo /def cvx wo (\n) ws - } bind def - /wcs % Write a CharString (or Subrs entry) - { dup type /stringtype eq - { 4330 exch changelenIV 0 ge - { % Add some leading garbage bytes. - wtstring changelenIV 2 index length getinterval - .type1decrypt exch pop - wtstring exch 0 exch length changelenIV add getinterval - } - { % Drop some leading garbage bytes. - wtstring .type1decrypt exch pop - changelenIV neg 1 index length 1 index sub getinterval - } - ifelse - binary_tokens encrypt_CharStrings and - { % Suppress recognizing the readonly status of the string. - 4330 exch dup .type1encrypt exch pop wo - } - { encrypt_CharStrings - { 4330 exch dup .type1encrypt exch pop - } if - smallest_output - { wo - } - { readonly dup length wo - binary_tokens not { ( ) ws } if - readproc ws wx - } - ifelse - } - ifelse - } - { wo % PostScript procedure - } - ifelse - } bind def - -% Construct the inversion of the system name table. - (\210\001) token pop exch pop 1 eq { % i.e., do we have binary tokens? - /snit 256 dict def - 0 1 255 { - (\221 ) dup 1 3 index put - { token } stopped { - pop pop - } { - % Stack: char () token true - pop exch pop exch snit 3 1 roll put - } ifelse - } for - } { - /snit 1 dict def - } ifelse - -% Write an object, using binary tokens if requested and possible. - /woa % write in ascii - { psfile exch write==only - } bind def - - % Lookup table for ASCII output. - - /intbytes % int nbytes -> byte* - { { dup 255 and exch -8 bitshift } repeat pop - } bind def - /wotta 10 dict dup begin - { /booleantype /integertype } - { { ( ) ws woa } def } - forall - % Iterate over arrays so we can print operators. - /arraytype - { dup xcheck {(}) ({)} {(]) ([)} ifelse ws exch dup wol exch ws wop - } bind def - /dicttype - { ( ) ws wd } def - /nametype - { dup xcheck { ( ) ws } if woa - } bind def - % Map back operators to their names, - % so we can write procedures. - /nulltype - { pop ( null) ws - } bind def - /operatortype - { wtstring cvs cvn cvx wo - } bind def - % Convert reals to integers if possible. - /realtype - { dup cvi 1 index eq { cvi wo } { ( ) ws woa } ifelse - } bind def - % == truncates strings longer than 200 characters! - /stringtype - { (\() ws dup - { dup dup 32 lt exch 127 ge or - { (\\) ws dup -6 bitshift 48 add w1 - dup -3 bitshift 7 and 48 add w1 - 7 and 48 add - } - { dup dup -2 and 40 eq exch 92 eq or {(\\) ws} if - } - ifelse w1 - } - forall - (\)) ws wop - } bind def - /packedarraytype - { ([) ws dup { wo } forall - encodingnames 1 index known - % This is an encoding, but not one of the standard ones. - % Use the built-in encoding only if it is available. - { encodingnames exch get wo - ({findencoding}stopped{pop) ws - (}{counttomark 1 add 1 roll cleartomark}ifelse) - } - { pop () - } - ifelse - (/packedarray where{pop counttomark packedarray exch pop}{]readonly}ifelse) ws - wl - } - def - end def - - % Lookup table for binary output. - - /wottb 8 dict dup begin - wotta currentdict copy pop - /integertype - { dup dup 127 le exch -128 ge and - { 136 wb 255 and wb } - { dup dup 32767 le exch -32768 ge and - { 134 wb 2 intbytes wb wb } - { 132 wb 4 intbytes wb wb wb wb } - ifelse - } - ifelse - } bind def - /nametype - { dup snit exch known - { dup xcheck { 146 } { 145 } ifelse wb - snit exch get wb - } - { wotta /nametype get exec - } - ifelse - } bind def - /stringtype - { dup dup length dup 255 le { 142 2 } { 2 intbytes 143 3 } ifelse wnb - ws wop - } bind def - end def - - /wop % Write object protection - { wcheck not { /readonly cvx wo } if - } bind def - /wo % Write an object. - { dup type binary_tokens { wottb } { wotta } ifelse - exch get exec - } bind def - /wol % Write a list of objects. - { { wo } forall - } bind def - -% Write a hex string for Subrs or CharStrings. - /wx % string -> - { binary_CharStrings - { ws - } - { % Some systems choke on very long lines, so - % we break up the hexstring into chunks of 50 characters. - { dup length 25 le {exit} if - dup 0 25 getinterval psfile exch writehexstring (\n) ws - dup length 25 sub 25 exch getinterval - } loop - psfile exch writehexstring - } ifelse - } bind def - -% ------ CharString encryption utilities ------ % - -/enc_dict 20 dict def -1 dict begin -/bind { } def % make sure we can print out the procedures -enc_dict begin - -(type1enc.ps) runlibfile -enc_dict /.type1decrypt undef % we don't need this - -end end - -enc_dict { 1 index where { pop pop pop } { def } ifelse } forall - -% ------ Other utilities ------ % - -% Test whether two values are equal (for default dictionary entries). - /valueeq % <obj1> <obj2> valueeq <bool> - { 2 copy eq - { pop pop true } - { % Special hack for comparing FontMatrix values - dup type /arraytype eq 2 index type /arraytype eq and - { dup length 2 index length eq - { true 0 1 3 index length 1 sub - { % Stack: arr1 arr2 true index - 3 index 1 index get 3 index 3 -1 roll get eq not - { pop false exit } - if - } - for 3 1 roll pop pop - } - { pop pop false - } - ifelse - } - { pop pop false - } - ifelse - } - ifelse - } bind def - -% ------ The main program ------ % - -% Define the dictionary of keys to skip because they are treated specially. -/.fontskipkeys mark - /CharStrings dup - /Encoding dup - /FDepVector dup - /FID dup - /FontInfo dup - /Metrics dup - /Metrics2 dup - /Private dup -.dicttomark def -/.minfontskipkeys mark - .fontskipkeys { } forall - /FontName dup - /UniqueID dup -.dicttomark def -/.privateskipkeys mark - /ND dup - /NP dup - /RD dup - /Subrs dup -.dicttomark def -/.minprivateskipkeys mark - .privateskipkeys { } forall - /MinFeature dup - /Password dup - /UniqueID dup -.dicttomark def - -% Define the procedures for the Private dictionary. -% These must be defined without `bind', -% for the sake of the DISKFONTS feature. -4 dict begin - /-! {string currentfile exch readhexstring pop} def - /-| {string currentfile exch readstring pop} def - /|- {readonly def} def - /| {readonly put} def -currentdict end /encrypted_procs exch def -4 dict begin - /-! {string currentfile exch readhexstring pop - 4330 exch dup .type1encrypt exch pop} def - /-| {string currentfile exch readstring pop - 4330 exch dup .type1encrypt exch pop} def - /|- {readonly def} def - /| {readonly put} def -currentdict end /unencrypted_procs exch def - -% Construct an inverse dictionary of encodings. -/encodingnames mark - StandardEncoding /StandardEncoding - ISOLatin1Encoding /ISOLatin1Encoding - SymbolEncoding /SymbolEncoding - DingbatsEncoding /DingbatsEncoding - /resourceforall where - { pop (*) { cvn dup findencoding exch } 100 string /Encoding resourceforall } - if -.dicttomark def - -% Invert the standard encodings. -.knownEncodings length 256 mul dict begin - 0 .knownEncodings - { { currentdict 1 index known { pop } { 1 index def } ifelse - 1 add - } - forall - } - forall pop -currentdict end /inverseencodings exch def - -/writefont % <psfile> writefont - (writes the current font) - { /psfile exch def - /Font currentfont def - /FontInfo Font /FontInfo .knownget not { 0 dict } if def - /FontType Font /FontType get def - /hasPrivate Font /Private known def - /Private hasPrivate { Font /Private get } { 0 dict } ifelse def - /readproc binary_CharStrings { (-| ) } { (-! ) } ifelse def - /privateprocs - encrypt_CharStrings binary_tokens not and - { encrypted_procs } { unencrypted_procs } ifelse - def - /addlenIV false def - /changelenIV use_lenIV 0 lt - { 0 } - { use_lenIV Private /lenIV .knownget not - { 4 /addlenIV use_lenIV 4 ne def } if sub } - ifelse def - /minimize - smallest_output - FontType 1 eq and - Font /UniqueID known and - def - (%!FontType) ws FontType wtstring cvs ws (-1.0: ) ws - currentfont /FontName get wt - FontInfo /version .knownget not { (001.001) } if wl - FontInfo /CreationDate .knownget { (%%Creation Date: ) ws wl } if - FontInfo /VMusage .knownget - { (%%VMusage: ) ws dup wt wtstring cvs wl } - if - (systemdict begin) wl - -% If we're going to use eexec, create the filters now. - /realpsfile psfile def - eexec_encrypt - { /eexecfilter psfile binary_CharStrings not - { pop /bxstring 35 string def - { pop dup length 0 ne - { realpsfile exch writehexstring realpsfile (\n) writestring } - { pop } - ifelse bxstring - } - /NullEncode filter dup /hexfilter exch def - } - if 55665 /eexecEncode filter def - } - if - -% Turn on binary tokens if relevant. - binary_tokens { (currentobjectformat 1 setobjectformat) wl } if - -% If the file has a UniqueID, write out a check against loading it twice. - minimize - { Font /FontName get wo - Font /UniqueID get wo - Private length addlenIV { 1 add } if wo - Font length 1 add wo % +1 for FontFile - ( .checkexistingfont) wl - } - { Font /UniqueID known - { ({} FontDirectory) ws Font /FontName get dup wo ( known) wl - ( {) ws wo ( findfont dup /UniqueID known) wl - ( { dup /UniqueID get) ws Font /UniqueID get wo ( eq exch /FontType get 1 eq and }) wl - ( { pop false } ifelse) wl - ( { pop save /restore load } if) wl - ( } if) wl - } - if - } - ifelse - -% If we are writing unencrypted CharStrings for a standard environment, -% write out the encryption procedures. - privateprocs unencrypted_procs eq standard_only and - { (systemdict /.type1encrypt known) wl - ( { save /restore load } { { } } ifelse) wl - (userdict begin) wl - enc_dict { we } forall - (end exec) wl - } - if - -% Write out the creation of the font dictionary and FontInfo. - minimize not - { Font length 1 add wo {dict begin} wol % +1 for FontFile - } - if - (/FontInfo ) ws FontInfo wd {readonly def} wol - -% Write out the other fixed entries in the font dictionary. - Font begin - Font - { minimize - { .minfontskipkeys 2 index known - { pop pop - } - { //.compactfontdefault 2 index .knownget - { 1 index valueeq { pop pop } { we } ifelse } - { we } - ifelse - } - ifelse - } - { .fontskipkeys 2 index known { pop pop } { we } ifelse - } - ifelse - } forall - /Encoding - encodingnames Encoding known - name_all_Encodings - Encoding StandardEncoding eq or - Encoding ISOLatin1Encoding eq or and - { encodingnames Encoding get cvx } - { Encoding } - ifelse - dup /StandardEncoding cvx eq minimize and - { pop pop } - { we } - ifelse - -% Write the FDepVector, if any. - Font /FDepVector .knownget - { {/FDepVector [} wol - { /FontName get wo {findfont} wol () wl } forall - {] readonly def} wol - } - if - -% Write out the Metrics, if any. - Font /Metrics .knownget - { (/Metrics ) ws wld {readonly def} wol - } - if - Font /Metrics2 .knownget - { (/Metrics2 ) ws wld {readonly def} wol - } - if - -% Start the eexec-encrypted section, if applicable. - eexec_encrypt - { {currentdict currentfile eexec} wol () wl - /psfile eexecfilter store - (\000\000\000\000) ws {begin} wol - } - if - -% Create and initialize the Private dictionary, if any. - hasPrivate -{ - Private - minimize - { begin {Private dup begin} - } - { dup length privateprocs length add dict copy begin - privateprocs { readonly def } forall - /Private wo - currentdict length 1 add wo {dict dup begin} - } - ifelse wol () wl - currentdict - { 1 index minimize { .minprivateskipkeys } { .privateskipkeys } ifelse - exch known - { pop pop } - { 1 index /lenIV eq use_lenIV 0 ge and { pop use_lenIV } if we } - ifelse - } forall - addlenIV { /lenIV use_lenIV we } if -} -if - -% Write the Subrs entries, if any. - currentdict /Subrs known - { (/Subrs[) wl - Subrs - { dup null ne - { wcs minimize not { () wl } if } - { pop /null cvx wo } - ifelse - } forall - {] dup {readonly pop} forall readonly def} wol () wl - } - if - -% Wrap up the Private dictionary. - hasPrivate - { end % Private - minimize - { {end readonly pop} } % Private - { {end readonly def} } % Private in font - ifelse wol - } - if - -% Write the CharStrings entries. -% Detect identical (eq) entries, which bdftops produces. - currentdict /CharStrings known -{ - /CharStrings wo CharStrings length wo - minimize - { encrypt_CharStrings not wo ( .readCharStrings) wl - CharStrings length dict - CharStrings - { exch inverseencodings 1 index .knownget not { dup } if wo - % Stack: vdict value key - 3 copy pop .knownget { wo pop pop } { 3 copy put pop wcs } ifelse - } forall - } - { {dict dup Private begin begin} wol () wl - CharStrings length dict - CharStrings - { 2 index 1 index known - { exch wo 1 index exch get wo {load def} wol () wl - } - { 2 index 1 index 3 index put - exch wo wcs ( |-) wl - } - ifelse - } forall - {end end} wol - } - ifelse - pop - { readonly def } % CharStrings in font - wol -} -if - -% Terminate the output. - end % Font - eexec_encrypt - { {end mark currentfile closefile} wol () wl - eexecfilter dup flushfile closefile % psfile is eexecfilter - binary_CharStrings not { hexfilter dup flushfile closefile } if - /psfile realpsfile store - 8 - { (0000000000000000000000000000000000000000000000000000000000000000) - wl - } - repeat {cleartomark} wol - } - if - { FontName currentdict end definefont pop - } - wol - Font /UniqueID known { /exec cvx wo } if - binary_tokens { /setobjectformat cvx wo } if - ( end) wl % systemdict - - } bind def - -% ------ Other utilities ------ % - -% Prune garbage characters and OtherSubrs out of the current font, -% if the relevant dictionaries are writable. -/prunefont - { currentfont /CharStrings get wcheck - { currentfont /CharStrings get dup [ exch - { pop dup (S????00?) .stringmatch not { pop } if - } forall - ] { 2 copy undef pop } forall pop - } - if - } bind def - -end % wrfont_dict - -/writefont { wrfont_dict begin writefont end } def |