123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- % Copyright (C) 1995, 1996 Aladdin Enterprises. All rights reserved.
- %
- % This file is part of AFPL Ghostscript.
- %
- % 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.
- %
- % 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.
- % $Id: gs_l2img.ps,v 1.2 2000/09/19 18:29:11 lpd 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
|