Author: jahewson Date: Fri Jan 2 22:27:01 2015 New Revision: 1649143 URL: http://svn.apache.org/r1649143 Log: PDFBOX-2587: Replace embedded sRGB profiles with Java's built-in one
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java?rev=1649143&r1=1649142&r2=1649143&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java Fri Jan 2 22:27:01 2015 @@ -16,6 +16,11 @@ */ package org.apache.pdfbox.pdmodel.graphics.color; +import java.awt.color.ColorSpace; +import java.io.ByteArrayInputStream; +import java.io.DataInput; +import java.io.DataInputStream; +import java.util.Arrays; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.pdfbox.cos.COSArray; @@ -42,6 +47,7 @@ import java.io.InputStream; import java.io.IOException; import java.util.List; +import org.apache.pdfbox.util.Charsets; /** * ICCBased colour spaces are based on a cross-platform colour profile as defined by the @@ -98,15 +104,29 @@ public final class PDICCBased extends PD return stream; } - // load the ICC profile, or init alternateColorSpace color space + /** + * Load the ICC profile, or init alternateColorSpace color space. + */ private void loadICCProfile() throws IOException { - InputStream profile = null; + InputStream input = null; try { - profile = stream.createInputStream(); - iccProfile = ICC_Profile.getInstance(profile); - awtColorSpace = new ICC_ColorSpace(iccProfile); + input = this.stream.createInputStream(); + + // if the embedded profile is sRGB then we can use Java's built-in profile, which + // results in a large performance gain as it's our native color space, see PDFBOX-2587 + ICC_Profile profile = ICC_Profile.getInstance(input); + if (is_sRGB(profile)) + { + awtColorSpace = (ICC_ColorSpace)ColorSpace.getInstance(ColorSpace.CS_sRGB); + iccProfile = awtColorSpace.getProfile(); + } + else + { + awtColorSpace = new ICC_ColorSpace(profile); + iccProfile = profile; + } // set initial colour float[] initial = new float[getNumberOfComponents()]; @@ -139,10 +159,21 @@ public final class PDICCBased extends PD } finally { - IOUtils.closeQuietly(profile); + IOUtils.closeQuietly(input); } } + /** + * Returns true if the given profile is represents sRGB. + */ + private boolean is_sRGB(ICC_Profile profile) + { + byte[] bytes = Arrays.copyOfRange(profile.getData(ICC_Profile.icSigHead), + ICC_Profile.icHdrModel, ICC_Profile.icHdrModel + 7); + String deviceModel = new String(bytes, Charsets.US_ASCII).trim(); + return deviceModel.equals("sRGB"); + } + @Override public float[] toRGB(float[] value) throws IOException {