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