summaryrefslogtreecommitdiff
path: root/print/ghostscript-gpl/files/patch-lib:ps2epsi.ps
blob: 19ccc7d0b022c3255c44e506f2801d5abbc42fe0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
--- lib/ps2epsi.ps.orig	Wed Apr  4 13:45:42 2001
+++ lib/ps2epsi.ps	Tue Apr 23 05:30:39 2002
@@ -1,27 +1,31 @@
-%    Copyright (C) 1990, 2000 Aladdin Enterprises.  All rights reserved.
+%    Copyright (C) 1990-2002 artofcode LLC. All rights reserved.
 % 
-% This file is part of AFPL Ghostscript.
+% This software is provided AS-IS with no warranty, either express or
+% implied.
 % 
-% AFPL 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 Free Public License (the
-% "License") for full details.
+% This software is distributed under license and may not be copied,
+% modified or distributed except as expressly authorized under the terms
+% of the license contained in the file LICENSE in this distribution.
 % 
-% Every copy of AFPL 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 AFPL 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.
+% For more information about licensing, please refer to
+% http://www.ghostscript.com/licensing/. For information on
+% commercial licensing, go to http://www.artifex.com/licensing/ or
+% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
+% San Rafael, CA  94903, U.S.A., +1(415)492-9861.
 
-% $Id: ps2epsi.ps,v 1.5 2001/04/04 04:45:42 alexcher Exp $
+% $Id: ps2epsi.ps,v 1.5.2.3 2002/04/22 20:30:39 giles Exp $
 % Convert an arbitrary PostScript file to an EPSI file.
 %
 % Please do not contact these users if you have questions.  They no longer
 % have the time, interest, or current expertise to keep this code working.
 % If you find bugs, please send proposed fixes to bug-gs@aladdin.com.
 %
+% Bug fix 2002-04-20 by rayjj: Bounding box was incorrect since it depended
+%   on the dither pattern and gray shade at the boundary. Changed to use
+%   8-bit grayscale preview image to allow correct bounding box (at the
+%   expense of a 8x larger preview image). Also moved .setsafe until after
+%   the device and file operations are complete (but still before the input
+%   file is processed.
 % Bug fix 2000-04-11 by lpd: if a font didn't have a FontName (which is the
 %   case for bitmap fonts produced by recent versions of dvips), setfont
 %   caused an error.
@@ -51,7 +55,6 @@
   /ps2epsi
    {				% Open the file
      outfile (w) file /epsifile exch def
-     //systemdict /.setsafe known { .setsafe } if
 					% Get the device parameters
      currentdevice getdeviceprops .dicttomark 
      /HWSize get aload pop
@@ -59,17 +62,23 @@
        /devwidth exch def
      matrix defaultmatrix
        /devmatrix exch def
-				% Make a corresponding memory device
-     devmatrix devwidth devheight <ff 00>
+				% Make a corresponding 8-bit deep memory device
+     devmatrix devwidth devheight
+     256 string 0 1 255 { 1 index exch dup 255 exch sub put } for
      makeimagedevice
      /arraydevice exch def
-     arraydevice setdevice	% (does an erasepage)
-     /rowwidth devwidth 7 add 8 idiv def
+     arraydevice
+     % Turn on anti-aliasing
+     mark /TextAlphaBits 4 /GraphicsAlphaBits 4 6 -1 roll
+     putdeviceprops
+     setdevice	% (does an erasepage)
+     /rowwidth devwidth def
      /row rowwidth string def
      /zerorow rowwidth string def	% all zero
 				% Replace the definition of showpage
      userdict /showpage { ps2edict begin epsipage end } bind put
      userdict /setfont { ps2edict begin epsisetfont end } bind put
+     //systemdict /.setsafe known { .setsafe } if
    } bind def
 
  /epsifontdict 100 dict def
@@ -125,8 +134,8 @@
      
      % Initialise limit variables
      /loopcount rowwidth 1 sub def
-     /lm loopcount def /lmb 0 def
-     /rm 0 def /rmb 0 def
+     /lm loopcount def 
+     /rm 0 def 
 
      % Find left and right boundaries of image
      tm 1 bm
@@ -135,47 +144,29 @@
 	% 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
+	{ dup row exch get 0 ne { exch pop exit }{ 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
+          { /lm exch def } { pop } ifelse
 	  % Now find the rightmost index
 	  loopcount -1 0
-          { dup row exch get dup 0 ne { exch exit }{ pop pop } ifelse
+          { dup row exch get 0 ne { exit }{ 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
+          { /rm exch def } { pop } 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.
      % Note that these must be corrected to produce closed-open intervals.
-     /llx lm 8 mul lmb add def
+     /llx lm def
      /lly devheight bm sub 1 sub def
-     /urx rm 8 mul rmb add 1 add def
+     /urx rm 1 add def
      /ury devheight tm sub def
 
     % Write out the magic string and bounding box information
@@ -206,38 +197,31 @@
      epsifile lly write==only epsifile ( ) writestring
      epsifile urx write==only epsifile ( ) writestring
      epsifile ury write==
-     epsifile (%%BeginPreview: ) writestring
-     epsifile urx llx sub write==only epsifile ( ) writestring
-     epsifile bm tm sub 1 add write==only epsifile ( 1 ) writestring
-     epsifile bm tm sub 1 add write==
-     epsifile flushfile
 
     % Define character and bit widths for the output line buffer:
      /cwidth rm lm sub 1 add def
-     /bwidth cwidth 8 mul def
-     /owidth urx llx sub 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
+     epsifile (%%BeginPreview: ) writestring
+     epsifile cwidth write==only epsifile ( ) writestring
+     epsifile bm tm sub 1 add write==only epsifile ( 8 ) writestring
+     epsifile bm tm sub 1 add
+     cwidth 39 add 40 idiv mul write==
+     epsifile flushfile
 
-     % 'image' a zero string to clear the line device
-     bwidth 1 1 matrix cwidth string image
+     gsave
 
      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
+	% Write out the hex data as 40 bytes per line (82 chars)
+	0 40 cwidth
+	 { epsifile (% ) writestring 
+	   epsifile exch 2 index exch
+	   dup cwidth exch sub 40 .min getinterval writehexstring
+	   epsifile (\n) writestring
+	 } for
+        pop
       } for
 
      epsifile (%%EndImage\n) writestring