You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2012/11/07 22:09:35 UTC

svn commit: r1406807 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject: CompositeImage.java PDJpeg.java

Author: lehmi
Date: Wed Nov  7 21:09:35 2012
New Revision: 1406807

URL: http://svn.apache.org/viewvc?rev=1406807&view=rev
Log:
PDFBOX-1440: added stencil mask support

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/CompositeImage.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/CompositeImage.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/CompositeImage.java?rev=1406807&r1=1406806&r2=1406807&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/CompositeImage.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/CompositeImage.java Wed Nov  7 21:09:35 2012
@@ -17,6 +17,7 @@
 package org.apache.pdfbox.pdmodel.graphics.xobject;
 
 import java.awt.image.BufferedImage;
+import java.awt.image.WritableRaster;
 import java.io.IOException;
 
 import org.apache.pdfbox.cos.COSArray;
@@ -56,6 +57,11 @@ public class CompositeImage
     /**
      * This method applies the specified transparency mask to a given image and returns a new BufferedImage
      * whose alpha values are computed from the transparency mask (smask) image.
+     * 
+     * @param decodeArray the decode array
+     * @return the masked image
+     * @throws IOException if something went wrong
+     * 
      */
     public BufferedImage createMaskedImage(COSArray decodeArray) throws IOException
     {
@@ -71,7 +77,6 @@ public class CompositeImage
 
         final int baseImageWidth = baseImage.getWidth();
         final int baseImageHeight = baseImage.getHeight();
-
         BufferedImage result = new BufferedImage(baseImageWidth, baseImageHeight, BufferedImage.TYPE_INT_ARGB);
         for (int x = 0; x < baseImageWidth; x++)
         {
@@ -101,4 +106,32 @@ public class CompositeImage
         }
         return result;
     }
+
+    /**
+     * This method applies the specified stencil mask to a given image and returns a new BufferedImage
+     * whose alpha values are computed from the stencil mask (smask) image.
+     * 
+     * @return the stencil masked image 
+     */
+    public BufferedImage createStencilMaskedImage()
+    {
+        final int baseImageWidth = baseImage.getWidth();
+        final int baseImageHeight = baseImage.getHeight();
+        WritableRaster maskRaster = smaskImage.getRaster();
+        BufferedImage result = new BufferedImage(baseImageWidth, baseImageHeight, BufferedImage.TYPE_INT_ARGB);
+        int[] alpha = new int[1];
+        for (int x = 0; x < baseImageWidth; x++)
+        {
+            for (int y = 0; y < baseImageHeight; y++)
+            {
+                maskRaster.getPixel(x, y, alpha);
+                // We need to remove any alpha value in the main image.
+                int rgbOnly = 0x00FFFFFF & baseImage.getRGB(x, y);
+                int alphaOnly = alpha[0] == 0 ? 0xFF000000 : 0;
+                result.setRGB(x, y, rgbOnly | alphaOnly);
+            }
+        }
+        return result;
+    }
+
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java?rev=1406807&r1=1406806&r2=1406807&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java Wed Nov  7 21:09:35 2012
@@ -43,7 +43,7 @@ import javax.imageio.ImageReader;
 import javax.imageio.metadata.IIOMetadata;
 import javax.imageio.stream.ImageInputStream;
 
-import org.apache.pdfbox.cos.COSArray;
+import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
 
@@ -279,20 +279,27 @@ public class PDJpeg extends PDXObjectIma
             bi = ImageIO.read(bai);
         }
 
-        // If there is a 'soft mask' image then we use that as a transparency mask.
-        PDXObjectImage smask = getSMaskImage();
-        if (smask != null)
-        {
-            BufferedImage smaskBI = smask.getRGBImage();
-
-            COSArray decodeArray = smask.getDecode();
-            CompositeImage compositeImage = new CompositeImage(bi, smaskBI);
-            BufferedImage rgbImage = compositeImage.createMaskedImage(decodeArray);
-
+        // If there is a 'soft mask' or 'mask' image then we use that as a transparency mask.
+        PDXObjectImage maskImage = getSMaskImage();
+        if (maskImage != null)
+        {
+            CompositeImage compositeImage = new CompositeImage(bi, maskImage.getRGBImage());
+            BufferedImage rgbImage = compositeImage.createMaskedImage(maskImage.getDecode());
             image = rgbImage;
         }
         else
         {
+            COSBase mask = getMask();
+            if (mask != null && mask instanceof COSDictionary)
+            {
+            	maskImage = (PDXObjectImage)PDXObject.createXObject(mask);
+                CompositeImage compositeImage = new CompositeImage(bi, maskImage.getRGBImage());
+                BufferedImage rgbImage = compositeImage.createStencilMaskedImage();
+                image = rgbImage;
+            }	
+        }
+        if (image == null)
+        {
             // But if there is no soft mask, use the unaltered image.
             image = bi;
         }