shithub: riscv

ref: d3512f60df5d7a2ea5c4cad3cdef797f1f95a182
dir: /sys/src/cmd/postscript/postdmd/postdmd.ps/

View raw version
%
% Version 3.3.2 prologue for DMD bitmap files.
%

/#copies 1 store
/aspectratio 1 def
/formsperpage 1 def
/landscape false def
/magnification 1 def
/margin 0 def
/orientation 0 def
/rotation 1 def
/screenres 100 def
/xoffset 0 def
/yoffset 0 def

/useclippath true def
/pagebbox [0 0 612 792] def

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

/setup {
	counttomark 2 idiv {def} repeat pop

	landscape {/orientation 90 orientation add def} if

	pagedimensions
	xcenter ycenter translate
	orientation rotation mul rotate
	xoffset inch yoffset inch translate
	magnification dup aspectratio mul scale

	/height height margin sub def
	/width width margin sub def
} def

/pagedimensions {
	useclippath {
		/pagebbox [clippath pathbbox newpath] def
	} if
	pagebbox aload pop
	4 -1 roll exch 4 1 roll 4 copy
	landscape {4 2 roll} if
	sub /width exch def
	sub /height exch def
	add 2 div /xcenter exch def
	add 2 div /ycenter exch def
	userdict /gotpagebbox true put
} def

/pagesetup {/page exch def} bind def

/bitmap {
	/scanlines exch def
	/scanlength exch def
	/flip exch def
	/v8format exch def

	/bytelength scanlength 8 idiv def
	/picstr bytelength string def
	/lpicstr bytelength string def
	/bytelength bytelength 1 sub def

	gsave

% First the overall scaling.

	height scanlines div width scanlength div min
	72 screenres div min
	dup scale

% Followed by the one for the unit square.

	scanlength neg 2 div scanlines neg 2 div translate
	scanlength scanlines scale
	v8format {getv8bitmap} {getbitmap} ifelse
	grestore
} bind def

/getbitmap {
	scanlength scanlines flip [scanlength 0 0 scanlines neg 0 scanlines] {
		0 {
			currentfile token pop dup
			0 eq {pop pop exit} if
			/charcount exch def
			picstr 1 index charcount getinterval
			/repl exch def
			currentfile repl readhexstring pop pop
			charcount add
			currentfile token pop {
				picstr 1 index repl putinterval
				charcount add
			} repeat
		} loop
		picstr
	} imagemask
} bind def

/getv8bitmap {
	scanlength scanlines flip not [scanlength 0 0 scanlines neg 0 scanlines] {
		0 {
			currentfile token pop dup
			0 eq {pop pop exit} if
			/charcount exch def
			picstr 1 index charcount getinterval
			/repl exch def
			currentfile repl readhexstring pop pop
			charcount add
			currentfile token pop {
				picstr 1 index repl putinterval
				charcount add
			} repeat
		} loop
		0 0 picstr {
			exch lpicstr exch get xor
			lpicstr exch 2 index exch put
			1 add dup
		} forall
		pop pop lpicstr
	} imagemask
} bind def

/done {/lastpage where {pop lastpage} if} def