/* * Raster test program routines for CUPS. * * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include #include /* * Local functions... */ static int do_ras_file(const char *filename); static int do_raster_tests(cups_mode_t mode); static void print_changes(cups_page_header2_t *header, cups_page_header2_t *expected); /* * 'main()' - Test the raster functions. */ int /* O - Exit status */ main(int argc, /* I - Number of command-line args */ char *argv[]) /* I - Command-line arguments */ { int errors = 0; /* Number of errors */ if (argc == 1) { errors += do_raster_tests(CUPS_RASTER_WRITE); errors += do_raster_tests(CUPS_RASTER_WRITE_COMPRESSED); errors += do_raster_tests(CUPS_RASTER_WRITE_PWG); errors += do_raster_tests(CUPS_RASTER_WRITE_APPLE); } else { int i; /* Looping var */ for (i = 1; i < argc; i ++) errors += do_ras_file(argv[i]); } return (errors); } /* * 'do_ras_file()' - Test reading of a raster file. */ static int /* O - Number of errors */ do_ras_file(const char *filename) /* I - Filename */ { unsigned y; /* Looping vars */ int fd; /* File descriptor */ cups_raster_t *ras; /* Raster stream */ cups_page_header2_t header; /* Page header */ unsigned char *data; /* Raster data */ int errors = 0; /* Number of errors */ unsigned pages = 0; /* Number of pages */ if ((fd = open(filename, O_RDONLY)) < 0) { printf("%s: %s\n", filename, strerror(errno)); return (1); } if ((ras = cupsRasterOpen(fd, CUPS_RASTER_READ)) == NULL) { printf("%s: cupsRasterOpen failed.\n", filename); close(fd); return (1); } printf("%s:\n", filename); while (cupsRasterReadHeader2(ras, &header)) { pages ++; data = malloc(header.cupsBytesPerLine); printf(" Page %u: %ux%ux%u@%ux%udpi", pages, header.cupsWidth, header.cupsHeight, header.cupsBitsPerPixel, header.HWResolution[0], header.HWResolution[1]); fflush(stdout); for (y = 0; y < header.cupsHeight; y ++) if (cupsRasterReadPixels(ras, data, header.cupsBytesPerLine) < header.cupsBytesPerLine) break; if (y < header.cupsHeight) printf(" ERROR AT LINE %d\n", y); else putchar('\n'); free(data); } printf("EOF at %ld\n", (long)lseek(fd, SEEK_CUR, 0)); cupsRasterClose(ras); close(fd); return (errors); } /* * 'do_raster_tests()' - Test reading and writing of raster data. */ static int /* O - Number of errors */ do_raster_tests(cups_mode_t mode) /* O - Write mode */ { unsigned page, x, y, count;/* Looping vars */ FILE *fp; /* Raster file */ cups_raster_t *r; /* Raster stream */ cups_page_header2_t header, /* Page header */ expected; /* Expected page header */ unsigned char data[2048]; /* Raster data */ int errors = 0; /* Number of errors */ /* * Test writing... */ printf("cupsRasterOpen(%s): ", mode == CUPS_RASTER_WRITE ? "CUPS_RASTER_WRITE" : mode == CUPS_RASTER_WRITE_COMPRESSED ? "CUPS_RASTER_WRITE_COMPRESSED" : mode == CUPS_RASTER_WRITE_PWG ? "CUPS_RASTER_WRITE_PWG" : "CUPS_RASTER_WRITE_APPLE"); fflush(stdout); if ((fp = fopen("test.raster", "wb")) == NULL) { printf("FAIL (%s)\n", strerror(errno)); return (1); } if ((r = cupsRasterOpen(fileno(fp), mode)) == NULL) { printf("FAIL (%s)\n", strerror(errno)); fclose(fp); return (1); } puts("PASS"); for (page = 0; page < 4; page ++) { memset(&header, 0, sizeof(header)); header.cupsWidth = 256; header.cupsHeight = 256; header.cupsBytesPerLine = 256; header.HWResolution[0] = 64; header.HWResolution[1] = 64; header.PageSize[0] = 288; header.PageSize[1] = 288; header.cupsPageSize[0] = 288.0f; header.cupsPageSize[1] = 288.0f; strlcpy(header.MediaType, "auto", sizeof(header.MediaType)); if (page & 1) { header.cupsBytesPerLine *= 4; header.cupsColorSpace = CUPS_CSPACE_CMYK; header.cupsColorOrder = CUPS_ORDER_CHUNKED; header.cupsNumColors = 4; } else { header.cupsColorSpace = CUPS_CSPACE_W; header.cupsColorOrder = CUPS_ORDER_CHUNKED; header.cupsNumColors = 1; } if (page & 2) { header.cupsBytesPerLine *= 2; header.cupsBitsPerColor = 16; header.cupsBitsPerPixel = (page & 1) ? 64 : 16; } else { header.cupsBitsPerColor = 8; header.cupsBitsPerPixel = (page & 1) ? 32 : 8; } printf("cupsRasterWriteHeader2(page %d): ", page + 1); if (cupsRasterWriteHeader2(r, &header)) { puts("PASS"); } else { puts("FAIL"); errors ++; } fputs("cupsRasterWritePixels: ", stdout); fflush(stdout); memset(data, 0, header.cupsBytesPerLine); for (y = 0; y < 64; y ++) if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine)) break; if (y < 64) { puts("FAIL"); errors ++; } else { for (x = 0; x < header.cupsBytesPerLine; x ++) data[x] = (unsigned char)x; for (y = 0; y < 64; y ++) if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine)) break; if (y < 64) { puts("FAIL"); errors ++; } else { memset(data, 255, header.cupsBytesPerLine); for (y = 0; y < 64; y ++) if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine)) break; if (y < 64) { puts("FAIL"); errors ++; } else { for (x = 0; x < header.cupsBytesPerLine; x ++) data[x] = (unsigned char)(x / 4); for (y = 0; y < 64; y ++) if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine)) break; if (y < 64) { puts("FAIL"); errors ++; } else puts("PASS"); } } } } cupsRasterClose(r); fclose(fp); /* * Test reading... */ fputs("cupsRasterOpen(CUPS_RASTER_READ): ", stdout); fflush(stdout); if ((fp = fopen("test.raster", "rb")) == NULL) { printf("FAIL (%s)\n", strerror(errno)); return (1); } if ((r = cupsRasterOpen(fileno(fp), CUPS_RASTER_READ)) == NULL) { printf("FAIL (%s)\n", strerror(errno)); fclose(fp); return (1); } puts("PASS"); for (page = 0; page < 4; page ++) { memset(&expected, 0, sizeof(expected)); expected.cupsWidth = 256; expected.cupsHeight = 256; expected.cupsBytesPerLine = 256; expected.HWResolution[0] = 64; expected.HWResolution[1] = 64; expected.PageSize[0] = 288; expected.PageSize[1] = 288; strlcpy(expected.MediaType, "auto", sizeof(expected.MediaType)); if (mode != CUPS_RASTER_WRITE_PWG) { expected.cupsPageSize[0] = 288.0f; expected.cupsPageSize[1] = 288.0f; } if (mode >= CUPS_RASTER_WRITE_PWG) { strlcpy(expected.MediaClass, "PwgRaster", sizeof(expected.MediaClass)); expected.cupsInteger[7] = 0xffffff; } if (page & 1) { expected.cupsBytesPerLine *= 4; expected.cupsColorSpace = CUPS_CSPACE_CMYK; expected.cupsColorOrder = CUPS_ORDER_CHUNKED; expected.cupsNumColors = 4; } else { expected.cupsColorSpace = CUPS_CSPACE_W; expected.cupsColorOrder = CUPS_ORDER_CHUNKED; expected.cupsNumColors = 1; } if (page & 2) { expected.cupsBytesPerLine *= 2; expected.cupsBitsPerColor = 16; expected.cupsBitsPerPixel = (page & 1) ? 64 : 16; } else { expected.cupsBitsPerColor = 8; expected.cupsBitsPerPixel = (page & 1) ? 32 : 8; } printf("cupsRasterReadHeader2(page %d): ", page + 1); fflush(stdout); if (!cupsRasterReadHeader2(r, &header)) { puts("FAIL (read error)"); errors ++; break; } else if (memcmp(&header, &expected, sizeof(header))) { puts("FAIL (bad page header)"); errors ++; print_changes(&header, &expected); } else puts("PASS"); fputs("cupsRasterReadPixels: ", stdout); fflush(stdout); for (y = 0; y < 64; y ++) { if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine)) { puts("FAIL (read error)"); errors ++; break; } if (data[0] != 0 || memcmp(data, data + 1, header.cupsBytesPerLine - 1)) { printf("FAIL (raster line %d corrupt)\n", y); for (x = 0, count = 0; x < header.cupsBytesPerLine && count < 10; x ++) { if (data[x]) { count ++; if (count == 10) puts(" ..."); else printf(" %4u %02X (expected %02X)\n", x, data[x], 0); } } errors ++; break; } } if (y == 64) { for (y = 0; y < 64; y ++) { if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine)) { puts("FAIL (read error)"); errors ++; break; } for (x = 0; x < header.cupsBytesPerLine; x ++) if (data[x] != (x & 255)) break; if (x < header.cupsBytesPerLine) { printf("FAIL (raster line %d corrupt)\n", y + 64); for (x = 0, count = 0; x < header.cupsBytesPerLine && count < 10; x ++) { if (data[x] != (x & 255)) { count ++; if (count == 10) puts(" ..."); else printf(" %4u %02X (expected %02X)\n", x, data[x], x & 255); } } errors ++; break; } } if (y == 64) { for (y = 0; y < 64; y ++) { if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine)) { puts("FAIL (read error)"); errors ++; break; } if (data[0] != 255 || memcmp(data, data + 1, header.cupsBytesPerLine - 1)) { printf("fail (raster line %d corrupt)\n", y + 128); for (x = 0, count = 0; x < header.cupsBytesPerLine && count < 10; x ++) { if (data[x] != 255) { count ++; if (count == 10) puts(" ..."); else printf(" %4u %02X (expected %02X)\n", x, data[x], 255); } } errors ++; break; } } if (y == 64) { for (y = 0; y < 64; y ++) { if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine)) { puts("FAIL (read error)"); errors ++; break; } for (x = 0; x < header.cupsBytesPerLine; x ++) if (data[x] != ((x / 4) & 255)) break; if (x < header.cupsBytesPerLine) { printf("FAIL (raster line %d corrupt)\n", y + 192); for (x = 0, count = 0; x < header.cupsBytesPerLine && count < 10; x ++) { if (data[x] != ((x / 4) & 255)) { count ++; if (count == 10) puts(" ..."); else printf(" %4u %02X (expected %02X)\n", x, data[x], (x / 4) & 255); } } errors ++; break; } } if (y == 64) puts("PASS"); } } } } cupsRasterClose(r); fclose(fp); return (errors); } /* * 'print_changes()' - Print differences in the page header. */ static void print_changes( cups_page_header2_t *header, /* I - Actual page header */ cups_page_header2_t *expected) /* I - Expected page header */ { int i; /* Looping var */ if (strcmp(header->MediaClass, expected->MediaClass)) printf(" MediaClass (%s), expected (%s)\n", header->MediaClass, expected->MediaClass); if (strcmp(header->MediaColor, expected->MediaColor)) printf(" MediaColor (%s), expected (%s)\n", header->MediaColor, expected->MediaColor); if (strcmp(header->MediaType, expected->MediaType)) printf(" MediaType (%s), expected (%s)\n", header->MediaType, expected->MediaType); if (strcmp(header->OutputType, expected->OutputType)) printf(" OutputType (%s), expected (%s)\n", header->OutputType, expected->OutputType); if (header->AdvanceDistance != expected->AdvanceDistance) printf(" AdvanceDistance %d, expected %d\n", header->AdvanceDistance, expected->AdvanceDistance); if (header->AdvanceMedia != expected->AdvanceMedia) printf(" AdvanceMedia %d, expected %d\n", header->AdvanceMedia, expected->AdvanceMedia); if (header->Collate != expected->Collate) printf(" Collate %d, expected %d\n", header->Collate, expected->Collate); if (header->CutMedia != expected->CutMedia) printf(" CutMedia %d, expected %d\n", header->CutMedia, expected->CutMedia); if (header->Duplex != expected->Duplex) printf(" Duplex %d, expected %d\n", header->Duplex, expected->Duplex); if (header->HWResolution[0] != expected->HWResolution[0] || header->HWResolution[1] != expected->HWResolution[1]) printf(" HWResolution [%d %d], expected [%d %d]\n", header->HWResolution[0], header->HWResolution[1], expected->HWResolution[0], expected->HWResolution[1]); if (memcmp(header->ImagingBoundingBox, expected->ImagingBoundingBox, sizeof(header->ImagingBoundingBox))) printf(" ImagingBoundingBox [%d %d %d %d], expected [%d %d %d %d]\n", header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], header->ImagingBoundingBox[2], header->ImagingBoundingBox[3], expected->ImagingBoundingBox[0], expected->ImagingBoundingBox[1], expected->ImagingBoundingBox[2], expected->ImagingBoundingBox[3]); if (header->InsertSheet != expected->InsertSheet) printf(" InsertSheet %d, expected %d\n", header->InsertSheet, expected->InsertSheet); if (header->Jog != expected->Jog) printf(" Jog %d, expected %d\n", header->Jog, expected->Jog); if (header->LeadingEdge != expected->LeadingEdge) printf(" LeadingEdge %d, expected %d\n", header->LeadingEdge, expected->LeadingEdge); if (header->Margins[0] != expected->Margins[0] || header->Margins[1] != expected->Margins[1]) printf(" Margins [%d %d], expected [%d %d]\n", header->Margins[0], header->Margins[1], expected->Margins[0], expected->Margins[1]); if (header->ManualFeed != expected->ManualFeed) printf(" ManualFeed %d, expected %d\n", header->ManualFeed, expected->ManualFeed); if (header->MediaPosition != expected->MediaPosition) printf(" MediaPosition %d, expected %d\n", header->MediaPosition, expected->MediaPosition); if (header->MediaWeight != expected->MediaWeight) printf(" MediaWeight %d, expected %d\n", header->MediaWeight, expected->MediaWeight); if (header->MirrorPrint != expected->MirrorPrint) printf(" MirrorPrint %d, expected %d\n", header->MirrorPrint, expected->MirrorPrint); if (header->NegativePrint != expected->NegativePrint) printf(" NegativePrint %d, expected %d\n", header->NegativePrint, expected->NegativePrint); if (header->NumCopies != expected->NumCopies) printf(" NumCopies %d, expected %d\n", header->NumCopies, expected->NumCopies); if (header->Orientation != expected->Orientation) printf(" Orientation %d, expected %d\n", header->Orientation, expected->Orientation); if (header->OutputFaceUp != expected->OutputFaceUp) printf(" OutputFaceUp %d, expected %d\n", header->OutputFaceUp, expected->OutputFaceUp); if (header->PageSize[0] != expected->PageSize[0] || header->PageSize[1] != expected->PageSize[1]) printf(" PageSize [%d %d], expected [%d %d]\n", header->PageSize[0], header->PageSize[1], expected->PageSize[0], expected->PageSize[1]); if (header->Separations != expected->Separations) printf(" Separations %d, expected %d\n", header->Separations, expected->Separations); if (header->TraySwitch != expected->TraySwitch) printf(" TraySwitch %d, expected %d\n", header->TraySwitch, expected->TraySwitch); if (header->Tumble != expected->Tumble) printf(" Tumble %d, expected %d\n", header->Tumble, expected->Tumble); if (header->cupsWidth != expected->cupsWidth) printf(" cupsWidth %d, expected %d\n", header->cupsWidth, expected->cupsWidth); if (header->cupsHeight != expected->cupsHeight) printf(" cupsHeight %d, expected %d\n", header->cupsHeight, expected->cupsHeight); if (header->cupsMediaType != expected->cupsMediaType) printf(" cupsMediaType %d, expected %d\n", header->cupsMediaType, expected->cupsMediaType); if (header->cupsBitsPerColor != expected->cupsBitsPerColor) printf(" cupsBitsPerColor %d, expected %d\n", header->cupsBitsPerColor, expected->cupsBitsPerColor); if (header->cupsBitsPerPixel != expected->cupsBitsPerPixel) printf(" cupsBitsPerPixel %d, expected %d\n", header->cupsBitsPerPixel, expected->cupsBitsPerPixel); if (header->cupsBytesPerLine != expected->cupsBytesPerLine) printf(" cupsBytesPerLine %d, expected %d\n", header->cupsBytesPerLine, expected->cupsBytesPerLine); if (header->cupsColorOrder != expected->cupsColorOrder) printf(" cupsColorOrder %d, expected %d\n", header->cupsColorOrder, expected->cupsColorOrder); if (header->cupsColorSpace != expected->cupsColorSpace) printf(" cupsColorSpace %d, expected %d\n", header->cupsColorSpace, expected->cupsColorSpace); if (header->cupsCompression != expected->cupsCompression) printf(" cupsCompression %d, expected %d\n", header->cupsCompression, expected->cupsCompression); if (header->cupsRowCount != expected->cupsRowCount) printf(" cupsRowCount %d, expected %d\n", header->cupsRowCount, expected->cupsRowCount); if (header->cupsRowFeed != expected->cupsRowFeed) printf(" cupsRowFeed %d, expected %d\n", header->cupsRowFeed, expected->cupsRowFeed); if (header->cupsRowStep != expected->cupsRowStep) printf(" cupsRowStep %d, expected %d\n", header->cupsRowStep, expected->cupsRowStep); if (header->cupsNumColors != expected->cupsNumColors) printf(" cupsNumColors %d, expected %d\n", header->cupsNumColors, expected->cupsNumColors); if (fabs(header->cupsBorderlessScalingFactor - expected->cupsBorderlessScalingFactor) > 0.001) printf(" cupsBorderlessScalingFactor %g, expected %g\n", header->cupsBorderlessScalingFactor, expected->cupsBorderlessScalingFactor); if (fabs(header->cupsPageSize[0] - expected->cupsPageSize[0]) > 0.001 || fabs(header->cupsPageSize[1] - expected->cupsPageSize[1]) > 0.001) printf(" cupsPageSize [%g %g], expected [%g %g]\n", header->cupsPageSize[0], header->cupsPageSize[1], expected->cupsPageSize[0], expected->cupsPageSize[1]); if (fabs(header->cupsImagingBBox[0] - expected->cupsImagingBBox[0]) > 0.001 || fabs(header->cupsImagingBBox[1] - expected->cupsImagingBBox[1]) > 0.001 || fabs(header->cupsImagingBBox[2] - expected->cupsImagingBBox[2]) > 0.001 || fabs(header->cupsImagingBBox[3] - expected->cupsImagingBBox[3]) > 0.001) printf(" cupsImagingBBox [%g %g %g %g], expected [%g %g %g %g]\n", header->cupsImagingBBox[0], header->cupsImagingBBox[1], header->cupsImagingBBox[2], header->cupsImagingBBox[3], expected->cupsImagingBBox[0], expected->cupsImagingBBox[1], expected->cupsImagingBBox[2], expected->cupsImagingBBox[3]); for (i = 0; i < 16; i ++) if (header->cupsInteger[i] != expected->cupsInteger[i]) printf(" cupsInteger%d %d, expected %d\n", i, header->cupsInteger[i], expected->cupsInteger[i]); for (i = 0; i < 16; i ++) if (fabs(header->cupsReal[i] - expected->cupsReal[i]) > 0.001) printf(" cupsReal%d %g, expected %g\n", i, header->cupsReal[i], expected->cupsReal[i]); for (i = 0; i < 16; i ++) if (strcmp(header->cupsString[i], expected->cupsString[i])) printf(" cupsString%d (%s), expected (%s)\n", i, header->cupsString[i], expected->cupsString[i]); if (strcmp(header->cupsMarkerType, expected->cupsMarkerType)) printf(" cupsMarkerType (%s), expected (%s)\n", header->cupsMarkerType, expected->cupsMarkerType); if (strcmp(header->cupsRenderingIntent, expected->cupsRenderingIntent)) printf(" cupsRenderingIntent (%s), expected (%s)\n", header->cupsRenderingIntent, expected->cupsRenderingIntent); if (strcmp(header->cupsPageSizeName, expected->cupsPageSizeName)) printf(" cupsPageSizeName (%s), expected (%s)\n", header->cupsPageSizeName, expected->cupsPageSizeName); }