xref: /plan9/sys/src/cmd/gs/src/gsovrc.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 2002 Aladdin Enterprises.  All rights reserved.
2 
3   This software is provided AS-IS with no warranty, either express or
4   implied.
5 
6   This software is distributed under license and may not be copied,
7   modified or distributed except as expressly authorized under the terms
8   of the license contained in the file LICENSE in this distribution.
9 
10   For more information about licensing, please refer to
11   http://www.ghostscript.com/licensing/. For information on
12   commercial licensing, go to http://www.artifex.com/licensing/ or
13   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15 */
16 
17 /* $Id: gsovrc.h,v 1.4 2004/09/22 00:37:12 dan Exp $ */
18 /* overprint/overprint mode compositor interface */
19 
20 #ifndef gsovrc_INCLUDED
21 #  define gsovrc_INCLUDED
22 
23 #include "gsstype.h"
24 #include "gxcomp.h"
25 
26 /*
27  * Overprint compositor.
28  *
29  * The overprint and overprint mode capability allow drawing operations
30  * to affect a subset of the set of color model components, rather than
31  * all components. The overprint feature allows the set of affected
32  * components to be determined by the color space, but independently of
33  * the drawing color. Overprint mode allows both the color space and
34  * drawing color to determine which components are affected.
35  *
36  * The significance of the overprint feature for a device is dependent on
37  * the extent of rendering that is to be performed for that device:
38  *
39  *  1. High level devices, such as the PDFWrite and PSWrite devices,
40  *     do not, in principle, require the graphic library to convert
41  *     between color spaces and color models. These devices can accept
42  *     color space descriptions, so conversion to a color model can be
43  *     left to whatever application uses the generated file.
44  *
45  *     For these devices, overprint and overprint mode are just
46  *     additional state parameters that are incorporated into the output
47  *     file, which may or may not be supported on the eventual target
48  *     application.
49  *
50  *     Note that the current implementation of PDFWrite and PSWrite
51  *     do require the graphic library to convert between color spaces
52  *     and a color model, for all objects except images. To implement
53  *     the overprint feature under this design, the devices would
54  *     have to support the get_bits_rectangle method, which means they
55  *     would need to function as low-level devices. Since that defeats
56  *     the purpose of having a high-level device, for the time being
57  *     overprint and overprint mode are not fully supported for the
58  *     PDFWrite and PSWrite devices.
59  *
60  *  2. Low level devices require the graphic library to convert between
61  *     color spaces and color models, and perform actual rendering. For
62  *     these devices both overprint and overprint mode require a form
63  *     of mixing of the drawing color with any existing output. This
64  *     mixing is mechanically similar to that required for transparency
65  *     or raster op support, but differs from these because it affects
66  *     different color components differently (transparency and raster
67  *     operations are applied uniformly to all color components).
68  *
69  * Because the implementation of overprint for high level devices is
70  * either trivial or essentially impossible (short of dealing with them
71  * as low level devices), the discussion below is restricted to the
72  * implementation for low level devices.
73  *
74  * In principle, the effects of overprint and overprint mode are
75  * modified by changes to the current color, the current color space,
76  * and the process color model.
77  *
78  * In most situation, the process color model cannot be changed without
79  * discarding any existing graphic output, so within a given page this
80  * affect may be ignored. An exception arises when emulating features
81  * such as the "overprint preview" mode of Acrobat 5.0. This mode uses
82  * a "fully dynamic" color model: any named color component is consider
83  * to exist in the process color model (its conversion to a "real" color
84  * is determined by the tint transform function associated with its
85  * initial invocation). In this situation, the process color model may
86  * "monotonically increase" as a page is processed. Since any such
87  * change is associated with a change of color space, we need not be
88  * concerned with independent changes in the process color model.
89  *
90  * For typical graphic operations such as line drawing or area filling,
91  * both the current color and the current color space remain constant.
92  * Overprint and overprint mode are significant for these operations
93  * only if the output page contained data prior to the operation. If
94  * this is not the case, overprint is irrelevant, as the initial state
95  * of any retained color components, and the state of these components
96  * in the drawing color, will be the same.
97  *
98  * Aside from the devices that generate output, Ghostscript makes use
99  * of two additional types of the devices for rendering. Forwarding
100  * devices do not generate output of their own; they merely forward
101  * rendering commands to a target device. Accumulating devices render
102  * output to a special buffer (often part of clipping or a caching
103  * operation), which is subsequently sent to the primary output device
104  * in a lower-level form.
105  *
106  * It is conceivable that a forwarding device could be dependent on the
107  * overprint feature (e.g.: an "inking" filter to determine how much
108  * of each colorant is required in each area of the output), but this
109  * is unlikely and, in practice, never seems to arise (in practice,
110  * inking filters scan the fully generated output). Hence, we ignore
111  * this possibility, and need not be concerned with overprint when
112  * installing or removing forwarding devices.
113  *
114  * Overprint is of interest to accumulating devices only if these
115  * devices either begin operation with a non-empty output buffer, or if
116  * the current color or color space can change during the lifetime of
117  * an instantiation of the device. Most instantiations of accumulating
118  * devices live only for the rendering of a single graphic object, for
119  * which neither the color or color space can change. There are a few
120  * exceptions:
121  *
122  *  - Though images and shaded fills are single graphic objects, they
123  *    involve (potentially) many colors. Conveniently, overprint mode
124  *    does not apply to either images or shaded fills, so these cause
125  *    no difficulty. For the same reason PatternType 2 patterns do
126  *    not cause difficulty, though it is necessary to create/update
127  *    the overprint compositor to reflect the colorspace included
128  *    in the shading dictionary.
129  *
130  *  - The gs_pdf14_device, which implements the PDF 1.4 transparency
131  *    facilities, is an accumulating device that supports only
132  *    the high-level rendering methods (fill_path, etc.). Actual
133  *    rendering is done with a separate marking device, an instance
134  *    of which is created for each graphic object rendered. The
135  *    marking device renders into the output buffer of the
136  *    gs_pdf14_device, which contains the results of prior rendering
137  *    operations. Thus, overprint is significant to the marking
138  *    device. The interaction of transparency and overprint are,
139  *    however, more complex than can be captured by a simple
140  *    compositor. The gs_pdf14_device and the corresponding device
141  *    (will) implement overprint and overprint mode directly. These
142  *    devices discard attempts to build an overprint compositor.
143  *
144  *  - The most essential exception involves colored tiling patterns.
145  *    Both the color and color space may change multiple times
146  *    during the rendering of a colored pattern. If a colored
147  *    pattern is cached, an accurate implementation would require
148  *    the cache to included compositor creation instructions.
149  *    This is not possible in the current Ghostscript pattern
150  *    cache (which has other problems independent of overprint).
151  *    The best that can be done is to keep the overprint compositor
152  *    current during the caching operation itself. For single level
153  *    patterns, this will allow the tile instance to be rendered
154  *    accurately, even if the tile does not properly overprint
155  *    the output raster.
156  *
157  * Based on this reasoning, we can limit application of the overprint
158  * compositor to a small numer of situations:
159  *
160  *  1. When the overprint or overprint mode parameter of the current
161  *     graphic state is changed (the overprint mode parameter is
162  *     ignored if overprint is set to false).
163  *
164  *  2. When the current color space changes, if overprint is set to true
165  *     (the colorspace cannot be relevant if the overprint is false).
166  *     There are a few exceptions to this rule for uncolored caches
167  *     (user paths, FontType 3 fonts) and anti-alias super-sampling.
168  *
169  *  3. If the current device color changes, if overprint is true and
170  *     overprint mode is 1.
171  *
172  *  4. If the device in the graphic state is changed, or if this device is
173  *     reopened after having been closed (e.g.: due to the action of
174  *     put_params), if the overprint parameter is set to true.
175  *
176  *  5. During grestore or setgstate (because the overprint/overprint
177  *     mode parameters might change without the current device changing).
178  *
179  *  6. When creating the pattern accumulator device, if overprint is
180  *     set to true.
181  *
182  * In PostScript and PDF, a change of the color space always has an
183  * associated change of the current color, so it is possible to
184  * exclude color space changes from the list above. We do not do this,
185  * however, because changes in the color space are usually less frequent
186  * than changes in the current color, and the latter are only significant
187  * if overprint mode is 1.
188  *
189  * Unlike the other compositors used by Ghostscript (the alpha-channel
190  * compositor and the implemented but not used raster operation
191  * compositor), once created, the overprint compositor is made part of the
192  * current graphic state, and assumes the lifetime and open/close
193  * status of the device to which it is applied. In effect, the device to
194  * which the compositor is applied will, for purposes of the graphic
195  * state, cease to exist as as independent item. The only way to discard
196  * the compositor is to change the current device.
197  *
198  * Subsequent invocations of create_compositor will not create a new
199  * compositor. Rather, they change the parameters of the existing
200  * compositor device. The compositor functions with only a small
201  * performance penalty if overprint is disabled, so there is no reason
202  * to discard the compositor if oveprint is turned off.
203  *
204  * The compositor device will emulate the open/close state of the device
205  * to which it is applied. This is accomplished by forwarding all open
206  * and close requests. In addition, the compositor device will check the
207  * status of the device to which it is applied after each put_params call,
208  * and will change its own status to reflect this status. The underlying
209  * device is required to close itself if an invocation of put_params
210  * changes in the process color model.
211  *
212  * NB: It is not possible, without an excessive performance delay, for
213  *     the compositor to detect all cases in which the device to which
214  *     it is applied may close itself due to an error condition. We
215  *     believe this will never cause difficulty in practice, as the
216  *     closing of a device is not itself used as an error indication.
217  */
218 
219 #ifndef gs_overprint_params_t_DEFINED
220 #  define gs_overprint_params_t_DEFINED
221 typedef struct gs_overprint_params_s    gs_overprint_params_t;
222 #endif
223 
224 struct gs_overprint_params_s {
225 
226     /*
227      * Are any component values to be retained?
228      *
229      * If this is false (overprint off), all other fields in the compositor
230      * are ignored, and the compositor does nothing with respect to rendering
231      * (it doesn't even impose a performance penalty).
232      *
233      * If this field is true, the retain_spot_comps and potentially the
234      * retained_comps fields should be initialized.
235      *
236      * Note that this field may be false even if overprint is true. This
237      * would be the case if the current color space was a Separation color
238      * space with the component "All".
239      */
240     bool            retain_any_comps;
241 
242     /*
243      * Are spot (non-process) color component values retained?
244      *
245      * If overprint is true, this field will be true for all color spaces
246      * other than Separation/DeviceN color spaces.
247      *
248      * The overprint compositor will itself determine what constitutes a
249      * process color. This is done by using the color space mapping
250      * routines for the target device for all three standard device
251      * color spaces (DeviceGray, DeviceRGB, and DeviceCMYK) and the
252      * set of all possible colors with individual components either 0
253      * or 1. Any color model component which is mapped to 0 for all of
254      * these cases is considered a spot color.
255      *
256      * If this field is true, the drawn_comps field (see below) is ignored.
257      *
258      * NB: This field should not be used if the DeviceCMYK color space
259      *     is being used with a DeviceCMYK color model (which may have
260      *     additional spot colors). Such a color model must explicitly
261      *     list the set of drawn components, so as to support overprint
262      *     mode.
263      */
264     bool            retain_spot_comps;
265 
266     /*
267      * The list of color model compoents to be retained (i.e.: that are
268      * not affected by drawing operations). The field is bit-encoded;
269      * the bit corresponding to component i is (1 << i).  This bit will be
270      * 1 if the corresponding component is set from the drawing color, 0 if
271      * it is to be left unaffected.
272      */
273     gx_color_index  drawn_comps;
274 };
275 
276 /*
277  * The overprint compositor structure. This is exactly analogous to other
278  * compositor structures, consisting of a the compositor common elements
279  * and the overprint-specific parameters.
280  */
281 typedef struct gs_overprint_s {
282     gs_composite_common;
283     gs_overprint_params_t   params;
284 } gs_overprint_t;
285 
286 /*
287  * In a modest violation of good coding practice, the gs_composite_common
288  * fields are "known" to be simple (contain no pointers to garbage
289  * collected memory), and we also know the gs_overprint_params_t structure
290  * to be simple, so we just create a trivial structure descriptor for the
291  * entire gs_overprint_s structure.
292  */
293 #define private_st_gs_overprint_t()	/* In gsovrc.c */\
294   gs_private_st_simple(st_overprint, gs_overprint_t, "gs_overprint_t");
295 
296 
297 
298 /* some elementary macros for manipulating drawn_comps */
299 #define gs_overprint_set_drawn_comp(drawn_comps, i) \
300     ((drawn_comps) |= (gx_color_index)1 << (i))
301 
302 #define gs_overprint_clear_drawn_comp(drawn_comps, i)   \
303     ((drawn_comps) &= ~((gx_color_index)1 << 1))
304 
305 #define gs_overprint_clear_all_drawn_comps(drawn_comps) \
306     ((drawn_comps) = 0)
307 
308 #define gs_overprint_get_drawn_comp(drawn_comps, i)     \
309     (((drawn_comps) & ((gx_color_index)1 << (i))) != 0)
310 
311 
312 /*
313  * In the unlikely event that the overprint parameters will ever be
314  * allocated on the heap, we provide GC structure descriptors for
315  * them.
316  */
317 extern_st(st_overprint_params);
318 
319 #define public_st_overprint_params_t    /* in gsovrc.c */   \
320     gs_public_st_simple( st_overprint_params,               \
321                          gs_overprint_params_t,             \
322                          "gs_overprint_params_t" )
323 
324 
325 /* create an overprint composition object */
326 extern  int    gs_create_overprint(
327     gs_composite_t **               ppct,
328     const gs_overprint_params_t *   pparams,
329     gs_memory_t *                   mem );
330 
331 /* verify that a compositor is the overprint compositor */
332 extern bool    gs_is_overprint_compositor(const gs_composite_t * pct);
333 
334 #endif  /* gsovrc_INCLUDED */
335