xref: /plan9/sys/src/cmd/gs/src/gstrans.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 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: gstrans.h,v 1.15 2005/08/30 17:08:55 igor Exp $ */
18 /* Transparency definitions and interface */
19 
20 #ifndef gstrans_INCLUDED
21 #  define gstrans_INCLUDED
22 
23 #include "gstparam.h"
24 #include "gxcomp.h"
25 
26 /*
27  * Define the operations for the PDF 1.4 transparency compositor.
28  */
29 typedef enum {
30     PDF14_PUSH_DEVICE,
31     PDF14_POP_DEVICE,
32     PDF14_BEGIN_TRANS_GROUP,
33     PDF14_END_TRANS_GROUP,
34     PDF14_INIT_TRANS_MASK,
35     PDF14_BEGIN_TRANS_MASK,
36     PDF14_END_TRANS_MASK,
37     PDF14_SET_BLEND_PARAMS
38 } pdf14_compositor_operations;
39 
40 #define PDF14_OPCODE_NAMES \
41 {\
42     "PDF14_PUSH_DEVICE      ",\
43     "PDF14_POP_DEVICE       ",\
44     "PDF14_BEGIN_TRANS_GROUP",\
45     "PDF14_END_TRANS_GROUP  ",\
46     "PDF14_INIT_TRANS_MASK  ",\
47     "PDF14_BEGIN_TRANS_MASK ",\
48     "PDF14_END_TRANS_MASK   ",\
49     "PDF14_SET_BLEND_PARAMS "\
50 }
51 
52 /* Bit definitions for serializing PDF 1.4 parameters */
53 #define PDF14_SET_BLEND_MODE    (1 << 0)
54 #define PDF14_SET_TEXT_KNOCKOUT (1 << 1)
55 #define PDF14_SET_SHAPE_ALPHA   (1 << 2)
56 #define PDF14_SET_OPACITY_ALPHA (1 << 3)
57 
58 #ifndef gs_function_DEFINED
59 typedef struct gs_function_s gs_function_t;
60 #  define gs_function_DEFINED
61 #endif
62 
63 typedef struct gs_transparency_source_s {
64     float alpha;		/* constant alpha */
65     gs_transparency_mask_t *mask;
66 } gs_transparency_source_t;
67 
68 struct gs_pdf14trans_params_s {
69     /* The type of trasnparency operation */
70     pdf14_compositor_operations pdf14_op;
71     /* Changed parameters flag */
72     int changed;
73     /* Parameters from the gs_transparency_group_params_t structure */
74     bool Isolated;
75     bool Knockout;
76     gs_rect bbox;
77     /*The transparency channel selector */
78     gs_transparency_channel_selector_t csel;
79     /* Parameters from the gx_transparency_mask_params_t structure */
80     gs_transparency_mask_subtype_t subtype;
81     int Background_components;
82     bool function_is_identity;
83     float Background[GS_CLIENT_COLOR_MAX_COMPONENTS];
84     float GrayBackground;
85     gs_function_t *transfer_function;
86     byte transfer_fn[MASK_TRANSFER_FUNCTION_SIZE];
87     /* Individual transparency parameters */
88     gs_blend_mode_t blend_mode;
89     bool text_knockout;
90     gs_transparency_source_t opacity;
91     gs_transparency_source_t shape;
92     bool mask_is_image;
93 };
94 
95 typedef struct gs_pdf14trans_params_s gs_pdf14trans_params_t;
96 
97 /*
98  * The PDF 1.4 transparency compositor structure. This is exactly analogous to
99  * other compositor structures, consisting of a the compositor common elements
100  * and the PDF 1.4 transparency specific parameters.
101  */
102 typedef struct gs_pdf14trans_s {
103     gs_composite_common;
104     gs_pdf14trans_params_t  params;
105 } gs_pdf14trans_t;
106 
107 
108 /* Access transparency-related graphics state elements. */
109 int gs_setblendmode(gs_state *, gs_blend_mode_t);
110 gs_blend_mode_t gs_currentblendmode(const gs_state *);
111 int gs_setopacityalpha(gs_state *, floatp);
112 float gs_currentopacityalpha(const gs_state *);
113 int gs_setshapealpha(gs_state *, floatp);
114 float gs_currentshapealpha(const gs_state *);
115 int gs_settextknockout(gs_state *, bool);
116 bool gs_currenttextknockout(const gs_state *);
117 
118 /*
119  * Manage transparency group and mask rendering.  Eventually these will be
120  * driver procedures, taking dev + pis instead of pgs.
121  */
122 
123 gs_transparency_state_type_t
124     gs_current_transparency_type(const gs_state *pgs);
125 
126 /*
127  * We have to abbreviate the procedure name because procedure names are
128  * only unique to 23 characters on VMS.
129  */
130 int gs_push_pdf14trans_device(gs_state * pgs);
131 
132 int gs_pop_pdf14trans_device(gs_state * pgs);
133 
134 void gs_trans_group_params_init(gs_transparency_group_params_t *ptgp);
135 
136 int gs_begin_transparency_group(gs_state * pgs,
137 				const gs_transparency_group_params_t *ptgp,
138 				const gs_rect *pbbox);
139 
140 int gs_end_transparency_group(gs_state *pgs);
141 
142 void gs_trans_mask_params_init(gs_transparency_mask_params_t *ptmp,
143 			       gs_transparency_mask_subtype_t subtype);
144 
145 int gs_begin_transparency_mask(gs_state *pgs,
146 			       const gs_transparency_mask_params_t *ptmp,
147 			       const gs_rect *pbbox, bool mask_is_image);
148 
149 int gs_end_transparency_mask(gs_state *pgs,
150 			     gs_transparency_channel_selector_t csel);
151 
152 int gs_init_transparency_mask(gs_state *pgs,
153 			      gs_transparency_channel_selector_t csel);
154 
155 int gs_discard_transparency_layer(gs_state *pgs);
156 
157 /*
158  * Imager level routines for the PDF 1.4 transparency operations.
159  */
160 int gx_begin_transparency_group(gs_imager_state * pis, gx_device * pdev,
161 				const gs_pdf14trans_params_t * pparams);
162 
163 int gx_end_transparency_group(gs_imager_state * pis, gx_device * pdev);
164 
165 int gx_init_transparency_mask(gs_imager_state * pis,
166 				const gs_pdf14trans_params_t * pparams);
167 
168 int gx_begin_transparency_mask(gs_imager_state * pis, gx_device * pdev,
169 				const gs_pdf14trans_params_t * pparams);
170 
171 int gx_end_transparency_mask(gs_imager_state * pis, gx_device * pdev,
172 				const gs_pdf14trans_params_t * pparams);
173 
174 int gx_discard_transparency_layer(gs_imager_state *pis);
175 
176 /*
177  * Verify that a compositor data structure is for the PDF 1.4 compositor.
178  */
179 int gs_is_pdf14trans_compositor(const gs_composite_t * pct);
180 
181 /*
182  * Estimate the amount of space that will be required by the PDF 1.4
183  * transparency buffers for doing the blending operations.  These buffers
184  * use 8 bits per component plus one or two 8 bit alpha component values.
185  * In theory there can be a large number of these buffers required.  However
186  * we do not know the required number of buffers, the required numbe of
187  * alpha chanels, or the number of components for the blending operations.
188  * (This information is determined later as the data streams are parsed.)
189  * For now we are simply assuming that we will have three buffers with five
190  * eight bit values.  This is a hack but not too unreasonable.  However
191  * since it is a hack, we may exceed our desired buffer space while
192  * processing the file.
193  */
194 #define NUM_PDF14_BUFFERS 3
195 #define NUM_ALPHA_CHANNELS 1
196 #define NUM_COLOR_CHANNELS 4
197 #define BITS_PER_CHANNEL 8
198 /* The estimated size of an individual PDF 1.4 buffer row (in bits) */
199 #define ESTIMATED_PDF14_ROW_SIZE(width) ((width) * BITS_PER_CHANNEL\
200 	* (NUM_ALPHA_CHANNELS + NUM_COLOR_CHANNELS))
201 /* The estimated size of one row in all PDF 1.4 buffers (in bits) */
202 #define ESTIMATED_PDF14_ROW_SPACE(width) \
203 	(NUM_PDF14_BUFFERS * ESTIMATED_PDF14_ROW_SIZE(width))
204 
205 #endif /* gstrans_INCLUDED */
206