aboutsummaryrefslogtreecommitdiff
path: root/postscript/prologues/hardcopy.ps
diff options
context:
space:
mode:
Diffstat (limited to 'postscript/prologues/hardcopy.ps')
-rw-r--r--postscript/prologues/hardcopy.ps196
1 files changed, 196 insertions, 0 deletions
diff --git a/postscript/prologues/hardcopy.ps b/postscript/prologues/hardcopy.ps
new file mode 100644
index 00000000..65eb24df
--- /dev/null
+++ b/postscript/prologues/hardcopy.ps
@@ -0,0 +1,196 @@
+%
+% Redefiniton of the PostScript file output operators so results go to paper.
+% Complicated and slow, but the implementation doesn't place many demands on
+% included PostScript. About all that's required is gentle treatment of the
+% graphics state between write calls.
+%
+
+/#copies 1 store
+/aspectratio 1 def
+/font /Courier def
+/formsperpage 1 def
+/landscape false def
+/magnification 1 def
+/orientation 0 def
+/pointsize 10 def
+/rotation 1 def
+/xoffset .1 def
+/yoffset .1 def
+
+/roundpage true def
+/useclippath true def
+/pagebbox [0 0 612 792] def
+
+/inch {72 mul} def
+/min {2 copy gt {exch} if pop} def
+
+/HardcopySetup {
+ landscape {/orientation 90 orientation add def} if
+ font findfont 1 1.1 div scalefont setfont
+
+ pagedimensions
+ xcenter ycenter translate
+ orientation rotation mul rotate
+ width 2 div neg height 2 div translate
+ xoffset inch yoffset inch neg translate
+ pointsize 1.1 mul dup scale
+ magnification dup aspectratio mul scale
+ height width div 1 min dup scale
+ 0 -1 translate
+ 0 0 moveto
+} def
+
+/pagedimensions {
+ useclippath {
+ /pagebbox [clippath pathbbox newpath] def
+ roundpage currentdict /roundpagebbox known and {roundpagebbox} if
+ } if
+ pagebbox aload pop
+ 4 -1 roll exch 4 1 roll 4 copy
+ landscape {4 2 roll} if
+ sub /width exch def
+ sub /height exch def
+ add 2 div /xcenter exch def
+ add 2 div /ycenter exch def
+} def
+
+%
+% Unbind the operators in an executable array or packedarray. Leaves the
+% unbound array or the original object on the stack.
+%
+
+/Unbind {
+ 0 index xcheck
+ 1 index type /arraytype eq
+ 2 index type /packedarraytype eq or and {
+ dup length array copy cvx
+ dup 0 exch {
+ dup type /operatortype eq {
+ ( ) cvs cvn cvx
+ } if
+
+ dup type /dicttype eq {
+ dup maxlength dict exch {
+ Unbind
+ 3 copy put pop pop
+ } forall
+ } if
+
+ 0 index xcheck
+ 1 index type /arraytype eq
+ 2 index type /packedarraytype eq or and {
+ Unbind
+ } if
+
+ 3 copy put pop
+ 1 add
+ } forall
+ pop
+ } if
+} def
+
+%
+% New write operator - don't bind the definition! Expands tabs and backspaces,
+% wraps long lines, and starts a new page whenever necessary. The code that
+% handles newlines assumes lines are separated by one vertical unit.
+%
+
+/write {
+ true exch
+
+ %%case '\b':
+ dup 8#10 eq {
+ ( ) stringwidth pop neg 0 rmoveto
+ currentpoint pop 0 lt {
+ currentpoint exch pop 0 exch moveto
+ } if
+ exch pop false exch
+ } if
+
+ %%case '\t':
+ dup 8#11 eq {
+ currentpoint pop ( ) stringwidth pop div round cvi
+ 8 mod 8 exch sub {
+ 2 index 8#40 write
+ } repeat
+ exch pop false exch
+ } if
+
+ %%case '\n':
+ dup 8#12 eq {
+ currentpoint 0 exch 1 sub moveto pop
+
+ gsave clippath pathbbox pop pop exch pop grestore
+ currentpoint exch pop 1 sub ge {
+ 2 index 8#14 write
+ } if
+ exch pop false exch
+ } if
+
+ %%case '\f':
+ dup 8#14 eq {
+ gsave showpage grestore
+ 0 0 moveto
+ exch pop false exch
+ } if
+
+ %%case '\r':
+ dup 8#15 eq {
+ currentpoint 0 exch moveto pop
+ exch pop false exch
+ } if
+
+ %%case EOF:
+ dup -1 eq {
+ currentpoint 0 ne exch 0 ne or {
+ 2 index 8#14 write
+ } if
+ exch pop false exch
+ } if
+
+ %%default:
+ exch {
+ dup
+ gsave clippath pathbbox pop 3 1 roll pop pop grestore
+ ( ) stringwidth pop currentpoint pop add le {
+ 2 index 8#12 write
+ } if
+ ( ) dup 0 4 -1 roll put show
+ } if
+
+ pop % the character
+ pop % and file object
+} def
+
+%
+% All the other file output operators call our redefined write operator.
+%
+
+/print {
+ (%stdout) (w) file exch {1 index exch write} forall
+ pop
+} def
+
+/writestring {
+ {1 index exch write} forall
+ pop
+} def
+
+/writehexstring {
+ (0123456789ABCDEF) 3 1 roll {
+ dup
+ 3 index exch -4 bitshift 16#F and get 2 index exch write
+ 2 index exch 16#F and get 1 index exch write
+ } forall
+ pop pop
+} def
+
+%
+% Unbind and redefine the remaining file output procedures.
+%
+
+/= dup load Unbind def
+/== dup load Unbind def
+/stack dup load Unbind def
+/pstack dup load Unbind def
+