xref: /aosp_15_r20/external/libcups/cups/rasterbench.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
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