You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by je...@apache.org on 2006/03/24 09:56:57 UTC

svn commit: r388460 - in /xmlgraphics/fop/trunk/src/java/org/apache/fop: image/ pdf/ render/pdf/ render/ps/

Author: jeremias
Date: Fri Mar 24 00:56:55 2006
New Revision: 388460

URL: http://svn.apache.org/viewcvs?rev=388460&view=rev
Log:
Bugfix for ICC color profile parsing in JPEG images.
Ported detection code for CMYK JPEG images generated by Adobe Photoshop from maintenance branch. Adobe inverts CMYK images.
Reenabled ICC color profile embedding for PDF.

Modified:
    xmlgraphics/fop/trunk/src/java/org/apache/fop/image/AbstractFopImage.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/image/FopImage.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/image/JpegImage.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/BitmapImage.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFImage.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFXObject.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/FopPDFImage.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSGraphics2D.java

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/image/AbstractFopImage.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/image/AbstractFopImage.java?rev=388460&r1=388459&r2=388460&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/image/AbstractFopImage.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/image/AbstractFopImage.java Fri Mar 24 00:56:55 2006
@@ -104,6 +104,11 @@
     protected Color transparentColor = null;
 
     /**
+     * Photoshop generated CMYK JPEGs are inverted.
+     */
+     protected boolean invertImage = false;
+    
+    /**
      * Constructor.
      * Construct a new FopImage object and initialize its default properties:
      * <UL>
@@ -321,6 +326,11 @@
         return this.transparentColor;
     }
 
+    /** @return true for CMYK images generated by Adobe Photoshop */
+    public boolean isInverted() {
+        return this.invertImage;
+    }
+    
     /**
      * Return the image data (pixels, uncompressed).
      * @return the image data

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/image/FopImage.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/image/FopImage.java?rev=388460&r1=388459&r2=388460&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/image/FopImage.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/image/FopImage.java Fri Mar 24 00:56:55 2006
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2005 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -141,6 +141,9 @@
      */
     byte[] getSoftMask();
 
+    /** @return true for CMYK images generated by Adobe Photoshop */
+    boolean isInverted();
+    
     /**
      * Returns the decoded and uncompressed image as a array of
      * width * height * [colorspace-multiplicator] pixels.

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/image/JpegImage.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/image/JpegImage.java?rev=388460&r1=388459&r2=388460&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/image/JpegImage.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/image/JpegImage.java Fri Mar 24 00:56:55 2006
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2005 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,12 +19,12 @@
 package org.apache.fop.image;
 
 // Java
-import java.io.ByteArrayOutputStream;
 import java.awt.color.ColorSpace;
 import java.awt.color.ICC_Profile;
 
 // FOP
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.fop.util.CMYKColorSpace;
 
 /**
@@ -36,6 +36,7 @@
 public class JpegImage extends AbstractFopImage {
     private ICC_Profile iccProfile = null;
     private boolean foundICCProfile = false;
+    private boolean hasAPPEMarker = false;
 
     /**
      * Create a jpeg image with the info.
@@ -55,7 +56,7 @@
      */
     protected boolean loadOriginalData() {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ByteArrayOutputStream iccStream = new ByteArrayOutputStream();
+        ByteArrayOutputStream iccStream = null;
         int index = 0;
         boolean cont = true;
 
@@ -136,6 +137,9 @@
                                               this.raw[index + 2],
                                               this.raw[index + 3]) + 2;
 
+                            if (iccStream == null) {
+                                iccStream = new ByteArrayOutputStream();
+                            }
                             iccStream.write(this.raw,
                                             index + 18, chunkSize - 18);
 
@@ -143,6 +147,21 @@
 
                         index += calcBytes(this.raw[index + 2],
                                            this.raw[index + 3]) + 2;
+                    // Check for Adobe APPE Marker
+                    } else if ((uByte(this.raw[index]) == 0xff
+                                && uByte(this.raw[index + 1]) == 0xee
+                                && uByte(this.raw[index + 2]) == 0
+                                && uByte(this.raw[index + 3]) == 14
+                                && "Adobe".equals(new String(this.raw, index + 4, 5)))) {
+                        // The reason for reading the APPE marker is that Adobe Photoshop
+                        // generates CMYK JPEGs with inverted values. The correct thing
+                        // to do would be to interpret the values in the marker, but for now
+                        // only assume that if APPE marker is present and colorspace is CMYK,
+                        // the image is inverted.
+                        hasAPPEMarker = true;
+
+                        index += calcBytes(this.raw[index + 2],
+                                           this.raw[index + 3]) + 2;
                     } else {
                         index += calcBytes(this.raw[index + 2],
                                            this.raw[index + 3]) + 2;
@@ -157,13 +176,15 @@
                          + "JpegImage - Invalid JPEG Header.");
             return false;
         }
-        if (iccStream.size() > 0) {
-            byte[] align = new byte[((iccStream.size()) % 8) + 8];
-            try {
-                iccStream.write(align);
-            } catch (Exception ex) {
-                log.error("Error while aligning ICC stream: " + ex.getMessage(), ex);
-                return false;
+        if (iccStream != null && iccStream.size() > 0) {
+            int padding = (8 - (iccStream.size() % 8)) % 8;
+            if (padding != 0) {
+                try {
+                    iccStream.write(new byte[padding]);
+                } catch (Exception ex) {
+                    log.error("Error while aligning ICC stream: " + ex.getMessage(), ex);
+                    return false;
+                }
             }
             try {
                 iccProfile = ICC_Profile.getInstance(iccStream.toByteArray());
@@ -174,6 +195,9 @@
         } else if (this.colorSpace == null) {
             log.error("ColorSpace not specified for JPEG image");
             return false;
+        }
+        if (hasAPPEMarker && this.colorSpace.getType() == ColorSpace.TYPE_CMYK) {
+            this.invertImage = true;
         }
         return true;
     }

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/BitmapImage.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/BitmapImage.java?rev=388460&r1=388459&r2=388460&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/BitmapImage.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/BitmapImage.java Fri Mar 24 00:56:55 2006
@@ -172,6 +172,11 @@
         return maskRef;
     }
 
+    /** @see org.apache.fop.pdf.PDFImage#isInverted() */
+    public boolean isInverted() {
+        return false;
+    }
+    
     /**
      * @see org.apache.fop.pdf.PDFImage#outputContents(OutputStream)
      */
@@ -208,7 +213,7 @@
     public PDFFilter getPDFFilter() {
         return null;
     }
-    
+
 }
 
 

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFImage.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFImage.java?rev=388460&r1=388459&r2=388460&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFImage.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFImage.java Fri Mar 24 00:56:55 2006
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2005 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -109,6 +109,9 @@
      */
     String getSoftMask();
 
+    /** @return true for CMYK images generated by Adobe Photoshop */
+    boolean isInverted();
+    
     /**
      * Get the PDF Filter to be applied to the image.
      *

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFXObject.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFXObject.java?rev=388460&r1=388459&r2=388460&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFXObject.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFXObject.java Fri Mar 24 00:56:55 2006
@@ -131,13 +131,18 @@
                   + "\n");
         }
 
-        /* PhotoShop generates CMYK values that's inverse,
-           this will invert the values - too bad if it's not
-           a PhotoShop image...
-         */
-        if (pdfimage.getColorSpace().getColorSpace()
-                == PDFColorSpace.DEVICE_CMYK) {
-            sb.append("/Decode [ 1.0 0.0 1.0 0.0 1.0 0.0 1.1 0.0 ]\n");
+        if (pdfimage.isInverted()) {
+            /* PhotoShop generates CMYK values that's inverse,
+             * this will invert the values - too bad if it's not
+             * a PhotoShop image...
+             */
+            if (pdfimage.getColorSpace().getColorSpace() == PDFColorSpace.DEVICE_CMYK) {
+                sb.append("/Decode [ 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 ]\n");
+            } else if (pdfimage.getColorSpace().getColorSpace() == PDFColorSpace.DEVICE_RGB) {
+                sb.append("/Decode [ 1.0 0.0 1.0 0.0 1.0 0.0 ]\n");
+            } else if (pdfimage.getColorSpace().getColorSpace() == PDFColorSpace.DEVICE_GRAY) {
+                sb.append("/Decode [ 1.0 0.0 ]\n");
+            }
         }
 
         if (pdfimage.isTransparent()) {

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/FopPDFImage.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/FopPDFImage.java?rev=388460&r1=388459&r2=388460&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/FopPDFImage.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/pdf/FopPDFImage.java Fri Mar 24 00:56:55 2006
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2005 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -81,12 +81,6 @@
             pdfFilter.setApplied(true);
             isDCT = true;
 
-            ICC_Profile prof = fopImage.getICCProfile();
-            PDFColorSpace pdfCS = toPDFColorSpace(fopImage.getColorSpace());
-            if (prof != null) {
-                pdfICCStream = doc.getFactory().makePDFICCStream();
-                pdfICCStream.setColorSpace(prof, pdfCS);
-            }
         } else if ("image/tiff".equals(fopImage.getMimeType())
                     && fopImage instanceof TIFFImage) {
             TIFFImage tiffImage = (TIFFImage) fopImage;
@@ -116,6 +110,12 @@
         } else {
             fopImage.load(FopImage.BITMAP);
         }
+        ICC_Profile prof = fopImage.getICCProfile();
+        PDFColorSpace pdfCS = toPDFColorSpace(fopImage.getColorSpace());
+        if (prof != null) {
+            pdfICCStream = doc.getFactory().makePDFICCStream();
+            pdfICCStream.setColorSpace(prof, pdfCS);
+        }
         //Handle transparency mask if applicable
         if (fopImage.hasSoftMask()) {
             byte [] softMask = fopImage.getSoftMask();
@@ -200,6 +200,11 @@
         return softMaskRef;
     }
 
+    /** @return true for CMYK images generated by Adobe Photoshop */
+    public boolean isInverted() {
+        return fopImage.isInverted();
+    }
+    
     /**
      * @see org.apache.fop.pdf.PDFImage#isPS()
      */

Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSGraphics2D.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSGraphics2D.java?rev=388460&r1=388459&r2=388460&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSGraphics2D.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ps/PSGraphics2D.java Fri Mar 24 00:56:55 2006
@@ -390,6 +390,10 @@
             return this.mask;
         }
 
+        public boolean isInverted() {
+            return false;
+        }
+        
         public byte[] getBitmaps() {
             return this.bitmaps;
         }



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org