Author: lehmi
Date: Tue Sep 17 06:09:16 2024
New Revision: 1920724

URL: http://svn.apache.org/viewvc?rev=1920724&view=rev
Log:
PDFBOX-5852: replace Map with a two-dimensional array

Modified:
    
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java
    
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PatchMeshesShadingContext.java
    
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java

Modified: 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java?rev=1920724&r1=1920723&r2=1920724&view=diff
==============================================================================
--- 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java
 (original)
+++ 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java
 Tue Sep 17 06:09:16 2024
@@ -22,7 +22,7 @@ import java.awt.geom.AffineTransform;
 import java.awt.image.ColorModel;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -64,9 +64,16 @@ abstract class GouraudShadingContext ext
     @Override
     protected Map<Point, Integer> calcPixelTable(Rectangle deviceBounds) 
throws IOException
     {
-        Map<Point, Integer> map = new HashMap<>();
-        super.calcPixelTable(triangleList, map, deviceBounds);
-        return map;
+        // deprecated
+        return Collections.emptyMap();
+    }
+
+    @Override
+    protected Integer[][] calcPixelTableArray(Rectangle deviceBounds) throws 
IOException
+    {
+        Integer[][] array = new Integer[deviceBounds.width + 
1][deviceBounds.height + 1];
+        calcPixelTable(triangleList, array, deviceBounds);
+        return array;
     }
 
     @Override

Modified: 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PatchMeshesShadingContext.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PatchMeshesShadingContext.java?rev=1920724&r1=1920723&r2=1920724&view=diff
==============================================================================
--- 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PatchMeshesShadingContext.java
 (original)
+++ 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PatchMeshesShadingContext.java
 Tue Sep 17 06:09:16 2024
@@ -20,7 +20,7 @@ import java.awt.Rectangle;
 import java.awt.geom.AffineTransform;
 import java.awt.image.ColorModel;
 import java.io.IOException;
-import java.util.HashMap;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -60,14 +60,21 @@ abstract class PatchMeshesShadingContext
     }
 
     @Override
-    protected Map<Point, Integer> calcPixelTable(Rectangle deviceBounds)  
throws IOException
+    protected Map<Point, Integer> calcPixelTable(Rectangle deviceBounds) 
throws IOException
     {
-        Map<Point, Integer> map = new HashMap<>();
+        // deprecated
+        return Collections.emptyMap();
+    }
+
+    @Override
+    protected Integer[][] calcPixelTableArray(Rectangle deviceBounds) throws 
IOException
+    {
+        Integer[][] array = new 
Integer[deviceBounds.width][deviceBounds.height];
         for (Patch it : patchList)
         {
-            super.calcPixelTable(it.listOfTriangles, map, deviceBounds);
+            calcPixelTable(it.listOfTriangles, array, deviceBounds);
         }
-        return map;
+        return array;
     }
 
     @Override

Modified: 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java
URL: 
http://svn.apache.org/viewvc/pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java?rev=1920724&r1=1920723&r2=1920724&view=diff
==============================================================================
--- 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java
 (original)
+++ 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java
 Tue Sep 17 06:09:16 2024
@@ -36,8 +36,12 @@ import org.apache.pdfbox.util.Matrix;
  */
 abstract class TriangleBasedShadingContext extends ShadingContext
 {
-    // map of pixels within triangles to their RGB color
-    private Map<Point, Integer> pixelTable;
+    // array of pixels within triangles to their RGB color
+    private Integer[][] pixelTableArray;
+
+    // offset to be used for the array index
+    private int xOffset = 0;
+    private int yOffset = 0;
 
     /**
      * Constructor.
@@ -59,22 +63,45 @@ abstract class TriangleBasedShadingConte
      */
     protected final void createPixelTable(Rectangle deviceBounds) throws 
IOException
     {
-        pixelTable = calcPixelTable(deviceBounds);
+        xOffset = -deviceBounds.x;
+        yOffset = -deviceBounds.y;
+        pixelTableArray = calcPixelTableArray(deviceBounds);
     }
 
     /**
      * Calculate every point and its color and store them in a Hash table.
      *
      * @return a Hash table which contains all the points' positions and 
colors of one image
+     * 
+     * @deprecated the map was replaced with an array due to a better 
performance
      */
+    @Deprecated
     abstract Map<Point, Integer> calcPixelTable(Rectangle deviceBounds) throws 
IOException;
 
     /**
+     * Calculate every point and its color and store them in a two-dimensional 
array.
+     *
+     * @return an array which contains all the points' positions and colors of 
one image
+     */
+    abstract Integer[][] calcPixelTableArray(Rectangle deviceBounds) throws 
IOException;
+
+    /**
      * Get the points from the triangles, calculate their color and add 
point-color mappings.
+     * 
+     * @deprecated the map was replaced with an array due to a better 
performance
      */
+    @Deprecated
     protected void calcPixelTable(List<ShadedTriangle> triangleList, 
Map<Point, Integer> map,
             Rectangle deviceBounds) throws IOException
     {
+    }
+
+    /**
+     * Get the points from the triangles, calculate their color and add 
point-color mappings.
+     */
+    protected Integer[][] calcPixelTable(List<ShadedTriangle> triangleList, 
Integer[][] array,
+            Rectangle deviceBounds) throws IOException
+    {
         for (ShadedTriangle tri : triangleList)
         {
             int degree = tri.getDeg();
@@ -83,7 +110,7 @@ abstract class TriangleBasedShadingConte
                 Line line = tri.getLine();
                 for (Point p : line.linePoints)
                 {
-                    map.put(p, evalFunctionAndConvertToRGB(line.calcColor(p)));
+                    addValueToArray(p, 
evalFunctionAndConvertToRGB(line.calcColor(p)), array);
                 }
             }
             else
@@ -101,7 +128,8 @@ abstract class TriangleBasedShadingConte
                         Point p = new IntPoint(x, y);
                         if (tri.contains(p))
                         {
-                            map.put(p, 
evalFunctionAndConvertToRGB(tri.calcColor(p)));
+                            addValueToArray(p, 
evalFunctionAndConvertToRGB(tri.calcColor(p)),
+                                    array);
                         }
                     }
                 }
@@ -109,33 +137,57 @@ abstract class TriangleBasedShadingConte
                 // "fatten" triangle by drawing the borders with Bresenham's 
line algorithm
                 // Inspiration: Raph Levien in 
http://bugs.ghostscript.com/show_bug.cgi?id=219588
                 Point p0 = new IntPoint((int) Math.round(tri.corner[0].getX()),
-                                     (int) Math.round(tri.corner[0].getY()));
+                        (int) Math.round(tri.corner[0].getY()));
                 Point p1 = new IntPoint((int) Math.round(tri.corner[1].getX()),
-                                     (int) Math.round(tri.corner[1].getY()));
+                        (int) Math.round(tri.corner[1].getY()));
                 Point p2 = new IntPoint((int) Math.round(tri.corner[2].getX()),
-                                     (int) Math.round(tri.corner[2].getY()));
+                        (int) Math.round(tri.corner[2].getY()));
                 Line l1 = new Line(p0, p1, tri.color[0], tri.color[1]);
                 Line l2 = new Line(p1, p2, tri.color[1], tri.color[2]);
                 Line l3 = new Line(p2, p0, tri.color[2], tri.color[0]);
                 for (Point p : l1.linePoints)
                 {
-                    map.put(p, evalFunctionAndConvertToRGB(l1.calcColor(p)));
+                    addValueToArray(p, 
evalFunctionAndConvertToRGB(l1.calcColor(p)), array);
                 }
                 for (Point p : l2.linePoints)
                 {
-                    map.put(p, evalFunctionAndConvertToRGB(l2.calcColor(p)));
+                    addValueToArray(p, 
evalFunctionAndConvertToRGB(l2.calcColor(p)), array);
                 }
                 for (Point p : l3.linePoints)
                 {
-                    map.put(p, evalFunctionAndConvertToRGB(l3.calcColor(p)));
+                    addValueToArray(p, 
evalFunctionAndConvertToRGB(l3.calcColor(p)), array);
                 }
             }
         }
+        return array;
+    }
+
+    private void addValueToArray(Point p, int value, Integer[][] array)
+    {
+        int xIndex = p.x + xOffset;
+        int yIndex = p.y + yOffset;
+        if (xIndex < 0 || yIndex < 0 || xIndex >= array.length || yIndex >= 
array[0].length)
+        {
+            return;
+        }
+        array[xIndex][yIndex] = value;
+    }
+
+    private Integer getValueFromArray(int x, int y)
+    {
+        int xIndex = x + xOffset;
+        int yIndex = y + yOffset;
+        if (xIndex < 0 || yIndex < 0 || xIndex >= pixelTableArray.length
+                || yIndex >= pixelTableArray[0].length)
+        {
+            return null;
+        }
+        return pixelTableArray[xIndex][yIndex];
     }
 
     /**
-     * Convert color to RGB color value, using function if required, then 
convert from the shading
-     * color space to an RGB value, which is encoded into an integer.
+     * Convert color to RGB color value, using function if required, then 
convert from the shading color space to an RGB
+     * value, which is encoded into an integer.
      */
     private int evalFunctionAndConvertToRGB(float[] values) throws IOException
     {
@@ -162,9 +214,8 @@ abstract class TriangleBasedShadingConte
             {
                 for (int col = 0; col < w; col++)
                 {
-                    Point p = new IntPoint(x + col, y + row);
                     int value;
-                    Integer v = pixelTable.get(p);
+                    Integer v = getValueFromArray(x + col, y + row);
                     if (v != null)
                     {
                         value = v;
@@ -190,4 +241,5 @@ abstract class TriangleBasedShadingConte
         raster.setPixels(0, 0, w, h, data);
         return raster;
     }
+
 }


Reply via email to