\!/ KyuuKazami \!/

Path : /usr/share/ghostscript/8.70/Resource/Init/
Upload :
Current File : //usr/share/ghostscript/8.70/Resource/Init/gs_cspace.ps

%    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 it
          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_space2>
%
/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 <color_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

@KyuuKazami