]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
The default sRGB color profile provided by the Java class library is no longer embedd...
authorJeremias Maerki <jeremias@apache.org>
Sun, 7 May 2006 13:43:35 +0000 (13:43 +0000)
committerJeremias Maerki <jeremias@apache.org>
Sun, 7 May 2006 13:43:35 +0000 (13:43 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@404759 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/render/pdf/FopPDFImage.java
src/java/org/apache/fop/render/pdf/PDFRenderer.java
src/java/org/apache/fop/util/ColorProfileUtil.java [new file with mode: 0644]
status.xml

index 2ecdcbcecaf9b3c7919ca08aabf7a0b462cac7f7..eed46a2181277b49f63a281093c3f3bfe108bef3 100644 (file)
@@ -17,6 +17,8 @@
 /* $Id$ */
 
 package org.apache.fop.render.pdf;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.fop.pdf.PDFConformanceException;
 import org.apache.fop.pdf.PDFFilterList;
 import org.apache.fop.pdf.PDFImage;
@@ -29,6 +31,7 @@ import org.apache.fop.pdf.CCFFilter;
 import org.apache.fop.pdf.PDFColorSpace;
 import org.apache.fop.pdf.PDFXObject;
 import org.apache.fop.pdf.BitmapImage;
+import org.apache.fop.util.ColorProfileUtil;
 
 import org.apache.fop.image.FopImage;
 import org.apache.fop.image.EPSImage;
@@ -44,6 +47,9 @@ import java.awt.color.ICC_Profile;
  */
 public class FopPDFImage implements PDFImage {
 
+    /** logging instance */
+    private static Log log = LogFactory.getLog(FopPDFImage.class);
+
     private FopImage fopImage;
     private PDFICCStream pdfICCStream = null;
     private PDFFilter pdfFilter = null;
@@ -114,8 +120,18 @@ public class FopPDFImage implements PDFImage {
         ICC_Profile prof = fopImage.getICCProfile();
         PDFColorSpace pdfCS = toPDFColorSpace(fopImage.getColorSpace());
         if (prof != null) {
-            pdfICCStream = doc.getFactory().makePDFICCStream();
-            pdfICCStream.setColorSpace(prof, pdfCS);
+            boolean defaultsRGB = ColorProfileUtil.isDefaultsRGB(prof);
+            if (log.isDebugEnabled()) {
+                String desc = ColorProfileUtil.getICCProfileDescription(prof);
+                log.debug("Image returns ICC profile: " + desc + ", default sRGB=" + defaultsRGB);
+            }
+            //TODO Instead of skipping the ICC profile for sRGB, let's think about embedding our 
+            //own sRGB profile instead, but if possible only once per PDF (Need a new structure in 
+            //the PDF library for that).
+            if (!defaultsRGB) {
+                pdfICCStream = doc.getFactory().makePDFICCStream();
+                pdfICCStream.setColorSpace(prof, pdfCS);
+            }
         }
         //Handle transparency mask if applicable
         if (fopImage.hasSoftMask()) {
index fbc7049ca2569cdbf8fe04ad07b2e3eeda265941..86dbea0641de7d24036583c5df65a19cb29686e3 100644 (file)
@@ -90,6 +90,7 @@ import org.apache.fop.render.AbstractPathOrientedRenderer;
 import org.apache.fop.render.Graphics2DAdapter;
 import org.apache.fop.render.RendererContext;
 import org.apache.fop.util.CharUtilities;
+import org.apache.fop.util.ColorProfileUtil;
 import org.apache.fop.fo.Constants;
 import org.apache.fop.fo.extensions.ExtensionAttachment;
 import org.apache.fop.fo.extensions.xmp.XMPMetadata;
@@ -387,7 +388,7 @@ public class PDFRenderer extends AbstractPathOrientedRenderer {
             //Fallback: Use the sRGB profile from the JRE (about 140KB)
             profile = ICC_Profile.getInstance(ColorSpace.CS_sRGB);
         }
-        String desc = getICCProfileDescription(profile);
+        String desc = ColorProfileUtil.getICCProfileDescription(profile);
         
         icc.setColorSpace(profile, null);
         outputIntent.setDestOutputProfile(icc);
@@ -396,22 +397,6 @@ public class PDFRenderer extends AbstractPathOrientedRenderer {
         pdfDoc.getRoot().addOutputIntent(outputIntent);
     }
 
-    private String getICCProfileDescription(ICC_Profile profile) {
-        byte[] data = profile.getData(ICC_Profile.icSigProfileDescriptionTag);
-        if (data == null) {
-            return null;
-        } else {
-            //Info on the data format: http://www.color.org/ICC-1_1998-09.PDF
-            int length = (data[8] << 3 * 8) | (data[9] << 2 * 8) | (data[10] << 8) | data[11];
-            length--; //Remove trailing NUL character
-            try {
-                return new String(data, 12, length, "US-ASCII");
-            } catch (UnsupportedEncodingException e) {
-                throw new UnsupportedOperationException("Incompatible VM");
-            }
-        }
-    }
-    
     /**
      * @see org.apache.fop.render.Renderer#stopRenderer()
      */
diff --git a/src/java/org/apache/fop/util/ColorProfileUtil.java b/src/java/org/apache/fop/util/ColorProfileUtil.java
new file mode 100644 (file)
index 0000000..8c0e779
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright 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.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.util;
+
+import java.awt.color.ColorSpace;
+import java.awt.color.ICC_ColorSpace;
+import java.awt.color.ICC_Profile;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * Helper methods for handling color profiles.
+ */
+public class ColorProfileUtil {
+
+    /**
+     * Returns the profile description of an ICC profile
+     * @param profile the profile
+     * @return the description
+     */
+    public static String getICCProfileDescription(ICC_Profile profile) {
+        byte[] data = profile.getData(ICC_Profile.icSigProfileDescriptionTag);
+        if (data == null) {
+            return null;
+        } else {
+            //Info on the data format: http://www.color.org/ICC-1_1998-09.PDF
+            int length = (data[8] << 3 * 8) | (data[9] << 2 * 8) | (data[10] << 8) | data[11];
+            length--; //Remove trailing NUL character
+            try {
+                return new String(data, 12, length, "US-ASCII");
+            } catch (UnsupportedEncodingException e) {
+                throw new UnsupportedOperationException("Incompatible VM");
+            }
+        }
+    }
+    
+    /**
+     * Indicates whether a given color profile is identical to the default sRGB profile
+     * provided by the Java class library.
+     * @param profile the color profile to check
+     * @return true if it is the default sRGB profile
+     */
+    public static boolean isDefaultsRGB(ICC_Profile profile) {
+        ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+        ICC_Profile sRGBProfile = null;
+        if (sRGB instanceof ICC_ColorSpace) {
+            sRGBProfile = ((ICC_ColorSpace)sRGB).getProfile();
+        }
+        return profile == sRGBProfile;
+    }
+    
+}
index f27e30a18682277e8bb684d6fa0ee165270b644f..c2f835f6523c1801d68fb02d92f2bd678ca9ef6d 100644 (file)
 
   <changes>
     <release version="FOP Trunk">
+      <action context="Code" dev="JM" type="update">
+        The default sRGB color profile provided by the Java class library is no longer
+        embedded if it is encountered. This should reduce the PDF size considerably.
+      </action>
       <action context="Code" dev="JM" type="fix" fixes-bug="39443">
         Bugfix: Sections with span="all" lead to overlapping text if spanning multiple pages.
       </action>