185 lines
5.5 KiB
PostScript
185 lines
5.5 KiB
PostScript
|
% Copyright (C) 1995, 1996 Aladdin Enterprises. All rights reserved.
|
||
|
%
|
||
|
% This software is provided AS-IS with no warranty, either express or
|
||
|
% implied.
|
||
|
%
|
||
|
% 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.
|
||
|
%
|
||
|
% 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: gs_l2img.ps,v 1.4 2002/02/21 21:49:28 giles Exp $
|
||
|
% 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
|