From: Michael R Sweet Date: Mon, 2 Dec 2019 15:19:36 +0000 (-0500) Subject: Fix a few issues with Apple Raster support (rdar://55301114) X-Git-Tag: v2.3.1~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e6330cabb85bed745891e21530765f5a337dce58;p=thirdparty%2Fcups.git Fix a few issues with Apple Raster support (rdar://55301114) --- diff --git a/CHANGES.md b/CHANGES.md index f4436f4d1e..51dc884b5a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,4 @@ -CHANGES - 2.3.1 - 2019-11-27 +CHANGES - 2.3.1 - 2019-12-02 ============================ @@ -24,6 +24,7 @@ Changes in CUPS v2.3.1 Issue #5683, Issue #5684) - The IPP backend did not detect all cases where a job should be retried using a raster format (rdar://56021091) +- Fixed a few issues with the Apple Raster support (rdar://55301114) - Fixed spelling of "fold-accordion". - Fixed the default common name for TLS certificates used by `ippeveprinter`. - Fixed the option names used for IPP Everywhere finishing options. diff --git a/cups/raster-stream.c b/cups/raster-stream.c index d7db020f12..365c5e0e44 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 d3dab4bbcc..de72a4bfbb 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;