]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Fix a few issues with Apple Raster support (rdar://55301114)
authorMichael R Sweet <michael.r.sweet@gmail.com>
Mon, 2 Dec 2019 15:19:36 +0000 (10:19 -0500)
committerMichael R Sweet <michael.r.sweet@gmail.com>
Mon, 2 Dec 2019 15:19:36 +0000 (10:19 -0500)
CHANGES.md
cups/raster-stream.c
cups/testraster.c

index f4436f4d1e69549a4f868a179154604d6d3483d8..51dc884b5adb487f46a5cc1ae7012b4f1130fb02 100644 (file)
@@ -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.
index d7db020f12c3c93baefa496070d4903d652be9c0..365c5e0e44309ede06f2a7210d372af2eb4fa700 100644 (file)
@@ -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
index d3dab4bbcc52dce158a2a41b8b53c276ff336972..de72a4bfbbfed5d57860256099ac91e4c238993b 100644 (file)
@@ -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;