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