% This file contains the standard Postscript prolog used when % generating Postscript from canvas widgets. % % $Header: /user6/ouster/wish/library/RCS/prolog.ps,v 1.6 93/04/01 14:03:52 ouster Exp $ SPRITE (Berkeley); %%BeginProlog 50 dict begin % The definitions below just define all of the variables used in % any of the procedures here. This is needed for obscure reasons % explained on p. 716 of the Postscript manual (Section H.2.7, % "Initializing Variables," in the section on Encapsulated Postscript). /baseline 0 def /stipimage 0 def /height 0 def /justify 0 def /maxwidth 0 def /spacing 0 def /stipple 0 def /strings 0 def /xoffset 0 def /yoffset 0 def /tmpstip null def /encoding {ISOLatin1Encoding} def % Override setfont to automatically encode the font in the style defined by % by 'encoding' (ISO Latin1 by default). systemdict /encodefont known { /realsetfont /setfont load def /setfont { encoding encodefont realsetfont } def } if % desiredSize EvenPixels closestSize % % The procedure below is used for stippling. Given the optimal size % of a dot in a stipple pattern in the current user coordinate system, % compute the closest size that is an exact multiple of the device's % pixel size. This allows stipple patterns to be displayed without % aliasing effects. /EvenPixels { % Compute exact number of device pixels per stipple dot. dup 0 matrix currentmatrix dtransform dup mul exch dup mul add sqrt % Round to an integer, make sure the number is at least 1, and compute % user coord distance corresponding to this. dup round dup 1 lt {pop 1} if exch div mul } bind def % width height string filled StippleFill -- % % Given a path and other graphics information already set up, this % procedure will fill the current path in a stippled fashion. "String" % contains a proper image description of the stipple pattern and % "width" and "height" give its dimensions. If "filled" is true then % it means that the area to be stippled is gotten by filling the % current path (e.g. the interior of a polygon); if it's false, the % area is gotten by stroking the current path (e.g. a wide line). % Each stipple dot is assumed to be about one unit across in the % current user coordinate system. /StippleFill { % Turn the path into a clip region that we can then cover with % lots of images corresponding to the stipple pattern. Warning: % some Postscript interpreters get errors during strokepath for % dashed lines. If this happens, turn off dashes and try again. 1 index /tmpstip exch def %% Works around NeWSprint bug gsave {eoclip} {{strokepath} stopped {grestore gsave [] 0 setdash strokepath} if clip} ifelse % Change the scaling so that one user unit in user coordinates % corresponds to the size of one stipple dot. 1 EvenPixels dup scale % Compute the bounding box occupied by the path (which is now % the clipping region), and round the lower coordinates down % to the nearest starting point for the stipple pattern. pathbbox 4 2 roll 5 index div cvi 5 index mul 4 1 roll 6 index div cvi 6 index mul 3 2 roll % Stack now: width height string y1 y2 x1 x2 % Below is a doubly-nested for loop to iterate across this area % in units of the stipple pattern size, going up columns then % across rows, blasting out a stipple-pattern-sized rectangle at % each position 6 index exch { 2 index 5 index 3 index { % Stack now: width height string y1 y2 x y gsave 1 index exch translate 5 index 5 index true matrix tmpstip imagemask grestore } for pop } for pop pop pop pop pop grestore newpath } bind def % -- AdjustColor -- % Given a color value already set for output by the caller, adjusts % that value to a grayscale or mono value if requested by the CL % variable. /AdjustColor { CL 2 lt { currentgray CL 0 eq { .5 lt {0} {1} ifelse } if setgray } if } bind def % x y strings spacing xoffset yoffset justify stipple stipimage DrawText -- % This procedure does all of the real work of drawing text. The % color and font must already have been set by the caller, and the % following arguments must be on the stack: % % x, y - Coordinates at which to draw text. % strings - An array of strings, one for each line of the text item, % in order from top to bottom. % spacing - Spacing between lines. % xoffset - Horizontal offset for text bbox relative to x and y: 0 for % nw/w/sw anchor, -0.5 for n/center/s, and -1.0 for ne/e/se. % yoffset - Vertical offset for text bbox relative to x and y: 0 for % nw/n/ne anchor, +0.5 for w/center/e, and +1.0 for sw/s/se. % justify - 0 for left justification, 0.5 for center, 1 for right justify. % stipple - Boolean value indicating whether or not text is to be % drawn in stippled fashion. % stipimage - Image for stippling, if stipple is True. % % Also, when this procedure is invoked, the color and font must already % have been set for the text. /DrawText { /stipimage exch def /stipple exch def /justify exch def /yoffset exch def /xoffset exch def /spacing exch def /strings exch def % First scan through all of the text to find the widest line. /maxwidth 0 def strings { stringwidth pop dup maxwidth gt {/maxwidth exch def} {pop} ifelse newpath } forall % Compute the baseline offset and the actual font height. 0 0 moveto (TXygqPZ) false charpath pathbbox dup /baseline exch def exch pop exch sub /height exch def pop newpath % Translate coordinates first so that the origin is at the upper-left % corner of the text's bounding box. Remember that x and y for % positioning are still on the stack. translate maxwidth xoffset mul strings length 1 sub spacing mul height add yoffset mul translate % Now use the baseline and justification information to translate so % that the origin is at the baseline and positioning point for the % first line of text. justify maxwidth mul baseline neg translate % Iterate over each of the lines to output it. For each line, % compute its width again so it can be properly justified, then % display it. strings { dup stringwidth pop justify neg mul 0 moveto show 0 spacing neg translate } forall } bind def %%EndProlog