% Copyright 1985, 1986, 1987, 1988 Chris Lewis % All Rights Reserved % % Permission to copy and further distribute is freely given provided % this copyright notice remains intact and that this software is not % sold for profit. % % Project: Generic Troff drivers % Module: ps.lib % Author: Chris Lewis % Specs: Predefinitions for PostScript %ident @(#)ps.lib: 2.1 Copyright 90/07/18 16:52:37 Chris Lewis" /Y { 3 1 roll dup /CurY exch def moveto show } bind def /X { exch CurY moveto show } bind def /hits 0 def /misses 0 def /pagecount 0 def /drawfraction { /denominator exch def /numerator exch def /origY exch def /origX exch def origX curPoints 4.7 div add origY moveto (/) show curFont findfont curPoints .5 mul cvi scalefont setfont origX origY curPoints 3 div add moveto numerator show origX curPoints 2.5 div add origY moveto denominator show curFont findfont curPoints scalefont setfont origX origY moveto } def /mySetLineWidth { curPoints 3 72 div mul setlinewidth } def /do12 { (1) (2) drawfraction } def /do14 { (1) (4) drawfraction } def /do34 { (3) (4) drawfraction } def /doff { moveto (f) show curPoints 20 div neg 0 rmoveto (f) show } def /doFi { moveto (f) show curPoints 20 div neg 0 rmoveto (\256) show } def /doFl { moveto (f) show curPoints 20 div neg 0 rmoveto (\257) show } def % This should be sort of a font-caching mechanism - eg: % remember each font/point combination requested, and % if the setting is not already known, *then* do the findfont/scalefont. % Otherwise, simply retrieve it. % However, even with simply recalculating the font each time, it % isn't *that* slow. Eg: 20 seconds or so for *very* "font-changy" % pages. % % Trial font cache - I can't think in Polish... ;-) /SetFont { /curPoints exch def /curFont exch def % Concatenate the curFont string with the curPoints to create % a new name and assign to cF /cF 50 string def cF 0 cF curFont cF cvs % cF 0 string "curFont" length dup % cF 0 "curFont\0\0..." N N curPoints 10 string cvs % cF 0 "curFont\0\0..." N N "points" dup length % cF 0 "curFont\0\0..." N N "points" M 3 -1 roll add % cF 0 "curFont\0\0..." N "points" M+N 4 1 roll % cF 0 M+N "curFont\0\0..." N "points" putinterval % cF 0 M+N (cF <- "curFontpoints") getinterval % "curFontpoints" /cF exch def cF cvn % /curFontpoints where { /hits hits 1 add def pop } { /misses misses 1 add def cF curFont findfont curPoints scalefont def } ifelse cF load setfont } def /metrics { /psize 16 def /Times-Roman psize SetFont /charcount exch def /curpos 720 def /xpos 72 def xpos curpos (Execution Summary:) Y /curpos curpos psize sub def xpos 36 add curpos (Font cache hits: )Y hits ( ) cvs show /curpos curpos psize sub def xpos 36 add curpos (Font cache misses: )Y misses ( ) cvs show /curpos curpos psize sub def xpos 36 add curpos (Character count: )Y charcount ( ) cvs show /curpos curpos psize sub def xpos 36 add curpos (Page count: )Y pagecount ( ) cvs show /curpos curpos psize sub def xpos 36 add curpos (Execution time (seconds): )Y usertime btime sub 0.001 mul ( ) cvs show showpage } def /docircle { /origY exch def /origX exch def /radius curPoints 3 div def newpath origX radius add origY radius add radius 0 360 arc mySetLineWidth stroke origX origY moveto } def /doru { moveto 0 curPoints 5 div rmoveto (_) show } def /do34em { /origY exch def /origX exch def /emheight curPoints .23 mul def newpath origX origY emheight add moveto origX curPoints .75 mul add origY emheight add lineto mySetLineWidth stroke origX origY moveto } def /dosq { /origY exch def /origX exch def /L curPoints .8 mul def newpath origX origY moveto origX origY L add lineto origX L add origY L add lineto origX L add origY lineto closepath mySetLineWidth stroke origX origY moveto } def /dobox { /origY exch def /origX exch def /L curPoints def newpath origX origY moveto origX origY L add lineto origX L add origY L add lineto origX L add origY lineto closepath 1 setlinewidth stroke origX origY moveto } def /fourpops { 4 {pop} repeat } def % These are macros so that they can be redefined. % print current page. /ShowPage { showpage /pagecount pagecount 1 add def } def % Emitted at beginning of page. /StartPage { Form } def % If you want to define a Bell System Logo, go ahead. This % one draws an animal (ferret) face % Object should be scaled off of curPoints, with origX,origY % lower left coordinates. /BellSymbol { /origY exch def /origX exch def /TEMPSAVE save def /Radius curPoints 3 div def % Face Radius /HRadius Radius 2 div def % Half Face Radius /NRadius Radius 6 div def % Nose Radius /ERadius Radius 8 div def % Eye Radius /EarRadius Radius 3 div def % Ear Radius /FaceType (Ferret) def /MRadius Radius 4 div def % Mask corner radius /TopMask Radius .7 mul def % XCent & YCent max delta /BotMask NRadius 1.1 mul def % YCent min delta /XCent origX Radius add def /YCent origY Radius add def newpath % Main face XCent YCent Radius 0 360 arc mySetLineWidth stroke % Nose XCent YCent NRadius 0 360 arc fill % Left Ear XCent Radius 45 sin mul sub YCent Radius 45 sin mul add EarRadius 20 250 arc mySetLineWidth stroke % Right Ear XCent Radius 45 sin mul add YCent Radius 45 sin mul add EarRadius -70 160 arc mySetLineWidth stroke % Cleft XCent YCent NRadius sub moveto XCent YCent HRadius sub lineto mySetLineWidth stroke % Mouth XCent HRadius 45 sin mul sub YCent HRadius 45 sin mul sub moveto XCent HRadius 30 sin mul sub YCent HRadius sub lineto XCent HRadius 30 sin mul add YCent HRadius sub lineto XCent HRadius 45 sin mul add YCent HRadius 45 sin mul sub lineto mySetLineWidth stroke FaceType (Ferret) eq { % Mask .6 setgray XCent TopMask sub YCent BotMask add YCent TopMask add add 2 div moveto XCent TopMask sub YCent TopMask add XCent TopMask add YCent TopMask add MRadius arcto fourpops XCent TopMask add YCent TopMask add XCent TopMask add YCent BotMask add MRadius arcto fourpops XCent TopMask add YCent BotMask add XCent TopMask sub YCent BotMask add MRadius arcto fourpops XCent TopMask sub YCent BotMask add XCent TopMask sub YCent TopMask add MRadius arcto fourpops fill 0 setgray } if % Eyes XCent HRadius add YCent HRadius add ERadius 0 360 arc fill XCent HRadius sub YCent HRadius add ERadius 0 360 arc fill TEMPSAVE restore origX origY moveto } def % bracket building font %! % % Michael Rourke, University of N.S.W., Australia % /BracketFontDict 9 dict def /$workingdict 10 dict def BracketFontDict begin /FontType 3 def /FontName (Bracket) cvn def /FontMatrix [ 0.001 0 0 0.001 0 0] def /FontBBox [ -50 -250 1000 1000 ] def /Encoding 256 array def 0 1 255 { Encoding exch /.notdef put } for Encoding dup 65 /Cbv put %A dup 66 /Clt put %B dup 67 /Clk put %C dup 68 /Clb put %D dup 69 /Crt put %E dup 70 /Crk put %F dup 71 /Crb put %G dup 72 /Clc put %H dup 73 /Clf put %I dup 74 /Crc put %J dup 75 /Crf put %K dup 76 /Cbr put %L dup 77 /Crn put %M dup 78 /Cci put %N dup 79 /Cru put %O pop /CharProcs 24 dict dup begin /setC { 0 -50 -250 500 1000 setcachedevice} def /C.bv {220 -250 moveto 0 1000 rlineto 60 0 rlineto 0 -1000 rlineto fill } def /C.barc { 750 moveto 180 0 rlineto 0 -60 rlineto -180 0 rlineto fill } def /C.barf { -250 moveto 180 0 rlineto 0 60 rlineto -180 0 rlineto fill } def /C.brk.end { 1 setlinewidth moveto rlineto rcurveto reversepath 60 0 rlineto rlineto rcurveto fill } def /C.setl {dup dtransform exch round exch idtransform pop setlinewidth } def /Cbv { 300 setC C.bv } def /Clt { 300 setC 0 150 50 210 140 250 0 730 0 150 50 250 200 250 0 750 220 -250 C.brk.end } def /Clk { 300 setC 1 setlinewidth 220 -250 moveto 0 400 rlineto 0 50 -50 100 -100 100 rcurveto 50 0 100 50 100 100 rcurveto 0 400 rlineto 60 0 rlineto 0 -400 rlineto 0 -50 -50 -100 -100 -100 rcurveto 50 0 100 -50 100 -100 rcurveto 0 -400 rlineto closepath fill } def /Clb { 300 setC 0 -150 50 -210 140 -250 0 -730 0 -150 50 -250 200 -250 0 -750 220 750 C.brk.end } def /Crt { 300 setC 0 150 -50 250 -200 250 0 750 0 150 -50 210 -140 250 0 730 220 -250 C.brk.end } def /Crk { 300 setC 1 setlinewidth 220 -250 moveto 0 400 rlineto 0 50 50 100 100 100 rcurveto -50 0 -100 50 -100 100 rcurveto 0 400 rlineto 60 0 rlineto 0 -400 rlineto 0 -50 50 -100 100 -100 rcurveto -50 0 -100 -50 -100 -100 rcurveto 0 -400 rlineto fill } def /Crb { 300 setC 0 -150 -50 -250 -200 -250 0 -750 0 -150 -50 -210 -140 -250 0 -730 220 750 C.brk.end } def /Clc { 300 setC C.bv 280 C.barc } def /Clf { 300 setC C.bv 280 C.barf } def /Crc { 300 setC C.bv 40 C.barc } def /Crf { 300 setC C.bv 40 C.barf } def /Cbr { 0 0 -50 -250 0 1000 setcachedevice 40 C.setl 0 -250 moveto 0 1000 rlineto stroke } def /Cru { 0 0 -50 -250 1000 0 setcachedevice 40 C.setl 0 -250 moveto 500 0 rlineto stroke } def /Crn { 300 setC 40 C.setl 0 895 moveto 500 0 rlineto stroke } def /Cci { 600 0 -50 -250 700 1000 setcachedevice 40 C.setl 400 250 300 0 360 arc stroke } def end def /BuildChar { $workingdict begin /charcode exch def /fontdict exch def fontdict /CharProcs get begin fontdict /Encoding get charcode get load gsave 0 setlinecap 0 setgray newpath exec grestore end end } def end /BracketFont BracketFontDict definefont pop % This macro is invoked by ShowPage to display the current form. % Usually redefined to point at a form loaded by an include % directive. Redefinition triggered by .sR O troff % directive. % Global default form (usually redefined top of each page anyways) /Form {} def % This is a convenient place for putting your extra inclusions. % Eg: this would load conf.ps (from current directory or LIBDIR) % and insert it into the end of the prolog. % This loads the confidential form. %%%include confid %%%include lethead