184 lines · 5.5 KB · Text
RawDownload
%    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 defend /.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 %ENDexeccurrentfile 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} } defcurrentdict 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