1 /* Copyright (C) 2005-2006 Artifex Software, Inc.
2    All Rights Reserved.
3 
4    This software is provided AS-IS with no warranty, either express or
5    implied.
6 
7    This software is distributed under license and may not be copied, modified
8    or distributed except as expressly authorized under the terms of that
9    license.  Refer to licensing information at http://www.artifex.com/
10    or contact Artifex Software, Inc.,  7 Mt. Lassen Drive - Suite A-134,
11    San Rafael, CA  94903, U.S.A., +1(415)492-9861, for further information.
12 */
13 
14 /* $Id: wtsimdi.c 8022 2007-06-05 22:23:38Z giles $ */
15 
16 /*
17  * Create an imdi memory device for page or band buffering,
18  * possibly preceded by a plane extraction device.
19  */
20 int
wtsimdi_create_buf_device(gx_device ** pbdev,gx_device * target,const gx_render_plane_t * render_plane,gs_memory_t * mem,bool for_band)21 wtsimdi_create_buf_device(gx_device **pbdev, gx_device *target,
22     const gx_render_plane_t *render_plane, gs_memory_t *mem, bool for_band)
23 {
24     int plane_index = (render_plane ? render_plane->index : -1);
25     int depth;
26     const gx_device_memory *mdproto;
27     gx_device_memory *mdev;
28 
29     if (plane_index >= 0)
30 	depth = render_plane->depth;
31     else
32 	depth = target->color_info.depth;
33     mdproto = gdev_mem_device_for_bits(depth);
34     if (mdproto == 0)
35 	return_error(gs_error_rangecheck);
36     if (mem) {
37 	mdev = gs_alloc_struct(mem, gx_device_memory, &st_device_memory,
38 			       "create_buf_device");
39 	if (mdev == 0)
40 	    return_error(gs_error_VMerror);
41     } else {
42 	mdev = (gx_device_memory *)*pbdev;
43     }
44     if (target == (gx_device *)mdev) {
45 	/* The following is a special hack for setting up printer devices. */
46 	assign_dev_procs(mdev, mdproto);
47         check_device_separable((gx_device *)mdev);
48 	gx_device_fill_in_procs((gx_device *)mdev);
49     } else
50 	gs_make_mem_device(mdev, mdproto, mem, (for_band ? 1 : 0),
51 			   (target == (gx_device *)mdev ? NULL : target));
52     mdev->width = target->width;
53     /*
54      * The matrix in the memory device is irrelevant,
55      * because all we do with the device is call the device-level
56      * output procedures, but we may as well set it to
57      * something halfway reasonable.
58      */
59     gs_deviceinitialmatrix(target, &mdev->initial_matrix);
60     /****** QUESTIONABLE, BUT BETTER THAN OMITTING ******/
61     mdev->color_info = target->color_info;
62     *pbdev = (gx_device *)mdev;
63     return 0;
64 }
65 
66 #define wtsimdi_prn_procs(print_page)\
67 	 { print_page,\
68 	   gx_default_print_page_copies,\
69 	   { wtsimdi_create_buf_device,\
70 	     gx_default_size_buf_device,\
71 	     gx_default_setup_buf_device,\
72 	     gx_default_destroy_buf_device\
73 	   },\
74 	   gdev_prn_default_get_space_params,\
75 	   gx_default_start_render_thread,\
76 	   gx_default_open_render_device,\
77 	   gx_default_close_render_device,\
78 	   gx_default_buffer_page\
79 	 }
80 
81