Author: lehmi
Date: Mon Jan 14 19:13:39 2013
New Revision: 1433060
URL: http://svn.apache.org/viewvc?rev=1433060&view=rev
Log:
PDFBOX-1490: extended the Indexed colorspace so that it can be used as
(non)stroking color
Added:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingIndexed.java
(with props)
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingIndexed.java
(with props)
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
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingColor.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingColor.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=1433060&r1=1433059&r2=1433060&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
Mon Jan 14 19:13:39 2013
@@ -54,10 +54,17 @@ public class PDIndexed extends PDColorSp
private COSArray array;
+ private PDColorSpace baseColorspace = null;
+ private ColorModel baseColorModel = null;
+
/**
* The lookup data as byte array.
*/
private byte[] lookupData;
+
+ private byte[] indexedColorValues;
+ private int indexNumOfComponents;
+ private int maxIndex;
/**
* Constructor, default DeviceRGB, hival 255.
@@ -113,7 +120,7 @@ public class PDIndexed extends PDColorSp
*/
protected ColorSpace createColorSpace() throws IOException
{
- throw new IOException( "Not implemented" );
+ return getBaseColorSpace().getJavaColorSpace();
}
/**
@@ -127,40 +134,31 @@ public class PDIndexed extends PDColorSp
*/
public ColorModel createColorModel( int bpc ) throws IOException
{
- int size = getHighValue();
- byte[] index = getLookupData();
- PDColorSpace baseColorSpace = getBaseColorSpace();
- ColorModel cm = null;
- if( baseColorSpace instanceof PDDeviceRGB )
+ return createColorModel(bpc, -1);
+ }
+
+ /**
+ * Create a Java color model for this colorspace including the given mask
value.
+ *
+ * @param bpc The number of bits per component.
+ * @param mask the mask value, -1 indicates no mask
+ *
+ * @return A color model that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color model.
+ */
+ public ColorModel createColorModel( int bpc, int mask ) throws IOException
+ {
+ ColorModel colorModel = getBaseColorModel(bpc);
+ calculateIndexedColorValues(colorModel, bpc);
+ if (mask > -1)
{
- cm = new IndexColorModel(bpc, size+1, index,0,false);
+ return new IndexColorModel(bpc, maxIndex+1, indexedColorValues, 0,
colorModel.hasAlpha(), mask);
}
else
{
- ColorModel baseColorModel = baseColorSpace.createColorModel(bpc);
- 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 = baseColorModel.hasAlpha() ? new byte[size+1] : null;
- 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(a != null)
- {
- a[i] = (byte)baseColorModel.getAlpha(inData);
- }
- }
- cm = a == null ? new IndexColorModel(bpc, size+1, r, g, b) : new
IndexColorModel(bpc, size+1, r, g, b, a);
+ return new IndexColorModel(bpc, maxIndex+1, indexedColorValues, 0,
colorModel.hasAlpha());
}
- return cm;
}
/**
@@ -172,8 +170,12 @@ public class PDIndexed extends PDColorSp
*/
public PDColorSpace getBaseColorSpace() throws IOException
{
- COSBase base = array.getObject( 1 );
- return PDColorSpaceFactory.createColorSpace( base );
+ if (baseColorspace == null)
+ {
+ COSBase base = array.getObject( 1 );
+ baseColorspace = PDColorSpaceFactory.createColorSpace( base );
+ }
+ return baseColorspace;
}
/**
@@ -184,6 +186,7 @@ public class PDIndexed extends PDColorSp
public void setBaseColorSpace( PDColorSpace base )
{
array.set( 1, base.getCOSObject() );
+ baseColorspace = base;
}
/**
@@ -285,4 +288,74 @@ public class PDIndexed extends PDColorSp
COSString string = new COSString( data );
array.set( 3, string );
}
+
+ /**
+ * Returns the components of the color for the given index.
+ * @param index the index of the color value
+ * @return COSArray with the color components
+ * @throws IOException If the tint function is not supported
+ */
+ public float[] calculateColorValues(int index) throws IOException
+ {
+ // TODO bpc != 8 ??
+ calculateIndexedColorValues(getBaseColorModel(8), 8);
+ float[] colorValues = null;
+ if (index < maxIndex)
+ {
+ int bufferIndex = index * indexNumOfComponents;
+ colorValues = new float[indexNumOfComponents];
+ for (int i=0; i < indexNumOfComponents; i++)
+ {
+ colorValues[i] = (float)indexedColorValues[bufferIndex+i];
+ }
+ }
+ return colorValues;
+ }
+
+ private ColorModel getBaseColorModel(int bpc) throws IOException
+ {
+ if (baseColorModel == null)
+ {
+ baseColorModel = getBaseColorSpace().createColorModel(bpc);
+ }
+ return baseColorModel;
+ }
+
+ private void calculateIndexedColorValues(ColorModel colorModel, int bpc)
throws IOException
+ {
+ if (indexedColorValues == null)
+ {
+ // number of possible color values in the target color space
+ int numberOfColorValues = 1 << bpc;
+ // number of indexed color values
+ int highValue = getHighValue();
+ // choose the correct size, sometimes there are more indexed
values than needed
+ // and sometimes there are fewer indexed value than possible
+ maxIndex = Math.min(numberOfColorValues-1, highValue);
+ byte[] index = getLookupData();
+ if( baseColorModel.getTransferType() != DataBuffer.TYPE_BYTE )
+ {
+ throw new IOException( "Not implemented" );
+ }
+ boolean hasAlpha = baseColorModel.hasAlpha();
+ indexNumOfComponents = 3 + ( hasAlpha ? 1 : 0);
+ int buffersize = (maxIndex+1) * indexNumOfComponents;
+ indexedColorValues = new byte[buffersize];
+ byte[] inData = new byte[baseColorModel.getNumComponents()];
+ int bufferIndex = 0;
+ for( int i = 0; i <= maxIndex; i++ )
+ {
+ System.arraycopy(index, i * inData.length, inData, 0,
inData.length);
+ indexedColorValues[bufferIndex] =
(byte)colorModel.getRed(inData);
+ indexedColorValues[bufferIndex+1] =
(byte)colorModel.getGreen(inData);
+ indexedColorValues[bufferIndex+2] =
(byte)colorModel.getBlue(inData);
+ if(hasAlpha)
+ {
+ indexedColorValues[bufferIndex+3] =
(byte)colorModel.getAlpha(inData);
+ }
+ bufferIndex += indexNumOfComponents;
+ }
+ }
+ }
+
}
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=1433060&r1=1433059&r2=1433060&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
Mon Jan 14 19:13:39 2013
@@ -200,50 +200,14 @@ public class PDPixelMap extends PDXObjec
if (colorspace instanceof PDIndexed)
{
PDIndexed csIndexed = (PDIndexed)colorspace;
- // the base color space uses 8 bit per component, as the
indexed color values
- // of an indexed color space are always in a range from 0 to
255
- ColorModel baseColorModel =
csIndexed.getBaseColorSpace().createColorModel(8);
- // number of possible color values in the target color space
- int numberOfColorValues = 1 << bpc;
- // number of indexed color values
- int highValue = csIndexed.getHighValue();
- // choose the correct size, sometimes there are more indexed
values than needed
- // and sometimes there are fewer indexed value than possible
- int size = Math.min(numberOfColorValues-1, highValue);
- byte[] index = csIndexed.getLookupData();
- boolean hasAlpha = baseColorModel.hasAlpha();
COSBase maskArray = getMask();
- if( baseColorModel.getTransferType() != DataBuffer.TYPE_BYTE )
- {
- throw new IOException( "Not implemented" );
- }
- // the IndexColorModel uses RGB-based color values
- // which leads to 3 color components and a optional alpha
channel
- int numberOfComponents = 3 + (hasAlpha ? 1 : 0);
- int buffersize = (size+1) * numberOfComponents;
- byte[] colorValues = new byte[buffersize];
- byte[] inData = new byte[baseColorModel.getNumComponents()];
- int bufferIndex = 0;
- for( int i = 0; i <= size; i++ )
- {
- System.arraycopy(index, i * inData.length, inData, 0,
inData.length);
- // convert the indexed color values to RGB
- colorValues[bufferIndex] =
(byte)baseColorModel.getRed(inData);
- colorValues[bufferIndex+1] =
(byte)baseColorModel.getGreen(inData);
- colorValues[bufferIndex+2] =
(byte)baseColorModel.getBlue(inData);
- if( hasAlpha )
- {
- colorValues[bufferIndex+3] =
(byte)baseColorModel.getAlpha(inData);
- }
- bufferIndex += numberOfComponents;
- }
if (maskArray != null && maskArray instanceof COSArray)
{
- cm = new IndexColorModel(bpc, size+1, colorValues, 0,
hasAlpha, ((COSArray)maskArray).getInt(0));
+ cm = csIndexed.createColorModel(bpc,
((COSArray)maskArray).getInt(0));
}
else
{
- cm = new IndexColorModel(bpc, size+1, colorValues, 0,
hasAlpha);
+ cm = csIndexed.createColorModel(bpc);
}
}
else if (colorspace instanceof PDSeparation)
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingColor.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingColor.java?rev=1433060&r1=1433059&r2=1433060&view=diff
==============================================================================
---
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingColor.java
(original)
+++
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingColor.java
Mon Jan 14 19:13:39 2013
@@ -28,6 +28,7 @@ import org.apache.pdfbox.pdmodel.graphic
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceCMYK;
import org.apache.pdfbox.pdmodel.graphics.color.PDICCBased;
import org.apache.pdfbox.pdmodel.graphics.color.PDCalRGB;
+import org.apache.pdfbox.pdmodel.graphics.color.PDIndexed;
import org.apache.pdfbox.pdmodel.graphics.color.PDPattern;
import org.apache.pdfbox.pdmodel.graphics.color.PDSeparation;
import org.apache.pdfbox.util.PDFOperator;
@@ -91,6 +92,10 @@ public class SetNonStrokingColor extends
{
newOperator = new SetNonStrokingPattern();
}
+ else if (colorSpace instanceof PDIndexed)
+ {
+ newOperator = new SetNonStrokingIndexed();
+ }
if (newOperator != null)
{
Added:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingIndexed.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingIndexed.java?rev=1433060&view=auto
==============================================================================
---
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingIndexed.java
(added)
+++
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingIndexed.java
Mon Jan 14 19:13:39 2013
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pdfbox.util.operator;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.pdfbox.cos.COSBase;
+import org.apache.pdfbox.cos.COSInteger;
+import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.apache.pdfbox.pdmodel.graphics.color.PDColorState;
+import org.apache.pdfbox.pdmodel.graphics.color.PDIndexed;
+import org.apache.pdfbox.util.PDFOperator;
+
+/**
+ *
+ * @version $Revision: 1.0 $
+ */
+public class SetNonStrokingIndexed extends OperatorProcessor
+{
+
+ /**
+ * scn Set color space for non stroking operations.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List<COSBase> arguments) throws
IOException
+ {
+ PDColorState colorInstance =
context.getGraphicsState().getNonStrokingColor();
+ PDColorSpace colorSpace = colorInstance.getColorSpace();
+
+ if (colorSpace != null)
+ {
+ PDIndexed indexed = (PDIndexed) colorSpace;
+ colorSpace = indexed.getBaseColorSpace();
+ COSInteger colorValue = (COSInteger)arguments.get(0);
+
colorInstance.setColorSpaceValue(indexed.calculateColorValues(colorValue.intValue()));
+ }
+ }
+}
Propchange:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingIndexed.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingColor.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingColor.java?rev=1433060&r1=1433059&r2=1433060&view=diff
==============================================================================
---
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingColor.java
(original)
+++
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingColor.java
Mon Jan 14 19:13:39 2013
@@ -28,6 +28,7 @@ import org.apache.pdfbox.pdmodel.graphic
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceCMYK;
import org.apache.pdfbox.pdmodel.graphics.color.PDICCBased;
import org.apache.pdfbox.pdmodel.graphics.color.PDCalRGB;
+import org.apache.pdfbox.pdmodel.graphics.color.PDIndexed;
import org.apache.pdfbox.pdmodel.graphics.color.PDPattern;
import org.apache.pdfbox.pdmodel.graphics.color.PDSeparation;
import org.apache.pdfbox.util.PDFOperator;
@@ -91,6 +92,10 @@ public class SetStrokingColor extends Op
{
newOperator = new SetStrokingPattern();
}
+ else if (colorSpace instanceof PDIndexed)
+ {
+ newOperator = new SetStrokingIndexed();
+ }
if (newOperator != null)
{
Added:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingIndexed.java
URL:
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingIndexed.java?rev=1433060&view=auto
==============================================================================
---
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingIndexed.java
(added)
+++
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingIndexed.java
Mon Jan 14 19:13:39 2013
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pdfbox.util.operator;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.pdfbox.cos.COSBase;
+import org.apache.pdfbox.cos.COSInteger;
+import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.apache.pdfbox.pdmodel.graphics.color.PDColorState;
+import org.apache.pdfbox.pdmodel.graphics.color.PDIndexed;
+import org.apache.pdfbox.util.PDFOperator;
+
+/**
+ *
+ * @version $Revision: 1.0 $
+ */
+public class SetStrokingIndexed extends OperatorProcessor
+{
+
+ /**
+ * scn Set color space for non stroking operations.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List<COSBase> arguments) throws
IOException
+ {
+ PDColorState colorInstance =
context.getGraphicsState().getStrokingColor();
+ PDColorSpace colorSpace = colorInstance.getColorSpace();
+
+ if (colorSpace != null)
+ {
+ PDIndexed indexed = (PDIndexed) colorSpace;
+ colorSpace = indexed.getBaseColorSpace();
+ COSInteger colorValue = (COSInteger)arguments.get(0);
+
colorInstance.setColorSpaceValue(indexed.calculateColorValues(colorValue.intValue()));
+ }
+ }
+}
Propchange:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingIndexed.java
------------------------------------------------------------------------------
svn:eol-style = native