]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Avoid unnecessary conversion to List of Double by keeping the original float[] array...
authorVincent Hennebert <vhennebert@apache.org>
Fri, 11 Jul 2014 17:30:10 +0000 (17:30 +0000)
committerVincent Hennebert <vhennebert@apache.org>
Fri, 11 Jul 2014 17:30:10 +0000 (17:30 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/FOP-2393_gradient-rendering@1609750 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/pdf/PDFFactory.java
src/java/org/apache/fop/pdf/PDFFunction.java
src/java/org/apache/fop/render/shading/Function.java
src/java/org/apache/fop/render/shading/FunctionPattern.java
src/java/org/apache/fop/render/shading/GradientFactory.java

index 29d821ad37cbf84d9d61ab7be17ba6f98a641ec8..d7d08ce25d985e6036625b1a29233b02345bbae4 100644 (file)
@@ -26,7 +26,6 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.text.DecimalFormat;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.BitSet;
 import java.util.Iterator;
@@ -268,8 +267,8 @@ public class PDFFactory {
      * @return the PDF function that was created
      */
     public PDFFunction makeFunction(int theFunctionType, List theDomain,
-                                    List theRange, List theCZero,
-                                    List theCOne,
+                                    List theRange, float[] theCZero,
+                                    float[] theCOne,
                                     double theInterpolationExponentN) {    // type 2
         PDFFunction function = new PDFFunction(theFunctionType, theDomain,
                                                theRange, theCZero, theCOne,
@@ -1367,14 +1366,9 @@ public class PDFFactory {
         final Double one = new Double(1d);
         List theDomain = Arrays.asList(new Double[] {zero, one});
         List theRange = Arrays.asList(new Double[] {zero, one, zero, one, zero, one});
-        List theCZero = Arrays.asList(new Double[] {one, one, one});
-        List theCOne = new ArrayList();
-        float[] comps = ncs.getRGBColor().getColorComponents(null);
-        for (int i = 0, c = comps.length; i < c; i++) {
-            theCOne.add(new Double(comps[i]));
-        }
-        PDFFunction tintFunction = makeFunction(2, theDomain, theRange,
-                theCZero, theCOne, 1.0d);
+        float[] cZero = new float[] {1f, 1f, 1f};
+        float[] cOne = ncs.getRGBColor().getColorComponents(null);
+        PDFFunction tintFunction = makeFunction(2, theDomain, theRange, cZero, cOne, 1.0d);
         PDFSeparationColorSpace cs = new PDFSeparationColorSpace(colorName, tintFunction);
         getDocument().registerObject(cs);
         if (res != null) {
index db14d550a15977a1816095d8d49dffad28d85d47..b638871862dedbc06f3f00d4fabf70d3422797c9 100644 (file)
@@ -20,6 +20,7 @@
 package org.apache.fop.pdf;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
@@ -71,7 +72,7 @@ public class PDFFunction extends PDFObject {
      * @param theFunctionType The type of the function, which should be 2.
      */
     public PDFFunction(int theFunctionType, List<Double> theDomain,
-                       List<Double> theRange, List<Double> theCZero, List<Double> theCOne,
+                       List<Double> theRange, float[] theCZero, float[] theCOne,
                        double theInterpolationExponentN) {
         this(new Function(theFunctionType, theDomain, theRange,
                 theCZero, theCOne, theInterpolationExponentN));
@@ -190,18 +191,10 @@ public class PDFFunction extends PDFObject {
         } else if (func.getFilter() != null) {
             return false;
         }
-        if (function.getCZero() != null) {
-            if (!function.getCZero().equals(func.getCZero())) {
-                return false;
-            }
-        } else if (func.getCZero() != null) {
+        if (!Arrays.equals(function.getCZero(), func.getCZero())) {
             return false;
         }
-        if (function.getCOne() != null) {
-            if (!function.getCOne().equals(func.getCOne())) {
-                return false;
-            }
-        } else if (func.getCOne() != null) {
+        if (!Arrays.equals(function.getCOne(), func.getCOne())) {
             return false;
         }
         if (!pdfFunctions.equals(((PDFFunction) obj).pdfFunctions)) {
index f54d36680bad672863533d09d2a6282911f9cc9d..75a041d72ae2a1cc0ff189d03d00c0a64010432a 100644 (file)
@@ -99,13 +99,13 @@ public class Function {
      * Required For Type 2: An Array of n Doubles defining
      * the function result when x=0. Default is [0].
      */
-    protected List<Double> cZero = null;
+    protected float[] cZero;
 
     /**
      * Required For Type 2: An Array of n Doubles defining
      * the function result when x=1. Default is [1].
      */
-    protected List<Double> cOne = null;
+    protected float[] cOne;
 
     /**
      * Required for Type 2: The interpolation exponent.
@@ -136,82 +136,6 @@ public class Function {
      */
     protected List<Double> bounds = null;
 
-    /**
-     * create an complete Function object of Type 0, A Sampled function.
-     *
-     * Use null for an optional object parameter if you choose not to use it.
-     * For optional int parameters, pass the default.
-     * @param theFunctionType This is the type of function (0,2,3, or 4).
-     * It should be 0 as this is the constructor for sampled functions.
-     * @param theDomain List objects of Double objects.
-     * This is the domain of the function.
-     * See page 264 of the PDF 1.3 Spec.
-     * @param theRange List objects of Double objects.
-     * This is the Range of the function.
-     * See page 264 of the PDF 1.3 Spec.
-     * @param theSize A List object of Integer objects.
-     * This is the number of samples in each input dimension.
-     * I can't imagine there being more or less than two input dimensions,
-     * so maybe this should be an array of length 2.
-     *
-     * See page 265 of the PDF 1.3 Spec.
-     * @param theBitsPerSample An int specifying the number of bits
-                               used to represent each sample value.
-     * Limited to 1,2,4,8,12,16,24 or 32.
-     * See page 265 of the 1.3 PDF Spec.
-     * @param theOrder The order of interpolation between samples. Default is 1 (one). Limited
-     * to 1 (one) or 3, which means linear or cubic-spline interpolation.
-     *
-     * This attribute is optional.
-     *
-     * See page 265 in the PDF 1.3 spec.
-     * @param theEncode List objects of Double objects.
-     * This is the linear mapping of input values intop the domain
-     * of the function's sample table. Default is hard to represent in
-     * ascii, but basically [0 (Size0 1) 0 (Size1 1)...].
-     * This attribute is optional.
-     *
-     * See page 265 in the PDF 1.3 spec.
-     * @param theDecode List objects of Double objects.
-     * This is a linear mapping of sample values into the range.
-     * The default is just the range.
-     *
-     * This attribute is optional.
-     * Read about it on page 265 of the PDF 1.3 spec.
-     * @param theFunctionDataStream The sample values that specify
-     *                     the function are provided in a stream.
-     *
-     * This is optional, but is almost always used.
-     *
-     * Page 265 of the PDF 1.3 spec has more.
-     * @param theFilter This is a vector of String objects which are the various filters that
-     * have are to be applied to the stream to make sense of it. Order matters,
-     * so watch out.
-     *
-     * This is not documented in the Function section of the PDF 1.3 spec,
-     * it was deduced from samples that this is sometimes used, even if we may never
-     * use it in FOP. It is added for completeness sake.
-     */
-    public Function(int theFunctionType, List<Double> theDomain, List<Double> theRange,
-                       List<Double> theSize, int theBitsPerSample, int theOrder,
-                       List<Double> theEncode, List<Double> theDecode, StringBuffer theFunctionDataStream,
-                       List<String> theFilter) {
-        this.functionType = 0;      // dang well better be 0;
-        this.size = theSize;
-        this.bitsPerSample = theBitsPerSample;
-        this.order = theOrder;      // int
-        this.encode = theEncode;    // vector of int
-        this.decode = theDecode;    // vector of int
-        this.functionDataStream = theFunctionDataStream;
-        this.filter = theFilter;    // vector of Strings
-
-        // the domain and range are actually two dimensional arrays.
-        // so if there's not an even number of items, bad stuff
-        // happens.
-        this.domain = theDomain;
-        this.range = theRange;
-    }
-
     /**
      * create an complete Function object of Type 2, an Exponential Interpolation function.
      *
@@ -228,7 +152,7 @@ public class Function {
      *
      * This attribute is optional.
      * It's described on page 268 of the PDF 1.3 spec.
-     * @param theCOne This is a vector of Double objects which defines the function result
+     * @param cOne This is a vector of Double objects which defines the function result
      * when x=1.
      *
      * This attribute is optional.
@@ -239,11 +163,11 @@ public class Function {
      * PDF Spec page 268
      */
     public Function(int theFunctionType, List<Double> theDomain, List<Double> theRange,
-                       List<Double> theCZero, List<Double> theCOne, double theInterpolationExponentN) {
+                       float[] cZero, float[] cOne, double theInterpolationExponentN) {
         this.functionType = 2;    // dang well better be 2;
 
-        this.cZero = theCZero;
-        this.cOne = theCOne;
+        this.cZero = cZero;
+        this.cOne = cOne;
         this.interpolationExponentN = theInterpolationExponentN;
 
         this.domain = theDomain;
@@ -298,38 +222,6 @@ public class Function {
 
     }
 
-    /**
-     * create an complete Function object of Type 4, a postscript calculator function.
-     *
-     * Use null for an optional object parameter if you choose not to use it.
-     * For optional int parameters, pass the default.
-     * @param theFunctionType The type of function which should be 4, as this is
-     * a Postscript calculator function
-     * @param theDomain List object of Double objects.
-     * This is the domain of the function.
-     * See page 264 of the PDF 1.3 Spec.
-     * @param theRange List object of Double objects.
-     * This is the Range of the function.
-     * See page 264 of the PDF 1.3 Spec.
-     * @param theFunctionDataStream This is a stream of arithmetic,
-     *            boolean, and stack operators and boolean constants.
-     * I end up enclosing it in the '{' and '}' braces for you, so don't do it
-     * yourself.
-     *
-     * This attribute is required.
-     * It's described on page 269 of the PDF 1.3 spec.
-     */
-    public Function(int theFunctionType, List<Double> theDomain, List<Double> theRange,
-                       StringBuffer theFunctionDataStream) {
-        this.functionType = 4;    // dang well better be 4;
-        this.functionDataStream = theFunctionDataStream;
-
-        this.domain = theDomain;
-
-        this.range = theRange;
-
-    }
-
     /**
      * Gets the function type
      */
@@ -428,14 +320,14 @@ public class Function {
     /**
      * Gets the function C0 value (color for gradient)
      */
-    public List<Double> getCZero() {
+    public float[] getCZero() {
         return cZero;
     }
 
     /**
      * Gets the function C1 value (color for gradient)
      */
-    public List<Double> getCOne() {
+    public float[] getCOne() {
         return cOne;
     }
 
index 7ca9855b536a8e3cbcae754e696264ec1e678afa..f7b735dd13bc9c0cfbc60aec48f9b571e4a8b274 100644 (file)
@@ -190,10 +190,9 @@ public class FunctionPattern {
             // C0
             if (function.getCZero() != null) {
                 p.append("/C0 [ ");
-                vectorSize = function.getCZero().size();
-                for (tempInt = 0; tempInt < vectorSize; tempInt++) {
-                    p.append(PDFNumber.doubleOut(function.getCZero().get(tempInt))
-                             + " ");
+                for (float c : function.getCZero()) {
+                    p.append(PDFNumber.doubleOut(c));
+                    p.append(" ");
                 }
                 p.append("] \n");
             }
@@ -201,10 +200,9 @@ public class FunctionPattern {
             // C1
             if (function.getCOne() != null) {
                 p.append("/C1 [ ");
-                vectorSize = function.getCOne().size();
-                for (tempInt = 0; tempInt < vectorSize; tempInt++) {
-                    p.append(PDFNumber.doubleOut(function.getCOne().get(tempInt))
-                             + " ");
+                for (float c : function.getCOne()) {
+                    p.append(PDFNumber.doubleOut(c));
+                    p.append(" ");
                 }
                 p.append("] \n");
             }
index f17a0e74cdced41bf364e4d6a2ef0bf548b845bf..5cc33c62d72aa087c905c4807895303695bec77f 100644 (file)
@@ -125,8 +125,8 @@ public abstract class GradientFactory<P extends Pattern> {
                 currentPosition++) {
             Color currentColor = colors.get(currentPosition);
             Color nextColor = colors.get(currentPosition + 1);
-            List<Double> c0 = toColorVector(currentColor);
-            List<Double> c1 = toColorVector(nextColor);
+            float[] c0 = currentColor.getColorComponents(null);
+            float[] c1 = nextColor.getColorComponents(null);
             Function function = new Function(2, null, null, c0, c1, 1.0);
             functions.add(function);
         }
@@ -156,13 +156,4 @@ public abstract class GradientFactory<P extends Pattern> {
 
     public abstract P makePattern(int thePatternType, Shading theShading, List theXUID,
             StringBuffer theExtGState, List<Double> theMatrix);
-
-    private List<Double> toColorVector(Color nextColor) {
-        List<Double> vector = new java.util.ArrayList<Double>();
-        float[] comps = nextColor.getColorComponents(null);
-        for (int i = 0, c = comps.length; i < c; i++) {
-            vector.add(Double.valueOf(comps[i]));
-        }
-        return vector;
-    }
 }