]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - cups/raster-stream.c
Bump version.
[thirdparty/cups.git] / cups / raster-stream.c
index 54adfb80880aa76a53281813a72eb935e98ab05e..1459817cfa4c67d31f6abf6f7c750214cd95abb6 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.
@@ -14,7 +14,8 @@
  * Include necessary headers...
  */
 
-#include <cups/raster-private.h>
+#include "raster-private.h"
+#include "debug-internal.h"
 #ifdef HAVE_STDINT_H
 #  include <stdint.h>
 #endif /* HAVE_STDINT_H */
@@ -31,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 */
@@ -637,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,
@@ -647,7 +666,7 @@ _cupsRasterReadHeader(
           {
             1,
             3,
-            4,
+            3,
             3,
             1,
             3,
@@ -680,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;
   }
@@ -693,7 +725,13 @@ _cupsRasterReadHeader(
   if (!cups_raster_update(r))
     return (0);
 
-  DEBUG_printf(("4_cupsRasterReadHeader: cupsBitsPerPixel=%u, cupsBitsPerColor=%u, cupsBytesPerLine=%u, cupsWidth=%u, cupsHeight=%u, r->bpp=%d", r->header.cupsBitsPerPixel, r->header.cupsBitsPerColor, r->header.cupsBytesPerLine, r->header.cupsWidth, r->header.cupsHeight, r->bpp));
+  DEBUG_printf(("4_cupsRasterReadHeader: cupsColorSpace=%s", _cupsRasterColorSpaceString(r->header.cupsColorSpace)));
+  DEBUG_printf(("4_cupsRasterReadHeader: cupsBitsPerColor=%u", r->header.cupsBitsPerColor));
+  DEBUG_printf(("4_cupsRasterReadHeader: cupsBitsPerPixel=%u", r->header.cupsBitsPerPixel));
+  DEBUG_printf(("4_cupsRasterReadHeader: cupsBytesPerLine=%u", r->header.cupsBytesPerLine));
+  DEBUG_printf(("4_cupsRasterReadHeader: cupsWidth=%u", r->header.cupsWidth));
+  DEBUG_printf(("4_cupsRasterReadHeader: cupsHeight=%u", r->header.cupsHeight));
+  DEBUG_printf(("4_cupsRasterReadHeader: r->bpp=%d", r->bpp));
 
   return (r->header.cupsBitsPerPixel > 0 && r->header.cupsBitsPerPixel <= 240 && r->header.cupsBitsPerColor > 0 && r->header.cupsBitsPerColor <= 16 && r->header.cupsBytesPerLine > 0 && r->header.cupsBytesPerLine <= 0x7fffffff && r->header.cupsHeight != 0 && (r->header.cupsBytesPerLine % r->bpp) == 0);
 }
@@ -1065,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)
@@ -1094,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]  = (unsigned char)(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);
@@ -1112,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] = (unsigned char)i;
+        break;
+      }
+    }
+
     return (cups_raster_io(r, appleheader, sizeof(appleheader)) == sizeof(appleheader));
   }
   else