|
|
1.1 ! root 1: % ! 2: % Redefiniton of the PostScript file output operators so results go to paper. ! 3: % Complicated and slow, but the implementation doesn't place many demands on ! 4: % included PostScript. About all that's required is gentle treatment of the ! 5: % graphics state between write calls. ! 6: % ! 7: ! 8: /#copies 1 store ! 9: /aspectratio 1 def ! 10: /font /Courier def ! 11: /formsperpage 1 def ! 12: /landscape false def ! 13: /magnification 1 def ! 14: /orientation 0 def ! 15: /pointsize 10 def ! 16: /rotation 1 def ! 17: /xoffset .1 def ! 18: /yoffset .1 def ! 19: ! 20: /roundpage true def ! 21: /useclippath true def ! 22: /pagebbox [0 0 612 792] def ! 23: ! 24: /inch {72 mul} def ! 25: /min {2 copy gt {exch} if pop} def ! 26: ! 27: /HardcopySetup { ! 28: landscape {/orientation 90 orientation add def} if ! 29: font findfont 1 1.1 div scalefont setfont ! 30: ! 31: pagedimensions ! 32: xcenter ycenter translate ! 33: orientation rotation mul rotate ! 34: width 2 div neg height 2 div translate ! 35: xoffset inch yoffset inch neg translate ! 36: pointsize 1.1 mul dup scale ! 37: magnification dup aspectratio mul scale ! 38: height width div 1 min dup scale ! 39: 0 -1 translate ! 40: 0 0 moveto ! 41: } def ! 42: ! 43: /pagedimensions { ! 44: useclippath { ! 45: /pagebbox [clippath pathbbox newpath] def ! 46: roundpage currentdict /roundpagebbox known and {roundpagebbox} if ! 47: } if ! 48: pagebbox aload pop ! 49: 4 -1 roll exch 4 1 roll 4 copy ! 50: landscape {4 2 roll} if ! 51: sub /width exch def ! 52: sub /height exch def ! 53: add 2 div /xcenter exch def ! 54: add 2 div /ycenter exch def ! 55: } def ! 56: ! 57: % ! 58: % Unbind the operators in an executable array or packedarray. Leaves the ! 59: % unbound array or the original object on the stack. ! 60: % ! 61: ! 62: /Unbind { ! 63: 0 index xcheck ! 64: 1 index type /arraytype eq ! 65: 2 index type /packedarraytype eq or and { ! 66: dup length array copy cvx ! 67: dup 0 exch { ! 68: dup type /operatortype eq { ! 69: ( ) cvs cvn cvx ! 70: } if ! 71: ! 72: dup type /dicttype eq { ! 73: dup maxlength dict exch { ! 74: Unbind ! 75: 3 copy put pop pop ! 76: } forall ! 77: } if ! 78: ! 79: 0 index xcheck ! 80: 1 index type /arraytype eq ! 81: 2 index type /packedarraytype eq or and { ! 82: Unbind ! 83: } if ! 84: ! 85: 3 copy put pop ! 86: 1 add ! 87: } forall ! 88: pop ! 89: } if ! 90: } def ! 91: ! 92: % ! 93: % New write operator - don't bind the definition! Expands tabs and backspaces, ! 94: % wraps long lines, and starts a new page whenever necessary. The code that ! 95: % handles newlines assumes lines are separated by one vertical unit. ! 96: % ! 97: ! 98: /write { ! 99: true exch ! 100: ! 101: %%case '\b': ! 102: dup 8#10 eq { ! 103: ( ) stringwidth pop neg 0 rmoveto ! 104: currentpoint pop 0 lt { ! 105: currentpoint exch pop 0 exch moveto ! 106: } if ! 107: exch pop false exch ! 108: } if ! 109: ! 110: %%case '\t': ! 111: dup 8#11 eq { ! 112: currentpoint pop ( ) stringwidth pop div round cvi ! 113: 8 mod 8 exch sub { ! 114: 2 index 8#40 write ! 115: } repeat ! 116: exch pop false exch ! 117: } if ! 118: ! 119: %%case '\n': ! 120: dup 8#12 eq { ! 121: currentpoint 0 exch 1 sub moveto pop ! 122: ! 123: gsave clippath pathbbox pop pop exch pop grestore ! 124: currentpoint exch pop 1 sub ge { ! 125: 2 index 8#14 write ! 126: } if ! 127: exch pop false exch ! 128: } if ! 129: ! 130: %%case '\f': ! 131: dup 8#14 eq { ! 132: gsave showpage grestore ! 133: 0 0 moveto ! 134: exch pop false exch ! 135: } if ! 136: ! 137: %%case '\r': ! 138: dup 8#15 eq { ! 139: currentpoint 0 exch moveto pop ! 140: exch pop false exch ! 141: } if ! 142: ! 143: %%case EOF: ! 144: dup -1 eq { ! 145: currentpoint 0 ne exch 0 ne or { ! 146: 2 index 8#14 write ! 147: } if ! 148: exch pop false exch ! 149: } if ! 150: ! 151: %%default: ! 152: exch { ! 153: dup ! 154: gsave clippath pathbbox pop 3 1 roll pop pop grestore ! 155: ( ) stringwidth pop currentpoint pop add le { ! 156: 2 index 8#12 write ! 157: } if ! 158: ( ) dup 0 4 -1 roll put show ! 159: } if ! 160: ! 161: pop % the character ! 162: pop % and file object ! 163: } def ! 164: ! 165: % ! 166: % All the other file output operators call our redefined write operator. ! 167: % ! 168: ! 169: /print { ! 170: (%stdout) (w) file exch {1 index exch write} forall ! 171: pop ! 172: } def ! 173: ! 174: /writestring { ! 175: {1 index exch write} forall ! 176: pop ! 177: } def ! 178: ! 179: /writehexstring { ! 180: (0123456789ABCDEF) 3 1 roll { ! 181: dup ! 182: 3 index exch -4 bitshift 16#F and get 2 index exch write ! 183: 2 index exch 16#F and get 1 index exch write ! 184: } forall ! 185: pop pop ! 186: } def ! 187: ! 188: % ! 189: % Unbind and redefine the remaining file output procedures. ! 190: % ! 191: ! 192: /= dup load Unbind def ! 193: /== dup load Unbind def ! 194: /stack dup load Unbind def ! 195: /pstack dup load Unbind def ! 196:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.