summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlgs/lib/gs_devn.ps
blob: 7b7171238169d5ebf5c8e9320afe80c2b03e1a13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
%    Copyright (C) 2001, 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_devn.ps 8048 2007-06-13 16:27:33Z tim $
% DeviceN color space method dictionary; this depends on gs_sepr.ps


% verify that DeviceN and Separation color spaces are supported
/.setdevicenspace where
  {
    pop
    /.setseparationspace where
      { pop //false }
      { //true }
    ifelse
  }
  { //true }
ifelse
  { currentfile closefile }
if

.currentglobal true .setglobal
.cspace_util begin


%
%   <c1> ... <cm>  <array>   apply_devn_tint_xform   <c1>' ... <cn>'  <array>
%
% Apply the tint transformation for the DeviceN color intensity values.
/apply_devn_tint_xform
  {
    dup 1 get length 1 add exch
    mark 2 index 2 add 2 roll
    index 3 get exec
    counttomark 2 add -2 roll pop
  }
bind def



colorspacedict
/DeviceN
  mark
    /cs_potential_indexed_base true
    /cs_potential_pattern_base true
    /cs_potential_alternate false
    /cs_potential_icc_alternate false
    /cs_get_ncomps { 1 get length } bind
    /cs_get_range { 1 get length [ exch { 0 1 } repeat ] } bind
    /cs_get_default_color { 1 get length { 1 } repeat } bind

    /cs_get_currentgray
      { //apply_devn_tint_xform exec 2 get //.cs_get_currentgray exec }
    bind
    /cs_get_currentrgb
      { //apply_devn_tint_xform exec 2 get //.cs_get_currentrgb exec }
    bind
    /cs_get_currentcmyk
      { //apply_devn_tint_xform exec 2 get //.cs_get_currentcmyk exec }
    bind

    % a lot of validation is done by the cs_validate method
    /cs_validate
      {
        //check_array exec
        dup 1 get //check_array exec
          {
            type dup /nametype ne exch /stringtype ne and
              //setcspace_typecheck
            if
          }
        forall
        dup 2 get //.cs_validate exec //.cs_potential_alternate exec not
          //setcspace_rangecheck
        if
        dup 3 get //check_array exec xcheck not
          //setcspace_typecheck
        if
      }
    bind

    % substitute the base space if appropriate
    /cs_substitute
      {
        dup 2 get //.cs_substitute exec 2 copy eq
          { pop pop dup }
          {
            % retain only the new alternate space
            exch pop

            % build all new structures in local VM
            .currentglobal 3 1 roll //false .setglobal

            % construct a new array and insert the new base color space
            1 index dup length array copy dup 2 4 -1 roll put

            % restore VM mode
            3 -1 roll .setglobal
          }
        ifelse
      }
    bind

    %
    % The Ghostscript interpreter works better when tinttransform procedures
    % are translated into functions. Attempt to do that here.
    %
    /cs_prepare //converttinttransform

    %
    % Install the current color space.
    %
    % The current Ghostscript color space implementation requires that
    % color spaces that provide a base or alternative color space set
    % that base/alternative color space to be the current color space
    % before attempting to set the original color space.
    %
    % Beginning with Acrobat 5, PDF apparently supports 1-component
    % DeviceN color spaces with the single component "All" (the "PDF
    % Reference", 3rd ed., p. 206 still describes this as illegal).
    % We translate such calls to Separation color spaces.
    %
    /cs_install
      {
        % save the current color space
        currentcolorspace

        % set the base color space as the current color space
        1 index 2 get //forcesetcolorspace

        % set the indexed color space; restore the earlier space on error
        mark 2 index
        dup 1 get dup length 1 eq exch 0 get /All eq and
          {
            dup length array copy
            dup 0 /Separation put
            dup 1 /All put
              { .setseparationspace }
          } {
	    {
	      dup .setdevicenspace 
	      % Check if the DeviceN color space includes an 'attributes'
	      % dict with a Colorants dict.  If present then we want to
	      % attach the separation colorspace in the Colorants dict to
	      % the DeviceN color space description within the graphics
	      % library.  To do this we are creating a temp gstate, building
	      % each of the Colorants color spaces in the temp gstate and
	      % then attaching the temp color space to the DeviceN color
	      % space.  This round about procedure is done to create
	      % descriptions of the Colorants color spaces which are
	      % equivalent to any other color space (i.e. with color space
	      % substitution performed on the alternate color space and the
	      % tint transform function sampled).
	      dup length 4 gt {
		dup 4 get /Colorants .knownget {
	          { gsave
		    { % Ignore any problems with the Colorants color spaces
		      //forcesetcolorspace .attachdevicenattributespace
	     	    } stopped pop
	   	    grestore
	   	  } forall
	        } if
	      } if
	      pop
  	    }
          }
        ifelse
        stopped
          { cleartomark setcolorspace stop }
          { pop pop pop }
        ifelse
      }
    bind

    /cs_prepare_color { dup 1 get length //check_num_stack exec pop } bind

    %
    % If a DeviceN color space is not supported in native mode by
    % the current process color model, Adobe implementations will always
    % execute the tint transform procedure when setcolor is invoked.
    % Ghostscript may have turned this transform into a sampled function,
    % and even if this is not the case, will have sampled the transform
    % when the color space is first set. Some applications depend on
    % the Adobe behavior, so we implement it via the cs_complete_setcolor
    % method.
    %
    /cs_complete_setcolor
      {
        .usealternate
          {
            pop
            currentcolor
            currentcolorspace 3 get exec
            currentcolorspace 2 get
            //clear_setcolor_operands exec            
          }
          { pop }
        ifelse
      }
    bind

  .dicttomark
put

end     % .cspace_util
.setglobal