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/08/09 00:14:52 UTC

svn commit: r1616895 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/

Author: tilman
Date: Fri Aug  8 22:14:51 2014
New Revision: 1616895

URL: http://svn.apache.org/r1616895
Log:
PDFBOX-1915: refactoring: base class and intermediate class (for types 4 5 6 7) to get rid of double code

Added:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/ShadingContext.java   (with props)
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java   (with props)
Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/CoonsPatch.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/CoonsTriangle.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShading.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Patch.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PatchMeshesShadingContext.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TensorPatch.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingContext.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingPaint.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java?rev=1616895&r1=1616894&r2=1616895&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java Fri Aug  8 22:14:51 2014
@@ -17,12 +17,9 @@
 package org.apache.pdfbox.pdmodel.graphics.shading;
 
 import java.awt.PaintContext;
-import java.awt.Transparency;
-import java.awt.color.ColorSpace;
+import java.awt.Rectangle;
 import java.awt.geom.AffineTransform;
 import java.awt.image.ColorModel;
-import java.awt.image.ComponentColorModel;
-import java.awt.image.DataBuffer;
 import java.awt.image.Raster;
 import java.awt.image.WritableRaster;
 import java.io.IOException;
@@ -33,7 +30,6 @@ import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBoolean;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.common.function.PDFunction;
-import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
 import org.apache.pdfbox.util.Matrix;
 
 /**
@@ -46,12 +42,10 @@ import org.apache.pdfbox.util.Matrix;
  * @author Shaola Ren 
  *
  */
-public class AxialShadingContext implements PaintContext
+public class AxialShadingContext extends ShadingContext implements PaintContext
 {
     private static final Log LOG = LogFactory.getLog(AxialShadingContext.class);
 
-    private ColorModel outputColorModel;
-    private PDColorSpace shadingColorSpace;
     private PDShadingType2 shading;
 
     private float[] coords;
@@ -72,14 +66,16 @@ public class AxialShadingContext impleme
     /**
      * Constructor creates an instance to be used for fill operations.
      * @param shading the shading type to be used
-     * @param cm the color model to be used
+     * @param colorModel the color model to be used
      * @param xform transformation for user to device space
      * @param ctm the transformation matrix
      * @param pageHeight height of the current page
+     * @param dBounds device bounds 
      */
-    public AxialShadingContext(PDShadingType2 shading, ColorModel cm, AffineTransform xform,
-                               Matrix ctm, int pageHeight) throws IOException
+    public AxialShadingContext(PDShadingType2 shading, ColorModel colorModel, AffineTransform xform,
+                               Matrix ctm, int pageHeight, Rectangle dBounds) throws IOException
     {
+        super(shading, colorModel, xform, ctm, pageHeight, dBounds);
         this.shading = shading;
         coords = this.shading.getCoords().toFloatArray();
         
@@ -114,12 +110,6 @@ public class AxialShadingContext impleme
             ctm.createAffineTransform().transform(coords, 0, coords, 0, 2);
         }
         xform.transform(coords, 0, coords, 0, 2);
-        // get the shading colorSpace
-        shadingColorSpace = this.shading.getColorSpace();
-        // create the output colormodel using RGB+alpha as colorspace
-        ColorSpace outputCS = ColorSpace.getInstance(ColorSpace.CS_sRGB);
-        outputColorModel = new ComponentColorModel(outputCS, true, false, Transparency.TRANSLUCENT,
-                DataBuffer.TYPE_BYTE);
         // domain values
         if (this.shading.getDomain() != null)
         {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java?rev=1616895&r1=1616894&r2=1616895&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java Fri Aug  8 22:14:51 2014
@@ -67,7 +67,7 @@ public class AxialShadingPaint implement
     {
         try
         {
-            return new AxialShadingContext(shading, cm, xform, ctm, pageHeight);
+            return new AxialShadingContext(shading, cm, xform, ctm, pageHeight, deviceBounds);
         }
         catch (IOException ex)
         {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/CoonsPatch.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/CoonsPatch.java?rev=1616895&r1=1616894&r2=1616895&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/CoonsPatch.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/CoonsPatch.java Fri Aug  8 22:14:51 2014
@@ -36,7 +36,7 @@ class CoonsPatch extends Patch
         super(points, color);
         controlPoints = reshapeControlPoints(points);
         level = calcLevel();
-        listOfCoonsTriangle = getCoonsTriangle();
+        listOfCoonsTriangles = getCoonsTriangle();
     }
     
     // adjust the 12 control points to 4 groups, each group defines one edge of a patch

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/CoonsTriangle.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/CoonsTriangle.java?rev=1616895&r1=1616894&r2=1616895&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/CoonsTriangle.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/CoonsTriangle.java Fri Aug  8 22:14:51 2014
@@ -219,7 +219,7 @@ class CoonsTriangle
     }
 
     /**
-     * Calculate color of a point.
+     * Calculate the color of a point.
      * @param p the target point
      * @return an array denotes the point's color
      */

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java?rev=1616895&r1=1616894&r2=1616895&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java Fri Aug  8 22:14:51 2014
@@ -32,14 +32,11 @@ import java.awt.image.WritableRaster;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.HashSet;
 import javax.imageio.stream.ImageInputStream;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.pdmodel.common.PDRange;
-import org.apache.pdfbox.pdmodel.common.PDRectangle;
-import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
 import org.apache.pdfbox.util.Matrix;
 
 /**
@@ -48,14 +45,10 @@ import org.apache.pdfbox.util.Matrix;
  * @author Tilman Hausherr
  * @author Shaola Ren
  */
-abstract class GouraudShadingContext implements PaintContext
+abstract class GouraudShadingContext extends TriangleBasedShadingContext implements PaintContext
 {
     private static final Log LOG = LogFactory.getLog(GouraudShadingContext.class);
 
-    private ColorModel outputColorModel;
-    private PDColorSpace shadingColorSpace;
-    private final Rectangle deviceBounds;
-
     /** number of color components. */
     protected int numberOfColorComponents;
 
@@ -72,10 +65,7 @@ abstract class GouraudShadingContext imp
     protected float[] background;
     protected int rgbBackground;
 
-    private final boolean hasFunction;
     protected final PDShading gouraudShadingType;
-    private PDRectangle bboxRect;
-    private float[] bboxTab = new float[4];
     
     protected HashMap<Point, Integer> pixelTable;
 
@@ -91,42 +81,11 @@ abstract class GouraudShadingContext imp
     protected GouraudShadingContext(PDShading shading, ColorModel colorModel, AffineTransform xform,
                                     Matrix ctm, int pageHeight, Rectangle dBounds) throws IOException
     {
+        super(shading, colorModel, xform, ctm, pageHeight, dBounds);
         gouraudShadingType = shading;
-        deviceBounds = dBounds;
         triangleList = new ArrayList<CoonsTriangle>();
-        hasFunction = shading.getFunction() != null;
-
-        shadingColorSpace = shading.getColorSpace();
-        LOG.debug("colorSpace: " + shadingColorSpace);
         numberOfColorComponents = hasFunction ? 1 : shadingColorSpace.getNumberOfComponents();
-
-        bboxRect = shading.getBBox();
-        if (bboxRect != null)
-        {
-            bboxTab[0] = bboxRect.getLowerLeftX();
-            bboxTab[1] = bboxRect.getLowerLeftY();
-            bboxTab[2] = bboxRect.getUpperRightX();
-            bboxTab[3] = bboxRect.getUpperRightY();
-            if (ctm != null)
-            {
-                // transform the coords using the given matrix
-                ctm.createAffineTransform().transform(bboxTab, 0, bboxTab, 0, 2);
-            }
-            xform.transform(bboxTab, 0, bboxTab, 0, 2);
-        }
-        reOrder(bboxTab, 0, 2);
-        reOrder(bboxTab, 1, 3);
-        LOG.debug("BBox: " + shading.getBBox());
         LOG.debug("Background: " + shading.getBackground());
-        if (bboxTab[0] >= bboxTab[2] || bboxTab[1] >= bboxTab[3])
-        {
-            bboxRect = null;
-        }
-
-        // create the output color model using RGB+alpha as color space
-        ColorSpace outputCS = ColorSpace.getInstance(ColorSpace.CS_sRGB);
-        outputColorModel = new ComponentColorModel(outputCS, true, false, Transparency.TRANSLUCENT,
-                DataBuffer.TYPE_BYTE);
         COSArray bg = shading.getBackground();
         if (bg != null)
         {
@@ -170,20 +129,6 @@ abstract class GouraudShadingContext imp
         return new Vertex(tmp, colorComponentTab);
     }
     
-    // this method is used to arrange the array to denote the left upper corner and right lower corner of the BBox
-    private void reOrder(float[] array, int i, int j)
-    {
-        if (i < j && array[i] <= array[j])
-        {
-        }
-        else
-        {
-            float tmp = array[i];
-            array[i] = array[j];
-            array[j] = tmp;
-        }
-    }
-
     // transform a point from source space to device space
     private void transformPoint(Point2D p, Matrix ctm, AffineTransform xform)
     {
@@ -197,80 +142,10 @@ abstract class GouraudShadingContext imp
     protected HashMap<Point, Integer> calcPixelTable()
     {
         HashMap<Point, Integer> map = new HashMap<Point, Integer>();
-        for (CoonsTriangle tri : triangleList)
-        {
-            int degree = tri.getDeg();
-            if (degree == 2)
-            {
-                Line line = tri.getLine();
-                HashSet<Point> linePoints = line.linePoints;
-                for (Point p : linePoints)
-                {
-                    map.put(p, convertToRGB(line.calcColor(p)));
-                }
-            }
-            else
-            {
-                int[] boundary = tri.getBoundary();
-                boundary[0] = Math.max(boundary[0], deviceBounds.x);
-                boundary[1] = Math.min(boundary[1], deviceBounds.x + deviceBounds.width);
-                boundary[2] = Math.max(boundary[2], deviceBounds.y);
-                boundary[3] = Math.min(boundary[3], deviceBounds.y + deviceBounds.height);
-                for (int x = boundary[0]; x <= boundary[1]; x++)
-                {
-                    for (int y = boundary[2]; y <= boundary[3]; y++)
-                    {
-                        Point p = new Point(x, y);
-                        if (tri.contains(p))
-                        {
-                            map.put(p, convertToRGB(tri.calcColor(p)));
-                        }
-                    }
-                }
-            }
-        }
+        super.calcPixelTable(triangleList, map);
         return map;
     }
-    
-    // convert color to RGB color values
-    private int convertToRGB(float[] values)
-    {
-        float[] nValues = null;
-        float[] rgbValues = null;
-        int normRGBValues = 0;
-        if (hasFunction)
-        {
-            try
-            {
-                nValues = gouraudShadingType.evalFunction(values);
-            }
-            catch (IOException exception)
-            {
-                LOG.error("error while processing a function", exception);
-            }
-        }
 
-        try
-        {
-            if (nValues == null)
-            {
-                rgbValues = shadingColorSpace.toRGB(values);
-            }
-            else
-            {
-                rgbValues = shadingColorSpace.toRGB(nValues);
-            }
-            normRGBValues = (int) (rgbValues[0] * 255);
-            normRGBValues |= (((int) (rgbValues[1] * 255)) << 8);
-            normRGBValues |= (((int) (rgbValues[2] * 255)) << 16);
-        }
-        catch (IOException exception)
-        {
-            LOG.error("error processing color space", exception);
-        }
-        return normRGBValues;
-    }
-    
     @Override
     public void dispose()
     {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShading.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShading.java?rev=1616895&r1=1616894&r2=1616895&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShading.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShading.java Fri Aug  8 22:14:51 2014
@@ -317,7 +317,9 @@ public abstract class PDShading implemen
         {
             COSBase dictionaryFunctionObject = getCOSDictionary().getDictionaryObject(COSName.FUNCTION);
             if (dictionaryFunctionObject != null)
+            {
                 function = PDFunction.create(dictionaryFunctionObject);
+            }
         }
         return function;
     }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Patch.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Patch.java?rev=1616895&r1=1616894&r2=1616895&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Patch.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Patch.java Fri Aug  8 22:14:51 2014
@@ -35,7 +35,7 @@ abstract class Patch
      be divided into 2^levelV parts
      */
     protected int[] level;
-    protected ArrayList<CoonsTriangle> listOfCoonsTriangle;
+    protected ArrayList<CoonsTriangle> listOfCoonsTriangles;
     
     /**
      * Constructor of Patch.

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PatchMeshesShadingContext.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PatchMeshesShadingContext.java?rev=1616895&r1=1616894&r2=1616895&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PatchMeshesShadingContext.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PatchMeshesShadingContext.java Fri Aug  8 22:14:51 2014
@@ -19,20 +19,15 @@ package org.apache.pdfbox.pdmodel.graphi
 import java.awt.PaintContext;
 import java.awt.Point;
 import java.awt.Rectangle;
-import java.awt.Transparency;
-import java.awt.color.ColorSpace;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Point2D;
 import java.awt.image.ColorModel;
-import java.awt.image.ComponentColorModel;
-import java.awt.image.DataBuffer;
 import java.awt.image.Raster;
 import java.awt.image.WritableRaster;
 import java.io.EOFException;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.HashSet;
 import javax.imageio.stream.ImageInputStream;
 import javax.imageio.stream.MemoryCacheImageInputStream;
 import org.apache.commons.logging.Log;
@@ -41,8 +36,6 @@ import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.pdmodel.common.PDRange;
-import org.apache.pdfbox.pdmodel.common.PDRectangle;
-import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
 import org.apache.pdfbox.util.Matrix;
 
 /**
@@ -50,20 +43,14 @@ import org.apache.pdfbox.util.Matrix;
  * This was done as part of GSoC2014, Tilman Hausherr is the mentor.
  * @author Shaola Ren
  */
-abstract class PatchMeshesShadingContext implements PaintContext
+abstract class PatchMeshesShadingContext extends TriangleBasedShadingContext implements PaintContext
 {
     private static final Log LOG = LogFactory.getLog(PatchMeshesShadingContext.class);
     
-    protected ColorModel outputColorModel;
-    protected PDColorSpace shadingColorSpace;
-    private final Rectangle deviceBounds;
     protected final int numberOfColorComponents; // number of color components
     protected float[] background; // background values.
     protected int rgbBackground;
-    protected final boolean hasFunction;
     protected final PDShading patchMeshesShadingType;
-    private PDRectangle bboxRect;
-    private float[] bboxTab = new float[4];
     
     // the following fields are not intialized in this abstract class
     protected ArrayList<Patch> patchList; // patch list
@@ -85,40 +72,11 @@ abstract class PatchMeshesShadingContext
     protected PatchMeshesShadingContext(PDShading shading, ColorModel colorModel, AffineTransform xform,
                                 Matrix ctm, int pageHeight, Rectangle dBounds) throws IOException
     {
+        super(shading, colorModel, xform, ctm, pageHeight, dBounds);
         patchMeshesShadingType = shading;
-        deviceBounds = dBounds;
-        bboxRect = shading.getBBox();
-        if (bboxRect != null)
-        {
-            bboxTab[0] = bboxRect.getLowerLeftX();
-            bboxTab[1] = bboxRect.getLowerLeftY();
-            bboxTab[2] = bboxRect.getUpperRightX();
-            bboxTab[3] = bboxRect.getUpperRightY();
-            if (ctm != null)
-            {
-                // transform the coords using the given matrix
-                ctm.createAffineTransform().transform(bboxTab, 0, bboxTab, 0, 2);
-            }
-            xform.transform(bboxTab, 0, bboxTab, 0, 2);
-        }
-        reOrder(bboxTab, 0, 2);
-        reOrder(bboxTab, 1, 3);
-        if (bboxTab[0] >= bboxTab[2] || bboxTab[1] >= bboxTab[3])
-        {
-            bboxRect = null;
-        }
-        
         patchList = new ArrayList<Patch>();
-        hasFunction = shading.getFunction() != null;
-        shadingColorSpace = shading.getColorSpace();
-        
         numberOfColorComponents = hasFunction ? 1 : shadingColorSpace.getNumberOfComponents();
         
-        // create the output color model using RGB+alpha as color space
-        ColorSpace outputCS = ColorSpace.getInstance(ColorSpace.CS_sRGB);
-        outputColorModel = new ComponentColorModel(outputCS, true, false, Transparency.TRANSLUCENT,
-                DataBuffer.TYPE_BYTE);
-        
         COSArray bg = shading.getBackground();
         if (bg != null)
         {
@@ -127,19 +85,6 @@ abstract class PatchMeshesShadingContext
         }
     }
     
-    // this helper method is used to arrange the array 
-    // to denote the left upper corner and right lower corner of the BBox
-    // i is always < j
-    private void reOrder(float[] array, int i, int j)
-    {
-        if (array[i] > array[j])
-        {
-            float tmp = array[i];
-            array[i] = array[j];
-            array[j] = tmp;
-        }
-    }
-    
     // transform a point from source space to device space
     private void transformPoint(Point2D p, Matrix ctm, AffineTransform xform)
     {
@@ -328,83 +273,11 @@ abstract class PatchMeshesShadingContext
         HashMap<Point, Integer> map = new HashMap<Point, Integer>();
         for (Patch it : patchList)
         {
-            for (CoonsTriangle tri : it.listOfCoonsTriangle)
-            {
-                int degree = tri.getDeg();
-                if (degree == 2)
-                {
-                    Line line = tri.getLine();
-                    HashSet<Point> linePoints = line.linePoints;
-                    for (Point p : linePoints)
-                    {
-                        float[] values = line.calcColor(p);
-                        map.put(p, convertToRGB(values));
-                    }
-                }
-                else
-                {
-                    int[] boundary = tri.getBoundary();
-                    boundary[0] = Math.max(boundary[0], deviceBounds.x);
-                    boundary[1] = Math.min(boundary[1], deviceBounds.x + deviceBounds.width);
-                    boundary[2] = Math.max(boundary[2], deviceBounds.y);
-                    boundary[3] = Math.min(boundary[3], deviceBounds.y + deviceBounds.height);
-                    for (int x = boundary[0]; x <= boundary[1]; x++)
-                    {
-                        for (int y = boundary[2]; y <= boundary[3]; y++)
-                        {
-                            Point p = new Point(x, y);
-                            if (tri.contains(p))
-                            {
-                                float[] values = tri.calcColor(p);
-                                map.put(p, convertToRGB(values));
-                            }
-                        }
-                    }
-                }
-            }
+            super.calcPixelTable(it.listOfCoonsTriangles, map);
         }
         return map;
     }
-    
-    // convert color to RGB color values
-    private int convertToRGB(float[] values)
-    {
-        float[] nValues = null;
-        float[] rgbValues = null;
-        int normRGBValues = 0;
-        if (hasFunction)
-        {
-            try
-            {
-                nValues = patchMeshesShadingType.evalFunction(values);
-            }
-            catch (IOException exception)
-            {
-                LOG.error("error while processing a function", exception);
-            }
-        }
 
-        try
-        {
-            if (nValues == null)
-            {
-                rgbValues = shadingColorSpace.toRGB(values);
-            }
-            else
-            {
-                rgbValues = shadingColorSpace.toRGB(nValues);
-            }
-            normRGBValues = (int) (rgbValues[0] * 255);
-            normRGBValues |= (((int) (rgbValues[1] * 255)) << 8);
-            normRGBValues |= (((int) (rgbValues[2] * 255)) << 16);
-        }
-        catch (IOException exception)
-        {
-            LOG.error("error processing color space", exception);
-        }
-        return normRGBValues;
-    }
-    
     @Override
     public void dispose()
     {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java?rev=1616895&r1=1616894&r2=1616895&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java Fri Aug  8 22:14:51 2014
@@ -17,12 +17,9 @@
 package org.apache.pdfbox.pdmodel.graphics.shading;
 
 import java.awt.PaintContext;
-import java.awt.Transparency;
-import java.awt.color.ColorSpace;
+import java.awt.Rectangle;
 import java.awt.geom.AffineTransform;
 import java.awt.image.ColorModel;
-import java.awt.image.ComponentColorModel;
-import java.awt.image.DataBuffer;
 import java.awt.image.Raster;
 import java.awt.image.WritableRaster;
 import java.io.IOException;
@@ -33,7 +30,6 @@ import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSBoolean;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.common.function.PDFunction;
-import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
 import org.apache.pdfbox.util.Matrix;
 
 /**
@@ -45,12 +41,10 @@ import org.apache.pdfbox.util.Matrix;
  * @author Andreas Lehmkühler
  * @author Shaola Ren 
  */
-public class RadialShadingContext implements PaintContext
+public class RadialShadingContext extends ShadingContext implements PaintContext
 {
     private static final Log LOG = LogFactory.getLog(RadialShadingContext.class);
 
-    private ColorModel outputColorModel;
-    private PDColorSpace shadingColorSpace;
     private PDShadingType3 shading;
 
     private float[] coords;
@@ -76,14 +70,16 @@ public class RadialShadingContext implem
     /**
      * Constructor creates an instance to be used for fill operations.
      * @param shading the shading type to be used
-     * @param cm the color model to be used
+     * @param colorModel the color model to be used
      * @param xform transformation for user to device space
      * @param ctm the transformation matrix
+     * @param dBounds device bounds 
      * @param pageHeight height of the current page
      */
-    public RadialShadingContext(PDShadingType3 shading, ColorModel cm, AffineTransform xform,
-                                Matrix ctm, int pageHeight) throws IOException
+    public RadialShadingContext(PDShadingType3 shading, ColorModel colorModel, AffineTransform xform,
+                                Matrix ctm, int pageHeight, Rectangle dBounds) throws IOException
     {
+        super(shading, colorModel, xform, ctm, pageHeight, dBounds);
         this.shading = shading;
         coords = this.shading.getCoords().toFloatArray();
 
@@ -128,12 +124,6 @@ public class RadialShadingContext implem
         coords[2] *= xform.getScaleX();
         coords[5] *= xform.getScaleX();
 
-        // get the shading colorSpace
-        shadingColorSpace = this.shading.getColorSpace();
-        // create the output colormodel using RGB+alpha as colorspace
-        ColorSpace outputCS = ColorSpace.getInstance(ColorSpace.CS_sRGB);
-        outputColorModel = new ComponentColorModel(outputCS, true, false, Transparency.TRANSLUCENT,
-                DataBuffer.TYPE_BYTE);
         // domain values
         if (this.shading.getDomain() != null)
         {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java?rev=1616895&r1=1616894&r2=1616895&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java Fri Aug  8 22:14:51 2014
@@ -66,7 +66,7 @@ public class RadialShadingPaint implemen
     {
         try
         {
-            return new RadialShadingContext(shading, cm, xform, ctm, pageHeight);
+            return new RadialShadingContext(shading, cm, xform, ctm, pageHeight, deviceBounds);
         }
         catch (IOException ex)
         {

Added: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/ShadingContext.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/ShadingContext.java?rev=1616895&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/ShadingContext.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/ShadingContext.java Fri Aug  8 22:14:51 2014
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2014 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pdfbox.pdmodel.graphics.shading;
+
+import java.awt.Rectangle;
+import java.awt.Transparency;
+import java.awt.color.ColorSpace;
+import java.awt.geom.AffineTransform;
+import java.awt.image.ColorModel;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.DataBuffer;
+import java.io.IOException;
+import org.apache.pdfbox.pdmodel.common.PDRectangle;
+import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.apache.pdfbox.util.Matrix;
+
+/**
+ * A base class to handle stuff that is common to all shading types.
+ *
+ * @author Shaola Ren
+ * @author Tilman Hausherr
+ */
+public abstract class ShadingContext
+{
+    protected final Rectangle deviceBounds;
+    protected PDColorSpace shadingColorSpace;
+    protected PDRectangle bboxRect;
+    protected float[] bboxTab = new float[4];
+    protected ColorModel outputColorModel;
+
+    public ShadingContext(PDShading shading, ColorModel cm, AffineTransform xform,
+            Matrix ctm, int pageHeight, Rectangle dBounds) throws IOException
+    {
+        deviceBounds = dBounds;
+        shadingColorSpace = shading.getColorSpace();
+        
+        // create the output color model using RGB+alpha as color space
+        ColorSpace outputCS = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+        outputColorModel = new ComponentColorModel(outputCS, true, false, Transparency.TRANSLUCENT,
+                DataBuffer.TYPE_BYTE);        
+        
+        bboxRect = shading.getBBox();
+        if (bboxRect != null)
+        {
+            transformBBox(ctm, xform);
+        }
+
+    }
+
+    private void transformBBox(Matrix ctm, AffineTransform xform)
+    {
+        bboxTab[0] = bboxRect.getLowerLeftX();
+        bboxTab[1] = bboxRect.getLowerLeftY();
+        bboxTab[2] = bboxRect.getUpperRightX();
+        bboxTab[3] = bboxRect.getUpperRightY();
+        if (ctm != null)
+        {
+            // transform the coords using the given matrix
+            ctm.createAffineTransform().transform(bboxTab, 0, bboxTab, 0, 2);
+        }
+        xform.transform(bboxTab, 0, bboxTab, 0, 2);
+        reOrder(bboxTab, 0, 2);
+        reOrder(bboxTab, 1, 3);
+        if (bboxTab[0] >= bboxTab[2] || bboxTab[1] >= bboxTab[3])
+        {
+            bboxRect = null;
+            //TODO LOG output
+        }
+    }
+
+    // this helper method is used to arrange the array 
+    // to denote the left upper corner and right lower corner of the BBox
+    // i is always < j
+    private void reOrder(float[] array, int i, int j)
+    {
+        if (array[i] > array[j])
+        {
+            float tmp = array[i];
+            array[i] = array[j];
+            array[j] = tmp;
+        }
+    }
+
+}

Propchange: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/ShadingContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TensorPatch.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TensorPatch.java?rev=1616895&r1=1616894&r2=1616895&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TensorPatch.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TensorPatch.java Fri Aug  8 22:14:51 2014
@@ -36,7 +36,7 @@ class TensorPatch extends Patch
         super(tcp, color);
         controlPoints = reshapeControlPoints(tcp);
         level = calcLevel();
-        listOfCoonsTriangle = getCoonsTriangle();
+        listOfCoonsTriangles = getCoonsTriangle();
     }
     
     /*

Added: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java?rev=1616895&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java Fri Aug  8 22:14:51 2014
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2014 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.pdmodel.graphics.shading;
+
+import java.awt.Point;
+import java.awt.Rectangle;
+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.HashSet;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.pdfbox.util.Matrix;
+
+/**
+ * Intermediate class extended by the shading types 4,5,6 and 7 that contains
+ * the common methods used by these classes.
+ * 
+ * @author Shaola Ren
+ * @author Tilman Hausherr
+ */
+abstract class TriangleBasedShadingContext extends ShadingContext
+{
+    private static final Log LOG = LogFactory.getLog(TriangleBasedShadingContext.class);
+    
+    protected final boolean hasFunction;
+    protected final PDShading shading;
+
+    public TriangleBasedShadingContext(PDShading shading, ColorModel cm, 
+            AffineTransform xform, Matrix ctm, int pageHeight, Rectangle dBounds) 
+            throws IOException
+    {
+        super(shading, cm, xform, ctm, pageHeight, dBounds);
+        hasFunction = shading.getFunction() != null;
+        this.shading = shading;
+    }
+
+    // convert color to RGB color value, using function if required, 
+    // then convert from the shading colorspace to an RGB value,
+    // which is encoded into an integer.
+    protected int convertToRGB(float[] values)
+    {
+        float[] nValues = null;
+        int normRGBValues = 0;
+        if (hasFunction)
+        {
+            try
+            {
+                nValues = shading.evalFunction(values);
+            }
+            catch (IOException exception)
+            {
+                LOG.error("error while processing a function", exception);
+            }
+        }
+
+        try
+        {
+            float[] rgbValues;
+            if (nValues == null)
+            {
+                rgbValues = shadingColorSpace.toRGB(values);
+            }
+            else
+            {
+                rgbValues = shadingColorSpace.toRGB(nValues);
+            }
+            normRGBValues = (int) (rgbValues[0] * 255);
+            normRGBValues |= (((int) (rgbValues[1] * 255)) << 8);
+            normRGBValues |= (((int) (rgbValues[2] * 255)) << 16);
+        }
+        catch (IOException exception)
+        {
+            LOG.error("error processing color space", exception);
+        }
+        return normRGBValues;
+    }
+    
+    // get the points from the triangles, calculate their color and add 
+    // point-color mappings to the map
+    protected void calcPixelTable(ArrayList<CoonsTriangle> triangleList, HashMap<Point, Integer> map)
+    {
+        for (CoonsTriangle tri : triangleList)
+        {
+            int degree = tri.getDeg();
+            if (degree == 2)
+            {
+                Line line = tri.getLine();
+                HashSet<Point> linePoints = line.linePoints;
+                for (Point p : linePoints)
+                {
+                    map.put(p, convertToRGB(line.calcColor(p)));
+                }
+            }
+            else
+            {
+                int[] boundary = tri.getBoundary();
+                boundary[0] = Math.max(boundary[0], deviceBounds.x);
+                boundary[1] = Math.min(boundary[1], deviceBounds.x + deviceBounds.width);
+                boundary[2] = Math.max(boundary[2], deviceBounds.y);
+                boundary[3] = Math.min(boundary[3], deviceBounds.y + deviceBounds.height);
+                for (int x = boundary[0]; x <= boundary[1]; x++)
+                {
+                    for (int y = boundary[2]; y <= boundary[3]; y++)
+                    {
+                        Point p = new Point(x, y);
+                        if (tri.contains(p))
+                        {
+                            map.put(p, convertToRGB(tri.calcColor(p)));
+                        }
+                    }
+                }
+            }
+        }
+    }
+    
+}

Propchange: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/TriangleBasedShadingContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingContext.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingContext.java?rev=1616895&r1=1616894&r2=1616895&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingContext.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingContext.java Fri Aug  8 22:14:51 2014
@@ -16,21 +16,16 @@
 package org.apache.pdfbox.pdmodel.graphics.shading;
 
 import java.awt.PaintContext;
-import java.awt.Transparency;
-import java.awt.color.ColorSpace;
+import java.awt.Rectangle;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.NoninvertibleTransformException;
 import java.awt.image.ColorModel;
-import java.awt.image.ComponentColorModel;
-import java.awt.image.DataBuffer;
 import java.awt.image.Raster;
 import java.awt.image.WritableRaster;
 import java.io.IOException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.pdfbox.cos.COSArray;
-import org.apache.pdfbox.pdmodel.common.PDRectangle;
-import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
 import org.apache.pdfbox.util.Matrix;
 
 /**
@@ -38,59 +33,31 @@ import org.apache.pdfbox.util.Matrix;
  * @author Andreas Lehmkühler
  * @author Tilman Hausherr
  */
-class Type1ShadingContext implements PaintContext
+class Type1ShadingContext extends ShadingContext implements PaintContext
 {
     private static final Log LOG = LogFactory.getLog(Type1ShadingContext.class);
 
-    private ColorModel outputColorModel;
-    private PDColorSpace shadingColorSpace;
     private PDShadingType1 shading;
     private AffineTransform rat;
     private float[] domain;
     private Matrix matrix;
     private float[] background;
-    private PDRectangle bboxRect;
     private float[] bboxTab = new float[4];
 
     /**
      * Constructor creates an instance to be used for fill operations.
      * @param shading the shading type to be used
-     * @param cm the color model to be used
+     * @param colorModel the color model to be used
      * @param xform transformation for user to device space
      * @param ctm current transformation matrix
      * @param pageHeight height of the current page
+     * @param dBounds device bounds 
      */
-    public Type1ShadingContext(PDShadingType1 shading, ColorModel cm, AffineTransform xform,
-                               Matrix ctm, int pageHeight) throws IOException
+    public Type1ShadingContext(PDShadingType1 shading, ColorModel colorModel, AffineTransform xform,
+                               Matrix ctm, int pageHeight, Rectangle dBounds) throws IOException
     {
+        super(shading, colorModel, xform, ctm, pageHeight, dBounds);
         this.shading = shading;
-        bboxRect = shading.getBBox();
-        if (bboxRect != null)
-        {
-            bboxTab[0] = bboxRect.getLowerLeftX();
-            bboxTab[1] = bboxRect.getLowerLeftY();
-            bboxTab[2] = bboxRect.getUpperRightX();
-            bboxTab[3] = bboxRect.getUpperRightY();
-            if (ctm != null)
-            {
-                // transform the coords using the given matrix
-                ctm.createAffineTransform().transform(bboxTab, 0, bboxTab, 0, 2);
-            }
-            xform.transform(bboxTab, 0, bboxTab, 0, 2);
-        }
-        reOrder(bboxTab, 0, 2);
-        reOrder(bboxTab, 1, 3);
-        if (bboxTab[0] >= bboxTab[2] || bboxTab[1] >= bboxTab[3])
-        {
-            bboxRect = null;
-        }
-        
-        // color space
-        shadingColorSpace = this.shading.getColorSpace();
-        // create the output colormodel using RGB+alpha as colorspace
-        ColorSpace outputCS = ColorSpace.getInstance(ColorSpace.CS_sRGB);
-        outputColorModel = new ComponentColorModel(outputCS, true, false, Transparency.TRANSLUCENT,
-                DataBuffer.TYPE_BYTE);
         
         // spec p.308
         // (Optional) An array of four numbers [ xmin xmax ymin ymax ] 
@@ -135,19 +102,6 @@ class Type1ShadingContext implements Pai
             background = bg.toFloatArray();
         }
     }
-    
-    // this helper method is used to arrange the array 
-    // to denote the left upper corner and right lower corner of the BBox
-    // i is always < j
-    private void reOrder(float[] array, int i, int j)
-    {
-        if (array[i] > array[j])
-        {
-            float tmp = array[i];
-            array[i] = array[j];
-            array[j] = tmp;
-        }
-    }
 
     @Override
     public void dispose()

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingPaint.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingPaint.java?rev=1616895&r1=1616894&r2=1616895&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingPaint.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingPaint.java Fri Aug  8 22:14:51 2014
@@ -65,7 +65,7 @@ class Type1ShadingPaint implements Paint
     {
         try
         {
-            return new Type1ShadingContext(shading, cm, xform, ctm, pageHeight);
+            return new Type1ShadingContext(shading, cm, xform, ctm, pageHeight, deviceBounds);
         }
         catch (IOException ex)
         {