You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2016/02/02 18:05:06 UTC

svn commit: r1728160 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java

Author: tilman
Date: Tue Feb  2 17:05:06 2016
New Revision: 1728160

URL: http://svn.apache.org/viewvc?rev=1728160&view=rev
Log:
PDFBOX-3221: apply transfer function

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java?rev=1728160&r1=1728159&r2=1728160&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java Tue Feb  2 17:05:06 2016
@@ -33,7 +33,9 @@ import java.awt.geom.PathIterator;
 import java.awt.geom.Point2D;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
 import java.awt.image.Raster;
+import java.awt.image.WritableRaster;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
@@ -42,9 +44,11 @@ import org.apache.commons.logging.LogFac
 import org.apache.pdfbox.contentstream.PDFGraphicsStreamEngine;
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBase;
+import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSNumber;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
+import org.apache.pdfbox.pdmodel.common.function.PDFunction;
 import org.apache.pdfbox.pdmodel.font.PDCIDFontType0;
 import org.apache.pdfbox.pdmodel.font.PDCIDFontType2;
 import org.apache.pdfbox.pdmodel.font.PDFont;
@@ -807,6 +811,12 @@ public class PageDrawer extends PDFGraph
         }
         else
         {
+            COSBase transfer = getGraphicsState().getTransfer();
+            if (transfer instanceof COSArray || transfer instanceof COSDictionary)
+            {
+                image = applyTransferFunction(image, transfer);
+            }
+
             int width = image.getWidth(null);
             int height = image.getHeight(null);
             AffineTransform imageTransform = new AffineTransform(at);
@@ -816,6 +826,44 @@ public class PageDrawer extends PDFGraph
         }
     }
 
+    private BufferedImage applyTransferFunction(BufferedImage image, COSBase transfer) throws IOException
+    {
+        // Deep copy http://stackoverflow.com/a/26894825/535646
+        ColorModel cm = image.getColorModel();
+        boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
+        WritableRaster raster = image.copyData(image.getRaster().createCompatibleWritableRaster());
+        BufferedImage bim = new BufferedImage(cm, raster, isAlphaPremultiplied, null);
+
+        PDFunction rf, gf, bf;
+        if (transfer instanceof COSArray)
+        {
+            COSArray ar = (COSArray) transfer;
+            rf = PDFunction.create(ar.getObject(0));
+            gf = PDFunction.create(ar.getObject(1));
+            bf = PDFunction.create(ar.getObject(2));
+        }
+        else
+        {
+            rf = gf = bf = PDFunction.create(transfer);
+        }
+        float input[] = new float[1];
+        for (int x = 0; x < image.getWidth(); ++x)
+        {
+            for (int y = 0; y < image.getHeight(); ++y)
+            {
+                int rgb = image.getRGB(x, y);
+                input[0] = ((rgb >> 16) & 0xFF) / 255f;
+                int r = (int) (rf.eval(input)[0] * 255);
+                input[0] = ((rgb >> 8) & 0xFF) / 255f;
+                int g = (int) (gf.eval(input)[0] * 255);
+                input[0] = (rgb & 0xFF) / 255f;
+                int b = (int) (bf.eval(input)[0] * 255);
+                bim.setRGB(x, y, (rgb & 0xFF000000) | (r << 16) | (g << 8) | b);
+            }
+        }
+        return bim;
+    }
+
     @Override
     public void shadingFill(COSName shadingName) throws IOException
     {