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 2011/10/24 21:07:32 UTC
svn commit: r1188298 - in
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function:
PDFunction.java PDFunctionType0.java PDFunctionType2.java
PDFunctionType3.java PDFunctionType4.java
Author: lehmi
Date: Mon Oct 24 19:07:31 2011
New Revision: 1188298
URL: http://svn.apache.org/viewvc?rev=1188298&view=rev
Log:
PDFBOX-1146: implemented an alternative eval method which doesn't uses COSArrays to transport input/output values
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunction.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType0.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType2.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType3.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType4.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunction.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunction.java?rev=1188298&r1=1188297&r2=1188298&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunction.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunction.java Mon Oct 24 19:07:31 2011
@@ -20,7 +20,6 @@ import java.io.IOException;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
-import org.apache.pdfbox.cos.COSFloat;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSObject;
import org.apache.pdfbox.cos.COSArray;
@@ -239,6 +238,29 @@ public abstract class PDFunction impleme
getDictionary().setItem(COSName.DOMAIN, domainValues);
}
+
+ /**
+ * Evaluates the function at the given input.
+ * ReturnValue = f(input)
+ *
+ * @param input The COSArray of input values for the function.
+ * In many cases will be an array of a single value, but not always.
+ *
+ * @return The of outputs the function returns based on those inputs.
+ * In many cases will be an COSArray of a single value, but not always.
+ *
+ * @throws IOException an IOExcpetion is thrown if something went wrong processing the function.
+ *
+ */
+ public COSArray eval(COSArray input) throws IOException
+ {
+ // TODO should we mark this method as deprecated?
+ float[] outputValues = eval(input.toFloatArray());
+ COSArray array = new COSArray();
+ array.setFloatArray(outputValues);
+ return array;
+ }
+
/**
* Evaluates the function at the given input.
* ReturnValue = f(input)
@@ -251,7 +273,7 @@ public abstract class PDFunction impleme
*
* @throws IOException an IOExcpetion is thrown if something went wrong processing the function.
*/
- public abstract COSArray eval(COSArray input) throws IOException;
+ public abstract float[] eval(float[] input) throws IOException;
/**
* Returns all ranges for the output values as COSArray .
@@ -287,24 +309,23 @@ public abstract class PDFunction impleme
* @param inputArray the input values
* @return the clipped values
*/
- protected COSArray clipToRange(COSArray inputArray)
+ protected float[] clipToRange(float[] inputValues)
{
COSArray rangesArray = getRangeValues();
- COSArray result = null;
+ float[] result = null;
if (rangesArray != null)
{
- float[] inputValues = inputArray.toFloatArray();
float[] rangeValues = rangesArray.toFloatArray();
- result = new COSArray();
int numberOfRanges = rangeValues.length/2;
+ result = new float[numberOfRanges];
for (int i=0; i<numberOfRanges; i++)
{
- result.add(new COSFloat( clipToRange(inputValues[i], rangeValues[2*i], rangeValues[2*i+1])));
+ result[i] = clipToRange(inputValues[i], rangeValues[2*i], rangeValues[2*i+1]);
}
}
else
{
- result = inputArray;
+ result = inputValues;
}
return result;
}
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType0.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType0.java?rev=1188298&r1=1188297&r2=1188298&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType0.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType0.java Mon Oct 24 19:07:31 2011
@@ -290,25 +290,24 @@ public class PDFunctionType0 extends PDF
/**
* {@inheritDoc}
*/
- public COSArray eval(COSArray input) throws IOException
+ public float[] eval(float[] input) throws IOException
{
//This involves linear interpolation based on a set of sample points.
//Theoretically it's not that difficult ... see section 3.9.1 of the PDF Reference.
- float[] inputValues = input.toFloatArray();
float[] sizeValues = getSize().toFloatArray();
int bitsPerSample = getBitsPerSample();
- int numberOfInputValues = inputValues.length;
+ int numberOfInputValues = input.length;
int numberOfOutputValues = getNumberOfOutputParameters();
int[] intInputValuesPrevious = new int[numberOfInputValues];
int[] intInputValuesNext = new int[numberOfInputValues];
for (int i=0; i<numberOfInputValues; i++) {
PDRange domain = getDomainForInput(i);
PDRange encode = getEncodeForParameter(i);
- inputValues[i] = clipToRange(inputValues[i], domain.getMin(), domain.getMax());
- inputValues[i] = interpolate(inputValues[i], domain.getMin(), domain.getMax(), encode.getMin(), encode.getMax());
- inputValues[i] = clipToRange(inputValues[i], 0, sizeValues[i]-1);
- intInputValuesPrevious[i] = (int)Math.floor(inputValues[i]);
- intInputValuesNext[i] = (int)Math.ceil(inputValues[i]);
+ input[i] = clipToRange(input[i], domain.getMin(), domain.getMax());
+ input[i] = interpolate(input[i], domain.getMin(), domain.getMax(), encode.getMin(), encode.getMax());
+ input[i] = clipToRange(input[i], 0, sizeValues[i]-1);
+ intInputValuesPrevious[i] = (int)Math.floor(input[i]);
+ intInputValuesNext[i] = (int)Math.ceil(input[i]);
}
float[] outputValuesPrevious = null;
float[] outputValuesNext = null;
@@ -326,9 +325,7 @@ public class PDFunctionType0 extends PDF
outputValues[i] = clipToRange(outputValues[i], range.getMin(), range.getMax());
}
- COSArray result = new COSArray();
- result.setFloatArray(outputValues);
- return result;
+ return outputValues;
}
/**
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType2.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType2.java?rev=1188298&r1=1188297&r2=1188298&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType2.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType2.java Mon Oct 24 19:07:31 2011
@@ -63,23 +63,22 @@ public class PDFunctionType2 extends PDF
/**
* {@inheritDoc}
*/
- public COSArray eval(COSArray input) throws IOException
+ public float[] eval(float[] input) throws IOException
{
//This function performs exponential interpolation.
//It uses only a single value as its input, but may produce a multi-valued output.
//See PDF Reference section 3.9.2.
- double inputValue = input.toFloatArray()[0];
+ double inputValue = input[0];
double exponent = getN();
COSArray c0 = getC0();
COSArray c1 = getC1();
- COSArray functionResult = new COSArray();
int c0Size = c0.size();
+ float[] functionResult = new float[c0Size];
for (int j=0;j<c0Size;j++)
{
//y[j] = C0[j] + x^N*(C1[j] - C0[j])
- float result = ((COSNumber)c0.get(j)).floatValue() + (float)Math.pow(inputValue,exponent)*(((COSNumber)c1.get(j)).floatValue() - ((COSNumber)c0.get(j)).floatValue());
- functionResult.add( new COSFloat( result));
+ functionResult[j] = ((COSNumber)c0.get(j)).floatValue() + (float)Math.pow(inputValue,exponent)*(((COSNumber)c1.get(j)).floatValue() - ((COSNumber)c0.get(j)).floatValue());
}
// clip to range if available
return clipToRange(functionResult);
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType3.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType3.java?rev=1188298&r1=1188297&r2=1188298&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType3.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType3.java Mon Oct 24 19:07:31 2011
@@ -18,9 +18,7 @@ package org.apache.pdfbox.pdmodel.common
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
-import org.apache.pdfbox.cos.COSFloat;
import org.apache.pdfbox.cos.COSName;
-import org.apache.pdfbox.cos.COSNumber;
import org.apache.pdfbox.pdmodel.common.PDRange;
import java.io.IOException;
@@ -59,13 +57,13 @@ public class PDFunctionType3 extends PDF
/**
* {@inheritDoc}
*/
- public COSArray eval(COSArray input) throws IOException
+ public float[] eval(float[] input) throws IOException
{
//This function is known as a "stitching" function. Based on the input, it decides which child function to call.
// All functions in the array are 1-value-input functions
//See PDF Reference section 3.9.3.
PDFunction function = null;
- float x = ((COSNumber)input.get(0)).floatValue();
+ float x = input[0];
PDRange domain = getDomainForInput(0);
// clip input value to domain
x = clipToRange(x, domain.getMin(), domain.getMax());
@@ -103,10 +101,9 @@ public class PDFunctionType3 extends PDF
}
}
}
- COSArray functionValues = new COSArray();
- functionValues.add(new COSFloat(x));
+ float[] functionValues = new float[]{x};
// calculate the output values using the chosen function
- COSArray functionResult = function.eval(functionValues);
+ float[] functionResult = function.eval(functionValues);
// clip to range if available
return clipToRange(functionResult);
}
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType4.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType4.java?rev=1188298&r1=1188297&r2=1188298&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType4.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType4.java Mon Oct 24 19:07:31 2011
@@ -16,7 +16,6 @@
*/
package org.apache.pdfbox.pdmodel.common.function;
-import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.pdmodel.common.PDRange;
import org.apache.pdfbox.pdmodel.common.function.type4.ExecutionContext;
@@ -65,16 +64,15 @@ public class PDFunctionType4 extends PDF
/**
* {@inheritDoc}
*/
- public COSArray eval(COSArray input) throws IOException
+ public float[] eval(float[] input) throws IOException
{
//Setup the input values
- float[] inputValues = input.toFloatArray();
- int numberOfInputValues = inputValues.length;
+ int numberOfInputValues = input.length;
ExecutionContext context = new ExecutionContext(OPERATORS);
for (int i = numberOfInputValues - 1; i >= 0; i--)
{
PDRange domain = getDomainForInput(i);
- float value = clipToRange(inputValues[i], domain.getMin(), domain.getMax());
+ float value = clipToRange(input[i], domain.getMin(), domain.getMax());
context.getStack().push(value);
}
@@ -100,8 +98,6 @@ public class PDFunctionType4 extends PDF
}
//Return the resulting array
- COSArray result = new COSArray();
- result.setFloatArray(outputValues);
- return result;
+ return outputValues;
}
}