% Copyright 1989, David Love, SERC Daresbury Laboratory under the same % conditions as the Spider distribution \def\title{PSWEB demonstration -- outline font} \def\ps{{\sc PostScript}} @*Introduction. As a simple example of the use of \ps\ \.{WEB} we'll do a literate re-write of {\sl Program 16 / Making an Outline Font} from the Adobe blue {\sl Cookbook}, p~199. Most of the text will be directly lifted from that example. Compare this with the original! The \ps\ convention of writing, for instance, |MakeOutlineFont| instead of the form |make_outline_font| has been carried over from the original example just this once, contrary to Knuthian lore and my preference. @*2Purpose. This program defines a general procedure to take one of the built-in fonts and convert it to an outline font. (This program will also work for downloadable fonts available from Adobe Systems, Inc.). @ We need to write out a suitable bounding box comment for \.{\\psfig}. @u @=%%BoundingBox: 18 18 577 824@> @ Local storage for the procedure |MakeOutlineFont|. @u /makeoutlinedict 7 dict def @*2Function definition and use. |MakeOutlineFont| takes one of the built-in filled fonts and makes an outlined font out of it. It takes four arguments: the name of the font on which to base the outline version, the new name for the outline font, a stroke width to use on the outline and a unique ID. @u /MakeOutlineFont =>% base\_name new\_name stroke\_width ID { makeoutlinedict begin @ @ @ @ @ @ @ @ end } def @ Four arguments as described above. @= /uniqueid exch def /strokewidth exch def /newfontname exch def /basefontname exch def @ @= /basefontdict basefontname findfont def @ @= /numentries basefontdict maxlength 1 add def @ (Not all fonts have unique ID fields initially. In particlular, the built-in fonts in \ps\ version 23.0 don't.) @= basefontdict /UniqueID known not => {/numentries numentries 1 add def} if @ @= /outfontdict numentries dict def @ @= basefontdict => { exch dup /FID ne {exch outfontdict 3 1 roll put} {pop pop} % ignore the FID pair ifelse } forall @ We need to 1) insert the new name into the dictionary 2) change the paint type to outline 3) insert the stroke width into the dictionary 4) insert the new unique ID @= outfontdict /FontName newfontname put outfontdict /PaintType 2 put outfontdict /StrokeWidth strokewidth put outfontdict /UniqueID uniqueid put @ In making the outline dictionary into a \ps\ font we ignore the modified dictionary returned on the stack by |definefont|. @= newfontname outfontdict definefont pop @*Use of the procedure and determining new IDs. We'll make a new font |Helvetica-Outline1| derived from |Helvetica-Bold|. The results will appear below. @u /Helvetica-Bold @!/Helvetica-Outline1 @ @ MakeOutlineFont @ The stroke width is always specified in the character coordinate system (1000 units). The value specified here will yield a one point wide outline when the font is scaled to 54 points in size. Note that this outline width changes with different point sizes. @^stroke width@> @= 1000 54 div @ To determine the unique id: If the `base' font already contains a unique ID, add a unique constant to it, otherwise pick a unique integer and leave that value on the operand stack. @= /Helvetica-Bold findfont dup /UniqueID known => {/UniqueID get 1 add} {pop 1} ifelse @ So here are two sizes with this stroke width. @u /Helvetica-Outline1 findfont 36 scalefont setfont => 72 504 moveto (outline) show <= /Helvetica-Outline1 findfont 54 scalefont setfont => (outline) show @ Now we'll do one with a different stroke width. The width of 1000/36 used now yields a one point wide outline when the font is scaled to 36 point in size. It yields a 1.5 point outline when the font is scaled to 54 points in size ($54/36=1.5$).@^stroke width@> @u /Helvetica-Bold @!/Helvetica-Outline2 1000 36 div @ MakeOutlineFont @ And use the different stroke width: @u /Helvetica-Outline2 findfont 36 scalefont setfont => 72 444 moveto (outline) show <= /Helvetica-Outline2 findfont 54 scalefont setfont => (outline) show @ Finish off the example: @u showpage @*1Results of the examples. The results of including the \.{TANGLE}d version of this \.{WEB} source into the \.{WEAVE} output using the \.{\\psfig} macro and a suitable \.{DVI} to \ps\ converter are given here. The example has been shrunken to get it on the page and may be faint on a write-white engine with the stroke widths defined above.@^stroke width@>@^write-white@> \input psfig.sty \centerline{\psfig{figure=outline.ps1,height=6in}} @*Index.