]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Mirror Apple Raster fixes from master.
authorMichael R Sweet <michael.r.sweet@gmail.com>
Mon, 2 Dec 2019 15:37:31 +0000 (10:37 -0500)
committerMichael R Sweet <michael.r.sweet@gmail.com>
Mon, 2 Dec 2019 15:37:31 +0000 (10:37 -0500)
CHANGES.md
filter/raster.c
filter/testraster.c

index 50bf17c5eb1ba1a1bcf02fe8ce7f8f29ecae4716..5ff677dbef4ee39eff73be3bc81e196916ab5048 100644 (file)
@@ -1,4 +1,4 @@
-CHANGES - 2.2.13 - 2019-11-18
+CHANGES - 2.2.13 - 2019-12-02
 =============================
 
 
@@ -12,6 +12,7 @@ Changes in CUPS v2.2.13
   permissions are wrong (Issue #5658)
 - Default printers set with `lpoptions` did not work in all cases (Issue #5681,
   Issue #5683, Issue #5684)
+- Fixed a few issues with the Apple Raster support (rdar://55301114)
 - The IPP backend did not detect all cases where a job should be retried using
   a raster format (rdar://56021091)
 
index 3ff03008531d00fc0a97d3429aaa3d646b7f2810..532ba365a17d948634160cc15e830c29842d4a92 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.
 #endif /* HAVE_STDINT_H */
 
 
+/*
+ * 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"
+};
+
+
 /*
  * Private structures...
  */
@@ -1098,7 +1121,10 @@ cupsRasterWriteHeader(
     * zeroed.
     */
 
-    unsigned char appleheader[32];     /* Raw page header */
+    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)
     {
@@ -1125,24 +1151,35 @@ 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[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);
     appleheader[15] = (unsigned char)(r->header.cupsWidth);
-    appleheader[16] = (unsigned char)(r->header.cupsHeight >> 24);
-    appleheader[17] = (unsigned char)(r->header.cupsHeight >> 16);
-    appleheader[18] = (unsigned char)(r->header.cupsHeight >> 8);
-    appleheader[19] = (unsigned char)(r->header.cupsHeight);
+    appleheader[16] = (unsigned char)(height >> 24);
+    appleheader[17] = (unsigned char)(height >> 16);
+    appleheader[18] = (unsigned char)(height >> 8);
+    appleheader[19] = (unsigned char)(height);
     appleheader[20] = (unsigned char)(r->header.HWResolution[0] >> 24);
     appleheader[21] = (unsigned char)(r->header.HWResolution[0] >> 16);
     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
@@ -1271,8 +1308,9 @@ cupsRasterWriteHeader2(
     * 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)
@@ -1300,11 +1338,14 @@ cupsRasterWriteHeader2(
 
     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);
@@ -1318,6 +1359,15 @@ cupsRasterWriteHeader2(
     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
@@ -1589,7 +1639,7 @@ cups_raster_read_header(
           {
             CUPS_CSPACE_SW,
             CUPS_CSPACE_SRGB,
-            CUPS_CSPACE_RGBW,
+            CUPS_CSPACE_CIELab,
             CUPS_CSPACE_ADOBERGB,
             CUPS_CSPACE_W,
             CUPS_CSPACE_RGB,
@@ -1599,7 +1649,7 @@ cups_raster_read_header(
           {
             1,
             3,
-            4,
+            3,
             3,
             1,
             3,
@@ -1632,8 +1682,21 @@ cups_raster_read_header(
            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;
   }
index d5d63de2eb76c88c98e14e162c83af5027253a95..82b8eaa2af1ff11971a654ab8a768658744395d3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Raster test program routines for CUPS.
  *
- * Copyright 2007-2016 by Apple Inc.
+ * Copyright 2007-2019 by Apple Inc.
  * Copyright 1997-2007 by Easy Software Products.
  *
  * These coded instructions, statements, and computer programs are the
@@ -560,6 +560,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;
@@ -690,6 +692,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;