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;