104
105
#define compare_color_names(name, name_size, str, str_size) \
105
106
(name_size == str_size && \
106
(strncmp((const char *)name, (const char *)str, name_size) == 0))
107
(strncmp((const char *)name, (const char *)str, name_size) == 0))
109
110
update_Separation_spot_equivalent_cmyk_colors(gx_device * pdev,
110
const gs_state * pgs, const gs_color_space * pcs,
111
gs_devn_params * pdevn_params,
112
equivalent_cmyk_color_params * pparams)
111
const gs_state * pgs, const gs_color_space * pcs,
112
gs_devn_params * pdevn_params,
113
equivalent_cmyk_color_params * pparams)
117
118
* Check if the color space's separation name matches any of the
118
119
* separations for which we need an equivalent CMYK color.
120
121
for (i = 0; i < pdevn_params->separations.num_separations; i++) {
121
if (pparams->color[i].color_info_valid == false) {
122
const devn_separation_name * dev_sep_name =
123
&(pdevn_params->separations.names[i]);
124
unsigned int cs_sep_name_size;
125
unsigned char * pcs_sep_name;
127
pcs->params.separation.get_colorname_string
128
(pdev->memory, pcs->params.separation.sep_name, &pcs_sep_name,
130
if (compare_color_names(dev_sep_name->data, dev_sep_name->size,
131
pcs_sep_name, cs_sep_name_size)) {
132
gs_color_space temp_cs = *pcs;
133
gs_client_color client_color;
136
* Create a copy of the color space and then modify it
137
* to force the use of the alternate color space.
139
temp_cs.params.separation.use_alt_cspace = true;
140
client_color.paint.values[0] = 1.0;
141
capture_spot_equivalent_cmyk_colors(pdev, pgs, &client_color,
142
&temp_cs, i, pparams);
122
if (pparams->color[i].color_info_valid == false) {
123
const devn_separation_name * dev_sep_name =
124
&(pdevn_params->separations.names[i]);
125
unsigned int cs_sep_name_size;
126
unsigned char * pcs_sep_name;
128
pcs->params.separation.get_colorname_string
129
(pdev->memory, pcs->params.separation.sep_name, &pcs_sep_name,
131
if (compare_color_names(dev_sep_name->data, dev_sep_name->size,
132
pcs_sep_name, cs_sep_name_size)) {
133
gs_color_space temp_cs = *pcs;
134
gs_client_color client_color;
137
* Create a copy of the color space and then modify it
138
* to force the use of the alternate color space.
140
temp_cs.params.separation.use_alt_cspace = true;
141
client_color.paint.values[0] = 1.0;
142
capture_spot_equivalent_cmyk_colors(pdev, pgs, &client_color,
143
&temp_cs, i, pparams);
150
151
update_DeviceN_spot_equivalent_cmyk_colors(gx_device * pdev,
151
const gs_state * pgs, const gs_color_space * pcs,
152
gs_devn_params * pdevn_params,
153
equivalent_cmyk_color_params * pparams)
152
const gs_state * pgs, const gs_color_space * pcs,
153
gs_devn_params * pdevn_params,
154
equivalent_cmyk_color_params * pparams)
162
163
* our capture logic does not work properly. When present, the 'None'
163
164
* components contain alternate color information. However this info is
164
165
* specified as part of the 'color' and not part of the color space. Thus
165
* we do not have this data when this routine is called. See the
166
* we do not have this data when this routine is called. See the
166
167
* description of DeviceN color spaces in section 4.5 of the PDF spec.
167
168
* In this situation we exit rather than produce invalid values.
169
170
for (j = 0; j < pcs->params.device_n.num_components; j++) {
170
pcs->params.device_n.get_colorname_string
171
(pdev->memory, pcs->params.device_n.names[j],
172
&pcs_sep_name, &cs_sep_name_size);
173
if (compare_color_names("None", 4, pcs_sep_name, cs_sep_name_size))
171
pcs->params.device_n.get_colorname_string
172
(pdev->memory, pcs->params.device_n.names[j],
173
&pcs_sep_name, &cs_sep_name_size);
174
if (compare_color_names("None", 4, pcs_sep_name, cs_sep_name_size))
178
179
* Check if the color space's separation names matches any of the
179
180
* separations for which we need an equivalent CMYK color.
181
182
for (i = 0; i < pdevn_params->separations.num_separations; i++) {
182
if (pparams->color[i].color_info_valid == false) {
183
const devn_separation_name * dev_sep_name =
184
&(pdevn_params->separations.names[i]);
186
for (j = 0; j < pcs->params.device_n.num_components; j++) {
187
pcs->params.device_n.get_colorname_string
188
(pdev->memory, pcs->params.device_n.names[j], &pcs_sep_name,
190
if (compare_color_names(dev_sep_name->data, dev_sep_name->size,
191
pcs_sep_name, cs_sep_name_size)) {
192
gs_color_space temp_cs = *pcs;
193
gs_client_color client_color;
196
* Create a copy of the color space and then modify it
197
* to force the use of the alternate color space.
199
memset(&client_color, 0, sizeof(client_color));
200
temp_cs.params.device_n.use_alt_cspace = true;
201
client_color.paint.values[j] = 1.0;
202
capture_spot_equivalent_cmyk_colors(pdev, pgs, &client_color,
203
&temp_cs, i, pparams);
183
if (pparams->color[i].color_info_valid == false) {
184
const devn_separation_name * dev_sep_name =
185
&(pdevn_params->separations.names[i]);
187
for (j = 0; j < pcs->params.device_n.num_components; j++) {
188
pcs->params.device_n.get_colorname_string
189
(pdev->memory, pcs->params.device_n.names[j], &pcs_sep_name,
191
if (compare_color_names(dev_sep_name->data, dev_sep_name->size,
192
pcs_sep_name, cs_sep_name_size)) {
193
gs_color_space temp_cs = *pcs;
194
gs_client_color client_color;
197
* Create a copy of the color space and then modify it
198
* to force the use of the alternate color space.
200
memset(&client_color, 0, sizeof(client_color));
201
temp_cs.params.device_n.use_alt_cspace = true;
202
client_color.paint.values[j] = 1.0;
203
capture_spot_equivalent_cmyk_colors(pdev, pgs, &client_color,
204
&temp_cs, i, pparams);
211
212
static bool check_all_colors_known(int num_spot,
212
equivalent_cmyk_color_params * pparams)
213
equivalent_cmyk_color_params * pparams)
214
215
for (num_spot--; num_spot >= 0; num_spot--)
215
if (pparams->color[num_spot].color_info_valid == false)
216
if (pparams->color[num_spot].color_info_valid == false)
241
242
pcs = gs_currentcolorspace_inline(pgs);
242
243
if (pcs != NULL) {
243
if (pcs->type->index == gs_color_space_index_Separation) {
244
update_Separation_spot_equivalent_cmyk_colors(pdev, pgs, pcs,
245
pdevn_params, pparams);
246
pparams->all_color_info_valid = check_all_colors_known
247
(pdevn_params->separations.num_separations, pparams);
249
else if (pcs->type->index == gs_color_space_index_DeviceN) {
250
update_DeviceN_spot_equivalent_cmyk_colors(pdev, pgs, pcs,
251
pdevn_params, pparams);
252
pparams->all_color_info_valid = check_all_colors_known
253
(pdevn_params->separations.num_separations, pparams);
244
if (pcs->type->index == gs_color_space_index_Separation) {
245
update_Separation_spot_equivalent_cmyk_colors(pdev, pgs, pcs,
246
pdevn_params, pparams);
247
pparams->all_color_info_valid = check_all_colors_known
248
(pdevn_params->separations.num_separations, pparams);
250
else if (pcs->type->index == gs_color_space_index_DeviceN) {
251
update_DeviceN_spot_equivalent_cmyk_colors(pdev, pgs, pcs,
252
pdevn_params, pparams);
253
pparams->all_color_info_valid = check_all_colors_known
254
(pdevn_params->separations.num_separations, pparams);
259
260
save_spot_equivalent_cmyk_color(int sep_num,
260
equivalent_cmyk_color_params * pparams, frac cmyk[4])
261
equivalent_cmyk_color_params * pparams, frac cmyk[4])
262
263
pparams->color[sep_num].c = cmyk[0];
263
264
pparams->color[sep_num].m = cmyk[1];
291
292
static cmap_proc_devicen(cmap_devicen_capture_cmyk_color);
293
294
static const gx_color_map_procs cmap_capture_cmyk_color = {
294
cmap_gray_capture_cmyk_color,
295
cmap_rgb_capture_cmyk_color,
295
cmap_gray_capture_cmyk_color,
296
cmap_rgb_capture_cmyk_color,
296
297
cmap_cmyk_capture_cmyk_color,
297
298
cmap_rgb_alpha_capture_cmyk_color,
298
299
cmap_separation_capture_cmyk_color,
346
347
cmap_rgb_alpha_capture_cmyk_color(frac r, frac g, frac b, frac alpha,
347
gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev,
348
gs_color_select_t select)
348
gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev,
349
gs_color_select_t select)
350
351
cmap_rgb_capture_cmyk_color(r, g, b, pdc, pis, dev, select);
376
377
gs_imager_state temp_state = *((const gs_imager_state *)pgs);
377
378
color_capture_device temp_device = { 0 };
378
379
gx_device_color dev_color;
380
gsicc_rendering_intents_t rendering_intent;
382
cmm_dev_profile_t *dev_profile;
383
cmm_profile_t *curr_output_profile;
384
cmm_dev_profile_t temp_profile;
386
code = dev_proc(pdev, get_profile)(pdev, &dev_profile);
387
gsicc_extract_profile(pdev->graphics_type_tag,
388
dev_profile, &(curr_output_profile),
381
391
* Create a temp device. The primary purpose of this device is pass the
382
392
* separation number and a pointer to the original device's equivalent
383
393
* color parameters. Since we only using this device for a very specific
384
* purpose, we only set up the color_info structure and and our data.
394
* purpose, we only set up the color_info structure and our data.
386
396
temp_device.color_info = pdev->color_info;
387
397
temp_device.sep_num = sep_num;
388
398
temp_device.pequiv_cmyk_colors = pparams;
389
399
temp_device.memory = pgs->memory;
390
temp_device.device_icc_profile = pdev->device_icc_profile;
401
temp_profile.device_profile[0] = curr_output_profile;
402
temp_profile.device_profile[1] = NULL;
403
temp_profile.device_profile[2] = NULL;
404
temp_profile.device_profile[2] = NULL;
405
temp_device.icc_array = &temp_profile;
406
set_dev_proc(&temp_device, get_profile, gx_default_get_profile);
392
409
* Create a temp copy of the imager state. We do this so that we
393
410
* can modify the color space mapping (cmap) procs. We use our