(v13) Example uses of shadowop
This page applies to Harlequin v13.1r0 and later; both Harlequin Core and Harlequin MultiRIP.
Page content:
Redefining setgray
This example prints the operand to setgray
before calling the true setgray
operator. This is the equivalent of the simple redefinition illustrated above.
<<
/setgray {
(operand: ) = dup == setgray
} bind
>> 1183615869 internaldict /shadowop get exec
Redefining image and colorimage
This more involved example causes all images (but not masks) to be replaced by equivalently sized gray rectangles. (Recall that the image
operator can take a dictionary operand in Level 2 PostScript.)
/redefinedimage {
dup type /dicttype eq {dup} {5 copy} ifelse gsave nulldevice image grestore
gsave
0.5 setgray
dup type /dicttype eq { begin
/ImageMatrix load concat
0 0 Width Height rectfill end
}{
% w h bps matrix proc
pop concat pop 0 0 4 -2 roll rectfill
} ifelse grestore
} bind def
<<
/image /redefinedimage load
/colorimage { % w h bps matrix dsrc ... dsrc multi ncomp
% turn it into a dictionary operand image and use the
% previous redefinition of image
10 dict begin
/ImageType 1 def
/ncompsub1 exch 1 sub def % not used by image op
/Decode {{0 1}{}{0 1 0 1 0 1}{0 1 0 1 0 1 0 1}}
ncompsub1 get def
/MultipleDataSources exch def MultipleDataSources {
/DataSource [ncompsub1 4 add dup 3 sub roll ] def
}{
/DataSource exch def
} ifelse
/ImageMatrix exch def
/BitsPerComponent exch def
/Height exch def
/Width exch def currentdict
end gsave
{ /DeviceGray null /DeviceRGB /DeviceCMYK }
1 index /ncompsub1 get get setcolorspace
//redefinedimage exec grestore
} bind
>> 1183615869 internaldict /shadowop get exec
Redefining setscreen to use a particular screen angle
The purpose of this example is to change the angle of the screen on each page (this might be needed because we know that the pages are really separations in a pre-separated job). To decide on which page is currently being processed, use the BeginPage
procedure of the page device (see [RB2], section 4.11).
The example is incomplete in that a full solution would redefine sethalftone
and setcolorscreen
as well. Recall also that the last operand to setscreen
may now possibly be a halftone dictionary (in which case we only do the substitution of the angle if it is a type 1 halftone in this example).
/AnglesRequired [15 75 0 45] def
<<
/BeginPage { % page-number
//globaldict /SavedPageNo 3 -1 roll 4 mod put
} bind
>> setpagedevice
<<
/setscreen {
dup type /dicttype ne {
% freq angle proc: replace the angle with ours exch pop
//AnglesRequired
//globaldict /SavedPageNo get get exch
}{
% freq angle halftone-dictionary dup /HalftoneType get 1 eq {
% replace the dictionary, and an overriding
% angle on the operand stack with our one for
% the current page dup length dict copy dup /Angle
//AnglesRequired //globaldict
/SavedPageNo get get put exch pop dup /Angle get exch
}0 if
} ifelse setscreen
} bind
>> 1183615869 internaldict /shadowop get exec
Redefining an application procedure
This example detects that we are running jobs from an application that we know sets up a procedure called XYCropMarks
to draw crop marks centered on the point given by the two operands of the procedure. We replace it with a procedure to draw crop marks in our own style, in this example a simple cross. The dictionary operand to shadowop
is set up in advance, but only actually applied inside a comment parsing procedure when the name and version of the application has been determined using the %%Creator
comment (see (v13) Comment parsing).
/XYCropMarksDict <<
/XYCropMarks { % x y gsave
[ /Separation /All /DeviceCMYK { pop 1 1 1 1 } ]
setcolorspace 1 setcolor moveto
initmatrix % so we work at our own sizes,
% not the application’s
0.1 setlinewidth 0 [] setdash 1 setlinecap
0 30 rmoveto 0 -60 rlineto
30 +30 rmoveto -60 0 rlineto stroke
grestore
} bind
>> def
(%%dict) begin (%%actions) begin
/Creator: [
/dup load /Creator: load /exec load
{
(Mythical Application v2.0) search { pop pop
//XYCropMarksDict 1183615869 internaldict
/shadowop get exec
} if pop
} /exec load
] cvx bind def end end
currentdict /XYCropMarksDict undef