xref: /plan9/sys/src/cmd/gs/src/gxcomp.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 1997 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: gxcomp.h,v 1.7 2005/03/14 18:08:36 dan Exp $ */
18 /* Definitions for implementing compositing functions */
19 
20 #ifndef gxcomp_INCLUDED
21 #  define gxcomp_INCLUDED
22 
23 #include "gscompt.h"
24 #include "gsrefct.h"
25 #include "gxbitfmt.h"
26 
27 /*
28  * Because compositor information is passed through the command list,
29  * individual compositors must be identified by some means that is
30  * independent of address space. The address of the compositor method
31  * array, gs_composite_type_t (see below), cannot be used, as it is
32  * meaningful only within a single address space.
33  *
34  * In addition, it is desirable the keep the compositor identifier
35  * size as small as possible, as this identifier must be passed through
36  * the command list for all bands whenever the compositor is invoked.
37  * Fortunately, compositor invocation is not so frequent as to warrant
38  * byte-sharing techniques, which most likely would store the identifier
39  * in some unused bits of a command code byte. Hence, the smallest
40  * reasonable size for the identifier is one byte. This allows for up
41  * to 255 compositors, which should be ample (as of this writing, there
42  * are only two compositors, only one of which can be passed through
43  * the command list).
44  *
45  * The following list is intended to enumerate all compositors. We
46  * use definitions rather than an encoding to ensure a one-byte size.
47  */
48 #define GX_COMPOSITOR_ALPHA        0x01   /* DPS/Next alpha compositor */
49 #define GX_COMPOSITOR_OVERPRINT    0x02   /* overprint/overprintmode compositor */
50 #define GX_COMPOSITOR_PDF14_TRANS  0x03   /* PDF 1.4 transparency compositor */
51 
52 
53 /*
54  * Define the abstract superclass for all compositing function types.
55  */
56 						   /*typedef struct gs_composite_s gs_composite_t; *//* in gscompt.h */
57 
58 #ifndef gs_imager_state_DEFINED
59 #  define gs_imager_state_DEFINED
60 typedef struct gs_imager_state_s gs_imager_state;
61 
62 #endif
63 
64 #ifndef gx_device_DEFINED
65 #  define gx_device_DEFINED
66 typedef struct gx_device_s gx_device;
67 
68 #endif
69 
70 typedef struct gs_composite_type_procs_s {
71 
72     /*
73      * Create the default compositor for a compositing function.
74      */
75 #define composite_create_default_compositor_proc(proc)\
76   int proc(const gs_composite_t *pcte, gx_device **pcdev,\
77     gx_device *dev, gs_imager_state *pis, gs_memory_t *mem)
78     composite_create_default_compositor_proc((*create_default_compositor));
79 
80     /*
81      * Test whether this function is equal to another one.
82      */
83 #define composite_equal_proc(proc)\
84   bool proc(const gs_composite_t *pcte, const gs_composite_t *pcte2)
85     composite_equal_proc((*equal));
86 
87     /*
88      * Convert the representation of this function to a string
89      * for writing in a command list.  *psize is the amount of space
90      * available.  If it is large enough, the procedure sets *psize
91      * to the amount used and returns 0; if it is not large enough,
92      * the procedure sets *psize to the amount needed and returns a
93      * rangecheck error; in the case of any other error, *psize is
94      * not changed.
95      */
96 #define composite_write_proc(proc)\
97   int proc(const gs_composite_t *pcte, byte *data, uint *psize)
98     composite_write_proc((*write));
99 
100     /*
101      * Convert the string representation of a function back to
102      * a structure, allocating the structure. Return the number of
103      * bytes read, or < 0 in the event of an error.
104      */
105 #define composite_read_proc(proc)\
106   int proc(gs_composite_t **ppcte, const byte *data, uint size,\
107     gs_memory_t *mem)
108     composite_read_proc((*read));
109 
110     /*
111      * Update the clist write device when a compositor device is created.
112      */
113 #define composite_clist_write_update(proc)\
114   int proc(const gs_composite_t * pcte, gx_device * dev, gx_device ** pcdev,\
115 			gs_imager_state * pis, gs_memory_t * mem)
116     composite_clist_write_update((*clist_compositor_write_update));
117 
118     /*
119      * Update the clist read device when a compositor device is created.
120      */
121 #define composite_clist_read_update(proc)\
122   int proc(gs_composite_t * pcte, gx_device * cdev, gx_device * tdev,\
123 			gs_imager_state * pis, gs_memory_t * mem)
124     composite_clist_read_update((*clist_compositor_read_update));
125 
126 } gs_composite_type_procs_t;
127 
128 typedef struct gs_composite_type_s {
129     byte comp_id;   /* to identify compositor passed through command list */
130     gs_composite_type_procs_t procs;
131 } gs_composite_type_t;
132 
133 /*
134  * Default implementation for creating a compositor for clist writing.
135  * The default does nothing.
136  */
137 composite_clist_write_update(gx_default_composite_clist_write_update);
138 
139 /*
140  * Default implementation for adjusting the clist reader when a compositor
141  * device is added.  The default does nothing.
142  */
143 composite_clist_read_update(gx_default_composite_clist_read_update);
144 
145 /*
146  * Compositing objects are reference-counted, because graphics states will
147  * eventually reference them.  Note that the common part has no
148  * garbage-collectible pointers and is never actually instantiated, so no
149  * structure type is needed for it.
150  */
151 #define gs_composite_common\
152 	const gs_composite_type_t *type;\
153 	gs_id id;		/* see gscompt.h */\
154 	rc_header rc
155 struct gs_composite_s {
156     gs_composite_common;
157 };
158 
159 /* Replace a procedure with a macro. */
160 #define gs_composite_id(pcte) ((pcte)->id)
161 
162 #endif /* gxcomp_INCLUDED */
163