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 2010/06/20 13:26:19 UTC

svn commit: r956347 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics: color/PDIndexed.java xobject/PDPixelMap.java

Author: lehmi
Date: Sun Jun 20 11:26:19 2010
New Revision: 956347

URL: http://svn.apache.org/viewvc?rev=956347&view=rev
Log:
PDFBOX-705: added transparency/opacity to a PDPixelMap if an indexed colorspace is used.

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDIndexed.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDIndexed.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDIndexed.java?rev=956347&r1=956346&r2=956347&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDIndexed.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDIndexed.java Sun Jun 20 11:26:19 2010
@@ -55,6 +55,11 @@ public class PDIndexed extends PDColorSp
     private COSArray array;
 
     /**
+     * The lookup data as byte array.
+     */
+    private byte[] lookupData;
+    
+    /**
      * Constructor, default DeviceRGB, hival 255.
      */
     public PDIndexed()
@@ -220,38 +225,46 @@ public class PDIndexed extends PDColorSp
         return (data[lookupIndex*numberOfComponents + componentNumber]+256)%256;
     }
 
-    private byte[] getLookupData() throws IOException
+    /**
+     * Get the lookup data table.
+     * 
+     * @return a byte array containing the the lookup data.
+     * @throws IOException if an error occurs.
+     */
+    public byte[] getLookupData() throws IOException
     {
-        COSBase lookupTable = array.getObject( 3 );
-        byte[] data = null;
-        if( lookupTable instanceof COSString )
-        {
-            data = ((COSString)lookupTable).getBytes();
-        }
-        else if( lookupTable instanceof COSStream )
+        if ( lookupData == null)
         {
-            //Data will be small so just load the whole thing into memory for
-            //easier processing
-            COSStream lookupStream = (COSStream)lookupTable;
-            InputStream input = lookupStream.getUnfilteredStream();
-            ByteArrayOutputStream output = new ByteArrayOutputStream(1024);
-            byte[] buffer = new byte[ 1024 ];
-            int amountRead;
-            while( (amountRead = input.read(buffer, 0, buffer.length)) != -1 )
+            COSBase lookupTable = array.getObject( 3 );
+            if( lookupTable instanceof COSString )
             {
-                output.write( buffer, 0, amountRead );
+                lookupData = ((COSString)lookupTable).getBytes();
+            }
+            else if( lookupTable instanceof COSStream )
+            {
+                //Data will be small so just load the whole thing into memory for
+                //easier processing
+                COSStream lookupStream = (COSStream)lookupTable;
+                InputStream input = lookupStream.getUnfilteredStream();
+                ByteArrayOutputStream output = new ByteArrayOutputStream(1024);
+                byte[] buffer = new byte[ 1024 ];
+                int amountRead;
+                while( (amountRead = input.read(buffer, 0, buffer.length)) != -1 )
+                {
+                    output.write( buffer, 0, amountRead );
+                }
+                lookupData = output.toByteArray();
+            }
+            else if( lookupTable == null )
+            {
+                lookupData = new byte[0];
+            }
+            else
+            {
+                throw new IOException( "Error: Unknown type for lookup table " + lookupTable );
             }
-            data = output.toByteArray();
-        }
-        else if( lookupTable == null )
-        {
-            data = new byte[0];
-        }
-        else
-        {
-            throw new IOException( "Error: Unknown type for lookup table " + lookupTable );
         }
-        return data;
+        return lookupData;
     }
 
     /**

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java?rev=956347&r1=956346&r2=956347&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java Sun Jun 20 11:26:19 2010
@@ -17,6 +17,7 @@
 package org.apache.pdfbox.pdmodel.graphics.xobject;
 
 import java.awt.Transparency;
+import java.awt.image.DataBuffer;
 import java.awt.image.DataBufferByte;
 import java.awt.image.BufferedImage;
 import java.awt.image.ColorModel;
@@ -39,6 +40,7 @@ import org.apache.pdfbox.pdmodel.common.
 import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
 import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray;
 import org.apache.pdfbox.pdmodel.graphics.color.PDICCBased;
+import org.apache.pdfbox.pdmodel.graphics.color.PDIndexed;
 import org.apache.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm;
 
 
@@ -193,6 +195,41 @@ public class PDPixelMap extends PDXObjec
                     else
                         cm = colorspace.createColorModel( bpc );
                 }
+                else if (colorspace instanceof PDIndexed)
+                {
+                    PDIndexed csIndexed = (PDIndexed)colorspace;
+                    ColorModel baseColorModel = csIndexed.getBaseColorSpace().createColorModel(bpc);
+                    int size = csIndexed.getHighValue();
+                    byte[] index = csIndexed.getLookupData();
+                    COSArray decode = getDecode();
+                    boolean isOpaque = (decode != null && decode.getInt(0) == 1) ? true : false;
+                    boolean hasAlpha = baseColorModel.hasAlpha();
+                    if( baseColorModel.getTransferType() != DataBuffer.TYPE_BYTE )
+                    {
+                        throw new IOException( "Not implemented" );
+                    }
+                    byte[] r = new byte[size+1];
+                    byte[] g = new byte[size+1];
+                    byte[] b = new byte[size+1];
+                    byte[] a = new byte[size+1];
+                    byte[] inData = new byte[baseColorModel.getNumComponents()];
+                    for( int i = 0; i <= size; i++ )
+                    {
+                        System.arraycopy(index, i * inData.length, inData, 0, inData.length);
+                        r[i] = (byte)baseColorModel.getRed(inData);
+                        g[i] = (byte)baseColorModel.getGreen(inData);
+                        b[i] = (byte)baseColorModel.getBlue(inData);
+                        if( hasAlpha )
+                        {
+                            a[i] = (byte)baseColorModel.getAlpha(inData);
+                        }
+                        else
+                        {
+                            a[i] = isOpaque ? (byte)0xFF : (byte)0x00;
+                        }
+                    }
+                    cm = new IndexColorModel(bpc, size+1, r, g, b, a);
+                }
                 else
                     cm = colorspace.createColorModel( bpc );
             }