Tim Waugh 986ede
diff -up cups-1.3.6/filter/image-jpeg.c.str2727 cups-1.3.6/filter/image-jpeg.c
Tim Waugh 986ede
--- cups-1.3.6/filter/image-jpeg.c.str2727	2007-07-11 22:46:42.000000000 +0100
Tim Waugh 986ede
+++ cups-1.3.6/filter/image-jpeg.c	2008-02-28 22:28:45.000000000 +0000
Tim Waugh 986ede
@@ -47,8 +47,8 @@ _cupsImageReadJPEG(
Tim Waugh 986ede
   struct jpeg_error_mgr	jerr;		/* Error handler info */
Tim Waugh 986ede
   cups_ib_t		*in,		/* Input pixels */
Tim Waugh 986ede
 			*out;		/* Output pixels */
Tim Waugh 986ede
-  char			header[16];	/* Photoshop JPEG header */
Tim Waugh 986ede
-  int			psjpeg;		/* Non-zero if Photoshop JPEG */
Tim Waugh 986ede
+  jpeg_saved_marker_ptr	marker;		/* Pointer to marker data */
Tim Waugh 986ede
+  int			psjpeg = 0;	/* Non-zero if Photoshop CMYK JPEG */
Tim Waugh 986ede
   static const char	*cspaces[] =
Tim Waugh 986ede
 			{		/* JPEG colorspaces... */
Tim Waugh 986ede
 			  "JCS_UNKNOWN",
Tim Waugh 986ede
@@ -61,23 +61,30 @@ _cupsImageReadJPEG(
Tim Waugh 986ede
 
Tim Waugh 986ede
 
Tim Waugh 986ede
  /*
Tim Waugh 986ede
-  * Read the first 16 bytes to determine if this is a Photoshop JPEG file...
Tim Waugh 986ede
-  */
Tim Waugh 986ede
-
Tim Waugh 986ede
-  fread(header, sizeof(header), 1, fp);
Tim Waugh 986ede
-  rewind(fp);
Tim Waugh 986ede
-
Tim Waugh 986ede
-  psjpeg = memcmp(header + 6, "Photoshop ", 10) == 0;
Tim Waugh 986ede
-
Tim Waugh 986ede
- /*
Tim Waugh 986ede
   * Read the JPEG header...
Tim Waugh 986ede
   */
Tim Waugh 986ede
 
Tim Waugh 986ede
   cinfo.err = jpeg_std_error(&jerr);
Tim Waugh 986ede
   jpeg_create_decompress(&cinfo);
Tim Waugh 986ede
+  jpeg_save_markers(&cinfo, JPEG_APP0 + 14, 0xffff); /* Adobe JPEG */
Tim Waugh 986ede
   jpeg_stdio_src(&cinfo, fp);
Tim Waugh 986ede
   jpeg_read_header(&cinfo, 1);
Tim Waugh 986ede
 
Tim Waugh 986ede
+ /*
Tim Waugh 986ede
+  * Parse any Adobe APPE data embedded in the JPEG file.  Since Adobe doesn't
Tim Waugh 986ede
+  * bother following standards, we have to invert the CMYK JPEG data written by
Tim Waugh 986ede
+  * Adobe apps...
Tim Waugh 986ede
+  */
Tim Waugh 986ede
+
Tim Waugh 986ede
+  for (marker = cinfo.marker_list; marker; marker = marker->next)
Tim Waugh 986ede
+    if (marker->marker == (JPEG_APP0 + 14) && marker->data_length >= 12 &&
Tim Waugh 986ede
+        !memcmp(marker->data, "Adobe", 5) && marker->data[11] == 2)
Tim Waugh 986ede
+    {
Tim Waugh 986ede
+      fputs("DEBUG: Adobe CMYK JPEG detected (inverting color values)\n",
Tim Waugh 986ede
+	    stderr);
Tim Waugh 986ede
+      psjpeg = 1;
Tim Waugh 986ede
+    }
Tim Waugh 986ede
+
Tim Waugh 986ede
   cinfo.quantize_colors = 0;
Tim Waugh 986ede
 
Tim Waugh 986ede
   fprintf(stderr, "DEBUG: num_components = %d\n", cinfo.num_components);