henesyinit from p9fce6d0435 years agoHistory
189 lines · 5.7 KB · Text
RawDownload
%    Copyright (C) 1990, 1991, 1993, 1994 Aladdin Enterprises.  All rights reserved.% % This file is part of Aladdin Ghostscript.% % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author% or distributor accepts any responsibility for the consequences of using it,% or for whether it serves any particular purpose or works at all, unless he% or she says so in writing.  Refer to the Aladdin Ghostscript Free Public% License (the "License") for full details.% % Every copy of Aladdin Ghostscript must include a copy of the License,% normally in a plain ASCII text file named PUBLIC.  The License grants you% the right to copy, modify and redistribute Aladdin Ghostscript, but only% under certain conditions described in the License.  Among other things, the% License requires that the copyright notice and this notice be preserved on% all copies. % Convert an arbitrary PostScript file to an EPSI file.%%	NOTE: this file was contributed by a user: please contact%	George Cameron <george@bio-medical-physics.aberdeen.ac.uk>%	if you have questions.% % Initialize, and redefine copypage and showpage./ps2edict 25 dict defps2edict begin 				% The main procedure  /ps2epsi   {				% Open the file     outfile (w) file /epsifile exch def					% Get the device parameters     currentdevice getdeviceprops .dicttomark     /HWSize get aload pop       /devheight exch def       /devwidth exch def     matrix defaultmatrix       /devmatrix exch def				% Make a corresponding memory device     devmatrix devwidth devheight <ff 00>     makeimagedevice     /arraydevice exch def     arraydevice setdevice	% (does an erasepage)     /rowwidth devwidth 7 add 8 idiv def     /row rowwidth string def				% Replace the definition of showpage     userdict /showpage { ps2edict begin epsipage end } bind put   } def  /margintest {      { dup arraydevice exch row copyscanlines pop	-1 0 1 rowwidth 1 sub	{ dup row exch get 0 ne { exit }{ pop } ifelse	} for	dup -1 ne { exch pop } if	-1 ne { exit } if pop      } for } bind def   /epsipage   {     /loopcount devheight 1 sub def      % Find top margin     -1 0 1 loopcount margintest     dup -1 eq { (blank page!!\n) print 0 .quit }{ exch pop } ifelse      /tm exch def      % Find bottom margin     loopcount -1 0 margintest     /bm exch def          % Initialise limit variables     /loopcount rowwidth 1 sub def     /lm loopcount def /lmb 0 def     /rm 0 def /rmb 0 def      % Find left and right boundaries of image     tm 1 bm      { % Get more data	arraydevice exch row copyscanlines pop	% Scan from left to find first non-zero element	% We save first the element, then the index	-1 0 1 loopcount	{ dup row exch get dup 0 ne { exch exit }{ pop pop } ifelse	} for	% If we found -1, row is blank ..	dup -1 ne 	{ % Find the leftmost index          dup lm lt          % If the new index is less, we save index and element          { /lm exch def /lmb exch def }          % If the index is equal, we or the bits together          { lm eq { lmb or /lmb exch def }{ pop } ifelse          } ifelse	  % Now find the rightmost index	  loopcount -1 0          { dup row exch get dup 0 ne { exch exit }{ pop pop } ifelse          } for	  dup rm gt          % If the new index is greater, we save index and element          { /rm exch def /rmb exch def }          % If the index is equal, or the bits          { rm eq { rmb or /rmb exch def } { pop } ifelse          } ifelse	} if	pop      } for      % Now we find the real left & right bit positions     256 0 1 7     { exch 2 div dup lmb le { pop exit }{ exch pop } ifelse     } for     /lmb exch def      1 7 -1 0     { exch dup dup rmb and eq { pop exit }{ 2 mul exch pop } ifelse     } for     /rmb exch def      % Calculate the bounding box values     /llx lm 8 mul lmb add def     /lly devheight bm sub def     /urx rm 8 mul rmb add def     /ury devheight tm sub def      % Write out the magic string and bounding box information     epsifile (%!PS-Adobe-2.0 EPSF-1.2\n) writestring     epsifile (%%BoundingBox: ) writestring     epsifile llx write==only epsifile ( ) writestring     epsifile lly write==only epsifile ( ) writestring     epsifile urx write==only epsifile ( ) writestring     epsifile ury write==     epsifile (%%BeginPreview: ) writestring     epsifile urx llx sub 1 add write==only epsifile ( ) writestring     epsifile bm tm sub 1 add write==only epsifile ( 1 ) writestring     epsifile bm tm sub 1 add write==      % Define character and bit widths for the output line buffer     /cwidth rm lm sub 1 add 8 mul 7 add 8 idiv def     /bwidth cwidth 8 mul def     /owidth urx llx sub 1 add 7 add 8 idiv def     /out cwidth string def      % Create a 1-bit-high device for bitblt to align with the bbox     gsave     matrix cwidth 8 mul 1 <00 ff> makeimagedevice setdevice      % 'image' a zero string to clear the line device     bwidth 1 1 matrix cwidth string image      tm 1 bm      { % Get a scan line interval from the array device	arraydevice exch row copyscanlines lm cwidth getinterval	lmb 0 gt	{ % 'image' it into the line device with the lmb offset	  bwidth 1 1 [1 0 0 1 lmb 0] 5 -1 roll image	  % Now we get the modified scan line	  currentdevice 0 out copyscanlines 0 owidth getinterval	} if	% Write out the hex data	epsifile (% ) writestring 	epsifile exch writehexstring	epsifile (\n) writestring      } for      epsifile (%%EndImage\n) writestring     epsifile (%%EndPreview\n) writestring     epsifile flushfile     grestore     erasepage initgraphics      DonePage 0 1 put   } bind def  (outfile) getenv  { /outfile exch def     ps2epsi     /DonePage 1 string def    (%stdin) (r) file cvx execute0    DonePage 0 get 0 eq { showpage } if  } if endquit