1
/* Copyright (C) 2001-2006 Artifex Software, Inc.
4
This software is provided AS-IS with no warranty, either express or
7
This software is distributed under license and may not be copied, modified
8
or distributed except as expressly authorized under the terms of that
9
license. Refer to licensing information at http://www.artifex.com/
10
or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
11
San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
14
/* $Id: gscolor1.c 8022 2007-06-05 22:23:38Z giles $ */
15
/* Level 1 extended color operators for Ghostscript library */
19
#include "gsutil.h" /* for gs_next_ids */
23
#include "gxdevice.h" /* for gx_color_index */
31
/* Imports from gscolor.c */
32
void load_transfer_map(gs_state *, gx_transfer_map *, floatp);
34
/* Imported from gsht.c */
35
void gx_set_effective_transfer(gs_state *);
37
/* Force a parameter into the range [0.0..1.0]. */
38
#define FORCE_UNIT(p) (p < 0.0 ? 0.0 : p > 1.0 ? 1.0 : p)
42
gs_setcmykcolor(gs_state * pgs, floatp c, floatp m, floatp y, floatp k)
47
pcs = gs_cspace_new_DeviceCMYK(pgs->memory);
49
return_error(gs_error_VMerror);
50
if ((code = gs_setcolorspace(pgs, pcs)) >= 0) {
51
gs_client_color * pcc = pgs->ccolor;
53
cs_adjust_color_count(pgs, -1); /* not strictly necessary */
54
pcc->paint.values[0] = FORCE_UNIT(c);
55
pcc->paint.values[1] = FORCE_UNIT(m);
56
pcc->paint.values[2] = FORCE_UNIT(y);
57
pcc->paint.values[3] = FORCE_UNIT(k);
58
pcc->pattern = 0; /* for GC */
59
gx_unset_dev_color(pgs);
61
rc_decrement_only(pcs, "gs_setcmykcolor");
66
/* setblackgeneration */
67
/* Remap=0 is used by the interpreter. */
69
gs_setblackgeneration(gs_state * pgs, gs_mapping_proc proc)
71
return gs_setblackgeneration_remap(pgs, proc, true);
74
gs_setblackgeneration_remap(gs_state * pgs, gs_mapping_proc proc, bool remap)
76
rc_unshare_struct(pgs->black_generation, gx_transfer_map,
77
&st_transfer_map, pgs->memory,
78
return_error(gs_error_VMerror),
79
"gs_setblackgeneration");
80
pgs->black_generation->proc = proc;
81
pgs->black_generation->id = gs_next_ids(pgs->memory, 1);
83
load_transfer_map(pgs, pgs->black_generation, 0.0);
84
gx_unset_dev_color(pgs);
89
/* currentblackgeneration */
91
gs_currentblackgeneration(const gs_state * pgs)
93
return pgs->black_generation->proc;
96
/* setundercolorremoval */
97
/* Remap=0 is used by the interpreter. */
99
gs_setundercolorremoval(gs_state * pgs, gs_mapping_proc proc)
101
return gs_setundercolorremoval_remap(pgs, proc, true);
104
gs_setundercolorremoval_remap(gs_state * pgs, gs_mapping_proc proc, bool remap)
106
rc_unshare_struct(pgs->undercolor_removal, gx_transfer_map,
107
&st_transfer_map, pgs->memory,
108
return_error(gs_error_VMerror),
109
"gs_setundercolorremoval");
110
pgs->undercolor_removal->proc = proc;
111
pgs->undercolor_removal->id = gs_next_ids(pgs->memory, 1);
113
load_transfer_map(pgs, pgs->undercolor_removal, -1.0);
114
gx_unset_dev_color(pgs);
119
/* currentundercolorremoval */
121
gs_currentundercolorremoval(const gs_state * pgs)
123
return pgs->undercolor_removal->proc;
126
/* setcolortransfer */
127
/* Remap=0 is used by the interpreter. */
129
gs_setcolortransfer_remap(gs_state * pgs, gs_mapping_proc red_proc,
130
gs_mapping_proc green_proc,
131
gs_mapping_proc blue_proc,
132
gs_mapping_proc gray_proc, bool remap)
134
gx_transfer *ptran = &pgs->set_transfer;
136
gs_id new_ids = gs_next_ids(pgs->memory, 4);
137
gx_device * dev = pgs->device;
140
rc_unshare_struct(ptran->gray, gx_transfer_map, &st_transfer_map,
141
pgs->memory, goto fgray, "gs_setcolortransfer");
142
rc_unshare_struct(ptran->red, gx_transfer_map, &st_transfer_map,
143
pgs->memory, goto fred, "gs_setcolortransfer");
144
rc_unshare_struct(ptran->green, gx_transfer_map, &st_transfer_map,
145
pgs->memory, goto fgreen, "gs_setcolortransfer");
146
rc_unshare_struct(ptran->blue, gx_transfer_map, &st_transfer_map,
147
pgs->memory, goto fblue, "gs_setcolortransfer");
148
ptran->gray->proc = gray_proc;
149
ptran->gray->id = new_ids;
150
ptran->red->proc = red_proc;
151
ptran->red->id = new_ids + 1;
152
ptran->green->proc = green_proc;
153
ptran->green->id = new_ids + 2;
154
ptran->blue->proc = blue_proc;
155
ptran->blue->id = new_ids + 3;
156
ptran->red_component_num =
157
gs_color_name_component_number(dev, "Red", 3, ht_type_colorscreen);
158
ptran->green_component_num =
159
gs_color_name_component_number(dev, "Green", 5, ht_type_colorscreen);
160
ptran->blue_component_num =
161
gs_color_name_component_number(dev, "Blue", 4, ht_type_colorscreen);
162
ptran->gray_component_num =
163
gs_color_name_component_number(dev, "Gray", 4, ht_type_colorscreen);
165
load_transfer_map(pgs, ptran->red, 0.0);
166
load_transfer_map(pgs, ptran->green, 0.0);
167
load_transfer_map(pgs, ptran->blue, 0.0);
168
load_transfer_map(pgs, ptran->gray, 0.0);
169
gx_set_effective_transfer(pgs);
170
gx_unset_dev_color(pgs);
172
gx_set_effective_transfer(pgs);
175
rc_assign(ptran->green, old.green, "setcolortransfer");
177
rc_assign(ptran->red, old.red, "setcolortransfer");
179
rc_assign(ptran->gray, old.gray, "setcolortransfer");
181
return_error(gs_error_VMerror);
184
gs_setcolortransfer(gs_state * pgs, gs_mapping_proc red_proc,
185
gs_mapping_proc green_proc, gs_mapping_proc blue_proc,
186
gs_mapping_proc gray_proc)
188
return gs_setcolortransfer_remap(pgs, red_proc, green_proc,
189
blue_proc, gray_proc, true);
192
/* currentcolortransfer */
194
gs_currentcolortransfer(const gs_state * pgs, gs_mapping_proc procs[4])
196
const gx_transfer *ptran = &pgs->set_transfer;
198
procs[0] = ptran->red->proc;
199
procs[1] = ptran->green->proc;
200
procs[2] = ptran->blue->proc;
201
procs[3] = ptran->gray->proc;