diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /dviware/psprint/vms/tex.ps |
Initial commit
Diffstat (limited to 'dviware/psprint/vms/tex.ps')
-rw-r--r-- | dviware/psprint/vms/tex.ps | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/dviware/psprint/vms/tex.ps b/dviware/psprint/vms/tex.ps new file mode 100644 index 0000000000..36ac9cc08d --- /dev/null +++ b/dviware/psprint/vms/tex.ps @@ -0,0 +1,236 @@ +% Prologue for a DVI job. +% It assumes *_print.com has defined dev (string), land (bool) and res (int). + +dev (LW) eq % LaserWriter? +{ land + { % /landscape given + % rotate/scale/translate can cause scaling problems, so use setmatrix: + version cvr 38.0 le + { [ 0 -1 1 0 235 3100 ] setmatrix } % LaserWriter + { version cvr 47.0 lt + { [ 0 -1 1 0 235 3130 ] setmatrix } % LaserWriter Plus + { [ 0 -1 1 0 235 3160 ] setmatrix } % LaserWriter II NTX + % add y to move origin down by y pixels + % add x to move origin left by x pixels + ifelse } ifelse + } + { % /landscape not given + % scale/translate can cause scaling problems, so use setmatrix: + version cvr 38.0 le + { [ 1 0 0 1 235 190 ] setmatrix } % LaserWriter + { version cvr 47.0 lt + { [ 1 0 0 1 235 215 ] setmatrix } % LaserWriter Plus + { [ 1 0 0 1 235 265 ] setmatrix } % LaserWriter II NTX + % add x to move origin right by x pixels + % add y to move origin down by y pixels + ifelse } ifelse + } ifelse +} if + +dev (PS40) eq % PrintServer? +{ land + { [ 1 0 0 1 300 300 ] setmatrix % /landscape given + } + { [ 0 1 -1 0 3210 300 ] setmatrix % /landscape not given + } ifelse +} if + +dev (LINO) eq % Linotronic? +{ land + { initmatrix % /landscape given + 90 rotate % rotate axes 90deg anticlockwise + 72 res div dup neg scale % units now dots (y increases to right) + res res translate % move to TeX origin + + % setmatrix won't work properly with a3/a4/a5/b5 page setups + % [1 0 0 1 1270 margin 72 div 1270 mul add 1270] setmatrix % res=1270 + % [2 0 0 2 1270 margin 72 div 1270 mul add 1270] setmatrix % res=635 + } + { initmatrix % /landscape not given + newpath clippath pathbbox % push LLx LLy URx URy + /paperht exch 72 div def % paper height in inches (URy = ht in pts) + pop pop pop % URx LLy LLx + 72 res div dup neg scale % units now dots (y increases down page) + res paperht res mul neg res add + translate % move to TeX origin + + % setmatrix won't work properly with a3/a4/a5/b5 page setups + % [0 1 -1 0 paperht 1270 mul 1270 sub % res=1270 + % margin 72 div 1270 mul add 1270] setmatrix + % [0 2 -2 0 paperht 1270 mul 1270 sub % res=635 + % margin 72 div 1270 mul add 1270] setmatrix + } ifelse +} if + +/mtrx 6 array def +mtrx currentmatrix pop % save our new transformation matrix + +/@newfont % initialize new font dict +{ /fontid exch def + fontid 7 dict def + fontid load begin + /FontType 3 def + /FontMatrix [1 0 0 -1 0 0] def % -1 because y scale is negative + /FontBBox [0 0 1 1] def + /BitMaps 128 array def + /BuildChar {CharBuilder} def + /Encoding 128 array def + 0 1 127 {Encoding exch /.notdef put} for + end + fontid fontid load definefont pop +} def + +% @saveVM and @restoreVM are only used if we are conserving VM +% by downloading font bitmaps more often: + +/@saveVM % save state of VM before using font +{ /prefontVM save def + @newfont +} def + +/@restoreVM {prefontVM restore} def + +% The char data, a bitmap descriptor, is an array with 6 elements: + +/ch-image {ch-data 0 get} def % the hex string image +/ch-width {ch-data 1 get} def % the number of pixels across +/ch-height {ch-data 2 get} def % the number of pixels tall +/ch-xoff {ch-data 3 get} def % number of pixels to left of origin +/ch-yoff {ch-data 4 get} def % number of pixels below origin +/ch-advw {ch-data 5 get} def % advance width + +% The following character builder looks up the char data in the BitMaps array +% and paints the character: + +/CharBuilder % image one char +{ /ch-code exch def % save the char code + /font-dict exch def % and the font dict + /ch-data font-dict /BitMaps get + ch-code get def + ch-advw 0 + ch-xoff neg ch-height ch-yoff sub 1 sub neg % -xo , -(ht-yo-1) + ch-width ch-xoff sub 1 sub ch-yoff % (wd-xo-1) , yo + setcachedevice + ch-width ch-height true + [1 0 0 -1 ch-xoff ch-yoff] % bitmap sent top to bottom + {ch-image} + imagemask +} def + +/sf {setfont} def % set current font + +/dc % define new character +{ /ch-code exch def + /ch-data exch def + + % The following code should be enabled if you have an old LaserWriter. + % It attempts to overcome a bug that causes the printer to crash + % and print a test page rather then report a VMerror. + % + % vmstatus % returns: savelevel vmused vmmax + % 10000 sub gt % is vmused > (vmmax-10000)? + % { pop VMERROR } % causes error message (avoiding crash) + % { pop } % pop savelevel + % ifelse + + currentfont /BitMaps get ch-code ch-data put + currentfont /Encoding get ch-code + dup ( ) cvs cvn put % generate unique name +} bind def + +/@bop0 {pop} def % begin DVI page n + +/@bop1 % begin setting DVI page n +{ pop % throw away page number + initgraphics % start with a clean slate + mtrx setmatrix % switch to our TeX coordinate system + /prepageVM save def % save state of VM at start of page +} def + +/@eop % end DVI page n +{ pop % throw away page number + prepageVM restore % restore VM to state at start of page + showpage +} def + +/@end { } def % end of file + +% h and s are used to typeset downloaded bitmap fonts: + +/h {exch 0 rmoveto show} bind def % move right by dh and show (...) + +/s {3 1 roll moveto show} bind def % move to h,v and show (...) + +% H and S are used to typeset resident PostScript fonts. +% We can't use relative horizontal positioning because the advance widths in +% a PostScript font are not integers and rounding errors would accumulate: + +/H {exch v moveto show} bind def % move to h,v and show (...) + +/S % ditto, and save v position +{ 3 1 roll dup /v exch def + moveto show +} bind def + +% Some fine-tuning of the code used to draw a rule is necessary: + +dev (LW) eq % LaserWriter? +version cvr 38.0 le and % and version <= 38.0? +{ + /r % set a wd by ht rule at h,v + { newpath + 1 add moveto % move to h,v+1 (don't ask me why) + /ht exch 1 sub def % reduce height by 1 + /wd exch 1 sub def % ditto for width + wd 0 rlineto + 0 ht neg rlineto + wd neg 0 rlineto + fill + } bind def +} +{ + /r % set a wd by ht rule at h,v + { newpath + moveto % move to h,v + /ht exch 1 sub def % reduce height by 1 + /wd exch 1 sub def % ditto for width + wd 0 rlineto + 0 ht neg rlineto + wd neg 0 rlineto + fill + } bind def +} ifelse + +% Following procedures are invoked as the result of a \special command. +% We change all scaling and graphics back to defaults, but shift the origin +% to the current position on the page: + +/p {moveto} bind def % move to h,v + +/@bsp % begin special mode +{ gsave + /prespecialVM save def % save showpage, TeX procedures etc. + currentpoint transform + initgraphics itransform translate + land { 90 rotate } if % rotate axes if /landscape given + /showpage { } def % user does not have to remove showpage +} bind def + +/@esp % end special mode +{ prespecialVM restore % restore saved showpage value etc. + grestore +} bind def + +% Here are the definitions needed to handle resident PostScript fonts: + +/sp % scaled pts to dots +{ 16#10000 div % scaled pts to pts + res mul 72.27 div % pts to dots +} bind def + +/PSfont % uses dot size and TFM name +{ dup /Times-Slanted eq + {pop /Times-Roman findfont [1 0 .268 -1 0 0] makefont exch scalefont setfont} + {findfont [1 0 0 -1 0 0] makefont exch scalefont setfont} + ifelse +} bind def |