xref: /plan9-contrib/sys/src/cmd/gs/src/gdevprn.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1*593dc095SDavid du Colombier /* Copyright (C) 1989, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Aladdin Enterprises.  All rights reserved.
27dd7cddfSDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
57dd7cddfSDavid 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.
97dd7cddfSDavid 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.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: gdevprn.h,v 1.15 2005/05/27 05:43:24 dan Exp $ */
187dd7cddfSDavid du Colombier /* Common header file for memory-buffered printers */
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier #ifndef gdevprn_INCLUDED
217dd7cddfSDavid du Colombier #  define gdevprn_INCLUDED
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier #include "memory_.h"
247dd7cddfSDavid du Colombier #include "string_.h"
257dd7cddfSDavid du Colombier #include "gx.h"
267dd7cddfSDavid du Colombier #include "gp.h"			/* for gp_file_name_sizeof */
277dd7cddfSDavid du Colombier #include "gserrors.h"
287dd7cddfSDavid du Colombier #include "gsmatrix.h"		/* for gxdevice.h */
297dd7cddfSDavid du Colombier #include "gsutil.h"		/* for memflip8x8 */
307dd7cddfSDavid du Colombier #include "gxdevice.h"
317dd7cddfSDavid du Colombier #include "gxdevmem.h"
327dd7cddfSDavid du Colombier #include "gxclist.h"
337dd7cddfSDavid du Colombier #include "gxrplane.h"
347dd7cddfSDavid du Colombier #include "gsparam.h"
357dd7cddfSDavid du Colombier 
367dd7cddfSDavid du Colombier /*
377dd7cddfSDavid du Colombier  * Define the parameters for the printer rendering method.
387dd7cddfSDavid du Colombier  * If the entire bitmap fits in PRN_MAX_BITMAP, and there is at least
397dd7cddfSDavid du Colombier  * PRN_MIN_MEMORY_LEFT memory left after allocating it, render in RAM,
407dd7cddfSDavid du Colombier  * otherwise use a command list with a size of PRN_BUFFER_SPACE.
417dd7cddfSDavid du Colombier  * (These are parameters that can be changed by a client program.)
427dd7cddfSDavid du Colombier  */
437dd7cddfSDavid du Colombier /* Define parameters for machines with little dinky RAMs.... */
447dd7cddfSDavid du Colombier #define PRN_MAX_BITMAP_SMALL 32000
457dd7cddfSDavid du Colombier #define PRN_BUFFER_SPACE_SMALL 25000
467dd7cddfSDavid du Colombier #define PRN_MIN_MEMORY_LEFT_SMALL 32000
477dd7cddfSDavid du Colombier /* Define parameters for machines with great big hulking RAMs.... */
487dd7cddfSDavid du Colombier #define PRN_MAX_BITMAP_LARGE 10000000L
493ff48bf5SDavid du Colombier #define PRN_BUFFER_SPACE_LARGE 4000000L
507dd7cddfSDavid du Colombier #define PRN_MIN_MEMORY_LEFT_LARGE 500000L
517dd7cddfSDavid du Colombier /* Define parameters valid on all machines. */
527dd7cddfSDavid du Colombier #define PRN_MIN_BUFFER_SPACE 10000	/* give up if less than this */
537dd7cddfSDavid du Colombier /* Now define conditional parameters. */
547dd7cddfSDavid du Colombier #if arch_small_memory
557dd7cddfSDavid du Colombier #  define PRN_MAX_BITMAP PRN_MAX_BITMAP_SMALL
567dd7cddfSDavid du Colombier #  define PRN_BUFFER_SPACE PRN_BUFFER_SPACE_SMALL
577dd7cddfSDavid du Colombier #  define PRN_MIN_MEMORY_LEFT PRN_MIN_MEMORY_LEFT_SMALL
587dd7cddfSDavid du Colombier #else
597dd7cddfSDavid du Colombier /****** These should really be conditional on gs_debug_c('.') if
607dd7cddfSDavid du Colombier  ****** DEBUG is defined, but they're used in static initializers,
617dd7cddfSDavid du Colombier  ****** so we can't do it.
627dd7cddfSDavid du Colombier  ******/
637dd7cddfSDavid du Colombier #  if 0				/****** #  ifdef DEBUG ***** */
647dd7cddfSDavid du Colombier #    define PRN_MAX_BITMAP\
657dd7cddfSDavid du Colombier        (gs_debug_c('.') ? PRN_MAX_BITMAP_SMALL : PRN_MAX_BITMAP_LARGE)
667dd7cddfSDavid du Colombier #    define PRN_BUFFER_SPACE\
677dd7cddfSDavid du Colombier        (gs_debug_c('.') ? PRN_BUFFER_SPACE_SMALL : PRN_BUFFER_SPACE_LARGE)
687dd7cddfSDavid du Colombier #    define PRN_MIN_MEMORY_LEFT\
697dd7cddfSDavid du Colombier        (gs_debug_c('.') ? PRN_MIN_MEMORY_LEFT_SMALL : PRN_MIN_MEMORY_LEFT_LARGE)
707dd7cddfSDavid du Colombier #  else
717dd7cddfSDavid du Colombier #    define PRN_MAX_BITMAP PRN_MAX_BITMAP_LARGE
727dd7cddfSDavid du Colombier #    define PRN_BUFFER_SPACE PRN_BUFFER_SPACE_LARGE
737dd7cddfSDavid du Colombier #    define PRN_MIN_MEMORY_LEFT PRN_MIN_MEMORY_LEFT_LARGE
747dd7cddfSDavid du Colombier #  endif
757dd7cddfSDavid du Colombier #endif
767dd7cddfSDavid du Colombier 
777dd7cddfSDavid du Colombier /* Define the abstract type for a printer device. */
787dd7cddfSDavid du Colombier #ifndef gx_device_printer_DEFINED
797dd7cddfSDavid du Colombier #  define gx_device_printer_DEFINED
807dd7cddfSDavid du Colombier typedef struct gx_device_printer_s gx_device_printer;
817dd7cddfSDavid du Colombier #endif
827dd7cddfSDavid du Colombier 
837dd7cddfSDavid du Colombier /* Define the abstract type for some band device procedures' arguments. */
847dd7cddfSDavid du Colombier typedef struct gdev_prn_start_render_params_s gdev_prn_start_render_params;
857dd7cddfSDavid du Colombier 
867dd7cddfSDavid du Colombier /* Define the abstract type for a page queue for async rendering. */
877dd7cddfSDavid du Colombier #ifndef gx_page_queue_DEFINED
887dd7cddfSDavid du Colombier #  define gx_page_queue_DEFINED
897dd7cddfSDavid du Colombier typedef struct gx_page_queue_s gx_page_queue_t;
907dd7cddfSDavid du Colombier #endif
917dd7cddfSDavid du Colombier 
927dd7cddfSDavid du Colombier /* Define the abstract type for parameters describing buffer space. */
937dd7cddfSDavid du Colombier #ifndef gdev_prn_space_params_DEFINED
947dd7cddfSDavid du Colombier #  define gdev_prn_space_params_DEFINED
957dd7cddfSDavid du Colombier typedef struct gdev_prn_space_params_s gdev_prn_space_params;
967dd7cddfSDavid du Colombier #endif
977dd7cddfSDavid du Colombier 
987dd7cddfSDavid du Colombier /*
997dd7cddfSDavid du Colombier  * Define the special procedures for band devices.
1007dd7cddfSDavid du Colombier  */
1017dd7cddfSDavid du Colombier typedef struct gx_printer_device_procs_s {
1027dd7cddfSDavid du Colombier 
1037dd7cddfSDavid du Colombier     /*
1047dd7cddfSDavid du Colombier      * Print the page on the output file.  Required only for devices
1057dd7cddfSDavid du Colombier      * where output_page is gdev_prn_output_page; ignored for other
1067dd7cddfSDavid du Colombier      * devices.
1077dd7cddfSDavid du Colombier      */
1087dd7cddfSDavid du Colombier 
1097dd7cddfSDavid du Colombier #define prn_dev_proc_print_page(proc)\
110*593dc095SDavid du Colombier   int proc(gx_device_printer *, FILE *)
1117dd7cddfSDavid du Colombier     prn_dev_proc_print_page((*print_page));
1127dd7cddfSDavid du Colombier /* BACKWARD COMPATIBILITY */
1137dd7cddfSDavid du Colombier #define dev_proc_print_page(proc) prn_dev_proc_print_page(proc)
1147dd7cddfSDavid du Colombier 
1157dd7cddfSDavid du Colombier     /* Print the page on the output file, with a given # of copies. */
1167dd7cddfSDavid du Colombier 
1177dd7cddfSDavid du Colombier #define prn_dev_proc_print_page_copies(proc)\
118*593dc095SDavid du Colombier   int proc(gx_device_printer *, FILE *, int)
1197dd7cddfSDavid du Colombier     prn_dev_proc_print_page_copies((*print_page_copies));
1207dd7cddfSDavid du Colombier /* BACKWARD COMPATIBILITY */
1217dd7cddfSDavid du Colombier #define dev_proc_print_page_copies(proc) prn_dev_proc_print_page_copies(proc)
1227dd7cddfSDavid du Colombier 
1237dd7cddfSDavid du Colombier     /*
1247dd7cddfSDavid du Colombier      * Define buffer device management procedures.
1257dd7cddfSDavid du Colombier      * See gxdevcli.h for the definitions.
1267dd7cddfSDavid du Colombier      */
1277dd7cddfSDavid du Colombier 
1287dd7cddfSDavid du Colombier     gx_device_buf_procs_t buf_procs;
1297dd7cddfSDavid du Colombier 
1307dd7cddfSDavid du Colombier     /*
1317dd7cddfSDavid du Colombier      * Compute effective space params. These results effectively override
1327dd7cddfSDavid du Colombier      * the space_params in the device, but does not replace them; that is to
1337dd7cddfSDavid du Colombier      * say that computed space params are temps used for computation.
1347dd7cddfSDavid du Colombier      * Procedure must fill in only those space_params that it wishes to
1357dd7cddfSDavid du Colombier      * override, using curr width, height, margins, etc.
1367dd7cddfSDavid du Colombier      *
1377dd7cddfSDavid du Colombier      * Caller is gdevprn.open & gdevprn.put_params, calls driver or
1387dd7cddfSDavid du Colombier      * default.
1397dd7cddfSDavid du Colombier      */
1407dd7cddfSDavid du Colombier 
1417dd7cddfSDavid du Colombier #define prn_dev_proc_get_space_params(proc)\
142*593dc095SDavid du Colombier   void proc(const gx_device_printer *, gdev_prn_space_params *)
1437dd7cddfSDavid du Colombier     prn_dev_proc_get_space_params((*get_space_params));
1447dd7cddfSDavid du Colombier 
1457dd7cddfSDavid du Colombier     /*
1467dd7cddfSDavid du Colombier      * Only for gx_device_printer devices that overlap interpreting and
1477dd7cddfSDavid du Colombier      * rasterizing. Since there are 2 instances of the device (1 for writing
1487dd7cddfSDavid du Colombier      * the cmd list & 1 for rasterizing it), and each device is associated
1497dd7cddfSDavid du Colombier      * with an different thread, this function is called to start the
1507dd7cddfSDavid du Colombier      * rasterizer's thread. Once started, the rasterizer thread must call
1517dd7cddfSDavid du Colombier      * down to gdev_prn_asnyc_render_thread, which will only return after
1527dd7cddfSDavid du Colombier      * device closes.
1537dd7cddfSDavid du Colombier      *
1547dd7cddfSDavid du Colombier      * Caller is gdevprna.open, calls driver implementation or default.
1557dd7cddfSDavid du Colombier      */
1567dd7cddfSDavid du Colombier 
1577dd7cddfSDavid du Colombier #define prn_dev_proc_start_render_thread(proc)\
158*593dc095SDavid du Colombier   int proc(gdev_prn_start_render_params *)
1597dd7cddfSDavid du Colombier     prn_dev_proc_start_render_thread((*start_render_thread));
1607dd7cddfSDavid du Colombier 
1617dd7cddfSDavid du Colombier     /*
1627dd7cddfSDavid du Colombier      * Only for gx_device_printer devices that overlap interpreting and
1637dd7cddfSDavid du Colombier      * rasterizing. Since there are 2 instances of the device (1 for writing
1647dd7cddfSDavid du Colombier      * the cmd list & 1 for rasterizing it), these fns are called to
1657dd7cddfSDavid du Colombier      * open/close the rasterizer's instance, once the writer's instance has
1667dd7cddfSDavid du Colombier      * been created & init'd. These procs must cascade down to
1677dd7cddfSDavid du Colombier      * gdev_prn_async_render_open/close.
1687dd7cddfSDavid du Colombier      *
1697dd7cddfSDavid du Colombier      * Caller is gdevprna, calls driver implementation or default.
1707dd7cddfSDavid du Colombier      */
1717dd7cddfSDavid du Colombier 
1727dd7cddfSDavid du Colombier #define prn_dev_proc_open_render_device(proc)\
173*593dc095SDavid du Colombier   int proc(gx_device_printer *)
1747dd7cddfSDavid du Colombier     prn_dev_proc_open_render_device((*open_render_device));
1757dd7cddfSDavid du Colombier 
1767dd7cddfSDavid du Colombier #define prn_dev_proc_close_render_device(proc)\
177*593dc095SDavid du Colombier   int proc(gx_device_printer *)
1787dd7cddfSDavid du Colombier     prn_dev_proc_close_render_device((*close_render_device));
1797dd7cddfSDavid du Colombier 
1807dd7cddfSDavid du Colombier     /*
1817dd7cddfSDavid du Colombier      * Buffer a page on the output device. A page may or may not have been
1827dd7cddfSDavid du Colombier      * fully rendered, but the rasterizer needs to realize the page to free
1837dd7cddfSDavid du Colombier      * up resources or support copypage. Printing a page may involve zero or
1847dd7cddfSDavid du Colombier      * more buffer_pages. All buffer_page output is overlaid in the buffer
1857dd7cddfSDavid du Colombier      * until a terminating print_page or print_page_copies clears the
1867dd7cddfSDavid du Colombier      * buffer. Note that, after the first buffer_page, the driver must call
1877dd7cddfSDavid du Colombier      * the lower-level gdev_prn_render_lines procedure instead of
1887dd7cddfSDavid du Colombier      * get_bits. The difference is that gdev_prn_render_lines requires the
1897dd7cddfSDavid du Colombier      * caller to supply the same buffered bitmap that was computed as a
1907dd7cddfSDavid du Colombier      * result of a previous buffer_page, so that gdev_prn_render_lines can
1917dd7cddfSDavid du Colombier      * add further marks to the existing buffered image. NB that output must
1927dd7cddfSDavid du Colombier      * be accumulated in buffer even if num_copies == 0.
1937dd7cddfSDavid du Colombier      *
1947dd7cddfSDavid du Colombier      * Caller is expected to be gdevprn, calls driver implementation or
1957dd7cddfSDavid du Colombier      * default.  */
1967dd7cddfSDavid du Colombier 
1977dd7cddfSDavid du Colombier #define prn_dev_proc_buffer_page(proc)\
198*593dc095SDavid du Colombier   int proc(gx_device_printer *, FILE *, int)
1997dd7cddfSDavid du Colombier     prn_dev_proc_buffer_page((*buffer_page));
2007dd7cddfSDavid du Colombier 
2017dd7cddfSDavid du Colombier } gx_printer_device_procs;
2027dd7cddfSDavid du Colombier 
2037dd7cddfSDavid du Colombier /* ------ Printer device definition ------ */
2047dd7cddfSDavid du Colombier 
2057dd7cddfSDavid du Colombier /* Structure for generic printer devices. */
2067dd7cddfSDavid du Colombier /* This must be preceded by gx_device_common. */
2077dd7cddfSDavid du Colombier /* Printer devices are actually a union of a memory device */
2087dd7cddfSDavid du Colombier /* and a clist device, plus some additional state. */
2097dd7cddfSDavid du Colombier #define prn_fname_sizeof gp_file_name_sizeof
2107dd7cddfSDavid du Colombier typedef enum {
2117dd7cddfSDavid du Colombier     BandingAuto = 0,
2127dd7cddfSDavid du Colombier     BandingAlways,
2137dd7cddfSDavid du Colombier     BandingNever
2147dd7cddfSDavid du Colombier } gdev_prn_banding_type;
2157dd7cddfSDavid du Colombier struct gdev_prn_space_params_s {
2167dd7cddfSDavid du Colombier     long MaxBitmap;		/* max size of non-buffered bitmap */
2177dd7cddfSDavid du Colombier     long BufferSpace;		/* space to use for buffer */
2187dd7cddfSDavid du Colombier     gx_band_params_t band;	/* see gxclist.h */
2197dd7cddfSDavid du Colombier     bool params_are_read_only;	/* true if put_params may not modify this struct */
2207dd7cddfSDavid du Colombier     gdev_prn_banding_type banding_type;	/* used to force banding or bitmap */
2217dd7cddfSDavid du Colombier };
2227dd7cddfSDavid du Colombier 
2237dd7cddfSDavid du Colombier #define gx_prn_device_common\
2247dd7cddfSDavid du Colombier 	byte skip[max(sizeof(gx_device_memory), sizeof(gx_device_clist)) -\
2257dd7cddfSDavid du Colombier 		  sizeof(gx_device) + sizeof(double) /* padding */];\
2267dd7cddfSDavid du Colombier 	gx_printer_device_procs printer_procs;\
2277dd7cddfSDavid du Colombier 		/* ------ Device parameters that must be set ------ */\
2287dd7cddfSDavid du Colombier 		/* ------ before calling the device open routine. ------ */\
2297dd7cddfSDavid du Colombier 	gdev_prn_space_params space_params;\
2307dd7cddfSDavid du Colombier 	char fname[prn_fname_sizeof];	/* OutputFile */\
2317dd7cddfSDavid du Colombier 		/* ------ Other device parameters ------ */\
2327dd7cddfSDavid du Colombier 	bool OpenOutputFile;\
2337dd7cddfSDavid du Colombier 	bool ReopenPerPage;\
234*593dc095SDavid du Colombier         bool page_uses_transparency; /* PDF 1.4 transparency is used on page */\
2357dd7cddfSDavid du Colombier 	bool Duplex;\
2367dd7cddfSDavid du Colombier 	  int Duplex_set;		/* -1 = not supported */\
2377dd7cddfSDavid du Colombier 		/* ------ End of parameters ------ */\
2387dd7cddfSDavid du Colombier 	bool file_is_new;		/* true iff file just opened */\
2397dd7cddfSDavid du Colombier 	FILE *file;			/* output file */\
2407dd7cddfSDavid du Colombier 	long buffer_space;	/* amount of space for clist buffer, */\
2417dd7cddfSDavid du Colombier 					/* 0 means not using clist */\
2427dd7cddfSDavid du Colombier 	byte *buf;			/* buffer for rendering */\
2437dd7cddfSDavid du Colombier 		/* ---- Begin async rendering support --- */\
2447dd7cddfSDavid du Colombier 	gs_memory_t *buffer_memory;	/* allocator for command list */\
2457dd7cddfSDavid du Colombier 	gs_memory_t *bandlist_memory;	/* allocator for bandlist files */\
2467dd7cddfSDavid du Colombier 	proc_free_up_bandlist_memory((*free_up_bandlist_memory));  	/* if nz, proc to free some bandlist memory */\
2477dd7cddfSDavid du Colombier 	gx_page_queue_t *page_queue;	/* if <> 0,page queue for gdevprna NOT GC'd */\
2487dd7cddfSDavid du Colombier 	bool is_async_renderer;		/* device is only the rendering part of async device */\
2497dd7cddfSDavid du Colombier 	gx_device_printer *async_renderer;	/* in async writer, pointer to async renderer */\
2507dd7cddfSDavid du Colombier 	uint clist_disable_mask;	/* mask of clist options to disable */\
2517dd7cddfSDavid du Colombier 		/* ---- End async rendering support --- */\
2527dd7cddfSDavid du Colombier 	gx_device_procs orig_procs	/* original (std_)procs */
2537dd7cddfSDavid du Colombier 
2547dd7cddfSDavid du Colombier /* The device descriptor */
2557dd7cddfSDavid du Colombier struct gx_device_printer_s {
2567dd7cddfSDavid du Colombier     gx_device_common;
2577dd7cddfSDavid du Colombier     gx_prn_device_common;
2587dd7cddfSDavid du Colombier };
2597dd7cddfSDavid du Colombier 
2607dd7cddfSDavid du Colombier extern_st(st_device_printer);
2617dd7cddfSDavid du Colombier #define public_st_device_printer()	/* in gdevprn.c */\
2627dd7cddfSDavid du Colombier   gs_public_st_complex_only(st_device_printer, gx_device_printer,\
2637dd7cddfSDavid du Colombier     "gx_device_printer", 0, device_printer_enum_ptrs,\
2647dd7cddfSDavid du Colombier     device_printer_reloc_ptrs, gx_device_finalize)
2657dd7cddfSDavid du Colombier 
2667dd7cddfSDavid du Colombier /* Define a typedef for the sake of ansi2knr. */
2677dd7cddfSDavid du Colombier typedef dev_proc_print_page((*dev_proc_print_page_t));
2687dd7cddfSDavid du Colombier 
2697dd7cddfSDavid du Colombier /* Standard device procedures for printers */
2707dd7cddfSDavid du Colombier dev_proc_open_device(gdev_prn_open);
2717dd7cddfSDavid du Colombier dev_proc_output_page(gdev_prn_output_page);
2727dd7cddfSDavid du Colombier dev_proc_close_device(gdev_prn_close);
2737dd7cddfSDavid du Colombier #define gdev_prn_map_rgb_color gx_default_b_w_map_rgb_color
2747dd7cddfSDavid du Colombier #define gdev_prn_map_color_rgb gx_default_b_w_map_color_rgb
2757dd7cddfSDavid du Colombier dev_proc_get_params(gdev_prn_get_params);
2767dd7cddfSDavid du Colombier dev_proc_put_params(gdev_prn_put_params);
2777dd7cddfSDavid du Colombier 
2787dd7cddfSDavid du Colombier /* Default printer-specific procedures */
2797dd7cddfSDavid du Colombier /* VMS limits procedure names to 31 characters. */
2807dd7cddfSDavid du Colombier prn_dev_proc_get_space_params(gx_default_get_space_params);
2817dd7cddfSDavid du Colombier /* BACKWARD COMPATIBILITY */
2827dd7cddfSDavid du Colombier #define gdev_prn_default_get_space_params gx_default_get_space_params
2837dd7cddfSDavid du Colombier prn_dev_proc_start_render_thread(gx_default_start_render_thread); /* for async rendering only, see gdevprna.c */
2847dd7cddfSDavid du Colombier prn_dev_proc_open_render_device(gx_default_open_render_device);
2857dd7cddfSDavid du Colombier prn_dev_proc_close_render_device(gx_default_close_render_device);
2867dd7cddfSDavid du Colombier prn_dev_proc_buffer_page(gx_default_buffer_page); /* returns an error */
2877dd7cddfSDavid du Colombier 
2887dd7cddfSDavid du Colombier /* Macro for generating procedure table */
2897dd7cddfSDavid du Colombier #define prn_procs(p_open, p_output_page, p_close)\
2907dd7cddfSDavid du Colombier   prn_color_procs(p_open, p_output_page, p_close, gdev_prn_map_rgb_color, gdev_prn_map_color_rgb)
2917dd7cddfSDavid du Colombier #define prn_params_procs(p_open, p_output_page, p_close, p_get_params, p_put_params)\
2927dd7cddfSDavid du Colombier   prn_color_params_procs(p_open, p_output_page, p_close, gdev_prn_map_rgb_color, gdev_prn_map_color_rgb, p_get_params, p_put_params)
2937dd7cddfSDavid du Colombier #define prn_color_procs(p_open, p_output_page, p_close, p_map_rgb_color, p_map_color_rgb)\
2947dd7cddfSDavid du Colombier   prn_color_params_procs(p_open, p_output_page, p_close, p_map_rgb_color, p_map_color_rgb, gdev_prn_get_params, gdev_prn_put_params)
2957dd7cddfSDavid du Colombier /* See gdev_prn_open for explanation of the NULLs below. */
2967dd7cddfSDavid du Colombier #define prn_color_params_procs(p_open, p_output_page, p_close, p_map_rgb_color, p_map_color_rgb, p_get_params, p_put_params) {\
2977dd7cddfSDavid du Colombier 	p_open,\
2987dd7cddfSDavid du Colombier 	NULL,	/* get_initial_matrix */\
2997dd7cddfSDavid du Colombier 	NULL,	/* sync_output */\
3007dd7cddfSDavid du Colombier 	p_output_page,\
3017dd7cddfSDavid du Colombier 	p_close,\
3027dd7cddfSDavid du Colombier 	p_map_rgb_color,\
3037dd7cddfSDavid du Colombier 	p_map_color_rgb,\
3047dd7cddfSDavid du Colombier 	NULL,	/* fill_rectangle */\
3057dd7cddfSDavid du Colombier 	NULL,	/* tile_rectangle */\
3067dd7cddfSDavid du Colombier 	NULL,	/* copy_mono */\
3077dd7cddfSDavid du Colombier 	NULL,	/* copy_color */\
3087dd7cddfSDavid du Colombier 	NULL,	/* draw_line */\
3097dd7cddfSDavid du Colombier 	NULL,	/* get_bits */\
3107dd7cddfSDavid du Colombier 	p_get_params,\
3117dd7cddfSDavid du Colombier 	p_put_params,\
3127dd7cddfSDavid du Colombier 	NULL,	/* map_cmyk_color */\
3137dd7cddfSDavid du Colombier 	NULL,	/* get_xfont_procs */\
3147dd7cddfSDavid du Colombier 	NULL,	/* get_xfont_device */\
3157dd7cddfSDavid du Colombier 	NULL,	/* map_rgb_alpha_color */\
3167dd7cddfSDavid du Colombier 	gx_page_device_get_page_device,\
3177dd7cddfSDavid du Colombier 	NULL,	/* get_alpha_bits */\
3187dd7cddfSDavid du Colombier 	NULL,	/* copy_alpha */\
3197dd7cddfSDavid du Colombier 	NULL,	/* get_band */\
3207dd7cddfSDavid du Colombier 	NULL,	/* copy_rop */\
3217dd7cddfSDavid du Colombier 	NULL,	/* fill_path */\
3227dd7cddfSDavid du Colombier 	NULL,	/* stroke_path */\
3237dd7cddfSDavid du Colombier 	NULL,	/* fill_mask */\
3247dd7cddfSDavid du Colombier 	NULL,	/* fill_trapezoid */\
3257dd7cddfSDavid du Colombier 	NULL,	/* fill_parallelogram */\
3267dd7cddfSDavid du Colombier 	NULL,	/* fill_triangle */\
3277dd7cddfSDavid du Colombier 	NULL,	/* draw_thin_line */\
3287dd7cddfSDavid du Colombier 	NULL,	/* begin_image */\
3297dd7cddfSDavid du Colombier 	NULL,	/* image_data */\
3307dd7cddfSDavid du Colombier 	NULL,	/* end_image */\
3317dd7cddfSDavid du Colombier 	NULL,	/* strip_tile_rectangle */\
3327dd7cddfSDavid du Colombier 	NULL,	/* strip_copy_rop, */\
3337dd7cddfSDavid du Colombier 	NULL,	/* get_clipping_box */\
3347dd7cddfSDavid du Colombier 	NULL,	/* begin_typed_image */\
335*593dc095SDavid du Colombier 	NULL,	/* get_bits_rectangle */\
3367dd7cddfSDavid du Colombier 	NULL,	/* map_color_rgb_alpha */\
3377dd7cddfSDavid du Colombier 	NULL,	/* create_compositor */\
3387dd7cddfSDavid du Colombier 	NULL,	/* get_hardware_params */\
3393ff48bf5SDavid du Colombier 	NULL,	/* text_begin */\
3403ff48bf5SDavid du Colombier 	NULL	/* finish_copydevice */\
3417dd7cddfSDavid du Colombier }
3427dd7cddfSDavid du Colombier 
3437dd7cddfSDavid du Colombier /* The standard printer device procedures */
3447dd7cddfSDavid du Colombier /* (using gdev_prn_open/output_page/close). */
3457dd7cddfSDavid du Colombier extern const gx_device_procs prn_std_procs;
3467dd7cddfSDavid du Colombier 
3477dd7cddfSDavid du Colombier /*
3487dd7cddfSDavid du Colombier  * Define macros for generating the device structure,
3497dd7cddfSDavid du Colombier  * analogous to the std_device_body macros in gxdevice.h
3507dd7cddfSDavid du Colombier  * Note that the macros are broken up so as to be usable for devices that
3517dd7cddfSDavid du Colombier  * add further initialized state to the printer device.
3527dd7cddfSDavid du Colombier  *
3537dd7cddfSDavid du Colombier  * The 'margin' values provided here specify the unimageable region
3547dd7cddfSDavid du Colombier  * around the edges of the page (in inches), and the left and top margins
3557dd7cddfSDavid du Colombier  * also specify the displacement of the device (0,0) point from the
3567dd7cddfSDavid du Colombier  * upper left corner.  We should provide macros that allow specifying
3577dd7cddfSDavid du Colombier  * all 6 values independently, but we don't yet.
3583ff48bf5SDavid du Colombier  *
3593ff48bf5SDavid du Colombier  * Note that print_page and print_page_copies must not both be defaulted.
3607dd7cddfSDavid du Colombier  */
3613ff48bf5SDavid du Colombier #define prn_device_body_rest2_(print_page, print_page_copies)\
3627dd7cddfSDavid du Colombier 	 { 0 },		/* std_procs */\
3637dd7cddfSDavid du Colombier 	 { 0 },		/* skip */\
3647dd7cddfSDavid du Colombier 	 { print_page,\
3653ff48bf5SDavid du Colombier 	   print_page_copies,\
3667dd7cddfSDavid du Colombier 	   { gx_default_create_buf_device,\
3677dd7cddfSDavid du Colombier 	     gx_default_size_buf_device,\
3687dd7cddfSDavid du Colombier 	     gx_default_setup_buf_device,\
3697dd7cddfSDavid du Colombier 	     gx_default_destroy_buf_device\
3707dd7cddfSDavid du Colombier 	   },\
3717dd7cddfSDavid du Colombier 	   gdev_prn_default_get_space_params,\
3727dd7cddfSDavid du Colombier 	   gx_default_start_render_thread,\
3737dd7cddfSDavid du Colombier 	   gx_default_open_render_device,\
3747dd7cddfSDavid du Colombier 	   gx_default_close_render_device,\
3757dd7cddfSDavid du Colombier 	   gx_default_buffer_page\
3767dd7cddfSDavid du Colombier 	 },\
3777dd7cddfSDavid du Colombier 	 { PRN_MAX_BITMAP, PRN_BUFFER_SPACE,\
3787dd7cddfSDavid du Colombier 	     { BAND_PARAMS_INITIAL_VALUES },\
3797dd7cddfSDavid du Colombier 	   0/*false*/,	/* params_are_read_only */\
3807dd7cddfSDavid du Colombier 	   BandingAuto	/* banding_type */\
3817dd7cddfSDavid du Colombier 	 },\
3827dd7cddfSDavid du Colombier 	 { 0 },		/* fname */\
3837dd7cddfSDavid du Colombier 	0/*false*/,	/* OpenOutputFile */\
3847dd7cddfSDavid du Colombier 	0/*false*/,	/* ReopenPerPage */\
385*593dc095SDavid du Colombier 	0/*false*/,	/* page_uses_transparency */\
3867dd7cddfSDavid du Colombier 	0/*false*/, -1,	/* Duplex[_set] */\
3877dd7cddfSDavid du Colombier 	0/*false*/, 0, 0, 0, /* file_is_new ... buf */\
3887dd7cddfSDavid du Colombier 	0, 0, 0, 0, 0/*false*/, 0, 0, /* buffer_memory ... clist_dis'_mask */\
3897dd7cddfSDavid du Colombier 	{ 0 }	/* ... orig_procs */
3903ff48bf5SDavid du Colombier #define prn_device_body_rest_(print_page)\
3913ff48bf5SDavid du Colombier   prn_device_body_rest2_(print_page, gx_default_print_page_copies)
3923ff48bf5SDavid du Colombier #define prn_device_body_copies_rest_(print_page_copies)\
3933ff48bf5SDavid du Colombier   prn_device_body_rest2_(gx_print_page_single_copy, print_page_copies)
3947dd7cddfSDavid du Colombier 
3957dd7cddfSDavid du Colombier /* The Sun cc compiler won't allow \ within a macro argument list. */
3967dd7cddfSDavid du Colombier /* This accounts for the short parameter names here and below. */
3977dd7cddfSDavid du Colombier #define prn_device_margins_body(dtype, procs, dname, w10, h10, xdpi, ydpi, lo, to, lm, bm, rm, tm, ncomp, depth, mg, mc, dg, dc, print_page)\
3987dd7cddfSDavid du Colombier 	std_device_full_body_type(dtype, &procs, dname, &st_device_printer,\
399*593dc095SDavid du Colombier 	  (int)((float)(w10) * (xdpi) / 10 + 0.5),\
400*593dc095SDavid du Colombier 	  (int)((float)(h10) * (ydpi) / 10 + 0.5),\
4017dd7cddfSDavid du Colombier 	  xdpi, ydpi,\
4027dd7cddfSDavid du Colombier 	  ncomp, depth, mg, mc, dg, dc,\
403*593dc095SDavid du Colombier 	  (float)(-(lo) * (xdpi)), (float)(-(to) * (ydpi)),\
404*593dc095SDavid du Colombier 	  (float)((lm) * 72.0), (float)((bm) * 72.0),\
405*593dc095SDavid du Colombier 	  (float)((rm) * 72.0), (float)((tm) * 72.0)\
4067dd7cddfSDavid du Colombier 	),\
4077dd7cddfSDavid du Colombier 	prn_device_body_rest_(print_page)
4087dd7cddfSDavid du Colombier 
4097dd7cddfSDavid du Colombier #define prn_device_body(dtype, procs, dname, w10, h10, xdpi, ydpi, lm, bm, rm, tm, ncomp, depth, mg, mc, dg, dc, print_page)\
4107dd7cddfSDavid du Colombier   prn_device_margins_body(dtype, procs, dname, w10, h10, xdpi, ydpi,\
4117dd7cddfSDavid du Colombier     lm, tm, lm, bm, rm, tm, ncomp, depth, mg, mc, dg, dc, print_page)
4127dd7cddfSDavid du Colombier 
413*593dc095SDavid du Colombier #define prn_device_margins_body_extended(dtype, procs, dname, w10, h10, xdpi, ydpi, lo, to, lm, bm, rm, tm, mcomp, ncomp, pol, depth, gi, mg, mc, dg, dc, ef, cn, print_page)\
414*593dc095SDavid du Colombier 	std_device_full_body_type_extended(dtype, &procs, dname, &st_device_printer,\
4157dd7cddfSDavid du Colombier 	  (int)((long)(w10) * (xdpi) / 10),\
4167dd7cddfSDavid du Colombier 	  (int)((long)(h10) * (ydpi) / 10),\
417*593dc095SDavid du Colombier 	  xdpi, ydpi,\
418*593dc095SDavid du Colombier 	  mcomp, ncomp, pol, depth, gi, mg, mc, dg, dc, ef, cn,\
4197dd7cddfSDavid du Colombier 	  -(lo) * (xdpi), -(to) * (ydpi),\
4207dd7cddfSDavid du Colombier 	  (lm) * 72.0, (bm) * 72.0,\
4217dd7cddfSDavid du Colombier 	  (rm) * 72.0, (tm) * 72.0\
4227dd7cddfSDavid du Colombier 	),\
4237dd7cddfSDavid du Colombier 	prn_device_body_rest_(print_page)
4247dd7cddfSDavid du Colombier 
425*593dc095SDavid du Colombier #define prn_device_body_extended(dtype, procs, dname, w10, h10, xdpi, ydpi, lm, bm, rm, tm, mcomp, ncomp, pol, depth, gi, mg, mc, dg, dc, ef, cn, print_page)\
426*593dc095SDavid du Colombier   prn_device_margins_body_extended(dtype, procs, dname, w10, h10, xdpi, ydpi,\
427*593dc095SDavid du Colombier     lm, tm, lm, bm, rm, tm, mcomp, ncomp, pol, depth, gi, mg, mc, dg, dc, ef, cn, print_page)
428*593dc095SDavid du Colombier 
429*593dc095SDavid du Colombier #define prn_device_std_margins_body(dtype, procs, dname, w10, h10, xdpi, ydpi, lo, to, lm, bm, rm, tm, color_bits, print_page)\
430*593dc095SDavid du Colombier 	std_device_std_color_full_body_type(dtype, &procs, dname, &st_device_printer,\
431*593dc095SDavid du Colombier 	  (int)((float)(w10) * (xdpi) / 10 + 0.5),\
432*593dc095SDavid du Colombier 	  (int)((float)(h10) * (ydpi) / 10 + 0.5),\
433*593dc095SDavid du Colombier 	  xdpi, ydpi, color_bits,\
434*593dc095SDavid du Colombier 	  (float)(-(lo) * (xdpi)), (float)(-(to) * (ydpi)),\
435*593dc095SDavid du Colombier 	  (float)((lm) * 72.0), (float)((bm) * 72.0),\
436*593dc095SDavid du Colombier 	  (float)((rm) * 72.0), (float)((tm) * 72.0)\
437*593dc095SDavid du Colombier 	),\
438*593dc095SDavid du Colombier 	prn_device_body_rest_(print_page)
439*593dc095SDavid du Colombier 
4407dd7cddfSDavid du Colombier #define prn_device_std_body(dtype, procs, dname, w10, h10, xdpi, ydpi, lm, bm, rm, tm, color_bits, print_page)\
4417dd7cddfSDavid du Colombier   prn_device_std_margins_body(dtype, procs, dname, w10, h10, xdpi, ydpi,\
4427dd7cddfSDavid du Colombier     lm, tm, lm, bm, rm, tm, color_bits, print_page)
4437dd7cddfSDavid du Colombier 
4443ff48bf5SDavid du Colombier #define prn_device_std_margins_body_copies(dtype, procs, dname, w10, h10, xdpi, ydpi, lo, to, lm, bm, rm, tm, color_bits, print_page_copies)\
4453ff48bf5SDavid du Colombier 	std_device_std_color_full_body_type(dtype, &procs, dname, &st_device_printer,\
446*593dc095SDavid du Colombier 	  (int)((float)(w10) * (xdpi) / 10 + 0.5),\
447*593dc095SDavid du Colombier 	  (int)((float)(h10) * (ydpi) / 10 + 0.5),\
4483ff48bf5SDavid du Colombier 	  xdpi, ydpi, color_bits,\
449*593dc095SDavid du Colombier 	  (float)(-(lo) * (xdpi)), (float)(-(to) * (ydpi)),\
450*593dc095SDavid du Colombier 	  (float)((lm) * 72.0), (float)((bm) * 72.0),\
451*593dc095SDavid du Colombier 	  (float)((rm) * 72.0), (float)((tm) * 72.0)\
4523ff48bf5SDavid du Colombier 	),\
4533ff48bf5SDavid du Colombier 	prn_device_body_copies_rest_(print_page_copies)
4543ff48bf5SDavid du Colombier 
4553ff48bf5SDavid du Colombier #define prn_device_std_body_copies(dtype, procs, dname, w10, h10, xdpi, ydpi, lm, bm, rm, tm, color_bits, print_page_copies)\
4563ff48bf5SDavid du Colombier   prn_device_std_margins_body_copies(dtype, procs, dname, w10, h10, xdpi, ydpi,\
4573ff48bf5SDavid du Colombier     lm, tm, lm, bm, rm, tm, color_bits, print_page_copies)
4583ff48bf5SDavid du Colombier 
4593ff48bf5SDavid du Colombier      /* Note that the following macros add { } around the data. */
4603ff48bf5SDavid du Colombier 
4617dd7cddfSDavid du Colombier #define prn_device_margins(procs, dname, w10, h10, xdpi, ydpi, lo, to, lm, bm, rm, tm, color_bits, print_page)\
4627dd7cddfSDavid du Colombier { prn_device_std_margins_body(gx_device_printer, procs, dname,\
4637dd7cddfSDavid du Colombier     w10, h10, xdpi, ydpi, lo, to, lm, bm, rm, tm, color_bits, print_page)\
4647dd7cddfSDavid du Colombier }
4657dd7cddfSDavid du Colombier 
4667dd7cddfSDavid du Colombier #define prn_device(procs, dname, w10, h10, xdpi, ydpi, lm, bm, rm, tm, color_bits, print_page)\
4677dd7cddfSDavid du Colombier   prn_device_margins(procs, dname, w10, h10, xdpi, ydpi,\
4683ff48bf5SDavid du Colombier     lm, tm, lm, bm, rm, tm, color_bits, print_page)
4693ff48bf5SDavid du Colombier 
4703ff48bf5SDavid du Colombier #define prn_device_margins_copies(procs, dname, w10, h10, xdpi, ydpi, lo, to, lm, bm, rm, tm, color_bits, print_page_copies)\
4713ff48bf5SDavid du Colombier { prn_device_std_margins_body_copies(gx_device_printer, procs, dname,\
4723ff48bf5SDavid du Colombier     w10, h10, xdpi, ydpi, lo, to, lm, bm, rm, tm, color_bits, print_page_copies)\
4733ff48bf5SDavid du Colombier }
4743ff48bf5SDavid du Colombier 
4753ff48bf5SDavid du Colombier #define prn_device_copies(procs, dname, w10, h10, xdpi, ydpi, lm, bm, rm, tm, color_bits, print_page_copies)\
4763ff48bf5SDavid du Colombier   prn_device_margins_copies(procs, dname, w10, h10, xdpi, ydpi,\
4773ff48bf5SDavid du Colombier     lm, tm, lm, bm, rm, tm, color_bits, print_page_copies)
4787dd7cddfSDavid du Colombier 
4797dd7cddfSDavid du Colombier /* ------ Utilities ------ */
4807dd7cddfSDavid du Colombier /* These are defined in gdevprn.c. */
4817dd7cddfSDavid du Colombier 
4827dd7cddfSDavid du Colombier /*
4837dd7cddfSDavid du Colombier  * Open the printer's output file if necessary.
4847dd7cddfSDavid du Colombier  */
4857dd7cddfSDavid du Colombier /* VMS limits procedure names to 31 characters. */
486*593dc095SDavid du Colombier int gdev_prn_open_printer_seekable(gx_device *dev, bool binary_mode,
487*593dc095SDavid du Colombier 				   bool seekable);
4887dd7cddfSDavid du Colombier /* BACKWARD COMPATIBILITY */
4897dd7cddfSDavid du Colombier #define gdev_prn_open_printer_positionable gdev_prn_open_printer_seekable
4907dd7cddfSDavid du Colombier /* open_printer defaults positionable = false */
491*593dc095SDavid du Colombier int gdev_prn_open_printer(gx_device * dev, bool binary_mode);
4927dd7cddfSDavid du Colombier /*
4937dd7cddfSDavid du Colombier  * Test whether the printer's output file was just opened, i.e., whether
4943ff48bf5SDavid du Colombier  * this is the first page being written to this file.  This is only valid
4953ff48bf5SDavid du Colombier  * at the entry to a driver's print_page procedure.
4967dd7cddfSDavid du Colombier  */
497*593dc095SDavid du Colombier bool gdev_prn_file_is_new(const gx_device_printer *pdev);
4987dd7cddfSDavid du Colombier 
4997dd7cddfSDavid du Colombier /*
5007dd7cddfSDavid du Colombier  * Determine the number of bytes required for one scan line of output to
5017dd7cddfSDavid du Colombier  * a printer device, without any padding.
5027dd7cddfSDavid du Colombier  */
5037dd7cddfSDavid du Colombier #define gdev_prn_raster(pdev) gx_device_raster((gx_device *)(pdev), 0)
5047dd7cddfSDavid du Colombier 
5057dd7cddfSDavid du Colombier /*
5067dd7cddfSDavid du Colombier  * Determine (conservatively) what colors are used in a given range of scan
5077dd7cddfSDavid du Colombier  * lines, and return the actual range of scan lines to which the result
5087dd7cddfSDavid du Colombier  * applies.  (Currently, the result will always actually apply to one or
5097dd7cddfSDavid du Colombier  * more full bands.)  In the non-banded case, this information is currently
5107dd7cddfSDavid du Colombier  * not available, so we return all-1s (i.e., any color may appear) as the
5117dd7cddfSDavid du Colombier  * 'or', and the entire page as the range; we may improve this someday.
5127dd7cddfSDavid du Colombier  *
5137dd7cddfSDavid du Colombier  * The return value is like get_band: the first Y value of the actual range
5147dd7cddfSDavid du Colombier  * is stored in *range_start, and the height of the range is returned.
5157dd7cddfSDavid du Colombier  * If the parameters are invalid, the procedure returns -1.
5167dd7cddfSDavid du Colombier  */
517*593dc095SDavid du Colombier int gdev_prn_colors_used(gx_device *dev, int y, int height,
5187dd7cddfSDavid du Colombier 			 gx_colors_used_t *colors_used,
519*593dc095SDavid du Colombier 			 int *range_start);
5207dd7cddfSDavid du Colombier /*
5217dd7cddfSDavid du Colombier  * Determine the colors used in a saved page.  We still need the device
5227dd7cddfSDavid du Colombier  * in order to know the total page height.
5237dd7cddfSDavid du Colombier  */
524*593dc095SDavid du Colombier int gx_page_info_colors_used(const gx_device *dev,
5257dd7cddfSDavid du Colombier 			     const gx_band_page_info_t *page_info,
5267dd7cddfSDavid du Colombier 			     int y, int height,
5277dd7cddfSDavid du Colombier 			     gx_colors_used_t *colors_used,
528*593dc095SDavid du Colombier 			     int *range_start);
5297dd7cddfSDavid du Colombier 
5307dd7cddfSDavid du Colombier /*
5317dd7cddfSDavid du Colombier  * Render a subrectangle of the page into a target device provided by the
5327dd7cddfSDavid du Colombier  * caller, optionally clearing the device before rendering.  The rectangle
5337dd7cddfSDavid du Colombier  * need not coincide exactly with band boundaries, but it will be most
5347dd7cddfSDavid du Colombier  * efficient if they do, since it is necessary to render every band that
5357dd7cddfSDavid du Colombier  * even partly falls within the rectangle.  This is the lowest-level
5367dd7cddfSDavid du Colombier  * rendering procedure: the other procedures for reading rasterized lines,
5377dd7cddfSDavid du Colombier  * defined below, ultimately call this one.
5387dd7cddfSDavid du Colombier  *
5397dd7cddfSDavid du Colombier  * render_plane is used only for internal cache bookkeeping: it doesn't
5407dd7cddfSDavid du Colombier  * affect what is passed to the buffer device.  It is the client's
5417dd7cddfSDavid du Colombier  * responsibility to set up a plane extraction device, if required, to
5427dd7cddfSDavid du Colombier  * select an individual plane for rendering.
5437dd7cddfSDavid du Colombier  *
5447dd7cddfSDavid du Colombier  * Note that it may be necessary to render more than one plane even if the
5457dd7cddfSDavid du Colombier  * caller only requests a single plane.  Currently this only occurs for
5467dd7cddfSDavid du Colombier  * non-trivial RasterOps on CMYK devices.  If this is the case, it is the
5477dd7cddfSDavid du Colombier  * client's responsibility to provide a target device that accumulates full
5487dd7cddfSDavid du Colombier  * pixels rather than a single plane: if the plane extraction device is
5497dd7cddfSDavid du Colombier  * asked to execute an operation that requires full pixels, it will return
5507dd7cddfSDavid du Colombier  * an error.
5517dd7cddfSDavid du Colombier  */
552*593dc095SDavid du Colombier int gdev_prn_render_rectangle(gx_device_printer *pdev,
5537dd7cddfSDavid du Colombier 			      const gs_int_rect *prect,
5547dd7cddfSDavid du Colombier 			      gx_device *target,
5557dd7cddfSDavid du Colombier 			      const gx_render_plane_t *render_plane,
556*593dc095SDavid du Colombier 			      bool clear);
5577dd7cddfSDavid du Colombier 
5587dd7cddfSDavid du Colombier /*
5597dd7cddfSDavid du Colombier  * Read one or more rasterized scan lines for printing.
5607dd7cddfSDavid du Colombier  * The procedure either copies the scan lines into the buffer and
5617dd7cddfSDavid du Colombier  * sets *actual_buffer = buffer and *actual_bytes_per_line = bytes_per_line,
5627dd7cddfSDavid du Colombier  * or sets *actual_buffer and *actual_bytes_per_line to reference
5637dd7cddfSDavid du Colombier  * already-rasterized scan lines.
5647dd7cddfSDavid du Colombier  *
5657dd7cddfSDavid du Colombier  * For non-banded devices, copying is never necessary.  For banded devices,
5667dd7cddfSDavid du Colombier  * if the client's buffer is at least as large as the single preallocated
5677dd7cddfSDavid du Colombier  * one (if any), the band will be rasterized directly into the client's
5687dd7cddfSDavid du Colombier  * buffer, again avoiding copying.  Alternatively, if there is a
5697dd7cddfSDavid du Colombier  * preallocated buffer and the call asks for no more data than will fit
5707dd7cddfSDavid du Colombier  * in that buffer, buffer may be NULL: any necessary rasterizing will
5717dd7cddfSDavid du Colombier  * occur in the preallocated buffer, and a pointer into the buffer will be
5727dd7cddfSDavid du Colombier  * returned.
5737dd7cddfSDavid du Colombier  */
574*593dc095SDavid du Colombier int gdev_prn_get_lines(gx_device_printer *pdev, int y, int height,
5757dd7cddfSDavid du Colombier 		       byte *buffer, uint bytes_per_line,
5767dd7cddfSDavid du Colombier 		       byte **actual_buffer, uint *actual_bytes_per_line,
577*593dc095SDavid du Colombier 		       const gx_render_plane_t *render_plane);
5787dd7cddfSDavid du Colombier 
5797dd7cddfSDavid du Colombier /*
5807dd7cddfSDavid du Colombier  * Read a rasterized scan line for sending to the printer.
5817dd7cddfSDavid du Colombier  * This is essentially a simplified form of gdev_prn_get_lines,
5827dd7cddfSDavid du Colombier  * except that it also calls gdev_prn_clear_trailing_bits.
5837dd7cddfSDavid du Colombier  */
584*593dc095SDavid du Colombier int gdev_prn_get_bits(gx_device_printer *pdev, int y, byte *buffer,
585*593dc095SDavid du Colombier 		      byte **actual_buffer);
5867dd7cddfSDavid du Colombier 
5877dd7cddfSDavid du Colombier /*
5887dd7cddfSDavid du Colombier  * Copy scan lines to send to the printer.  This is now DEPRECATED,
5897dd7cddfSDavid du Colombier  * because it copies the data even if the data are already available in
5907dd7cddfSDavid du Colombier  * the right form in the rasterizer buffer.  Use gdev_prn_get_bits
5917dd7cddfSDavid du Colombier  * instead.  For documentation, see the implementation in gdevprn.c.
5927dd7cddfSDavid du Colombier  */
593*593dc095SDavid du Colombier int gdev_prn_copy_scan_lines(gx_device_printer *, int, byte *, uint);
5947dd7cddfSDavid du Colombier 
5957dd7cddfSDavid du Colombier /*
5967dd7cddfSDavid du Colombier  * Clear any trailing bits in the last byte of one or more scan lines
5977dd7cddfSDavid du Colombier  * returned from the calls for reading out rasterized data.  Note that
5987dd7cddfSDavid du Colombier  * the device is only used to get the width and depth, and need not be
5997dd7cddfSDavid du Colombier  * a printer device.
6007dd7cddfSDavid du Colombier  */
601*593dc095SDavid du Colombier void gdev_prn_clear_trailing_bits(byte *data, uint raster, int height,
602*593dc095SDavid du Colombier 				  const gx_device *dev);
6037dd7cddfSDavid du Colombier 
6047dd7cddfSDavid du Colombier /*
6057dd7cddfSDavid du Colombier  * Close the printer's output file.
6067dd7cddfSDavid du Colombier  */
607*593dc095SDavid du Colombier int gdev_prn_close_printer(gx_device *);
6087dd7cddfSDavid du Colombier 
6093ff48bf5SDavid du Colombier /* Print a single copy of a page by calling print_page_copies. */
6103ff48bf5SDavid du Colombier prn_dev_proc_print_page(gx_print_page_single_copy);
6113ff48bf5SDavid du Colombier 
6127dd7cddfSDavid du Colombier /*
6137dd7cddfSDavid du Colombier  * Define a default print_page_copies procedure just calls print_page
6147dd7cddfSDavid du Colombier  * the given number of times.
6157dd7cddfSDavid du Colombier  */
6167dd7cddfSDavid du Colombier prn_dev_proc_print_page_copies(gx_default_print_page_copies);
6177dd7cddfSDavid du Colombier 
6187dd7cddfSDavid du Colombier /*
6197dd7cddfSDavid du Colombier  * Determine the number of scan lines that should actually be passed
6207dd7cddfSDavid du Colombier  * to the device.
6217dd7cddfSDavid du Colombier  */
622*593dc095SDavid du Colombier int gdev_prn_print_scan_lines(gx_device *);
6237dd7cddfSDavid du Colombier 
6247dd7cddfSDavid du Colombier /* Allocate / reallocate / free printer memory. */
625*593dc095SDavid du Colombier int gdev_prn_allocate_memory(gx_device *pdev,
6267dd7cddfSDavid du Colombier 			     gdev_prn_space_params *space,
627*593dc095SDavid du Colombier 			     int new_width, int new_height);
628*593dc095SDavid du Colombier int gdev_prn_reallocate_memory(gx_device *pdev,
6297dd7cddfSDavid du Colombier 			       gdev_prn_space_params *space,
630*593dc095SDavid du Colombier 			       int new_width, int new_height);
631*593dc095SDavid du Colombier int gdev_prn_free_memory(gx_device *pdev);
6327dd7cddfSDavid du Colombier 
6337dd7cddfSDavid du Colombier /*
6347dd7cddfSDavid du Colombier  * Create the buffer device for a printer device.  Clients should always
6357dd7cddfSDavid du Colombier  * call this, and never call the device procedure directly.  The actual
6367dd7cddfSDavid du Colombier  * create_buf_device procedure is passed as an argument because the banding
6377dd7cddfSDavid du Colombier  * code needs this: normally it is dev_proc(some_dev, create_buf_device).
6387dd7cddfSDavid du Colombier  */
6397dd7cddfSDavid du Colombier typedef dev_proc_create_buf_device((*create_buf_device_proc_t));
640*593dc095SDavid du Colombier int gdev_create_buf_device(create_buf_device_proc_t cbd_proc,
6417dd7cddfSDavid du Colombier 			   gx_device **pbdev, gx_device *target,
6427dd7cddfSDavid du Colombier 			   const gx_render_plane_t *render_plane,
643*593dc095SDavid du Colombier 			   gs_memory_t *mem, bool for_band);
6447dd7cddfSDavid du Colombier 
6457dd7cddfSDavid du Colombier /* BACKWARD COMPATIBILITY */
6467dd7cddfSDavid du Colombier #define dev_print_scan_lines(dev)\
6477dd7cddfSDavid du Colombier   gdev_prn_print_scan_lines((gx_device *)(dev))
6487dd7cddfSDavid du Colombier #define gdev_mem_bytes_per_scan_line(dev)\
6497dd7cddfSDavid du Colombier   gdev_prn_raster((gx_device_printer *)(dev))
6507dd7cddfSDavid du Colombier #define gdev_prn_transpose_8x8(inp,ils,outp,ols)\
6517dd7cddfSDavid du Colombier   memflip8x8(inp,ils,outp,ols)
6527dd7cddfSDavid du Colombier 
6537dd7cddfSDavid du Colombier /* ------ Printer device types ------ */
6547dd7cddfSDavid du Colombier /**************** THE FOLLOWING CODE IS NOT USED YET. ****************/
6557dd7cddfSDavid du Colombier 
6567dd7cddfSDavid du Colombier #if 0				/**************** VMS linker gets upset *************** */
6577dd7cddfSDavid du Colombier #endif
658*593dc095SDavid du Colombier int gdev_prn_initialize(gx_device *, const char *, dev_proc_print_page((*)));
659*593dc095SDavid du Colombier void gdev_prn_init_color(gx_device *, int, dev_proc_map_rgb_color((*)), dev_proc_map_color_rgb((*)));
6607dd7cddfSDavid du Colombier 
6617dd7cddfSDavid du Colombier #define prn_device_type(dtname, initproc, pageproc)\
6627dd7cddfSDavid du Colombier private dev_proc_print_page(pageproc);\
6637dd7cddfSDavid du Colombier device_type(dtname, st_prn_device, initproc)
6647dd7cddfSDavid du Colombier 
6657dd7cddfSDavid du Colombier #define prn_device_type_mono(dtname, dname, initproc, pageproc)\
6667dd7cddfSDavid du Colombier private dev_proc_print_page(pageproc);\
6677dd7cddfSDavid du Colombier private int \
6687dd7cddfSDavid du Colombier initproc(gx_device *dev)\
6697dd7cddfSDavid du Colombier {	return gdev_prn_initialize(dev, dname, pageproc);\
6707dd7cddfSDavid du Colombier }\
6717dd7cddfSDavid du Colombier device_type(dtname, st_prn_device, initproc)
6727dd7cddfSDavid du Colombier 
6737dd7cddfSDavid du Colombier #define prn_device_type_color(dtname, dname, depth, initproc, pageproc, rcproc, crproc)\
6747dd7cddfSDavid du Colombier private dev_proc_print_page(pageproc);\
6757dd7cddfSDavid du Colombier private int \
6767dd7cddfSDavid du Colombier initproc(gx_device *dev)\
6777dd7cddfSDavid du Colombier {	int code = gdev_prn_initialize(dev, dname, pageproc);\
6787dd7cddfSDavid du Colombier 	gdev_prn_init_color(dev, depth, rcproc, crproc);\
6797dd7cddfSDavid du Colombier 	return code;\
6807dd7cddfSDavid du Colombier }\
6817dd7cddfSDavid du Colombier device_type(dtname, st_prn_device, initproc)
6827dd7cddfSDavid du Colombier 
6837dd7cddfSDavid du Colombier #endif /* gdevprn_INCLUDED */
684