xref: /plan9/sys/src/cmd/gs/src/igstate.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 1989, 2000 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: igstate.h,v 1.8 2003/09/03 03:22:59 giles Exp $ */
18 /* Interpreter graphics state definition */
19 
20 #ifndef igstate_INCLUDED
21 #  define igstate_INCLUDED
22 
23 #include "gsstate.h"
24 #include "gxstate.h"		/* for 'client data' access */
25 #include "imemory.h"
26 #include "istruct.h"		/* for gstate obj definition */
27 #include "gxcindex.h"
28 
29 /*
30  * From the interpreter's point of view, the graphics state is largely opaque,
31  * i.e., the interpreter is just another client of the library.
32  * The interpreter does require additional items in the graphics state;
33  * these are "client data" from the library's point of view.
34  * Most of the complexity in this added state comes from
35  * the parameters associated with the various Level 2 color spaces.
36  * Note that the added information consists entirely of refs.
37  */
38 
39 /*
40  * The interpreter represents graphics state objects in a slightly
41  * unnatural way, namely, by a t_astruct ref that points to an object
42  * of type st_igstate_obj, which is essentially a t_struct ref that in turn
43  * points to a real graphics state (object of type st_gs_state).
44  * We do this so that save and restore can manipulate the intermediate
45  * object and not have to worry about copying entire gs_states.
46  *
47  * Because a number of different operators must test whether an object
48  * is a gstate, we make an exception to our convention of declaring
49  * structure descriptors only in the place where the structure itself
50  * is defined (see gsstruct.h for more information on this).
51  */
52 typedef struct igstate_obj_s {
53     ref gstate;			/* t_struct / st_gs_state */
54 } igstate_obj;
55 
56 extern_st(st_igstate_obj);
57 #define public_st_igstate_obj()	/* in zdps1.c */\
58   gs_public_st_ref_struct(st_igstate_obj, igstate_obj, "gstatetype")
59 #define igstate_ptr(rp) r_ptr(&r_ptr(rp, igstate_obj)->gstate, gs_state)
60 
61 /* DeviceN names and tint transform */
62 typedef struct ref_device_n_params_s {
63     ref layer_names, tint_transform;
64 } ref_device_n_params;
65 
66 /* CIE transformation procedures */
67 typedef struct ref_cie_procs_s {
68     union {
69 	ref DEFG;
70 	ref DEF;
71     } PreDecode;
72     union {
73 	ref ABC;
74 	ref A;
75     } Decode;
76     ref DecodeLMN;
77 } ref_cie_procs;
78 
79 /* CIE rendering transformation procedures */
80 typedef struct ref_cie_render_procs_s {
81     ref TransformPQR, EncodeLMN, EncodeABC, RenderTableT;
82 } ref_cie_render_procs;
83 
84 /* Separation name and tint transform */
85 typedef struct ref_separation_params_s {
86     ref layer_name, tint_transform;
87 } ref_separation_params;
88 
89 /* All color space parameters. */
90 /* All of these are optional. */
91 /* Note that they may actually be the parameters for an underlying or */
92 /* alternate space for a special space. */
93 typedef struct ref_color_procs_s {
94     ref_cie_procs cie;
95     union {
96 	ref_device_n_params device_n;
97 	ref_separation_params separation;
98 	ref index_proc;
99     } special;
100 } ref_color_procs;
101 typedef struct ref_colorspace_s {
102     ref array;			/* color space (array), only relevant if */
103 				/* the current color space has parameters */
104 				/* associated with it. */
105     ref_color_procs procs;	/* associated procedures/parameters, */
106 				/* only relevant for DeviceN, CIE, */
107 				/* Separation, Indexed/CIE, */
108 				/* Indexed with procedure, or a Pattern */
109 				/* with one of these. */
110 } ref_colorspace;
111 
112 #ifndef int_remap_color_info_DEFINED
113 #  define int_remap_color_info_DEFINED
114 typedef struct int_remap_color_info_s int_remap_color_info_t;
115 #endif
116 
117 typedef struct int_gstate_s {
118     ref dash_pattern;		/* (array) */
119     /* Screen_procs are only relevant if setscreen was */
120     /* executed more recently than sethalftone */
121     /* (for this graphics context). */
122     struct {
123 	ref red, green, blue, gray;
124     } screen_procs,		/* halftone screen procedures */
125           transfer_procs;	/* transfer procedures */
126     ref black_generation;	/* (procedure) */
127     ref undercolor_removal;	/* (procedure) */
128     ref_colorspace colorspace;
129     /*
130      * Pattern is relevant only if the current color space
131      * is a pattern space.
132      */
133     ref pattern;		/* pattern (dictionary) */
134     struct {
135 	ref dict;		/* CIE color rendering dictionary */
136 	ref_cie_render_procs procs;	/* (see above) */
137     } colorrendering;
138     /*
139      * Use_cie_color tracks the UseCIEColor parameter of the page
140      * device. This parameter may, during initialization, be read
141      * through the .getuseciecolor operator, and set (in Level 3)
142      * via the .setuseciecolor operator.
143      *
144      * Previously, the UseCIEColor color space substitution feature
145      * was implemented in the graphic library. It is now implemented
146      * strictly in the interpreter.
147      */
148     ref use_cie_color;
149     /*
150      * Halftone is relevant only if sethalftone was executed
151      * more recently than setscreen for this graphics context.
152      * setscreen sets it to null.
153      */
154     ref halftone;		/* halftone (dictionary) */
155     /*
156      * Pagedevice is only relevant if setpagedevice was executed more
157      * recently than nulldevice, setcachedevice, or setdevice with a
158      * non-page device (for this graphics context).  If the current device
159      * is not a page device, pagedevice is null.
160      */
161     ref pagedevice;		/* page device (dictionary|null) */
162     /*
163      * Remap_color_info is used temporarily to communicate the need for
164      * Pattern or DeviceNcolor remapping to the interpreter.  See
165      * e_RemapColor in ierrors.h.  The extra level of indirection through a
166      * structure is needed because the gstate passed to the PaintProc is
167      * different from the current gstate in the graphics state, and because
168      * the DeviceN color being remapped is not necessarily the current color
169      * in the graphics state (for shading or images): the structure is
170      * shared, so that the interpreter can get its hands on the remapping
171      * procedure.
172      */
173     ref remap_color_info;	/* t_struct (int_remap_color_info_t) */
174     /*
175      * The opacity and shape masks are a PDF 1.4 transparency feature,
176      * not standard PostScript.
177      */
178     ref opacity_mask, shape_mask; /* dictionary|null */
179 } int_gstate;
180 
181 #define clear_pagedevice(pigs) make_null(&(pigs)->pagedevice)
182 /*
183  * Even though the interpreter's part of the graphics state actually
184  * consists of refs, allocating it as refs tends to create sandbars;
185  * since it is always allocated and freed as a unit, we can treat it
186  * as an ordinary structure.
187  */
188 #define private_st_int_gstate()	/* in zgstate.c */\
189   gs_private_st_ref_struct(st_int_gstate, int_gstate, "int_gstate")
190 
191 /* Enumerate the refs in an int_gstate. */
192 /* Since all the elements of an int_gstate are refs, this is simple. */
193 #define int_gstate_map_refs(p,m)\
194  { register ref *rp_ = (ref *)(p);\
195    register int i = sizeof(int_gstate) / sizeof(ref);\
196    do { m(rp_); ++rp_; } while ( --i );\
197  }
198 
199 /* Create the gstate for a new context. */
200 /* We export this so that fork can use it. */
201 gs_state *int_gstate_alloc(const gs_dual_memory_t * dmem);
202 
203 /* Get the int_gstate from a gs_state. */
204 #define gs_int_gstate(pgs) ((int_gstate *)gs_state_client_data(pgs))
205 
206 /* The current instances for operators. */
207 #define igs (i_ctx_p->pgs)
208 #define istate gs_int_gstate(igs)
209 
210 #endif /* igstate_INCLUDED */
211