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