1
/* Copyright (C) 2001-2012 Artifex Software, Inc.
4
This software is provided AS-IS with no warranty, either express or
7
This software is distributed under license and may not be copied,
8
modified or distributed except as expressly authorized under the terms
9
of the license contained in the file LICENSE in this distribution.
11
Refer to licensing information at http://www.artifex.com or contact
12
Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael,
13
CA 94903, U.S.A., +1(415)492-9861, for further information.
16
/* A "2-up" PCX device for testing page objects. */
21
extern gx_device_printer gs_pcx256_device;
23
/* ------ The device descriptors ------ */
26
* Default X and Y resolution.
32
* Define the size of the rendering buffer.
34
#define RENDER_BUFFER_SPACE 500000
36
/* This device only supports SVGA 8-bit color. */
38
static dev_proc_open_device(pcx2up_open);
39
static dev_proc_print_page(pcx2up_print_page);
41
typedef struct gx_device_2up_s {
45
gx_saved_page odd_page;
48
static const gx_device_procs pcx2up_procs =
49
prn_color_procs(pcx2up_open, gdev_prn_output_page, gdev_prn_close,
50
pc_8bit_map_rgb_color, pc_8bit_map_color_rgb);
51
gx_device_2up gs_pcx2up_device =
52
{prn_device_body(gx_device_2up, pcx2up_procs, "pcx2up",
53
DEFAULT_WIDTH_10THS, DEFAULT_HEIGHT_10THS,
55
0, 0, 0, 0, /* margins */
56
3, 8, 5, 5, 6, 6, pcx2up_print_page)
59
/* Open the device. We reimplement this to force banding with */
60
/* delayed rasterizing. */
62
pcx2up_open(gx_device * dev)
64
gx_device_printer *pdev = (gx_device_printer *) dev;
66
gdev_prn_space_params save_params;
68
save_params = pdev->space_params;
69
pdev->space_params.MaxBitmap = 0; /* force banding */
70
pdev->space_params.band.BandWidth =
71
dev->width * 2 + (int)(dev->HWResolution[0] * 2.0);
72
pdev->space_params.band.BandBufferSpace = RENDER_BUFFER_SPACE;
73
code = gdev_prn_open(dev);
74
pdev->space_params = save_params;
75
((gx_device_2up *) dev)->have_odd_page = false;
81
pcx2up_print_page(gx_device_printer * pdev, FILE * file)
83
gx_device_2up *pdev2 = (gx_device_2up *) pdev;
84
const gx_device_printer *prdev_template =
85
(const gx_device_printer *)&gs_pcx2up_device;
87
if (!pdev2->have_odd_page) { /* This is the odd page, just save it. */
88
pdev2->have_odd_page = true;
89
return gdev_prn_save_page(pdev, &pdev2->odd_page, 1);
90
} else { /* This is the even page, do 2-up output. */
91
gx_saved_page even_page;
92
gx_placed_page pages[2];
93
int x_offset = (int)(pdev->HWResolution[0] * 0.5);
94
int code = gdev_prn_save_page(pdev, &even_page, 1);
95
int prdev_size = prdev_template->params_size;
96
gx_device_printer *prdev;
98
#define rdev ((gx_device *)prdev)
102
/* Create the placed page list. */
103
pages[0].page = &pdev2->odd_page;
104
pages[0].offset.x = x_offset;
105
pages[0].offset.y = 0 /*y_offset */ ;
106
pages[1].page = &even_page;
107
pages[1].offset.x = pdev->width + x_offset * 3;
108
pages[1].offset.y = 0 /*y_offset */ ;
109
/* Create and open a device for rendering. */
110
prdev = (gx_device_printer *)
111
gs_alloc_bytes(pdev->memory, prdev_size,
112
"pcx2up_print_page(device)");
114
return_error(gs_error_VMerror);
115
memcpy(prdev, prdev_template, prdev_size);
116
check_device_separable((gx_device *)rdev);
117
gx_device_fill_in_procs(rdev);
118
set_dev_proc(prdev, open_device,
119
dev_proc(&gs_pcx256_device, open_device));
120
prdev->printer_procs.print_page =
121
gs_pcx256_device.printer_procs.print_page;
122
prdev->space_params.band =
123
pages[0].page->info.band_params; /* either one will do */
124
prdev->space_params.MaxBitmap = 0;
125
prdev->space_params.BufferSpace =
126
prdev->space_params.band.BandBufferSpace;
127
prdev->width = prdev->space_params.band.BandWidth;
128
prdev->OpenOutputFile = false;
129
code = (*dev_proc(rdev, open_device)) (rdev);
132
rdev->is_open = true;
133
prdev->file = pdev->file;
134
/* Render the pages. */
135
code = gdev_prn_render_pages(prdev, pages, 2);
138
prdev->file = 0; /* don't close it */
139
gs_closedevice(rdev);
140
pdev2->have_odd_page = false;