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 );
}