]> git.ipfire.org Git - thirdparty/cups.git/blob - filter/testraster.c
d3482186dc141c8aacba3b0c62be2fd80e90f9cf
[thirdparty/cups.git] / filter / testraster.c
1 /*
2 * Raster test program routines for CUPS.
3 *
4 * Copyright 2007-2016 by Apple Inc.
5 * Copyright 1997-2007 by Easy Software Products.
6 *
7 * These coded instructions, statements, and computer programs are the
8 * property of Apple Inc. and are protected by Federal copyright
9 * law. Distribution and use rights are outlined in the file "LICENSE.txt"
10 * which should have been included with this file. If this file is
11 * file is missing or damaged, see the license at "http://www.cups.org/".
12 *
13 * This file is subject to the Apple OS-Developed Software exception.
14 */
15
16 /*
17 * Include necessary headers...
18 */
19
20 #include <cups/raster-private.h>
21 #include <cups/ppd.h>
22 #include <math.h>
23
24
25 /*
26 * Test PS commands and header...
27 */
28
29 static const char *dsc_code =
30 "[{\n"
31 "%%BeginFeature: *PageSize Tabloid\n"
32 "<</PageSize[792 1224]>>setpagedevice\n"
33 "%%EndFeature\n"
34 "} stopped cleartomark\n";
35 static const char *setpagedevice_code =
36 "<<"
37 "/MediaClass(Media Class)"
38 "/MediaColor((Media Color))"
39 "/MediaType(Media\\\\Type)"
40 "/OutputType<416263>"
41 "/AdvanceDistance 1000"
42 "/AdvanceMedia 1"
43 "/Collate false"
44 "/CutMedia 2"
45 "/Duplex true"
46 "/HWResolution[100 200]"
47 "/InsertSheet true"
48 "/Jog 3"
49 "/LeadingEdge 1"
50 "/ManualFeed true"
51 "/MediaPosition 8#777"
52 "/MediaWeight 16#fe01"
53 "/MirrorPrint true"
54 "/NegativePrint true"
55 "/NumCopies 1"
56 "/Orientation 1"
57 "/OutputFaceUp true"
58 "/PageSize[612 792.1]"
59 "/Separations true"
60 "/TraySwitch true"
61 "/Tumble true"
62 "/cupsMediaType 2"
63 "/cupsColorOrder 1"
64 "/cupsColorSpace 1"
65 "/cupsCompression 1"
66 "/cupsRowCount 1"
67 "/cupsRowFeed 1"
68 "/cupsRowStep 1"
69 "/cupsBorderlessScalingFactor 1.001"
70 "/cupsInteger0 1"
71 "/cupsInteger1 2"
72 "/cupsInteger2 3"
73 "/cupsInteger3 4"
74 "/cupsInteger4 5"
75 "/cupsInteger5 6"
76 "/cupsInteger6 7"
77 "/cupsInteger7 8"
78 "/cupsInteger8 9"
79 "/cupsInteger9 10"
80 "/cupsInteger10 11"
81 "/cupsInteger11 12"
82 "/cupsInteger12 13"
83 "/cupsInteger13 14"
84 "/cupsInteger14 15"
85 "/cupsInteger15 16"
86 "/cupsReal0 1.1"
87 "/cupsReal1 2.1"
88 "/cupsReal2 3.1"
89 "/cupsReal3 4.1"
90 "/cupsReal4 5.1"
91 "/cupsReal5 6.1"
92 "/cupsReal6 7.1"
93 "/cupsReal7 8.1"
94 "/cupsReal8 9.1"
95 "/cupsReal9 10.1"
96 "/cupsReal10 11.1"
97 "/cupsReal11 12.1"
98 "/cupsReal12 13.1"
99 "/cupsReal13 14.1"
100 "/cupsReal14 15.1"
101 "/cupsReal15 16.1"
102 "/cupsString0(1)"
103 "/cupsString1(2)"
104 "/cupsString2(3)"
105 "/cupsString3(4)"
106 "/cupsString4(5)"
107 "/cupsString5(6)"
108 "/cupsString6(7)"
109 "/cupsString7(8)"
110 "/cupsString8(9)"
111 "/cupsString9(10)"
112 "/cupsString10(11)"
113 "/cupsString11(12)"
114 "/cupsString12(13)"
115 "/cupsString13(14)"
116 "/cupsString14(15)"
117 "/cupsString15(16)"
118 "/cupsMarkerType(Marker Type)"
119 "/cupsRenderingIntent(Rendering Intent)"
120 "/cupsPageSizeName(Letter)"
121 "/cupsPreferredBitsPerColor 17"
122 ">> setpagedevice";
123
124 static cups_page_header2_t setpagedevice_header =
125 {
126 "Media Class", /* MediaClass */
127 "(Media Color)", /* MediaColor */
128 "Media\\Type", /* MediaType */
129 "Abc", /* OutputType */
130 1000, /* AdvanceDistance */
131 CUPS_ADVANCE_FILE, /* AdvanceMedia */
132 CUPS_FALSE, /* Collate */
133 CUPS_CUT_JOB, /* CutMedia */
134 CUPS_TRUE, /* Duplex */
135 { 100, 200 }, /* HWResolution */
136 { 0, 0, 0, 0 }, /* ImagingBoundingBox */
137 CUPS_TRUE, /* InsertSheet */
138 CUPS_JOG_SET, /* Jog */
139 CUPS_EDGE_RIGHT, /* LeadingEdge */
140 { 0, 0 }, /* Margins */
141 CUPS_TRUE, /* ManualFeed */
142 0777, /* MediaPosition */
143 0xfe01, /* MediaWeight */
144 CUPS_TRUE, /* MirrorPrint */
145 CUPS_TRUE, /* NegativePrint */
146 1, /* NumCopies */
147 CUPS_ORIENT_90, /* Orientation */
148 CUPS_TRUE, /* OutputFaceUp */
149 { 612, 792 }, /* PageSize */
150 CUPS_TRUE, /* Separations */
151 CUPS_TRUE, /* TraySwitch */
152 CUPS_TRUE, /* Tumble */
153 0, /* cupsWidth */
154 0, /* cupsHeight */
155 2, /* cupsMediaType */
156 0, /* cupsBitsPerColor */
157 0, /* cupsBitsPerPixel */
158 0, /* cupsBytesPerLine */
159 CUPS_ORDER_BANDED, /* cupsColorOrder */
160 CUPS_CSPACE_RGB, /* cupsColorSpace */
161 1, /* cupsCompression */
162 1, /* cupsRowCount */
163 1, /* cupsRowFeed */
164 1, /* cupsRowStep */
165 0, /* cupsNumColors */
166 1.001f, /* cupsBorderlessScalingFactor */
167 { 612.0f, 792.1f }, /* cupsPageSize */
168 { 0.0f, 0.0f, 0.0f, 0.0f }, /* cupsImagingBBox */
169 { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 },
170 /* cupsInteger[16] */
171 { 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] */
172 { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
173 "14", "15", "16" }, /* cupsString[16] */
174 "Marker Type", /* cupsMarkerType */
175 "Rendering Intent", /* cupsRenderingIntent */
176 "Letter" /* cupsPageSizeName */
177 };
178
179
180 /*
181 * Local functions...
182 */
183
184 static int do_ppd_tests(const char *filename, int num_options,
185 cups_option_t *options);
186 static int do_ps_tests(void);
187 static int do_ras_file(const char *filename);
188 static int do_raster_tests(cups_mode_t mode);
189 static void print_changes(cups_page_header2_t *header,
190 cups_page_header2_t *expected);
191
192
193 /*
194 * 'main()' - Test the raster functions.
195 */
196
197 int /* O - Exit status */
198 main(int argc, /* I - Number of command-line args */
199 char *argv[]) /* I - Command-line arguments */
200 {
201 int errors; /* Number of errors */
202 const char *ext; /* Filename extension */
203
204
205 if (argc == 1)
206 {
207 errors = do_ps_tests();
208 errors += do_raster_tests(CUPS_RASTER_WRITE);
209 errors += do_raster_tests(CUPS_RASTER_WRITE_COMPRESSED);
210 errors += do_raster_tests(CUPS_RASTER_WRITE_PWG);
211 errors += do_raster_tests(CUPS_RASTER_WRITE_APPLE);
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 ...]");
236 puts(" testraster [filename.ras ...]");
237 return (1);
238 }
239 }
240 }
241 else
242 {
243 puts("Usage: testraster [-o name=value ...] [filename.ppd ...]");
244 puts(" testraster [filename.ras ...]");
245 return (1);
246 }
247 }
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 }
255 else
256 {
257 puts("Usage: testraster [-o name=value ...] [filename.ppd ...]");
258 puts(" testraster [filename.ras ...]");
259 return (1);
260 }
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
274 static int /* O - Number of errors */
275 do_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);
302
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
323 static int
324 do_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 */
329
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
342 if (_cupsRasterExecPS(&header, &preferred_bits, setpagedevice_code))
343 {
344 puts("FAIL (error from function)");
345 puts(cupsRasterErrorString());
346 errors ++;
347 }
348 else if (preferred_bits != 17 ||
349 memcmp(&header, &setpagedevice_header, sizeof(header)))
350 {
351 puts("FAIL (bad header)");
352
353 if (preferred_bits != 17)
354 printf(" cupsPreferredBitsPerColor %d, expected 17\n",
355 preferred_bits);
356
357 print_changes(&setpagedevice_header, &header);
358 errors ++;
359 }
360 else
361 puts("PASS");
362
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)");
373 puts(cupsRasterErrorString());
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)");
396 puts(cupsRasterErrorString());
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
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
441 return (errors);
442 }
443
444
445 /*
446 * 'do_ras_file()' - Test reading of a raster file.
447 */
448
449 static int /* O - Number of errors */
450 do_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 */
459
460
461 if ((fd = open(filename, O_RDONLY)) < 0)
462 {
463 printf("%s: %s\n", filename, strerror(errno));
464 return (1);
465 }
466
467 if ((ras = cupsRasterOpen(fd, CUPS_RASTER_READ)) == NULL)
468 {
469 printf("%s: cupsRasterOpen failed.\n", filename);
470 close(fd);
471 return (1);
472 }
473
474 printf("%s:\n", filename);
475
476 while (cupsRasterReadHeader2(ras, &header))
477 {
478 pages ++;
479 data = malloc(header.cupsBytesPerLine);
480
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);
485
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);
497 }
498
499 printf("EOF at %ld\n", (long)lseek(fd, SEEK_CUR, 0));
500
501 cupsRasterClose(ras);
502 close(fd);
503
504 return (errors);
505 }
506
507
508 /*
509 * 'do_raster_tests()' - Test reading and writing of raster data.
510 */
511
512 static int /* O - Number of errors */
513 do_raster_tests(cups_mode_t mode) /* O - Write mode */
514 {
515 unsigned page, x, y; /* Looping vars */
516 FILE *fp; /* Raster file */
517 cups_raster_t *r; /* Raster stream */
518 cups_page_header2_t header, /* Page header */
519 expected; /* Expected page header */
520 unsigned char data[2048]; /* Raster data */
521 int errors = 0; /* Number of errors */
522
523
524 /*
525 * Test writing...
526 */
527
528 printf("cupsRasterOpen(%s): ",
529 mode == CUPS_RASTER_WRITE ? "CUPS_RASTER_WRITE" :
530 mode == CUPS_RASTER_WRITE_COMPRESSED ? "CUPS_RASTER_WRITE_COMPRESSED" :
531 mode == CUPS_RASTER_WRITE_PWG ? "CUPS_RASTER_WRITE_PWG" :
532 "CUPS_RASTER_WRITE_APPLE");
533 fflush(stdout);
534
535 if ((fp = fopen("test.raster", "wb")) == NULL)
536 {
537 printf("FAIL (%s)\n", strerror(errno));
538 return (1);
539 }
540
541 if ((r = cupsRasterOpen(fileno(fp), mode)) == NULL)
542 {
543 printf("FAIL (%s)\n", strerror(errno));
544 fclose(fp);
545 return (1);
546 }
547
548 puts("PASS");
549
550 for (page = 0; page < 4; page ++)
551 {
552 memset(&header, 0, sizeof(header));
553 header.cupsWidth = 256;
554 header.cupsHeight = 256;
555 header.cupsBytesPerLine = 256;
556 header.HWResolution[0] = 64;
557 header.HWResolution[1] = 64;
558 header.PageSize[0] = 288;
559 header.PageSize[1] = 288;
560 header.cupsPageSize[0] = 288.0f;
561 header.cupsPageSize[1] = 288.0f;
562
563 if (page & 1)
564 {
565 header.cupsBytesPerLine *= 4;
566 header.cupsColorSpace = CUPS_CSPACE_CMYK;
567 header.cupsColorOrder = CUPS_ORDER_CHUNKED;
568 header.cupsNumColors = 4;
569 }
570 else
571 {
572 header.cupsColorSpace = CUPS_CSPACE_W;
573 header.cupsColorOrder = CUPS_ORDER_CHUNKED;
574 header.cupsNumColors = 1;
575 }
576
577 if (page & 2)
578 {
579 header.cupsBytesPerLine *= 2;
580 header.cupsBitsPerColor = 16;
581 header.cupsBitsPerPixel = (page & 1) ? 64 : 16;
582 }
583 else
584 {
585 header.cupsBitsPerColor = 8;
586 header.cupsBitsPerPixel = (page & 1) ? 32 : 8;
587 }
588
589 if (cupsRasterWriteHeader2(r, &header))
590 puts("cupsRasterWriteHeader2: PASS");
591 else
592 {
593 puts("cupsRasterWriteHeader2: FAIL");
594 errors ++;
595 }
596
597 fputs("cupsRasterWritePixels: ", stdout);
598 fflush(stdout);
599
600 memset(data, 0, header.cupsBytesPerLine);
601 for (y = 0; y < 64; y ++)
602 if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine))
603 break;
604
605 if (y < 64)
606 {
607 puts("FAIL");
608 errors ++;
609 }
610 else
611 {
612 for (x = 0; x < header.cupsBytesPerLine; x ++)
613 data[x] = (unsigned char)x;
614
615 for (y = 0; y < 64; y ++)
616 if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine))
617 break;
618
619 if (y < 64)
620 {
621 puts("FAIL");
622 errors ++;
623 }
624 else
625 {
626 memset(data, 255, header.cupsBytesPerLine);
627 for (y = 0; y < 64; y ++)
628 if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine))
629 break;
630
631 if (y < 64)
632 {
633 puts("FAIL");
634 errors ++;
635 }
636 else
637 {
638 for (x = 0; x < header.cupsBytesPerLine; x ++)
639 data[x] = (unsigned char)(x / 4);
640
641 for (y = 0; y < 64; y ++)
642 if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine))
643 break;
644
645 if (y < 64)
646 {
647 puts("FAIL");
648 errors ++;
649 }
650 else
651 puts("PASS");
652 }
653 }
654 }
655 }
656
657 cupsRasterClose(r);
658 fclose(fp);
659
660 /*
661 * Test reading...
662 */
663
664 fputs("cupsRasterOpen(CUPS_RASTER_READ): ", stdout);
665 fflush(stdout);
666
667 if ((fp = fopen("test.raster", "rb")) == NULL)
668 {
669 printf("FAIL (%s)\n", strerror(errno));
670 return (1);
671 }
672
673 if ((r = cupsRasterOpen(fileno(fp), CUPS_RASTER_READ)) == NULL)
674 {
675 printf("FAIL (%s)\n", strerror(errno));
676 fclose(fp);
677 return (1);
678 }
679
680 puts("PASS");
681
682 for (page = 0; page < 4; page ++)
683 {
684 memset(&expected, 0, sizeof(expected));
685 expected.cupsWidth = 256;
686 expected.cupsHeight = 256;
687 expected.cupsBytesPerLine = 256;
688 expected.HWResolution[0] = 64;
689 expected.HWResolution[1] = 64;
690 expected.PageSize[0] = 288;
691 expected.PageSize[1] = 288;
692
693 if (mode != CUPS_RASTER_WRITE_PWG)
694 {
695 expected.cupsPageSize[0] = 288.0f;
696 expected.cupsPageSize[1] = 288.0f;
697 }
698
699 if (mode >= CUPS_RASTER_WRITE_PWG)
700 {
701 strlcpy(expected.MediaClass, "PwgRaster", sizeof(expected.MediaClass));
702 expected.cupsInteger[7] = 0xffffff;
703 }
704
705 if (page & 1)
706 {
707 expected.cupsBytesPerLine *= 4;
708 expected.cupsColorSpace = CUPS_CSPACE_CMYK;
709 expected.cupsColorOrder = CUPS_ORDER_CHUNKED;
710 expected.cupsNumColors = 4;
711 }
712 else
713 {
714 expected.cupsColorSpace = CUPS_CSPACE_W;
715 expected.cupsColorOrder = CUPS_ORDER_CHUNKED;
716 expected.cupsNumColors = 1;
717 }
718
719 if (page & 2)
720 {
721 expected.cupsBytesPerLine *= 2;
722 expected.cupsBitsPerColor = 16;
723 expected.cupsBitsPerPixel = (page & 1) ? 64 : 16;
724 }
725 else
726 {
727 expected.cupsBitsPerColor = 8;
728 expected.cupsBitsPerPixel = (page & 1) ? 32 : 8;
729 }
730
731 fputs("cupsRasterReadHeader2: ", stdout);
732 fflush(stdout);
733
734 if (!cupsRasterReadHeader2(r, &header))
735 {
736 puts("FAIL (read error)");
737 errors ++;
738 break;
739 }
740
741 if (memcmp(&header, &expected, sizeof(header)))
742 {
743 puts("FAIL (bad page header)");
744 errors ++;
745 print_changes(&header, &expected);
746 }
747
748 fputs("cupsRasterReadPixels: ", stdout);
749 fflush(stdout);
750
751 for (y = 0; y < 64; y ++)
752 {
753 if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine))
754 {
755 puts("FAIL (read error)");
756 errors ++;
757 break;
758 }
759
760 if (data[0] != 0 || memcmp(data, data + 1, header.cupsBytesPerLine - 1))
761 {
762 printf("FAIL (raster line %d corrupt)\n", y);
763 errors ++;
764 break;
765 }
766 }
767
768 if (y == 64)
769 {
770 for (y = 0; y < 64; y ++)
771 {
772 if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine))
773 {
774 puts("FAIL (read error)");
775 errors ++;
776 break;
777 }
778
779 for (x = 0; x < header.cupsBytesPerLine; x ++)
780 if (data[x] != (x & 255))
781 break;
782
783 if (x < header.cupsBytesPerLine)
784 {
785 printf("FAIL (raster line %d corrupt)\n", y + 64);
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 if (data[0] != 255 || memcmp(data, data + 1, header.cupsBytesPerLine - 1))
803 {
804 printf("fail (raster line %d corrupt)\n", y + 128);
805 errors ++;
806 break;
807 }
808 }
809
810 if (y == 64)
811 {
812 for (y = 0; y < 64; y ++)
813 {
814 if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine))
815 {
816 puts("FAIL (read error)");
817 errors ++;
818 break;
819 }
820
821 for (x = 0; x < header.cupsBytesPerLine; x ++)
822 if (data[x] != ((x / 4) & 255))
823 break;
824
825 if (x < header.cupsBytesPerLine)
826 {
827 printf("FAIL (raster line %d corrupt)\n", y + 192);
828 errors ++;
829 break;
830 }
831 }
832
833 if (y == 64)
834 puts("PASS");
835 }
836 }
837 }
838 }
839
840 cupsRasterClose(r);
841 fclose(fp);
842
843 return (errors);
844 }
845
846
847 /*
848 * 'print_changes()' - Print differences in the page header.
849 */
850
851 static void
852 print_changes(
853 cups_page_header2_t *header, /* I - Actual page header */
854 cups_page_header2_t *expected) /* I - Expected page header */
855 {
856 int i; /* Looping var */
857
858
859 if (strcmp(header->MediaClass, expected->MediaClass))
860 printf(" MediaClass (%s), expected (%s)\n", header->MediaClass,
861 expected->MediaClass);
862
863 if (strcmp(header->MediaColor, expected->MediaColor))
864 printf(" MediaColor (%s), expected (%s)\n", header->MediaColor,
865 expected->MediaColor);
866
867 if (strcmp(header->MediaType, expected->MediaType))
868 printf(" MediaType (%s), expected (%s)\n", header->MediaType,
869 expected->MediaType);
870
871 if (strcmp(header->OutputType, expected->OutputType))
872 printf(" OutputType (%s), expected (%s)\n", header->OutputType,
873 expected->OutputType);
874
875 if (header->AdvanceDistance != expected->AdvanceDistance)
876 printf(" AdvanceDistance %d, expected %d\n", header->AdvanceDistance,
877 expected->AdvanceDistance);
878
879 if (header->AdvanceMedia != expected->AdvanceMedia)
880 printf(" AdvanceMedia %d, expected %d\n", header->AdvanceMedia,
881 expected->AdvanceMedia);
882
883 if (header->Collate != expected->Collate)
884 printf(" Collate %d, expected %d\n", header->Collate,
885 expected->Collate);
886
887 if (header->CutMedia != expected->CutMedia)
888 printf(" CutMedia %d, expected %d\n", header->CutMedia,
889 expected->CutMedia);
890
891 if (header->Duplex != expected->Duplex)
892 printf(" Duplex %d, expected %d\n", header->Duplex,
893 expected->Duplex);
894
895 if (header->HWResolution[0] != expected->HWResolution[0] ||
896 header->HWResolution[1] != expected->HWResolution[1])
897 printf(" HWResolution [%d %d], expected [%d %d]\n",
898 header->HWResolution[0], header->HWResolution[1],
899 expected->HWResolution[0], expected->HWResolution[1]);
900
901 if (memcmp(header->ImagingBoundingBox, expected->ImagingBoundingBox,
902 sizeof(header->ImagingBoundingBox)))
903 printf(" ImagingBoundingBox [%d %d %d %d], expected [%d %d %d %d]\n",
904 header->ImagingBoundingBox[0],
905 header->ImagingBoundingBox[1],
906 header->ImagingBoundingBox[2],
907 header->ImagingBoundingBox[3],
908 expected->ImagingBoundingBox[0],
909 expected->ImagingBoundingBox[1],
910 expected->ImagingBoundingBox[2],
911 expected->ImagingBoundingBox[3]);
912
913 if (header->InsertSheet != expected->InsertSheet)
914 printf(" InsertSheet %d, expected %d\n", header->InsertSheet,
915 expected->InsertSheet);
916
917 if (header->Jog != expected->Jog)
918 printf(" Jog %d, expected %d\n", header->Jog,
919 expected->Jog);
920
921 if (header->LeadingEdge != expected->LeadingEdge)
922 printf(" LeadingEdge %d, expected %d\n", header->LeadingEdge,
923 expected->LeadingEdge);
924
925 if (header->Margins[0] != expected->Margins[0] ||
926 header->Margins[1] != expected->Margins[1])
927 printf(" Margins [%d %d], expected [%d %d]\n",
928 header->Margins[0], header->Margins[1],
929 expected->Margins[0], expected->Margins[1]);
930
931 if (header->ManualFeed != expected->ManualFeed)
932 printf(" ManualFeed %d, expected %d\n", header->ManualFeed,
933 expected->ManualFeed);
934
935 if (header->MediaPosition != expected->MediaPosition)
936 printf(" MediaPosition %d, expected %d\n", header->MediaPosition,
937 expected->MediaPosition);
938
939 if (header->MediaWeight != expected->MediaWeight)
940 printf(" MediaWeight %d, expected %d\n", header->MediaWeight,
941 expected->MediaWeight);
942
943 if (header->MirrorPrint != expected->MirrorPrint)
944 printf(" MirrorPrint %d, expected %d\n", header->MirrorPrint,
945 expected->MirrorPrint);
946
947 if (header->NegativePrint != expected->NegativePrint)
948 printf(" NegativePrint %d, expected %d\n", header->NegativePrint,
949 expected->NegativePrint);
950
951 if (header->NumCopies != expected->NumCopies)
952 printf(" NumCopies %d, expected %d\n", header->NumCopies,
953 expected->NumCopies);
954
955 if (header->Orientation != expected->Orientation)
956 printf(" Orientation %d, expected %d\n", header->Orientation,
957 expected->Orientation);
958
959 if (header->OutputFaceUp != expected->OutputFaceUp)
960 printf(" OutputFaceUp %d, expected %d\n", header->OutputFaceUp,
961 expected->OutputFaceUp);
962
963 if (header->PageSize[0] != expected->PageSize[0] ||
964 header->PageSize[1] != expected->PageSize[1])
965 printf(" PageSize [%d %d], expected [%d %d]\n",
966 header->PageSize[0], header->PageSize[1],
967 expected->PageSize[0], expected->PageSize[1]);
968
969 if (header->Separations != expected->Separations)
970 printf(" Separations %d, expected %d\n", header->Separations,
971 expected->Separations);
972
973 if (header->TraySwitch != expected->TraySwitch)
974 printf(" TraySwitch %d, expected %d\n", header->TraySwitch,
975 expected->TraySwitch);
976
977 if (header->Tumble != expected->Tumble)
978 printf(" Tumble %d, expected %d\n", header->Tumble,
979 expected->Tumble);
980
981 if (header->cupsWidth != expected->cupsWidth)
982 printf(" cupsWidth %d, expected %d\n", header->cupsWidth,
983 expected->cupsWidth);
984
985 if (header->cupsHeight != expected->cupsHeight)
986 printf(" cupsHeight %d, expected %d\n", header->cupsHeight,
987 expected->cupsHeight);
988
989 if (header->cupsMediaType != expected->cupsMediaType)
990 printf(" cupsMediaType %d, expected %d\n", header->cupsMediaType,
991 expected->cupsMediaType);
992
993 if (header->cupsBitsPerColor != expected->cupsBitsPerColor)
994 printf(" cupsBitsPerColor %d, expected %d\n", header->cupsBitsPerColor,
995 expected->cupsBitsPerColor);
996
997 if (header->cupsBitsPerPixel != expected->cupsBitsPerPixel)
998 printf(" cupsBitsPerPixel %d, expected %d\n", header->cupsBitsPerPixel,
999 expected->cupsBitsPerPixel);
1000
1001 if (header->cupsBytesPerLine != expected->cupsBytesPerLine)
1002 printf(" cupsBytesPerLine %d, expected %d\n", header->cupsBytesPerLine,
1003 expected->cupsBytesPerLine);
1004
1005 if (header->cupsColorOrder != expected->cupsColorOrder)
1006 printf(" cupsColorOrder %d, expected %d\n", header->cupsColorOrder,
1007 expected->cupsColorOrder);
1008
1009 if (header->cupsColorSpace != expected->cupsColorSpace)
1010 printf(" cupsColorSpace %d, expected %d\n", header->cupsColorSpace,
1011 expected->cupsColorSpace);
1012
1013 if (header->cupsCompression != expected->cupsCompression)
1014 printf(" cupsCompression %d, expected %d\n", header->cupsCompression,
1015 expected->cupsCompression);
1016
1017 if (header->cupsRowCount != expected->cupsRowCount)
1018 printf(" cupsRowCount %d, expected %d\n", header->cupsRowCount,
1019 expected->cupsRowCount);
1020
1021 if (header->cupsRowFeed != expected->cupsRowFeed)
1022 printf(" cupsRowFeed %d, expected %d\n", header->cupsRowFeed,
1023 expected->cupsRowFeed);
1024
1025 if (header->cupsRowStep != expected->cupsRowStep)
1026 printf(" cupsRowStep %d, expected %d\n", header->cupsRowStep,
1027 expected->cupsRowStep);
1028
1029 if (header->cupsNumColors != expected->cupsNumColors)
1030 printf(" cupsNumColors %d, expected %d\n", header->cupsNumColors,
1031 expected->cupsNumColors);
1032
1033 if (fabs(header->cupsBorderlessScalingFactor - expected->cupsBorderlessScalingFactor) > 0.001)
1034 printf(" cupsBorderlessScalingFactor %g, expected %g\n",
1035 header->cupsBorderlessScalingFactor,
1036 expected->cupsBorderlessScalingFactor);
1037
1038 if (fabs(header->cupsPageSize[0] - expected->cupsPageSize[0]) > 0.001 ||
1039 fabs(header->cupsPageSize[1] - expected->cupsPageSize[1]) > 0.001)
1040 printf(" cupsPageSize [%g %g], expected [%g %g]\n",
1041 header->cupsPageSize[0], header->cupsPageSize[1],
1042 expected->cupsPageSize[0], expected->cupsPageSize[1]);
1043
1044 if (fabs(header->cupsImagingBBox[0] - expected->cupsImagingBBox[0]) > 0.001 ||
1045 fabs(header->cupsImagingBBox[1] - expected->cupsImagingBBox[1]) > 0.001 ||
1046 fabs(header->cupsImagingBBox[2] - expected->cupsImagingBBox[2]) > 0.001 ||
1047 fabs(header->cupsImagingBBox[3] - expected->cupsImagingBBox[3]) > 0.001)
1048 printf(" cupsImagingBBox [%g %g %g %g], expected [%g %g %g %g]\n",
1049 header->cupsImagingBBox[0], header->cupsImagingBBox[1],
1050 header->cupsImagingBBox[2], header->cupsImagingBBox[3],
1051 expected->cupsImagingBBox[0], expected->cupsImagingBBox[1],
1052 expected->cupsImagingBBox[2], expected->cupsImagingBBox[3]);
1053
1054 for (i = 0; i < 16; i ++)
1055 if (header->cupsInteger[i] != expected->cupsInteger[i])
1056 printf(" cupsInteger%d %d, expected %d\n", i, header->cupsInteger[i],
1057 expected->cupsInteger[i]);
1058
1059 for (i = 0; i < 16; i ++)
1060 if (fabs(header->cupsReal[i] - expected->cupsReal[i]) > 0.001)
1061 printf(" cupsReal%d %g, expected %g\n", i, header->cupsReal[i],
1062 expected->cupsReal[i]);
1063
1064 for (i = 0; i < 16; i ++)
1065 if (strcmp(header->cupsString[i], expected->cupsString[i]))
1066 printf(" cupsString%d (%s), expected (%s)\n", i,
1067 header->cupsString[i], expected->cupsString[i]);
1068
1069 if (strcmp(header->cupsMarkerType, expected->cupsMarkerType))
1070 printf(" cupsMarkerType (%s), expected (%s)\n", header->cupsMarkerType,
1071 expected->cupsMarkerType);
1072
1073 if (strcmp(header->cupsRenderingIntent, expected->cupsRenderingIntent))
1074 printf(" cupsRenderingIntent (%s), expected (%s)\n",
1075 header->cupsRenderingIntent,
1076 expected->cupsRenderingIntent);
1077
1078 if (strcmp(header->cupsPageSizeName, expected->cupsPageSizeName))
1079 printf(" cupsPageSizeName (%s), expected (%s)\n",
1080 header->cupsPageSizeName,
1081 expected->cupsPageSizeName);
1082 }