Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/planix-v0/sys/src/cmd/gs/src/gxdevice.h – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/* Copyright (C) 1997, 1998, 1999, 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: gxdevice.h,v 1.21 2005/03/14 18:08:36 dan Exp $ */
18
/* Definitions for device implementors */
19
 
20
#ifndef gxdevice_INCLUDED
21
#  define gxdevice_INCLUDED
22
 
23
#include "stdio_.h"		/* for FILE */
24
#include "gxdevcli.h"
25
#include "gsfname.h"
26
#include "gsparam.h"
27
/*
28
 * Many drivers still use gs_malloc and gs_free, so include the interface
29
 * for these.  (Eventually they should go away.)
30
 */
31
#include "gsmalloc.h"
32
/*
33
 * Similarly, quite a few drivers reference stdout and/or stderr.
34
 * (Eventually these references must go away.)
35
 */
36
#include "gxstdio.h"
37
 
38
/*
39
 * NOTE: if you write code that creates device instances (either with
40
 * gs_copydevice or by allocating them explicitly), allocates device
41
 * instances as either local or static variables (actual instances, not
42
 * pointers to instances), or sets the target of forwarding devices, please
43
 * read the documentation in gxdevcli.h about memory management for devices.
44
 * The rules for doing these things changed substantially in release 5.68,
45
 * in a non-backward-compatible way, and unfortunately we could not find a
46
 * way to make the compiler give an error at places that need changing.
47
 */
48
 
49
/* ---------------- Auxiliary types and structures ---------------- */
50
 
51
/* Define default pages sizes. */
52
/* U.S. letter paper (8.5" x 11"). */
53
#define DEFAULT_WIDTH_10THS_US_LETTER 85
54
#define DEFAULT_HEIGHT_10THS_US_LETTER 110
55
/* A4 paper (210mm x 297mm), we use 595pt x 842pt. */
56
#define DEFAULT_WIDTH_10THS_A4 82.6389
57
#define DEFAULT_HEIGHT_10THS_A4 116.9444
58
/* Choose a default.  A4 may be set in the makefile. */
59
#ifdef A4
60
#  define DEFAULT_WIDTH_10THS DEFAULT_WIDTH_10THS_A4
61
#  define DEFAULT_HEIGHT_10THS DEFAULT_HEIGHT_10THS_A4
62
#else
63
#  define DEFAULT_WIDTH_10THS DEFAULT_WIDTH_10THS_US_LETTER
64
#  define DEFAULT_HEIGHT_10THS DEFAULT_HEIGHT_10THS_US_LETTER
65
#endif
66
 
67
/* ---------------- Device structure ---------------- */
68
 
69
/*
70
 * To insulate statically defined device templates from the
71
 * consequences of changes in the device structure, the following macros
72
 * must be used for generating initialized device structures.
73
 *
74
 * The computations of page width and height in pixels should really be
75
 *      ((int)(page_width_inches*x_dpi))
76
 * but some compilers (the Ultrix 3.X pcc compiler and the HPUX compiler)
77
 * can't cast a computed float to an int.  That's why we specify
78
 * the page width and height in inches/10 instead of inches.
79
 * This has been now been changed to use floats.
80
 *
81
 * Note that the macro is broken up so as to be usable for devices that
82
 * add further initialized state to the generic device.
83
 * Note also that the macro does not initialize procs, which is
84
 * the next element of the structure.
85
 */
86
#define std_device_part1_(devtype, ptr_procs, dev_name, stype, open_init)\
87
	sizeof(devtype), ptr_procs, dev_name,\
88
 
89
	{ 0 } /*rc*/, 0 /*retained*/, open_init() /*is_open, max_fill_band*/
90
	/* color_info goes here */
91
/*
92
 * The MetroWerks compiler has some bizarre bug that produces a spurious
93
 * error message if the width and/or height are defined as 0 below,
94
 * unless we use the +/- workaround in the next macro.
95
 */
96
#define std_device_part2_(width, height, x_dpi, y_dpi)\
97
	{ gx_no_color_index, gx_no_color_index },\
98
          width, height, 0/*TrayOrientation*/,\
99
	{ (float)((((width) * 72.0 + 0.5) - 0.5) / (x_dpi))/*MediaSize[0]*/,\
100
	  (float)((((height) * 72.0 + 0.5) - 0.5) / (y_dpi))/*MediaSize[1]*/},\
101
	{ 0, 0, 0, 0 }/*ImagingBBox*/, 0/*ImagingBBox_set*/,\
102
	{ x_dpi, y_dpi }/*HWResolution*/, { x_dpi, y_dpi }/*MarginsHWResolution*/
103
 
104
/* offsets and margins go here */
105
#define std_device_part3_()\
106
	0/*PageCount*/, 0/*ShowpageCount*/, 1/*NumCopies*/, 0/*NumCopies_set*/,\
107
	0/*IgnoreNumCopies*/, 0/*UseCIEColor*/, 0/*LockSafetyParams*/,\
108
	{ gx_default_install, gx_default_begin_page, gx_default_end_page }
109
/*
110
 * We need a number of different variants of the std_device_ macro simply
111
 * because we can't pass the color_info or offsets/margins
112
 * as macro arguments, which in turn is because of the early macro
113
 * expansion issue noted in stdpre.h.  The basic variants are:
114
 *      ...body_with_macros_, which uses 0-argument macros to supply
115
 *        open_init, color_info, and offsets/margins;
116
 *      ...full_body, which takes 12 values (6 for dci_values,
117
 *        6 for offsets/margins);
118
 *      ...color_full_body, which takes 9 values (3 for dci_color,
119
 *        6 for margins/offset).
120
 *      ...std_color_full_body, which takes 7 values (1 for dci_std_color,
121
 *        6 for margins/offset).
122
 *      
123
 */
124
#define std_device_body_with_macros_(dtype, pprocs, dname, stype, w, h, xdpi, ydpi, open_init, dci_macro, margins_macro)\
125
	std_device_part1_(dtype, pprocs, dname, stype, open_init),\
126
	dci_macro(),\
127
	std_device_part2_(w, h, xdpi, ydpi),\
128
	margins_macro(),\
129
	std_device_part3_()
130
 
131
#define std_device_std_body_type(dtype, pprocs, dname, stype, w, h, xdpi, ydpi)\
132
	std_device_body_with_macros_(dtype, pprocs, dname, stype,\
133
	  w, h, xdpi, ydpi,\
134
	  open_init_closed, dci_black_and_white_, no_margins_)
135
 
136
#define std_device_std_body(dtype, pprocs, dname, w, h, xdpi, ydpi)\
137
	std_device_std_body_type(dtype, pprocs, dname, 0, w, h, xdpi, ydpi)
138
 
139
#define std_device_std_body_type_open(dtype, pprocs, dname, stype, w, h, xdpi, ydpi)\
140
	std_device_body_with_macros_(dtype, pprocs, dname, stype,\
141
	  w, h, xdpi, ydpi,\
142
	  open_init_open, dci_black_and_white_, no_margins_)
143
 
144
#define std_device_std_body_open(dtype, pprocs, dname, w, h, xdpi, ydpi)\
145
	std_device_std_body_type_open(dtype, pprocs, dname, 0, w, h, xdpi, ydpi)
146
 
147
#define std_device_full_body_type(dtype, pprocs, dname, stype, w, h, xdpi, ydpi, ncomp, depth, mg, mc, dg, dc, xoff, yoff, lm, bm, rm, tm)\
148
	std_device_part1_(dtype, pprocs, dname, stype, open_init_closed),\
149
	dci_values(ncomp, depth, mg, mc, dg, dc),\
150
	std_device_part2_(w, h, xdpi, ydpi),\
151
	offset_margin_values(xoff, yoff, lm, bm, rm, tm),\
152
	std_device_part3_()
153
 
154
#define std_device_full_body_type_extended(dtype, pprocs, dname, stype, w, h, xdpi, ydpi, mcomp, ncomp, pol, depth, gi, mg, mc, dg, dc, ef, cn, xoff, yoff, lm, bm, rm, tm)\
155
	std_device_part1_(dtype, pprocs, dname, stype, open_init_closed),\
156
        dci_extended_alpha_values(mcomp, ncomp, pol, depth, gi, mg, mc, dg, dc, 1, 1, ef, cn), \
157
	std_device_part2_(w, h, xdpi, ydpi),\
158
	offset_margin_values(xoff, yoff, lm, bm, rm, tm),\
159
	std_device_part3_()
160
 
161
#define std_device_full_body(dtype, pprocs, dname, w, h, xdpi, ydpi, ncomp, depth, mg, mc, dg, dc, xoff, yoff, lm, bm, rm, tm)\
162
	std_device_full_body_type(dtype, pprocs, dname, 0, w, h, xdpi, ydpi,\
163
	    ncomp, depth, mg, mc, dg, dc, xoff, yoff, lm, bm, rm, tm)
164
 
165
#define std_device_dci_alpha_type_body(dtype, pprocs, dname, stype, w, h, xdpi, ydpi, ncomp, depth, mg, mc, dg, dc, ta, ga)\
166
	std_device_part1_(dtype, pprocs, dname, stype, open_init_closed),\
167
	dci_alpha_values(ncomp, depth, mg, mc, dg, dc, ta, ga),\
168
	std_device_part2_(w, h, xdpi, ydpi),\
169
	offset_margin_values(0, 0, 0, 0, 0, 0),\
170
	std_device_part3_()
171
 
172
#define std_device_dci_type_body(dtype, pprocs, dname, stype, w, h, xdpi, ydpi, ncomp, depth, mg, mc, dg, dc)\
173
	std_device_dci_alpha_type_body(dtype, pprocs, dname, stype, w, h,\
174
	  xdpi, ydpi, ncomp, depth, mg, mc, dg, dc, 1, 1)
175
 
176
#define std_device_dci_body(dtype, pprocs, dname, w, h, xdpi, ydpi, ncomp, depth, mg, mc, dg, dc)\
177
	std_device_dci_type_body(dtype, pprocs, dname, 0,\
178
	  w, h, xdpi, ydpi, ncomp, depth, mg, mc, dg, dc)
179
 
180
#define std_device_color_full_body(dtype, pprocs, dname, w, h, xdpi, ydpi, depth, max_value, dither, xoff, yoff, lm, bm, rm, tm)\
181
	std_device_part1_(dtype, pprocs, dname, 0, open_init_closed),\
182
	dci_color(depth, max_value, dither),\
183
	std_device_part2_(w, h, xdpi, ydpi),\
184
	offset_margin_values(xoff, yoff, lm, bm, rm, tm),\
185
	std_device_part3_()
186
 
187
#define std_device_color_body(dtype, pprocs, dname, w, h, xdpi, ydpi, depth, max_value, dither)\
188
	std_device_color_full_body(dtype, pprocs, dname,\
189
	  w, h, xdpi, ydpi,\
190
	  depth, max_value, dither,\
191
	  0, 0, 0, 0, 0, 0)
192
 
193
#define std_device_color_stype_body(dtype, pprocs, dname, stype, w, h, xdpi, ydpi, depth, max_value, dither)\
194
	std_device_part1_(dtype, pprocs, dname, stype, open_init_closed),\
195
	dci_color(depth, max_value, dither),\
196
	std_device_part2_(w, h, xdpi, ydpi),\
197
	offset_margin_values(0, 0, 0, 0, 0, 0),\
198
	std_device_part3_()
199
 
200
#define std_device_std_color_full_body_type(dtype, pprocs, dname, stype, w, h, xdpi, ydpi, depth, xoff, yoff, lm, bm, rm, tm)\
201
	std_device_part1_(dtype, pprocs, dname, stype, open_init_closed),\
202
	dci_std_color(depth),\
203
	std_device_part2_(w, h, xdpi, ydpi),\
204
	offset_margin_values(xoff, yoff, lm, bm, rm, tm),\
205
	std_device_part3_()
206
 
207
#define std_device_std_color_full_body(dtype, pprocs, dname, w, h, xdpi, ydpi, depth, xoff, yoff, lm, bm, rm, tm)\
208
	std_device_std_color_full_body_type(dtype, pprocs, dname, 0,\
209
	    w, h, xdpi, ydpi, depth, xoff, yoff, lm, bm, rm, tm)
210
 
211
/* ---------------- Default implementations ---------------- */
212
 
213
/* Default implementations of optional procedures. */
214
/* Note that the default map_xxx_color routines assume white_on_black. */
215
dev_proc_open_device(gx_default_open_device);
216
dev_proc_get_initial_matrix(gx_default_get_initial_matrix);
217
dev_proc_get_initial_matrix(gx_upright_get_initial_matrix);
218
dev_proc_sync_output(gx_default_sync_output);
219
dev_proc_output_page(gx_default_output_page);
220
dev_proc_close_device(gx_default_close_device);
221
dev_proc_map_rgb_color(gx_default_w_b_map_rgb_color);
222
dev_proc_map_color_rgb(gx_default_w_b_map_color_rgb);
223
#define gx_default_map_rgb_color gx_default_w_b_map_rgb_color
224
#define gx_default_map_color_rgb gx_default_w_b_map_color_rgb
225
dev_proc_tile_rectangle(gx_default_tile_rectangle);
226
dev_proc_copy_mono(gx_default_copy_mono);
227
dev_proc_copy_color(gx_default_copy_color);
228
dev_proc_draw_line(gx_default_draw_line);
229
dev_proc_get_bits(gx_no_get_bits);	/* gives error */
230
dev_proc_get_bits(gx_default_get_bits);
231
dev_proc_get_params(gx_default_get_params);
232
dev_proc_put_params(gx_default_put_params);
233
dev_proc_map_cmyk_color(gx_default_map_cmyk_color);
234
dev_proc_get_xfont_procs(gx_default_get_xfont_procs);
235
dev_proc_get_xfont_device(gx_default_get_xfont_device);
236
dev_proc_map_rgb_alpha_color(gx_default_map_rgb_alpha_color);
237
dev_proc_get_page_device(gx_default_get_page_device);	/* returns NULL */
238
dev_proc_get_page_device(gx_page_device_get_page_device);	/* returns dev */
239
dev_proc_get_alpha_bits(gx_default_get_alpha_bits);
240
dev_proc_copy_alpha(gx_no_copy_alpha);	/* gives error */
241
dev_proc_copy_alpha(gx_default_copy_alpha);
242
dev_proc_get_band(gx_default_get_band);
243
dev_proc_copy_rop(gx_no_copy_rop);	/* gives error */
244
dev_proc_copy_rop(gx_default_copy_rop);
245
dev_proc_fill_path(gx_default_fill_path);
246
dev_proc_stroke_path(gx_default_stroke_path);
247
dev_proc_fill_mask(gx_default_fill_mask);
248
dev_proc_fill_trapezoid(gx_default_fill_trapezoid);
249
dev_proc_fill_parallelogram(gx_default_fill_parallelogram);
250
dev_proc_fill_triangle(gx_default_fill_triangle);
251
dev_proc_draw_thin_line(gx_default_draw_thin_line);
252
dev_proc_begin_image(gx_default_begin_image);
253
dev_proc_image_data(gx_default_image_data);
254
dev_proc_end_image(gx_default_end_image);
255
dev_proc_strip_tile_rectangle(gx_default_strip_tile_rectangle);
256
dev_proc_strip_copy_rop(gx_no_strip_copy_rop);	/* gives error */
257
dev_proc_strip_copy_rop(gx_default_strip_copy_rop);
258
dev_proc_get_clipping_box(gx_default_get_clipping_box);
259
dev_proc_get_clipping_box(gx_get_largest_clipping_box);
260
dev_proc_begin_typed_image(gx_default_begin_typed_image);
261
dev_proc_get_bits_rectangle(gx_no_get_bits_rectangle);	/* gives error */
262
dev_proc_get_bits_rectangle(gx_default_get_bits_rectangle);
263
dev_proc_map_color_rgb_alpha(gx_default_map_color_rgb_alpha);
264
dev_proc_create_compositor(gx_no_create_compositor);
265
/* default is for ordinary "leaf" devices, null is for */
266
/* devices that only care about coverage and not contents. */
267
dev_proc_create_compositor(gx_default_create_compositor);
268
dev_proc_create_compositor(gx_null_create_compositor);
269
dev_proc_get_hardware_params(gx_default_get_hardware_params);
270
dev_proc_text_begin(gx_default_text_begin);
271
dev_proc_finish_copydevice(gx_default_finish_copydevice);
272
dev_proc_pattern_manage(gx_default_pattern_manage);
273
dev_proc_fill_rectangle_hl_color(gx_default_fill_rectangle_hl_color);
274
dev_proc_include_color_space(gx_default_include_color_space);
275
dev_proc_fill_linear_color_scanline(gx_default_fill_linear_color_scanline);
276
dev_proc_fill_linear_color_trapezoid(gx_default_fill_linear_color_trapezoid);
277
dev_proc_fill_linear_color_triangle(gx_default_fill_linear_color_triangle);
278
dev_proc_update_spot_equivalent_colors(gx_default_update_spot_equivalent_colors);
279
/* BACKWARD COMPATIBILITY */
280
#define gx_non_imaging_create_compositor gx_null_create_compositor
281
 
282
/* Color mapping routines for black-on-white, gray scale, true RGB, */
283
/* true CMYK, and 1-bit CMYK color. */
284
dev_proc_map_rgb_color(gx_default_b_w_map_rgb_color);
285
dev_proc_map_color_rgb(gx_default_b_w_map_color_rgb);
286
dev_proc_map_rgb_color(gx_default_gray_map_rgb_color);
287
dev_proc_map_color_rgb(gx_default_gray_map_color_rgb);
288
dev_proc_map_color_rgb(gx_default_rgb_map_color_rgb);
289
#define gx_default_cmyk_map_cmyk_color cmyk_8bit_map_cmyk_color /*see below*/
290
/*
291
 * The following are defined as "standard" color mapping procedures
292
 * that can be propagated through device pipelines and that color
293
 * processing code can test for.
294
 */
295
dev_proc_map_rgb_color(gx_default_rgb_map_rgb_color);
296
dev_proc_map_cmyk_color(cmyk_1bit_map_cmyk_color);
297
dev_proc_map_color_rgb(cmyk_1bit_map_color_rgb);
298
dev_proc_decode_color(cmyk_1bit_map_color_cmyk);
299
dev_proc_map_cmyk_color(cmyk_8bit_map_cmyk_color);
300
dev_proc_map_color_rgb(cmyk_8bit_map_color_rgb);
301
dev_proc_decode_color(cmyk_8bit_map_color_cmyk);
302
dev_proc_encode_color(gx_default_8bit_map_gray_color);
303
dev_proc_decode_color(gx_default_8bit_map_color_gray);
304
 
305
/* Default implementations for forwarding devices */
306
dev_proc_close_device(gx_forward_close_device);
307
dev_proc_get_initial_matrix(gx_forward_get_initial_matrix);
308
dev_proc_sync_output(gx_forward_sync_output);
309
dev_proc_output_page(gx_forward_output_page);
310
dev_proc_map_rgb_color(gx_forward_map_rgb_color);
311
dev_proc_map_color_rgb(gx_forward_map_color_rgb);
312
dev_proc_fill_rectangle(gx_forward_fill_rectangle);
313
dev_proc_tile_rectangle(gx_forward_tile_rectangle);
314
dev_proc_copy_mono(gx_forward_copy_mono);
315
dev_proc_copy_color(gx_forward_copy_color);
316
dev_proc_get_bits(gx_forward_get_bits);
317
dev_proc_get_params(gx_forward_get_params);
318
dev_proc_put_params(gx_forward_put_params);
319
dev_proc_map_cmyk_color(gx_forward_map_cmyk_color);
320
dev_proc_get_xfont_procs(gx_forward_get_xfont_procs);
321
dev_proc_get_xfont_device(gx_forward_get_xfont_device);
322
dev_proc_map_rgb_alpha_color(gx_forward_map_rgb_alpha_color);
323
dev_proc_get_page_device(gx_forward_get_page_device);
324
#define gx_forward_get_alpha_bits gx_default_get_alpha_bits
325
dev_proc_copy_alpha(gx_forward_copy_alpha);
326
dev_proc_get_band(gx_forward_get_band);
327
dev_proc_copy_rop(gx_forward_copy_rop);
328
dev_proc_fill_path(gx_forward_fill_path);
329
dev_proc_stroke_path(gx_forward_stroke_path);
330
dev_proc_fill_mask(gx_forward_fill_mask);
331
dev_proc_fill_trapezoid(gx_forward_fill_trapezoid);
332
dev_proc_fill_parallelogram(gx_forward_fill_parallelogram);
333
dev_proc_fill_triangle(gx_forward_fill_triangle);
334
dev_proc_draw_thin_line(gx_forward_draw_thin_line);
335
dev_proc_begin_image(gx_forward_begin_image);
336
#define gx_forward_image_data gx_default_image_data
337
#define gx_forward_end_image gx_default_end_image
338
dev_proc_strip_tile_rectangle(gx_forward_strip_tile_rectangle);
339
dev_proc_strip_copy_rop(gx_forward_strip_copy_rop);
340
dev_proc_get_clipping_box(gx_forward_get_clipping_box);
341
dev_proc_begin_typed_image(gx_forward_begin_typed_image);
342
dev_proc_get_bits_rectangle(gx_forward_get_bits_rectangle);
343
dev_proc_map_color_rgb_alpha(gx_forward_map_color_rgb_alpha);
344
/* There is no forward_create_compositor (see Drivers.htm). */
345
dev_proc_get_hardware_params(gx_forward_get_hardware_params);
346
dev_proc_text_begin(gx_forward_text_begin);
347
dev_proc_get_color_mapping_procs(gx_forward_get_color_mapping_procs);
348
dev_proc_get_color_comp_index(gx_forward_get_color_comp_index);
349
dev_proc_encode_color(gx_forward_encode_color);
350
dev_proc_decode_color(gx_forward_decode_color);
351
dev_proc_pattern_manage(gx_forward_pattern_manage);
352
dev_proc_fill_rectangle_hl_color(gx_forward_fill_rectangle_hl_color);
353
dev_proc_include_color_space(gx_forward_include_color_space);
354
dev_proc_fill_linear_color_scanline(gx_forward_fill_linear_color_scanline);
355
dev_proc_fill_linear_color_trapezoid(gx_forward_fill_linear_color_trapezoid);
356
dev_proc_fill_linear_color_triangle(gx_forward_fill_linear_color_triangle);
357
dev_proc_update_spot_equivalent_colors(gx_forward_update_spot_equivalent_colors);
358
 
359
/* ---------------- Implementation utilities ---------------- */
360
 
361
/* Convert the device procedures to the proper form (see above). */
362
void gx_device_set_procs(gx_device *);
363
 
364
/* Fill in defaulted procedures in a device procedure record. */
365
void gx_device_fill_in_procs(gx_device *);
366
void gx_device_forward_fill_in_procs(gx_device_forward *);
367
 
368
/* Forward the color mapping procedures from a device to its target. */
369
void gx_device_forward_color_procs(gx_device_forward *);
370
 
371
/*
372
 * Check if the device's encode_color routine uses 'separable' bit encodings
373
 * for each colorant.  For more info see the routine's header.
374
 */
375
void check_device_separable(gx_device * dev);
376
/*
377
 * If a device has a linear and separable encode color function then
378
 * set up the comp_bits, comp_mask, and comp_shift fields.
379
 */
380
void set_linear_color_bits_mask_shift(gx_device * dev);
381
/*
382
 * Copy the color mapping procedures from the target if they are
383
 * standard ones (saving a level of procedure call at mapping time).
384
 */
385
void gx_device_copy_color_procs(gx_device *dev, const gx_device *target);
386
 
387
/* Get the black and white pixel values of a device. */
388
gx_color_index gx_device_black(gx_device *dev);
389
#define gx_device_black_inline(dev)\
390
  ((dev)->cached_colors.black == gx_no_color_index ?\
391
   gx_device_black(dev) : (dev)->cached_colors.black)
392
gx_color_index gx_device_white(gx_device *dev);
393
#define gx_device_white_inline(dev)\
394
  ((dev)->cached_colors.white == gx_no_color_index ?\
395
   gx_device_white(dev) : (dev)->cached_colors.white)
396
 
397
/* Clear the black/white pixel cache. */
398
void gx_device_decache_colors(gx_device *dev);
399
 
400
/*
401
 * Copy the color-related device parameters back from the target:
402
 * color_info and color mapping procedures.
403
 */
404
void gx_device_copy_color_params(gx_device *dev, const gx_device *target);
405
 
406
/*
407
 * Copy device parameters back from a target.  This copies all standard
408
 * parameters related to page size and resolution, plus color_info
409
 * and (if appropriate) color mapping procedures.
410
 */
411
void gx_device_copy_params(gx_device *dev, const gx_device *target);
412
 
413
/*
414
 * Parse the output file name for a device, recognizing "-" and "|command",
415
 * and also detecting and validating any %nnd format for inserting the
416
 * page count.  If a format is present, store a pointer to its last
417
 * character in *pfmt, otherwise store 0 there.  Note that an empty name
418
 * is currently allowed.
419
 */
420
int gx_parse_output_file_name(gs_parsed_file_name_t *pfn,
421
			      const char **pfmt, const char *fname,
422
			      uint len);
423
 
424
/*
425
 * Open the output file for a device.  Note that if the file name is empty,
426
 * it may be replaced with the name of a scratch file.
427
 */
428
int gx_device_open_output_file(const gx_device * dev, char *fname,
429
			       bool binary, bool positionable,
430
			       FILE ** pfile);
431
 
432
/* Close the output file for a device. */
433
int gx_device_close_output_file(const gx_device * dev, const char *fname,
434
				FILE *file);
435
 
436
/*
437
 * Define the number of levels for a colorant above which we do not halftone.
438
 */
439
#define MIN_CONTONE_LEVELS 31
440
 
441
/*
442
 * Determine whether a given device needs to halftone.  Eventually this
443
 * should take an imager state as an additional argument.
444
 */
445
#define gx_device_must_halftone(dev)\
446
  ((gx_device_has_color(dev) ? (dev)->color_info.max_color :\
447
    (dev)->color_info.max_gray) < MIN_CONTONE_LEVELS)
448
 
449
/*
450
 * Do generic work for output_page.  All output_page procedures must call
451
 * this as the last thing they do, unless an error has occurred earlier.
452
 */
453
dev_proc_output_page(gx_finish_output_page);
454
 
455
/*
456
 * Device procedures that draw into rectangles need to clip the coordinates
457
 * to the rectangle ((0,0),(dev->width,dev->height)).  The following macros
458
 * do the clipping.  They assume that the arguments of the procedure are
459
 * named dev, x, y, w, and h, and may modify the arguments (other than dev).
460
 *
461
 * For procedures that fill a region, dev, x, y, w, and h are the only
462
 * relevant arguments.  For procedures that copy bitmaps, see below.
463
 *
464
 * The following group of macros for region-filling procedures clips
465
 * specific edges of the supplied rectangle, as indicated by the macro name.
466
 */
467
#define fit_fill_xy(dev, x, y, w, h)\
468
  BEGIN\
469
	if ( (x | y) < 0 ) {\
470
	  if ( x < 0 )\
471
	    w += x, x = 0;\
472
	  if ( y < 0 )\
473
	    h += y, y = 0;\
474
	}\
475
  END
476
#define fit_fill_y(dev, y, h)\
477
  BEGIN\
478
	if ( y < 0 )\
479
	  h += y, y = 0;\
480
  END
481
#define fit_fill_w(dev, x, w)\
482
  BEGIN\
483
	if ( w > (dev)->width - x )\
484
	  w = (dev)->width - x;\
485
  END
486
#define fit_fill_h(dev, y, h)\
487
  BEGIN\
488
	if ( h > (dev)->height - y )\
489
	  h = (dev)->height - y;\
490
  END
491
#define fit_fill_xywh(dev, x, y, w, h)\
492
  BEGIN\
493
	fit_fill_xy(dev, x, y, w, h);\
494
	fit_fill_w(dev, x, w);\
495
	fit_fill_h(dev, y, h);\
496
  END
497
/*
498
 * Clip all edges, and return from the procedure if the result is empty.
499
 */
500
#define fit_fill(dev, x, y, w, h)\
501
  BEGIN\
502
	fit_fill_xywh(dev, x, y, w, h);\
503
	if ( w <= 0 || h <= 0 )\
504
	  return 0;\
505
  END
506
 
507
/*
508
 * For driver procedures that copy bitmaps (e.g., copy_mono, copy_color),
509
 * clipping the destination region also may require adjusting the pointer to
510
 * the source data.  In addition to dev, x, y, w, and h, the clipping macros
511
 * for these procedures reference data, data_x, raster, and id; they may
512
 * modify the values of data, data_x, and id.
513
 *
514
 * Clip the edges indicated by the macro name.
515
 */
516
#define fit_copy_xyw(dev, data, data_x, raster, id, x, y, w, h)\
517
  BEGIN\
518
	if ( (x | y) < 0 ) {\
519
	  if ( x < 0 )\
520
	    w += x, data_x -= x, x = 0;\
521
	  if ( y < 0 )\
522
	    h += y, data -= y * raster, id = gx_no_bitmap_id, y = 0;\
523
	}\
524
	if ( w > (dev)->width - x )\
525
	  w = (dev)->width - x;\
526
  END
527
/*
528
 * Clip all edges, and return from the procedure if the result is empty.
529
 */
530
#define fit_copy(dev, data, data_x, raster, id, x, y, w, h)\
531
  BEGIN\
532
	fit_copy_xyw(dev, data, data_x, raster, id, x, y, w, h);\
533
	if ( h > (dev)->height - y )\
534
	  h = (dev)->height - y;\
535
	if ( w <= 0 || h <= 0 )\
536
	  return 0;\
537
  END
538
 
539
/* ---------------- Media parameters ---------------- */
540
 
541
/* Define the InputAttributes and OutputAttributes of a device. */
542
/* The device get_params procedure would call these. */
543
 
544
typedef struct gdev_input_media_s {
545
    float PageSize[4];		/* nota bene */
546
    const char *MediaColor;
547
    float MediaWeight;
548
    const char *MediaType;
549
} gdev_input_media_t;
550
 
551
#define gdev_input_media_default_values { 0, 0, 0, 0 }, 0, 0, 0
552
extern const gdev_input_media_t gdev_input_media_default;
553
 
554
void gdev_input_media_init(gdev_input_media_t * pim);
555
 
556
int gdev_begin_input_media(gs_param_list * mlist, gs_param_dict * pdict,
557
			   int count);
558
 
559
int gdev_write_input_page_size(int index, gs_param_dict * pdict,
560
			       floatp width_points, floatp height_points);
561
 
562
int gdev_write_input_media(int index, gs_param_dict * pdict,
563
			   const gdev_input_media_t * pim);
564
 
565
int gdev_end_input_media(gs_param_list * mlist, gs_param_dict * pdict);
566
 
567
typedef struct gdev_output_media_s {
568
    const char *OutputType;
569
} gdev_output_media_t;
570
 
571
#define gdev_output_media_default_values 0
572
extern const gdev_output_media_t gdev_output_media_default;
573
 
574
int gdev_begin_output_media(gs_param_list * mlist, gs_param_dict * pdict,
575
			    int count);
576
 
577
int gdev_write_output_media(int index, gs_param_dict * pdict,
578
			    const gdev_output_media_t * pom);
579
 
580
int gdev_end_output_media(gs_param_list * mlist, gs_param_dict * pdict);
581
 
582
#endif /* gxdevice_INCLUDED */