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