1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * Raster benchmark program for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright 2007-2016 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright 1997-2006 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker *
7*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
8*5e7646d2SAndroid Build Coastguard Worker */
9*5e7646d2SAndroid Build Coastguard Worker
10*5e7646d2SAndroid Build Coastguard Worker /*
11*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
12*5e7646d2SAndroid Build Coastguard Worker */
13*5e7646d2SAndroid Build Coastguard Worker
14*5e7646d2SAndroid Build Coastguard Worker #include <config.h>
15*5e7646d2SAndroid Build Coastguard Worker #include <cups/raster.h>
16*5e7646d2SAndroid Build Coastguard Worker #include <stdio.h>
17*5e7646d2SAndroid Build Coastguard Worker #include <stdlib.h>
18*5e7646d2SAndroid Build Coastguard Worker #include <sys/time.h>
19*5e7646d2SAndroid Build Coastguard Worker #include <signal.h>
20*5e7646d2SAndroid Build Coastguard Worker #include <unistd.h>
21*5e7646d2SAndroid Build Coastguard Worker #include <sys/wait.h>
22*5e7646d2SAndroid Build Coastguard Worker
23*5e7646d2SAndroid Build Coastguard Worker
24*5e7646d2SAndroid Build Coastguard Worker /*
25*5e7646d2SAndroid Build Coastguard Worker * Constants...
26*5e7646d2SAndroid Build Coastguard Worker */
27*5e7646d2SAndroid Build Coastguard Worker
28*5e7646d2SAndroid Build Coastguard Worker #define TEST_WIDTH 1024
29*5e7646d2SAndroid Build Coastguard Worker #define TEST_HEIGHT 1024
30*5e7646d2SAndroid Build Coastguard Worker #define TEST_PAGES 16
31*5e7646d2SAndroid Build Coastguard Worker #define TEST_PASSES 20
32*5e7646d2SAndroid Build Coastguard Worker
33*5e7646d2SAndroid Build Coastguard Worker
34*5e7646d2SAndroid Build Coastguard Worker /*
35*5e7646d2SAndroid Build Coastguard Worker * Local functions...
36*5e7646d2SAndroid Build Coastguard Worker */
37*5e7646d2SAndroid Build Coastguard Worker
38*5e7646d2SAndroid Build Coastguard Worker static double compute_median(double *secs);
39*5e7646d2SAndroid Build Coastguard Worker static double get_time(void);
40*5e7646d2SAndroid Build Coastguard Worker static void read_test(int fd);
41*5e7646d2SAndroid Build Coastguard Worker static int run_read_test(void);
42*5e7646d2SAndroid Build Coastguard Worker static void write_test(int fd, cups_mode_t mode);
43*5e7646d2SAndroid Build Coastguard Worker
44*5e7646d2SAndroid Build Coastguard Worker
45*5e7646d2SAndroid Build Coastguard Worker /*
46*5e7646d2SAndroid Build Coastguard Worker * 'main()' - Benchmark the raster read/write functions.
47*5e7646d2SAndroid Build Coastguard Worker */
48*5e7646d2SAndroid Build Coastguard Worker
49*5e7646d2SAndroid Build Coastguard Worker int /* O - Exit status */
main(int argc,char * argv[])50*5e7646d2SAndroid Build Coastguard Worker main(int argc, /* I - Number of command-line args */
51*5e7646d2SAndroid Build Coastguard Worker char *argv[]) /* I - Command-line arguments */
52*5e7646d2SAndroid Build Coastguard Worker {
53*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
54*5e7646d2SAndroid Build Coastguard Worker int ras_fd, /* File descriptor for read process */
55*5e7646d2SAndroid Build Coastguard Worker status; /* Exit status of read process */
56*5e7646d2SAndroid Build Coastguard Worker double start_secs, /* Start time */
57*5e7646d2SAndroid Build Coastguard Worker write_secs, /* Write time */
58*5e7646d2SAndroid Build Coastguard Worker read_secs, /* Read time */
59*5e7646d2SAndroid Build Coastguard Worker pass_secs[TEST_PASSES]; /* Total test times */
60*5e7646d2SAndroid Build Coastguard Worker cups_mode_t mode; /* Write mode */
61*5e7646d2SAndroid Build Coastguard Worker
62*5e7646d2SAndroid Build Coastguard Worker
63*5e7646d2SAndroid Build Coastguard Worker /*
64*5e7646d2SAndroid Build Coastguard Worker * See if we have anything on the command-line...
65*5e7646d2SAndroid Build Coastguard Worker */
66*5e7646d2SAndroid Build Coastguard Worker
67*5e7646d2SAndroid Build Coastguard Worker if (argc > 2 || (argc == 2 && strcmp(argv[1], "-z")))
68*5e7646d2SAndroid Build Coastguard Worker {
69*5e7646d2SAndroid Build Coastguard Worker puts("Usage: rasterbench [-z]");
70*5e7646d2SAndroid Build Coastguard Worker return (1);
71*5e7646d2SAndroid Build Coastguard Worker }
72*5e7646d2SAndroid Build Coastguard Worker
73*5e7646d2SAndroid Build Coastguard Worker mode = argc > 1 ? CUPS_RASTER_WRITE_COMPRESSED : CUPS_RASTER_WRITE;
74*5e7646d2SAndroid Build Coastguard Worker
75*5e7646d2SAndroid Build Coastguard Worker /*
76*5e7646d2SAndroid Build Coastguard Worker * Ignore SIGPIPE...
77*5e7646d2SAndroid Build Coastguard Worker */
78*5e7646d2SAndroid Build Coastguard Worker
79*5e7646d2SAndroid Build Coastguard Worker signal(SIGPIPE, SIG_IGN);
80*5e7646d2SAndroid Build Coastguard Worker
81*5e7646d2SAndroid Build Coastguard Worker /*
82*5e7646d2SAndroid Build Coastguard Worker * Run the tests several times to get a good average...
83*5e7646d2SAndroid Build Coastguard Worker */
84*5e7646d2SAndroid Build Coastguard Worker
85*5e7646d2SAndroid Build Coastguard Worker printf("Test read/write speed of %d pages, %dx%d pixels...\n\n",
86*5e7646d2SAndroid Build Coastguard Worker TEST_PAGES, TEST_WIDTH, TEST_HEIGHT);
87*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < TEST_PASSES; i ++)
88*5e7646d2SAndroid Build Coastguard Worker {
89*5e7646d2SAndroid Build Coastguard Worker printf("PASS %2d: ", i + 1);
90*5e7646d2SAndroid Build Coastguard Worker fflush(stdout);
91*5e7646d2SAndroid Build Coastguard Worker
92*5e7646d2SAndroid Build Coastguard Worker ras_fd = run_read_test();
93*5e7646d2SAndroid Build Coastguard Worker start_secs = get_time();
94*5e7646d2SAndroid Build Coastguard Worker
95*5e7646d2SAndroid Build Coastguard Worker write_test(ras_fd, mode);
96*5e7646d2SAndroid Build Coastguard Worker
97*5e7646d2SAndroid Build Coastguard Worker write_secs = get_time();
98*5e7646d2SAndroid Build Coastguard Worker printf(" %.3f write,", write_secs - start_secs);
99*5e7646d2SAndroid Build Coastguard Worker fflush(stdout);
100*5e7646d2SAndroid Build Coastguard Worker
101*5e7646d2SAndroid Build Coastguard Worker close(ras_fd);
102*5e7646d2SAndroid Build Coastguard Worker wait(&status);
103*5e7646d2SAndroid Build Coastguard Worker
104*5e7646d2SAndroid Build Coastguard Worker read_secs = get_time();
105*5e7646d2SAndroid Build Coastguard Worker pass_secs[i] = read_secs - start_secs;
106*5e7646d2SAndroid Build Coastguard Worker printf(" %.3f read, %.3f total\n", read_secs - write_secs, pass_secs[i]);
107*5e7646d2SAndroid Build Coastguard Worker }
108*5e7646d2SAndroid Build Coastguard Worker
109*5e7646d2SAndroid Build Coastguard Worker printf("\nMedian Total Time: %.3f seconds per document\n",
110*5e7646d2SAndroid Build Coastguard Worker compute_median(pass_secs));
111*5e7646d2SAndroid Build Coastguard Worker
112*5e7646d2SAndroid Build Coastguard Worker return (0);
113*5e7646d2SAndroid Build Coastguard Worker }
114*5e7646d2SAndroid Build Coastguard Worker
115*5e7646d2SAndroid Build Coastguard Worker
116*5e7646d2SAndroid Build Coastguard Worker /*
117*5e7646d2SAndroid Build Coastguard Worker * 'compute_median()' - Compute the median time for a test.
118*5e7646d2SAndroid Build Coastguard Worker */
119*5e7646d2SAndroid Build Coastguard Worker
120*5e7646d2SAndroid Build Coastguard Worker static double /* O - Median time in seconds */
compute_median(double * secs)121*5e7646d2SAndroid Build Coastguard Worker compute_median(double *secs) /* I - Array of time samples */
122*5e7646d2SAndroid Build Coastguard Worker {
123*5e7646d2SAndroid Build Coastguard Worker int i, j; /* Looping vars */
124*5e7646d2SAndroid Build Coastguard Worker double temp; /* Swap variable */
125*5e7646d2SAndroid Build Coastguard Worker
126*5e7646d2SAndroid Build Coastguard Worker
127*5e7646d2SAndroid Build Coastguard Worker /*
128*5e7646d2SAndroid Build Coastguard Worker * Sort the array into ascending order using a quicky bubble sort...
129*5e7646d2SAndroid Build Coastguard Worker */
130*5e7646d2SAndroid Build Coastguard Worker
131*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < (TEST_PASSES - 1); i ++)
132*5e7646d2SAndroid Build Coastguard Worker for (j = i + 1; j < TEST_PASSES; j ++)
133*5e7646d2SAndroid Build Coastguard Worker if (secs[i] > secs[j])
134*5e7646d2SAndroid Build Coastguard Worker {
135*5e7646d2SAndroid Build Coastguard Worker temp = secs[i];
136*5e7646d2SAndroid Build Coastguard Worker secs[i] = secs[j];
137*5e7646d2SAndroid Build Coastguard Worker secs[j] = temp;
138*5e7646d2SAndroid Build Coastguard Worker }
139*5e7646d2SAndroid Build Coastguard Worker
140*5e7646d2SAndroid Build Coastguard Worker /*
141*5e7646d2SAndroid Build Coastguard Worker * Return the average of the middle two samples...
142*5e7646d2SAndroid Build Coastguard Worker */
143*5e7646d2SAndroid Build Coastguard Worker
144*5e7646d2SAndroid Build Coastguard Worker return (0.5 * (secs[TEST_PASSES / 2 - 1] + secs[TEST_PASSES / 2]));
145*5e7646d2SAndroid Build Coastguard Worker }
146*5e7646d2SAndroid Build Coastguard Worker
147*5e7646d2SAndroid Build Coastguard Worker
148*5e7646d2SAndroid Build Coastguard Worker /*
149*5e7646d2SAndroid Build Coastguard Worker * 'get_time()' - Get the current time in seconds.
150*5e7646d2SAndroid Build Coastguard Worker */
151*5e7646d2SAndroid Build Coastguard Worker
152*5e7646d2SAndroid Build Coastguard Worker static double /* O - Time in seconds */
get_time(void)153*5e7646d2SAndroid Build Coastguard Worker get_time(void)
154*5e7646d2SAndroid Build Coastguard Worker {
155*5e7646d2SAndroid Build Coastguard Worker struct timeval curtime; /* Current time */
156*5e7646d2SAndroid Build Coastguard Worker
157*5e7646d2SAndroid Build Coastguard Worker
158*5e7646d2SAndroid Build Coastguard Worker gettimeofday(&curtime, NULL);
159*5e7646d2SAndroid Build Coastguard Worker return (curtime.tv_sec + 0.000001 * curtime.tv_usec);
160*5e7646d2SAndroid Build Coastguard Worker }
161*5e7646d2SAndroid Build Coastguard Worker
162*5e7646d2SAndroid Build Coastguard Worker
163*5e7646d2SAndroid Build Coastguard Worker /*
164*5e7646d2SAndroid Build Coastguard Worker * 'read_test()' - Benchmark the raster read functions.
165*5e7646d2SAndroid Build Coastguard Worker */
166*5e7646d2SAndroid Build Coastguard Worker
167*5e7646d2SAndroid Build Coastguard Worker static void
read_test(int fd)168*5e7646d2SAndroid Build Coastguard Worker read_test(int fd) /* I - File descriptor to read from */
169*5e7646d2SAndroid Build Coastguard Worker {
170*5e7646d2SAndroid Build Coastguard Worker unsigned y; /* Looping var */
171*5e7646d2SAndroid Build Coastguard Worker cups_raster_t *r; /* Raster stream */
172*5e7646d2SAndroid Build Coastguard Worker cups_page_header2_t header; /* Page header */
173*5e7646d2SAndroid Build Coastguard Worker unsigned char buffer[8 * TEST_WIDTH];
174*5e7646d2SAndroid Build Coastguard Worker /* Read buffer */
175*5e7646d2SAndroid Build Coastguard Worker
176*5e7646d2SAndroid Build Coastguard Worker
177*5e7646d2SAndroid Build Coastguard Worker /*
178*5e7646d2SAndroid Build Coastguard Worker * Test read speed...
179*5e7646d2SAndroid Build Coastguard Worker */
180*5e7646d2SAndroid Build Coastguard Worker
181*5e7646d2SAndroid Build Coastguard Worker if ((r = cupsRasterOpen(fd, CUPS_RASTER_READ)) == NULL)
182*5e7646d2SAndroid Build Coastguard Worker {
183*5e7646d2SAndroid Build Coastguard Worker perror("Unable to create raster input stream");
184*5e7646d2SAndroid Build Coastguard Worker return;
185*5e7646d2SAndroid Build Coastguard Worker }
186*5e7646d2SAndroid Build Coastguard Worker
187*5e7646d2SAndroid Build Coastguard Worker while (cupsRasterReadHeader2(r, &header))
188*5e7646d2SAndroid Build Coastguard Worker {
189*5e7646d2SAndroid Build Coastguard Worker for (y = 0; y < header.cupsHeight; y ++)
190*5e7646d2SAndroid Build Coastguard Worker cupsRasterReadPixels(r, buffer, header.cupsBytesPerLine);
191*5e7646d2SAndroid Build Coastguard Worker }
192*5e7646d2SAndroid Build Coastguard Worker
193*5e7646d2SAndroid Build Coastguard Worker cupsRasterClose(r);
194*5e7646d2SAndroid Build Coastguard Worker }
195*5e7646d2SAndroid Build Coastguard Worker
196*5e7646d2SAndroid Build Coastguard Worker
197*5e7646d2SAndroid Build Coastguard Worker /*
198*5e7646d2SAndroid Build Coastguard Worker * 'run_read_test()' - Run the read test as a child process via pipes.
199*5e7646d2SAndroid Build Coastguard Worker */
200*5e7646d2SAndroid Build Coastguard Worker
201*5e7646d2SAndroid Build Coastguard Worker static int /* O - Standard input of child */
run_read_test(void)202*5e7646d2SAndroid Build Coastguard Worker run_read_test(void)
203*5e7646d2SAndroid Build Coastguard Worker {
204*5e7646d2SAndroid Build Coastguard Worker int ras_pipes[2]; /* Raster data pipes */
205*5e7646d2SAndroid Build Coastguard Worker int pid; /* Child process ID */
206*5e7646d2SAndroid Build Coastguard Worker
207*5e7646d2SAndroid Build Coastguard Worker
208*5e7646d2SAndroid Build Coastguard Worker if (pipe(ras_pipes))
209*5e7646d2SAndroid Build Coastguard Worker return (-1);
210*5e7646d2SAndroid Build Coastguard Worker
211*5e7646d2SAndroid Build Coastguard Worker if ((pid = fork()) < 0)
212*5e7646d2SAndroid Build Coastguard Worker {
213*5e7646d2SAndroid Build Coastguard Worker /*
214*5e7646d2SAndroid Build Coastguard Worker * Fork error - return -1 on error...
215*5e7646d2SAndroid Build Coastguard Worker */
216*5e7646d2SAndroid Build Coastguard Worker
217*5e7646d2SAndroid Build Coastguard Worker close(ras_pipes[0]);
218*5e7646d2SAndroid Build Coastguard Worker close(ras_pipes[1]);
219*5e7646d2SAndroid Build Coastguard Worker
220*5e7646d2SAndroid Build Coastguard Worker return (-1);
221*5e7646d2SAndroid Build Coastguard Worker }
222*5e7646d2SAndroid Build Coastguard Worker else if (pid == 0)
223*5e7646d2SAndroid Build Coastguard Worker {
224*5e7646d2SAndroid Build Coastguard Worker /*
225*5e7646d2SAndroid Build Coastguard Worker * Child comes here - read data from the input pipe...
226*5e7646d2SAndroid Build Coastguard Worker */
227*5e7646d2SAndroid Build Coastguard Worker
228*5e7646d2SAndroid Build Coastguard Worker close(ras_pipes[1]);
229*5e7646d2SAndroid Build Coastguard Worker read_test(ras_pipes[0]);
230*5e7646d2SAndroid Build Coastguard Worker exit(0);
231*5e7646d2SAndroid Build Coastguard Worker }
232*5e7646d2SAndroid Build Coastguard Worker else
233*5e7646d2SAndroid Build Coastguard Worker {
234*5e7646d2SAndroid Build Coastguard Worker /*
235*5e7646d2SAndroid Build Coastguard Worker * Parent comes here - return the output pipe...
236*5e7646d2SAndroid Build Coastguard Worker */
237*5e7646d2SAndroid Build Coastguard Worker
238*5e7646d2SAndroid Build Coastguard Worker close(ras_pipes[0]);
239*5e7646d2SAndroid Build Coastguard Worker return (ras_pipes[1]);
240*5e7646d2SAndroid Build Coastguard Worker }
241*5e7646d2SAndroid Build Coastguard Worker }
242*5e7646d2SAndroid Build Coastguard Worker
243*5e7646d2SAndroid Build Coastguard Worker
244*5e7646d2SAndroid Build Coastguard Worker /*
245*5e7646d2SAndroid Build Coastguard Worker * 'write_test()' - Benchmark the raster write functions.
246*5e7646d2SAndroid Build Coastguard Worker */
247*5e7646d2SAndroid Build Coastguard Worker
248*5e7646d2SAndroid Build Coastguard Worker static void
write_test(int fd,cups_mode_t mode)249*5e7646d2SAndroid Build Coastguard Worker write_test(int fd, /* I - File descriptor to write to */
250*5e7646d2SAndroid Build Coastguard Worker cups_mode_t mode) /* I - Write mode */
251*5e7646d2SAndroid Build Coastguard Worker {
252*5e7646d2SAndroid Build Coastguard Worker unsigned page, x, y; /* Looping vars */
253*5e7646d2SAndroid Build Coastguard Worker unsigned count; /* Number of bytes to set */
254*5e7646d2SAndroid Build Coastguard Worker cups_raster_t *r; /* Raster stream */
255*5e7646d2SAndroid Build Coastguard Worker cups_page_header2_t header; /* Page header */
256*5e7646d2SAndroid Build Coastguard Worker unsigned char data[32][8 * TEST_WIDTH];
257*5e7646d2SAndroid Build Coastguard Worker /* Raster data to write */
258*5e7646d2SAndroid Build Coastguard Worker
259*5e7646d2SAndroid Build Coastguard Worker
260*5e7646d2SAndroid Build Coastguard Worker /*
261*5e7646d2SAndroid Build Coastguard Worker * Create a combination of random data and repeated data to simulate
262*5e7646d2SAndroid Build Coastguard Worker * text with some whitespace.
263*5e7646d2SAndroid Build Coastguard Worker */
264*5e7646d2SAndroid Build Coastguard Worker
265*5e7646d2SAndroid Build Coastguard Worker CUPS_SRAND(time(NULL));
266*5e7646d2SAndroid Build Coastguard Worker
267*5e7646d2SAndroid Build Coastguard Worker memset(data, 0, sizeof(data));
268*5e7646d2SAndroid Build Coastguard Worker
269*5e7646d2SAndroid Build Coastguard Worker for (y = 0; y < 28; y ++)
270*5e7646d2SAndroid Build Coastguard Worker {
271*5e7646d2SAndroid Build Coastguard Worker for (x = CUPS_RAND() & 127, count = (CUPS_RAND() & 15) + 1;
272*5e7646d2SAndroid Build Coastguard Worker x < sizeof(data[0]);
273*5e7646d2SAndroid Build Coastguard Worker x ++, count --)
274*5e7646d2SAndroid Build Coastguard Worker {
275*5e7646d2SAndroid Build Coastguard Worker if (count <= 0)
276*5e7646d2SAndroid Build Coastguard Worker {
277*5e7646d2SAndroid Build Coastguard Worker x += (CUPS_RAND() & 15) + 1;
278*5e7646d2SAndroid Build Coastguard Worker count = (CUPS_RAND() & 15) + 1;
279*5e7646d2SAndroid Build Coastguard Worker
280*5e7646d2SAndroid Build Coastguard Worker if (x >= sizeof(data[0]))
281*5e7646d2SAndroid Build Coastguard Worker break;
282*5e7646d2SAndroid Build Coastguard Worker }
283*5e7646d2SAndroid Build Coastguard Worker
284*5e7646d2SAndroid Build Coastguard Worker data[y][x] = (unsigned char)CUPS_RAND();
285*5e7646d2SAndroid Build Coastguard Worker }
286*5e7646d2SAndroid Build Coastguard Worker }
287*5e7646d2SAndroid Build Coastguard Worker
288*5e7646d2SAndroid Build Coastguard Worker /*
289*5e7646d2SAndroid Build Coastguard Worker * Test write speed...
290*5e7646d2SAndroid Build Coastguard Worker */
291*5e7646d2SAndroid Build Coastguard Worker
292*5e7646d2SAndroid Build Coastguard Worker if ((r = cupsRasterOpen(fd, mode)) == NULL)
293*5e7646d2SAndroid Build Coastguard Worker {
294*5e7646d2SAndroid Build Coastguard Worker perror("Unable to create raster output stream");
295*5e7646d2SAndroid Build Coastguard Worker return;
296*5e7646d2SAndroid Build Coastguard Worker }
297*5e7646d2SAndroid Build Coastguard Worker
298*5e7646d2SAndroid Build Coastguard Worker for (page = 0; page < TEST_PAGES; page ++)
299*5e7646d2SAndroid Build Coastguard Worker {
300*5e7646d2SAndroid Build Coastguard Worker memset(&header, 0, sizeof(header));
301*5e7646d2SAndroid Build Coastguard Worker header.cupsWidth = TEST_WIDTH;
302*5e7646d2SAndroid Build Coastguard Worker header.cupsHeight = TEST_HEIGHT;
303*5e7646d2SAndroid Build Coastguard Worker header.cupsBytesPerLine = TEST_WIDTH;
304*5e7646d2SAndroid Build Coastguard Worker
305*5e7646d2SAndroid Build Coastguard Worker if (page & 1)
306*5e7646d2SAndroid Build Coastguard Worker {
307*5e7646d2SAndroid Build Coastguard Worker header.cupsBytesPerLine *= 4;
308*5e7646d2SAndroid Build Coastguard Worker header.cupsColorSpace = CUPS_CSPACE_CMYK;
309*5e7646d2SAndroid Build Coastguard Worker header.cupsColorOrder = CUPS_ORDER_CHUNKED;
310*5e7646d2SAndroid Build Coastguard Worker }
311*5e7646d2SAndroid Build Coastguard Worker else
312*5e7646d2SAndroid Build Coastguard Worker {
313*5e7646d2SAndroid Build Coastguard Worker header.cupsColorSpace = CUPS_CSPACE_K;
314*5e7646d2SAndroid Build Coastguard Worker header.cupsColorOrder = CUPS_ORDER_BANDED;
315*5e7646d2SAndroid Build Coastguard Worker }
316*5e7646d2SAndroid Build Coastguard Worker
317*5e7646d2SAndroid Build Coastguard Worker if (page & 2)
318*5e7646d2SAndroid Build Coastguard Worker {
319*5e7646d2SAndroid Build Coastguard Worker header.cupsBytesPerLine *= 2;
320*5e7646d2SAndroid Build Coastguard Worker header.cupsBitsPerColor = 16;
321*5e7646d2SAndroid Build Coastguard Worker header.cupsBitsPerPixel = (page & 1) ? 64 : 16;
322*5e7646d2SAndroid Build Coastguard Worker }
323*5e7646d2SAndroid Build Coastguard Worker else
324*5e7646d2SAndroid Build Coastguard Worker {
325*5e7646d2SAndroid Build Coastguard Worker header.cupsBitsPerColor = 8;
326*5e7646d2SAndroid Build Coastguard Worker header.cupsBitsPerPixel = (page & 1) ? 32 : 8;
327*5e7646d2SAndroid Build Coastguard Worker }
328*5e7646d2SAndroid Build Coastguard Worker
329*5e7646d2SAndroid Build Coastguard Worker cupsRasterWriteHeader2(r, &header);
330*5e7646d2SAndroid Build Coastguard Worker
331*5e7646d2SAndroid Build Coastguard Worker for (y = 0; y < TEST_HEIGHT; y ++)
332*5e7646d2SAndroid Build Coastguard Worker cupsRasterWritePixels(r, data[y & 31], header.cupsBytesPerLine);
333*5e7646d2SAndroid Build Coastguard Worker }
334*5e7646d2SAndroid Build Coastguard Worker
335*5e7646d2SAndroid Build Coastguard Worker cupsRasterClose(r);
336*5e7646d2SAndroid Build Coastguard Worker }
337