diff options
author | Reinhard Kotucha <reinhard.kotucha@web.de> | 2015-04-02 23:03:05 +0000 |
---|---|---|
committer | Reinhard Kotucha <reinhard.kotucha@web.de> | 2015-04-02 23:03:05 +0000 |
commit | 8abbce681f8658c931f1403643d08ad2e7fb6d7e (patch) | |
tree | 7b4a42a19e5cc2c57575c4111c9ecb3fbe40ece7 /Master/tlpkg/tlgs | |
parent | b2dcb6358d02b5256659808c99916fe8c5975e35 (diff) |
tlpkg/tlgs: upgrade: gs-9.15 -> gs-9.16
git-svn-id: svn://tug.org/texlive/trunk@36707 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/tlpkg/tlgs')
22 files changed, 137 insertions, 7036 deletions
diff --git a/Master/tlpkg/tlgs/README.TEXLIVE b/Master/tlpkg/tlgs/README.TEXLIVE index f24672968ed..f405a8d33a5 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.15 distribution +This directory contains a subset of the Ghostscript 9.16 distribution for Windows. The only purpose of this package is to support programs shipped with TeX Live. It's not intended for general use. diff --git a/Master/tlpkg/tlgs/bin/gsdll32.dll b/Master/tlpkg/tlgs/bin/gsdll32.dll Binary files differindex 9da961bfdab..791a5a6e7c9 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 fe0bb1cc6dd..789cdd0c55b 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 1a735e26d63..fa1484ea5c0 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 d37c04a0784..640d32f7d30 100755 --- a/Master/tlpkg/tlgs/bin/gswin32c.exe +++ b/Master/tlpkg/tlgs/bin/gswin32c.exe diff --git a/Master/tlpkg/tlgs/lib/EndOfTask.ps b/Master/tlpkg/tlgs/lib/EndOfTask.ps deleted file mode 100644 index ce9a8a9d59b..00000000000 --- a/Master/tlpkg/tlgs/lib/EndOfTask.ps +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Master/tlpkg/tlgs/lib/FAPIconfig-FCO b/Master/tlpkg/tlgs/lib/FAPIconfig-FCO deleted file mode 100644 index 6df21e3d6ab..00000000000 --- a/Master/tlpkg/tlgs/lib/FAPIconfig-FCO +++ /dev/null @@ -1,13 +0,0 @@ -%! -% This is configuration file for FAPI client. - -/FontPath () % A default directory for FAPI-handled font files path in FAPIfontmap. -/CIDFontPath () % A default directory for FAPI-handled CID font files path in FAPIcidfmap. -/HookDiskFonts [] % FontType values for disk PS fonts to be redirected to FAPI. -/HookEmbeddedFonts [] % FontType values for embedded PS fonts to be redirected to FAPI. - -% Values allowed for HookDiskFonts and HookEmbeddedFonts are 1, 2, 9, 11, 42. -% "Disk fonts" are fonts being installed to Ghostscript with 'lib/Fontmap' or with GS_FONTPATH, -% and CID font resource files. -% "Embedded fonts" are fonts and CID fonts being embedded into a document. - diff --git a/Master/tlpkg/tlgs/lib/FCOfontmap-PCLPS3 b/Master/tlpkg/tlgs/lib/FCOfontmap-PCLPS3 deleted file mode 100644 index 1cd79526947..00000000000 --- a/Master/tlpkg/tlgs/lib/FCOfontmap-PCLPS3 +++ /dev/null @@ -1,197 +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. -% - - -% May add general FAPIfontmap records here like this : -/Wingdings-Regular << /Path FCOfontfile2 /FontType 1 /FAPI /UFST /SubfontId 0 /Encoding /Wingdings /Decoding /FCO_Wingdings>> ; - -% Mapping Postscript fonts to pclp2_xj.fco FCO members : -FCOfontfile ReadFCOfontmap: -0 Albertus-Medium -1 Albertus-ExtraBold -2 AntiqueOlive -3 AntiqueOlive-Italic -4 AntiqueOlive-Bold -5 Arial -6 Arial-Italic -7 Arial-Bold -8 Arial-BoldItalic -9 Clarendon-Condensed-Bold -10 Coronet -11 CourierHP -12 CourierHP-Italic -13 CourierHP-Bold -14 CourierHP-BoldItalic -15 Garamond-Antiqua -16 Garamond-Kursiv -17 Garamond-Halbfett -18 Garamond-KursivHalbfett -19 LetterGothic -20 LetterGothic-Italic -21 LetterGothic-Bold -22 Marigold -23 CGOmega -24 CGOmega-Italic -25 CGOmega-Bold -26 CGOmega-BoldItalic -27 SymbolMT SymbolEncoding FCO_Symbol -28 CGTimes -29 CGTimes-Italic -30 CGTimes-Bold -31 CGTimes-BoldItalic -32 TimesNewRoman -33 TimesNewRoman-Italic -34 TimesNewRoman-Bold -35 TimesNewRoman-BoldItalic -36 Univers-Medium -37 Univers-MediumItalic -38 Univers-Bold -39 Univers-BoldItalic -40 Univers-Condensed-Medium -41 Univers-Condensed-MediumItalic -42 Univers-Condensed-Bold -43 Univers-Condensed-BoldItalic -44 Courier -45 Courier-Italic -46 Courier-Bold -47 Courier-BoldItalic -48 AlbertusMT-Light -49 AlbertusMT -50 AlbertusMT-Italic -51 AntiqueOlive-Roman -52 AntiqueOlive-Italic -53 AntiqueOlive-Bold -54 AntiqueOlive-Compact -55 AvantGarde-Book -56 AvantGarde-BookOblique -57 AvantGarde-Demi -58 AvantGarde-DemiOblique -59 Bodoni -60 Bodoni-Italic -61 Bodoni-Bold -62 Bodoni-BoldItalic -63 Bodoni-Poster -64 Bodoni-PosterCompressed -65 Bookman-Light -66 Bookman-LightItalic -67 Bookman-Demi -68 Bookman-DemiItalic -69 Candid -70 Apple-Chancery -71 Chicago -72 Clarendon-Light -73 Clarendon -74 Clarendon-Bold -75 CooperBlack -76 CooperBlack-Italic -77 Copperplate-ThirtyTwoBC -78 Copperplate-ThirtyThreeBC -79 Coronet-Regular -80 Courier -81 Courier-Oblique -82 Courier-Bold -83 Courier-BoldOblique -84 Eurostile -85 Eurostile-Bold -86 Eurostile-ExtendedTwo -87 Eurostile-BoldExtendedTwo -88 StempelGaramond-Roman -89 StempelGaramond-Italic -90 StempelGaramond-Bold -91 StempelGaramond-BoldItalic -92 Geneva -93 GillSans-Light -94 GillSans-LightItalic -95 GillSans -96 GillSans-Italic -97 GillSans-Bold -98 GillSans-BoldItalic -99 GillSans-ExtraBold -100 GillSans-Condensed -101 GillSans-BoldCondensed -102 Goudy -103 Goudy-Italic -104 Goudy-Bold -105 Goudy-BoldItalic -106 Goudy-ExtraBold -107 Helvetica-Condensed -108 Helvetica-Condensed-Oblique -109 Helvetica-Condensed-Bold -110 Helvetica-Condensed-BoldObl -111 Helvetica -112 Helvetica-Oblique -113 Helvetica-Bold -114 Helvetica-BoldOblique -115 Helvetica-Narrow -116 Helvetica-Narrow-Oblique -117 Helvetica-Narrow-Bold -118 Helvetica-Narrow-BoldOblique -119 HoeflerText-Regular -120 HoeflerText-Italic -121 HoeflerText-Black -122 HoeflerText-BlackItalic -123 HoeflerText-Ornaments -124 JoannaMT -125 JoannaMT-Italic -126 JoannaMT-Bold -127 JoannaMT-BoldItalic -128 LetterGothic -129 LetterGothic-Slanted -130 LetterGothic-Bold -131 LetterGothic-BoldSlanted -132 LubalinGraph-Book -133 LubalinGraph-BookOblique -134 LubalinGraph-Demi -135 LubalinGraph-DemiOblique -136 Monaco -137 MonaLisa-Recut -138 NewYork -139 NewCenturySchlbk-Roman -140 NewCenturySchlbk-Italic -141 NewCenturySchlbk-Bold -142 NewCenturySchlbk-BoldItalic -143 Optima -144 Optima-Italic -145 Optima-Bold -146 Optima-BoldItalic -147 Oxford -148 Palatino-Roman -149 Palatino-Italic -150 Palatino-Bold -151 Palatino-BoldItalic -152 Symbol SymbolEncoding FCO_Symbol -153 Taffy -154 Times-Roman -155 Times-Italic -156 Times-Bold -157 Times-BoldItalic -158 Univers -159 Univers-Oblique -160 Univers-Bold -161 Univers-BoldOblique -162 Univers-Condensed -163 Univers-CondensedOblique -164 Univers-CondensedBold -165 Univers-CondensedBoldOblique -166 Univers-Light -167 Univers-LightOblique -168 Univers-Extended -169 Univers-ExtendedObl -170 Univers-BoldExt -171 Univers-BoldExtObl -172 ZapfChancery-MediumItalic -173 ZapfDingbats DingbatsEncoding FCO_Dingbats -EndFCOfontmap -%EOF diff --git a/Master/tlpkg/tlgs/lib/FCOfontmap-PS3 b/Master/tlpkg/tlgs/lib/FCOfontmap-PS3 deleted file mode 100644 index 0962cfcef4c..00000000000 --- a/Master/tlpkg/tlgs/lib/FCOfontmap-PS3 +++ /dev/null @@ -1,158 +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. -% - - -% May add general FAPIfontmap records here like this : -/Wingdings-Regular << /Path FCOfontfile2 /FontType 1 /FAPI /UFST /SubfontId 0 /Encoding /Wingdings /Decoding /FCO_Wingdings>> ; - -% Mapping Postscript fonts to ps3___xh.fco FCO members : -FCOfontfile ReadFCOfontmap: -0 AlbertusMT-Light -1 AlbertusMT -2 AlbertusMT-Italic -3 AntiqueOlive-Roman -4 AntiqueOlive-Italic -5 AntiqueOlive-Bold -6 AntiqueOlive-Compact -7 ArialMT -8 Arial-ItalicMT -9 Arial-BoldMT -10 Arial-BoldItalicMT -11 AvantGarde-Book -12 AvantGarde-BookOblique -13 AvantGarde-Demi -14 AvantGarde-DemiOblique -15 Bodoni -16 Bodoni-Italic -17 Bodoni-Bold -18 Bodoni-BoldItalic -19 Bodoni-Poster -20 Bodoni-PosterCompressed -21 Bookman-Light -22 Bookman-LightItalic -23 Bookman-Demi -24 Bookman-DemiItalic -% 25 Candid % Disabled due to unknown glyph names. -26 Apple-Chancery -27 Chicago -28 Clarendon-Light -29 Clarendon -30 Clarendon-Bold -31 CooperBlack -32 CooperBlack-Italic -33 Copperplate-ThirtyTwoBC -34 Copperplate-ThirtyThreeBC -35 Coronet-Regular -36 Courier -37 Courier-Oblique -38 Courier-Bold -39 Courier-BoldOblique -40 Eurostile -41 Eurostile-Bold -42 Eurostile-ExtendedTwo -43 Eurostile-BoldExtendedTwo -44 StempelGaramond-Roman -45 StempelGaramond-Italic -46 StempelGaramond-Bold -47 StempelGaramond-BoldItalic -48 Geneva -49 GillSans-Light -50 GillSans-LightItalic -51 GillSans -52 GillSans-Italic -53 GillSans-Bold -54 GillSans-BoldItalic -55 GillSans-ExtraBold -56 GillSans-Condensed -57 GillSans-BoldCondensed -58 Goudy -59 Goudy-Italic -60 Goudy-Bold -61 Goudy-BoldItalic -62 Goudy-ExtraBold -63 Helvetica-Condensed -64 Helvetica-Condensed-Oblique -65 Helvetica-Condensed-Bold -66 Helvetica-Condensed-BoldObl -67 Helvetica -68 Helvetica-Oblique -69 Helvetica-Bold -70 Helvetica-BoldOblique -71 Helvetica-Narrow -72 Helvetica-Narrow-Oblique -73 Helvetica-Narrow-Bold -74 Helvetica-Narrow-BdOblique -75 HoeflerText-Regular -76 HoeflerText-Italic -77 HoeflerText-Black -78 HoeflerText-BlackItalic -79 HoeflerText-Ornaments -80 JoannaMT -81 JoannaMT-Italic -82 JoannaMT-Bold -83 JoannaMT-BoldItalic -84 LetterGothic -85 LetterGothic-Slanted -86 LetterGothic-Bold -87 LetterGothic-BoldSlanted -88 LubalinGraph-Book -89 LubalinGraph-BookOblique -90 LubalinGraph-Demi -91 LubalinGraph-DemiOblique -92 Marigold -93 Monaco -94 MonaLisa-Recut -95 NewYork -96 NewCenturySchlbk-Roman -97 NewCenturySchlbk-Italic -98 NewCenturySchlbk-Bold -99 NewCenturySchlbk-BoldItalic -100 Optima -101 Optima-Italic -102 Optima-Bold -103 Optima-BoldItalic -104 Oxford -105 Palatino-Roman -106 Palatino-Italic -107 Palatino-Bold -108 Palatino-BoldItalic -109 Symbol SymbolEncoding FCO_Symbol -110 Taffy -111 Times-Roman -112 Times-Italic -113 Times-Bold -114 Times-BoldItalic -115 TimesNewRomanPSMT -116 TimesNewRomanPS-ItalicMT -117 TimesNewRomanPS-BoldMT -118 TimesNewRomanPS-BdItMT -119 Univers -120 Univers-Oblique -121 Univers-Bold -122 Univers-BoldOblique -123 Univers-Condensed -124 Univers-CondensedOblique -125 Univers-CondensedBold -126 Univers-CondensedBdOblique -127 Univers-Light -128 Univers-LightOblique -129 Univers-Extended -130 Univers-ExtendedObl -131 Univers-BoldExt -132 Univers-BoldExtObl -133 ZapfChancery-MediumItalic -134 ZapfDingbats DingbatsEncoding FCO_Dingbats -EndFCOfontmap -%EOF diff --git a/Master/tlpkg/tlgs/lib/Fontmap b/Master/tlpkg/tlgs/lib/Fontmap index 04702bb5e72..b9b9951a231 100644 --- a/Master/tlpkg/tlgs/lib/Fontmap +++ b/Master/tlpkg/tlgs/lib/Fontmap @@ -1,5 +1,5 @@ %!
-%% $Id: Fontmap 7680 2008-04-27 12:21:15Z reinhardk $
+%% $Id$
% See Fontmap.TeXLive for the syntax of real Fontmap files.
%% Replace 1 (Fontmap.TeXLive)
diff --git a/Master/tlpkg/tlgs/lib/Fontmap.TeXLive b/Master/tlpkg/tlgs/lib/Fontmap.TeXLive index ed079d50fc1..3dc7fe38cef 100644 --- a/Master/tlpkg/tlgs/lib/Fontmap.TeXLive +++ b/Master/tlpkg/tlgs/lib/Fontmap.TeXLive @@ -1,5 +1,5 @@ %% Fontmap.TeXLive -%% $Id: Fontmap.TeXLive 7680 2008-04-27 12:21:15Z reinhardk $ +%% $Id$ %% This file is part of TeXLive. %% You may freely use, modify and/or distribute this file. diff --git a/Master/tlpkg/tlgs/lib/bj8.rpd b/Master/tlpkg/tlgs/lib/bj8.rpd deleted file mode 100644 index fce6c2d4b7d..00000000000 --- a/Master/tlpkg/tlgs/lib/bj8.rpd +++ /dev/null @@ -1,17 +0,0 @@ - -StartEntry: U_CanonBJC8200 -GSDriver: uniprint -Description: {Canon BJC-8200 (UP)} -About: { \ - Canon BJC-8200 uniprint driver settings.\ - } -Resolution: {NA} {NA} {} - BitsPerPixel: {bj8pp12f} {1200x1200DpI, photo paper pro, color, rendered} - BitsPerPixel: {bj8hg12f} {1200x1200DpI, high gloss photo film, color, rendered} - BitsPerPixel: {bj8gc12f} {1200x1200DpI, glossy photo cards, color, rendered} - BitsPerPixel: {bj8oh06n} {600x600DpI, transparencies, color, rendered} - BitsPerPixel: {bj8ts06n} {600x600DpI, t-shirt transfer, color, rendered} - BitsPerPixel: {bj8pa06n} {600x600DpI, plain paper, color, rendered} - -EndEntry -# diff --git a/Master/tlpkg/tlgs/lib/cat.ps b/Master/tlpkg/tlgs/lib/cat.ps deleted file mode 100644 index 1dec040db76..00000000000 --- a/Master/tlpkg/tlgs/lib/cat.ps +++ /dev/null @@ -1,74 +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. -% -% -% $Id: cat.ps 8331 2008-02-05 11:07:00Z kens $ -% -% Appends one file to another. Primarily used to overcome the -% 'copy' limitation of Windows command shell for ps2epsi -% -% the files to be appended are given by the environament -% variables %infile% and %outfile%. %infile% is appended to -% %outfile% -% - -/datastring 1024 string def - -{ - (outfile) getenv - { - /outfilename exch def - (infile) getenv - { - /infilename exch def - - infilename status - { - pop pop pop pop outfilename status - { - pop pop pop pop - infilename (r) file /infile exch def - outfilename (a+) file /outfile exch def - { - infile datastring readstring - { - outfile exch writestring - } - { - dup length 0 gt - {outfile exch writestring} {pop} ifelse - exit - } ifelse - } loop - infile closefile - outfile closefile - } - { - (Failed to find file ) print outfilename == - } ifelse - } - { - (Failed to find file ) print infilename == - } ifelse - } - { - (Couldn't find %infile% environment variable) == - } ifelse - } - { - (Couldn't find %outfile% environment variable) == - } - ifelse -} bind -exec diff --git a/Master/tlpkg/tlgs/lib/dumphint.ps b/Master/tlpkg/tlgs/lib/dumphint.ps deleted file mode 100644 index 444692a0c83..00000000000 --- a/Master/tlpkg/tlgs/lib/dumphint.ps +++ /dev/null @@ -1,755 +0,0 @@ -% Copyright (C) 2000, 2001 Aladdin Enterprises. All rights reserved. -% -% This software is provided AS-IS with no warranty, either express or -% implied. -% -% This software is distributed under license and may not be copied, -% modified or distributed except as expressly authorized under the terms -% of the license contained in the file LICENSE in this distribution. -% -% For more information about licensing, please refer to -% http://www.ghostscript.com/licensing/. For information on -% commercial licensing, go to http://www.artifex.com/licensing/ or -% contact Artifex Software, Inc., 101 Lucas Valley Road #110, -% San Rafael, CA 94903, U.S.A., +1(415)492-9861. - -% $Id$ -% Linearized PDF hint formatting utility. - -% -% Linearized PDF hints generated by Acrobat suite seem to deviate from -% the published specification. -% -% /P (page offset hint table) key in hint stream is not generated by -% Adobe products. The key is no longer required in PDF 1.5. -% -% Per-page items 4 and 5 of the page offset hint table start from 1st -% page rather than 2nd page as the spec claims. -% -% All array entries start from the new byte boundary. -% - -/table_width 79 def -/col1_width 66 def - -% Skip bits to the next byte boundary -/bytealign { % <stream> bytealign - - begin /N 0 def /B 0 def end -} bind def - -% Set bit stream position and align it to byte boundary -/set_align { % <<>> pos set_align - - exch begin - S exch setfileposition - /N 0 def /B 0 def - end -} bind def - -% Read requested number of bits from the bit stream. -/bitread { % <bstream> <width> bitwrite <value> - exch begin - 0 % bit val - { - 1 index N .min % bit val m - dup 3 1 roll % bit m val m - bitshift % bit m val<<m - B 2 index N sub % bit m val<<m B m-N - bitshift add % bit m val<<m+B>>(N-m) - 3 -1 roll % m val' bit - 2 index sub % m val' bit' - 3 -1 roll % val' bit' m - N exch sub dup % val' bit' N' N' - 1 exch bitshift % val' bit' N' 1<<N' - 1 sub B and % val' bit' N' B&(1<<N') - /B exch def % val' bit' N' - /N exch def % val' bit' - dup 0 le { - pop exit % val' - } if - /N N 8 add def - /B B 8 bitshift S read not { 0 ( *** EOF! *** ) = } if add def - exch - } loop % bit' val' - end -} bind def - -% Print a string several times -/multiprint { % cnt (s) multiprint - - exch { dup print } repeat pop -} bind def - -% Split the line into 2 substrings. -/split_line { % (s) split_line () () - dup length col1_width gt { - col1_width 1 sub - dup -1 0 { - dup % (s) w i i - 3 index % (s) w i i () - exch get % (s) w i c - 32 eq { - exch pop exit - } if - pop - } for - 1 add % (s) w' - 1 index exch % (s) (s) w' - 0 exch % (s) (s) 0 w' - getinterval % (s) (v) - } { - dup % (s) (s) - } ifelse - (\n) search { - 4 1 roll % (pre) (s) (post) (match) - pop pop % (pre) (s) - 1 index length % (pre) (s) len - 1 add % (pre) (s) len+1 - } { - exch % (pre) (s) - 1 index length % (pre) (s) len - } ifelse - 1 index length % (pre) (s) len Len - 1 index sub % (pre) (s) len Len-len - getinterval % (pre) (post) -} bind def - -% Print a 2 column table. The string is printed in 1st column -% left-aligned. The number is printed in 2nd column right-aligned. -/two_column { % n () two_column - - split_line % n (a) () - 3 1 roll % () n (a) - dup length % () n (a) len - exch print % () n len - exch =string cvs % () len (n) - dup length % () len (n) len2 - 3 -1 roll add % () (n) len+len2 - //table_width % () (n) len+len2 78 - exch sub % () (n) 78-len+len2 - ( ) multiprint % () (n) - = % () - { dup length 0 eq { exit } if - split_line exch = - } loop - pop - () = -} bind def - -% Print the header of a hint table -/table_header { % () table_header - - dup length dup - table_width exch sub 2 idiv % () len sp - dup ( ) multiprint % () len sp - 3 -1 roll = % len sp - ( ) multiprint % len - (=) multiprint - ()= ()= -} bind def - -% Pretty-print an array on top level -/dump_array { % [ ] dump_array - - ([) = ( ) print - 1 exch { - =string cvs % pos () - dup length dup % pos () len len - 3 index add 1 add % pos () len len+pos+1 - table_width gt { - () = - ( ) print % pos () len - 2 add % pos () pos' - 3 1 roll print pop % pos' - } { - ( ) print % pos () len - exch print % pos len - add 1 add % pos' - } ifelse - } forall - pop - () = (]) = -} bind def - -% Pretty-print an array on 2nd level -/dump_array2 { % [ ] dump_array2 - - ( [) print - 3 exch { - =string cvs % pos () - dup length dup % pos () len len - 3 index add 1 add % pos () len len+pos+1 - table_width 2 sub gt { - () = - ( ) print % pos () len - 4 add % pos () pos' - 3 1 roll print pop % pos' - } { - ( ) print % pos () len - exch print % pos len - add 1 add % pos' - } ifelse - } forall - pop - ( ]) = -} bind def - -% Print an array header -/array_header { - () = = -} bind def - -% Analyze the page offset hint table. -/dump_page_offset_table { % - dump_page_offset_table - - hint_stream - - dup 32 bitread - dup /hint_minnop exch def - (1. The least number of objects in a page.) two_column - - dup 32 bitread - dup /hint_1st_obj exch def - (2. Location of the first page's page object.) two_column - - dup 16 bitread - dup /hint_maxnopbits exch def - (3. Bits for difference between max and min number of page objects.) two_column - - dup 32 bitread - dup /hint_minpl exch def - (4. Least length of a page.) two_column - - dup 16 bitread - dup /hint_maxplbits exch def - (5. Bits for difference between max and min length of a page.) two_column - - dup 32 bitread - dup /hint_minsco exch def - (6. Least start of Contents offset. ) - 1 index 0 ne { (\n*** Acrobat expects 0 ***) concatstrings } if - two_column - - dup 16 bitread - dup /hint_maxscobits exch def - (7. Bits for difference between max and min offset to the start of the content stream.) two_column - - dup 32 bitread - dup /hint_mincl exch def - (8. Least contents length.) two_column - - dup 16 bitread - dup /hint_maxclbits exch def - (9. Bits needed to represent the greatest Contents length.) two_column - - dup 16 bitread - dup /hint_maxsorbits exch def - (10. Bits needed to represent the greatest number of Shared Object references.) two_column - - dup 16 bitread - dup /hint_sobits exch def - (11. Bits needed to identify a Shared Object.) two_column - - dup 16 bitread - dup /hint_numfbits exch def - (12. Bits needed to represent numerator of fraction.) two_column - - dup 16 bitread - dup /hint_denf exch def - (13. Denominator of fraction.) two_column - - pop - - LinearizationParams /N get - - % 1. Number of objects in the page. - hint_stream bytealign - /hint_page_obj [ - 2 index { - hint_stream hint_maxnopbits bitread - hint_minnop add - } repeat - ] readonly def - - (1. Number of objects on the page) array_header - hint_page_obj dump_array - - % 2, Page length in bytes. - hint_stream bytealign - /hint_page_len [ - 2 index { - hint_stream hint_maxplbits bitread - hint_minpl add - } repeat - ] readonly def - - (2. Page length in bytes.) array_header - hint_page_len dump_array - - % 3, Number of shared objects referenced from the page - hint_stream bytealign - /hint_page_sobj [ - 2 index { - hint_stream hint_maxsorbits bitread - } repeat - ] readonly def - - (3. Number of shared objects referenced from the page.) array_header - hint_page_sobj dump_array - - % 4. Index into the shared objects hint table - hint_stream bytealign - /hint_page_sobj_id [ - 0 1 4 index 1 sub { - hint_page_sobj exch get [ - exch { - hint_stream hint_sobits bitread - } repeat - ] readonly - } for - ] readonly def - - (4. Index into the shared objects hint table.) array_header - ([) = - hint_page_sobj_id { dump_array2 } forall - (])= - - % 5. Fractional position for each shared object reference - hint_stream bytealign - /hint_page_sobj_pos [ - 0 1 4 index 1 sub { - hint_page_sobj exch get [ - exch { - hint_stream hint_numfbits bitread - hint_denf div - } repeat - ] readonly - } for - ] readonly def - - (5. Fractional position for each shared object reference. ) array_header - ([)= - hint_page_sobj_pos { dump_array2 } forall - (])= - - % 6. Offset of the page's content stream from the beginning of the page. - hint_stream bytealign - /hint_page_content_offset [ - 2 index { - hint_stream hint_maxscobits bitread - hint_minsco add - } repeat - ] readonly def - - (6. Offset of the page's content stream from the beginning of the page.) array_header - hint_page_content_offset dump_array - - % 7. Length of the page's content stream in bytes. - hint_stream bytealign - /hint_page_content_len [ - 2 index { - hint_stream hint_maxclbits bitread - hint_mincl add - } repeat - ] readonly def - - (7. Length of the page's content stream in bytes.) array_header - hint_page_content_len dump_array - - pop -} bind def - -% Analyze tha shared object hint table -/dump_shared_object_table { - hint_stream - - dup 32 bitread - dup /shint_1st_obj_id exch def - (1. Object number of the first object in the shared objects section) two_column - - dup 32 bitread - dup /shint_1st_obj_pos exch def - (2. Location of the first object in the shared objects section.) two_column - - dup 32 bitread - dup /shint_1st_shared exch def - (3. The number of shared object entries for the first page.) two_column - - dup 32 bitread - dup /shint_all_shared exch def - (4. Number of shared object entries for the shared objects section including 1st page.) two_column - - dup 16 bitread - dup /shint_group_bits exch def - (5. Number of bits needed to represent the greatest number of objects in a shared object group.) two_column - - dup 32 bitread - dup /shint_group_least_sz exch def - (6. Least length of a shared object group in bytes.) two_column - - dup 16 bitread - dup /shint_group_diff_bits exch def - (7. Bits for the difference between the greatest and least length of a shared object group size.) two_column - pop - - (1. length of the object group in bytes.) array_header - hint_stream bytealign - /shint_group_sz [ - shint_all_shared { - hint_stream shint_group_diff_bits bitread - shint_group_least_sz add - } repeat - ] readonly def - - shint_group_sz dump_array - - (2. MD5 signature flag) array_header - hint_stream bytealign - /shint_md5_flags - [ shint_all_shared - { hint_stream 1 bitread - } repeat - ] readonly def - - shint_md5_flags dump_array - - (3. MD5 signature string) array_header - false shint_md5_flags { 0 ne or } forall { - shint_md5_flags { - 0 eq { - (<>)= - } { - hint_stream /S get 128 string - readstring pop - dup length 128 eq { - == - } { pop (Error reading nd5 string.) == - } ifelse - } ifelse - } forall - } { - () = (none) = - } ifelse - - (4. The number of objects in the group.) array_header - hint_stream bytealign - /shint_group_cnt [ - shint_all_shared { - hint_stream shint_group_bits bitread - } repeat - ] readonly def - - shint_group_cnt dump_array - - } bind def - -% Analyze the thumbnail hint table. -/dump_thumbnail_table { - hint_stream - - dup 32 bitread - dup /thint_1st_obj_id exch def - (1. Object number of the first thumbnail image.) two_column - - dup 32 bitread - dup /thint_1st_obj_pos exch def - (2. Location of the first thumbnail image.) two_column - - dup 32 bitread - dup /thint_page_cnt exch def - (3. Number of pages that have thumbnail images.) two_column - - dup 16 bitread - dup /thint_no_thumbnail_bits exch def - (4. Bits for the max number of consecutive pages without a thumbnail image.) two_column - - dup 32 bitread - dup /thint_min_sz exch def - (5. The least length of a thumbnail image in bytes.) two_column - - dup 15 bitread - dup /thint_obj_sz_bits exch def - (6. Bits for the difference between max and min length of a thumbnail image.) two_column - - dup 32 bitread - dup /thint_min_obj_cnt exch def - (7. The least number of objects in a thumbnail image.) two_column - - dup 16 bitread - dup /thint_obj_cnt_bits exch def - (8. Bits for the difference between max and min number of objects in a thumbnail image.) two_column - - dup 32 bitread - dup /thint_1st_shared_obj exch def - (9. First object in the thumbnail shared objects section.) two_column - - dup 32 bitread - dup /thint_1st_shared_pos exch def - (10. Location of the first object in the thumbnail shared objects section.) two_column - - dup 32 bitread - dup /thint_shared_cnt exch def - (11. Number of thumbnail shared objects.) two_column - - dup 32 bitread - dup /thint_shared_section_sz exch def - (12. Length of the thumbnail shared objects section in bytes.) two_column - - pop - LinearizationParams /N get - - (1. The number of preceding pages lacking a thumbnail image.) array_header - hint_stream bytealign - /thint_no_thumbnail_pages [ - 2 index { - hint_stream thint_no_thumbnail_bits bitread - } repeat - ] readonly def - - thint_no_thumbnail_pages dump_array - - (2. Number of objects in this page's thumbnail image.) array_header - hint_stream bytealign - /thint_page_obj_cnt [ - 2 index { - hint_stream thint_obj_cnt_bits bitread - thint_min_obj_cnt add - } repeat - ] readonly def - - thint_page_obj_cnt dump_array - - (3. Length of this page's thumbnail image in bytes.) array_header - hint_stream bytealign - /thint_page_obj_sz [ - 2 index { - hint_stream thint_obj_sz_bits bitread - thint_min_sz add - } repeat - ] readonly def - - thint_page_obj_sz dump_array - pop -} bind def - -% Analyze the generic hint table. -% The hint field names are re-used. -/dump_generic_table { - hint_stream - - dup 32 bitread - dup /ghint_1st_obj exch def - (1. Object number of the first object in the group.) two_column - - dup 32 bitread - dup /ghint_1st_obj_pos exch def - (2. Location of the first object in the group.) two_column - - dup 32 bitread - dup /ghint_obj_cnt exch def - (3. Number of objects in the group.) two_column - - dup 32 bitread - dup /ghint_group_sz exch def - (4. Length of the object group in bytes.) two_column - - pop -} bind def - -% Analyze the interactive hint table. -% The hint field names are re-used. -/dump_interactive_table { - hint_stream - - dup 32 bitread - dup /ihint_1st_obj exch def - (1. Object number of the first object in the group.) two_column - - dup 32 bitread - dup /ihint_1st_obj_pos exch def - (2. Location of the first object in the group.) two_column - - dup 32 bitread - dup /ihint_obj_cnt exch def - (3. Number of objects in the group.) two_column - - dup 32 bitread - dup /ihint_group_sz exch def - (4. Length of the object group in bytes.) two_column - - dup 32 bitread - dup /ihint_shared_cnt exch def - (5. Number of shared object references.) two_column - - dup 16 bitread - dup /ihint_shared_obj_bits exch def - (6. Bits for the max shared object id used by the interactive form or the logical structure hierarchy.) - 1 index hint_sobits ne { - (\n*** This fiels is not equal to max shared object ID bits ***) concatstrings - } if - - pop - - (7. Shared object identifier.) array_header - hint_stream bytealign - /ihint_shared_obj_id [ - ihint_shared_cnt { - hint_stream hint_sobits bitread - } repeat - ] readonly def - - ihint_shared_obj_id dump_array -} bind def - -% Enumerate all documented hint tables. -/dump_all_tables { % <<stream>> dump_all_tables - - (Page offset hint table) table_header - hint_stream 0 set_align - dump_page_offset_table - - (S, Shared object hint table) table_header - dup /S .knownget { - hint_stream exch set_align - dump_shared_object_table - } { - (Required table is not found.) error_msg - } ifelse - - dup /T .knownget { - (T, Thumbnail hint table) table_header - hint_stream exch set_align - dump_thumbnail_table - } if - - dup /O .knownget { - (O, Outline hint table) table_header - hint_stream exch set_align - dump_generic_table - } if - - dup /A .knownget { - (A, Thread information hint table) table_header - hint_stream exch set_align - dump_generic_table - } if - - dup /E .knownget { - (E, Named destination hint table) table_header - hint_stream exch set_align - dump_generic_table - } if - - dup /V .knownget { - (V, Interactive form hint table) table_header - hint_stream exch set_align - dump_interactive_table - } if - - dup /I .knownget { - (I, Information dictionary hint table) table_header - hint_stream exch set_align - dump_generic_table - } if - - dup /C .knownget { - (C, Logical structure hint table) table_header - hint_stream exch set_align - dump_interactive_table - } if - - dup /L .knownget { - (L, Page label hint table) table_header - hint_stream exch set_align - dump_generic_table - } if - - pop -} bind def - -% Load PDF file and extract the hint stream. -/pdf_dump_hints { % <infile> pdf_dump_hints - - dup (r) file % fname - false exch % fname F file - { - dup 7 string readstring pop % fname F file () - (%PDF-1.) ne { pop exit } if % fname F file - dup 0 setfileposition - dup token not { pop exit } if % fname F file obj - dup type /integertype ne { pop exit } if % fname F file obj - 1 index token not { pop pop exit } if % fname F file obj gen - dup type /integertype ne {pop pop exit}if % fname F file obj gen - 4 2 roll % fname obj gen F file - dup 0 setfileposition - exch true or % fname obj gen file T - exit - } loop - { - pdfdict begin - pdfopenfile dup begin - 40 dict begin - /IDict exch def - .setsafe - - % Read all objects into memory. - Trailer touch - resolveR % fname <<>> - dup /Linearized known { - dup /L get % fname <<>> Len - 3 -1 roll status not { 0 0 0 0 } if % <<>> Len - pop pop exch pop % <<>> Len len - eq { - /LinearizationParams exch def - LinearizationParams /H get - dup length 2 eq { - 0 get PDFoffset add PDFfile exch setfileposition - PDFfile token pop - PDFfile token pop - resolveR dup true resolvestream - /ReusableStreamDecode filter - bitstream dup bytealign - /hint_stream exch def - - dump_all_tables - } { - pop - (Overflow hint stream is not supported.) = - } ifelse - } { - pop - (Wrong file length in linearization dictionary.) = - } ifelse - } { - pop (The file is not linearized.) = - } ifelse - end % temporary dict - end % IDict - end - } { - pop - (Input file is not a valid PDF file.) = - } ifelse -} bind def - -% Initial setup -/dump_hints { - counttomark 1 eq { - exch pop - save exch - 3000000 setvmthreshold - pdfoptdict begin - pdf_dump_hints - end - restore - true - } { - cleartomark false - } ifelse -} bind def - -/shellarguments {false} def -(pdfopt.ps) runlibfile -currentdict /shellarguments undef - -% Check for command line arguments. -mark shellarguments { - dump_hints not { - (Usage: gs -dNODISPLAY -- dumphint.ps input.pdf) = flush - } if -} { - pop -} ifelse - -% EOF diff --git a/Master/tlpkg/tlgs/lib/ghostpdf.inf b/Master/tlpkg/tlgs/lib/ghostpdf.inf deleted file mode 100644 index a3536f7c6c3..00000000000 --- a/Master/tlpkg/tlgs/lib/ghostpdf.inf +++ /dev/null @@ -1,44 +0,0 @@ -; GHOSTPDF.INF (for Windows 2k, XP and XP x64 edition) - -[Version] -Signature="$Windows NT$" -Provider=Ghostgum Software Pty Ltd -ClassGUID={4D36E979-E325-11CE-BFC1-08002BE10318} -Class=Printer -CatalogFile=oemprint.cat - -DriverVer=01/02/2007,1.0.0.1 - -; Manufacturer section -[Manufacturer] -"Ghostscript"=Ghostscript,NTamd64,NTia64 - -; Model sections -[Ghostscript] -"Ghostscript PDF" = GHOSTPDF.PPD, Ghostscript_PDF, Ghostscript_PDF_Writer - -[Ghostscript.NTamd64] -"Ghostscript PDF" = GHOSTPDF.PPD, Ghostscript_PDF, Ghostscript_PDF_Writer - -[Ghostscript.NTia64] -"Ghostscript PDF" = GHOSTPDF.PPD, Ghostscript_PDF, Ghostscript_PDF_Writer - -; Installer section -[GHOSTPDF.PPD] -CopyFiles=@GHOSTPDF.PPD -DataSection=PSCRIPT_DATA -Include=NTPRINT.INF -Needs=PSCRIPT.OEM - -[DestinationDirs] -DefaultDestDir=66000 - -[SourceDisksNames] -1=%Disk1%,,,"" - -[SourceDisksFiles] -GHOSTPDF.PPD =1 - -[Strings] -Disk1="Ghostscript PPD Setup Disk 1" -; end of ghostpdf.inf diff --git a/Master/tlpkg/tlgs/lib/gs_fform.ps b/Master/tlpkg/tlgs/lib/gs_fform.ps deleted file mode 100644 index 235ce5af72c..00000000000 --- a/Master/tlpkg/tlgs/lib/gs_fform.ps +++ /dev/null @@ -1,91 +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. -% - -% Form caching implemented in PostScript. - -% This implementation doesn't do the right thing about halftone or -% Pattern phase, but the Pattern cache doesn't either.... - -% The Form cache key is the Form dictionary; the value is an array -% of 2 elements [CTM pattern_instance]. -% -% In order to prevent restore from clearing the cache, we explicitly -% push the cache entries on the stack before a restore and reinstall them. -currentglobal false setglobal -/.formcachedict 20 dict def % must be local -true setglobal -/restore { - mark .formcachedict { } forall - counttomark 1 add index { //restore } .internalstopped - { cleartomark //restore } - { counttomark 2 idiv { .formcachedict 3 1 roll put } repeat pop pop } - ifelse -} bind odef - -/.execform1 { - dup /Implementation known not { - dup /FormType get 1 ne { /rangecheck signalerror } if - % The Implementation is a Pattern that will draw the form. - currentglobal 1 index gcheck setglobal - % Stack: form global - 10 dict begin - /PatternType 1 def - /PaintType 1 def % colored - /TilingType 1 def % irrelevant - % Copy the BBox to the correct VM. - /BBox 2 index /BBox get 4 array copy exch 1 index def - % Set XStep and YStep to very large numbers, - % so we won't get multiple copies of the form. - /XStep 1 index dup 2 get exch 0 get sub 100 mul def - /YStep exch dup 3 get exch 1 get sub 100 mul def - /PaintProc 2 index /PaintProc get def - currentdict end readonly - % Stack: form global impl - exch setglobal - 1 index /Implementation 3 -1 roll .forceput - } if - .formcachedict 1 index .knownget { - % Check whether we can use the cached value. - % Stack: form cachevalue - matrix currentmatrix true 0 1 3 { - % Stack: form cachevalue curmat true index - 3 index 0 get 1 index get exch 3 index exch get ne { - pop pop false exit - } if - } for exch pop - } { - false - } ifelse not - { % Make a new cache entry. - gsave - matrix currentmatrix dup 4 0 put dup 5 0 put dup setmatrix - % Stack: form mat - 1 index /Implementation get - 2 index /Matrix get - makepattern 2 array astore - .formcachedict 2 index 2 index put - grestore - } if - % Stack: form cachevalue - -1 0 0 transform - 2 { exch round cvi } repeat .setscreenphase - 1 get setpattern - /BBox get aload pop - exch 3 index sub exch 2 index sub rectfill -} .bind odef % must bind .forceput - -.formtypes 1 /.execform1 load put - -setglobal diff --git a/Master/tlpkg/tlgs/lib/jobseparator.ps b/Master/tlpkg/tlgs/lib/jobseparator.ps deleted file mode 100644 index fbb6920842f..00000000000 --- a/Master/tlpkg/tlgs/lib/jobseparator.ps +++ /dev/null @@ -1,3 +0,0 @@ -% Execute the "real" system version of the ^D to separate jobs -% when -dJOBDSERVER is being used. -<04> cvn .systemvar exec diff --git a/Master/tlpkg/tlgs/lib/opdfread.ps b/Master/tlpkg/tlgs/lib/opdfread.ps deleted file mode 100644 index 62da258f098..00000000000 --- a/Master/tlpkg/tlgs/lib/opdfread.ps +++ /dev/null @@ -1,4694 +0,0 @@ -%!PS-Adobe-2.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. -% - -% $Id: opdfread.ps 11951 2010-12-15 08:22:58Z ken $ -% pdfread.ps - A procset for interpreting an ordered PDF 1.3 file. - -% This module defines routines for interpreting a PDF file with -% a Postscript interpreter. To convert a PDF file into Postscript -% just pre-contcatenate this file. The PDF file must satisfy -% few constraints : -% -% 1. It must contain only Postscript level 2 objects encoded with -% the PDF 1.3 language. Higher PDF levels must be re-distilled -% with CompatibilityLevel=1.3 . -% -% 2. Objects must be ordered so that any resource be defined before -% its usage. -% -% 3. The PDF file must not include other PDF files. -% Consequently we have a single instance of the PDF reader. -% We use this fact to simplify binding of the routines. -% -% 4. The PDF root object must always have the object id 1. -% -% 5. Generations besides 0 are not allowed. -% -% 6. xref must appear after all objects. -% -% Assuming the currentfile isn't positionable. -% As a consequence, the reader fully ignores xref. - -% ====================== Error handler ======================= -% A general error handler prints an error to page. - -% -% See if our notification from ps2write is present. If it is -% then pick it up. Otherwise define it as false. Used to prevent -% use of setmatrix at start of each page. The DSC-compliant -% output from ps2write wraps pages in a save/restore, so we don't -% need the setmatrix, and it breaks use of psnup with the output. -% -currentdict /DSC_OPDFREAD known { - currentdict /DSC_OPDFREAD get -}{ - false -} ifelse - -10 dict begin % A dictionary for local binding - -% This switch used to control paeg independent values, like -% whether to use InitialMatrix in SetupPageView -% -/DSC_OPDFREAD exch def - -/this currentdict def -/y 720 def -/ebuf 200 string def - -/prnt { - 36 //this /y get moveto //ebuf cvs show - //this /y 2 copy get 12 sub put -} bind def - -/newline { - 36 //this /y get moveto - //this /y 2 copy get 12 sub put -} bind def - -errordict /handleerror -{ systemdict begin - $error begin - newerror - { (%%[ Error handled by opdfread.ps : ) print errorname //ebuf cvs print (; OffendingCommand: ) - print /command load //ebuf cvs print ( ]%%) = flush - /newerror false store vmstatus pop pop 0 ne - { grestoreall - } if - errorname (VMerror) ne - { showpage - } if - initgraphics - 0 720 moveto - errorname (VMerror) eq - { //this /ehsave known - { clear //this /ehsave get restore 2 vmreclaim - } if - vmstatus exch pop exch pop - } - /Courier 12 selectfont - { - (ERROR: ) //prnt exec errorname //prnt exec - (OFFENDING COMMAND: ) //prnt exec - /command load //prnt exec - $error /ostack known { - (%%[STACK:) = - (STACK:) //prnt exec - $error /ostack get aload length { - //newline exec - dup mark eq { - (-mark-) dup = show - } { - dup type /nametype eq { - dup xcheck not { - (/) show - (/) print - } if - } if - dup = //ebuf cvs show - } ifelse - } repeat - } if - } ifelse - (%%]%) = - //systemdict /showpage get exec - quit - } if - end - end -} bind readonly put - -end % A dictionary for local binding - - -50 dict begin - -% ===================== Debugging ========================================= - -/DefaultSwitch % <name> DefaultSwitch - -{ - dup where { - pop pop - } { - false def - } ifelse -} bind def - -/=string 256 string def - -/=only { - //=string cvs print -} bind def - -/HexDigits (0123456789ABCDEF) readonly def - -%% This routine assumes that a PostScript int is only 32 bits -%% we partially address that by and'ing 15 with the 4 bits of -%% data in order to ensure that we don't index off the end of -%% the string above. However, if the integer is genuinely -%% more than 32 bits we still only print the first 32. -/PrintHex % <int> PrintHex - -{ 8 { - dup -28 bitshift 15 and //HexDigits exch 1 getinterval //=only exec - 4 bitshift - } repeat - pop -} bind def - -/PDFR_DEBUG DefaultSwitch -/PDFR_DUMP DefaultSwitch -/PDFR_STREAM DefaultSwitch -/TTFDEBUG DefaultSwitch -/RotatePages DefaultSwitch -/FitPages DefaultSwitch -/CenterPages DefaultSwitch -/SetPageSize DefaultSwitch - -/error % mark <object> .... error - -{ % A stub for a while. - counttomark 1 sub -1 0 { - index dup type /arraytype eq { == } { =only } ifelse - } for - () = - cleartomark - % Assuming ....Undefined is never defined. - % Use it to emit an error. - ....Undefined -} bind def - -//SetPageSize { - //RotatePages //FitPages or //CenterPages or{ - mark (/RotatePages, /FitPages and CenterPages are not allowed with /SetPageSize) //error exec - } if -} -{ - //FitPages //CenterPages and { - mark (CenterPages is not allowed with /FitPages) //error exec - } if -} -ifelse - -% ===================== Utilities ========================================= - -/knownget % <dict> <key> knownget <value> true - % <dict> <key> knownget false -{ - 2 copy known { - get true - } { - pop pop false - } ifelse -} bind def - -/IsUpper % <int> IsUpper <bool> -{ dup (A) 0 get ge exch (Z) 0 get le and -} bind def - -% Copy (recursive) packedarray|array to to global VM -% NOTE: a packedarray will be converted to non-packed (too bad) -/cpa2g { % <packedarray|array> cpa2g <packedarray|array> - dup length array % <src> <dest> - 0 1 2 index length 1 sub { - % <src> <dest> index - dup 3 index exch get cp2g - % <src> <dest> index <globalelement> - 3 copy put pop pop - } for - exch pop -} bind def - -% Copy (recursive) dict to to global VM -/cpd2g { - dup length dict exch { - cp2g 2 index 3 1 roll put - } forall -} bind def - -% Copy string to to global VM -/cps2g { % <string> cps2g <string> - dup length string copy -} bind def - -/cp2gprocs -<< /arraytype //cpa2g /dicttype //cpd2g /packedarraytype //cpa2g /stringtype //cps2g >> -def - -/cp2g { % <any> cp2g <any> - % where <any> is array | dict | string | packedarray - % NOTE: The object must be readable (not executeonly or noaccess) - dup gcheck not { - dup //cp2gprocs 1 index type - 2 copy known { - get currentglobal 3 1 roll true setglobal exec exch setglobal - % set the attributes appropriately (we must have 'read' access to get this far) - 1 index wcheck not { readonly } if - 1 index xcheck { cvx } if - exch pop % discard original (local) object - } { - pop pop % discard type - } ifelse - } if -} bind def - -% ===================== Work Data ========================================= - -/BlockBuffer 65535 string def % Make it big to load entire TrueType font -/PDFReader currentdict def -/ObjectRegistryMaxLength 50000 def -/ObjectRegistry 10 dict def -ObjectRegistry -begin - 0 ObjectRegistryMaxLength dict def -end -/CurrentObject null def -/DoneDocumentStructure false def -/GraphicState 20 dict begin - /InitialTextMatrix matrix def - /InitialMatrix matrix currentmatrix def -currentdict end def -/TempMatrix matrix def -/GraphicStateStack 20 array def -/GraphicStateStackPointer 0 def -/InitialTextMatrixStack 20 array def -/InitialTextMatrixStackPointer 0 def -/PDFColorSpaces 50 dict def -/InstalledFonts 50 dict def -/MacRomanEncodingInverse null def - -% We need some structures in local VM, put then into the userdict : -currentglobal false setglobal -userdict /PDFR_InitialGS gstate put -userdict /PDFR_Patterns 50 dict put -userdict /FuncDataReader 10 dict put -setglobal - -% ===================== Constants ========================================= - -% The ExtGState elements are composite, thus need to be copied to -% global VM (in case they aren't already global). -/InitialExtGState 20 dict begin - /BG2 currentblackgeneration cp2g def - /UCR2 currentundercolorremoval cp2g def - /TR2 currentglobal false setglobal [ currentcolortransfer ] exch setglobal cp2g def - /HT currenthalftone cp2g def -currentdict end readonly def - -/InitialGraphicState 20 dict begin - /FontSize 0 def - /CharacterSpacing 0 def - /TextLeading 0 def - /TextRenderingMode 0 def - /WordSpacing 0 def -currentdict end readonly def - -/SimpleColorSpaceNames 15 dict begin - /DeviceGray true def - /DeviceRGB true def - /DeviceCMYK true def -currentdict end readonly def - -/1_24_bitshift_1_sub 1 24 bitshift 1 sub def - -/ReadFontProcs 10 dict def % Will be filled below. - -/GetObject % <id> GetObject obj true - % <id> GetObject false -{ - dup ObjectRegistryMaxLength idiv - //PDFReader /ObjectRegistry get exch knownget { - exch knownget - } { - pop false - }ifelse -} bind def - -/PutObject % <id> <obj> PutObject -{ - 1 index ObjectRegistryMaxLength idiv % id obj oregnr - //PDFReader /ObjectRegistry get 1 index knownget { - % object already defined in Objectregistry - % id obj oregnr dict - exch pop % id obj dict - 3 1 roll put - }{ - % object not already defined in ObjectRegistry - % id obj oregnr - //PDFReader /ObjectRegistry get dup - begin % new Objectregistry entry: - 1 index ObjectRegistryMaxLength dict def - end - exch get % id obj dict - 3 1 roll put - }ifelse -} bind def - -% ===================== Reading PDF objects =============================== - -/Register % <DefaultDaemon> <id> <obj> Register - -{ - 1 index GetObject { - % d id obj e - dup xcheck { - 4 3 roll pop % id obj e - //PDFR_DEBUG { - (Have a daemon for ) print 2 index == - } if - %% We've got a definition daamon, execute it: - exec - } { - dup null ne { - mark (The object ) 4 index (is already defined : ) 4 index //error exec - } { - pop % d id obj - } ifelse - 3 2 roll % id obj d - %% Execute the default Daemon - exec - }ifelse - } { - % d id obj - 3 2 roll % id obj d - exec % execute the default deamon - }ifelse - PutObject -} bind def - -/IsRegistered % <id> GetRegistered <bool> -{ - GetObject { - null ne - } { - false - }ifelse -} bind def - -/GetRegistered % <id> GetRegistered <obj> -{ - dup GetObject not { - exch mark exch (Object ) exch ( isn't defined before needed (1).) //error exec - } if - % id obj - dup xcheck { - exch mark exch (Object ) exch ( isn't defined before needed (2).) //error exec - } { - dup null eq { - exch mark exch (Object ) exch ( isn't defined before needed (3).) //error exec - } if - exch pop % e - } ifelse -} bind def - -/StandardFontNames << - /Times-Roman true - /Helvetica true - /Courier true - /Symbol true - /Times-Bold true - /Helvetica-Bold true - /Courier-Bold true - /ZapfDingbats true - /Times-Italic true - /Helvetica-Oblique true - /Courier-Oblique true - /Times-BoldItalic true - /Helvetica-BoldOblique true - /Courier-BoldOblique true ->> def - -/CleanAllResources % - CleanAllResources - -{ //PDFR_DEBUG { - (CleanAllResources beg) = - } if - //PDFReader /ObjectRegistry get { - dup length 0 exch 1 exch 1 sub { % R i - 2 copy get dup xcheck { - % Don't clean a daemon. - pop pop - } { - dup null eq { - pop pop - } { - dup type /dicttype eq { /.Global known } { pop false } ifelse { - pop - } { - //PDFR_DEBUG { - (Dropping ) print dup = - } if - 1 index exch /DroppedObject put - } ifelse - } ifelse - } ifelse - } for - pop - }forall % Check each dictionary in the ObjectRegistry - FontDirectory length dict begin - FontDirectory { - pop - dup //StandardFontNames exch known not { - dup null def - } if - pop - } forall - currentdict - end { - pop - //PDFR_DEBUG { - (Undefining font ) print dup = - } if - undefinefont - } forall - //PDFR_DEBUG { - (CleanAllResources end) = - } if -} bind def - -/PrintReference % <array> PrintReference <array> -{ - //PDFR_DEBUG { - ({ ) print - dup { - =only ( ) print - } forall - ( }) = - } if -} bind def - -/R % <id> <gen> R <daemon> -{ % Make a reference daemon. - 0 ne { - exch mark exch (A referred object generation ) exch ( isn't 0.) //error exec - } if % id - [ % <id> proc <obj> - exch //GetRegistered /exec load - ] cvx - //PrintReference exec -} bind def - -/IsObjRef % <any> IsObjRef <bool> -{ - dup type /arraytype eq { - dup length 3 eq { - dup xcheck exch - dup 0 get type /integertype eq 3 2 roll and exch - dup 1 get //GetRegistered eq 3 2 roll and exch - 2 get /exec load eq and - } { - pop false - } ifelse - } { - pop false - } ifelse -} bind def - -/DoNothing -{ -} def - -/RunTypeDaemon % <id> <obj> RunTypeDaemon <id> <obj> -{ - dup type /dicttype eq { - dup /Type //knownget exec { - //PDFReader /TypeDaemons get exch - //knownget exec { - exec - } if - } if - } if -} bind def - -/obj % <id> <generation> obj <id> -{ - //PDFR_DEBUG { - (Defining ) print 1 index =only ( ) print dup =only ( obj) = - } if - 0 ne { - exch mark exch (An object generation ) exch ( isn't 0.) //error exec - } if -} bind def - -/endobj % <id> <obj> endobj - -{ - //PDFR_DEBUG { - (endobj ) = - } if - dup type /dicttype eq { - dup /.endobj_daemon //knownget exec { - //PDFR_DEBUG { (.endobj_daemon for ) print 2 index = } if - exec - } if - } if - dup type /dicttype eq { dup /ImmediateExec known } { false } ifelse { - pop pop - } { - //PDFR_DEBUG { - (Storing ) print 1 index = - } if - //RunTypeDaemon exec - //DoNothing 3 1 roll //Register exec - } ifelse -} bind def - -/StoreBlock % <buf> StoreBlock - -{ % Stores a (encoded) stream data block to the current object. - //PDFR_DEBUG { - (StoreBlock ) print //PDFReader /BlockCount get =only (, Length = ) print dup length = - } if - dup length string copy - //PDFReader /BlockCount get exch % i s - //PDFReader /CurrentObject get 3 1 roll % o i s - put % - //PDFReader /BlockCount get 1 add - //PDFReader exch /BlockCount exch put -} bind def - -/CheckLength % <val> CheckNumber <val> -{ dup type /integertype ne { - mark (Object length isn't an integer.) //error exec - } if -} bind def - -/ResolveD % <dict> <key> <check> ResolveD <value> -{ - 3 copy pop get % <> key {} e - dup //IsObjRef exec { - % We've got a reference daemon, execute it : - //PDFR_DEBUG { - (Resolving ) print //PrintReference exec - } if - exec % <> key {} val - exch exec % <> key val - } { - exch pop - } ifelse - dup 4 1 roll % val <> key val - put % val -} bind def - -/ResolveA % <array> <index> <check> ResolveA <value> -{ 2 index 2 index get - dup //IsObjRef exec { - exec - exch exec - 3 copy put - } { - exch pop - } ifelse - exch pop exch pop -} bind def - -/StoreStream % <id> <obj> StoreStream <id> <obj> -{ % Stores a (encoded) data stream copy to the current object. - dup //PDFReader exch /CurrentObject exch put % id obj - //PDFReader /BlockCount 0 put - dup /Length //CheckLength //ResolveD exec % id obj l - //PDFR_DEBUG { - (StoreStream Length = ) print dup = - } if - currentfile exch () /SubFileDecode filter % id obj file - { dup //BlockBuffer readstring { % id obj file buf - //StoreBlock exec - } { - //StoreBlock exec - exit - } ifelse % id obj file - } loop - pop % id obj - //PDFReader /CurrentObject null put - //PDFR_DEBUG { - (StoreStream end.) = - } if -} bind def - -/MakeStreamDumper % <file> MakeStreamDumper <file> -{ % Debug purpose only. - //PDFR_DEBUG { - (MakeStreamDumper beg.) = - } if - currentglobal exch dup gcheck setglobal - [ exch % f - 1 dict dup /c 0 put exch % d f - 1024 string % d f s - { readstring pop % d s - (StreamDumper ) print 1 index /c get =string cvs print ( ) print - dup length =string cvs print ( <) print dup print (>\n) print - dup length % d s l - 3 2 roll % s l d - dup /c get % s l d c - 3 2 roll % s d c l - add /c exch put % s - } /exec load - ] - cvx 0 () /SubFileDecode filter - exch setglobal - //PDFR_DEBUG { - (MakeStreamDumper end.) = - } if -} bind def - -/ShortFilterNames 15 dict begin - /AHx /ASCIIHexDecode def - /A85 /ASCII85Decode def - /LZW /LZWDecode def - /Fl /FlateDecode def - /RL /RunLengthDecode def - /CCF /CCITTFaxDecode def - /DCT /DCTDecode def -currentdict end readonly def - -/AppendFilters % <file> <dict> AppendFilters <file> -{ - //PDFR_DEBUG { - (AppendFilters beg.) = - } if - dup 3 1 roll % d f d - /Filter //knownget exec { % d f F - dup type /nametype eq { % d f /F - dup //ShortFilterNames exch //knownget exec { - exch pop - } if - 2 index /DecodeParms //knownget exec { % d f p /F - exch - } if - filter % d f' - } { % d f [] - dup 0 exch 1 exch length 1 sub { % d f [] i - 2 copy get % d f [] i /F - dup //ShortFilterNames exch //knownget exec { - exch pop - } if - 3 1 roll % d f /F [] i - 4 index /DecodeParms //knownget exec { % d f /F [] i DP - exch get % d f /F [] dp - } { % d f /F [] i - pop null % d f /F [] dp - } ifelse - dup null eq { % d f /F [] dp - pop 3 1 roll filter exch % d f' [] - } { % d f /F [] dp - 3 1 roll % d f dp /F [] - 4 1 roll filter exch % d f' [] - } ifelse - } for - pop % d f' - } ifelse - //PDFR_DEBUG //PDFR_DUMP and { - //MakeStreamDumper exec - } if - } if - exch pop - //PDFR_DEBUG { - (AppendFilters end.) = - } if -} bind def - -/ExecuteStream % <id> <obj> ExecuteStream <id> <obj> -{ % Executes a (encoded) data stream. - dup //PDFReader exch /CurrentObject exch put % id obj - dup /Length //CheckLength //ResolveD exec % id obj l - //PDFR_DEBUG { - (ExecuteStream id = ) print 2 index =only ( Length = ) print dup = - } if - //PDFReader /InitialGraphicState get - //PDFReader /GraphicState get copy pop - //PDFReader /Operators get begin - % currentfile exch () /SubFileDecode filter % id obj file - % We would like to use the code above, - % but HP LaserJet 1320 continues parsing after the byte count exceeds. - pop currentfile 0 (endstream) /SubFileDecode filter % id obj file - 1 index //AppendFilters exec - cvx mark exch % id obj mark file - exec - counttomark 0 ne { - mark (Data left on ostack after an immediate stream execution.) //error exec - } if - cleartomark % id obj - end % Operators - //PDFR_DEBUG { - (ExecuteStream end.) = - } if - //PDFReader /CurrentObject null put - dup /IsPage known { - dup /Context get /NumCopies //knownget exec { - 1 sub { - copypage - } repeat - } if - EPS2Write not {showpage} if - } if -} bind def - -/stream % <id> <obj> stream <id> <obj> -{ - //PDFR_DEBUG { - 1 index =only ( stream) = - } if % id obj - % Run the object definition daemon, if exists : - 1 index GetObject { - % id obj e - dup xcheck { - exec - % Disable the daemon : - 1 index null PutObject - } { - pop - } ifelse - }if - dup /ImmediateExec known { - dup /GlobalExec //knownget exec { - currentglobal 4 1 roll - setglobal - //ExecuteStream exec - 3 2 roll setglobal - } { - //ExecuteStream exec - } ifelse - } { - //StoreStream exec - } ifelse - dup /.CleanResources //knownget exec { - /All eq { - //CleanAllResources exec - } if - } if -} bind def - -/HookFont % <id> <obj> <font_descriptor> HookFont <id> <obj> -{ - //PDFR_DEBUG { - (Loaded the font ) print dup /FontName get = - } if - { - dup /FontFileType get dup /Type1 eq exch /MMType1 eq or { % id obj fd - % We assume that the Type 1 font has same name with no prefix - % due to pdfwrite specifics. - % We use it to find the font after it is defined. - % We could redefine 'definefont' for hooking the font, - % but we don't think that it could be guaranteedly portable : - % a 3d party PS interpreter may set a special context - % when running the font file. - % Note that this mechanizm does not depend on the - % font name uniquity, because the last 'definefont' - % is only important. - dup /FontName get % id obj fd fn - //PDFReader /RemoveFontNamePrefix get exec - findfont % id obj fd g f - exit - } if - dup /FontFileType get /TrueType eq { % id obj fd - //PDFReader /MakeType42 get exec - //PDFR_DEBUG { - (Font dict <<) = - dup { - 1 index /sfnts eq { - exch pop - (/sfnts [) print - { - (-string\() print length //=only exec (\)- ) = - } forall - (]) = - } { - exch //=only exec ( ) print == - } ifelse - } forall - (>>) = - } if - dup /FontName get exch definefont - exit - } if - mark (FontHook has no proc for ) 2 index /FontFileType get //error exec - } loop - /Font exch put % id obj -} bind def - -/endstream % <id> <obj> endstream <id> <obj> -{ -} bind def - -/xref % - xref - -{ - //PDFR_DEBUG { - (xref) = - //PDFR_DUMP { - //PDFReader /ObjectRegistry get == - } if - } if - end % The procset - count 0 ne { - mark (Excessive data on estack at the end of the interpretation.) //error exec - } if - currentfile 1 (%%EOF) /SubFileDecode filter - flushfile - cleardictstack -} bind def - -% ===================== Restoring the PDF Document Structure =============== - -/ResolveDict % <dict> /ResolveDict - -{ dup { % d key val - pop 1 index exch % d cp key - //DoNothing //ResolveD exec % d obj - pop % d - } forall - pop % -} bind def - -/SetupPageView % <obj> SetupPageView - -{ - //PDFR_DEBUG { - (SetupPageView beg) = - } if -//DSC_OPDFREAD not { - //GraphicState /InitialMatrix get setmatrix -} if - /MediaBox get aload pop % bx0 by0 bx1 by1 - 3 index neg 3 index neg translate % Temporary move to origin - 3 -1 roll sub 3 1 roll exch sub exch % bw bh - userdict /.HWMargins //knownget exec { - aload pop - } { - currentpagedevice /.HWMargins //knownget exec { - aload pop - } { - 0 0 0 0 - } ifelse - } ifelse - currentpagedevice /PageSize get aload pop - 3 -1 roll sub 3 1 roll exch sub exch % bw bh px0 py0 px1 py1 - exch 3 index sub exch 3 index sub % bw bh px0 py0 pw ph - //SetPageSize { - //PDFR_DEBUG { - (Setting page size to ) print 1 index //=only exec ( ) print dup = - } if - pop pop 3 index 3 index 2 copy % bw bh px0 py0 bw bh bw bh - currentglobal false setglobal 3 1 roll % bw bh px0 py0 bw bh bool bw bh - currentpagedevice dup /PageSize known { - /PageSize get aload pop % Get current page size - } { - 0 0 % dummy page size values if not known - }ifelse - % bw bh px0 py0 bw bh bool bw bh Width Height - round cvi 2 index round cvi eq % bw bh px0 py0 bw bh bool bw bh Width bool - exch round cvi 3 index round cvi eq and % bw bh px0 py0 bw bh bool bw bh bool - { % Page Size unchanged, do not emit setpagedevice - pop pop % bw bh px0 py0 bw bh bool - } { - /MediaRequested where { - % bw bh px0 py0 bw bh - /MediaRequested get aload pop % bw bh px0 py0 bw bh Width Height - round cvi 2 index round cvi eq % bw bh px0 py0 bw bh bool bw bh Width bool - exch round cvi 3 index round cvi eq and % bw bh px0 py0 bw bh bool bw bh bool - {pop pop false} % We already requested this media size, so don't re-request - {true} ifelse % Media request different to last request - } { - true % No stored media request, so apply setpagedevice - } ifelse - { - 2 array astore % bw bh px0 py0 bw bh bool [] - dup /MediaRequested exch def - << exch /PageSize exch >> setpagedevice % bw bh px0 py0 bw bh bool - /pagesave save def - } if - } ifelse - userdict /PDFR_InitialGS gstate put - setglobal % bw bh px0 py0 bw bh - } if - //RotatePages { - 2 copy gt 6 index 6 index gt ne { - % a rotation is useful except it fits with no rotation. - 1 index 5 index le 1 index 5 index le and not - } { - false - } ifelse - } { - false - } ifelse - { //CenterPages { - //PDFR_DEBUG { - (Rotating page, and then centering it) == - } if - 90 rotate - 0 5 index neg translate - 5 index 1 index exch sub 2 div - 2 index 6 index sub 2 div neg % bw bh px0 py0 pw ph lm bm - translate - } { - //FitPages { - 1 index 5 index div 1 index 7 index div % bw bh px0 py0 pw ph sx sy - 2 copy gt { - exch - } if - pop dup scale % bw bh px0 py0 pw ph - } if - 90 rotate - 0 5 index neg translate - } ifelse - } { - //CenterPages { - //PDFR_DEBUG { - (Ccentering page) == - } if - 1 index 6 index sub 2 div - 1 index 6 index sub 2 div % bw bh px0 py0 pw ph lm bm - translate - } { - //FitPages { - 1 index 6 index div 1 index 6 index div % bw bh px0 py0 pw ph sx sy - 2 copy gt { - exch - } if - pop dup scale % bw bh px0 py0 pw ph - } if - } ifelse - } ifelse - pop pop % bw bh px0 py0 - translate % bw bh - pop pop % - //PDFR_DEBUG { - (SetupPageView end) = - } if -} bind def - -/PageContentsDaemon % <id> <obj> <node> PageContentsDaemon <id> <obj> -{ % Note: an excessive operand from a prebond procedure. - //PDFR_DEBUG { - (Executing PageContentsDaemon for ) print 2 index = - } if % id obj node - 1 index exch /Context exch put % id obj - dup /ImmediateExec true put - dup /IsPage true put - SetPageSize {dup /Context get //SetupPageView exec} if -} bind def - -/FontFileDaemon % <id> <obj> <font_descriptor> FontFileDaemon <id> <obj> -{ % Note: an excessive operand from a prebond procedure. - //PDFR_DEBUG { - (Executing FontFileDaemon for ) print 2 index = - } if - % We need any font resource that refers this descriptor - % to know the font type. Assuming that FontDescriptorDaemon - % provided FontFileType. - dup /FontFileType get % id obj fd ft - 2 index exch % id obj fd obj ft - dup //ReadFontProcs exch //knownget exec { % id obj fd obj ft proc - exch pop exec % id obj fd - } { - mark (FontFile reader for ) 2 index ( isn't implemented yet.) //error exec - } ifelse - //PDFR_DEBUG { - (FontFileDaemon end) = - } if % id obj fd - pop -} bind def - -/FontDescriptorDaemon % <id> <obj> <font_resource> FontDescriptorDaemon <id> <obj> -{ % Note: an excessive operand from a prebond procedure. - //PDFR_DEBUG { - (Executing FontDescriptorDaemon for ) print 2 index = - } if % id obj fr - %HACK BEG assuming an own font for each font descriptor - % to provide an access to PDFEncoding - % from MakeType42, ComposeCharStrings. - 2 copy /FontResource exch put - %HACK END - /Subtype get 1 index exch /FontFileType exch put -} bind def - -/UnPDFEscape { % <namepdf> UnPDFEscape <nameps> - dup dup length string cvs % /namepdf (name) - dup (#) search { - % name contains PDF-style escapes ("#hh") that need to be removed - { % ... (po..st) (#) (pre) - pop % ... (po..st) (#) - (16#--) 2 index 0 2 getinterval % ... (po..st) (#) (16#--) (po) - 1 index 3 2 getinterval copy pop % ... (po..st) (#) (16#po) - cvi % ... (po..st) (#) 16#po - 0 exch put % ... (po..st); 16#po patched into (#) - 0 % ... (po..st) 0 - 1 index 2 1 index length 2 sub getinterval % ... (po..st) 0 (..st) - 3 copy putinterval % ... (..stst) 0 (XXst) - length % ... (..stst) 0 LEN_OF_(po..st)-2 - 3 copy exch put % ... (..st\0t) 0 LEN_OF_(po..st)-2 - getinterval % ... (..st), stored at begining of old (po..st) - (#) search not { - pop exit % /namepdf (nameps\0..) - } if - } loop - % we have a '\0' marker (not allowed in PDF names) after all usefull characters - (\0) search pop exch pop exch pop - cvn - exch pop - } { - pop pop - } ifelse -} bind def - -/TypeDaemons << % <id> <obj> proc <id> <obj> - /Page - { //PDFR_DEBUG { - (Recognized a page.) = - } if - dup /Contents //knownget exec { % id obj c - 0 get //DoNothing exch % id obj dn id1 - [ % <id> <obj> proc <id> <obj> - 3 index //PageContentsDaemon /exec load - ] cvx % id obj {} - //Register exec % id obj - } { - (fixme: page with no Contents won't be printed.) = - } ifelse - } bind - /FontDescriptor - { //PDFR_DEBUG { - (Recognized a font descriptor.) = - } if - dup /FontName //knownget exec { - 1 index /FontName 3 -1 roll //UnPDFEscape exec put - } if - dup dup /FontFile known {/FontFile} {/FontFile2} ifelse - //knownget exec { % id obj ff - 0 get //DoNothing exch % id obj dn id1 - [ % <id> <obj> proc <id> <obj> - 3 index //FontFileDaemon /exec load - ] cvx % id obj {} - //Register exec % id obj - } { - % FontFile3 are not implemented yet. - (Font descriptor ) print 1 index =only ( has no FontFile.) = - } ifelse - } bind - /Font - { //PDFR_DEBUG { - (Recognized a font resource.) = - } if - dup /BaseFont //knownget exec { - //UnPDFEscape exec 2 copy /BaseFont exch put - % cache the installed font (if any) before replacing it. - //PDFReader /RemoveFontNamePrefix get exec - currentglobal exch % A hack against HP LaserJet 1320 bug : - % It sets the local allocation mode - % when 'resourcestatus' fails. - dup /Font resourcestatus { - pop pop - //PDFReader /GetInstalledFont get exec pop - } { - pop - } ifelse - setglobal - } if - dup /FontDescriptor //knownget exec { % id obj fd - 0 get % id obj id1 - dup //IsRegistered exec { % id obj id1 - //PDFR_DEBUG { - (already registered ) print dup = - } if - pop - } { - //DoNothing exch % id obj dn id1 - [ % <id> <obj> proc <id> <obj> - 3 index //FontDescriptorDaemon /exec load - ] cvx % id obj {} - //Register exec % id obj - } ifelse - } if - } bind ->> def - -/MakeStreamReader % <obj> MakeStreamReader <file> -{ dup - [ - exch - //PDFR_DEBUG { - (Stream proc ) - /print load - //PDFR_STREAM { - (<) - /print load - } if - } if - 1 dict dup /i -1 put - /dup load - /i - /get load - 1 - /add load - /dup load - 3 - 1 - /roll load - /i - /exch load - /put load - //knownget - /exec load - /not load - { () } - /if load - //PDFR_DEBUG { - //PDFR_STREAM { - /dup load - /print load - (>) - /print load - } if - ( end of stream proc.\n) - /print load - } if - ] cvx - //PDFR_DEBUG { - (Stream reader ) print dup == - } if - 0 () /SubFileDecode filter - exch //AppendFilters exec -} bind def - -/RunDelayedStream % <stream_obj> RunDelayedStream - -{ - % Save InitialTextMatrix, as this is local to each content stream - //GraphicState /InitialTextMatrix get - //InitialTextMatrixStack //PDFReader /InitialTextMatrixStackPointer get - 2 copy get null eq { - 2 copy currentglobal true setglobal matrix exch setglobal put - } if - get copy pop - //PDFReader /InitialTextMatrixStackPointer 2 copy get 1 add put - % Execute the stream - //MakeStreamReader exec % file - mark exch - cvx exec % - counttomark 0 ne { - mark (Data left on ostack after a delayed stream execution.) //error exec - } if - cleartomark - % Restore InitialTextMatrix - //PDFReader /InitialTextMatrixStackPointer 2 copy get 1 sub put - //InitialTextMatrixStack //PDFReader /InitialTextMatrixStackPointer get get - //GraphicState /InitialTextMatrix get - copy pop -} bind def - -% ===================== Font Management ====================== - -//ReadFontProcs begin - /Type1 % <font_descriptor> <FontFile_object> Type1 <font_descriptor> - { //PDFR_DEBUG { - (ReadFontProcs.Type1) = - } if - dup /.endobj_daemon [ 4 index //HookFont /exec load ] cvx put - dup /ImmediateExec true put - /GlobalExec true put - } bind def - /MMType1 //Type1 def - /TrueType % <font_descriptor> <FontFile_object> TrueType <font_descriptor> - { //PDFR_DEBUG { - (ReadFontProcs.TrueType) = - } if - dup /.endobj_daemon [ 4 index //HookFont /exec load ] cvx put - pop - } bind def -end - -% A working dictionary to hold items related to reading a TrueType font -% and converting into a type 42 font, especially regarding creating the sfnts -% array of strings, and ensuring strings are split on table boundaries and -% for the glyf table, on glyph boundaries. -% -/.opdloadttfontdict 50 dict def -.opdloadttfontdict begin - -/maxstring 65400 def % less than the maximum length of a PostScript string, - % must be a multiple of 4 (for hmtx / loca / vmtx) -end - -% Uses an insertion sort to sort the contents of an array, -% the sorted array is returned. Takes the array to sort and a -% comparison procedure. The comparison procedure must take two -% arguments, and return a boolean. The return value should be -% false if arguments incorrectly ordered, true if they are -% already in the correct order. -% -% [Array to sort] {comparisaon proc} InsertionSort [Sorted array] -% -/.InsertionSort -{ - /CompareProc exch def - /Array exch def - 1 1 Array length 1 sub - { - /Ix exch def - /Value1 Array Ix get def - - /Jx Ix 1 sub def - { - Jx 0 lt { - exit - } if - /Value2 Array Jx get def - Value1 Value2 CompareProc { - exit - } if - - Array Jx 1 add Value2 put - /Jx Jx 1 sub def - } loop - Array Jx 1 add Value1 put - } for - Array -} bind def - -% -% Utility rourtines to insert a TrueType data type -% -% <string> <index> <integer> putu16 - -/putu16 { - 3 copy -8 bitshift put - exch 1 add exch 16#ff and put -} bind def -% <string> <index> <integer> putu32 - -/putu32 { - 3 copy -16 bitshift putu16 - exch 2 add exch 16#ffff and putu16 -} bind def - -% -% Utility routines to read TrueType table data, returning -% either a string or an array of strings depending on the -% table length. -% - -% Read a table as a single string. -% <file> <length> .readtable <string> -/.readtable { - dup dup 1 and add string - % Stack: f len str - dup 0 4 -1 roll getinterval - % Stack: f str str1 - % Because of the absurd PostScript specification that gives an - % error for reading into an empty string, we have to check for - % this explicitly here. - 3 -1 roll exch - dup () ne { readstring } if pop pop -} bind def - -% Read a big table (one that may exceed 64K). -% <file> <length> .readbigtable <string[s]> -/.readbigtable { - dup maxstring lt { - .readtable - } { - currentuserparams /VMReclaim get -2 vmreclaim - [ 4 2 roll { - % Stack: mark ... f left - dup maxstring le { exit } if - 1 index maxstring string readstring pop 3 1 roll maxstring sub - } loop .readtable ] - exch vmreclaim - } ifelse -} bind def - -% ReadTTF reads the tables and so on from a TreuType font into memory -% so that they are available for later processing. -% -% <filename> ReadTTF - -% -/ReadTTF -{ - .opdloadttfontdict begin - /TTFontFile exch def - - % Table directory: - % version - fixed (4 bytes) - % numTables - USHORT (2 bytes) - % searchRange - USHORT (2 bytes) - % entrySelector - USHORT (2 bytes) - % Read Table - /TableDir TTFontFile 12 string readstring pop def - - % There are numTables table directory entries: - % tag - ULONG (4 bytes) - % checkSum - ULONG (4 bytes) - % offset - ULONG (4 bytes) - % length - ULONG (4 bytes) - % Read entries - /tables TTFontFile TableDir 4 getu16 16 mul string readstring pop def - - % Create dictionary to store directory entries. - /tabarray tables length 16 idiv array def - - % Check version for TrueType collection - TableDir 0 4 getinterval (ttcf) eq { - QUIET not { (Can't handle TrueType font Collections.) = } if - /.loadttfonttables cvx /invalidfont signalerror - } { - % There are ((length of tables string) / 16) Table directory entries - % Get and store each in turn - 0 16 tables length 1 sub { - % Get each directory entry as a 16-byte string - dup % index index - tables exch 16 getinterval % index (string) - exch 16 div cvi exch % index/16 (string) - tabarray 3 1 roll put - } for - } ifelse - - % We need the tables in the order they occur in the file, so sort - % by 'offset'. - tabarray { exch 8 getu32 exch 8 getu32 gt} .InsertionSort pop - - % Now we read the content of each table in turn. If the table is < 64K - % then we store it in a single string. If its more, we store it in an - % array of strings. The table contents are stored in 'tabs' in the same - % order as they are read from the file, as per the sorted array 'tabarray'. - /Read TableDir length tables length add def - /tabs [ - tabarray { - % Get offset (from start of file) of next table - dup 8 getu32 % () offset - % Subtract amount read so far - Read sub % () offset-Read - dup 0 gt { - % Read and discard any extra padding bytes % () offset-Read - dup string TTFontFile exch readstring pop pop % () offset-Read - % Update bytes read - Read add /Read exch def % () - } { - pop % () - } ifelse - % Find length of this table and add it to bytes read - 12 getu32 % () tablelength - dup Read add % () tablelength tablelength+Read - /Read exch def % () tablelength - TTFontFile exch .readbigtable - } forall - ] def - end % .opdloadttfontdict -} bind def - -% GetLocaType finds the head table in tabarray, which gives -% an index into the 'tabs' array where the data is stored. -% From that data we extract the loca type (short or long). -% -% - GetLocaType - -% -/GetLocaType -{ - 0 1 tabarray length 1 sub{ - % control-variable - dup tabarray exch get % control-variable () - 0 4 getinterval (head) eq{ % control-variable bool - tabs exch get % () - 50 gets16 - /LocaType exch def - exit - } { - pop % control variable % - - } ifelse - } for -} bind def - -% GetNumGlyphs finds the maxp table in tabarray, which gives -% an index into the 'tabs' array where the data is stored. -% From that data we extract the number of glyphs in the font. -% -% - GetNumGlyphs - -% -/GetNumGlyphs -{ - 0 1 tabarray length 1 sub{ - % control-variable - dup tabarray exch get % control-variable () - 0 4 getinterval (maxp) eq{ % control-variable bool - % Get the maxp string - % from the tabs array - tabs exch get % () - 4 getu16 % int - /NumGlyphs exch def - exit % int - } { - pop % control variable % - - } ifelse - } for -} bind def - -% StringtoLoca takes a string, and an index in to an array -% where the loca results should be stored from. It reads -% along the string getting either 2-byte or 4-byte values -% (depends on loca type) and stores them in the array at -% successive locations. Leaves the next unused location -% on the stack at end (easy to process multiple strings). -% -% string ArrayIndex StringToLoca ArrayIndex -% -/StringToLoca -{ - /LocaIndex exch def % () - /StringOffset 0 def % () - { - dup length StringOffset gt { % () - dup % () - LocaType 1 eq{ - StringOffset getu32 % () loca - LocaArray LocaIndex 3 -1 roll put % () - /LocaIndex LocaIndex 1 add def % () - /StringOffset StringOffset 4 add % () - def - } { - StringOffset getu16 2 mul % () loca - LocaArray length LocaIndex gt { % take account of apdding in the string - LocaArray LocaIndex 3 -1 roll put % () - }{ % - pop % ignore indices off the end of the array - }ifelse % - /LocaIndex LocaIndex 1 add def % () - /StringOffset StringOffset 2 add % () - def - } ifelse - }{ % () - pop % - - LocaIndex % return index - exit - }ifelse - } loop -} bind def - -% GetSortedLoca reads the loca table, and sorts it by offset -% this is so that we can walk up the array looking for an approporiate -% place to split strings. The result is stored in LocArray -% -% - GetSortedLoca - -% -/GetSortedLoca -{ - NumGlyphs 1 add array /LocaArray exch def - - % Get the loca table - 0 1 tabarray length 1 sub{ - % control-variable - dup tabarray exch get % control-variable () - 0 4 getinterval (loca) eq{ % control-variable bool - % Get the loca string - % from the tabs array - tabs exch get % () - exit - } { - pop % control variable % - - } ifelse - } for - - % If its a single string handle the easy way - dup type /stringtype eq { - 0 StringToLoca pop - }{ - % Otherwise its an array, process each string in the array - 0 exch % Starting LocaArray index - { - exch StringToLoca - }forall - pop % final LocaArray index - }ifelse - - % Now we've read all the locations, sort them so - % we can figure out where to break the strings - LocaArray {gt} .InsertionSort pop -} bind def - -% Updates internal storage with a new string from the -% GlyfArray -% - GetWorkingString - -/GetWorkingString -{ - WorkString 0 - GlyfArray GlyfStringIndex get - putinterval - % Update the available bytes - /WorkBytes GlyfArray GlyfStringIndex get length def - % Set index to get data from next string in array - /GlyfStringIndex GlyfStringIndex 1 add def -} bind def - -% Returns a string with the requested number of bytes taken -% from WorkingString. There must be enough data in WorkingString to -% satisfy the request -% -/GetWorkingBytes -{ - /BytesToRead exch def - % Get 'BytesToRead' bytes from working store - WorkString 0 BytesToRead getinterval - dup length string copy - % Get remaining bytes from working store - WorkString BytesToRead WorkBytes BytesToRead sub getinterval - dup length string copy - % replace first 'n' bytes of working store with unread bytes - WorkString 0 3 -1 roll putinterval - % Subtract bytes read from bytes available - /WorkBytes WorkBytes BytesToRead sub def -} bind def - -% Read 'int' bytes from GlyfArray strings, return string composed -% of those bytes -% -% int GetGlyfBytes string -/GetGlyfBytes -{ - /ToRead exch def - - % If we have no available data, get soem from the array of - % glyf strings - WorkBytes 0 eq { - GetWorkingString - } if - - WorkBytes ToRead ge { - ToRead string dup 0 - ToRead GetWorkingBytes putinterval - }{ - % Create a string sized to hold the target data - ToRead string - % Get remaining stored bytes, and put at the start - % of the string - dup - % Start of string - 0 - % Get remaining bytes - WorkString 0 WorkBytes getinterval - % store at start of output string - putinterval - - dup - % Location in output to store data from next string - WorkBytes - % amout of data required to read from next string - ToRead WorkBytes sub - % Get the next string from the array of strings - GetWorkingString - % Get a string containing the required data, updating - % the internal data storage - GetWorkingBytes - % put the data at the end of the stored data in the - % output string - putinterval - } ifelse -} bind def - -% Given an array of glyf strings, returns an array of strings -% split on glyf boundaries -% -% [] SplitGlyf [] -% -/SplitGlyf -{ - /GlyfArray exch def - /DestArray GlyfArray length 2 mul array def - /DestArrayIndex 0 def - - /LastLoca 0 def - /NextLocaIndex 0 def - /LastLocaIndex 0 def - - /GlyfStringIndex 0 def - /WorkString maxstring string def - /WorkBytes 0 def - - % Find appropriate next loca - { - % Get location of next glyph - LocaArray NextLocaIndex get % int - % subtract location of last point to get - % the actual bytes between - LastLoca sub maxstring gt % int bool - { - LocaArray LastLocaIndex get LastLoca sub - GetGlyfBytes % () - DestArray DestArrayIndex 3 -1 roll put % - - /DestArrayIndex DestArrayIndex 1 add def % - - LocaArray LastLocaIndex get /LastLoca exch def % - - } { % int - /LastLocaIndex NextLocaIndex def % - - /NextLocaIndex NextLocaIndex 1 add def % - - NextLocaIndex NumGlyphs gt % bool - { - WorkBytes % int - GlyfStringIndex GlyfArray length lt { % int bool - GlyfArray GlyfStringIndex get length % int - add string dup % (d) (d) - 0 % (d) (d) 0 - WorkString 0 WorkBytes getinterval % (d) (d) (s) - putinterval % (d) - dup % (d) (d) - WorkBytes % (d) (d) int - GetWorkingString % (d) (d) int - WorkString 0 WorkBytes getinterval % (d) (d) int (s) - putinterval % (d) - } { - pop % - - WorkString 0 WorkBytes getinterval % () - } ifelse - dup length string copy - DestArray DestArrayIndex 3 -1 roll put - exit - } if - } ifelse - } loop - DestArray - -} bind def - -% ProcessTTData looks at the data stored in the 'tabs' array and does several things: -% 1) Make sure strings representing tables are multiples of 4 bytes long -% 2) For arrays representing tables, make sure the total string length is a multiple -% of 4 bytes long, to ensure the table is a multiple of 4 bytes. -% 3) Handle the glyf table specislly, each string in this array must be split on the -% boundary of a glyf. Use the loca table to determine where the split should happen -% and build a new array of strings split appropriately. -% -% - ProcessTTData - -% -/ProcessTTData -{ - .opdloadttfontdict begin - % Make sure all the strings are a multiple of 4 bytes - 0 1 tabarray length 1 sub{ - /ix exch def - tabarray ix get - 12 getu32 dup maxstring le { - % String < 64Kb, still need to check if its a multiple of 4 - dup 4 mod 0 ne { - 4 div cvi 1 add 4 mul string /newstring exch def - /oldstring tabs ix get def - newstring 0 oldstring putinterval - 0 1 newstring length oldstring length sub 1 sub { - newstring exch oldstring length add 0 put - } for - tabs ix newstring put - } { - % table size is a multiple of 4, don't need to promote it - pop - } ifelse - }{ - % table size > 64K, so this is an array of strings, not a string - % We still need to make sure that the tables end on 4-byte - % boundaries. - dup 4 mod 0 ne { - % First we need to work out how many strings of size maxstring - % are present, and how much they contribute to the overall size. - dup maxstring idiv maxstring mul sub - % Promote final string length to multiple of 4 - 4 idiv 1 add 4 mul string /newstring exch def - % Get array of strings - tabs ix get - % find size of table and get last string - dup length 1 sub dup /iy exch def get /oldstring exch def - newstring 0 oldstring putinterval - 0 1 newstring length oldstring length sub 1 sub { - newstring exch oldstring length add 0 put - } for - tabs ix get iy newstring put - } { - % table size is a multiple of 4, don't need to promote it - pop - } ifelse - } ifelse - } for - - % Now, if glyf table > 64Kb, then it will be an array of strings - % We need to make sure the strings are split on glyph boundaries - 0 1 tabarray length 1 sub { % int - dup tabarray exch get % int () - dup 12 getu32 maxstring gt { % int () bool - 0 4 getinterval dup (glyf) eq{ % int () bool - % Need to split the glyf strings on glyph boundaries, hmmm. - pop % int - % We need to know the number of glyphs (from the maxp table) and the - % position of each glyph (from the loca table). - GetLocaType % int - GetNumGlyphs % int - GetSortedLoca % int - % Get the array of strings from tabs - dup tabs exch get % int - SplitGlyf % int [] - tabs 3 1 roll put % - - } { % int () - (Warning, table ) print print ( > 64Kb\n) print - pop % - - } ifelse - }{ % int () - % Table less than 64K, so don't worry - pop % directory entry % int - pop % 'for' control variable % - - } ifelse - } for - end % .opdloadttfontdict -} bind def - -% Makesfnts uses the accumulated data to create an array of strings -% containing only the required data. -% -% - Makesfnts array -% -/Makesfnts -{ - .opdloadttfontdict begin - % Determine size of sfnts array - % length of tabarray + header - 0 - tabs { % int obj - dup type /stringtype eq { % int obj bool - pop % int - 1 add % int - }{ % int obj - { % int obj - type /stringtype eq { % int bool - 1 add % int - } if - } forall - } ifelse - } forall - - 1 add % add header and table directory - % to determine total # strings - % Need to recalculate the lengths of the TT - % tables, just in case any have changed. If required we - % could also resort the tables here, ideally we should do so - % and recalculate checksums, but this should never be necessary - % for fonts produced by pdfwrite. - /TTOffset - TableDir length % initial table offset is header length - tabarray length 16 mul add % + (NumTables * 16) bytes - def - - 0 - tabarray { % index () - exch dup 1 add % () index index+1 - 3 1 roll % index+1 () index - dup % index+1 () index index - tabs exch get % index+1 () index ()/[] - dup type /stringtype eq { % index+1 () index ()/[] bool - length % index+1 () index int - 2 index exch % index+1 () index () int - TTOffset - dup 3 1 roll add % add the running total of offsets - /TTOffset exch def % update running total of offsets - 8 exch putu32 % index+1 () index - exch tabarray 3 1 roll % index+1 [] index () - put % index+1 - } { % index+1 () index ()/[] - 0 exch % add all string lengths - { % starting from 0 - dup type /stringtype eq { - length add % - } { - pop - } ifelse - } forall % - 2 index exch % index+1 () index () int - TTOffset - dup 3 1 roll add % add the running total of offsets - /TTOffset exch def % update running total of offsets - 8 exch putu32 % index+1 () index - exch tabarray 3 1 roll % index+1 [] index () - put % index+1 - } ifelse - } forall - pop % index+1 - - array % [] - dup 0 % [] [] 0 - TableDir length - tables length add % [] [] 0 header_length - string % [] [] 0 () - dup 0 TableDir putinterval % [] [] 0 () - dup 12 tables putinterval % [] [] 0 () - put % [] - dup % [] [] - /ix 1 def - tabs { % [] [] obj - dup type /stringtype eq { % [] [] obj bool - ix exch % [] [] int obj - put dup % [] [] - /ix ix 1 add def % [] [] - }{ - { - dup type /stringtype eq { % [] [] obj bool - ix exch put dup % [] [] - /ix ix 1 add def % - } { - pop % [] [] - } ifelse - } forall - } ifelse - } forall - pop % [] - end %.opdloadttfontdict -} bind def - -/MakeType42 % <FontFile_object> <font_descriptor> MakeType42 <FontFile_object> <font_descriptor> <font> -{ - //PDFR_DEBUG { - (MakeType42 beg) = - } if - 10 dict begin - /FontName 1 index /FontName get def - /FontType 42 def - /FontMatrix [1 0 0 1 0 0] def - /FontBBox 1 index /FontBBox get def % fo fd - dup /FontResource get % fo fd fr - dup /Encoding known { % fo fd fr - //PDFReader /ObtainEncoding get exec % fo fd fr - /Encoding get % fo fd e - } { - pop null - } ifelse - /PDFEncoding exch def % fo fd - /CharStrings 2 index //PDFReader /MakeTTCharStrings get exec def - /sfnts 2 index //MakeStreamReader exec - ReadTTF - ProcessTTData - Makesfnts - def - /Encoding StandardEncoding def % A stub - will be replaced by font resource. - /PaintType 0 def - currentdict end - //PDFR_DEBUG { - (MakeType42 end) = - } if -} bind def - -/GetInstalledFont % <name> GetInstalledFont <font> -{ - dup //InstalledFonts exch knownget { % n f - exch pop % f - } { % n - dup findfont dup 3 1 roll % f n f - //InstalledFonts 3 1 roll put % f - } ifelse -} bind def - -/RemoveFontNamePrefix % <name> RemoveFontNamePrefix <name> -{ //=string cvs true - 0 1 5 { - 2 index exch get //IsUpper exec not { - pop false exit - } if - } for - { (+) search { - pop pop - } if - } if - cvn -} bind def - -/CheckFont % <key> <val> CheckFont <key> <val> -{ dup /Type get /Font ne { - mark (Resource ) 3 index ( must have /Type/Font .) //error exec - } if -} bind def - -/CheckEncoding % <key> <val> CheckEncoding <key> <val> -{ dup type /nametype ne { - dup /Type get /Encoding ne { - mark (Resource ) 3 index ( must have /Type/Encoding .) //error exec - } if - } if -} bind def - -/ObtainEncoding % <font_resource> ObtainEncoding <font_resource> -{ dup /Encoding known { - dup dup /Encoding //CheckEncoding //ResolveD exec % fr fr er|e|n - dup type dup /arraytype eq exch /packedarraytype eq or { - % Already resolved. - pop pop - } { - dup type /nametype eq { - /Encoding findresource % fr fr e - } { - dup /BaseEncoding //knownget exec not { - /StandardEncoding - } if - /Encoding findresource % fr fr er e - exch % fr fr e er - /Differences //knownget exec { % fr fr e d - exch dup length array copy exch - 0 exch % fr fr e 0 d - { % fr fr e i v - dup type /integertype eq { - exch pop - } { - 3 copy put pop % fr fr e i - 1 add - } ifelse - } forall - pop % fr fr e - } if % fr fr e - } ifelse % fr fr e - /Encoding exch put % fr - } ifelse - } { - dup /Encoding /StandardEncoding /Encoding findresource put - } ifelse -} bind def - -/ObtainMetrics % <font_resource> ObtainMetrics <font_resource> -{ dup /Widths //knownget exec { % fr W - 1 index /Encoding get % fr W E - 256 dict % fr W E M - 3 index /Subtype get /TrueType eq { - 1000 - } { - 1 - } ifelse % fr W E M s - 4 index /MissingWidth //knownget exec not { - 0 - } if % fr W E M s mw - 5 index /FirstChar //knownget exec not { - 0 - } if % fr W E M s mw c0 - 6 5 roll % fr E M s mw c0 W - dup 0 exch 1 exch length 1 sub { % fr E M s mw c0 W i - 2 copy get % fr E M s mw c0 W i w - exch 3 index add % fr E M s mw c0 W w c - 7 index exch get % fr E M s mw c0 W w n - dup dup null ne exch /.notdef ne and { - 6 index 3 1 roll exch % fr E M s mw c0 W M n w - 6 index div - 3 copy pop //knownget exec { - 0 eq - } { - true - } ifelse - { put % fr E M s mw c0 W - } { - pop pop pop - } ifelse - } { - pop pop - } ifelse - } for - pop pop pop pop exch pop % fr M - 1 index exch /Metrics exch put % fr - } { - dup /MissingWidth //knownget exec { % fr mw - 256 dict % fr mw M - 2 index /Encoding get { % fr mw M e - dup null ne { - 3 copy 3 2 roll put % fr mw M e - } if - pop % fr mw M - } forall - exch pop % fr M - 1 index exch /Metrics exch put % fr - } if - } ifelse -} bind def - -/NotDef % - NotDef - -{ % A Type 3 font is on dstack. - FontMatrix aload pop pop pop exch pop exch pop % sx sy - 1 exch div exch - 1 exch div exch % wx wy - 1 index 0 setcharwidth - 0 setlinewidth - 0 0 moveto - 2 copy rlineto - 1 index 0 rlineto - neg exch neg exch rlineto % - closepath stroke -} bind def - -%% These two routines may have more general application. -%% When executing BuildChar we need to run in the context of the font -%% as far as resources are concerned (in case the glyph uses another font) -%% but since we are executing a page stream, we must not lose the original -%% context, or we won't be able to find page resources. Originally this was -%% a simpler routine, but this failed when presented with a type 3 font -%% whose BuildChar/CharProcs used another type 3 font -/SaveResourcesToStack -{ - [ - //PDFReader /OldResources known { - //PDFReader /OldResources get - }{ - null - } ifelse - //PDFReader /CurrentObject get /Context get /Resources get - ] - //PDFReader /OldResources 3 -1 roll put -}bind def - -/RestoreResourcesFromStack -{ - //PDFReader /OldResources get dup - 0 get //PDFReader /OldResources 3 -1 roll put - 1 get //PDFReader /CurrentObject get /Context get /Resources 3 -1 roll put -} bind def - -/BuildChar % <font> <char_code> BuildChar - -{ //PDFR_DEBUG { - (BuildChar ) print dup //=only exec ( ) print - } if - exch begin - Encoding exch get % n - //PDFR_DEBUG { - dup = - } if - dup null eq { - pop //NotDef exec % - } - { % n - CharProcs exch//knownget exec - { - currentfont /Font get /Resources //knownget exec{ %% Does the Font have any Resources ? - exec %% Get them - SaveResourcesToStack %% Save the current Resources - //PDFReader /CurrentObject get /Context get %% Replace the current resources - /Resources 3 -1 roll put %% With the Font resources - //RunDelayedStream exec - RestoreResourcesFromStack %% Restore the previous Resources - } { - //RunDelayedStream exec - } ifelse - } - { - //NotDef exec - }ifelse - } ifelse % - end % font -} bind def - -/printdict % <dict> printdict - -{ (<<) = - { exch = == } forall - (>>) = -} bind def - -/printfont % <dict> printfont - -{ - dup { - exch dup = - dup /Encoding eq { - pop = - } { - dup /FontInfo eq exch /Private eq or { - //printdict exec - } { - == - } ifelse - } ifelse - } forall -} bind def - -/ScaleMetrics % <Metrics> <scale> ScaleMetrics <Metrics> -{ 1 index { % M s n v - 2 index div % M s n v' - 3 index % M s n v' M - 3 1 roll put % M s - } forall - pop -} bind def - -/ResolveAndSetFontAux % <resource_name> <size> ResolveAndSetFont - -{ exch dup % s rn rn - //PDFReader /CurrentObject get /Context get /Resources get - /Font //DoNothing //ResolveD exec - exch //CheckFont //ResolveD exec % s rn fr - dup /Font //knownget exec { % s rn fr f - exch pop exch pop - } { - { - dup /Subtype get dup dup /Type1 eq exch /TrueType eq or exch /MMType1 eq or { - % s rn fr - exch pop % s fr - dup /BaseFont get % s fr n - //RemoveFontNamePrefix exec % s fr n - //PDFR_DEBUG { - (Font ) print dup = - } if % s fr n - 1 index /FontDescriptor known { % s fr n - //PDFR_DEBUG { - (Font from a font descriptor.) = - } if - 1 index % s fr n fr - /FontDescriptor //DoNothing //ResolveD exec % s fr n fd - /Font //knownget exec { - exch pop % s fr fd - } { - //PDFR_DEBUG { - (Font descriptor has no Font resolved.) = - } if - //GetInstalledFont exec % s fr f - } ifelse - } { - //GetInstalledFont exec % s fr f - } ifelse - exch % s f fr - dup /Encoding known not { - 1 index /Encoding get 1 index exch /Encoding exch put - } if - //ObtainEncoding exec - //ObtainMetrics exec - exch - dup length dict copy % s fr f - dup 2 index /Encoding get % s fr f f e - /Encoding exch put % s fr f - 1 index /Metrics //knownget exec { % s fr f M - 2 index /Subtype get /TrueType ne { - 1 index /FontMatrix get 0 get - dup 0 eq { - % FontMatrix[0] == 0, so cannot downscale by it - % HACK: downscale by FontMatrix[1], and will get the target value of wx as wy - pop - 1 index /FontMatrix get 1 get - dup 0 eq { pop 1 } if % sorry, FontMatrix is singular so cannot enforce the PDF metrics - } if - 0.001 div - //ScaleMetrics exec - }{ - % Check if we got a /sfnts key in the dict - % If we did then we are probably OK (TT font from GS) - 1 index /sfnts known not { - % otherwise we need to check the FontMatrix - 1 index /FontMatrix get 0 get - dup 0 eq { - % FontMatrix[0] == 0, so cannot downscale by it - % HACK: downscale by FontMatrix[1], and will get the target value of wx as wy - pop - 1 index /FontMatrix get 1 get - dup 0 eq { pop 1 } if % sorry, FontMatrix is singular so cannot enforce the PDF metrics - } if - //ScaleMetrics exec - } if - } ifelse - 1 index exch /Metrics exch put % s fr f - } if - 1 index /BaseFont get % s fr f n - exch - dup /FID undef - dup /UniqueID undef - definefont % s fr f - dup 3 1 roll % s f fr f - /Font exch put % s f - exit - } if - dup /Subtype get /Type3 eq { % s rn fr - //ObtainEncoding exec - 2 copy exch /FontName exch put - dup /CharProcs get //ResolveDict exec - dup /FontType 3 put - dup /BuildChar //BuildChar put - dup dup /Font exch put - % Ignore Metrics because pdfwrite duplicates it - % from setcharwidth/setcachedevice. - dup 3 1 roll % s fr rn fr - definefont % s fr f - 2 copy ne { - % The interpreter copied the font dictionary while 'definefont' - % Need to update the font pointer in the resource. - 2 copy /Font exch put % s fr f - } if - exch pop % s f - exit - } if - dup /Subtype get /Type0 eq { % s rn fr - } if - dup /Subtype get /CIDFontType0 eq { % s rn fr - } if - dup /Subtype get /CIDFontType2 eq { % s rn fr - } if - mark (Unknown font type ) 2 index /Subtype get //error exec - } loop - } ifelse % s f - exch scalefont setfont % -} bind def - -/ResolveAndSetFont % <resource_name> <size> ResolveAndSetFont - -{ - //ResolveAndSetFontAux exec -} bind def - -%%beg TrueType -% ================= Auxiliary procedures for True Type cmap Decoder ============= - -/.knownget -{ 2 copy known { - get true - } { - pop pop false - } ifelse -} bind def - -/.min -{ 2 copy lt { - exch - } if - pop -} bind def - -/.max -{ 2 copy gt { - exch - } if - pop -} bind def - -/.dicttomark -{ >> -} bind def - -% ===================== True Type cmap Decoder ============= -% The following procedures are copied from gs/lib/gs_ttf.ps with no change. - -% <string> <index> getu16 <integer> -/getu16 { - 2 copy get 8 bitshift 3 1 roll 1 add get add -} bind def - -% <string> <index> gets16 <integer> -/gets16 { - getu16 16#8000 xor 16#8000 sub -} bind def - -% <string> <index> getu32 <integer> -/getu32 { - 2 copy getu16 16 bitshift 3 1 roll 2 add getu16 add -} bind def - -% <string> <index> gets32 <integer> -/gets32 { - 2 copy gets16 16 bitshift 3 1 roll 2 add getu16 add -} bind def - -% Each procedure in this dictionary is called as follows: -% <encodingtable> proc <glypharray> -/cmapformats mark - 0 { % Apple standard 1-to-1 mapping. - 6 256 getinterval { } forall 256 packedarray - } bind - 2 { % Apple 16bit CJK (ShiftJIS etc) - - % /sHK_sz subHeaderKey_size % 1 * uint16 - % /sH_sz subHeader_size % 4 * uint16 - % /sH_len subHeader_length - % /cmapf2_tblen total table length - % /cmapf2_lang language code (not used) - % /sHKs subHeaderKeys - - /sHK_sz 2 def - /sH_sz 8 def - dup 2 getu16 /cmapf2_tblen exch def - - dup 4 getu16 /cmapf2_lang exch def - - dup 6 256 sHK_sz mul getinterval /sHKs exch def - - 0 % initialization value for /sH_len - 0 1 255 { - sHKs exch - 2 mul getu16 - 1 index % get current max - 1 index % get current subHeaderKey - lt {exch} if pop - } for - /sH_len exch def - - dup 6 256 sHK_sz mul add - cmapf2_tblen 1 index sub getinterval - /sH_gIA exch def - - /cmapf2_glyph_array 65535 array def - - /.cmapf2_putGID { - /cmapf2_ch cmapf2_ch_hi 8 bitshift cmapf2_ch_lo add def - firstCode cmapf2_ch_lo le - cmapf2_ch_lo firstCode entryCount add lt - and { % true: j is inside - sH_offset idRangeOffset add % offset to gI - cmapf2_ch_lo firstCode sub 2 mul % rel. pos. in range - add 6 add % offset in sH_gIA - sH_gIA exch getu16 - dup 0 gt { % - idDelta add - cmapf2_glyph_array exch cmapf2_ch exch put - } { - pop - % cmapf2_glyph_array cmapf2_ch 0 put - } ifelse - } { % false: j is outside - % cmapf2_glyph_array cmapf2_ch 0 put - } ifelse - } def - - 16#00 1 16#ff { % hi_byte scan - /cmapf2_ch_hi exch def - sHKs cmapf2_ch_hi sHK_sz mul getu16 - /sH_offset exch def - sH_gIA sH_offset sH_sz getinterval - dup 0 getu16 /firstCode exch def - dup 2 getu16 /entryCount exch def - dup 4 gets16 /idDelta exch def - dup 6 getu16 /idRangeOffset exch def - pop - sH_offset 0 eq { - /cmapf2_ch_lo cmapf2_ch_hi def - /cmapf2_ch_hi 0 def - .cmapf2_putGID - } { - 16#00 1 16#ff { % lo_byte scan - /cmapf2_ch_lo exch def - .cmapf2_putGID - } for - } ifelse - } for - pop - 0 1 cmapf2_glyph_array length 1 sub { % rewrite null -> 0. - dup cmapf2_glyph_array exch get - null eq { cmapf2_glyph_array exch 0 put } {pop} ifelse - } for - cmapf2_glyph_array - } bind - 4 { % Microsoft/Adobe segmented mapping. - /etab exch def - /nseg2 etab 6 getu16 def - 14 /endc etab 2 index nseg2 getinterval def - % The Apple TrueType documentation omits the 2-byte - % 'reserved pad' that follows the endCount vector! - 2 add - nseg2 add /startc etab 2 index nseg2 getinterval def - nseg2 add /iddelta etab 2 index nseg2 getinterval def - nseg2 add /idroff etab 2 index nseg2 getinterval def - % The following hack allows us to properly handle - % idiosyncratic fonts that start at 0xf000: - pop - /firstcode startc 0 getu16 16#ff00 and dup 16#f000 ne { pop 0 } if def - /striptopbyte false def - /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 0 2 nseg2 3 sub { - % Stack: /glyphs numglyphs i2 - /i2 exch def - /scode startc i2 getu16 def - /ecode endc i2 getu16 def - ecode lastcode gt { - /lastcode ecode def - } if - } for pop - % If the glyph range is within 0x..00 to 0x..FF, make sure that we strip - % off any top bytes. - firstcode 16#f000 ge lastcode firstcode sub 255 le and { - lastcode 255 and - /striptopbyte true def - } { - lastcode - }ifelse - 1 add - array def - % prefill the array with 0's faster than a { 0 putglyph } repeat - glyphs length 1024 ge { - .array1024z 0 1024 glyphs length 1023 sub { glyphs exch 2 index putinterval } for - glyphs dup length 1024 sub 3 -1 roll - putinterval - } { - 0 1 glyphs length 1 sub { glyphs exch 0 put } for - } ifelse - % Now fill in the array. - /numcodes 0 def /code 0 def - 0 2 nseg2 3 sub { - /i2 exch def - /scode startc i2 getu16 def - /ecode endc i2 getu16 def - 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 dup /code exch code exch add def - ecode scode sub 1 add add numcodes add /numcodes exch def - /delta iddelta i2 gets16 def - TTFDEBUG { - (scode=) print scode =only - ( ecode=) print ecode =only - ( delta=) print delta =only - ( droff=) print idroff i2 getu16 = - } if - idroff i2 getu16 dup 0 eq { - pop scode delta add 65535 and 1 ecode delta add 65535 and - striptopbyte { - /code scode 255 and def - } { - /code scode def - } ifelse - { putglyph } for - } { % The +2 is for the 'reserved pad'. - /gloff exch 14 nseg2 3 mul add 2 add i2 add add def - striptopbyte { - /code scode 255 and def - } { - /code scode def - } ifelse - 0 1 ecode scode sub { - 2 mul gloff add etab exch getu16 - dup 0 ne { delta add 65535 and } if putglyph - } for - } ifelse - } for glyphs /glyphs null def % for GC - } bind - 6 { % Single interval lookup. - dup 6 getu16 /firstcode exch def dup 8 getu16 /ng exch def - firstcode ng add array - % Stack: tab array - % Fill elements 0 .. firstcode-1 with 0 - 0 1 firstcode 1 sub { 2 copy 0 put pop } for - dup firstcode ng getinterval - % Stack: tab array subarray - % Fill elements firstcode .. firstcode+nvalue-1 with glyph values - 0 1 ng 1 sub { - dup 2 mul 10 add 4 index exch getu16 3 copy put pop pop - } for pop exch pop - } bind -.dicttomark readonly def % cmapformats - -% <cmaptab> cmaparray <glypharray> -/cmaparray { - dup 0 getu16 cmapformats exch .knownget { - TTFDEBUG { - (cmap: format ) print 1 index 0 getu16 = flush - } if exec - } { - (Can't handle format ) print 0 getu16 = flush - 0 1 255 { } for 256 packedarray - } ifelse - TTFDEBUG { - (cmap: length=) print dup length = dup == - } if -} bind def - -% Define remapping for misnamed glyphs in TrueType 'post' tables. -% There are probably a lot more than this! -/postremap mark - /Cdot /Cdotaccent - /Edot /Edotaccent - /Eoverdot /Edotaccent - /Gdot /Gdotaccent - /Ldot /Ldotaccent - /Zdot /Zdotaccent - /cdot /cdotaccent - /edot /edotaccent - /eoverdot /edotaccent - /gdot /gdotaccent - /ldot /ldotaccent - /zdot /zdotaccent -.dicttomark readonly def - -/get_from_stringarray % <array|string> <offset> get_from_stringarray <int> -{ 1 index type /stringtype eq { - get - } { - exch { % o () - 2 copy length ge { - length sub - } { - exch get exit - } ifelse - } forall - } ifelse -} bind def - -/getinterval_from_stringarray % <array|string> <offset> <length> getinterval_from_stringarray <string> -{ % May allocate a string in VM. - 2 index type /stringtype eq { - getinterval - } { - string exch 0 % [] s o p - 4 3 roll { % s o p Si - dup length % s o p Si lSi - dup 4 index lt { - 3 index exch sub % s o p Si o' - exch pop 3 1 roll exch pop % s o' p - } { % s o p Si lSi - dup 3 1 roll % s o p lSi Si lSi - 4 index sub % s o p lSi Si lSi-o - 5 index length 4 index sub % s o p lSi Si lSi-o ls-p - 2 copy gt { exch } if pop % s o p lSi Si minl - dup 3 1 roll % s o p lSi minl Si minl - 5 index exch getinterval % s o p lSi minl from - 5 index 4 index 3 index % s o p lSi minl from s p minl - getinterval % s o p lSi minl from to - copy pop % s o p lSi minl - exch pop add exch pop 0 exch % s 0 p' - dup 3 index length ge { exit } if - } ifelse - } forall - pop pop % s - } ifelse -} bind def - -/string_array_size % <array|string> string_array_size <int> - { dup type /stringtype eq { - length - } { - 0 exch { length add } forall - } ifelse -} bind def - -% Each procedure in this dictionary is called as follows: -% posttable <<proc>> glyphencoding -/postformats mark - 16#00010000 { % 258 standard Macintosh glyphs. - pop MacGlyphEncoding - } - 16#00020000 { % Detailed map, required by Microsoft fonts. - dup dup type /arraytype eq { 0 get } if length 36 lt { - TTFDEBUG { (post format 2.0 invalid.) = flush } if - pop [ ] - } { - /postglyphs exch def - /post_first postglyphs dup type /arraytype eq { 0 get } if def - post_first 32 getu16 /numglyphs exch def - /glyphnames numglyphs 2 mul 34 add def - % Build names array in the order they occur in the 'post' table - /postpos glyphnames def - /total_length postglyphs //string_array_size exec def - numglyphs array 0 1 numglyphs 1 sub { - postpos total_length ge { - % Fill the rest with .notdef - 1 numglyphs 1 sub { 1 index exch /.notdef put } for - exit - } if - % No name available, /postnames will be defined as an empty - % array and the glyph won't get a name attached. - postglyphs postpos //get_from_stringarray exec - postglyphs postpos 1 add 2 index //getinterval_from_stringarray exec cvn - exch postpos add 1 add /postpos exch def - 2 index 3 1 roll - put - } for - /postnames exch def - numglyphs array 0 1 numglyphs 1 sub { - dup 2 mul 34 add postglyphs exch 2 //getinterval_from_stringarray exec - dup 0 get 8 bitshift exch 1 get add dup 258 lt { - MacGlyphEncoding exch get - } { - dup 32768 ge { - % According to the published TrueType spec, such values are - % "reserved for future use", but at least some PDF files - % produced by the Adobe PDF library contain entries with a - % value of 16#ffff. - pop /.notdef - } { - % Get the name for this glyph - 258 sub dup postnames length ge { - TTFDEBUG { ( *** warning: glyph index past end of 'post' table) = flush } if - pop - exit - } if - postnames exch get - % At least some of Microsoft's TrueType fonts use incorrect - % (Adobe-incompatible) names for some glyphs. - % Correct for this here. - postremap 1 index .knownget { exch pop } if - } ifelse - } ifelse - 2 index 3 1 roll put - } for - - } - ifelse - } bind - 16#00030000 { % No map. - pop [ ] - } bind -.dicttomark readonly def % postformats - -/first_post_string % - first_post_string <string> -{ - post dup type /arraytype eq { 0 get } if -} bind def - -% - .getpost - -% Uses post, defines glyphencoding -/.getpost { - /glyphencoding post null eq { - TTFDEBUG { (post missing) = flush } if [ ] - } { - postformats first_post_string 0 getu32 .knownget { - TTFDEBUG { - (post: format ) print - first_post_string - dup 0 getu16 =only (,) print 2 getu16 = flush - } if - post exch exec - } { - TTFDEBUG { (post: unknown format ) print post 0 getu32 = flush } if [ ] - } ifelse - } ifelse def -} bind def - -% ===================== True Type Interpretation ============= - -/TTParser << - /Pos 0 - /post null ->> def - -/readu8 % <file> readu8 <int> -{ read not { - mark (Insufficient data in the stream.) //error exec - } if -} bind def - -/readu16 % <file> readu16 <int> -{ dup //readu8 exec 8 bitshift exch //readu8 exec or -} bind def - -/reads16 % <file> reads16 <int> -{ //readu16 exec 16#8000 xor 16#8000 sub -} bind def - -/readu32 % <file> readu32 <int> -{ dup //readu16 exec 16 bitshift exch //readu16 exec or -} bind def - -/reads32 % <file> reads32 <int> -{ dup //reads16 exec 16 bitshift exch //readu16 exec or -} bind def - -/SkipToPosition % <file> <int> SkipToPosition - -{ dup //TTParser /Pos get % f P P p - exch //TTParser exch /Pos exch put % f P p - sub % f P-p - //PDFR_DEBUG { - (Skipping ) print dup //=only exec ( bytes.) = - } if - dup 0 eq { - pop pop - } { - dup 3 1 roll % P-p f P-p - () /SubFileDecode filter % P-p f' - exch % f' P-p - { 1 index //BlockBuffer readstring pop length - dup 0 eq { pop exch pop exit } if - sub - } loop - 0 ne { - mark (Insufficient data in the stream for SkipToPosition.) //error exec - } if - } ifelse -} bind def - -/TagBuffer 4 string def - -/ParseTTTableDirectory % <file> ParseTTTableDirectory <dict> -{ //PDFR_DEBUG { - (ParseTTTableDirectory beg) = - } if - 15 dict begin - dup //readu32 exec 16#00010000 ne { - mark (Unknown True Type version.) //error exec - } if - dup //readu16 exec /NumTables exch def - dup //readu16 exec /SearchRange exch def - dup //readu16 exec /EntrySelector exch def - dup //readu16 exec /RangeShift exch def - //PDFR_DEBUG { - (NumTables = ) print NumTables = - } if - NumTables { - dup //TagBuffer readstring not { - mark (Could not read TT tag.) //error exec - } if - cvn - [ 2 index //readu32 exec pop % CheckSum - 2 index //readu32 exec % Offset - 3 index //readu32 exec % Length - ] - //PDFR_DEBUG { - 2 copy exch //=only exec ( ) print == - } if - def - } repeat - pop % file - //TTParser /Pos 12 NumTables 16 mul add put - currentdict end - //PDFR_DEBUG { - (ParseTTTableDirectory end) = - } if -} bind def - -/ParseTTcmap % <file> <TableDirectory> ParseTTcmap <dict> -{ //PDFR_DEBUG { - (ParseTTcmap beg) = - } if - /cmap get aload pop % f o L - 3 1 roll % L f o - 7 dict begin - //PDFR_DEBUG { - (Current position = ) print //TTParser /Pos get = - (cmap position = ) print dup = - } if - 1 index exch //SkipToPosition exec % L f - //TTParser /Pos get /TablePos exch def - dup //readu16 exec pop % version - dup //readu16 exec /NumEncodings exch def - //PDFR_DEBUG { - (NumEncodings = ) print NumEncodings = - } if - null % L f null - NumEncodings { - 1 index //readu32 exec % platformID, specificID % L f null id - 2 index //readu32 exec % offset % L f null id o - 3 array dup 3 2 roll 0 exch put % L f []|null id [] - 2 index null ne { - dup 0 get 3 index 0 get sub % L f []|null id [] l - 3 index exch 1 exch put % L f []|null id [] - } if - dup 4 3 roll pop 3 1 roll % L f [] id [] - def - } repeat % L f [] - dup 0 get % L f [] o - 4 3 roll exch sub % f [] L-o - 1 exch put % f - //PDFR_DEBUG { - currentdict { - exch dup type /integertype eq { - //PrintHex exec ( ) print == - } { - pop pop - } ifelse - } forall - } if - 4 NumEncodings 8 mul add /HeaderLength exch def - //TTParser /Pos //TTParser /Pos get HeaderLength add put - 0 % f o - NumEncodings { - 16#7FFFFFF null % f o om null|[] - % Choosing a table with minimal offset greater than 'o' : - currentdict { - 1 index type /integertype eq { % f o om null|[] id [] - exch pop dup 0 get % f o om null|[] [] oi - dup 5 index gt { - dup 4 index lt { - 4 1 roll % f o oi om null|[] [] - exch pop exch pop % f o oi [] - } { - pop pop - } ifelse - } { - pop pop - } ifelse % f o oi [] - } { - pop pop - } ifelse - } forall % f o om' [] - //PDFR_DEBUG { - (Obtaining subtable for ) print dup == - } if - 3 2 roll pop % f o' [] - 3 copy pop % f o' [] f o' - TablePos add //SkipToPosition exec % f o' [] - 3 copy exch pop 1 get % f o' [] l - //TTParser /Pos //TTParser /Pos get 3 index add put - string % f o' [] f () - readstring not { - mark (Can't read a cmap subtable.) //error exec - } if % f o' [] () - 2 exch put % f o' - } repeat - pop pop % - currentdict end - //PDFR_DEBUG { - (ParseTTcmap end) = - } if -} bind def - -/GetTTEncoding % <file> <TTcmapHeader> <platformIDspecificID> GetTTEncoding <array> -{ //PDFR_DEBUG { - (GetTTEncoding beg) = - } if - get % f [] - exch pop % [] - 2 get - 10 dict begin % For local variables. - /TTFDEBUG //PDFR_DEBUG def - //cmaparray exec - end - //PDFR_DEBUG { - (GetTTEncoding end) = - dup == - } if -} bind def - -/InverseEncoding % <encoding> InverseEncoding <dict> -{ - 256 dict begin - dup length 1 sub -1 0 { % E i - 2 copy get % E i n - exch % E n i - 1 index currentdict exch //knownget exec { % E n i e - dup type /arraytype eq { - aload length 1 add array astore % E n e' - } { - 2 array astore % E n e' - } ifelse - } if - def - } for - pop - currentdict end -} bind def - -/GetMacRomanEncodingInverse -{ //PDFReader /MacRomanEncodingInverse get - dup null eq { - pop - MacRomanEncoding //InverseEncoding exec - dup //PDFReader exch /MacRomanEncodingInverse exch put - } if -} bind def - -/PutCharStringSingle % <cmap_array> <glyph_name> <char_code> PutCharStringSingle <cmap_array> -{ - dup 3 index length lt { % cmap name code - 2 index exch get % cmap name glyphindex - dup 0 ne { - def % cmap - } { - pop pop - } ifelse - } { - pop pop % cmap - } ifelse -} bind def - -/PutCharString % <cmap_array> <glyph_name> <char_code> PutCharString <cmap_array> -{ 1 index type /nametype ne { - mark (Bad charstring name) //error exec - } if - dup type /arraytype eq { - { % cmap name code - 3 copy //PutCharStringSingle exec % cmap name code cmap - pop pop % cmap name - } forall - pop % cmap - } { - //PutCharStringSingle exec - } ifelse -} bind def - -/ComposeCharStrings % <cmaparray> <dict> ComposeCharStrings <dict> -{ - //PDFR_DEBUG { - (ComposeCharStrings beg) = - } if - 1 index length 1 add dict begin % cmap d - % fixme : the dict length estimation doesn't account 'post'. - /.notdef 0 def - exch % d cmap - //TTParser /post get % d cmap [post]|null - dup null ne { - exch % d [] cmap - 1 index length 1 sub -1 0 { % d [] cmap code - dup 3 index exch get exch % d [] cmap name code - dup 0 eq 2 index /.notdef eq or { % do not re-encode GID 0, or the - % /.notdef glyph name - pop pop - } { - def - } ifelse - } for - } if - exch pop exch % cmap d - { % cmap name code - //PutCharString exec - } forall % cmap - pop % - currentdict end - //PDFR_DEBUG { - (ComposeCharStrings end) = - } if -} bind def - -/ParseTTpost % <file> <TableDirectory> ParseTTpost - -{ % Defines TTparser.post - an array, - % which maps glyph indices to glyph names. - //PDFR_DEBUG { - (ParseTTpost beg) = - } if - /post get aload pop % f o L - 3 1 roll % L f o - //PDFR_DEBUG { - (Current position = ) print //TTParser /Pos get = - (post position = ) print dup = - } if - 1 index exch //SkipToPosition exec % L f - //TTParser /Pos //TTParser /Pos get 4 index add put - exch dup 65535 le { - string % f s - readstring not { - mark (Insufficient data in the stream for ParseTTpost.) //error exec - } if % s - } { - % f s - [ 3 1 roll % [ f s - dup 16384 div floor cvi % [ f s numblocks - exch 1 index 16384 mul % [ f numblocks s bytesinblocks - sub exch % [ f remainder numblocks - 1 sub 0 1 3 -1 roll % [ f remainder 0 1 numblocks - { - 1 add index % [ f remainder () ()... f - 16384 string readstring not { - mark (Insufficient data in the stream for ParseTTpost.) //error exec - } if - } for - % [ f remainder () ()... - counttomark -2 roll % [ () ()... f remainder - string readstring not{ - mark (Insufficient data in the stream for ParseTTpost.) //error exec - } if - ] - } ifelse - 1 dict begin % A bridge to the code from /gs/lib/gs_ttf.ps . - /post exch def - //.getpost exec - //TTParser /post glyphencoding put - //PDFR_DEBUG { - (ParseTTpost end) = - glyphencoding == - } if - end -} bind def - -/MakeTTCharStrings % <FontFile_object> MakeTTCharStrings <CharStrings> -{ //MakeStreamReader exec % f - dup dup //ParseTTTableDirectory exec % f f d - % Since the file isn't positionable, - % we must pick up either 'post' or 'cmap' first. - % Deside which one we do first : - //TTParser /post null put - dup /post //knownget exec { - 0 get - 1 index /cmap get 0 get - lt { - 2 copy //ParseTTpost exec % f f d - //ParseTTcmap exec % f ch - } { - 2 copy //ParseTTcmap exec % f f d ch - 3 1 roll % f ch f d - //ParseTTpost exec % f ch - } ifelse - } { - //ParseTTcmap exec % f ch - } ifelse - { - dup 16#00030001 known { - //PDFR_DEBUG { - (Using the TT cmap encoding for Windows Unicode.) = - } if - 16#00030001 //GetTTEncoding exec - AdobeGlyphList //ComposeCharStrings exec - exit - } if - dup 16#00010000 known { - //PDFR_DEBUG { - (Using the TT cmap encoding for Macintosh Roman.) = - } if - 16#00010000 //GetTTEncoding exec - PDFEncoding dup null eq { - pop //GetMacRomanEncodingInverse exec - } { - //InverseEncoding exec - } ifelse - //ComposeCharStrings exec - exit - } if - dup 16#00030000 known { - //PDFR_DEBUG { - (Using the TT cmap encoding 3.0 - not sure why Ghostscript writes it since old versions.) = - } if - % Same algorithm as for 16#00010000. - 16#00030000 //GetTTEncoding exec - PDFEncoding dup null eq { - pop //GetMacRomanEncodingInverse exec - } { - //InverseEncoding exec - } ifelse - //ComposeCharStrings exec - exit - } if - mark (True Type cmap has no useful encodings.) //error exec - } loop - //PDFR_DEBUG { - (CharStrings <<) = - dup { - exch - dup type /nametype eq { - //=only exec - } { - == - } ifelse - ( ) print == - } forall - (>>) = - } if -} bind def - -%%end TrueType - -% ===================== Functions ============================ - -/ScaleVal % <value> <Range> ScaleVal <scaled_value> -{ - aload pop % v r0 r1 - 1 index sub % v r0 r1-r0 - 3 2 roll mul add -} bind def - -/ScaleArg % <arg> <Domain> ScaleArg <scaled_arg> -{ - aload pop % a d0 d1 - 1 index sub % a d0 d1-d0 - 3 1 roll % d1-d0 a d0 - sub exch div % (a-d0)/(d1-d0) -} bind def - -/ScaleArgN % <arg1> ... <argN> <Domain> ScaleArg <scaled_arg1> ... <scaled_argN> -{ - dup length 2 sub -2 0 { % a1 ... an [] 2i - 2 % a1 ... an [] 2i 2 - 2 index 3 1 roll getinterval % a1 ... an [] [] - 3 2 roll % a1 ... [] [] an - exch //ScaleArg exec % a1 ... [] an' - 1 index length 2 idiv 1 add 1 roll % an' a1 ... [] - } for % a1' ... an' [] - pop % a1' ... an' -} bind def - - -/ComputeFunction_10 % <scaled_arg> <sample_array> ComputeFunction_10 <result> -{ % Assuming a 1-argument 1-result function type 0. - //PDFR_DEBUG { - (ComputeFunction_10 beg ) print 1 index //=only exec ( stack=) print count = - } if - exch % [] x - dup 1 eq { - pop dup length 1 sub get % y - } { - 1 index length 1 sub mul % [] x*(l-1) - dup dup floor sub % [] x*(l-1) f - dup 0 eq { - pop cvi get % y - } { - 3 1 roll floor cvi % f [] i - 2 getinterval % f [] - aload pop % f y0 y1 - 2 index mul 3 2 roll 1 exch sub 3 2 roll mul add % y1*f+(1-f)*y0 - } ifelse - } ifelse - //PDFR_DEBUG { - (ComputeFunction_10 end ) print dup //=only exec ( stack=) print count = - } if -} bind def - -/ComputeFunction_n0 % <arg1> .... <argn> <sample_array> <n> ComputeFunction_n0 <result> -{ % Assuming a n-argument 1-result function type 0. - //PDFR_DEBUG { - (ComputeFunction_n0 beg N=) print dup //=only exec ( stack=) print count = - } if - dup 0 eq { % v 0 - pop % v - } { - dup 2 add -1 roll % a2 .... an [] n a1 - dup 3 index length 1 sub ge { - pop 1 sub % a2 .... an [] n-1 - exch dup length 1 sub get exch - //PDFReader /ComputeFunction_n0 get exec - } { - dup floor cvi dup % a2 .... an [] n a1 i i - 4 index exch get % a2 .... an [] n a1 i [i] - 3 index dup % a2 .... an [] n a1 i [i] n n - 5 add copy % a2 .... an [] n a1 i [i] n a2 .... an [] n a1 i [i] n - 6 2 roll % a2 .... an [] n a1 i [i] n a2 .... an [i] n [] n a1 i - pop pop pop pop % a2 .... an [] n a1 i [i] n a2 .... an [i] n - 1 sub % a2 .... an [] n a1 i [i] n a2 .... an [i] n-1 - //PDFReader /ComputeFunction_n0 get exec % a2 .... an [] n a1 i [i] n v0 - 3 2 roll pop % a2 .... an [] n a1 i n v0 - exch % a2 .... an [] n a1 i v0 n - 4 3 roll exch % a2 .... an [] n i v0 a1 n - 4 add 2 roll 1 add % v0 a1 a2 .... an [] n i+1 - 3 2 roll exch get % v0 a1 a2 .... an n [i+1] - exch 1 sub % v0 a1 a2 .... an [i+1] n-1 - //PDFReader /ComputeFunction_n0 get exec % v0 a1 v1 - 1 index mul % v0 a1 v1*a1 - 3 1 roll % v1*a1 v0 a1 - 1 exch sub mul add % v1*a1+v0*(1-a1) - } ifelse - } ifelse - //PDFR_DEBUG { - (ComputeFunction_n0 end ) print dup //=only exec ( stack=) print count = - } if -} bind def - -/FunctionToProc_x01 % <function_dict> FunctionToProc_x01 <proc> -{ % Assuming a n-argument 1-result function type 0. - % The stream is already converted to the array /Data. - dup /Domain get exch - dup /Data get 0 get exch - /Size get length - [ 4 1 roll - //PDFR_DEBUG { - { (function beg, stack =) print count //=only exec (\n) print } /exec load - 5 2 roll - } if - dup 1 gt { % a1 ... an Domain Data n - { mark exch % a1 ... an Domain Data [ n - 3 add 2 roll % Data [ a1 ... an Domain - //ScaleArgN exec % Data [ a1 ... an - counttomark dup % Data [ a1 ... an n n - 3 add -2 roll % a1 ... an n Data [ - pop exch % a1 ... an Data n - //ComputeFunction_n0 exec - } /exec load - } { - pop % a1 Domain Data - 3 1 /roll load //ScaleArg /exec load % Data a1s - /exch load - //ComputeFunction_10 /exec load - } ifelse - //PDFR_DEBUG { - (function end, stack =) /print load /count load //=only /exec load (\n) /print load - } if - ] cvx - //PDFR_DEBUG { - (Made a procedure for the 1-result function :) = - dup == - } if -} bind def - -/FunctionProcDebugBeg % - FunctionProcDebugBeg - -{ (FunctionProcDebugBeg ) print count = -} bind def - -/FunctionProcDebugEnd % - FunctionProcDebugEnd - -{ (FunctionProcDebugEnd ) print count = -} bind def - -/FunctionToProc_x0n % <function_dict> <m> FunctionToProc_x0n <proc> -{ % Assuming a n-argument m-result function type 0. - % The stream is already converted to the array /Data. - % - % Making the procedure : { Domain //ScaleArg exec ... n copy {} exec n+1 1 roll ... } - % except "n copy" for the last chunk. - % - PDFR_DEBUG { - (FunctionToProc_x0n beg m=) print dup = - } if - 1 index /Size get length exch % f n m - dup 7 mul 2 add array % f n m [] - PDFR_DEBUG { - dup 0 //FunctionProcDebugBeg put - } { - dup 0 //DoNothing put - } ifelse - dup 1 /exec load put - dup 2 5 index /Domain get put - 2 index 1 eq { - dup 3 //ScaleArg put - } { - dup 3 //ScaleArgN put - } ifelse - dup 4 /exec load put - 1 index 1 sub 0 exch 1 exch { % f n m [] i - dup 7 mul 5 add % f n m [] i i1 - 1 index 4 index 1 sub ne { - dup 3 index exch 6 index put 1 add - dup 3 index exch /copy load put 1 add - } if - [ % f n m [] i i1 [ - 6 index /Data get 3 index get % f n m [] i i1 [ di - 6 index 1 eq { - //ComputeFunction_10 /exec load - } { - 6 index - //ComputeFunction_n0 /exec load - } ifelse - ] cvx % f n m [] i i1 {} - 3 index exch 2 index exch put 1 add % f n m [] i i1 - 2 index 1 index /exec load put 1 add - 1 index 4 index 1 sub ne { - 2 index 1 index 6 index 1 add put 1 add - 2 index 1 index 1 put 1 add - 2 index 1 index /roll load put % f n m [] i i1 - } if - pop pop % f n m [] - } for - PDFR_DEBUG { - dup dup length 2 sub //FunctionProcDebugEnd put - } { - dup dup length 2 sub //DoNothing put - } ifelse - dup dup length 1 sub /exec load put - cvx exch pop exch pop exch pop - //PDFR_DEBUG { - (Made a procedure for the n-argument function :) = - dup == - } if - PDFR_DEBUG { - (FunctionToProc_x0n end) = - } if -} bind def - -/MakeTableRec % <func_obj> <n> MakeTableRec <array> -{ - 0 % to be bound below - exec -} bind def - -/MakeTable % <func_obj> <n> MakeTable <array> -{ //PDFR_DEBUG { - (MakeTable beg ) print count = - } if - 1 index /Size get exch % f S N - 1 sub dup % f S n n - 3 1 roll % f n S n - get % f n s - array % f n [] - 1 index 0 eq { - exch pop exch pop % [] - } { - dup length 1 sub -1 0 { % f n [] i - 3 index 3 index //MakeTableRec exec % f n [] i [] - 2 index 3 1 roll put % f n [] - } for - exch pop exch pop - } ifelse - //PDFR_DEBUG { - (MakeTable end ) print count = - } if -} bind def - -//MakeTableRec 0 //MakeTable put - -/StoreSample % <value> <table> <dimensions> StoreSample - -{ % The reader is on the dictionary stack. - 1 sub - dup 0 eq { - pop % v [] - } { - -1 1 { % v T i - I exch get get % v T[I[i]] - } for % v [] - } ifelse - I 0 get 3 2 roll put -} bind def - -/ReadSample32 % - ReadSample32 <value> -{ - 4 { - File read not { - mark (Insufficient data for function.) //error exec - } if - } repeat - pop % Ignore the last byte because it can't fit into 'real'. - 3 1 roll exch - 256 mul add 256 mul add - //1_24_bitshift_1_sub div -} bind def - -/ReadSample % - ReadSample <value> -{ % The reader in on the dictionary stack. - Buffer BitsLeft BitsPerSample - { 2 copy ge { - exit - } if - 3 1 roll - 8 add 3 1 roll - 256 mul File read not { - mark (Insufficient data for function.) //error exec - } if - add - 3 1 roll - } loop % b bl pbs - sub dup % b bl-bps bl-bps - 2 index exch % b bl-bps b bl-bps - neg bitshift % b bl-bps v - 2 copy exch bitshift % b bl-bps v v<<(bl-bps) - 4 3 roll exch sub % bl-bps v b-(v<<(bl-bps)) - /Buffer exch def % bl-bps v - exch /BitsLeft exch def % v - Div div % v/(1<<pbs-1) -} bind def - -/ReadSamplesRec % <dimensions> ReadSamplesRec - -{ 0 % Will be bound below - exec -} bind def - -/ReadSamples % <dimensions> ReadSamples - -{ % The reader in on the dictionary stack. - //PDFR_DEBUG { - (ReadSamples beg ) print count = - } if - dup 1 eq { - pop - 0 1 Size 0 get 1 sub { - I exch 0 exch put - 0 1 M 1 sub { - dup Range exch 2 mul 2 getinterval % m r - //PDFR_DEBUG { - (Will read a sample ... ) print - } if - BitsPerSample 32 eq { //ReadSample32 } { //ReadSample } ifelse - exec exch //ScaleVal exec % m v - //PDFR_DEBUG { - (value=) print dup = - } if - exch Table exch get % v [] - Size length //StoreSample exec % - } for - } for - } { - 1 sub - dup Size exch get 0 exch 1 exch 1 sub { % d-1 i - I exch 2 index exch put % d-1 - dup //ReadSamplesRec exec % d-1 - } for - pop - } ifelse - //PDFR_DEBUG { - (ReadSamples end ) print count = - } if -} bind def - -//ReadSamplesRec 0 //ReadSamples put - -/StreamToArray % <obj> StreamToArray - -{ //PDFR_DEBUG { - (StreamToArray beg ) print count = - } if - userdict /FuncDataReader get begin % f - dup /BitsPerSample get /BitsPerSample exch def - dup /Size get length /N exch def - dup /Range get length 2 idiv /M exch def - 1 BitsPerSample bitshift 1 sub /Div exch def - /BitsLeft 0 def - /Buffer 0 def - dup /Size get /Size exch def % f - dup /Range get /Range exch def % f - /File 1 index //MakeStreamReader exec def % f - /I [ N { 0 } repeat ] def % f - M array % f [] - dup length 1 sub -1 0 { % f [] m - 2 index N //MakeTable exec % f [] m T - 2 index 3 1 roll put % f [] - } for - /Table exch def % f - N //ReadSamples exec % f - PDFR_DEBUG { - (Table = ) print Table == - } if - /Data Table put % - end - //PDFR_DEBUG { - (StreamToArray end ) print count = - } if -} bind def - -/FunctionToProc10 % <function_dict> FunctionToProc10 <proc> -{ % Assuming a 1-argument function type 0. - PDFR_DEBUG { - (FunctionToProc10 beg, Range = ) print dup /Range get == - } if - dup /Order //knownget exec { - 1 ne { - (Underimplemented function Type 0 Order 3.) = - } if - } if - dup //StreamToArray exec % f - dup /Range get length dup 2 eq { - pop //FunctionToProc_x01 exec % proc - } { - 2 idiv //FunctionToProc_x0n exec % proc - } ifelse - PDFR_DEBUG { - (FunctionToProc10 end) = - } if -} bind def - -/FunctionToProc12 % <function_dict> FunctionToProc12 <proc> -{ begin - currentdict /C0 //knownget exec { length 1 eq } { true } ifelse { - N - currentdict /C0 //knownget exec { - 0 get - } { - 0 - } ifelse - currentdict /C1 //knownget exec { - 0 get - } { - 1 - } ifelse - 1 index sub - [ 4 1 roll - { % x n c0 c1-c0 - 4 2 roll % c0 c1-c0 x n - excp mul add % y - } aload pop - ] cvx - } { - [ - 0 1 C0 length 1 sub { - N % [ ... i n - C0 2 index get % [ ... i n c0 - C1 3 index get % [ ... i n c0 c1 - 4 3 roll pop % [ ... n c0 c1 - 1 index sub % [ ... n c0 c1-c0 - [ /dup load % [ ... n c0 c1-c0 [ dup - 5 2 roll % [ ... [ dup n c0 c1-c0 - { % x x n c0 c1-c0 - 4 2 roll % x c0 c1-c0 x n - exp mul add % x y - exch % y x - } aload pop - ] cvx - /exec load - } for - /pop load - ] cvx - } ifelse - end - //PDFR_DEBUG { - (FunctionType2Proc : ) print dup == - } if -} bind def - - -/FunctionToProc14 % <function_dict> FunctionToProc14 <proc> -{ //MakeStreamReader exec cvx exec - //PDFR_DEBUG { - (FunctionType4Proc : ) print dup == - } if -} bind def - -/FunctionToProc1 % <function_dict> FunctionToProc <proc> -{ % Assuming a 1-argument function. - dup /FunctionType get - { dup 0 eq { - pop //FunctionToProc10 exec exit - } if - dup 2 eq { - pop //FunctionToProc12 exec exit - } if - dup 4 eq { - pop //FunctionToProc14 exec exit - } if - mark exch (Function type ) exch ( isn't implemented yet.) //error exec - } loop -} bind def - -/FunctionToProc20 % <function_dict> FunctionToProc20 <proc> -{ % Assuming a 2-argument function type 0. - PDFR_DEBUG { - (FunctionToProc20, Range = ) print dup /Range get == - } if - dup /Order //knownget exec { - 1 ne { - (Underimplemented function Type 0 Order 3.) = - } if - } if - dup //StreamToArray exec % f - dup /Range get length dup 2 eq { - pop //FunctionToProc_x01 exec % proc - } { - 2 idiv //FunctionToProc_x0n exec % proc - } ifelse -} bind def - -/FunctionToProc % <function_dict> FunctionToProc <proc> -{ //PDFR_DEBUG { - (FunctionToProc beg ) print count = - } if - dup type /dicttype eq { - dup /Domain get length 2 idiv - { - dup 1 eq { - pop //FunctionToProc1 exec exit - } if - dup 2 eq { - pop //FunctionToProc20 exec exit - } if - mark (Functions with many arguments aren't implemented yet.) //error exec - } loop - } { - //PDFR_DEBUG {(Not a function dict, assume already a procedure.) print } if - } ifelse - //PDFR_DEBUG { - (FunctionToProc end ) print count = - } if -} bind def - -/spotfunctions mark % Copied from pdf_draw.ps - /Round { - abs exch abs 2 copy add 1 le { - dup mul exch dup mul add 1 exch sub - } { - 1 sub dup mul exch 1 sub dup mul add 1 sub - } ifelse - } - /Diamond { - abs exch abs 2 copy add .75 le { - dup mul exch dup mul add 1 exch sub - } { - 2 copy add 1.23 le { - .85 mul add 1 exch sub - } { - 1 sub dup mul exch 1 sub dup mul add 1 sub - } ifelse - } ifelse - } - /Ellipse { - abs exch abs 2 copy 3 mul exch 4 mul add 3 sub dup 0 lt { - pop dup mul exch .75 div dup mul add 4 div 1 exch sub - } { - dup 1 gt { - pop 1 exch sub dup mul exch 1 exch sub - .75 div dup mul add 4 div 1 sub - } { - .5 exch sub exch pop exch pop - } ifelse - } ifelse - } - /EllipseA { dup mul .9 mul exch dup mul add 1 exch sub } - /InvertedEllipseA { dup mul .9 mul exch dup mul add 1 sub } - /EllipseB { dup 5 mul 8 div mul exch dup mul exch add sqrt 1 exch sub } - /EllipseC { dup mul .9 mul exch dup mul add 1 exch sub } - /InvertedEllipseC { dup mul .9 mul exch dup mul add 1 sub } - /Line { exch pop abs neg } - /LineX { pop } - /LineY { exch pop } - /Square { abs exch abs 2 copy lt { exch } if pop neg } - /Cross { abs exch abs 2 copy gt { exch } if pop neg } - /Rhomboid { abs exch abs 0.9 mul add 2 div } - /DoubleDot { 2 {360 mul sin 2 div exch } repeat add } - /InvertedDoubleDot { 2 {360 mul sin 2 div exch } repeat add neg } - /SimpleDot { dup mul exch dup mul add 1 exch sub } - /InvertedSimpleDot { dup mul exch dup mul add 1 sub } - /CosineDot { 180 mul cos exch 180 mul cos add 2 div } - /Double { exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add } - /InvertedDouble { - exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add neg - } -.dicttomark readonly def - -% ===================== Color Spaces and Colors ============== - -/CheckColorSpace % <key> <val> CheckColorSpace <key> <val> -{ - dup type /arraytype ne { - mark (Resource ) 3 index ( must be an array.) //error exec - } if -} bind def - -/SubstitutePDFColorSpaceRec % <array> SubstitutePDFColorSpace <array> -{ 0 % Will be bound below - exec -} bind def - -/SubstitutePDFColorSpace % <array> SubstitutePDFColorSpace <array> -{ - { - dup 0 get /Pattern eq { - dup length 1 gt { - dup dup 1 //CheckColorSpace //ResolveA exec - dup type /nametype ne { - //SubstitutePDFColorSpaceRec exec - } if - 1 exch put - } if - exit - } if - dup 0 get /Indexed eq { - exit - } if - dup 0 get /Separation eq { - dup dup 2 //CheckColorSpace //ResolveA exec - dup type /nametype ne { - //SubstitutePDFColorSpaceRec exec - } if - 2 exch put - exit - } if - dup 0 get /CalGray eq { - 1 get % dict - dup /Gamma //knownget exec { - [ exch [ exch /exp load ] cvx dup dup ] - 1 index exch /DecodeLMN exch put - } if - [ exch /CIEBasedA exch ] % [] - exit - } if - dup 0 get /CalRGB eq { - 1 get % dict - dup /Matrix //knownget exec { - 1 index exch /MatrixLMN exch put - } if - dup /Gamma //knownget exec { - aload pop - [ exch /exp load ] cvx - 3 1 roll - [ exch /exp load ] cvx - 3 1 roll - [ exch /exp load ] cvx - 3 1 roll - 3 array astore - 1 index exch /DecodeLMN exch put - } if - [ exch /CIEBasedABC exch ] % [] - exit - } if - dup 0 get /Lab eq { - 1 get % dict - begin - currentdict /Range //knownget exec { aload pop } { -100 100 -100 100 } ifelse - 0 100 6 2 roll 6 array astore - /RangeABC exch def - /DecodeABC [{16 add 116 div} bind {500 div} bind {200 div} bind] def - /MatrixABC [1 1 1 1 0 0 0 0 -1] def - { dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } - /DecodeLMN [ - % Store white point implicitly inside procedures. - [ 3 index aload pop WhitePoint 0 get /mul load ] cvx - [ 4 index aload pop WhitePoint 1 get /mul load ] cvx - [ 5 index aload pop WhitePoint 2 get /mul load ] cvx - ] def pop - //PDFR_DEBUG { - (Constructed from Lab <<) = - currentdict { exch = == } forall - (>>) = - } if - [ /CIEBasedABC currentdict ] % [] - end - exit - pop - } if - % Check if this is an already substituted space - dup 0 get /CIEBasedA eq {exit} if - dup 0 get /CIEBasedABC eq {exit} if - mark exch (Unimplemented color space ) exch //error exec - } loop -} bind def - -//SubstitutePDFColorSpaceRec 0 //SubstitutePDFColorSpace put - -/ResolveArrayElement % <array> <index> ResolveArrayElement <array> -{ 2 copy get - dup type dup /arraytype eq exch - /packedarraytype eq or { % make sure its a procedure/executable array - xcheck { - 2 copy get % Get executable array - dup 0 get type /integertype eq % ensure first element is an integer - 1 index 1 get type dup /arraytype - eq exch - /packedarraytype eq or % ensure second element is executable array - and { - exec - 2 index 4 1 roll put - } { - pop pop - } ifelse - } { - pop - } ifelse - } { - pop pop - } ifelse -} bind def - -/ResolveColorSpaceArrayRec % <color_space> ResolveColorSpaceArrayRec <color_space> -{ 0 % Will be bond below. - exec -} bind def - -/SetColorSpaceSafe % <color_space> SetColorSpaceSafe - -{ - % This works against applying a pattern over a pattern space, - % which may happen due to duplication of stroking and non-stroking colors. - % gs3.70 fails when setting a pattern space and - % the (old) current color space is a pattern space. - % - % If the new color space is an array and it appears equal to the old one, - % do nothing. Otherwise set the new color space. - PDFR_DEBUG { - (SetColorSpaceSafe beg) = - } if - currentcolorspace dup type /arraytype eq { % cs cs' - 1 index type /arraytype eq { - dup length 2 index length eq { - false exch % cs b cs' - dup length 0 exch 1 exch 1 sub { % cs b cs' i - dup % cs b cs' i i - 4 index exch get exch % cs b cs' csi i - 2 index exch get % cs b cs' csi cs'i - ne { % cs b cs' - exch pop true exch exit - } if - } for % cs b cs' - pop % cs b - { - setcolorspace - } { - pop - } ifelse % - } { - pop setcolorspace - } ifelse - } { - pop setcolorspace - } ifelse - } { % cs cs' - pop setcolorspace - } ifelse - PDFR_DEBUG { - (SetColorSpaceSafe end) = - } if -} bind def - -/ResolveColorSpaceArray % <color_space> ResolveColorSpaceArray <color_space> -{ - //PDFR_DEBUG { - (ResolveColorSpaceArray beg ) print dup == - } if - dup 0 get /Indexed eq { - 1 //ResolveArrayElement exec - dup dup 1 get - dup type /arraytype eq { - //SubstitutePDFColorSpace exec - //ResolveColorSpaceArrayRec exec - 1 exch put - } { - pop pop - } ifelse - } if - dup 0 get /Separation eq { - 3 //ResolveArrayElement exec - dup 3 get //FunctionToProc exec - 2 copy 3 exch put - pop - } if - dup 0 get/Pattern eq{ - dup length 1 gt { - dup dup 1 get dup type /arraytype eq { - ResolveColorSpaceArray - 1 index 1 3 -1 roll put - }{ - pop - }ifelse - }if - }if - PDFR_DEBUG { - (Construcrted color space :) = - dup == - } if - //PDFR_DEBUG { - (ResolveColorSpaceArray end ) print dup == - } if -} bind def - -//ResolveColorSpaceArrayRec 0 //ResolveColorSpaceArray put - -/ResolveColorSpace % <name> ResolveColorSpace <color_space> -{ - //PDFR_DEBUG { - (ResolveColorSpace beg ) print dup = - } if - dup //SimpleColorSpaceNames exch known not { - dup //PDFColorSpaces exch //knownget exec { - exch pop - //PDFR_DEBUG { - (ResolveColorSpace known ) = - } if - } { - dup % n n - //PDFReader /CurrentObject get /Context get /Resources get - /ColorSpace //DoNothing //ResolveD exec - exch //CheckColorSpace //ResolveD exec % n cs - dup type /arraytype eq { - //SubstitutePDFColorSpace exec - //ResolveColorSpaceArray exec - dup //PDFColorSpaces 4 2 roll put % [] - } if - } ifelse - } if - //PDFR_DEBUG { - (ResolveColorSpace end ) print dup == - } if -} bind def - -/CheckPattern % <key> <val> CheckPattern <key> <val> -{ - dup /PatternType //knownget exec { - dup 1 ne { - mark (Resource ) 4 index ( is a shading, which can't be handled at level 2. ) //error exec - } if - pop - } if - dup /Type knownget { % /Type is optional for type 1 pattern dictionaries - /Pattern ne { - mark (Resource ) 4 index ( must have /Type/Pattern .) //error exec - } if - } if -} bind def - -/PaintProc % -{ /Context get % pattern_object - //RunDelayedStream exec -} bind def - -/ResolvePattern % <name> ResolvePattern <pattern> -{ - dup % n n - % Since makepattern makes a local dictionary, - % we cahche them in userdict, which is in local VM. - % Assuming unique resource name through the document - userdict /PDFR_Patterns get % n n d - exch //knownget exec { % n p - exch pop % p - } { % n - dup % n n - //PDFReader /CurrentObject get /Context get /Resources get - /Pattern //DoNothing //ResolveD exec - exch //CheckPattern //ResolveD exec % n o - dup dup /Context exch put - dup /Resources //DoNothing //ResolveD exec pop - dup /PaintProc //PaintProc put - gsave userdict /PDFR_InitialGS get setgstate - currentglobal exch false setglobal % gs3_70 compatibility - dup /Matrix get - makepattern % n p - exch setglobal % gs3_70 compatibility - grestore - dup userdict /PDFR_Patterns get % n p p d - 4 2 roll % p d n p - put % p - } ifelse -} bind def - -/SetColor % Same arguments and result as for scn -{ //PDFR_DEBUG { - (SetColor beg) = - } if - currentcolorspace dup type /nametype eq { - pop setcolor - } { - 0 get /Pattern eq { - //ResolvePattern exec setpattern - } { - setcolor - } ifelse - } ifelse - //PDFR_DEBUG { - (SetColor end) = - } if -} bind def - -% ===================== Images =============================== - -/ImageKeys 15 dict begin - /BPC /BitsPerComponent def - /CS /ColorSpace def - /D /Decode def - /DP /DecodeParms def - /F /Filter def - /H /Height def - /IM /ImageMask def - % /Intent is undefined - pdfwrite must take care of. - /I /Interpolate def - /W /Width def -currentdict end readonly def - -/ImageValues 15 dict begin - /G /DeviceGray def - /RGB /DeviceRGB def - /CMYK /DeviceCMYK def - /I /Indexed def - /AHx /ASCIIHexDecode def - /A85 /ASCII85Decode def - /LZW /LZWDecode def - /Fl /FlateDecode def - /RL /RunLengthDecode def - /CCF /CCITTFaxDecode def - /DCT /DCTDecode def -currentdict end readonly def - -/GetColorSpaceRange -{ 2 index /ColorSpace get - dup type /arraytype eq { - 1 get - } if - exch //knownget exec { - exch pop - } if -} bind def - -/DecodeArrays 15 dict begin - /DeviceGray { [0 1] } def - /DeviceRGB { [0 1 0 1 0 1] } def - /DeviceCMYK { [0 1 0 1 0 1 0 1] } def - /Indexed { - dup /BitsPerComponent get 1 exch bitshift 1 sub [exch 0 exch] - } def - /Separation { [0 1] } def - /CIEBasedA { [0 1] /RangeA //GetColorSpaceRange exec } def - /CIEBasedABC { [0 1 0 1 0 1] /RangeABC //GetColorSpaceRange exec } def -currentdict end readonly def - -/Substitute % <key> <dict> Substitute <key> -{ 1 index //knownget exec { - exch pop - } if -} bind def - -/DebugImagePrinting % <image_dict> DebugImagePrinting <image_dict> -{ - //PDFR_DEBUG { - (Image :) = - dup { exch //=only exec ( ) print == - } forall - } if -} bind def - -/CompleteImage % <dict> CompleteImage <image_dict> -{ - dup /ColorSpace known { - dup /ColorSpace //CheckColorSpace //ResolveD exec pop - } if - dup /Decode known not { - dup /ColorSpace //knownget exec { - dup type /arraytype eq { - 0 get - } if - //DecodeArrays exch get exec - } { - [0 1] - } ifelse - 1 index exch /Decode exch put - } if - dup /ImageMatrix [2 index /Width get 0 0 5 index /Height get neg - 0 7 index /Height get] put % Not sure why upside down ? - //DebugImagePrinting exec -} bind def - -/CompleteInlineImage % <dict> CompleteInlineImage <image_dict> -{ - //PDFR_DEBUG { - (CompleteInlineImage beg) = - } if - dup /ImageType known not { - dup /ImageType 1 put - } if - dup length dict exch { % d key val - exch //ImageKeys //Substitute exec - dup /Filter eq { - exch //ImageValues //Substitute exec exch - } if - dup /ColorSpace eq { - exch - dup //ImageValues exch //knownget exec { - exch pop - } { - //ResolveColorSpace exec - } ifelse - exch - } if - exch - 2 index 3 1 roll put - } forall - //CompleteImage exec - dup /DataSource 2 copy get % d d /n f - 2 index //AppendFilters exec put - //PDFR_DEBUG { - (CompleteInlineImage end) = - } if -} bind def - -/CompleteOutlineImage % <dict> CompleteOutlineImage <image_dict> -{ - currentglobal exch dup gcheck setglobal - //PDFR_DEBUG { - (CompleteOutlineImage beg) = - } if - % todo: ResetStreamReader if DataSource already exists. - dup dup //MakeStreamReader exec /DataSource exch put - dup /ImageType known not { - //CompleteImage exec - dup /ImageType 1 put - dup /ColorSpace known { - dup /ColorSpace //CheckColorSpace //ResolveD exec - dup type /arraytype eq { - //ResolveColorSpaceArray exec - //SubstitutePDFColorSpace exec - 1 index exch /ColorSpace exch put - } { - pop - } ifelse - } if - } if - //PDFR_DEBUG { - (CompleteOutlineImage end) = - } if - exch setglobal -} bind def - -/DoImage % <image_dict> DoImage - -{ - //PDFR_DEBUG { - (DoImage beg) = - } if - gsave - dup /ColorSpace //knownget exec { setcolorspace } if - dup /ImageMask //knownget exec not { false } if - { imagemask } { image } ifelse - grestore - //PDFR_DEBUG { - (DoImage end) = - } if -} bind def - -% ===================== Viewer State =============== - -/GSave % - GSave - -{ - gsave - //PDFReader /GraphicStateStackPointer get - dup //GraphicStateStack exch get null eq { - dup //GraphicStateStack exch //InitialGraphicState length dict put - } if - dup //GraphicStateStack exch get - //GraphicState exch copy pop - 1 add //PDFReader exch /GraphicStateStackPointer exch put -} bind def - -/GRestore % - GRestore - -{ - grestore - //PDFReader /GraphicStateStackPointer get - 1 sub dup - //PDFReader exch /GraphicStateStackPointer exch put - //GraphicStateStack exch get - //GraphicState copy pop -} bind def - - -% ===================== Interpret Data Streams =============== - -/SetFont % <resource_name> <size> SetFont - -{ dup //GraphicState exch /FontSize exch put - //ResolveAndSetFont exec - //GraphicState /FontMatrixNonHV currentfont /FontMatrix get 1 get 0 ne put -} bind def - -/ShowText % <string> ShowText - -{ //GraphicState /TextRenderingMode get 0 eq { - //GraphicState /WordSpacing get 0 - 32 - //GraphicState /CharacterSpacing get 0 - 6 5 roll - //GraphicState /FontMatrixNonHV get { - % Use xshow to force wy in text space to be 0 (PDF1.7 5.3.3 "Text Space Details") - %stack: wordspacing_wx wordspacing_wy space_char charspacing_wx charspacing_wy string - [ % wwx wwy sp cwx cwy str [ - 7 -2 roll pop % sp cwx cwy str [ ww - 5 -2 roll pop % sp str [ ww cw - 5 -1 roll % str [ ww cw sp - { % str [ ... ww cw sp c wx wy - exch % will be removed, unless FontMatrix.xx == 0 (FontMatrixNonHV already true) - pop % str [ ... ww cw sp c w - 3 index add % str [ ... ww cw sp c w+cw - exch 2 index eq { 3 index add } if % str [ ... ww cw sp w+cw[+ww] - 4 1 roll % str [ ... w+cw[+ww] ww cw sp - } - currentfont /FontMatrix get 0 get 0 ne { - 1 1 index length 1 sub getinterval cvx % drop the "exch" - } if - 5 index % str [ ww cw sp {cshowproc} str - cshow % str [ widths... ww cw sp - pop pop pop ] % str [widths...] - xshow - } { - awidthshow - } ifelse - } { - //GraphicState /CharacterSpacing get 0 eq - //GraphicState /FontMatrixNonHV get not and - //GraphicState /WordSpacing get 0 eq and { - true charpath - } { - % Emulate with "{ charpath } cshow". - % Not sure how it works with CID fonts. - { % c wx wy - exch % will be removed, unless FontMatrixNonHV && FontMatrix.xx == 0 - pop 0 % (PDF1.7 5.3.3 "Text Space Details") - currentpoint 5 4 roll % wx wy x y c - ( ) dup 0 3 index put true charpath % wx wy x y c - 5 1 roll % c wx wy x y - moveto rmoveto % c - //GraphicState /CharacterSpacing get 0 rmoveto % c - 32 eq { % - //GraphicState /WordSpacing get 0 rmoveto - } if - } - //GraphicState /FontMatrixNonHV get dup not exch { - pop currentfont /FontMatrix get 0 get 0 ne - } if { - 1 1 index length 1 sub getinterval cvx - } if - exch cshow - } ifelse - } ifelse -} bind def - -/ShowTextBeg % - ShowTextBeg - -{ //GraphicState /TextRenderingMode get 0 ne { - currentpoint newpath moveto - } if -} bind def - -/ShowTextEnd % - ShowTextEnd - -{ //GraphicState /TextRenderingMode get - { dup 1 eq { - stroke exit - } if - dup 2 eq { - gsave fill grestore stroke exit - } if - dup 3 eq { - currentpoint newpath moveto - } if - dup 4 eq { - gsave fill grestore clip exit - } if - dup 5 eq { - gsave stroke grestore clip exit - } if - dup 6 eq { - gsave fill grestore gsave stroke grestore fill exit - } if - dup 7 eq { - clip exit - } if - exit - } loop - pop -} bind def - -/ShowTextWithGlyphPositioning % <array> ShowTextWithGlyphPositioning - -{ //ShowTextBeg exec - { dup type /stringtype eq { - //ShowText exec - } { - neg 1000 div //GraphicState /FontSize get mul 0 rmoveto - } ifelse - } forall - //ShowTextEnd exec -} bind def - -/CheckFont % key val CheckFont key val -{ dup /Type get /ExtGState ne { - mark (Resource ) 3 index ( must have /Type/ExtGState.) //error exec - } if -} bind def - -/SetTransfer % <operand> SetTransfer - -{ - //PDFR_DEBUG { (SetTransfer beg ) print count = } if - dup type /arraytype eq 1 index xcheck not and { - 0 4 getinterval aload pop - setcolortransfer - } { - settransfer - } ifelse - //PDFR_DEBUG { (SetTransfer end ) print count = } if -} bind def - -/CheckExtGState % <id> <obj> CheckExtGState <id> <obj> -{ dup /Type get /ExtGState ne { - mark (Resource ) 3 index ( must have /Type/ExtGState.) //error exec - } if -} bind def - -/CheckHalftone % <id> <obj> CheckHalftone <id> <obj> -{ dup /HalftoneType known not { - mark (Resource ) 3 index ( must have /HalftoneType.) //error exec - } if -} bind def - -/ResolveFunction % <dict> <name> ResolveFunction <dict> <proc> -{ - //PDFR_DEBUG { (ResolveFunction beg ) print dup = count = } if - 2 copy get //IsObjRef exec { - 2 copy //DoNothing //ResolveD exec - 3 copy put pop - } if - 2 copy get dup type /arraytype eq exch xcheck and not { - 2 copy get - dup type /arraytype eq 1 index xcheck not and { - dup length 1 sub -1 0 { - 2 copy //DoNothing ResolveA - dup /Identity eq { - pop 2 copy {} put - } { - //FunctionToProc exec - 3 copy put pop - } ifelse - pop - } for - } { - dup /Default eq { - % Leave it. ExtGState methods will resolve. - } { - dup /Identity eq { - pop {} - } { dup type /nametype eq { - //spotfunctions exch get - } { - //FunctionToProc exec - } ifelse - } ifelse - } ifelse - } ifelse - 3 copy put - exch pop - } { - 1 index exch get - } ifelse - //PDFR_DEBUG { (ResolveFunction end ) print dup == count = } if -} bind def - -/ResolveFunctionSafe % <dict> <name> ResolveFunctionSafe <dict> -{ 2 copy known { - //ResolveFunction exec - } if - pop -} bind def - -/CreateHalftoneThresholds % <halftone_dict> CreateHalftoneThresholds <halftone_dict> -{ - dup /Thresholds known not { - dup /HalftoneType get 10 eq { - dup dup //MakeStreamReader exec - /Thresholds exch put - } if - dup /HalftoneType get dup 3 eq exch 6 eq or { - dup dup //MakeStreamReader exec - //BlockBuffer readstring pop - dup length - dup 0 eq { - mark (Could not read Thresholds) //error exec - } if - string copy /Thresholds exch put - dup /HalftoneType 3 put % replace Type 6 with Type 3. - } if - } if -} bind def - - -/SetExtGState % <name> SetExtGState - -{ - //PDFReader /CurrentObject get /Context get /Resources get - /ExtGState //DoNothing //ResolveD exec - exch //CheckExtGState //ResolveD exec % s gs - dup /LW //knownget exec { - setlinewidth - } if - dup /LC //knownget exec { - setlinecap - } if - dup /LJ //knownget exec { - setlinejoin - } if - dup /ML //knownget exec { - setmeterlimit - } if - dup /D //knownget exec { - setdash - } if - dup /RI //knownget exec { - % Ghostscript never writes it. - mark (Unimplemented ExtGState.RI) //error exec - } if - dup /OP //knownget exec { - % pdfwrite must take care of stroking/filling - setoverprint - } if - dup /op //knownget exec { - setoverprint - } if - dup /OPM //knownget exec { - % pdfwrite must take care of. - mark (Unimplemented ExtGState.OPM) //error exec - } if - dup /Font //knownget exec { - % Ghostscript never writes it. - mark (Unimplemented ExtGState.Font) //error exec - } if - dup /BG known { - /BG //ResolveFunction exec - setblackgeneration - } if - dup /BG2 known { - /BG2 //ResolveFunction exec - dup /Default eq { - //InitialExtGState /BG2 get - } if - setblackgeneration - } if - dup /UCR known { - /UCR //ResolveFunction exec - setundercolorremoval - } if - dup /UCR2 known { - /UCR2 //ResolveFunction exec - dup /Default eq { - //InitialExtGState /UCR2 get - } if - setundercolorremoval - } if - dup /TR known { - /TR //ResolveFunction exec - //SetTransfer exec - } if - dup /TR2 known { - /TR2 //ResolveFunction exec - dup /Default eq { - pop //InitialExtGState /TR2 get - aload pop setcolortransfer - } { - //SetTransfer exec - } ifelse - } if - dup /HT //knownget exec { - dup /Default eq { - pop //InitialExtGState /HT get - sethalftone - } { - //PDFR_DEBUG { (Ht beg) = } if - pop dup /HT //CheckHalftone //ResolveD exec - /SpotFunction //ResolveFunctionSafe exec - /TransferFunction //ResolveFunctionSafe exec - null exch - dup /HalftoneType get dup 5 eq exch dup 4 eq exch 2 eq or or { - dup { % null h n v - dup //IsObjRef exec { - pop - 1 index exch //CheckHalftone ResolveD - } if - dup type /dicttype eq { - dup /SpotFunction //ResolveFunctionSafe exec - /TransferFunction //ResolveFunctionSafe exec - //CreateHalftoneThresholds exec - dup /HalftoneType get 5 gt { % null h n v - 4 3 roll pop - dup 4 1 roll - } if - } if - pop pop - } forall - } if - //CreateHalftoneThresholds exec - //PDFR_DEBUG { - (HT:)= - dup { - 1 index /Default eq { - (Default <<)= - exch pop - { exch = == } forall - (>>)= - } { - exch = == - } ifelse - } forall - (HT end)= flush - } if - exch dup null ne { - (Warning: Ignoring a halftone with a Level 3 component halftone Type ) print dup /HalftoneType get = - pop pop - } { - pop - dup /HalftoneType get 5 gt { - (Warning: Ignoring a Level 3 halftone Type ) print dup /HalftoneType get = - pop - } { - sethalftone - } ifelse - } ifelse - //PDFR_DEBUG { (HT set)= flush } if - } ifelse - } if - dup /FL //knownget exec { - setflattness - } if - dup /SM //knownget exec { - setsmoothness - } if - dup /SA //knownget exec { - setstrokeadjust - } if - dup /BM //knownget exec { - % pdfwrite must take care of. - mark (Unimplemented ExtGState.BM) //error exec - } if - dup /SMask //knownget exec { - % pdfwrite must take care of. - mark (Unimplemented ExtGState.SMask) //error exec - } if - dup /CA //knownget exec { - % pdfwrite must take care of. - mark (Unimplemented ExtGState.CA) //error exec - } if - dup /ca //knownget exec { - % pdfwrite must take care of. - mark (Unimplemented ExtGState.ca) //error exec - } if - dup /AIS //knownget exec { - % pdfwrite must take care of. - mark (Unimplemented ExtGState.AIS) //error exec - } if - dup /TK //knownget exec { - % pdfwrite must take care of. - mark (Unimplemented ExtGState.TK) //error exec - } if - pop -} bind def - -/CheckXObject % <id> <obj> CheckHalftone <id> <obj> -{ dup /Subtype get dup /Image ne exch dup /Form ne exch /PS ne and and { - mark (Resource ) 3 index ( must have /Subtype /Image or /Form or /PS.) //error exec - } if -} bind def - -/DoXObject % <name> DoXObject - -{ - //PDFReader /CurrentObject get /Context get /Resources get - /XObject //DoNothing //ResolveD exec - exch //CheckXObject //ResolveD exec - dup /Subtype get - dup /Image eq { - pop - //CompleteOutlineImage exec - //DoImage exec - } { - dup /PS eq { - PDFR_DEBUG { - (Executing a PS Xobject) = - } if - pop - //RunDelayedStream exec - } { - dup /Form eq { - pop - PDFR_DEBUG { - (Executing a Form XObject) = - } if - //PDFReader /CurrentObject get exch - dup //PDFReader exch << exch /Context exch >> /CurrentObject exch put - dup /Matrix get concat - dup /BBox get aload pop exch 3 index sub exch 2 index sub rectclip - //RunDelayedStream exec - //PDFReader exch /CurrentObject exch put - } { - mark exch (unimplemented XObject type ) exch //error exec - } ifelse - } ifelse - } ifelse -} bind def - -/Operators 50 dict begin - /q { //GSave exec } bind def - /Q { //GRestore exec } bind def - /cm { //TempMatrix astore concat } bind def - /i { 1 .min setflat } bind def - /J /setlinecap load def - /d /setdash load def - /j /setlinejoin load def - /w /setlinewidth load def - /M /setmiterlimit load def - /gs { SetExtGState } bind def - - /g /setgray load def - /rg /setrgbcolor load def - /k /setcmykcolor load def - /cs { //ResolveColorSpace exec //SetColorSpaceSafe exec - } bind def - /sc /setcolor load def - /scn { //SetColor exec } bind def - /G /setgray load def - /RG /setrgbcolor load def - /K /setcmykcolor load def - /CS //cs def - /ri { SetColorRenderingIntent } bind def - /SC /setcolor load def - /SCN { //SetColor exec } bind def - - /m /moveto load def - /l /lineto load def - /c /curveto load def - /v { currentpoint 6 2 roll curveto } bind def - /y { 2 copy curveto } bind def - /re { - 4 2 roll moveto exch dup 0 rlineto 0 3 -1 roll rlineto neg 0 rlineto - closepath - } def - /h /closepath load def - /n /newpath load def - /S /stroke load def - /s { closepath stroke } bind def - /f /fill load def - /f* /eofill load def - /B { gsave fill grestore stroke } bind def - /b { closepath gsave fill grestore stroke } bind def - /B* { gsave eofill grestore stroke } bind def - /b* { closepath gsave eofill grestore stroke } bind def - /W /clip load def - /W* /eoclip load def - /sh { % Reserved for ps3write. - ResolveShading - dup /Background known { - gsave - dup /ColorSpace get setcolorspace - dup /Background get aload pop setcolor - pathbbox % x0 y0 x1 y1 - 2 index sub exch 3 index sub exch - rectfill - grestore - } if - shfill - } bind def - - /Do { //DoXObject exec } bind def - - /BI { currentglobal false setglobal << } bind def - /ID { >> - dup /DataSource currentfile - % HACK BEG - % This hack provides a compatibility to HP LaserJet 1320, - % which sometimes closes the underlying stream when EOD - % is reached in the ASCII85Decode filter. - % This portion is not required by the Postscript language definition. - 2 index /F //knownget exec { - /A85 eq { - 0 (~>) /SubFileDecode filter - } if - } if - % HACK END - put - //CompleteInlineImage exec - exch setglobal - //DoImage exec - } bind def - /EI {} bind def - - /BT { gsave //GraphicState /InitialTextMatrix get currentmatrix pop } bind def - /ET { grestore } bind def - /Tc { //GraphicState exch /CharacterSpacing exch put } bind def - /TL { //GraphicState exch /TextLeading exch put } bind def - /Tr { //GraphicState exch /TextRenderingMode exch put } bind def - /Ts { % Ghostscript never generates it. - mark (Unimplemented SetTextRise) //error exec - } bind def - /Tw { //GraphicState exch /WordSpacing exch put } bind def - /Tz { % Ghostscript never generates it. - mark (Unimplemented SetHorizontalTextScaling) //error exec - } bind def - /Td { translate 0 0 moveto } bind def - /TD { dup neg //TL exec //Td exec } bind def - /Tm { //GraphicState /InitialTextMatrix get setmatrix - //TempMatrix astore concat - 0 0 moveto } bind def - /T* { 0 //GraphicState /TextLeading get neg //Td exec } bind def - /Tj { //ShowTextBeg exec //ShowText exec //ShowTextEnd exec } bind def - /' { //T* exec //ShowText exec //ShowTextEnd exec } bind def - /" { 3 2 roll //Tw exec exch //Tc exec //' exec} bind def - /TJ //ShowTextWithGlyphPositioning def - /Tf //SetFont def - - /d0 /setcharwidth load def - /d1 /setcachedevice load def - - /BDC { pop pop } bind def - /BMC { pop } bind def - /EMC { } bind def - /BX { BeginCompatibilitySection } bind def - /EX { EndCompatibilitySection } bind def - /DP { DefineMarkedContentPointWithPropertyList } bind def - /MP { DefineMarkedContentPoint } bind def - /PS { cvx exec } bind def -currentdict end def - -//PDFR_STREAM { - % Rebind operators with a debug tracing. - //Operators length dict begin - //Operators { % n p - exch dup % p n n - [ exch //=only /exec load % p n [ n =only exec - ( ) /print load % p n [ n =only exec () print - 8 7 roll % n [ n =only exec () print p - dup type /arraytype eq { - /exec load % n [ n =only exec () print p exec - } if - ( ) /print load - ] cvx % n {} - def - } forall - currentdict end /Operators exch def -} if - -% Functions for handling Ghostscript library files that define encodings. - -/.registerencoding -{ pop pop -} bind def - -/.defineencoding -{ def -} bind def - -/.findencoding -{ load -} bind def - - -% Leaving the procset on the dictionary stack to provide -% definitions of obj, endobj, stream, endstream, R, xref. -%%EndPrologue diff --git a/Master/tlpkg/tlgs/lib/pdfopt.ps b/Master/tlpkg/tlgs/lib/pdfopt.ps index 74cb91994db..88a8943f278 100644 --- a/Master/tlpkg/tlgs/lib/pdfopt.ps +++ b/Master/tlpkg/tlgs/lib/pdfopt.ps @@ -1,4 +1,5 @@ -% Copyright (C) 2000, 2001 Aladdin Enterprises. All rights reserved. +% Copyright (C) 2001-2012 Artifex Software, Inc. +% All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or % implied. @@ -7,13 +8,11 @@ % modified or distributed except as expressly authorized under the terms % of the license contained in the file LICENSE in this distribution. % -% For more information about licensing, please refer to -% http://www.ghostscript.com/licensing/. For information on -% commercial licensing, go to http://www.artifex.com/licensing/ or -% contact Artifex Software, Inc., 101 Lucas Valley Road #110, -% San Rafael, CA 94903, U.S.A., +1(415)492-9861. +% 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. +% -% $Id$ % PDF linearizer ("optimizer"). .currentglobal true .setglobal @@ -1010,6 +1009,8 @@ userdict /clostreams 20 dict put % stream -> [data endproc] 40 dict begin /IDict exch def /OFile exch def + % Disable check for the max object number because pdfopt adds new objects. + /NumObjects 16#7fffffff store /starttime exch def /ToWrite 100 dict def /now { diff --git a/Master/tlpkg/tlgs/lib/stcinfo.ps b/Master/tlpkg/tlgs/lib/stcinfo.ps deleted file mode 100644 index d39b182d4fe..00000000000 --- a/Master/tlpkg/tlgs/lib/stcinfo.ps +++ /dev/null @@ -1,794 +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. -% - -% stcinfo.ps -% Epson Stylus-Color Printer-Driver - -% The purpose of this file is to print & show Parameters of the -% stcolor-driver. If not run on ghostscript/stcolor, it prints -% something like a color-chart. - -% use either existing STCinfo-dictionary, retrieve new one or create dummy - -statusdict begin product end -dup (Ghostscript) eq 1 index (Artifex Ghostscript) eq or -exch (AFPL Ghostscript) eq or{ - - currentdevice getdeviceprops .dicttomark - dup /Name get (stcolor) eq /STCi_onstc exch def - /STCinfo where {/STCinfo get exch pop} if - /STCinfo exch def - -}{ - - /STCinfo 10 dict def - STCinfo begin /Name (unknown) def end - /STCi_onstc false def - -}ifelse - -% Next Block are procedures to generate the color-triangles. -% you may wish to separate them, just look ahead for the name -% given in the next line to achieve that. -% Begin: colortri_procedures - -% Plot the CIE-XY-triangle (or something like that) - -% /colortri_mat Conversion matrix RGB -> XYZ -% /colortri_bg procedure, that takes X/Y-Values and delivers the -% "background color" as RGB-Values, default is: -% {pop pop 0.85 dup dup} - -% The default matrix was taken from: -% Color spaces FAQ - David Bourgin -% Date: 15/6/94 (items 5.3 and 6 updated) -% Last update: 29/6/94 - - /colortri_mat [ % RGB -> CIE XYZitu601-1 (D65) - 0.4306 0.3415 0.1784 - 0.2220 0.7067 0.0713 - 0.0202 0.1295 0.9394 - ] def - - /colortri_bg {pop pop 0.85 dup dup} bind def - -% +---------------------------------------------------------------------+ -% | Besides from fixing bugs, nothing should be changed below this line | -% +---------------------------------------------------------------------+ - -% Arbitrary operation on a pair of vectors, *CHANGES* 1st. -% invoke: Vaccu Vop op vop - /vop { - bind 0 1 3 index length 1 sub { - 3 index 1 index get 3 index 2 index get 3 index exec 4 index 3 1 roll put - } for pop pop - } bind def - - /vsub { {sub} vop } bind def % subtract two vectors - /vmul { {mul} vop } bind def % multiply two vectors - -% Compute sum of vectors elements - /vsum {0.0 exch{add}forall} bind def - -% Sum up products of elements - /veqn { [ 3 -1 roll {} forall ] exch vmul vsum } bind def - -% Find index of |maximum| in array - /imax { - dup 0 get abs 0 exch % array i v[i] - 1 1 4 index length 1 sub { - 3 index 1 index get abs dup 3 index gt {4 2 roll}if pop pop - } for - 3 -1 roll pop - } bind def - -% Procedure to *CHANGE* RGB-Values into XYZ-Values - /rgb2xyz { - 0 3 6 { colortri_mat exch 3 getinterval 1 index veqn exch } for astore - } bind def - -% Procedure to *CHANGE* transform rgb->xy - /rgb2xy { - rgb2xyz - dup 0 get 1 index 1 get 2 index vsum % XYZ X Y sum - dup 0 ne { - exch 1 index div 3 1 roll div % XYZ y x - 2 index exch 0 exch put % xYZ y - 1 index exch 1 exch put % xyZ - }{ - pop pop pop dup 0 0 put dup 0 1 put - } ifelse - 0 2 getinterval - } bind def - -% So here we go with our procedure - -/colortri { %Usage: box #pixels - save - 1 index type /arraytype eq {exch 8}{3 1 roll} ifelse % Default scale - /colortri_scale exch def - /colortri_box exch def - -% Prepare some useful constants for xy -> RGB conversion - - /colsum [ % Array with column-sums - 0 1 2{0 exch 3 1 index 6 add{colortri_mat exch get add}for}for - ] def - - /Xrow colortri_mat 0 3 getinterval def % two rows from colortri_mat - /Yrow colortri_mat 3 3 getinterval def - -% Avoid allocating new arrays - /xcoeff 3 array def - /ycoeff 3 array def - -% Procedure to derive RGB-Values form X,Y - /xy2rgb{ aload pop - dup dup dup ycoeff astore colsum vmul Yrow vsub imax - 3 index dup dup xcoeff astore colsum vmul Xrow vsub imax - 3 -1 roll 1 index 1 index gt{ - xcoeff ycoeff /xcoeff exch def /ycoeff exch def pop 3 -1 roll pop - }{ - 3 1 roll pop pop - } ifelse - 1e-6 lt { % No Pivot ? - pop colortri_bg xcoeff astore pop - }{ % Have a Pivot - dup ycoeff exch get neg - 0 1 2 { dup ycoeff exch get 2 index div ycoeff 3 1 roll put} for - pop ycoeff 1 index 0 put - - xcoeff 1 index get - 0 1 2 { - ycoeff 1 index get 2 index mul xcoeff 2 index get add - xcoeff 3 1 roll put - } for - pop xcoeff 1 index 0 put - xcoeff imax 1e-6 lt { % no Pivot ? - pop pop colortri_bg xcoeff astore pop - }{ - dup 2 index or 3 exch sub - xcoeff 1 index get xcoeff 3 index get div neg - xcoeff exch 3 index exch put - xcoeff 1 index 1 put - ycoeff exch get ycoeff 2 index get xcoeff 4 -1 roll get mul add - xcoeff 3 1 roll put - 0 1 2 { - xcoeff exch get dup -0.0015 lt exch 1.0015 gt or { - colortri_bg xcoeff astore dup exit - } if - } for - pop pop xcoeff - } ifelse - } ifelse - } bind def - -% Compute the displayed range - [ 1 1 1 ] rgb2xy - dup 0 get /colortri_x0 exch def /colortri_dx colortri_x0 def - 1 get /colortri_y0 exch def /colortri_dy colortri_y0 def - [[0 0 1][0 1 0][0 1 1][1 0 0][1 0 1][1 1 0]] { - rgb2xy - dup 0 get - dup colortri_x0 lt {/colortri_x0 1 index def}if - dup colortri_dx gt {/colortri_dx 1 index def}if - pop 1 get - dup colortri_y0 lt {/colortri_y0 1 index def}if - dup colortri_dy gt {/colortri_dy 1 index def}if - pop - } forall - colortri_dx colortri_x0 sub /colortri_dx exch def - colortri_dy colortri_y0 sub /colortri_dy exch def -% - -% determine the scale - colortri_box 2 get colortri_box 0 get sub colortri_dx div % fx - colortri_box 3 get colortri_box 1 get sub colortri_dy div % fx fy - gt { % fy limits - colortri_box 3 get colortri_box 1 get sub - dup colortri_dx mul colortri_dy div exch - }{ % fx limits - colortri_box 2 get colortri_box 0 get sub - dup colortri_dy mul colortri_dx div - } ifelse - dtransform abs colortri_scale div cvi /colortri_ny exch def - abs colortri_scale div cvi /colortri_nx exch def - colortri_nx colortri_scale mul colortri_ny colortri_scale mul - idtransform abs exch abs exch - colortri_box 0 get colortri_box 2 get 1 index sub 3 index sub 2 div add - colortri_box 1 get colortri_box 3 get 1 index sub 3 index sub 2 div add - transform .5 add cvi exch .5 add cvi exch itransform - translate scale - -% String & indices - /colortri_tmp colortri_nx 3 mul string def - /colortri_dx colortri_dx colortri_nx 1 sub div def - /colortri_dy colortri_dy colortri_ny 1 sub div def - /colortri_xy [ colortri_x0 colortri_y0 ] def - /colortri_ie colortri_tmp length 3 sub def - - colortri_nx colortri_ny 8 [ colortri_nx 0 0 colortri_ny 0 0 ] - { - colortri_xy 0 colortri_x0 put - 0 3 colortri_ie { - colortri_tmp exch % buf ir - colortri_xy xy2rgb % buf ir rgb buf ib - 2 index 2 index 2 add 2 index 2 get 255 mul cvi put - 2 index 2 index 1 add 2 index 1 get 255 mul cvi put - 0 get 255 mul cvi put - colortri_xy dup 0 exch 0 get colortri_dx add put - }for - colortri_xy dup 1 exch 1 get colortri_dy add put - colortri_tmp - } bind - false 3 colorimage - restore -} bind def - -% [ newpath clippath pathbbox ] colortri showpage % standalone usage - -% End: colortri_procedures - -% The next section is a group of procedures, that I for myself -% do no more fully understand, but they do the Job. - -% Begin: stcinfo_procedures_1 - -% fetch a parameter from the dictionary -/STCiget { STCinfo exch get } bind def - -% action upon ProcessColorModel -/STCimode { - /ProcessColorModel STCiget dup - /DeviceCMYK eq{pop 2}{/DeviceRGB eq{1}{0}ifelse}ifelse get exec -} bind def - -% print given number of blanks -/STCipspace { - dup 0 gt{ 1 exch 1 exch { pop ( ) print}for }{ pop } ifelse -} bind def - -% print right or left-justified text -/STCiprint { - dup 0 gt { dup 2 index length sub STCipspace } if - 1 index print - dup 0 lt { neg dup 2 index length sub STCipspace } if - pop pop -} bind def - -% floating-point to fixed-length-string conversion - -/STCicvs { % number -> string - -% Prepare the result - 8 string dup 0 ( ) putinterval - exch - -% Make it unsigned - dup 0 lt {neg(-)}{( )}ifelse 0 get exch - - dup 1000 lt 1 index 0 eq 2 index 0.001 ge or and { % floating point - (e+) 0 - }{ % engineering - 0 { - 1 index 1000.0 ge - {3 add exch 1000 div exch} - {1 index 1 lt {3 sub exch 1000 mul exch}{exit}ifelse} - ifelse - }loop - dup 0 lt {neg(e-)}{(e+)}ifelse exch - }ifelse - -% string sign num esig e - -% always up to three Integer Digits plus sign - 2 index cvi 3 { % string sign num esig e int ind - 1 index 10 div cvi dup 10 mul 3 index exch sub cvi - (0123456789) exch get 8 index exch 3 index exch put - 3 -2 roll 1 sub exch pop dup 0 eq 2 index 0 eq or {exit} if - } loop exch pop % string sign num esig e ind - 5 index exch 6 -1 roll put % string num esig e - -% print either fraction or exponent - dup 0 eq { pop pop dup cvi sub % String fraction - - dup 0.0 ne { % Fraction present - 0.0005 add 1 index 4 (.) putinterval - 5 1 7 { % string frac ind - exch 10 mul dup cvi exch 1 index sub % string ind ic nfrac - exch (0123456789) exch get 3 -1 roll % string nfrac chr ind - exch 3 index 3 1 roll put - } for - } if - pop - - }{ 3 -1 roll pop % string esig e - - exch 2 index exch 4 exch putinterval - 7 -1 6 { % string n i - 1 index 10 div cvi dup 10 mul 3 index exch sub cvi % string n i n/10 - (0123456789) exch get 4 index exch 3 index exch put - exch pop exch pop - } for - pop - } ifelse - -} bind def - -% compute colorvalue-steps from transfer & coding -/STCisteps { % xfer, coding => X-values, Y-Values -% 2^nbits - 2 /BitsPerComponent STCiget dup 11 gt { pop 11 } if exp cvi - -% X & Y - Arrays (stack: xv:4 yv:3 xfer:2 coding:1 2^ni:0) - dup 1 add array 1 index array 5 2 roll - -% compute GS-Color-Value according to the coding-array - - 1 index null eq { % no coding present - - 0 1 2 index 1 sub { - dup 6 index exch dup 4 index div put - 4 index exch dup 3 index 1 sub div put - } for - - }{ % coding-array given - - 1.0 1 index 1 sub div % y step - 0 % current index - 0 1 4 index 1 sub { % over indices - dup 3 index mul - { - dup 3 index 1 add dup 8 index length ge {pop pop exit} if % i y - 7 index exch get le {exit} if - 2 index 1 add 3 1 roll 4 -1 roll pop - } loop - 5 index 3 index get sub - 5 index 3 index 1 add get 6 index 4 index get sub div - 2 index add 5 index length 1 sub div - 2 copy exch dup 0 eq { - 10 index exch 0.0 put pop - }{ - dup 10 index exch 1 sub get 3 -1 roll add 2 div - 10 index 3 1 roll put - }ifelse - 7 index 3 1 roll put - } for % over indices - pop pop - } ifelse - 4 index 1 index 1.0 put - -% Replace the raw y-values by those computed from the transfer-array - - 0 1 2 index 1 sub { % over indices, 2nd - dup 5 index exch get - dup 5 index length 1 sub mul cvi % -> iy - 5 index 1 index get - 1 index 1 add 7 index length lt { - dup 7 index 3 index 1 add get exch sub - 3 index 3 index 9 index length 1 sub div sub mul - 7 index length 1 sub mul add - } if - exch pop exch pop 5 index 3 1 roll put - } for % over indices, 2nd - - pop pop pop -} bind def - -/STCibar { % Window X-Values proc => Window - 0 1 3 index length 2 sub { - dup 3 index exch get exch - 1 add 3 index exch get - dup 2 index add 2 div 3 index exec % Color to average - 4 index 2 get 5 index 0 get sub exch 1 index mul 5 index 0 get add 3 1 roll - mul 4 index 0 get add 4 index 3 get 5 index 1 get - newpath - 2 index 1 index moveto - 3 index 1 index lineto - 3 index 2 index lineto - 2 index 2 index lineto - closepath fill - pop pop pop pop - } for - pop pop - 0 setgray - newpath - dup 0 get 1 index 1 get moveto - dup 2 get 1 index 1 get lineto - dup 2 get 1 index 3 get lineto - dup 0 get 1 index 3 get lineto - closepath stroke - pop -} bind def - -% End: stcinfo_procedures_1 - -% Begin: stcinfo_preparation - -% Compute used area from clippath - -/STCi_clip [ - newpath clippath pathbbox - 2 sub 4 1 roll 2 sub 4 1 roll 2 add 4 1 roll 2 add 4 1 roll -] def - -% -% Perpare the texual messages, assume no stcolor if this fails -% -{ - /STCi_stopped % A Special Mark - -% Textual Parameters (an array of pairs of strings) - /STCi_l1 0 def - /STCi_l2 0 def - /STCi_text [ -% Driver-Name & Version - (Parameters of) - /Name STCiget length /Version STCiget length add 1 add string - dup 0 /Name STCiget putinterval dup /Name STCiget length (-)putinterval - dup /Name STCiget length 1 add /Version STCiget putinterval -% Dithering-Algorithm - (Dithering) - /Dithering STCiget - [{( \(Monochrome\))}{( \(RGB\))}{( \(CMYK\))}] STCimode - dup length 2 index length add string exch 1 index exch - 3 index length exch putinterval dup 3 1 roll exch 0 exch putinterval -% Flags for the algorithm - (Flag4-0) 5 string - dup 0 /Flag4 STCiget {(T)}{(f)} ifelse putinterval - dup 1 /Flag3 STCiget {(T)}{(f)} ifelse putinterval - dup 2 /Flag2 STCiget {(T)}{(f)} ifelse putinterval - dup 3 /Flag1 STCiget {(T)}{(f)} ifelse putinterval - dup 4 /Flag0 STCiget {(T)}{(f)} ifelse putinterval - -% Bits Per Pixel & Bits Per Component - (BitsPerPixel) 10 string % (nn -> nxnn) - /BitsPerPixel STCiget 1 index cvs length % string used - dup 2 index exch ( -> ) putinterval 4 add dup 2 add exch 2 index exch - [{(1x)}{(3x)}{(4x)}] STCimode putinterval % String used - /BitsPerComponent STCiget 2 index 2 index 2 getinterval cvs length add - 0 exch getinterval - - () () -% ColorAdjustMatrix - (ColorAdjustMatrix) - /ColorAdjustMatrix STCiget dup null eq { - pop (default) - }{ - { STCicvs } forall - [{ % Monochrome - 26 string - dup 0 6 -1 roll putinterval dup 8 ( ) putinterval - dup 9 5 -1 roll putinterval dup 17 ( ) putinterval - dup 18 4 -1 roll putinterval - }{ % RGB - 26 string - dup 0 12 -1 roll putinterval dup 8 ( ) putinterval - dup 9 11 -1 roll putinterval dup 17 ( ) putinterval - dup 18 10 -1 roll putinterval - - () 26 string - dup 0 11 -1 roll putinterval dup 8 ( ) putinterval - dup 9 10 -1 roll putinterval dup 17 ( ) putinterval - dup 18 9 -1 roll putinterval - - () 26 string - dup 0 10 -1 roll putinterval dup 8 ( ) putinterval - dup 9 9 -1 roll putinterval dup 17 ( ) putinterval - dup 18 8 -1 roll putinterval - }{ - 35 string - dup 0 19 -1 roll putinterval dup 8 ( ) putinterval - dup 9 18 -1 roll putinterval dup 17 ( ) putinterval - dup 18 17 -1 roll putinterval dup 26 ( ) putinterval - dup 27 16 -1 roll putinterval - - () 35 string - dup 0 17 -1 roll putinterval dup 8 ( ) putinterval - dup 9 16 -1 roll putinterval dup 17 ( ) putinterval - dup 18 15 -1 roll putinterval dup 26 ( ) putinterval - dup 27 14 -1 roll putinterval - - () 35 string - dup 0 15 -1 roll putinterval dup 8 ( ) putinterval - dup 9 14 -1 roll putinterval dup 17 ( ) putinterval - dup 18 13 -1 roll putinterval dup 26 ( ) putinterval - dup 27 12 -1 roll putinterval - - () 35 string - dup 0 13 -1 roll putinterval dup 8 ( ) putinterval - dup 9 12 -1 roll putinterval dup 17 ( ) putinterval - dup 18 11 -1 roll putinterval dup 26 ( ) putinterval - dup 27 10 -1 roll putinterval - - } - ] STCimode - } ifelse - () () - -% Printer Model - (Printer-Model) /Model STCiget - -% Resolution - (Resolution) 15 string % (nnnnnxnnnnn DpI) - /HWResolution STCiget 0 get cvi 1 index cvs length - dup 2 index exch (x) putinterval 1 add dup 2 index exch 5 getinterval - /HWResolution STCiget 1 get cvi exch cvs length add dup 2 index - exch ( DpI) putinterval 4 add 0 exch getinterval - -% HWsize holds entire Page in Pixels, -% .HWMargins is [left,bottom,right,top] in Points - (Printed Area) 18 string % (nnnnnxnnnnn Pixel) - /HWSize STCiget 0 get /.HWMargins STCiget dup 0 get exch 2 get add - /HWResolution STCiget 0 get mul 72.0 div sub cvi 1 index cvs length - dup 2 index exch (x) putinterval 1 add dup 2 index exch 5 getinterval - /HWSize STCiget 1 get /.HWMargins STCiget dup 1 get exch 3 get add - /HWResolution STCiget 1 get mul 72.0 div sub cvi exch cvs length add - dup 2 index exch ( Pixel) putinterval 6 add 0 exch getinterval - - () () -% WeaveMode - (Weave-Mode) - /noWeave STCiget { - (noWeave) - }{ - /Microweave STCiget {(Microweave)}{(Softweave)}ifelse - }ifelse -% Unidirectional - (Unidirectional) /Unidirectional STCiget {(ON)}{(off)} ifelse -% Output coding - (OutputCode) /OutputCode STCiget -% number of heads - (escp_Band) /escp_Band STCiget 3 string cvs - (escp_Width) /escp_Width STCiget 5 string cvs - (escp_Height) /escp_Height STCiget 5 string cvs - (escp_Top) /escp_Top STCiget 5 string cvs - (escp_Bottom) /escp_Bottom STCiget 5 string cvs - ] def - -% -% compute the Proper X & Y-Arrays -% - [{ % Monochrome - /Ktransfer STCiget /Kcoding STCiget STCisteps - /STCi_yv [ 3 -1 roll ] def - /STCi_xv [ 3 -1 roll ] def - /STCi_col [[0 0 0]] def - /STCi_set [{1.0 exch sub setgray}] def - }{ % RGB - /Rtransfer STCiget /Rcoding STCiget STCisteps - /Gtransfer STCiget /Gcoding STCiget STCisteps - /Btransfer STCiget /Bcoding STCiget STCisteps - exch 4 -1 roll 6 -1 roll exch 3 -1 roll - /STCi_xv [ 5 2 roll ] def - /STCi_yv [ 5 2 roll ] def - /STCi_col [[1 0 0] [0 1 0] [0 0 1]] def - /STCi_set [ - {1.0 exch sub 1 exch dup setrgbcolor} - {1.0 exch sub dup 1 exch setrgbcolor} - {1.0 exch sub dup 1 setrgbcolor} - ] def - }{ % CMYK - /Ctransfer STCiget /Ccoding STCiget STCisteps - /Mtransfer STCiget /Mcoding STCiget STCisteps exch 3 1 roll - /Ytransfer STCiget /Ycoding STCiget STCisteps exch 4 1 roll - /Ktransfer STCiget /Kcoding STCiget STCisteps exch 5 1 roll - /STCi_yv [ 6 2 roll ] def - /STCi_xv [ 6 2 roll ] def - /STCi_col [[0 1 1] [1 0 1] [1.0 0.5 0.0] [0 0 0]] def - /STCi_set [ - { 0 0 0 setcmykcolor } - { 0 exch 0 0 setcmykcolor } - { 0 exch 0 exch 0 setcmykcolor } - { 0 exch 0 exch 0 exch setcmykcolor } - ] def - } - ]STCimode - -} stopped - -{ {/STCi_stopped eq {exit}if}loop true} -{ {/STCi_stopped eq {exit}if}loop false} ifelse - -% End: stcinfo_preparation - -% The Next section does the real job - -% Begin: stcinfo_execution -{ - (%%[ stcinfo.ps: currentdevice is not supported -> colortri ]%%\n) print - STCi_clip colortri % The default action - -}{ -% -% Print the text -% - 0 2 STCi_text length 2 sub { dup 1 add exch - STCi_text exch get length dup STCi_l1 gt{/STCi_l1 exch def}{pop}ifelse - STCi_text exch get length dup STCi_l2 gt{/STCi_l2 exch def}{pop}ifelse - } for - /STCi_l2 STCi_l2 neg def - 0 2 STCi_text length 2 sub { - dup 1 add STCi_text exch get exch STCi_text exch get - 1 index length 0 gt { - dup STCi_l1 STCiprint length 0 gt {(: )}{( )}ifelse print print - }{ - pop pop - } ifelse - (\n) print - } for -% -% Deactivate a present ColorAdjust Matrix, if any -% - /ColorAdjustMatrix STCiget null ne STCi_onstc and { - mark - /ColorAdjustMatrix null - currentdevice putdeviceprops pop - } if -% -% "Show" the text -% - /Times-Roman findfont 10 scalefont setfont - /STCi_l1 0 def - 0 2 STCi_text length 2 sub { - STCi_text exch get stringwidth pop dup STCi_l1 gt { - /STCi_l1 exch def - }{ - pop - } ifelse - } for - STCi_l1 STCi_clip 0 get add /STCi_l1 exch def - - STCi_clip 3 get 12 sub - 0 2 STCi_text length 2 sub { - STCi_text exch get dup length 0 gt { - dup stringwidth pop STCi_l1 exch sub 2 index moveto show - }{ - pop - } ifelse - 12 sub - } for - pop - - /Courier findfont 10 scalefont setfont - /STCi_l2 0 def - 1 2 STCi_text length 1 sub { - STCi_text exch get stringwidth pop dup STCi_l2 gt { - /STCi_l2 exch def - }{ - pop - } ifelse - } for - - STCi_clip 3 get 12 sub - 1 2 STCi_text length 1 sub { - STCi_text exch get dup length 0 gt { - STCi_l1 12 add 2 index moveto show - }{ - pop - } ifelse - 12 sub - } for - pop - -% -% compute the space for the graph-window -% - STCi_l1 12 add STCi_l2 add 12 add dup STCi_clip 2 get exch sub % Extend - [ 3 -1 roll dup 3 index add STCi_clip 3 get dup 5 index sub 3 1 roll ] - /STCi_win exch def /STCi_l1 exch def - -% The "Axis" - newpath - STCi_win 0 get STCi_win 1 get 14 add moveto - STCi_win 2 get STCi_win 1 get 14 add lineto stroke - - STCi_win 0 get 14 add STCi_win 1 get moveto - STCi_win 0 get 14 add STCi_win 3 get lineto stroke - -% The Labels - /Times-Roman findfont 10 scalefont setfont - (Postscript-color) dup stringwidth pop - STCi_win 2 get STCi_win 0 get sub 14 sub 1 index sub 2 div exch pop - STCi_win 0 get add 14 add STCi_win 1 get 4 add moveto show - - gsave - STCi_win 0 get 10 add STCi_win 1 get 14 add translate 90 rotate - (Device-color) dup stringwidth pop - STCi_win 3 get STCi_win 1 get sub 14 sub 1 index sub 2 div exch pop - 0 moveto show - grestore - -% The Graphs - gsave - STCi_win 0 get 14 add STCi_win 1 get 14 add - STCi_win 2 get 2 index sub STCi_win 3 get 2 index sub - 4 2 roll translate - STCi_col 0 1 2 index length 1 sub { - 1 index 1 index get aload pop setrgbcolor - STCi_xv 1 index get STCi_yv 3 -1 roll get - newpath - 1 index 0 get 5 index mul 1 index 0 get 5 index mul moveto - 1 index 1 get 5 index mul 1 index 0 get 5 index mul lineto - 1 1 2 index length 1 sub { - 2 index 1 index get 6 index mul - 2 index 2 index get 6 index mul lineto - 2 index 1 index 1 add get 6 index mul - 2 index 2 index get 6 index mul lineto - pop - } for - stroke pop pop - } for - pop pop pop - grestore - -% -% Find lowest Y from Text or graph -% - STCi_win 1 get STCi_clip 3 get STCi_text length 2 div 12 mul sub - dup 2 index gt { pop } { exch pop } ifelse 12 sub - -% -% compute the upper bar-window -% - /STCi_win [ - STCi_clip 0 get 4 -1 roll 36 sub STCi_clip 2 get 1 index 36 add - ] def - -% -% Draw the required number of graphs -% - [{ % Monochrome - STCi_win STCi_xv 0 get {setgray} STCibar - }{ % RGB - STCi_win STCi_xv 0 get {0 0 setrgbcolor} STCibar - STCi_win dup 1 exch 1 get 47 sub put - STCi_win dup 3 exch 3 get 47 sub put - STCi_win STCi_xv 1 get {0 0 3 1 roll setrgbcolor} STCibar - STCi_win dup 1 exch 1 get 47 sub put - STCi_win dup 3 exch 3 get 47 sub put - STCi_win STCi_xv 2 get {0 0 3 2 roll setrgbcolor} STCibar - }{ % CMYK - STCi_win STCi_xv 0 get {0 0 0 setcmykcolor} STCibar - STCi_win dup 1 exch 1 get 47 sub put - STCi_win dup 3 exch 3 get 47 sub put - STCi_win STCi_xv 1 get {0 0 0 4 1 roll setcmykcolor} STCibar - STCi_win dup 1 exch 1 get 47 sub put - STCi_win dup 3 exch 3 get 47 sub put - STCi_win STCi_xv 2 get {0 0 0 4 2 roll setcmykcolor} STCibar - STCi_win dup 1 exch 1 get 47 sub put - STCi_win dup 3 exch 3 get 47 sub put - STCi_win STCi_xv 3 get {0 0 0 4 3 roll setcmykcolor} STCibar - } - ] STCimode - - STCi_win 1 STCi_clip 1 get put - STCi_win dup 3 exch 3 get 47 sub put - -% -% Plot either one or two Color-Triangles -% - /ColorAdjustMatrix STCiget null ne STCi_onstc and { - STCi_win 0 get STCi_win 2 get add 2 div - [STCi_win 0 get STCi_win 1 get 3 index STCi_win 3 get ] colortri - mark /ColorAdjustMatrix dup STCiget currentdevice putdeviceprops pop - [1 index STCi_win 1 get STCi_win 2 get STCi_win 3 get ] colortri - pop - }{ - STCi_win colortri - } ifelse - newpath clippath stroke -} ifelse -showpage diff --git a/Master/tlpkg/tlgs/lib/stcolor.ps b/Master/tlpkg/tlgs/lib/stcolor.ps deleted file mode 100644 index 105a6ec3949..00000000000 --- a/Master/tlpkg/tlgs/lib/stcolor.ps +++ /dev/null @@ -1,169 +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. -% - -% stcolor.ps -% Epson Stylus-Color Printer-Driver - -% The purpose of this file is to configure the stcolor-printer driver - -% -% It is useless and dangerous to interpret the following code with anything -% else than Ghostscript, so this condition is verified first. If this fails -% a message is send to the output. If this message bothers you, remove it, -% but I prefer to know why the device-setup failed. - -statusdict begin product end -dup (Ghostscript) eq 1 index (Artifex Ghostscript) eq or -exch (AFPL Ghostscript) eq or{ - -% fetch the current device-parameters this is specific for Ghostscript. - - /STCold currentdevice getdeviceprops .dicttomark def - -% Any Ghostscript-Driver has a Name, verify that the selected device is -% stcolor, otherwise nothing than another message will be produced. - - STCold /Name get (stcolor) eq { - -% -% The main thing this file does, is to establish transfer-functions. -% Here are two predefined arrays for 360x360Dpi and for 720x720DpI. -% If resolution is 360x720 or 720x360 the average is used. You may -% want to define other arrays here. -% - - /STCdeftransfer [ 0.0 1.0 ] def - - /STCKtransfer360 [ - 0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147 - 0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949 - 0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840 - 0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000 - ] def - - /STCKtransfer720 [ - 0.0000 0.0011 0.0079 0.0151 0.0217 0.0287 0.0354 0.0425 - 0.0492 0.0562 0.0633 0.0700 0.0766 0.0835 0.0900 0.0975 - 0.1054 0.1147 0.1243 0.1364 0.1489 0.1641 0.1833 0.2012 - 0.2217 0.2492 0.2814 0.3139 0.3487 0.3996 0.4527 0.5195 - ] def - -% compute the resolution - - STCold /HWResolution get dup - 0 get exch 1 get mul sqrt /STCdpi exch def - -% pick the colormodel - STCold /ProcessColorModel get /STCcolor exch def - - mark % prepare stack for "putdeviceprops" - -% warn for BitsPerPixel=30 with fsrgb - STCcolor /DeviceRGB eq STCold /BitsPerPixel get 32 eq and - { - (%%[ stcolor.ps: inefficient RGB-setup, recommend BitsPerPixel=24 ]%%\n) - print - } if - -% if the Dithering-Method is default (gscmyk), change it to fscmyk -% this is achieved by pushing a name/value-pair onto the stack -% if the selected algorithm uses another ProcessColorModel, it is necessary -% to change the Value of STCcolor according to the new algorithm. - - STCold /Dithering get (gscmyk) eq - { - /Dithering (hscmyk) % preferred dithering-method - } if % might be necessary to change STCcolor too - -% -% select the array according to the resolution -% - STCdpi 359.0 lt - { STCdeftransfer } - { STCdpi 361.0 lt - { STCKtransfer360 } - { STCdpi 719.0 gt - { STCKtransfer720 } - { - STCKtransfer360 length STCKtransfer720 length eq - { - 0 1 STCKtransfer360 length 1 sub - { - dup dup - STCKtransfer360 exch get - exch STCKtransfer720 exch get - add 2.0 div - STCKtransfer360 3 1 roll put - } for - }if - STCKtransfer360 - } ifelse - }ifelse - } ifelse - /STCtransfer exch def - -% -% Add the arrays. With Version 1.17 and above, it seems to be -% a good idea, to use the transfer-arrays as coding-arrays too. -% - -% -% RGB-Model requires inversion of the transfer-arrays -% - STCcolor /DeviceRGB eq - { - /RGBtransfer STCtransfer length array def - 0 1 STCtransfer length 1 sub - { - dup RGBtransfer length 1 sub exch sub exch - STCtransfer exch get 1.0 exch sub - RGBtransfer 3 1 roll put - } for - - /Rtransfer RGBtransfer - /Gtransfer RGBtransfer - /Btransfer RGBtransfer - - /Rcoding RGBtransfer - /Gcoding RGBtransfer - /Bcoding RGBtransfer - - }{ - - /Ctransfer STCtransfer - /Mtransfer STCtransfer - /Ytransfer STCtransfer - /Ktransfer STCtransfer - - /Ccoding STCtransfer - /Mcoding STCtransfer - /Ycoding STCtransfer - /Kcoding STCtransfer - - } ifelse - - counttomark 0 ne - {currentdevice putdeviceprops pop}{cleartomark}ifelse - -% decativate predefined correction - - {} dup dup currenttransfer setcolortransfer - - }{ - (%%[ stcolor.ps: currentdevice is not stcolor - ignored ]%%\n) print - } ifelse -}{ - (%%[ stcolor.ps: not interpreted by AFPL Ghostscript - ignored ]%%\n) print -} ifelse diff --git a/Master/tlpkg/tlgs/lib/viewraw.ps b/Master/tlpkg/tlgs/lib/viewraw.ps index c456afe5d1c..80e019ecad9 100644 --- a/Master/tlpkg/tlgs/lib/viewraw.ps +++ b/Master/tlpkg/tlgs/lib/viewraw.ps @@ -18,25 +18,125 @@ % Requires the colorimage operator. % If SCALE is defined, maps input pixels to output pixels with that scale; % if SCALE is undefined, scales the image to fit the page. -% If BITS is defined, it is the number of bits per sample (1,2,4,8,12); +% If BITS is defined, it is the number of bits per sample (1,2,4,8); % if BITS is undefined, its default value is 1. % Colorspace defaults to cmyk, but -dGray or -dRGB can change it -/viewraw { % <filename> <ncomp> <width> viewraw - +/viewraw { % <filename> <ncomp> <width> viewraw - 20 dict begin % Default ncomp is 4 == CMYK /w exch def /fname exch def - /ncomp + /F fname (r) file def % the raw file + /f /F load def % the usual DataSource + /bpc /BITS where { pop BITS } { 1 } ifelse def + /ncomp /Gray where - { pop 1 } % DeviceGray is 1 component - { /RGB where { pop 3 } { 4 } ifelse % DeviceRGB is 3 component, DeviceCMYK is 4 component - } ifelse + { pop 1 /CS /DeviceGray def } % DeviceGray is 1 component + { /RGB where + { pop 3 BITS 8 ge % DeviceRGB is 3 component, use Indexed for 1, 2, 4 BITS + { /CS /DeviceRGB def } + { + BITS 4 eq { + /P 4096 3 mul string def % the palette + 0 1 15 { /r exch def + 0 1 15 { /g exch def + 0 1 15 { /b exch def + r 256 mul g 16 mul add b add 3 mul % base of the triplet + P 1 index r 17 mul put + P 1 index 1 add g 17 mul put + P exch 2 add b 17 mul put + } for + } for + } for + /CS + [ /Indexed /DeviceRGB 4095 P ] def + /BITS 12 def % change to 4 bit indexed + % redefine the DataSource to pack the 16-bit values into 12-bit + % The 'proc' returns 2 12-bit pixels in 3 bytes + % This proc is needed for the output from -sDEVICE=bitrgb -dGrayValues=16 + /S3 3 string def + /f { + F read + { + 256 mul F read + pop add 16 mul S3 0 2 index 256 div cvi put + 240 and F read + { add S3 exch 1 exch put S3 2 F read pop put } + { S3 exch 1 exch put S3 2 0 put } + ifelse + S3 + } + { () } + ifelse + } bind def + } if + BITS 2 eq { + /CS + [ /Indexed /DeviceRGB 255 < + 000000 000055 0000AA 0000FF + 005500 005555 0055AA 0055FF + 00AA00 00AA55 00AAAA 00AAFF + 00FF00 00FF55 00FFAA 00FFFF + 550000 550055 5500AA 5500FF + 555500 555555 5555AA 5555FF + 55AA00 55AA55 55AAAA 55AAFF + 55FF00 55FF55 55FFAA 55FFFF + AA0000 AA0055 AA00AA AA00FF + AA5500 AA5555 AA55AA AA55FF + AAAA00 AAAA55 AAAAAA AAAAFF + AAFF00 AAFF55 AAFFAA AAFFFF + FF0000 FF0055 FF00AA FF00FF + FF5500 FF5555 FF55AA FF55FF + FFAA00 FFAA55 FFAAAA FFAAFF + FFFF00 FFFF55 FFFFAA FFFFFF + + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + > + ] def + /BITS 8 def % change to 4 bit indexed + } if + BITS 1 eq { + /CS + [ /Indexed /DeviceRGB 15 < + 000000 0000FF 00FF00 00FFFF FF0000 FF00FF FFFF00 FFFFFF + 000000 0000FF 00FF00 00FFFF FF0000 FF00FF FFFF00 FFFFFF + > + ] def + /BITS 4 def % change to 4 bit indexed + } if + } + ifelse + } + { 4 /CS /DeviceCMYK def } % DeviceCMYK is 4 component + ifelse + } + ifelse def - /bpc /BITS where { pop BITS } { 1 } ifelse def - /f fname (r) file def + + % Calculate Height from file length and width mark fname status pop pop pop /flen exch def cleartomark - /h flen w bpc ncomp mul mul 7 add 8 idiv idiv def + % NB: bitrgb writes 4 bits when BITS=1, 8 bits when BITS=2, 16 bits when BITS=4 + % presumably to keep values on nice boundaries this takes some fudging + /h flen w bpc ncomp dup 3 eq bpc 8 lt and { 1 add } if mul mul 7 add 8 idiv idiv def %% (Dimensions: ) print [w h] == flush % Set up scaling. /SCALE where { @@ -51,15 +151,25 @@ 3 1 roll exch sub w div .min dup } ifelse scale %% w h bpc [1 0 0 -1 0 h] f false ncomp colorimage - << /ImageType 1 /Width w /Height h /ImageMatrix [1 0 0 -1 0 h] - /MultipleDataSources false /DataSource f /BitsPerComponent BITS - /Decode BITS 1 gt % inverted sense for 1 bit per component - { [ [ 0 1 ] [0] [ 0 1 0 1 0 1 ] [ 0 1 0 1 0 1 0 1 ] ] ncomp 1 sub get } - { [ [ 1 0 ] [0] [ 1 0 1 0 1 0 ] [ 1 0 1 0 1 0 1 0 ] ] ncomp 1 sub get } - ifelse + CS setcolorspace + << /ImageType 1 /Width w /Height h /ImageMatrix [1 0 0 -1 0 h] + /MultipleDataSources false /DataSource /f load /BitsPerComponent BITS + /Decode + bpc 1 eq { % inverted sense for 1 bit per component + [ [0] [ 1 0 ] [0] [ 0 15 ] [ 0 1 0 1 0 1 0 1 ] ] ncomp get + } if + bpc 2 eq { + [ [0] [ 0 1 ] [0] [ 0 255 ] [ 0 1 0 1 0 1 0 1 ] ] ncomp get + } if + bpc 4 eq { + [ [0] [ 0 1 ] [0] [ 0 4095 ] [ 1 0 1 0 1 0 1 0 ] ] ncomp get + } if + bpc 8 ge { + [ [0] [ 0 1 ] [0] [ 0 1 0 1 0 1 ] [ 1 0 1 0 1 0 1 0 ] ] ncomp get + } if >> image showpage - f closefile + F closefile end } bind def |