You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2014/02/17 18:55:35 UTC
svn commit: r1569063 - in
/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading:
GouraudShadingContext.java GouraudTriangle.java Type4ShadingContext.java
Type5ShadingContext.java
Author: tilman
Date: Mon Feb 17 17:55:35 2014
New Revision: 1569063
URL: http://svn.apache.org/r1569063
Log:
PDFBOX-1924: Gouraud shading: detect empty triangles
Modified:
pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java
pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudTriangle.java
pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingContext.java
pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingContext.java
Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java?rev=1569063&r1=1569062&r2=1569063&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java Mon Feb 17 17:55:35 2014
@@ -245,81 +245,84 @@ public abstract class GouraudShadingCont
{
WritableRaster raster = getColorModel().createCompatibleWritableRaster(w, h);
int[] data = new int[w * h * 4];
- for (int row = 0; row < h; row++)
+ if (!triangleList.isEmpty() || background != null)
{
- for (int col = 0; col < w; col++)
+ for (int row = 0; row < h; row++)
{
- Point2D p = new Point(x + col, y + row);
- GouraudTriangle triangle = null;
- for (GouraudTriangle tryTriangle : triangleList)
+ for (int col = 0; col < w; col++)
{
- if (tryTriangle.contains(p))
+ Point2D p = new Point(x + col, y + row);
+ GouraudTriangle triangle = null;
+ for (GouraudTriangle tryTriangle : triangleList)
{
- triangle = tryTriangle;
- break;
- }
- }
- float[] values;
- if (triangle != null)
- {
- double[] weights = triangle.getWeights(p);
- values = new float[numberOfColorComponents];
- for (int i = 0; i < numberOfColorComponents; ++i)
- {
- values[i] = (float) (triangle.colorA[i] * weights[0]
- + triangle.colorB[i] * weights[1]
- + triangle.colorC[i] * weights[2]);
+ if (tryTriangle.contains(p))
+ {
+ triangle = tryTriangle;
+ break;
+ }
}
- }
- else
- {
- if (background != null)
+ float[] values;
+ if (triangle != null)
{
- values = background;
+ double[] weights = triangle.getWeights(p);
+ values = new float[numberOfColorComponents];
+ for (int i = 0; i < numberOfColorComponents; ++i)
+ {
+ values[i] = (float) (triangle.colorA[i] * weights[0]
+ + triangle.colorB[i] * weights[1]
+ + triangle.colorC[i] * weights[2]);
+ }
}
else
{
- continue;
- }
- }
-
- if (hasFunction)
- {
- try
- {
- values = gouraudShadingType.evalFunction(values);
- }
- catch (IOException exception)
- {
- LOG.error("error while processing a function", exception);
+ if (background != null)
+ {
+ values = background;
+ }
+ else
+ {
+ continue;
+ }
}
- }
- // convert color values from shading colorspace to RGB
- if (shadingColorSpace != null)
- {
- if (shadingTinttransform != null)
+ if (hasFunction)
{
try
{
- values = shadingTinttransform.eval(values);
+ values = gouraudShadingType.evalFunction(values);
}
catch (IOException exception)
{
LOG.error("error while processing a function", exception);
}
}
- values = shadingColorSpace.toRGB(values);
- }
- int index = (row * w + col) * 4;
- data[index] = (int) (values[0] * 255);
- data[index + 1] = (int) (values[1] * 255);
- data[index + 2] = (int) (values[2] * 255);
- data[index + 3] = 255;
+ // convert color values from shading colorspace to RGB
+ if (shadingColorSpace != null)
+ {
+ if (shadingTinttransform != null)
+ {
+ try
+ {
+ values = shadingTinttransform.eval(values);
+ }
+ catch (IOException exception)
+ {
+ LOG.error("error while processing a function", exception);
+ }
+ }
+ values = shadingColorSpace.toRGB(values);
+ }
+
+ int index = (row * w + col) * 4;
+ data[index] = (int) (values[0] * 255);
+ data[index + 1] = (int) (values[1] * 255);
+ data[index + 2] = (int) (values[2] * 255);
+ data[index + 3] = 255;
+ }
}
- raster.setPixels(0, 0, w, h, data);
}
+ raster.setPixels(0, 0, w, h, data);
return raster;
}
}
Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudTriangle.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudTriangle.java?rev=1569063&r1=1569062&r2=1569063&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudTriangle.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudTriangle.java Mon Feb 17 17:55:35 2014
@@ -138,6 +138,16 @@ public class GouraudTriangle
}
/**
+ * Tell whether a triangle is empty.
+ *
+ * @return true if the area is empty, false if not.
+ */
+ boolean isEmpty()
+ {
+ return area == 0;
+ }
+
+ /**
* calculate color weights with barycentric interpolation.
*
* @param p Point within triangle
Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingContext.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingContext.java?rev=1569063&r1=1569062&r2=1569063&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingContext.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingContext.java Mon Feb 17 17:55:35 2014
@@ -239,7 +239,15 @@ class Type4ShadingContext extends Gourau
break;
}
++vi;
- triangleList.add(new GouraudTriangle(a, aColor, b, bColor, c, cColor));
+ GouraudTriangle g = new GouraudTriangle(a, aColor, b, bColor, c, cColor);
+ if (!g.isEmpty())
+ {
+ triangleList.add(g);
+ }
+ else
+ {
+ LOG.debug("triangle is empty!");
+ }
}
}
Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingContext.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingContext.java?rev=1569063&r1=1569062&r2=1569063&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingContext.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingContext.java Mon Feb 17 17:55:35 2014
@@ -133,10 +133,28 @@ public class Type5ShadingContext extends
Vertex vijplus1 = prevVertexRow.get(vj + 1); // v i,j+1
Vertex viplus1j = vertexList.get(vj); // v i+1,j
Vertex viplus1jplus1 = vertexList.get(vj + 1); // v i+1,j+1
- triangleList.add(new GouraudTriangle(vij.point, vij.color, vijplus1.point, vijplus1.color,
- viplus1j.point, viplus1j.color));
- triangleList.add(new GouraudTriangle(vijplus1.point, vijplus1.color, viplus1j.point,
- viplus1j.color, viplus1jplus1.point, viplus1jplus1.color));
+ GouraudTriangle g = new GouraudTriangle(vij.point, vij.color,
+ vijplus1.point, vijplus1.color,
+ viplus1j.point, viplus1j.color);
+ if (!g.isEmpty())
+ {
+ triangleList.add(g);
+ }
+ else
+ {
+ LOG.debug("triangle is empty!");
+ }
+ g = new GouraudTriangle(vijplus1.point, vijplus1.color,
+ viplus1j.point, viplus1j.color,
+ viplus1jplus1.point, viplus1jplus1.color);
+ if (!g.isEmpty())
+ {
+ triangleList.add(g);
+ }
+ else
+ {
+ LOG.debug("triangle is empty!");
+ }
}
}
prevVertexRow = vertexList;