Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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 */