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)
{