xref: /plan9/sys/src/cmd/gs/src/gdevdsp.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 2001-2005, Ghostgum Software Pty Ltd.  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: gdevdsp.h,v 1.12 2005/03/04 22:00:22 ghostgum Exp $ */
18 /* gdevdsp.h - callback structure for DLL based display device */
19 
20 #ifndef gdevdsp_INCLUDED
21 #  define gdevdsp_INCLUDED
22 
23 /*
24  * The callback structure must be provided by calling the
25  * Ghostscript APIs in the following order:
26  *  gsapi_new_instance(&minst);
27  *  gsapi_set_display_callback(minst, callback);
28  *  gsapi_init_with_args(minst, argc, argv);
29  *
30  * Supported parameters and default values are:
31  * -sDisplayHandle=16#04d2 or 1234        string
32  *    Caller supplied handle as a decimal or hexadecimal number
33  *    in a string.  On 32-bit platforms, it may be set
34  *    using -dDisplayHandle=1234 for backward compatibility.
35  *    Included as first parameter of all callback functions.
36  *
37  * -dDisplayFormat=0                      long
38  *    Color format specified using bitfields below.
39  *    Included as argument of display_size() and display_presize()
40  * These can only be changed when the device is closed.
41  *
42  * The second parameter of all callback functions "void *device"
43  * is the address of the Ghostscript display device instance.
44  * The arguments "void *handle" and "void *device" together
45  * uniquely identify an instance of the display device.
46  *
47  * A typical sequence of callbacks would be
48  *  open, presize, memalloc, size, sync, page
49  *  presize, memfree, memalloc, size, sync, page
50  *  preclose, memfree, close
51  * The caller should not access the image buffer:
52  *  - before the first sync
53  *  - between presize and size
54  *  - after preclose
55  * If opening the device fails, you might see the following:
56  *  open, presize, memalloc, memfree, close
57  *
58  */
59 
60 #define DISPLAY_VERSION_MAJOR 2
61 #define DISPLAY_VERSION_MINOR 0
62 
63 #define DISPLAY_VERSION_MAJOR_V1 1 /* before separation format was added */
64 #define DISPLAY_VERSION_MINOR_V1 0
65 
66 /* The display format is set by a combination of the following bitfields */
67 
68 /* Define the color space alternatives */
69 typedef enum {
70     DISPLAY_COLORS_NATIVE	 = (1<<0),
71     DISPLAY_COLORS_GRAY  	 = (1<<1),
72     DISPLAY_COLORS_RGB   	 = (1<<2),
73     DISPLAY_COLORS_CMYK  	 = (1<<3),
74     DISPLAY_COLORS_SEPARATION    = (1<<19)
75 } DISPLAY_FORMAT_COLOR;
76 #define DISPLAY_COLORS_MASK 0x8000fL
77 
78 /* Define whether alpha information, or an extra unused bytes is included */
79 /* DISPLAY_ALPHA_FIRST and DISPLAY_ALPHA_LAST are not implemented */
80 typedef enum {
81     DISPLAY_ALPHA_NONE   = (0<<4),
82     DISPLAY_ALPHA_FIRST  = (1<<4),
83     DISPLAY_ALPHA_LAST   = (1<<5),
84     DISPLAY_UNUSED_FIRST = (1<<6),	/* e.g. Mac xRGB */
85     DISPLAY_UNUSED_LAST  = (1<<7)	/* e.g. Windows BGRx */
86 } DISPLAY_FORMAT_ALPHA;
87 #define DISPLAY_ALPHA_MASK 0x00f0L
88 
89 /* Define the depth per component for DISPLAY_COLORS_GRAY,
90  * DISPLAY_COLORS_RGB and DISPLAY_COLORS_CMYK,
91  * or the depth per pixel for DISPLAY_COLORS_NATIVE
92  * DISPLAY_DEPTH_2 and DISPLAY_DEPTH_12 have not been tested.
93  */
94 typedef enum {
95     DISPLAY_DEPTH_1   = (1<<8),
96     DISPLAY_DEPTH_2   = (1<<9),
97     DISPLAY_DEPTH_4   = (1<<10),
98     DISPLAY_DEPTH_8   = (1<<11),
99     DISPLAY_DEPTH_12  = (1<<12),
100     DISPLAY_DEPTH_16  = (1<<13)
101     /* unused (1<<14) */
102     /* unused (1<<15) */
103 } DISPLAY_FORMAT_DEPTH;
104 #define DISPLAY_DEPTH_MASK 0xff00L
105 
106 
107 /* Define whether Red/Cyan should come first,
108  * or whether Blue/Black should come first
109  */
110 typedef enum {
111     DISPLAY_BIGENDIAN    = (0<<16),	/* Red/Cyan first */
112     DISPLAY_LITTLEENDIAN = (1<<16)	/* Blue/Black first */
113 } DISPLAY_FORMAT_ENDIAN;
114 #define DISPLAY_ENDIAN_MASK 0x00010000L
115 
116 /* Define whether the raster starts at the top or bottom of the bitmap */
117 typedef enum {
118     DISPLAY_TOPFIRST    = (0<<17),	/* Unix, Mac */
119     DISPLAY_BOTTOMFIRST = (1<<17)	/* Windows */
120 } DISPLAY_FORMAT_FIRSTROW;
121 #define DISPLAY_FIRSTROW_MASK 0x00020000L
122 
123 
124 /* Define whether packing RGB in 16-bits should use 555
125  * or 565 (extra bit for green)
126  */
127 typedef enum {
128     DISPLAY_NATIVE_555 = (0<<18),
129     DISPLAY_NATIVE_565 = (1<<18)
130 } DISPLAY_FORMAT_555;
131 #define DISPLAY_555_MASK 0x00040000L
132 
133 /* Define the row alignment, which must be equal to or greater than
134  * the size of a pointer.
135  * The default (DISPLAY_ROW_ALIGN_DEFAULT) is the size of a pointer,
136  * 4 bytes (DISPLAY_ROW_ALIGN_4) on 32-bit systems or 8 bytes
137  * (DISPLAY_ROW_ALIGN_8) on 64-bit systems.
138  */
139 typedef enum {
140     DISPLAY_ROW_ALIGN_DEFAULT = (0<<20),
141     /* DISPLAY_ROW_ALIGN_1 = (1<<20), */ /* not currently possible */
142     /* DISPLAY_ROW_ALIGN_2 = (2<<20), */ /* not currently possible */
143     DISPLAY_ROW_ALIGN_4 = (3<<20),
144     DISPLAY_ROW_ALIGN_8 = (4<<20),
145     DISPLAY_ROW_ALIGN_16 = (5<<20),
146     DISPLAY_ROW_ALIGN_32 = (6<<20),
147     DISPLAY_ROW_ALIGN_64 = (7<<20)
148 } DISPLAY_FORMAT_ROW_ALIGN;
149 #define DISPLAY_ROW_ALIGN_MASK 0x00700000L
150 
151 
152 #ifndef display_callback_DEFINED
153 #define display_callback_DEFINED
154 typedef struct display_callback_s display_callback;
155 #endif
156 
157 /*
158  * Note that for Windows, the display callback functions are
159  * cdecl, not stdcall.  This differs from those in iapi.h.
160  */
161 
162 struct display_callback_s {
163     /* Size of this structure */
164     /* Used for checking if we have been handed a valid structure */
165     int size;
166 
167     /* Major version of this structure  */
168     /* The major version number will change if this structure changes. */
169     int version_major;
170 
171     /* Minor version of this structure */
172     /* The minor version number will change if new features are added
173      * without changes to this structure.  For example, a new color
174      * format.
175      */
176     int version_minor;
177 
178     /* New device has been opened */
179     /* This is the first event from this device. */
180     int (*display_open)(void *handle, void *device);
181 
182     /* Device is about to be closed. */
183     /* Device will not be closed until this function returns. */
184     int (*display_preclose)(void *handle, void *device);
185 
186     /* Device has been closed. */
187     /* This is the last event from this device. */
188     int (*display_close)(void *handle, void *device);
189 
190     /* Device is about to be resized. */
191     /* Resize will only occur if this function returns 0. */
192     /* raster is byte count of a row. */
193     int (*display_presize)(void *handle, void *device,
194 	int width, int height, int raster, unsigned int format);
195 
196     /* Device has been resized. */
197     /* New pointer to raster returned in pimage */
198     int (*display_size)(void *handle, void *device, int width, int height,
199 	int raster, unsigned int format, unsigned char *pimage);
200 
201     /* flushpage */
202     int (*display_sync)(void *handle, void *device);
203 
204     /* showpage */
205     /* If you want to pause on showpage, then don't return immediately */
206     int (*display_page)(void *handle, void *device, int copies, int flush);
207 
208     /* Notify the caller whenever a portion of the raster is updated. */
209     /* This can be used for cooperative multitasking or for
210      * progressive update of the display.
211      * This function pointer may be set to NULL if not required.
212      */
213     int (*display_update)(void *handle, void *device, int x, int y,
214 	int w, int h);
215 
216     /* Allocate memory for bitmap */
217     /* This is provided in case you need to create memory in a special
218      * way, e.g. shared.  If this is NULL, the Ghostscript memory device
219      * allocates the bitmap. This will only called to allocate the
220      * image buffer. The first row will be placed at the address
221      * returned by display_memalloc.
222      */
223     void *(*display_memalloc)(void *handle, void *device, unsigned long size);
224 
225     /* Free memory for bitmap */
226     /* If this is NULL, the Ghostscript memory device will free the bitmap */
227     int (*display_memfree)(void *handle, void *device, void *mem);
228 
229     /* Added in V2 */
230     /* When using separation color space (DISPLAY_COLORS_SEPARATION),
231      * give a mapping for one separation component.
232      * This is called for each new component found.
233      * It may be called multiple times for each component.
234      * It may be called at any time between display_size
235      * and display_close.
236      * The client uses this to map from the separations to CMYK
237      * and hence to RGB for display.
238      * GS must only use this callback if version_major >= 2.
239      * The unsigned short c,m,y,k values are 65535 = 1.0.
240      * This function pointer may be set to NULL if not required.
241      */
242     int (*display_separation)(void *handle, void *device,
243 	int component, const char *component_name,
244 	unsigned short c, unsigned short m,
245 	unsigned short y, unsigned short k);
246 };
247 
248 /* This is the V1 structure, before separation format was added */
249 struct display_callback_v1_s {
250     int size;
251     int version_major;
252     int version_minor;
253     int (*display_open)(void *handle, void *device);
254     int (*display_preclose)(void *handle, void *device);
255     int (*display_close)(void *handle, void *device);
256     int (*display_presize)(void *handle, void *device,
257 	int width, int height, int raster, unsigned int format);
258     int (*display_size)(void *handle, void *device, int width, int height,
259 	int raster, unsigned int format, unsigned char *pimage);
260     int (*display_sync)(void *handle, void *device);
261     int (*display_page)(void *handle, void *device, int copies, int flush);
262     int (*display_update)(void *handle, void *device, int x, int y,
263 	int w, int h);
264     void *(*display_memalloc)(void *handle, void *device, unsigned long size);
265     int (*display_memfree)(void *handle, void *device, void *mem);
266 };
267 
268 #define DISPLAY_CALLBACK_V1_SIZEOF sizeof(struct display_callback_v1_s)
269 
270 #endif /* gdevdsp_INCLUDED */
271