From e6330cabb85bed745891e21530765f5a337dce58 Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Mon, 2 Dec 2019 10:19:36 -0500 Subject: Fix a few issues with Apple Raster support (rdar://55301114) --- cups/raster-stream.c | 60 +++++++++++++++++++++++++++++++++++++++++++++------- cups/testraster.c | 9 +++++--- 2 files changed, 58 insertions(+), 11 deletions(-) (limited to 'cups') diff --git a/cups/raster-stream.c b/cups/raster-stream.c index d7db020f1..365c5e0e4 100644 --- a/cups/raster-stream.c +++ b/cups/raster-stream.c @@ -1,7 +1,7 @@ /* * Raster file routines for CUPS. * - * Copyright 2007-2018 by Apple Inc. + * Copyright 2007-2019 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * This file is part of the CUPS Imaging library. @@ -32,6 +32,24 @@ typedef void (*_cups_copyfunc_t)(void *dst, const void *src, size_t bytes); * Local globals... */ +static const char * const apple_media_types[] = +{ /* media-type values for Apple Raster */ + "auto", + "stationery", + "transparency", + "envelope", + "cardstock", + "labels", + "stationery-letterhead", + "disc", + "photographic-matte", + "photographic-satin", + "photographic-semi-gloss", + "photographic-glossy", + "photographic-high-gloss", + "other" +}; + #ifdef DEBUG static const char * const cups_modes[] = { /* Open modes */ @@ -638,7 +656,7 @@ _cupsRasterReadHeader( { CUPS_CSPACE_SW, CUPS_CSPACE_SRGB, - CUPS_CSPACE_RGBW, + CUPS_CSPACE_CIELab, CUPS_CSPACE_ADOBERGB, CUPS_CSPACE_W, CUPS_CSPACE_RGB, @@ -648,7 +666,7 @@ _cupsRasterReadHeader( { 1, 3, - 4, + 3, 3, 1, 3, @@ -681,8 +699,21 @@ _cupsRasterReadHeader( r->header.cupsPageSize[1] = (float)(r->header.cupsHeight * 72.0 / r->header.HWResolution[1]); } - r->header.cupsInteger[0] = r->apple_page_count; - r->header.cupsInteger[7] = 0xffffff; + r->header.cupsInteger[CUPS_RASTER_PWG_TotalPageCount] = r->apple_page_count; + r->header.cupsInteger[CUPS_RASTER_PWG_AlternatePrimary] = 0xffffff; + r->header.cupsInteger[CUPS_RASTER_PWG_PrintQuality] = appleheader[3]; + + if (appleheader[2] >= 2) + r->header.Duplex = 1; + if (appleheader[2] == 2) + r->header.Tumble = 1; + + r->header.MediaPosition = appleheader[5]; + + if (appleheader[4] < (int)(sizeof(apple_media_types) / sizeof(apple_media_types[0]))) + strlcpy(r->header.MediaType, apple_media_types[appleheader[4]], sizeof(r->header.MediaType)); + else + strlcpy(r->header.MediaType, "other", sizeof(r->header.MediaType)); } break; } @@ -1072,8 +1103,9 @@ _cupsRasterWriteHeader( * zeroed. */ - unsigned char appleheader[32]; /* Raw page header */ - unsigned height = r->header.cupsHeight * r->rowheight; + int i; /* Looping var */ + unsigned char appleheader[32];/* Raw page header */ + unsigned height = r->header.cupsHeight * r->rowheight; /* Computed page height */ if (r->apple_page_count == 0xffffffffU) @@ -1101,11 +1133,14 @@ _cupsRasterWriteHeader( appleheader[0] = (unsigned char)r->header.cupsBitsPerPixel; appleheader[1] = r->header.cupsColorSpace == CUPS_CSPACE_SRGB ? 1 : - r->header.cupsColorSpace == CUPS_CSPACE_RGBW ? 2 : + r->header.cupsColorSpace == CUPS_CSPACE_CIELab ? 2 : r->header.cupsColorSpace == CUPS_CSPACE_ADOBERGB ? 3 : r->header.cupsColorSpace == CUPS_CSPACE_W ? 4 : r->header.cupsColorSpace == CUPS_CSPACE_RGB ? 5 : r->header.cupsColorSpace == CUPS_CSPACE_CMYK ? 6 : 0; + appleheader[2] = r->header.Duplex ? (r->header.Tumble ? 2 : 3) : 1; + appleheader[3] = r->header.cupsInteger[CUPS_RASTER_PWG_PrintQuality]; + appleheader[5] = (unsigned char)(r->header.MediaPosition); appleheader[12] = (unsigned char)(r->header.cupsWidth >> 24); appleheader[13] = (unsigned char)(r->header.cupsWidth >> 16); appleheader[14] = (unsigned char)(r->header.cupsWidth >> 8); @@ -1119,6 +1154,15 @@ _cupsRasterWriteHeader( appleheader[22] = (unsigned char)(r->header.HWResolution[0] >> 8); appleheader[23] = (unsigned char)(r->header.HWResolution[0]); + for (i = 0; i < (int)(sizeof(apple_media_types) / sizeof(apple_media_types[0])); i ++) + { + if (!strcmp(r->header.MediaType, apple_media_types[i])) + { + appleheader[4] = i; + break; + } + } + return (cups_raster_io(r, appleheader, sizeof(appleheader)) == sizeof(appleheader)); } else diff --git a/cups/testraster.c b/cups/testraster.c index d3dab4bbc..de72a4bfb 100644 --- a/cups/testraster.c +++ b/cups/testraster.c @@ -1,7 +1,7 @@ /* * Raster test program routines for CUPS. * - * Copyright © 2007-2018 by Apple Inc. + * 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 @@ -22,8 +22,7 @@ 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); +static void print_changes(cups_page_header2_t *header, cups_page_header2_t *expected); /* @@ -174,6 +173,8 @@ do_raster_tests(cups_mode_t mode) /* O - Write mode */ header.cupsPageSize[0] = 288.0f; header.cupsPageSize[1] = 288.0f; + strlcpy(header.MediaType, "auto", sizeof(header.MediaType)); + if (page & 1) { header.cupsBytesPerLine *= 4; @@ -308,6 +309,8 @@ do_raster_tests(cups_mode_t mode) /* O - Write mode */ 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; -- cgit v1.2.1