2 * Raster test program routines for CUPS.
4 * Copyright © 2007-2018 by Apple Inc.
5 * Copyright © 1997-2007 by Easy Software Products.
7 * Licensed under Apache License v2.0. See the file "LICENSE" for more
12 * Include necessary headers...
15 #include <cups/raster-private.h>
23 static int do_ras_file(const char *filename
);
24 static int do_raster_tests(cups_mode_t mode
);
25 static void print_changes(cups_page_header2_t
*header
,
26 cups_page_header2_t
*expected
);
30 * 'main()' - Test the raster functions.
33 int /* O - Exit status */
34 main(int argc
, /* I - Number of command-line args */
35 char *argv
[]) /* I - Command-line arguments */
37 int errors
= 0; /* Number of errors */
42 errors
+= do_raster_tests(CUPS_RASTER_WRITE
);
43 errors
+= do_raster_tests(CUPS_RASTER_WRITE_COMPRESSED
);
44 errors
+= do_raster_tests(CUPS_RASTER_WRITE_PWG
);
45 errors
+= do_raster_tests(CUPS_RASTER_WRITE_APPLE
);
49 int i
; /* Looping var */
51 for (i
= 1; i
< argc
; i
++)
52 errors
+= do_ras_file(argv
[i
]);
60 * 'do_ras_file()' - Test reading of a raster file.
63 static int /* O - Number of errors */
64 do_ras_file(const char *filename
) /* I - Filename */
66 unsigned y
; /* Looping vars */
67 int fd
; /* File descriptor */
68 cups_raster_t
*ras
; /* Raster stream */
69 cups_page_header2_t header
; /* Page header */
70 unsigned char *data
; /* Raster data */
71 int errors
= 0; /* Number of errors */
72 unsigned pages
= 0; /* Number of pages */
75 if ((fd
= open(filename
, O_RDONLY
)) < 0)
77 printf("%s: %s\n", filename
, strerror(errno
));
81 if ((ras
= cupsRasterOpen(fd
, CUPS_RASTER_READ
)) == NULL
)
83 printf("%s: cupsRasterOpen failed.\n", filename
);
88 printf("%s:\n", filename
);
90 while (cupsRasterReadHeader2(ras
, &header
))
93 data
= malloc(header
.cupsBytesPerLine
);
95 printf(" Page %u: %ux%ux%u@%ux%udpi", pages
,
96 header
.cupsWidth
, header
.cupsHeight
, header
.cupsBitsPerPixel
,
97 header
.HWResolution
[0], header
.HWResolution
[1]);
100 for (y
= 0; y
< header
.cupsHeight
; y
++)
101 if (cupsRasterReadPixels(ras
, data
, header
.cupsBytesPerLine
) <
102 header
.cupsBytesPerLine
)
105 if (y
< header
.cupsHeight
)
106 printf(" ERROR AT LINE %d\n", y
);
113 printf("EOF at %ld\n", (long)lseek(fd
, SEEK_CUR
, 0));
115 cupsRasterClose(ras
);
123 * 'do_raster_tests()' - Test reading and writing of raster data.
126 static int /* O - Number of errors */
127 do_raster_tests(cups_mode_t mode
) /* O - Write mode */
129 unsigned page
, x
, y
, count
;/* Looping vars */
130 FILE *fp
; /* Raster file */
131 cups_raster_t
*r
; /* Raster stream */
132 cups_page_header2_t header
, /* Page header */
133 expected
; /* Expected page header */
134 unsigned char data
[2048]; /* Raster data */
135 int errors
= 0; /* Number of errors */
142 printf("cupsRasterOpen(%s): ",
143 mode
== CUPS_RASTER_WRITE
? "CUPS_RASTER_WRITE" :
144 mode
== CUPS_RASTER_WRITE_COMPRESSED
? "CUPS_RASTER_WRITE_COMPRESSED" :
145 mode
== CUPS_RASTER_WRITE_PWG
? "CUPS_RASTER_WRITE_PWG" :
146 "CUPS_RASTER_WRITE_APPLE");
149 if ((fp
= fopen("test.raster", "wb")) == NULL
)
151 printf("FAIL (%s)\n", strerror(errno
));
155 if ((r
= cupsRasterOpen(fileno(fp
), mode
)) == NULL
)
157 printf("FAIL (%s)\n", strerror(errno
));
164 for (page
= 0; page
< 4; page
++)
166 memset(&header
, 0, sizeof(header
));
167 header
.cupsWidth
= 256;
168 header
.cupsHeight
= 256;
169 header
.cupsBytesPerLine
= 256;
170 header
.HWResolution
[0] = 64;
171 header
.HWResolution
[1] = 64;
172 header
.PageSize
[0] = 288;
173 header
.PageSize
[1] = 288;
174 header
.cupsPageSize
[0] = 288.0f
;
175 header
.cupsPageSize
[1] = 288.0f
;
179 header
.cupsBytesPerLine
*= 4;
180 header
.cupsColorSpace
= CUPS_CSPACE_CMYK
;
181 header
.cupsColorOrder
= CUPS_ORDER_CHUNKED
;
182 header
.cupsNumColors
= 4;
186 header
.cupsColorSpace
= CUPS_CSPACE_W
;
187 header
.cupsColorOrder
= CUPS_ORDER_CHUNKED
;
188 header
.cupsNumColors
= 1;
193 header
.cupsBytesPerLine
*= 2;
194 header
.cupsBitsPerColor
= 16;
195 header
.cupsBitsPerPixel
= (page
& 1) ? 64 : 16;
199 header
.cupsBitsPerColor
= 8;
200 header
.cupsBitsPerPixel
= (page
& 1) ? 32 : 8;
203 printf("cupsRasterWriteHeader2(page %d): ", page
+ 1);
205 if (cupsRasterWriteHeader2(r
, &header
))
215 fputs("cupsRasterWritePixels: ", stdout
);
218 memset(data
, 0, header
.cupsBytesPerLine
);
219 for (y
= 0; y
< 64; y
++)
220 if (!cupsRasterWritePixels(r
, data
, header
.cupsBytesPerLine
))
230 for (x
= 0; x
< header
.cupsBytesPerLine
; x
++)
231 data
[x
] = (unsigned char)x
;
233 for (y
= 0; y
< 64; y
++)
234 if (!cupsRasterWritePixels(r
, data
, header
.cupsBytesPerLine
))
244 memset(data
, 255, header
.cupsBytesPerLine
);
245 for (y
= 0; y
< 64; y
++)
246 if (!cupsRasterWritePixels(r
, data
, header
.cupsBytesPerLine
))
256 for (x
= 0; x
< header
.cupsBytesPerLine
; x
++)
257 data
[x
] = (unsigned char)(x
/ 4);
259 for (y
= 0; y
< 64; y
++)
260 if (!cupsRasterWritePixels(r
, data
, header
.cupsBytesPerLine
))
282 fputs("cupsRasterOpen(CUPS_RASTER_READ): ", stdout
);
285 if ((fp
= fopen("test.raster", "rb")) == NULL
)
287 printf("FAIL (%s)\n", strerror(errno
));
291 if ((r
= cupsRasterOpen(fileno(fp
), CUPS_RASTER_READ
)) == NULL
)
293 printf("FAIL (%s)\n", strerror(errno
));
300 for (page
= 0; page
< 4; page
++)
302 memset(&expected
, 0, sizeof(expected
));
303 expected
.cupsWidth
= 256;
304 expected
.cupsHeight
= 256;
305 expected
.cupsBytesPerLine
= 256;
306 expected
.HWResolution
[0] = 64;
307 expected
.HWResolution
[1] = 64;
308 expected
.PageSize
[0] = 288;
309 expected
.PageSize
[1] = 288;
311 if (mode
!= CUPS_RASTER_WRITE_PWG
)
313 expected
.cupsPageSize
[0] = 288.0f
;
314 expected
.cupsPageSize
[1] = 288.0f
;
317 if (mode
>= CUPS_RASTER_WRITE_PWG
)
319 strlcpy(expected
.MediaClass
, "PwgRaster", sizeof(expected
.MediaClass
));
320 expected
.cupsInteger
[7] = 0xffffff;
325 expected
.cupsBytesPerLine
*= 4;
326 expected
.cupsColorSpace
= CUPS_CSPACE_CMYK
;
327 expected
.cupsColorOrder
= CUPS_ORDER_CHUNKED
;
328 expected
.cupsNumColors
= 4;
332 expected
.cupsColorSpace
= CUPS_CSPACE_W
;
333 expected
.cupsColorOrder
= CUPS_ORDER_CHUNKED
;
334 expected
.cupsNumColors
= 1;
339 expected
.cupsBytesPerLine
*= 2;
340 expected
.cupsBitsPerColor
= 16;
341 expected
.cupsBitsPerPixel
= (page
& 1) ? 64 : 16;
345 expected
.cupsBitsPerColor
= 8;
346 expected
.cupsBitsPerPixel
= (page
& 1) ? 32 : 8;
349 printf("cupsRasterReadHeader2(page %d): ", page
+ 1);
352 if (!cupsRasterReadHeader2(r
, &header
))
354 puts("FAIL (read error)");
358 else if (memcmp(&header
, &expected
, sizeof(header
)))
360 puts("FAIL (bad page header)");
362 print_changes(&header
, &expected
);
367 fputs("cupsRasterReadPixels: ", stdout
);
370 for (y
= 0; y
< 64; y
++)
372 if (!cupsRasterReadPixels(r
, data
, header
.cupsBytesPerLine
))
374 puts("FAIL (read error)");
379 if (data
[0] != 0 || memcmp(data
, data
+ 1, header
.cupsBytesPerLine
- 1))
381 printf("FAIL (raster line %d corrupt)\n", y
);
383 for (x
= 0, count
= 0; x
< header
.cupsBytesPerLine
&& count
< 10; x
++)
392 printf(" %4u %02X (expected %02X)\n", x
, data
[x
], 0);
403 for (y
= 0; y
< 64; y
++)
405 if (!cupsRasterReadPixels(r
, data
, header
.cupsBytesPerLine
))
407 puts("FAIL (read error)");
412 for (x
= 0; x
< header
.cupsBytesPerLine
; x
++)
413 if (data
[x
] != (x
& 255))
416 if (x
< header
.cupsBytesPerLine
)
418 printf("FAIL (raster line %d corrupt)\n", y
+ 64);
420 for (x
= 0, count
= 0; x
< header
.cupsBytesPerLine
&& count
< 10; x
++)
422 if (data
[x
] != (x
& 255))
429 printf(" %4u %02X (expected %02X)\n", x
, data
[x
], x
& 255);
440 for (y
= 0; y
< 64; y
++)
442 if (!cupsRasterReadPixels(r
, data
, header
.cupsBytesPerLine
))
444 puts("FAIL (read error)");
449 if (data
[0] != 255 || memcmp(data
, data
+ 1, header
.cupsBytesPerLine
- 1))
451 printf("fail (raster line %d corrupt)\n", y
+ 128);
453 for (x
= 0, count
= 0; x
< header
.cupsBytesPerLine
&& count
< 10; x
++)
462 printf(" %4u %02X (expected %02X)\n", x
, data
[x
], 255);
473 for (y
= 0; y
< 64; y
++)
475 if (!cupsRasterReadPixels(r
, data
, header
.cupsBytesPerLine
))
477 puts("FAIL (read error)");
482 for (x
= 0; x
< header
.cupsBytesPerLine
; x
++)
483 if (data
[x
] != ((x
/ 4) & 255))
486 if (x
< header
.cupsBytesPerLine
)
488 printf("FAIL (raster line %d corrupt)\n", y
+ 192);
490 for (x
= 0, count
= 0; x
< header
.cupsBytesPerLine
&& count
< 10; x
++)
492 if (data
[x
] != ((x
/ 4) & 255))
499 printf(" %4u %02X (expected %02X)\n", x
, data
[x
], (x
/ 4) & 255);
523 * 'print_changes()' - Print differences in the page header.
528 cups_page_header2_t
*header
, /* I - Actual page header */
529 cups_page_header2_t
*expected
) /* I - Expected page header */
531 int i
; /* Looping var */
534 if (strcmp(header
->MediaClass
, expected
->MediaClass
))
535 printf(" MediaClass (%s), expected (%s)\n", header
->MediaClass
,
536 expected
->MediaClass
);
538 if (strcmp(header
->MediaColor
, expected
->MediaColor
))
539 printf(" MediaColor (%s), expected (%s)\n", header
->MediaColor
,
540 expected
->MediaColor
);
542 if (strcmp(header
->MediaType
, expected
->MediaType
))
543 printf(" MediaType (%s), expected (%s)\n", header
->MediaType
,
544 expected
->MediaType
);
546 if (strcmp(header
->OutputType
, expected
->OutputType
))
547 printf(" OutputType (%s), expected (%s)\n", header
->OutputType
,
548 expected
->OutputType
);
550 if (header
->AdvanceDistance
!= expected
->AdvanceDistance
)
551 printf(" AdvanceDistance %d, expected %d\n", header
->AdvanceDistance
,
552 expected
->AdvanceDistance
);
554 if (header
->AdvanceMedia
!= expected
->AdvanceMedia
)
555 printf(" AdvanceMedia %d, expected %d\n", header
->AdvanceMedia
,
556 expected
->AdvanceMedia
);
558 if (header
->Collate
!= expected
->Collate
)
559 printf(" Collate %d, expected %d\n", header
->Collate
,
562 if (header
->CutMedia
!= expected
->CutMedia
)
563 printf(" CutMedia %d, expected %d\n", header
->CutMedia
,
566 if (header
->Duplex
!= expected
->Duplex
)
567 printf(" Duplex %d, expected %d\n", header
->Duplex
,
570 if (header
->HWResolution
[0] != expected
->HWResolution
[0] ||
571 header
->HWResolution
[1] != expected
->HWResolution
[1])
572 printf(" HWResolution [%d %d], expected [%d %d]\n",
573 header
->HWResolution
[0], header
->HWResolution
[1],
574 expected
->HWResolution
[0], expected
->HWResolution
[1]);
576 if (memcmp(header
->ImagingBoundingBox
, expected
->ImagingBoundingBox
,
577 sizeof(header
->ImagingBoundingBox
)))
578 printf(" ImagingBoundingBox [%d %d %d %d], expected [%d %d %d %d]\n",
579 header
->ImagingBoundingBox
[0],
580 header
->ImagingBoundingBox
[1],
581 header
->ImagingBoundingBox
[2],
582 header
->ImagingBoundingBox
[3],
583 expected
->ImagingBoundingBox
[0],
584 expected
->ImagingBoundingBox
[1],
585 expected
->ImagingBoundingBox
[2],
586 expected
->ImagingBoundingBox
[3]);
588 if (header
->InsertSheet
!= expected
->InsertSheet
)
589 printf(" InsertSheet %d, expected %d\n", header
->InsertSheet
,
590 expected
->InsertSheet
);
592 if (header
->Jog
!= expected
->Jog
)
593 printf(" Jog %d, expected %d\n", header
->Jog
,
596 if (header
->LeadingEdge
!= expected
->LeadingEdge
)
597 printf(" LeadingEdge %d, expected %d\n", header
->LeadingEdge
,
598 expected
->LeadingEdge
);
600 if (header
->Margins
[0] != expected
->Margins
[0] ||
601 header
->Margins
[1] != expected
->Margins
[1])
602 printf(" Margins [%d %d], expected [%d %d]\n",
603 header
->Margins
[0], header
->Margins
[1],
604 expected
->Margins
[0], expected
->Margins
[1]);
606 if (header
->ManualFeed
!= expected
->ManualFeed
)
607 printf(" ManualFeed %d, expected %d\n", header
->ManualFeed
,
608 expected
->ManualFeed
);
610 if (header
->MediaPosition
!= expected
->MediaPosition
)
611 printf(" MediaPosition %d, expected %d\n", header
->MediaPosition
,
612 expected
->MediaPosition
);
614 if (header
->MediaWeight
!= expected
->MediaWeight
)
615 printf(" MediaWeight %d, expected %d\n", header
->MediaWeight
,
616 expected
->MediaWeight
);
618 if (header
->MirrorPrint
!= expected
->MirrorPrint
)
619 printf(" MirrorPrint %d, expected %d\n", header
->MirrorPrint
,
620 expected
->MirrorPrint
);
622 if (header
->NegativePrint
!= expected
->NegativePrint
)
623 printf(" NegativePrint %d, expected %d\n", header
->NegativePrint
,
624 expected
->NegativePrint
);
626 if (header
->NumCopies
!= expected
->NumCopies
)
627 printf(" NumCopies %d, expected %d\n", header
->NumCopies
,
628 expected
->NumCopies
);
630 if (header
->Orientation
!= expected
->Orientation
)
631 printf(" Orientation %d, expected %d\n", header
->Orientation
,
632 expected
->Orientation
);
634 if (header
->OutputFaceUp
!= expected
->OutputFaceUp
)
635 printf(" OutputFaceUp %d, expected %d\n", header
->OutputFaceUp
,
636 expected
->OutputFaceUp
);
638 if (header
->PageSize
[0] != expected
->PageSize
[0] ||
639 header
->PageSize
[1] != expected
->PageSize
[1])
640 printf(" PageSize [%d %d], expected [%d %d]\n",
641 header
->PageSize
[0], header
->PageSize
[1],
642 expected
->PageSize
[0], expected
->PageSize
[1]);
644 if (header
->Separations
!= expected
->Separations
)
645 printf(" Separations %d, expected %d\n", header
->Separations
,
646 expected
->Separations
);
648 if (header
->TraySwitch
!= expected
->TraySwitch
)
649 printf(" TraySwitch %d, expected %d\n", header
->TraySwitch
,
650 expected
->TraySwitch
);
652 if (header
->Tumble
!= expected
->Tumble
)
653 printf(" Tumble %d, expected %d\n", header
->Tumble
,
656 if (header
->cupsWidth
!= expected
->cupsWidth
)
657 printf(" cupsWidth %d, expected %d\n", header
->cupsWidth
,
658 expected
->cupsWidth
);
660 if (header
->cupsHeight
!= expected
->cupsHeight
)
661 printf(" cupsHeight %d, expected %d\n", header
->cupsHeight
,
662 expected
->cupsHeight
);
664 if (header
->cupsMediaType
!= expected
->cupsMediaType
)
665 printf(" cupsMediaType %d, expected %d\n", header
->cupsMediaType
,
666 expected
->cupsMediaType
);
668 if (header
->cupsBitsPerColor
!= expected
->cupsBitsPerColor
)
669 printf(" cupsBitsPerColor %d, expected %d\n", header
->cupsBitsPerColor
,
670 expected
->cupsBitsPerColor
);
672 if (header
->cupsBitsPerPixel
!= expected
->cupsBitsPerPixel
)
673 printf(" cupsBitsPerPixel %d, expected %d\n", header
->cupsBitsPerPixel
,
674 expected
->cupsBitsPerPixel
);
676 if (header
->cupsBytesPerLine
!= expected
->cupsBytesPerLine
)
677 printf(" cupsBytesPerLine %d, expected %d\n", header
->cupsBytesPerLine
,
678 expected
->cupsBytesPerLine
);
680 if (header
->cupsColorOrder
!= expected
->cupsColorOrder
)
681 printf(" cupsColorOrder %d, expected %d\n", header
->cupsColorOrder
,
682 expected
->cupsColorOrder
);
684 if (header
->cupsColorSpace
!= expected
->cupsColorSpace
)
685 printf(" cupsColorSpace %d, expected %d\n", header
->cupsColorSpace
,
686 expected
->cupsColorSpace
);
688 if (header
->cupsCompression
!= expected
->cupsCompression
)
689 printf(" cupsCompression %d, expected %d\n", header
->cupsCompression
,
690 expected
->cupsCompression
);
692 if (header
->cupsRowCount
!= expected
->cupsRowCount
)
693 printf(" cupsRowCount %d, expected %d\n", header
->cupsRowCount
,
694 expected
->cupsRowCount
);
696 if (header
->cupsRowFeed
!= expected
->cupsRowFeed
)
697 printf(" cupsRowFeed %d, expected %d\n", header
->cupsRowFeed
,
698 expected
->cupsRowFeed
);
700 if (header
->cupsRowStep
!= expected
->cupsRowStep
)
701 printf(" cupsRowStep %d, expected %d\n", header
->cupsRowStep
,
702 expected
->cupsRowStep
);
704 if (header
->cupsNumColors
!= expected
->cupsNumColors
)
705 printf(" cupsNumColors %d, expected %d\n", header
->cupsNumColors
,
706 expected
->cupsNumColors
);
708 if (fabs(header
->cupsBorderlessScalingFactor
- expected
->cupsBorderlessScalingFactor
) > 0.001)
709 printf(" cupsBorderlessScalingFactor %g, expected %g\n",
710 header
->cupsBorderlessScalingFactor
,
711 expected
->cupsBorderlessScalingFactor
);
713 if (fabs(header
->cupsPageSize
[0] - expected
->cupsPageSize
[0]) > 0.001 ||
714 fabs(header
->cupsPageSize
[1] - expected
->cupsPageSize
[1]) > 0.001)
715 printf(" cupsPageSize [%g %g], expected [%g %g]\n",
716 header
->cupsPageSize
[0], header
->cupsPageSize
[1],
717 expected
->cupsPageSize
[0], expected
->cupsPageSize
[1]);
719 if (fabs(header
->cupsImagingBBox
[0] - expected
->cupsImagingBBox
[0]) > 0.001 ||
720 fabs(header
->cupsImagingBBox
[1] - expected
->cupsImagingBBox
[1]) > 0.001 ||
721 fabs(header
->cupsImagingBBox
[2] - expected
->cupsImagingBBox
[2]) > 0.001 ||
722 fabs(header
->cupsImagingBBox
[3] - expected
->cupsImagingBBox
[3]) > 0.001)
723 printf(" cupsImagingBBox [%g %g %g %g], expected [%g %g %g %g]\n",
724 header
->cupsImagingBBox
[0], header
->cupsImagingBBox
[1],
725 header
->cupsImagingBBox
[2], header
->cupsImagingBBox
[3],
726 expected
->cupsImagingBBox
[0], expected
->cupsImagingBBox
[1],
727 expected
->cupsImagingBBox
[2], expected
->cupsImagingBBox
[3]);
729 for (i
= 0; i
< 16; i
++)
730 if (header
->cupsInteger
[i
] != expected
->cupsInteger
[i
])
731 printf(" cupsInteger%d %d, expected %d\n", i
, header
->cupsInteger
[i
],
732 expected
->cupsInteger
[i
]);
734 for (i
= 0; i
< 16; i
++)
735 if (fabs(header
->cupsReal
[i
] - expected
->cupsReal
[i
]) > 0.001)
736 printf(" cupsReal%d %g, expected %g\n", i
, header
->cupsReal
[i
],
737 expected
->cupsReal
[i
]);
739 for (i
= 0; i
< 16; i
++)
740 if (strcmp(header
->cupsString
[i
], expected
->cupsString
[i
]))
741 printf(" cupsString%d (%s), expected (%s)\n", i
,
742 header
->cupsString
[i
], expected
->cupsString
[i
]);
744 if (strcmp(header
->cupsMarkerType
, expected
->cupsMarkerType
))
745 printf(" cupsMarkerType (%s), expected (%s)\n", header
->cupsMarkerType
,
746 expected
->cupsMarkerType
);
748 if (strcmp(header
->cupsRenderingIntent
, expected
->cupsRenderingIntent
))
749 printf(" cupsRenderingIntent (%s), expected (%s)\n",
750 header
->cupsRenderingIntent
,
751 expected
->cupsRenderingIntent
);
753 if (strcmp(header
->cupsPageSizeName
, expected
->cupsPageSizeName
))
754 printf(" cupsPageSizeName (%s), expected (%s)\n",
755 header
->cupsPageSizeName
,
756 expected
->cupsPageSizeName
);