Gs Cspace - Ps

You might also like

Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 4

% % % % % % % % % % % % % %

Copyright (C) 2002 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_cspace.ps 8962 2008-08-11 14:16:18Z ken $ % basic colorspace mechanism % % There have been some major changes to the PostScript colour handling. % In particular, the vast majority of the colour space code has been % converted from PostScript to C. This file has been extensively % modified, as has gs_icc.ps. The remaining PostScript files which % previously implemented colour space handling; gs_ciecs2.ps, gs_ciecs3.ps % gs_devcs.ps, gs_devn.ps, gs_devpxl.ps, gs_indxd.ps, gs_patrn.ps and % gs_sepr.ps have been superceded by the C code and removed. % % gs_lev2.ps and gs_ll3.ps have also been modified so that they no longer % attempt to execute these PostScript files. % .currentglobal true .setglobal systemdict begin % % gs_res.ps, and possibly other files, use this dictionary. Formerly % in cspace_util, moved to systemdict. % 20 dict dup /colorspacedict exch def begin % colorspacedict % % gs_res.ps uses these entries in colorspacedict % to populate the ColorSpaceFamily resource, so we need % to add the supported spaces. % /DeviceGray [] def /DeviceRGB [] def /DeviceCMYK [] def end % colorspacedict % % % % % % % % % Global, read-only, unpacked, array-form device color spaces We need to return an array argument in response to currentcolorspace even if the argument presented to setcolorspace was a simple device space name. Not only that, but in order to satisfy some Adobe applications, it must be the *same* array every time. The only way to do that is to define an appropriate set initial arrays and always return one of those. These arrays are defined here.

/DeviceGray_array /DeviceGray 1 array astore readonly def /DeviceRGB_array /DeviceRGB 1 array astore readonly def /DeviceCMYK_array /DeviceCMYK 1 array astore readonly def % % - initgraphics % % The internal routine gs_initgraphics doesn't (re)set the color space, % so we must redefine the operation to do it here. % % /initgraphics { initgraphics systemdict /DeviceGray_array get setcolorspace } .bind odef % % These routines used for the NOSUBSTDEVICECOLORS switch. This prevents % substitution of DeviceGray, DeviceRGB and DeviceCMYK with a Default* % colour space when /UseCIEColors is true. If the job includes a % definition of /DefaltGray, DefaultRGB or DefaultCMYK then it also executes % .includecolorspace to allow the device to record the substitute space. % /..page_default_spaces 3 dict def % % Used internally to retrieve any relevant default colour space. % % <Default space name> ..nosubstdevicetest false % <Default space name> [space] true % % If the boolean is true then the C code must set the additional colour space % and execute .includecolorspace before finally setting a DeviceGray space. % /..nosubstdevicetest { false mark 3 -1 roll % If we have already recorded this space, don't repeat it. systemdict /..page_default_spaces get 1 index known { cleartomark } { { % Check to see if this space was defined by defineresource, if so then % the job defined it, otherwise its the usual default, so ignore it. dup /ColorSpace resourcestatus { pop 0 eq { % Default* defined by defineresource systemdict /..page_default_spaces get 1 index //true put dup /ColorSpace findresource 4 2 roll pop pop true }{ cleartomark } ifelse }{ cleartomark } ifelse } stopped {cleartomark}if } ifelse }bind def

% % <color_space_name> ..includecolorspace % /..includecolorspace { % If we have already recorded this space, don't repeat it. systemdict /..page_default_spaces get 1 index known { pop } { mark exch { % Check to see if this space was defined by defineresource, if so then % the job defined it, otherwise its the usual default, so ignore it. dup /ColorSpace resourcestatus { pop 0 eq { % Job defined /Default*, so record it and allow the device access to i t systemdict /..page_default_spaces get 1 index //true put gsave { dup /ColorSpace findresource //setcolorspace exec .includecolorspace } stopped pop grestore } if } if } stopped pop cleartomark } ifelse } bind def % % <color_space> <color_space_name> cs_substitute_generic <color_space1> <color_s pace2> % /cs_substitute_generic { .getuseciecolor {NOSUBSTDEVICECOLORS { //..includecolorspace exec dup } { /ColorSpace findresource } ifelse } { pop dup } ifelse } bind def % % <color_space> <color_space_name> cs_substitute_DeviceRGB_for_PDFX_or_PDFA <col or_space1> <color_space2> % /cs_substitute_DeviceRGB_for_PDFX_or_PDFA { systemdict /PDFX .knownget not { false } if systemdict /PDFA .knownget not { false } if or { dup /ColorSpace resourcestatus { pop pop } { (Error: Need a /DefaultRGB /ColorSpace resource for generating a PDF/X or PDF/A document.) = /cs_substitute_DeviceRGB_for_PDFX_or_PDFA cvx /undefined signalerror } ifelse

/ColorSpace findresource } { //cs_substitute_generic exec } ifelse } bind def end % % used to convert the DataSource of an ICCBased colour space into a % file, if it isn't one already. This is required because the current % implementation of ICC spaces requires the data source to be a file. % This routine is *only* called from the PostScript interpreter when % setting an ICCBased space with a string data source. % /.convertICCSource { % make DataSource a file dup 1 get /DataSource get type /stringtype eq { % build all new structures in local VM .currentglobal exch //false .setglobal % check if we need to copy the color space and dictionary 2 copy eq { dup length array copy dup 1 2 copy get dup length dict copy put } if % fetch DataSource, setting up stack for multiple puts dup 1 2 copy get dup /DataSource 2 copy get % convert the string into a file /ReusableStreamDecode filter % put the file into the dictioary, the dictionary into the array put put % restore the VM mode exch .setglobal } if } bind def % % Set the initial device space % systemdict /DeviceGray_array get setcolorspace .setglobal

You might also like