%!PS-Adobe-2.0
%%Title: Blue Book Program 15, on page 191
%%Creator: Adobe Systems Incorporated
%%CreationDate: Fri Dec 29 12:29:23 PST 1989
%%EndComments
/setuserscreendict 22 dict def
setuserscreendict begin
/tempctm matrix def
/temprot matrix def
/tempscale matrix def
/concatprocs
{ /proc2 exch cvlit def
/proc1 exch cvlit def
/newproc proc1 length proc2 length add
array def
newproc 0 proc1 putinterval
newproc proc1 length proc2 putinterval
newproc cvx
} def
/resmatrix matrix def
/findresolution
{ 72 0 resmatrix defaultmatrix dtransform
/yres exch def /xres exch def
xres dup mul yres dup mul add sqrt
} def
end
/setuserscreen
{ setuserscreendict begin
/spotfunction exch def
/screenangle exch def
/cellsize exch def
/m tempctm currentmatrix def
/rm screenangle temprot rotate def
/sm cellsize dup tempscale scale def
sm rm m m concatmatrix m concatmatrix pop
1 0 m dtransform /y1 exch def /x1 exch def
/veclength x1 dup mul y1 dup mul add sqrt def
/frequency findresolution veclength div def
/newscreenangle y1 x1 atan def
m 2 get m 1 get mul m 0 get m 3 get mul sub
0 gt
{ {neg} /spotfunction load concatprocs
/spotfunction exch def
} if
frequency newscreenangle /spotfunction load
setscreen
end
} def
/setpatterndict 18 dict def
setpatterndict begin
/bitison
{ /ybit exch def /xbit exch def
/bytevalue bstring ybit bwidth mul xbit 8 idiv
add get def
/mask 1 7 xbit 8 mod sub bitshift def
bytevalue mask and 0 ne
} def
end
/bitpatternspotfunction
{ setpatterndict begin
/y exch def /x exch def
/xindex x 1 add 2 div bpside mul cvi def
/yindex y 1 add 2 div bpside mul cvi def
xindex yindex bitison
{ /onbits onbits 1 add def 1 }
{ /offbits offbits 1 add def 0 }
ifelse
end
} def
/setpattern
{ setpatterndict begin
/cellsz exch def
/angle exch def
/bwidth exch def
/bpside exch def
/bstring exch def
/onbits 0 def /offbits 0 def
cellsz angle /bitpatternspotfunction load
setuserscreen
{ } settransfer
offbits offbits onbits add div setgray
end
} def
/enlargebits
{ /bwidth exch def
/bpside exch def
/bstring exch def
0.08 setlinewidth
0 1 bpside 1 sub
{ /y exch def
0 1 bpside 1 sub
{ /x exch def
x y setpatterndict /bitison get cvx exec
{ gsave
x y translate
newpath
0 0 moveto 0 1 lineto
1 1 lineto 1 0 lineto
closepath
gsave 0 setgray fill grestore
1 setgray stroke
grestore
} if
} for
} for
newpath
0 0 moveto 0 bpside lineto
bpside dup lineto bpside 0 lineto
closepath 0 setgray stroke
} def
/inch { 72 mul } def
/showpattern
{ /ang exch def
/pat exch def
gsave
0 3.5 inch translate
3 8 div inch dup scale
pat 8 1 enlargebits
grestore
pat 8 1 ang 72 300 32 div div setpattern
newpath
0 0 moveto 3 inch 0 lineto
3 inch dup lineto 0 3 inch lineto
closepath fill
} def
/pat1 <d1e3c5885c3e1d88> def
/pat2 <3e418080e3140808> def
/Helvetica findfont 12 scalefont setfont
gsave
1 inch 1.25 inch translate
pat1 0 showpattern
grestore
1 inch 1 inch moveto
(Basketweave, no rotation in user space) show
gsave
4.5 inch 1.25 inch translate
pat2 90 showpattern
grestore
4.5 inch 1 inch moveto
(Fish scale, 90 degree rotation) show
( in user space) show
showpage
% But what does it do?