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