shithub: riscv

ref: 7a503757b1251c2746df7bdcd891814c1518cc28
dir: /sys/src/cmd/postscript/cropmarks/cropmarks.ps/

View raw version
%
% Center pages, based on pageheight and pagewidth, and redefine showpage
% to put cropmarks at each corner. Device dependent code to expand the
% paper size goes in procedure expandpagesize. Currently only supports
% a Linotronic 200P typesetter using 12 inch wide paper. You'll have to
% add code to expandpagesize to support different typesetters or even a
% 200P that's running differently.
%

/CropmarkDict 40 dict dup begin

/expandpage true def
/magnification 1 def
/pageheight 11.0 def
/pagewidth 8.5 def
/scaletofit false def
/scaling 1 def

/marklength .3 def	% inches
/markstart .125 def	% inches
/markend .04 def	% inches
/marklinewidth .25 def	% points

/inch {72 mul} def
/min {2 copy gt {exch} if pop} def
/max {2 copy lt {exch} if pop} def

/setup {
	/markspace markstart marklength add markend add inch marklinewidth add def
	/totalheight pageheight inch markspace 2 mul add def
	/totalwidth pagewidth inch markspace 2 mul add def

	pagedimensions
	checkpagesize
	/scaling getscaling def
	xcenter ycenter translate
	scaling scaling scale
	pagewidth inch 2 div neg pageheight inch 2 div neg translate
	clippage
} def

/pagedimensions {
	clippath pathbbox newpath
	4 -1 roll exch 4 1 roll 4 copy
	sub /width exch def
	sub /height exch def
	add 2 div /xcenter exch def
	add 2 div /ycenter exch def
} def

/checkpagesize {
	height totalheight lt width totalwidth lt or expandpage and {
		expandpagesize
		pagedimensions
	} if
} def

/expandpagesize {	% device dependent code
	/Product statusdict begin /product where {pop product}{()} ifelse end def

	Product (Linotype) eq {		% Linotronic 200P and other models?
		statusdict /setpageparams known {
			/maxwidth 12.0 inch def		% 12 inch wide paper?
			totalheight maxwidth le {
				totalheight
				totalwidth
				maxwidth totalheight sub 2 div
				0
			}{
				totalwidth maxwidth min
				totalheight
				maxwidth totalwidth maxwidth min sub 2 div
				1
			} ifelse
			statusdict /setpageparams get exec
		} if
	} if
} def

/getscaling {
	scaletofit
		{height totalheight div width totalwidth div min 1 min}
		{1}
	ifelse
} def

/clippage {
	newpath
	0 0 moveto
	pagewidth inch 0 rlineto
	0 pageheight inch rlineto
	pagewidth neg inch 0 rlineto
	closepath clip
	newpath
} def

/cropmark {
	gsave
	translate
	rotate
	marklinewidth dup translate
	0 0 transform round exch round exch itransform translate
	markstart inch 0 moveto marklength inch 0 rlineto stroke
	0 markstart inch moveto 0 marklength inch rlineto stroke
	grestore
} bind def

/@PreviousShowpage /showpage load def

end def

%
% Cropmarks - in the default coordinate system.
%

/showpage {
	gsave
	CropmarkDict begin
		initgraphics
		marklinewidth setlinewidth
		xcenter ycenter translate
		scaling scaling scale
		0 pagewidth inch 2 div pageheight inch 2 div cropmark
		90 pagewidth inch neg 2 div pageheight inch 2 div cropmark
		180 pagewidth inch neg 2 div pageheight inch 2 div neg cropmark
		270 pagewidth inch 2 div pageheight inch 2 div neg cropmark
		@PreviousShowpage
	end
	grestore
} bind def