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