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;


Reply via email to