]> git.ipfire.org Git - thirdparty/cups.git/blame - filter/testraster.c
Full sweep of all Clang warnings, plus some bug fixes for incorrect memcpy usage.
[thirdparty/cups.git] / filter / testraster.c
CommitLineData
ef416fc2 1/*
f2d18633 2 * "$Id$"
ef416fc2 3 *
7e86f2f6 4 * Raster test program routines for CUPS.
ef416fc2 5 *
7e86f2f6
MS
6 * Copyright 2007-2014 by Apple Inc.
7 * Copyright 1997-2007 by Easy Software Products.
ef416fc2 8 *
7e86f2f6
MS
9 * These coded instructions, statements, and computer programs are the
10 * property of Apple Inc. and are protected by Federal copyright
11 * law. Distribution and use rights are outlined in the file "LICENSE.txt"
12 * which should have been included with this file. If this file is
13 * file is missing or damaged, see the license at "http://www.cups.org/".
ef416fc2 14 *
7e86f2f6 15 * This file is subject to the Apple OS-Developed Software exception.
ef416fc2 16 */
17
18/*
19 * Include necessary headers...
20 */
21
a4845881 22#include <cups/raster-private.h>
7e86f2f6 23#include <math.h>
ef416fc2 24
25
26/*
b86bc4cf 27 * Test PS commands and header...
28 */
29
f7deaa1a 30static const char *dsc_code =
31"[{\n"
32"%%BeginFeature: *PageSize Tabloid\n"
33"<</PageSize[792 1224]>>setpagedevice\n"
34"%%EndFeature\n"
35"} stopped cleartomark\n";
36static const char *setpagedevice_code =
b86bc4cf 37"<<"
38"/MediaClass(Media Class)"
39"/MediaColor((Media Color))"
40"/MediaType(Media\\\\Type)"
41"/OutputType<416263>"
42"/AdvanceDistance 1000"
43"/AdvanceMedia 1"
44"/Collate false"
45"/CutMedia 2"
46"/Duplex true"
47"/HWResolution[100 200]"
48"/InsertSheet true"
49"/Jog 3"
50"/LeadingEdge 1"
51"/ManualFeed true"
52"/MediaPosition 8#777"
53"/MediaWeight 16#fe01"
54"/MirrorPrint true"
55"/NegativePrint true"
56"/NumCopies 1"
57"/Orientation 1"
58"/OutputFaceUp true"
59"/PageSize[612 792.1]"
60"/Separations true"
61"/TraySwitch true"
62"/Tumble true"
63"/cupsMediaType 2"
64"/cupsColorOrder 1"
65"/cupsColorSpace 1"
66"/cupsCompression 1"
67"/cupsRowCount 1"
68"/cupsRowFeed 1"
69"/cupsRowStep 1"
70"/cupsBorderlessScalingFactor 1.001"
71"/cupsInteger0 1"
72"/cupsInteger1 2"
73"/cupsInteger2 3"
74"/cupsInteger3 4"
75"/cupsInteger4 5"
76"/cupsInteger5 6"
77"/cupsInteger6 7"
78"/cupsInteger7 8"
79"/cupsInteger8 9"
80"/cupsInteger9 10"
81"/cupsInteger10 11"
82"/cupsInteger11 12"
83"/cupsInteger12 13"
84"/cupsInteger13 14"
85"/cupsInteger14 15"
86"/cupsInteger15 16"
87"/cupsReal0 1.1"
88"/cupsReal1 2.1"
89"/cupsReal2 3.1"
90"/cupsReal3 4.1"
91"/cupsReal4 5.1"
92"/cupsReal5 6.1"
93"/cupsReal6 7.1"
94"/cupsReal7 8.1"
95"/cupsReal8 9.1"
96"/cupsReal9 10.1"
97"/cupsReal10 11.1"
98"/cupsReal11 12.1"
99"/cupsReal12 13.1"
100"/cupsReal13 14.1"
101"/cupsReal14 15.1"
102"/cupsReal15 16.1"
103"/cupsString0(1)"
104"/cupsString1(2)"
105"/cupsString2(3)"
106"/cupsString3(4)"
107"/cupsString4(5)"
108"/cupsString5(6)"
109"/cupsString6(7)"
110"/cupsString7(8)"
111"/cupsString8(9)"
112"/cupsString9(10)"
113"/cupsString10(11)"
114"/cupsString11(12)"
115"/cupsString12(13)"
116"/cupsString13(14)"
117"/cupsString14(15)"
118"/cupsString15(16)"
119"/cupsMarkerType(Marker Type)"
120"/cupsRenderingIntent(Rendering Intent)"
121"/cupsPageSizeName(Letter)"
122"/cupsPreferredBitsPerColor 17"
123">> setpagedevice";
124
f7deaa1a 125static cups_page_header2_t setpagedevice_header =
b86bc4cf 126{
127 "Media Class", /* MediaClass */
128 "(Media Color)", /* MediaColor */
129 "Media\\Type", /* MediaType */
130 "Abc", /* OutputType */
131 1000, /* AdvanceDistance */
132 CUPS_ADVANCE_FILE, /* AdvanceMedia */
133 CUPS_FALSE, /* Collate */
134 CUPS_CUT_JOB, /* CutMedia */
135 CUPS_TRUE, /* Duplex */
136 { 100, 200 }, /* HWResolution */
137 { 0, 0, 0, 0 }, /* ImagingBoundingBox */
138 CUPS_TRUE, /* InsertSheet */
139 CUPS_JOG_SET, /* Jog */
140 CUPS_EDGE_RIGHT, /* LeadingEdge */
141 { 0, 0 }, /* Margins */
142 CUPS_TRUE, /* ManualFeed */
143 0777, /* MediaPosition */
144 0xfe01, /* MediaWeight */
145 CUPS_TRUE, /* MirrorPrint */
146 CUPS_TRUE, /* NegativePrint */
147 1, /* NumCopies */
148 CUPS_ORIENT_90, /* Orientation */
149 CUPS_TRUE, /* OutputFaceUp */
150 { 612, 792 }, /* PageSize */
151 CUPS_TRUE, /* Separations */
152 CUPS_TRUE, /* TraySwitch */
153 CUPS_TRUE, /* Tumble */
154 0, /* cupsWidth */
155 0, /* cupsHeight */
156 2, /* cupsMediaType */
157 0, /* cupsBitsPerColor */
158 0, /* cupsBitsPerPixel */
159 0, /* cupsBytesPerLine */
160 CUPS_ORDER_BANDED, /* cupsColorOrder */
161 CUPS_CSPACE_RGB, /* cupsColorSpace */
162 1, /* cupsCompression */
163 1, /* cupsRowCount */
164 1, /* cupsRowFeed */
165 1, /* cupsRowStep */
166 0, /* cupsNumColors */
7e86f2f6
MS
167 1.001f, /* cupsBorderlessScalingFactor */
168 { 612.0f, 792.1f }, /* cupsPageSize */
169 { 0.0f, 0.0f, 0.0f, 0.0f }, /* cupsImagingBBox */
b86bc4cf 170 { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 },
171 /* cupsInteger[16] */
7e86f2f6 172 { 1.1f, 2.1f, 3.1f, 4.1f, 5.1f, 6.1f, 7.1f, 8.1f, 9.1f, 10.1f, 11.1f, 12.1f, 13.1f, 14.1f, 15.1f, 16.1f }, /* cupsReal[16] */
b86bc4cf 173 { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
174 "14", "15", "16" }, /* cupsString[16] */
175 "Marker Type", /* cupsMarkerType */
176 "Rendering Intent", /* cupsRenderingIntent */
177 "Letter" /* cupsPageSizeName */
178};
179
180
181/*
182 * Local functions...
183 */
184
f7deaa1a 185static int do_ppd_tests(const char *filename, int num_options,
186 cups_option_t *options);
187static int do_ps_tests(void);
f14324a7 188static int do_ras_file(const char *filename);
db0bd74a 189static int do_raster_tests(cups_mode_t mode);
b86bc4cf 190static void print_changes(cups_page_header2_t *header,
191 cups_page_header2_t *expected);
192
193
194/*
195 * 'main()' - Test the raster functions.
ef416fc2 196 */
197
198int /* O - Exit status */
f7deaa1a 199main(int argc, /* I - Number of command-line args */
200 char *argv[]) /* I - Command-line arguments */
ef416fc2 201{
f7deaa1a 202 int errors; /* Number of errors */
f14324a7 203 const char *ext; /* Filename extension */
f7deaa1a 204
205
206 if (argc == 1)
207 {
208 errors = do_ps_tests();
db0bd74a
MS
209 errors += do_raster_tests(CUPS_RASTER_WRITE);
210 errors += do_raster_tests(CUPS_RASTER_WRITE_COMPRESSED);
c8fef167 211 errors += do_raster_tests(CUPS_RASTER_WRITE_PWG);
f7deaa1a 212 }
213 else
214 {
215 int i; /* Looping var */
216 int num_options; /* Number of options */
217 cups_option_t *options; /* Options */
218
219
220 for (errors = 0, num_options = 0, options = NULL, i = 1; i < argc; i ++)
221 {
222 if (argv[i][0] == '-')
223 {
224 if (argv[i][1] == 'o')
225 {
226 if (argv[i][2])
227 num_options = cupsParseOptions(argv[i] + 2, num_options, &options);
228 else
229 {
230 i ++;
231 if (i < argc)
232 num_options = cupsParseOptions(argv[i], num_options, &options);
233 else
234 {
235 puts("Usage: testraster [-o name=value ...] [filename.ppd ...]");
f14324a7 236 puts(" testraster [filename.ras ...]");
f7deaa1a 237 return (1);
238 }
239 }
240 }
241 else
242 {
243 puts("Usage: testraster [-o name=value ...] [filename.ppd ...]");
f14324a7 244 puts(" testraster [filename.ras ...]");
f7deaa1a 245 return (1);
246 }
247 }
f14324a7
MS
248 else if ((ext = strrchr(argv[i], '.')) != NULL)
249 {
250 if (!strcmp(ext, ".ppd"))
251 errors += do_ppd_tests(argv[i], num_options, options);
252 else
253 errors += do_ras_file(argv[i]);
254 }
f7deaa1a 255 else
f14324a7
MS
256 {
257 puts("Usage: testraster [-o name=value ...] [filename.ppd ...]");
258 puts(" testraster [filename.ras ...]");
259 return (1);
260 }
f7deaa1a 261 }
262
263 cupsFreeOptions(num_options, options);
264 }
265
266 return (errors);
267}
268
269
270/*
271 * 'do_ppd_tests()' - Test the default option commands in a PPD file.
272 */
273
274static int /* O - Number of errors */
275do_ppd_tests(const char *filename, /* I - PPD file */
276 int num_options, /* I - Number of options */
277 cups_option_t *options) /* I - Options */
278{
279 ppd_file_t *ppd; /* PPD file data */
280 cups_page_header2_t header; /* Page header */
281
282
283 printf("\"%s\": ", filename);
284 fflush(stdout);
285
286 if ((ppd = ppdOpenFile(filename)) == NULL)
287 {
288 ppd_status_t status; /* Status from PPD loader */
289 int line; /* Line number containing error */
290
291
292 status = ppdLastError(&line);
293
294 puts("FAIL (bad PPD file)");
295 printf(" %s on line %d\n", ppdErrorString(status), line);
296
297 return (1);
298 }
299
300 ppdMarkDefaults(ppd);
301 cupsMarkOptions(ppd, num_options, options);
b86bc4cf 302
f7deaa1a 303 if (cupsRasterInterpretPPD(&header, ppd, 0, NULL, NULL))
304 {
305 puts("FAIL (error from function)");
306 puts(cupsRasterErrorString());
307
308 return (1);
309 }
310 else
311 {
312 puts("PASS");
313
314 return (0);
315 }
316}
317
318
319/*
320 * 'do_ps_tests()' - Test standard PostScript commands.
321 */
322
323static int
324do_ps_tests(void)
325{
326 cups_page_header2_t header; /* Page header */
327 int preferred_bits; /* Preferred bits */
328 int errors = 0; /* Number of errors */
b86bc4cf 329
b86bc4cf 330
331 /*
332 * Test PS exec code...
333 */
334
335 fputs("_cupsRasterExecPS(\"setpagedevice\"): ", stdout);
336 fflush(stdout);
337
338 memset(&header, 0, sizeof(header));
339 header.Collate = CUPS_TRUE;
340 preferred_bits = 0;
341
f7deaa1a 342 if (_cupsRasterExecPS(&header, &preferred_bits, setpagedevice_code))
b86bc4cf 343 {
344 puts("FAIL (error from function)");
f7deaa1a 345 puts(cupsRasterErrorString());
b86bc4cf 346 errors ++;
347 }
f7deaa1a 348 else if (preferred_bits != 17 ||
349 memcmp(&header, &setpagedevice_header, sizeof(header)))
b86bc4cf 350 {
351 puts("FAIL (bad header)");
352
353 if (preferred_bits != 17)
354 printf(" cupsPreferredBitsPerColor %d, expected 17\n",
355 preferred_bits);
356
f7deaa1a 357 print_changes(&setpagedevice_header, &header);
b86bc4cf 358 errors ++;
359 }
360 else
361 puts("PASS");
f14324a7 362
b86bc4cf 363 fputs("_cupsRasterExecPS(\"roll\"): ", stdout);
364 fflush(stdout);
365
366 if (_cupsRasterExecPS(&header, &preferred_bits,
367 "792 612 0 0 0\n"
368 "pop pop pop\n"
369 "<</PageSize[5 -2 roll]/ImagingBBox null>>"
370 "setpagedevice\n"))
371 {
372 puts("FAIL (error from function)");
f7deaa1a 373 puts(cupsRasterErrorString());
b86bc4cf 374 errors ++;
375 }
376 else if (header.PageSize[0] != 792 || header.PageSize[1] != 612)
377 {
378 printf("FAIL (PageSize [%d %d], expected [792 612])\n", header.PageSize[0],
379 header.PageSize[1]);
380 errors ++;
381 }
382 else
383 puts("PASS");
384
385 fputs("_cupsRasterExecPS(\"dup index\"): ", stdout);
386 fflush(stdout);
387
388 if (_cupsRasterExecPS(&header, &preferred_bits,
389 "true false dup\n"
390 "<</Collate 4 index"
391 "/Duplex 5 index"
392 "/Tumble 6 index>>setpagedevice\n"
393 "pop pop pop"))
394 {
395 puts("FAIL (error from function)");
f7deaa1a 396 puts(cupsRasterErrorString());
b86bc4cf 397 errors ++;
398 }
399 else
400 {
401 if (!header.Collate)
402 {
403 printf("FAIL (Collate false, expected true)\n");
404 errors ++;
405 }
406
407 if (header.Duplex)
408 {
409 printf("FAIL (Duplex true, expected false)\n");
410 errors ++;
411 }
412
413 if (header.Tumble)
414 {
415 printf("FAIL (Tumble true, expected false)\n");
416 errors ++;
417 }
418
419 if(header.Collate && !header.Duplex && !header.Tumble)
420 puts("PASS");
421 }
422
f7deaa1a 423 fputs("_cupsRasterExecPS(\"%%Begin/EndFeature code\"): ", stdout);
424 fflush(stdout);
425
426 if (_cupsRasterExecPS(&header, &preferred_bits, dsc_code))
427 {
428 puts("FAIL (error from function)");
429 puts(cupsRasterErrorString());
430 errors ++;
431 }
432 else if (header.PageSize[0] != 792 || header.PageSize[1] != 1224)
433 {
434 printf("FAIL (bad PageSize [%d %d], expected [792 1224])\n",
435 header.PageSize[0], header.PageSize[1]);
436 errors ++;
437 }
438 else
439 puts("PASS");
440
f14324a7
MS
441 return (errors);
442}
b86bc4cf 443
b86bc4cf 444
f14324a7
MS
445/*
446 * 'do_ras_file()' - Test reading of a raster file.
447 */
b86bc4cf 448
f14324a7
MS
449static int /* O - Number of errors */
450do_ras_file(const char *filename) /* I - Filename */
451{
452 unsigned y; /* Looping vars */
453 int fd; /* File descriptor */
454 cups_raster_t *ras; /* Raster stream */
455 cups_page_header2_t header; /* Page header */
456 unsigned char *data; /* Raster data */
457 int errors = 0; /* Number of errors */
458 unsigned pages = 0; /* Number of pages */
b86bc4cf 459
b86bc4cf 460
f14324a7 461 if ((fd = open(filename, O_RDONLY)) < 0)
b86bc4cf 462 {
f14324a7
MS
463 printf("%s: %s\n", filename, strerror(errno));
464 return (1);
b86bc4cf 465 }
f14324a7
MS
466
467 if ((ras = cupsRasterOpen(fd, CUPS_RASTER_READ)) == NULL)
b86bc4cf 468 {
f14324a7
MS
469 printf("%s: cupsRasterOpen failed.\n", filename);
470 close(fd);
471 return (1);
b86bc4cf 472 }
b86bc4cf 473
f14324a7 474 printf("%s:\n", filename);
b86bc4cf 475
f14324a7 476 while (cupsRasterReadHeader2(ras, &header))
b86bc4cf 477 {
f14324a7
MS
478 pages ++;
479 data = malloc(header.cupsBytesPerLine);
b86bc4cf 480
f14324a7
MS
481 printf(" Page %u: %ux%ux%u@%ux%udpi", pages,
482 header.cupsWidth, header.cupsHeight, header.cupsBitsPerPixel,
483 header.HWResolution[0], header.HWResolution[1]);
484 fflush(stdout);
b86bc4cf 485
f14324a7
MS
486 for (y = 0; y < header.cupsHeight; y ++)
487 if (cupsRasterReadPixels(ras, data, header.cupsBytesPerLine) <
488 header.cupsBytesPerLine)
489 break;
490
491 if (y < header.cupsHeight)
492 printf(" ERROR AT LINE %d\n", y);
493 else
494 putchar('\n');
495
496 free(data);
b86bc4cf 497 }
f14324a7
MS
498
499 cupsRasterClose(ras);
500 close(fd);
b86bc4cf 501
f7deaa1a 502 return (errors);
503}
504
505
506/*
507 * 'do_raster_tests()' - Test reading and writing of raster data.
508 */
509
510static int /* O - Number of errors */
db0bd74a 511do_raster_tests(cups_mode_t mode) /* O - Write mode */
f7deaa1a 512{
7e86f2f6 513 unsigned page, x, y; /* Looping vars */
f7deaa1a 514 FILE *fp; /* Raster file */
515 cups_raster_t *r; /* Raster stream */
516 cups_page_header2_t header, /* Page header */
517 expected; /* Expected page header */
518 unsigned char data[2048]; /* Raster data */
519 int errors = 0; /* Number of errors */
520
521
b86bc4cf 522 /*
523 * Test writing...
524 */
ef416fc2 525
db0bd74a
MS
526 printf("cupsRasterOpen(%s): ",
527 mode == CUPS_RASTER_WRITE ? "CUPS_RASTER_WRITE" :
c8fef167
MS
528 mode == CUPS_RASTER_WRITE ? "CUPS_RASTER_WRITE_COMPRESSED" :
529 "CUPS_RASTER_WRITE_PWG");
b86bc4cf 530 fflush(stdout);
ef416fc2 531
532 if ((fp = fopen("test.raster", "wb")) == NULL)
533 {
b86bc4cf 534 printf("FAIL (%s)\n", strerror(errno));
ef416fc2 535 return (1);
536 }
537
db0bd74a 538 if ((r = cupsRasterOpen(fileno(fp), mode)) == NULL)
ef416fc2 539 {
b86bc4cf 540 printf("FAIL (%s)\n", strerror(errno));
ef416fc2 541 fclose(fp);
542 return (1);
543 }
544
b86bc4cf 545 puts("PASS");
546
ef416fc2 547 for (page = 0; page < 4; page ++)
548 {
549 memset(&header, 0, sizeof(header));
550 header.cupsWidth = 256;
551 header.cupsHeight = 256;
552 header.cupsBytesPerLine = 256;
553
554 if (page & 1)
555 {
556 header.cupsBytesPerLine *= 2;
557 header.cupsColorSpace = CUPS_CSPACE_CMYK;
558 header.cupsColorOrder = CUPS_ORDER_CHUNKED;
b86bc4cf 559 header.cupsNumColors = 4;
ef416fc2 560 }
561 else
562 {
563 header.cupsColorSpace = CUPS_CSPACE_K;
564 header.cupsColorOrder = CUPS_ORDER_BANDED;
b86bc4cf 565 header.cupsNumColors = 1;
ef416fc2 566 }
567
568 if (page & 2)
569 {
570 header.cupsBytesPerLine *= 2;
571 header.cupsBitsPerColor = 16;
572 header.cupsBitsPerPixel = (page & 1) ? 64 : 16;
573 }
574 else
575 {
576 header.cupsBitsPerColor = 8;
577 header.cupsBitsPerPixel = (page & 1) ? 32 : 8;
578 }
579
b86bc4cf 580 if (cupsRasterWriteHeader2(r, &header))
581 puts("cupsRasterWriteHeader2: PASS");
582 else
583 {
584 puts("cupsRasterWriteHeader2: FAIL");
585 errors ++;
586 }
ef416fc2 587
b86bc4cf 588 fputs("cupsRasterWritePixels: ", stdout);
589 fflush(stdout);
ef416fc2 590
b86bc4cf 591 memset(data, 0, header.cupsBytesPerLine);
ef416fc2 592 for (y = 0; y < 64; y ++)
b86bc4cf 593 if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine))
594 break;
ef416fc2 595
b86bc4cf 596 if (y < 64)
597 {
598 puts("FAIL");
599 errors ++;
600 }
601 else
602 {
603 for (x = 0; x < header.cupsBytesPerLine; x ++)
7e86f2f6 604 data[x] = (unsigned char)x;
ef416fc2 605
b86bc4cf 606 for (y = 0; y < 64; y ++)
607 if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine))
608 break;
ef416fc2 609
b86bc4cf 610 if (y < 64)
611 {
612 puts("FAIL");
613 errors ++;
614 }
615 else
616 {
617 memset(data, 255, header.cupsBytesPerLine);
618 for (y = 0; y < 64; y ++)
619 if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine))
620 break;
621
622 if (y < 64)
623 {
624 puts("FAIL");
625 errors ++;
626 }
627 else
628 {
629 for (x = 0; x < header.cupsBytesPerLine; x ++)
7e86f2f6 630 data[x] = (unsigned char)(x / 4);
b86bc4cf 631
632 for (y = 0; y < 64; y ++)
633 if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine))
634 break;
635
636 if (y < 64)
637 {
638 puts("FAIL");
639 errors ++;
640 }
641 else
642 puts("PASS");
643 }
644 }
645 }
ef416fc2 646 }
647
648 cupsRasterClose(r);
649 fclose(fp);
650
b86bc4cf 651 /*
652 * Test reading...
653 */
654
655 fputs("cupsRasterOpen(CUPS_RASTER_READ): ", stdout);
656 fflush(stdout);
657
ef416fc2 658 if ((fp = fopen("test.raster", "rb")) == NULL)
659 {
b86bc4cf 660 printf("FAIL (%s)\n", strerror(errno));
ef416fc2 661 return (1);
662 }
663
664 if ((r = cupsRasterOpen(fileno(fp), CUPS_RASTER_READ)) == NULL)
665 {
b86bc4cf 666 printf("FAIL (%s)\n", strerror(errno));
ef416fc2 667 fclose(fp);
668 return (1);
669 }
670
b86bc4cf 671 puts("PASS");
672
ef416fc2 673 for (page = 0; page < 4; page ++)
674 {
b86bc4cf 675 memset(&expected, 0, sizeof(expected));
676 expected.cupsWidth = 256;
677 expected.cupsHeight = 256;
678 expected.cupsBytesPerLine = 256;
ef416fc2 679
771bd8cb
MS
680 if (mode == CUPS_RASTER_WRITE_PWG)
681 {
682 strlcpy(expected.MediaClass, "PwgRaster", sizeof(expected.MediaClass));
683 expected.cupsInteger[7] = 0xffffff;
684 }
685
b86bc4cf 686 if (page & 1)
ef416fc2 687 {
b86bc4cf 688 expected.cupsBytesPerLine *= 2;
689 expected.cupsColorSpace = CUPS_CSPACE_CMYK;
690 expected.cupsColorOrder = CUPS_ORDER_CHUNKED;
691 expected.cupsNumColors = 4;
692 }
693 else
694 {
695 expected.cupsColorSpace = CUPS_CSPACE_K;
696 expected.cupsColorOrder = CUPS_ORDER_BANDED;
697 expected.cupsNumColors = 1;
ef416fc2 698 }
699
b86bc4cf 700 if (page & 2)
701 {
702 expected.cupsBytesPerLine *= 2;
703 expected.cupsBitsPerColor = 16;
704 expected.cupsBitsPerPixel = (page & 1) ? 64 : 16;
705 }
706 else
ef416fc2 707 {
b86bc4cf 708 expected.cupsBitsPerColor = 8;
709 expected.cupsBitsPerPixel = (page & 1) ? 32 : 8;
710 }
ef416fc2 711
b86bc4cf 712 fputs("cupsRasterReadHeader2: ", stdout);
713 fflush(stdout);
ef416fc2 714
b86bc4cf 715 if (!cupsRasterReadHeader2(r, &header))
716 {
717 puts("FAIL (read error)");
718 errors ++;
719 break;
ef416fc2 720 }
721
b86bc4cf 722 if (memcmp(&header, &expected, sizeof(header)))
ef416fc2 723 {
b86bc4cf 724 puts("FAIL (bad page header)");
725 errors ++;
726 print_changes(&header, &expected);
ef416fc2 727 }
728
b86bc4cf 729 fputs("cupsRasterReadPixels: ", stdout);
730 fflush(stdout);
731
ef416fc2 732 for (y = 0; y < 64; y ++)
733 {
b86bc4cf 734 if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine))
735 {
736 puts("FAIL (read error)");
737 errors ++;
738 break;
739 }
ef416fc2 740
b86bc4cf 741 if (data[0] != 0 || memcmp(data, data + 1, header.cupsBytesPerLine - 1))
742 {
743 printf("FAIL (raster line %d corrupt)\n", y);
744 errors ++;
745 break;
746 }
747 }
748
749 if (y == 64)
750 {
751 for (y = 0; y < 64; y ++)
752 {
753 if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine))
754 {
755 puts("FAIL (read error)");
756 errors ++;
ef416fc2 757 break;
b86bc4cf 758 }
759
760 for (x = 0; x < header.cupsBytesPerLine; x ++)
761 if (data[x] != (x & 255))
762 break;
ef416fc2 763
b86bc4cf 764 if (x < header.cupsBytesPerLine)
765 {
766 printf("FAIL (raster line %d corrupt)\n", y + 64);
767 errors ++;
768 break;
769 }
770 }
771
772 if (y == 64)
773 {
774 for (y = 0; y < 64; y ++)
775 {
776 if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine))
777 {
778 puts("FAIL (read error)");
779 errors ++;
780 break;
781 }
782
783 if (data[0] != 255 || memcmp(data, data + 1, header.cupsBytesPerLine - 1))
784 {
785 printf("fail (raster line %d corrupt)\n", y + 128);
786 errors ++;
787 break;
788 }
789 }
790
791 if (y == 64)
792 {
793 for (y = 0; y < 64; y ++)
794 {
795 if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine))
796 {
797 puts("FAIL (read error)");
798 errors ++;
799 break;
800 }
801
802 for (x = 0; x < header.cupsBytesPerLine; x ++)
803 if (data[x] != ((x / 4) & 255))
804 break;
805
806 if (x < header.cupsBytesPerLine)
807 {
808 printf("FAIL (raster line %d corrupt)\n", y + 192);
809 errors ++;
810 break;
811 }
812 }
813
814 if (y == 64)
815 puts("PASS");
816 }
817 }
ef416fc2 818 }
819 }
820
821 cupsRasterClose(r);
822 fclose(fp);
823
f7deaa1a 824 return (errors);
b86bc4cf 825}
826
827
b86bc4cf 828/*
829 * 'print_changes()' - Print differences in the page header.
830 */
831
832static void
833print_changes(
834 cups_page_header2_t *header, /* I - Actual page header */
835 cups_page_header2_t *expected) /* I - Expected page header */
836{
837 int i; /* Looping var */
838
839
840 if (strcmp(header->MediaClass, expected->MediaClass))
841 printf(" MediaClass (%s), expected (%s)\n", header->MediaClass,
842 expected->MediaClass);
843
844 if (strcmp(header->MediaColor, expected->MediaColor))
845 printf(" MediaColor (%s), expected (%s)\n", header->MediaColor,
846 expected->MediaColor);
847
848 if (strcmp(header->MediaType, expected->MediaType))
849 printf(" MediaType (%s), expected (%s)\n", header->MediaType,
850 expected->MediaType);
851
852 if (strcmp(header->OutputType, expected->OutputType))
853 printf(" OutputType (%s), expected (%s)\n", header->OutputType,
854 expected->OutputType);
855
856 if (header->AdvanceDistance != expected->AdvanceDistance)
857 printf(" AdvanceDistance %d, expected %d\n", header->AdvanceDistance,
858 expected->AdvanceDistance);
859
860 if (header->AdvanceMedia != expected->AdvanceMedia)
861 printf(" AdvanceMedia %d, expected %d\n", header->AdvanceMedia,
862 expected->AdvanceMedia);
863
864 if (header->Collate != expected->Collate)
865 printf(" Collate %d, expected %d\n", header->Collate,
866 expected->Collate);
867
868 if (header->CutMedia != expected->CutMedia)
869 printf(" CutMedia %d, expected %d\n", header->CutMedia,
870 expected->CutMedia);
871
872 if (header->Duplex != expected->Duplex)
873 printf(" Duplex %d, expected %d\n", header->Duplex,
874 expected->Duplex);
875
876 if (header->HWResolution[0] != expected->HWResolution[0] ||
877 header->HWResolution[1] != expected->HWResolution[1])
878 printf(" HWResolution [%d %d], expected [%d %d]\n",
879 header->HWResolution[0], header->HWResolution[1],
880 expected->HWResolution[0], expected->HWResolution[1]);
881
882 if (memcmp(header->ImagingBoundingBox, expected->ImagingBoundingBox,
883 sizeof(header->ImagingBoundingBox)))
884 printf(" ImagingBoundingBox [%d %d %d %d], expected [%d %d %d %d]\n",
885 header->ImagingBoundingBox[0],
886 header->ImagingBoundingBox[1],
887 header->ImagingBoundingBox[2],
888 header->ImagingBoundingBox[3],
889 expected->ImagingBoundingBox[0],
890 expected->ImagingBoundingBox[1],
891 expected->ImagingBoundingBox[2],
892 expected->ImagingBoundingBox[3]);
893
894 if (header->InsertSheet != expected->InsertSheet)
895 printf(" InsertSheet %d, expected %d\n", header->InsertSheet,
896 expected->InsertSheet);
897
898 if (header->Jog != expected->Jog)
899 printf(" Jog %d, expected %d\n", header->Jog,
900 expected->Jog);
901
902 if (header->LeadingEdge != expected->LeadingEdge)
903 printf(" LeadingEdge %d, expected %d\n", header->LeadingEdge,
904 expected->LeadingEdge);
905
906 if (header->Margins[0] != expected->Margins[0] ||
907 header->Margins[1] != expected->Margins[1])
908 printf(" Margins [%d %d], expected [%d %d]\n",
909 header->Margins[0], header->Margins[1],
910 expected->Margins[0], expected->Margins[1]);
911
912 if (header->ManualFeed != expected->ManualFeed)
913 printf(" ManualFeed %d, expected %d\n", header->ManualFeed,
914 expected->ManualFeed);
915
916 if (header->MediaPosition != expected->MediaPosition)
917 printf(" MediaPosition %d, expected %d\n", header->MediaPosition,
918 expected->MediaPosition);
919
920 if (header->MediaWeight != expected->MediaWeight)
921 printf(" MediaWeight %d, expected %d\n", header->MediaWeight,
922 expected->MediaWeight);
923
924 if (header->MirrorPrint != expected->MirrorPrint)
925 printf(" MirrorPrint %d, expected %d\n", header->MirrorPrint,
926 expected->MirrorPrint);
927
928 if (header->NegativePrint != expected->NegativePrint)
929 printf(" NegativePrint %d, expected %d\n", header->NegativePrint,
930 expected->NegativePrint);
931
932 if (header->NumCopies != expected->NumCopies)
933 printf(" NumCopies %d, expected %d\n", header->NumCopies,
934 expected->NumCopies);
935
936 if (header->Orientation != expected->Orientation)
937 printf(" Orientation %d, expected %d\n", header->Orientation,
938 expected->Orientation);
939
940 if (header->OutputFaceUp != expected->OutputFaceUp)
941 printf(" OutputFaceUp %d, expected %d\n", header->OutputFaceUp,
942 expected->OutputFaceUp);
943
944 if (header->PageSize[0] != expected->PageSize[0] ||
945 header->PageSize[1] != expected->PageSize[1])
946 printf(" PageSize [%d %d], expected [%d %d]\n",
947 header->PageSize[0], header->PageSize[1],
948 expected->PageSize[0], expected->PageSize[1]);
949
950 if (header->Separations != expected->Separations)
951 printf(" Separations %d, expected %d\n", header->Separations,
952 expected->Separations);
953
954 if (header->TraySwitch != expected->TraySwitch)
955 printf(" TraySwitch %d, expected %d\n", header->TraySwitch,
956 expected->TraySwitch);
957
958 if (header->Tumble != expected->Tumble)
959 printf(" Tumble %d, expected %d\n", header->Tumble,
960 expected->Tumble);
961
962 if (header->cupsWidth != expected->cupsWidth)
963 printf(" cupsWidth %d, expected %d\n", header->cupsWidth,
964 expected->cupsWidth);
965
966 if (header->cupsHeight != expected->cupsHeight)
967 printf(" cupsHeight %d, expected %d\n", header->cupsHeight,
968 expected->cupsHeight);
969
970 if (header->cupsMediaType != expected->cupsMediaType)
971 printf(" cupsMediaType %d, expected %d\n", header->cupsMediaType,
972 expected->cupsMediaType);
973
974 if (header->cupsBitsPerColor != expected->cupsBitsPerColor)
975 printf(" cupsBitsPerColor %d, expected %d\n", header->cupsBitsPerColor,
976 expected->cupsBitsPerColor);
977
978 if (header->cupsBitsPerPixel != expected->cupsBitsPerPixel)
979 printf(" cupsBitsPerPixel %d, expected %d\n", header->cupsBitsPerPixel,
980 expected->cupsBitsPerPixel);
981
982 if (header->cupsBytesPerLine != expected->cupsBytesPerLine)
983 printf(" cupsBytesPerLine %d, expected %d\n", header->cupsBytesPerLine,
984 expected->cupsBytesPerLine);
985
986 if (header->cupsColorOrder != expected->cupsColorOrder)
987 printf(" cupsColorOrder %d, expected %d\n", header->cupsColorOrder,
988 expected->cupsColorOrder);
989
990 if (header->cupsColorSpace != expected->cupsColorSpace)
991 printf(" cupsColorSpace %d, expected %d\n", header->cupsColorSpace,
992 expected->cupsColorSpace);
993
994 if (header->cupsCompression != expected->cupsCompression)
995 printf(" cupsCompression %d, expected %d\n", header->cupsCompression,
996 expected->cupsCompression);
997
998 if (header->cupsRowCount != expected->cupsRowCount)
999 printf(" cupsRowCount %d, expected %d\n", header->cupsRowCount,
1000 expected->cupsRowCount);
1001
1002 if (header->cupsRowFeed != expected->cupsRowFeed)
1003 printf(" cupsRowFeed %d, expected %d\n", header->cupsRowFeed,
1004 expected->cupsRowFeed);
1005
1006 if (header->cupsRowStep != expected->cupsRowStep)
1007 printf(" cupsRowStep %d, expected %d\n", header->cupsRowStep,
1008 expected->cupsRowStep);
1009
1010 if (header->cupsNumColors != expected->cupsNumColors)
1011 printf(" cupsNumColors %d, expected %d\n", header->cupsNumColors,
1012 expected->cupsNumColors);
1013
7e86f2f6 1014 if (fabs(header->cupsBorderlessScalingFactor - expected->cupsBorderlessScalingFactor) > 0.001)
b86bc4cf 1015 printf(" cupsBorderlessScalingFactor %g, expected %g\n",
1016 header->cupsBorderlessScalingFactor,
1017 expected->cupsBorderlessScalingFactor);
1018
7e86f2f6
MS
1019 if (fabs(header->cupsPageSize[0] - expected->cupsPageSize[0]) > 0.001 ||
1020 fabs(header->cupsPageSize[1] - expected->cupsPageSize[1]) > 0.001)
b86bc4cf 1021 printf(" cupsPageSize [%g %g], expected [%g %g]\n",
1022 header->cupsPageSize[0], header->cupsPageSize[1],
1023 expected->cupsPageSize[0], expected->cupsPageSize[1]);
1024
7e86f2f6
MS
1025 if (fabs(header->cupsImagingBBox[0] - expected->cupsImagingBBox[0]) > 0.001 ||
1026 fabs(header->cupsImagingBBox[1] - expected->cupsImagingBBox[1]) > 0.001 ||
1027 fabs(header->cupsImagingBBox[2] - expected->cupsImagingBBox[2]) > 0.001 ||
1028 fabs(header->cupsImagingBBox[3] - expected->cupsImagingBBox[3]) > 0.001)
b86bc4cf 1029 printf(" cupsImagingBBox [%g %g %g %g], expected [%g %g %g %g]\n",
1030 header->cupsImagingBBox[0], header->cupsImagingBBox[1],
1031 header->cupsImagingBBox[2], header->cupsImagingBBox[3],
1032 expected->cupsImagingBBox[0], expected->cupsImagingBBox[1],
1033 expected->cupsImagingBBox[2], expected->cupsImagingBBox[3]);
1034
1035 for (i = 0; i < 16; i ++)
1036 if (header->cupsInteger[i] != expected->cupsInteger[i])
1037 printf(" cupsInteger%d %d, expected %d\n", i, header->cupsInteger[i],
1038 expected->cupsInteger[i]);
1039
1040 for (i = 0; i < 16; i ++)
7e86f2f6 1041 if (fabs(header->cupsReal[i] - expected->cupsReal[i]) > 0.001)
b86bc4cf 1042 printf(" cupsReal%d %g, expected %g\n", i, header->cupsReal[i],
1043 expected->cupsReal[i]);
1044
1045 for (i = 0; i < 16; i ++)
1046 if (strcmp(header->cupsString[i], expected->cupsString[i]))
1047 printf(" cupsString%d (%s), expected (%s)\n", i,
1048 header->cupsString[i], expected->cupsString[i]);
1049
1050 if (strcmp(header->cupsMarkerType, expected->cupsMarkerType))
1051 printf(" cupsMarkerType (%s), expected (%s)\n", header->cupsMarkerType,
1052 expected->cupsMarkerType);
1053
1054 if (strcmp(header->cupsRenderingIntent, expected->cupsRenderingIntent))
1055 printf(" cupsRenderingIntent (%s), expected (%s)\n",
1056 header->cupsRenderingIntent,
1057 expected->cupsRenderingIntent);
1058
1059 if (strcmp(header->cupsPageSizeName, expected->cupsPageSizeName))
1060 printf(" cupsPageSizeName (%s), expected (%s)\n",
1061 header->cupsPageSizeName,
1062 expected->cupsPageSizeName);
ef416fc2 1063}
1064
1065
1066/*
f2d18633 1067 * End of "$Id$".
ef416fc2 1068 */