diff options
Diffstat (limited to 'postscript/prologues/hardcopy.ps')
-rw-r--r-- | postscript/prologues/hardcopy.ps | 196 |
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 + |