xref: /plan9-contrib/sys/src/cmd/gs/src/gstrans.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
13ff48bf5SDavid du Colombier /* Copyright (C) 2000 Aladdin Enterprises.  All rights reserved.
23ff48bf5SDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
53ff48bf5SDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
93ff48bf5SDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
153ff48bf5SDavid du Colombier */
163ff48bf5SDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: gstrans.h,v 1.15 2005/08/30 17:08:55 igor Exp $ */
183ff48bf5SDavid du Colombier /* Transparency definitions and interface */
193ff48bf5SDavid du Colombier 
203ff48bf5SDavid du Colombier #ifndef gstrans_INCLUDED
213ff48bf5SDavid du Colombier #  define gstrans_INCLUDED
223ff48bf5SDavid du Colombier 
233ff48bf5SDavid du Colombier #include "gstparam.h"
24*593dc095SDavid du Colombier #include "gxcomp.h"
25*593dc095SDavid du Colombier 
26*593dc095SDavid du Colombier /*
27*593dc095SDavid du Colombier  * Define the operations for the PDF 1.4 transparency compositor.
28*593dc095SDavid du Colombier  */
29*593dc095SDavid du Colombier typedef enum {
30*593dc095SDavid du Colombier     PDF14_PUSH_DEVICE,
31*593dc095SDavid du Colombier     PDF14_POP_DEVICE,
32*593dc095SDavid du Colombier     PDF14_BEGIN_TRANS_GROUP,
33*593dc095SDavid du Colombier     PDF14_END_TRANS_GROUP,
34*593dc095SDavid du Colombier     PDF14_INIT_TRANS_MASK,
35*593dc095SDavid du Colombier     PDF14_BEGIN_TRANS_MASK,
36*593dc095SDavid du Colombier     PDF14_END_TRANS_MASK,
37*593dc095SDavid du Colombier     PDF14_SET_BLEND_PARAMS
38*593dc095SDavid du Colombier } pdf14_compositor_operations;
39*593dc095SDavid du Colombier 
40*593dc095SDavid du Colombier #define PDF14_OPCODE_NAMES \
41*593dc095SDavid du Colombier {\
42*593dc095SDavid du Colombier     "PDF14_PUSH_DEVICE      ",\
43*593dc095SDavid du Colombier     "PDF14_POP_DEVICE       ",\
44*593dc095SDavid du Colombier     "PDF14_BEGIN_TRANS_GROUP",\
45*593dc095SDavid du Colombier     "PDF14_END_TRANS_GROUP  ",\
46*593dc095SDavid du Colombier     "PDF14_INIT_TRANS_MASK  ",\
47*593dc095SDavid du Colombier     "PDF14_BEGIN_TRANS_MASK ",\
48*593dc095SDavid du Colombier     "PDF14_END_TRANS_MASK   ",\
49*593dc095SDavid du Colombier     "PDF14_SET_BLEND_PARAMS "\
50*593dc095SDavid du Colombier }
51*593dc095SDavid du Colombier 
52*593dc095SDavid du Colombier /* Bit definitions for serializing PDF 1.4 parameters */
53*593dc095SDavid du Colombier #define PDF14_SET_BLEND_MODE    (1 << 0)
54*593dc095SDavid du Colombier #define PDF14_SET_TEXT_KNOCKOUT (1 << 1)
55*593dc095SDavid du Colombier #define PDF14_SET_SHAPE_ALPHA   (1 << 2)
56*593dc095SDavid du Colombier #define PDF14_SET_OPACITY_ALPHA (1 << 3)
57*593dc095SDavid du Colombier 
58*593dc095SDavid du Colombier #ifndef gs_function_DEFINED
59*593dc095SDavid du Colombier typedef struct gs_function_s gs_function_t;
60*593dc095SDavid du Colombier #  define gs_function_DEFINED
61*593dc095SDavid du Colombier #endif
62*593dc095SDavid du Colombier 
63*593dc095SDavid du Colombier typedef struct gs_transparency_source_s {
64*593dc095SDavid du Colombier     float alpha;		/* constant alpha */
65*593dc095SDavid du Colombier     gs_transparency_mask_t *mask;
66*593dc095SDavid du Colombier } gs_transparency_source_t;
67*593dc095SDavid du Colombier 
68*593dc095SDavid du Colombier struct gs_pdf14trans_params_s {
69*593dc095SDavid du Colombier     /* The type of trasnparency operation */
70*593dc095SDavid du Colombier     pdf14_compositor_operations pdf14_op;
71*593dc095SDavid du Colombier     /* Changed parameters flag */
72*593dc095SDavid du Colombier     int changed;
73*593dc095SDavid du Colombier     /* Parameters from the gs_transparency_group_params_t structure */
74*593dc095SDavid du Colombier     bool Isolated;
75*593dc095SDavid du Colombier     bool Knockout;
76*593dc095SDavid du Colombier     gs_rect bbox;
77*593dc095SDavid du Colombier     /*The transparency channel selector */
78*593dc095SDavid du Colombier     gs_transparency_channel_selector_t csel;
79*593dc095SDavid du Colombier     /* Parameters from the gx_transparency_mask_params_t structure */
80*593dc095SDavid du Colombier     gs_transparency_mask_subtype_t subtype;
81*593dc095SDavid du Colombier     int Background_components;
82*593dc095SDavid du Colombier     bool function_is_identity;
83*593dc095SDavid du Colombier     float Background[GS_CLIENT_COLOR_MAX_COMPONENTS];
84*593dc095SDavid du Colombier     float GrayBackground;
85*593dc095SDavid du Colombier     gs_function_t *transfer_function;
86*593dc095SDavid du Colombier     byte transfer_fn[MASK_TRANSFER_FUNCTION_SIZE];
87*593dc095SDavid du Colombier     /* Individual transparency parameters */
88*593dc095SDavid du Colombier     gs_blend_mode_t blend_mode;
89*593dc095SDavid du Colombier     bool text_knockout;
90*593dc095SDavid du Colombier     gs_transparency_source_t opacity;
91*593dc095SDavid du Colombier     gs_transparency_source_t shape;
92*593dc095SDavid du Colombier     bool mask_is_image;
93*593dc095SDavid du Colombier };
94*593dc095SDavid du Colombier 
95*593dc095SDavid du Colombier typedef struct gs_pdf14trans_params_s gs_pdf14trans_params_t;
96*593dc095SDavid du Colombier 
97*593dc095SDavid du Colombier /*
98*593dc095SDavid du Colombier  * The PDF 1.4 transparency compositor structure. This is exactly analogous to
99*593dc095SDavid du Colombier  * other compositor structures, consisting of a the compositor common elements
100*593dc095SDavid du Colombier  * and the PDF 1.4 transparency specific parameters.
101*593dc095SDavid du Colombier  */
102*593dc095SDavid du Colombier typedef struct gs_pdf14trans_s {
103*593dc095SDavid du Colombier     gs_composite_common;
104*593dc095SDavid du Colombier     gs_pdf14trans_params_t  params;
105*593dc095SDavid du Colombier } gs_pdf14trans_t;
106*593dc095SDavid du Colombier 
1073ff48bf5SDavid du Colombier 
1083ff48bf5SDavid du Colombier /* Access transparency-related graphics state elements. */
109*593dc095SDavid du Colombier int gs_setblendmode(gs_state *, gs_blend_mode_t);
110*593dc095SDavid du Colombier gs_blend_mode_t gs_currentblendmode(const gs_state *);
111*593dc095SDavid du Colombier int gs_setopacityalpha(gs_state *, floatp);
112*593dc095SDavid du Colombier float gs_currentopacityalpha(const gs_state *);
113*593dc095SDavid du Colombier int gs_setshapealpha(gs_state *, floatp);
114*593dc095SDavid du Colombier float gs_currentshapealpha(const gs_state *);
115*593dc095SDavid du Colombier int gs_settextknockout(gs_state *, bool);
116*593dc095SDavid du Colombier bool gs_currenttextknockout(const gs_state *);
1173ff48bf5SDavid du Colombier 
1183ff48bf5SDavid du Colombier /*
1193ff48bf5SDavid du Colombier  * Manage transparency group and mask rendering.  Eventually these will be
1203ff48bf5SDavid du Colombier  * driver procedures, taking dev + pis instead of pgs.
1213ff48bf5SDavid du Colombier  */
1223ff48bf5SDavid du Colombier 
1233ff48bf5SDavid du Colombier gs_transparency_state_type_t
124*593dc095SDavid du Colombier     gs_current_transparency_type(const gs_state *pgs);
1253ff48bf5SDavid du Colombier 
1263ff48bf5SDavid du Colombier /*
1273ff48bf5SDavid du Colombier  * We have to abbreviate the procedure name because procedure names are
1283ff48bf5SDavid du Colombier  * only unique to 23 characters on VMS.
1293ff48bf5SDavid du Colombier  */
130*593dc095SDavid du Colombier int gs_push_pdf14trans_device(gs_state * pgs);
1313ff48bf5SDavid du Colombier 
132*593dc095SDavid du Colombier int gs_pop_pdf14trans_device(gs_state * pgs);
133*593dc095SDavid du Colombier 
134*593dc095SDavid du Colombier void gs_trans_group_params_init(gs_transparency_group_params_t *ptgp);
135*593dc095SDavid du Colombier 
136*593dc095SDavid du Colombier int gs_begin_transparency_group(gs_state * pgs,
1373ff48bf5SDavid du Colombier 				const gs_transparency_group_params_t *ptgp,
138*593dc095SDavid du Colombier 				const gs_rect *pbbox);
1393ff48bf5SDavid du Colombier 
140*593dc095SDavid du Colombier int gs_end_transparency_group(gs_state *pgs);
1413ff48bf5SDavid du Colombier 
142*593dc095SDavid du Colombier void gs_trans_mask_params_init(gs_transparency_mask_params_t *ptmp,
143*593dc095SDavid du Colombier 			       gs_transparency_mask_subtype_t subtype);
1443ff48bf5SDavid du Colombier 
145*593dc095SDavid du Colombier int gs_begin_transparency_mask(gs_state *pgs,
1463ff48bf5SDavid du Colombier 			       const gs_transparency_mask_params_t *ptmp,
147*593dc095SDavid du Colombier 			       const gs_rect *pbbox, bool mask_is_image);
1483ff48bf5SDavid du Colombier 
149*593dc095SDavid du Colombier int gs_end_transparency_mask(gs_state *pgs,
150*593dc095SDavid du Colombier 			     gs_transparency_channel_selector_t csel);
1513ff48bf5SDavid du Colombier 
152*593dc095SDavid du Colombier int gs_init_transparency_mask(gs_state *pgs,
153*593dc095SDavid du Colombier 			      gs_transparency_channel_selector_t csel);
1543ff48bf5SDavid du Colombier 
155*593dc095SDavid du Colombier int gs_discard_transparency_layer(gs_state *pgs);
156*593dc095SDavid du Colombier 
157*593dc095SDavid du Colombier /*
158*593dc095SDavid du Colombier  * Imager level routines for the PDF 1.4 transparency operations.
159*593dc095SDavid du Colombier  */
160*593dc095SDavid du Colombier int gx_begin_transparency_group(gs_imager_state * pis, gx_device * pdev,
161*593dc095SDavid du Colombier 				const gs_pdf14trans_params_t * pparams);
162*593dc095SDavid du Colombier 
163*593dc095SDavid du Colombier int gx_end_transparency_group(gs_imager_state * pis, gx_device * pdev);
164*593dc095SDavid du Colombier 
165*593dc095SDavid du Colombier int gx_init_transparency_mask(gs_imager_state * pis,
166*593dc095SDavid du Colombier 				const gs_pdf14trans_params_t * pparams);
167*593dc095SDavid du Colombier 
168*593dc095SDavid du Colombier int gx_begin_transparency_mask(gs_imager_state * pis, gx_device * pdev,
169*593dc095SDavid du Colombier 				const gs_pdf14trans_params_t * pparams);
170*593dc095SDavid du Colombier 
171*593dc095SDavid du Colombier int gx_end_transparency_mask(gs_imager_state * pis, gx_device * pdev,
172*593dc095SDavid du Colombier 				const gs_pdf14trans_params_t * pparams);
173*593dc095SDavid du Colombier 
174*593dc095SDavid du Colombier int gx_discard_transparency_layer(gs_imager_state *pis);
175*593dc095SDavid du Colombier 
176*593dc095SDavid du Colombier /*
177*593dc095SDavid du Colombier  * Verify that a compositor data structure is for the PDF 1.4 compositor.
178*593dc095SDavid du Colombier  */
179*593dc095SDavid du Colombier int gs_is_pdf14trans_compositor(const gs_composite_t * pct);
180*593dc095SDavid du Colombier 
181*593dc095SDavid du Colombier /*
182*593dc095SDavid du Colombier  * Estimate the amount of space that will be required by the PDF 1.4
183*593dc095SDavid du Colombier  * transparency buffers for doing the blending operations.  These buffers
184*593dc095SDavid du Colombier  * use 8 bits per component plus one or two 8 bit alpha component values.
185*593dc095SDavid du Colombier  * In theory there can be a large number of these buffers required.  However
186*593dc095SDavid du Colombier  * we do not know the required number of buffers, the required numbe of
187*593dc095SDavid du Colombier  * alpha chanels, or the number of components for the blending operations.
188*593dc095SDavid du Colombier  * (This information is determined later as the data streams are parsed.)
189*593dc095SDavid du Colombier  * For now we are simply assuming that we will have three buffers with five
190*593dc095SDavid du Colombier  * eight bit values.  This is a hack but not too unreasonable.  However
191*593dc095SDavid du Colombier  * since it is a hack, we may exceed our desired buffer space while
192*593dc095SDavid du Colombier  * processing the file.
193*593dc095SDavid du Colombier  */
194*593dc095SDavid du Colombier #define NUM_PDF14_BUFFERS 3
195*593dc095SDavid du Colombier #define NUM_ALPHA_CHANNELS 1
196*593dc095SDavid du Colombier #define NUM_COLOR_CHANNELS 4
197*593dc095SDavid du Colombier #define BITS_PER_CHANNEL 8
198*593dc095SDavid du Colombier /* The estimated size of an individual PDF 1.4 buffer row (in bits) */
199*593dc095SDavid du Colombier #define ESTIMATED_PDF14_ROW_SIZE(width) ((width) * BITS_PER_CHANNEL\
200*593dc095SDavid du Colombier 	* (NUM_ALPHA_CHANNELS + NUM_COLOR_CHANNELS))
201*593dc095SDavid du Colombier /* The estimated size of one row in all PDF 1.4 buffers (in bits) */
202*593dc095SDavid du Colombier #define ESTIMATED_PDF14_ROW_SPACE(width) \
203*593dc095SDavid du Colombier 	(NUM_PDF14_BUFFERS * ESTIMATED_PDF14_ROW_SIZE(width))
2043ff48bf5SDavid du Colombier 
2053ff48bf5SDavid du Colombier #endif /* gstrans_INCLUDED */
206