386BSD 0.1 development
[unix-history] / usr / othersrc / public / ghostscript-2.4.1 / ps2image.ps
% Copyright (C) 1990, 1991 Aladdin Enterprises. All rights reserved.
% Distributed by Free Software Foundation, Inc.
%
% This file is part of Ghostscript.
%
% Ghostscript is distributed in the hope that it will be useful, but
% WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
% to anyone for the consequences of using it or for whether it serves any
% particular purpose or works at all, unless he says so in writing. Refer
% to the Ghostscript General Public License for full details.
%
% Everyone is granted permission to copy, modify and redistribute
% Ghostscript, but only under the conditions described in the Ghostscript
% General Public License. A copy of this license is supposed to have been
% given to you along with Ghostscript so you can know your rights and
% responsibilities. It should be in a file named COPYING. Among other
% things, the copyright notice and this notice must be preserved on all
% copies.
% Convert a .ps file to another .ps file containing only a bit image.
% Usage:
% (filename) ps2image
% This replaces the current device, writing the output on the file
% instead of to the device. To display the image at a later time,
% simply run the file that was written.
% Initialize, and redefine copypage and showpage.
/ps2idict 25 dict def
ps2idict begin
% Save the showpage operator
/realshowpage /showpage load def
% Define a monochrome palette
/monopalette <00 ff> def
% The main procedure
/ps2image
{ % Open the file
(w) file /myfile exch def
myfile (/readimage ) writestring
myfile /readimage load write==only
myfile ( bind def\n) writestring
% Get the device parameters
currentdevice getdeviceprops dicttomark
dup /HWSize get aload pop
/devheight exch def
/devwidth exch def
/InitialMatrix get
/devmatrix exch def
% Make a corresponding memory device
devmatrix devwidth devheight monopalette
makeimagedevice
/mydevice exch def
mydevice setdevice % (does an erasepage)
/rowwidth devwidth 7 add 8 idiv def
/row rowwidth 7 add 8 idiv 8 mul string def % pad for findcommon
/prevrow row length string def
% Replace the definition of showpage
userdict /showpage { ps2idict begin myshowpage end } bind put
} def
% Procedure for reading and displaying
% the rendered image.
% <width> <height> readimage
/readimage
{ gsave matrix setmatrix
1 matrix
3 index 7 add 8 idiv string currentfile exch
% At each iteration of the loop,
% the stack contains <file> <buffer>
{ 2 copy
1 index token pop % starting index
2 index token pop % count
getinterval
readhexstring pop pop dup }
3 1 roll
7 2 roll
image pop pop
grestore showpage
} def
/findcommon % prevrow row -> stopindex startindex
{ 2 copy eq
{ 0 0 }
{ dup length
{ 8 sub 2 copy 8 getinterval 3 index 2 index 8 getinterval
ne { 8 add exit } if
} loop
{ 1 sub 2 copy get 3 index 2 index get
ne { 1 add exit } if
} loop
0
{ 3 index 1 index 8 getinterval 3 index 2 index 8 getinterval
ne { exit } if
8 add
} loop
{ 3 index 1 index get 3 index 2 index get
ne { exit } if
1 add
} loop
}
ifelse
4 2 roll pop pop
} bind def
% Write the image on the file
/myshowpage
{ myfile devwidth write==only myfile ( ) writestring
myfile devheight write==only myfile ( readimage\n) writestring
0 1 prevrow length 1 sub { prevrow exch 0 put } for
% Write the hex data
0 1 devheight 1 sub
{ mydevice exch row 0 rowwidth getinterval copyscanlines
prevrow row findcommon
% stack now has stop index, start index
exch 1 index sub 2 copy exch % start, length, length, start
myfile exch write==only myfile ( ) writestring
myfile exch write==only myfile ( ) writestring
getinterval myfile exch writehexstring
row prevrow copy pop
myfile (\n) writestring
} for
myfile flushfile
erasepage initgraphics
} bind def
end
/ps2image { ps2idict begin ps2image end } bind def