summaryrefslogtreecommitdiff
path: root/Master/xemtex/gslib/pphs.ps
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2005-12-28 00:07:27 +0000
committerKarl Berry <karl@freefriends.org>2005-12-28 00:07:27 +0000
commit30dd9f517c9c093ff3319061647a4555264f7914 (patch)
tree0d7a349bf99be5a42cc9c5a80a30f3b7136c4ccd /Master/xemtex/gslib/pphs.ps
parent08ab8dce83f53b0f915cb66a37bbc8478b22c307 (diff)
trunk
git-svn-id: svn://tug.org/texlive/trunk@9 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/xemtex/gslib/pphs.ps')
-rw-r--r--Master/xemtex/gslib/pphs.ps222
1 files changed, 222 insertions, 0 deletions
diff --git a/Master/xemtex/gslib/pphs.ps b/Master/xemtex/gslib/pphs.ps
new file mode 100644
index 00000000000..5b841f744fb
--- /dev/null
+++ b/Master/xemtex/gslib/pphs.ps
@@ -0,0 +1,222 @@
+% Copyright (C) 2001 Aladdin Enterprises. All rights reserved.
+%
+% This program is free software; you can redistribute it and/or modify it
+% under the terms of the GNU General Public License as published by the
+% Free Software Foundation; either version 2 of the License, or (at your
+% option) any later version.
+%
+% This program is distributed in the hope that it will be useful, but
+% WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+% Public License for more details.
+%
+% You should have received a copy of the GNU General Public License along
+% with this program; if not, write to the Free Software Foundation, Inc.,
+% 59 Temple Place, Suite 330, Boston, MA, 02111-1307.
+
+% $Id: pphs.ps,v 1.3.2.1.2.1 2003/04/12 14:02:39 giles Exp $
+% Print Linearized PDF hint streams
+
+% Utilities
+/read1 { % <file> read1 <value>
+ read not {
+ (**** Unexpected EOF) = flush quit
+ } if
+} bind def
+/read2 { % <file> read2 <value>
+ dup read1 8 bitshift exch read1 add
+} bind def
+/read4 { % <file> read4 <value>
+ dup read2 16 bitshift exch read2 add
+} bind def
+% Free variables: Bits, Bitsleft
+/readninit { % - <readninit> -
+ /Bits 0 def
+ /Bitsleft 0 def
+} bind def
+
+/pdftoken { % <file> pdftoken <token>
+ dup token pop
+ dup type /nametype eq 1 index xcheck and {
+ dup dup (<<) cvn eq exch ([) eq or {
+ exec exch {
+ dup pdftoken dup dup (>>) cvn eq exch (]) eq or {
+ exch pop exec exit
+ } if exch
+ } loop
+ } {
+ exch pop
+ } ifelse
+ } {
+ exch pop
+ } ifelse
+} bind def
+/makemask { % <nbits> makemask <mask>
+ 1 exch bitshift 1 sub
+} bind def
+/readn { % <file> <nbits> readn <value>
+ dup Bitsleft le {
+ exch pop
+ /Bitsleft Bitsleft 2 index sub def
+ makemask Bits Bitsleft neg bitshift and
+ } {
+ Bitsleft makemask Bits and
+ exch Bitsleft sub exch 1 index bitshift 3 1 roll
+ /Bits 2 index read1 def /Bitsleft 8 def
+ readn add
+ } ifelse
+} bind def
+/sread { % <string> sread <file>
+ 0 () /SubFileDecode filter
+} bind def
+
+/ptag { % <pre-tag> <proc> <post-tag> ptag -
+ 3 -1 roll print (: ) print
+ exch exec
+ ( % ) print =
+} bind def
+
+% Print the linearization parameters dictionary.
+/plpkeys <<
+ /E (end of p. 1 objects)
+ /L (total file length)
+ /H (PHS start + length)
+ /N (# of pages)
+ /O (p. 1 object #)
+ /T (offset of first main xref entry)
+>> def
+/plpdict { % <dict> plpdict -
+ (<<) = plpkeys {
+ 2 index 2 index .knownget {
+ % Stack: dict key label value
+ ( ) print 3 -1 roll ===only ( ) print ===only
+ ( % ) print =
+ } {
+ pop pop
+ } ifelse
+ } forall {
+ plpkeys 2 index known {
+ pop pop
+ } {
+ ( ) print exch ===only ( ) print ===
+ } ifelse
+ } forall (>>) =
+} bind def
+
+% Print the Page Offset Hint Table.
+/ppoht { % <npages> <file> ppoht -
+
+ 20 dict begin
+ /f exch def
+ /npages exch def
+ readninit
+
+ (1) { f read4 =only } (least # objs/page) ptag
+ (2) { f read4 =only } (offset of p. 1 object (+PHS length if beyond PHS)) ptag
+ (3) { f read2 dup =only /nb3 exch def } (# bits for # objs/page delta) ptag
+ (4) { f read4 =only } (least # bytes/page) ptag
+ (5) { f read2 dup =only /nb5 exch def } (# bits for # bytes/page delta) ptag
+ (6) { f read4 =only } (least content stream offset-in-page) ptag
+ (7) { f read2 dup =only /nb7 exch def } (# bits for content stream offset delta) ptag
+ (8) { f read4 =only } (least content stream length) ptag
+ (9) { f read2 dup =only /nb9 exch def } (# bits for content stream length delta) ptag
+ (10) { f read2 dup =only /nb10 exch def } (# bits for # of shared obj refs) ptag
+ (11) { f read2 dup =only /nb11 exch def } (# bits for shared obj indices) ptag
+ (12) { f read2 dup =only /nb12 exch def } (# bits for shared obj ref pos numerators) ptag
+ (13) { f read2 =only } (shared obj ref pos denominator) ptag
+
+ (*1) { [ npages { f nb3 readn } repeat ] ==only } (# objs/page deltas (see 1,3)) ptag
+ (*2) { [ npages { f nb5 readn } repeat ] ==only } (# bytes/page deltas (see 4,5)) ptag
+ (*3) { [ npages { f nb10 readn } repeat ] dup ==only /nso exch def } (# of shared obj refs (see 10)) ptag
+ (*4) { [ nso { [ exch { f nb11 readn } repeat ] } forall ] ==only } (shared obj indices (see 11)) ptag
+ (*5) { [ nso { [ exch { f nb12 readn } repeat ] } forall ] ==only } (shared obj ref pos numerators (see 12)) ptag
+ (*6) { [ npages { f nb7 readn } repeat ] ==only } (content stream offset-in-page deltas (see 6,7)) ptag
+ (*7) { [ npages { f nb9 readn } repeat ] ==only } (content stream length deltas (see 8,9)) ptag
+
+ end % temp dict
+
+} bind def
+
+% Print the Shared Objects Hint Table.
+/psoht { % <file> psoht -
+
+ 20 dict begin
+ /f exch def
+ readninit
+
+ (1) { f read4 =only } (first shared obj #) ptag
+ (2) { f read4 =only } (first shared obj offset (+PHS length if beyond PHS)) ptag
+ (3) { f read4 dup =only /n3 exch def } (# of p. 1 shared objs) ptag
+ (4) { f read4 dup =only /n4 exch def } (total # of shared objs) ptag
+ (5) { f read2 dup =only /nb5 exch def } (# bits for # of shared objs/group) ptag
+ (6) { f read4 =only } (least shared obj group length) ptag
+ (7) { f read2 dup =only /nb7 exch def } (# bits for shared obj group length delta) ptag
+
+ /nse n4 def
+ (*1) { [ nse { f nb7 readn } repeat ] ==only } (shared obj group length deltas (see 6,7)) ptag
+ (*2) { [ nse { f 1 readn } repeat ] dup ==only /md5s exch def } (MD5 present?) ptag
+ (*3:) = md5s {
+ 0 ne {
+ ( ) print f 16 string readstring pop
+ (%stdout) (w) file dup 3 -1 roll writehexstring closefile () =
+ } if
+ } forall
+ (*4) { [ nse { f nb5 readn } repeat ] ==only } (# objs/group (see 5)) ptag
+
+ end % temp dict
+
+} bind def
+
+% Print the Primary Hint Stream of a PDF file.
+/pphs { % <file> pphs -
+ /pdf exch def
+
+ % Read the linearization parameter dictionary.
+ { pdf pdftoken /obj eq { exit } if } loop
+ pdf pdftoken /lpdict exch def
+ /lpdict type /dicttype eq { lpdict /Linearized known } { false } ifelse {
+ (Not a linearized PDF file.) = stop
+ } if
+
+ lpdict plpdict flush
+
+ % Read the primary hint stream.
+ null {
+ pdf pdftoken dup /stream eq { pop exit } if
+ exch pop
+ } loop
+ /phsdict exch def
+ % Remove Length if indirect reference.
+ phsdict 0 known {
+ phsdict 0 undef phsdict /Length undef
+ } if
+ (PHS: ) print phsdict === flush
+ pdf 0 (endstream) /SubFileDecode filter
+ dup 5000 string readstring pop exch closefile
+ sread /phsdata exch def
+
+ % Decode the hint stream data if necessary.
+ phsdict /Filter .knownget {
+ phsdata exch filter
+ dup 5000 string readstring pop exch closefile
+ sread /phsdata exch def
+ } if
+
+ % Adobe says we can assume /P = 0.
+ (Page Offset Hint Table:) =
+ lpdict /N get
+ phsdata phsdict /S get string readstring pop sread
+ ppoht
+ (Shared Objects Hint Table:) =
+ phsdata psoht
+} bind def
+
+% Check for command line arguments.
+[ shellarguments
+ { ] dup length 1 eq
+ { 0 get (r) file dup pphs closefile }
+ { (Usage: pphs filename.pdf\n) print flush }
+ ifelse
+ }
+ { pop }
+ifelse