summaryrefslogtreecommitdiff
path: root/gs/lib/gs_l2img.ps
blob: 4d2486e634bc9c8f8f00087d776e9e62190ce891 (plain)
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
%    Copyright (C) 1995, 1996 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.

% 
% Emulate the Level 2 dictionary-based image operator in Level 1,
% except for Interpolate (ignored) and MultipleDataSources = true;
% also, we require that the data source be either a procedure of a
% particular form or a stream, not a string or a general procedure.

% pdf2ps copies the portion of this file from %BEGIN to %END if Level 1
% compatible output is requested.

/currentglobal where
 { pop currentglobal { setglobal } true setglobal }
 { { } }
ifelse

/packedarray where
 { pop }
 { /packedarray { array astore readonly } bind def }
ifelse

%BEGIN

11 dict /.csncompdict 1 index def begin
  /DeviceGray { 1 /setgray load } bind def
  /DeviceRGB { 3 /setrgbcolor load } bind def
  /DeviceCMYK { 4 /setcmykcolor load } bind def
  /Indexed
   { dup 1 index 1 get //.csncompdict exch get exec
		% Stack: [/Indexed base hival map] ncomp basesetcolor
     3 -1 roll 3 get mark 3 1 roll
		% Stack: ncomp -mark- basesetcolor map
     dup type /stringtype eq
      {  { -
	    { exch round cvi get 255 div
	    }
	   -
	    { exch round cvi 3 mul 2 copy 2 copy get 255 div
	      3 1 roll 1 add get 255 div
	      4 2 roll 2 add get 255 div
	    }
	    { exch round cvi 4 mul 2 copy 2 copy 2 copy get 255 div
	      3 1 roll 1 add get 255 div
	      4 2 roll 2 add get 255 div
	      5 3 roll 3 add get 255 div
	    }
	 }
	4 index get aload pop counttomark -1 roll
      }
      { /exec load 3 -1 roll
		% Stack: -mark- mapproc --exec-- basesetcolor
      }
     ifelse .packtomark cvx
     exch pop 1 exch
   } bind def
  /Separation
   { dup 2 index //.csncompdict exch get exec
		% Stack: [/Separation name alt xform] ncomp altsetcolor
     3 -1 roll 3 get /exec load 3 -1 roll 3 array astore readonly cvx
     exch pop 1 exch
   } bind def
	% Substitute device spaces for CIE spaces.
  /CIEBasedA /DeviceGray load def
  /CIEBasedABC /DeviceRGB load def
  /CIEBasedDEF /DeviceRGB load def
  /CIEBasedDEFG /DeviceCMYK load def
end

/.packtomark { counttomark packedarray exch pop } bind def

/.csinextbits		% - .csinextbits <bits>
			% Uses b, nnb, i, row, mask, BitsPerComponent;
			% sets b, nnb, i.
 { /nnb nnb BitsPerComponent add
    { dup 0 le { exit } if
      /b b 8 bitshift row i get add def
      /i i 1 add def  8 sub
    }
   loop def
   b nnb bitshift mask and
 } bind def

% Note that the ColorSpace key must be present in the image dictionary.
/.colorspaceimage		% <imagedict> .colorspaceimage -
 { save exch
   dup length 15 add dict begin { cvlit def } forall
   ColorSpace dup dup type /nametype ne { 0 get } if
   .csncompdict exch get exec
     /setpixelcolor exch def  /ncomp exch def  pop
   /row ncomp BitsPerComponent mul Width mul 7 add 8 idiv string def
      /mask 1 BitsPerComponent bitshift 1 sub def
      /nextbits BitsPerComponent 8 eq
       { { row i get /i i 1 add def } }
       { /.csinextbits load }
      ifelse def
      /nextpixel mark 0 2 ncomp 1 sub 2 mul
       { /nextbits cvx exch
	 Decode exch 2 getinterval
	 dup aload pop exch sub
	 dup mask eq { pop } { mask div /mul load 3 -1 roll } ifelse
	 0 get dup 0 eq { pop } { /sub load 3 -1 roll } ifelse
       }
      for
      /setpixelcolor load dup type /operatortype ne { /exec load } if
      .packtomark cvx def
      /readrow
        /DataSource load dup type
        dup /arraytype eq exch /packedarraytype eq or
	{	% Must be { <file> <string> ... }
	  aload length 1 add array /pop load exch astore
	  dup 1 row put cvx
	}
	{ pop
		% Adobe requires readstring to signal an error if given
		% an empty string.  Work around this nonsense here.
          row length 0 eq
	   { { } }
	   { { DataSource row readstring pop pop } }
	  ifelse
	}
      ifelse def
      ImageMatrix matrix invertmatrix concat
      /imat matrix def
      0 1 Height 1 sub
       { imat 5 3 -1 roll neg put
	 readrow
	 /b 0 def  /nnb 0 def  /i 0 def
	 0 1 Width 1 sub
	  { imat 4 3 -1 roll neg put nextpixel
	    1 1 true imat {<80>} imagemask
	  }
	 for
       }
      for
   end restore
 } bind def

%END
exec
currentfile closefile

% Patch for testing.
/.cincompdict 3 dict begin
  1 { {0 1} {/DeviceGray} } def
  3 { {0 1 0 1 0 1} {/DeviceRGB} } def
  4 { {0 1 0 1 0 1 0 1} {/DeviceCMYK} } def
currentdict end def
/.imagekeys [
  /Decode /DataSource /ImageMatrix /BitsPerComponent /Height /Width
] def
/colorimage		% <width> <height> <bits/comp> <matrix>
			%   <datasrc> false <ncomp> colorimage -
 { 1 index { /colorimage load /rangecheck signalerror } if exch pop
   //.cincompdict exch get exec
   7 dict begin /ColorSpace exch cvlit def
   .imagekeys { exch cvlit def } forall
   currentdict end .colorspaceimage
 } bind odef
/image
 { dup type /dicttype ne
    { 7 dict begin /ColorSpace /DeviceGray def [0 1] 
      .imagekeys { exch cvlit def } forall
      currentdict end
    }
    { dup length 1 add dict .copydict dup /ColorSpace currentcolorspace put
    }
   ifelse
   .colorspaceimage
 } bind odef

exec