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/10 18:34:18 UTC
svn commit: r1617131 [3/3] - in
/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox: pdfviewer/
pdmodel/graphics/pattern/ pdmodel/graphics/shading/
Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingContext.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingContext.java?rev=1617131&r1=1617130&r2=1617131&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingContext.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingContext.java Sun Aug 10 16:34:17 2014
@@ -16,99 +16,62 @@
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.function.PDFunction;
-import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
-import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceN;
-import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
-import org.apache.pdfbox.pdmodel.graphics.color.PDSeparation;
import org.apache.pdfbox.util.Matrix;
/**
- * This represents the Paint of a type 1 (Function based) shading context.
+ * AWT PaintContext for function-based (Type 1) shading.
*
- * @author lehmi
- * @author Tilman Hausherr <ti...@snafu.de>
+ * @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 ColorSpace shadingColorSpace;
- private PDFunction shadingTinttransform;
- private PDShadingType1 shadingType;
+ private PDShadingType1 type1ShadingType;
private AffineTransform rat;
- private float[] domain;
+ private final float[] domain;
private Matrix matrix;
private float[] background;
/**
* Constructor creates an instance to be used for fill operations.
*
- * @param shadingType1 the shading type to be used
- * @param colorModelValue the color model to be used
+ * @param shading the shading type 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 shadingType1, ColorModel colorModelValue,
- AffineTransform xform, Matrix currentTransformationMatrix, int pageHeight)
+ public Type1ShadingContext(PDShadingType1 shading, ColorModel colorModel, AffineTransform xform,
+ Matrix ctm, int pageHeight, Rectangle dBounds) throws IOException
{
- shadingType = shadingType1;
-
+ super(shading, colorModel, xform, ctm, pageHeight, dBounds);
+ this.type1ShadingType = shading;
+
// PDFBOX-1966 flip the AffineTransform in 1.8 branch
//TODO find out why AffineTransform passed in 1.8 branch is flipped
xform.scale(1,-1);
xform.translate(0, -pageHeight);
- // colorSpace
- try
- {
- PDColorSpace cs = shadingType.getColorSpace();
- if (!(cs instanceof PDDeviceRGB))
- {
- // we have to create an instance of the shading colorspace if it isn't RGB
- shadingColorSpace = cs.getJavaColorSpace();
- if (cs instanceof PDDeviceN)
- {
- shadingTinttransform = ((PDDeviceN) cs).getTintTransform();
- }
- else if (cs instanceof PDSeparation)
- {
- shadingTinttransform = ((PDSeparation) cs).getTintTransform();
- }
- }
- }
- catch (IOException exception)
- {
- LOG.error("error while creating colorSpace", exception);
- }
- // 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 ]
// specifying the rectangular domain of coordinates over which the
// color function(s) are defined. Default value: [ 0.0 1.0 0.0 1.0 ].
- if (shadingType.getDomain() != null)
+ if (shading.getDomain() != null)
{
- domain = shadingType.getDomain().toFloatArray();
+ domain = shading.getDomain().toFloatArray();
}
else
{
@@ -118,7 +81,7 @@ class Type1ShadingContext implements Pai
};
}
- matrix = shadingType.getMatrix();
+ matrix = shading.getMatrix();
if (matrix == null)
{
matrix = new Matrix();
@@ -130,16 +93,16 @@ class Type1ShadingContext implements Pai
// shading matrix and current user / device space
// when handling actual pixels in getRaster()
rat = matrix.createAffineTransform().createInverse();
- rat.concatenate(currentTransformationMatrix.createAffineTransform().createInverse());
+ rat.concatenate(ctm.createAffineTransform().createInverse());
rat.concatenate(xform.createInverse());
}
catch (NoninvertibleTransformException ex)
{
- LOG.error(ex,ex);
+ LOG.error(ex, ex);
}
// get background values if available
- COSArray bg = shadingType1.getBackground();
+ COSArray bg = shading.getBackground();
if (bg != null)
{
background = bg.toFloatArray();
@@ -154,7 +117,7 @@ class Type1ShadingContext implements Pai
outputColorModel = null;
shadingColorSpace = null;
shadingTinttransform = null;
- shadingType = null;
+ type1ShadingType = null;
}
/**
@@ -170,14 +133,28 @@ class Type1ShadingContext implements Pai
*/
public Raster getRaster(int x, int y, int w, int h)
{
- // create writable raster
-
WritableRaster raster = getColorModel().createCompatibleWritableRaster(w, h);
int[] data = new int[w * h * 4];
for (int j = 0; j < h; j++)
{
+ int currentY = y + j;
+ if (bboxRect != null)
+ {
+ if (currentY < minBBoxY || currentY > maxBBoxY)
+ {
+ continue;
+ }
+ }
for (int i = 0; i < w; i++)
{
+ int currentX = x + i;
+ if (bboxRect != null)
+ {
+ if (currentX < minBBoxX || currentX > maxBBoxX)
+ {
+ continue;
+ }
+ }
int index = (j * w + i) * 4;
boolean useBackground = false;
float[] values = new float[]
@@ -205,7 +182,7 @@ class Type1ShadingContext implements Pai
}
else
{
- values = shadingType.evalFunction(values);
+ values = type1ShadingType.evalFunction(values);
}
// convert color values from shading colorspace to RGB
if (shadingColorSpace != null)
@@ -235,9 +212,4 @@ class Type1ShadingContext implements Pai
{
return domain;
}
-
- public PDFunction getShadingTintTransform()
- {
- return shadingTinttransform;
- }
}
Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingPaint.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingPaint.java?rev=1617131&r1=1617130&r2=1617131&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingPaint.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingPaint.java Sun Aug 10 16:34:17 2014
@@ -23,31 +23,35 @@ import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.ColorModel;
+import java.io.IOException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.pdfbox.util.Matrix;
/**
- * This represents the Paint of an type1 shading.
- *
+ * AWT PaintContext for function-based (Type 1) shading.
*/
public class Type1ShadingPaint implements Paint
{
+ private static final Log LOG = LogFactory.getLog(Type1ShadingPaint.class);
+
private PDShadingType1 shading;
- private Matrix currentTransformationMatrix;
+ private Matrix ctm;
private int pageHeight;
/**
* Constructor.
*
- * @param shadingType1 the shading resources
+ * @param shading the shading resources
* @param ctm current transformation matrix
- * @param pageHeightValue the height of the page
+ * @param pageHeight the height of the page
*/
- public Type1ShadingPaint(PDShadingType1 shadingType1, Matrix ctm, int pageHeightValue)
+ public Type1ShadingPaint(PDShadingType1 shading, Matrix ctm, int pageHeight)
{
- shading = shadingType1;
- currentTransformationMatrix = ctm;
- pageHeight = pageHeightValue;
+ this.shading = shading;
+ this.ctm = ctm;
+ this.pageHeight = pageHeight;
}
/**
@@ -64,6 +68,14 @@ public class Type1ShadingPaint implement
public PaintContext createContext(ColorModel cm, Rectangle deviceBounds,
Rectangle2D userBounds, AffineTransform xform, RenderingHints hints)
{
- return new Type1ShadingContext(shading, cm, xform, currentTransformationMatrix, pageHeight);
+ try
+ {
+ return new Type1ShadingContext(shading, cm, xform, ctm, pageHeight, deviceBounds);
+ }
+ catch (IOException ex)
+ {
+ LOG.error(ex);
+ return null;
+ }
}
}
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=1617131&r1=1617130&r2=1617131&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 Sun Aug 10 16:34:17 2014
@@ -16,6 +16,7 @@
*/
package org.apache.pdfbox.pdmodel.graphics.shading;
+import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.awt.image.ColorModel;
@@ -26,114 +27,154 @@ import javax.imageio.stream.ImageInputSt
import javax.imageio.stream.MemoryCacheImageInputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSDictionary;
-import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSStream;
import org.apache.pdfbox.pdmodel.common.PDRange;
import org.apache.pdfbox.util.Matrix;
/**
- * This represents the Paint of a type 4 (Gouraud triangle mesh) shading
- * context.
+ * AWT PaintContext for Gouraud Triangle Mesh (Type 4) shading.
*
* @author Tilman Hausherr
+ * @author Shaola Ren
*/
class Type4ShadingContext extends GouraudShadingContext
{
private static final Log LOG = LogFactory.getLog(Type4ShadingContext.class);
-
- private int bitsPerFlag;
+ private final int bitsPerFlag;
/**
* Constructor creates an instance to be used for fill operations.
*
- * @param shadingType4 the shading type to be used
- * @param colorModelValue the color model to be used
+ * @param shading the shading type to be used
+ * @param cm 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
- *
*/
- public Type4ShadingContext(PDShadingType4 shadingType4, ColorModel colorModelValue,
- AffineTransform xform, Matrix ctm, int pageHeight) throws IOException
+ public Type4ShadingContext(PDShadingType4 shading, ColorModel cm, AffineTransform xform,
+ Matrix ctm, int pageHeight, Rectangle dBounds) throws IOException
{
- super(shadingType4, colorModelValue, xform, ctm, pageHeight);
+ super(shading, cm, xform, ctm, pageHeight, dBounds);
+ LOG.debug("Type4ShadingContext");
- ArrayList<Vertex> vertexList = new ArrayList<Vertex>();
+ bitsPerFlag = shading.getBitsPerFlag();
+ LOG.debug("bitsPerFlag: " + bitsPerFlag); //TODO handle cases where bitperflag isn't 8
+
+ // PDFBOX-1966 flip the AffineTransform in 1.8 branch
+ xform.scale(1,-1);
+ xform.translate(0, -pageHeight);
- LOG.debug("Type4ShadingContext");
+ triangleList = getTriangleList(xform, ctm);
+ pixelTable = calcPixelTable();
+ }
- bitsPerColorComponent = shadingType4.getBitsPerComponent();
- LOG.debug("bitsPerColorComponent: " + bitsPerColorComponent);
- bitsPerCoordinate = shadingType4.getBitsPerCoordinate();
- LOG.debug(Math.pow(2, bitsPerCoordinate) - 1);
+ private ArrayList<ShadedTriangle> getTriangleList(AffineTransform xform, Matrix ctm) throws IOException
+ {
+ PDShadingType4 freeTriangleShadingType = (PDShadingType4) shading;
+ COSDictionary cosDictionary = freeTriangleShadingType.getCOSDictionary();
+ PDRange rangeX = freeTriangleShadingType.getDecodeForParameter(0);
+ PDRange rangeY = freeTriangleShadingType.getDecodeForParameter(1);
+ PDRange[] colRange = new PDRange[numberOfColorComponents];
+ for (int i = 0; i < numberOfColorComponents; ++i)
+ {
+ colRange[i] = freeTriangleShadingType.getDecodeForParameter(2 + i);
+ }
+ ArrayList<ShadedTriangle> list = new ArrayList<ShadedTriangle>();
long maxSrcCoord = (long) Math.pow(2, bitsPerCoordinate) - 1;
long maxSrcColor = (long) Math.pow(2, bitsPerColorComponent) - 1;
- LOG.debug("maxSrcCoord: " + maxSrcCoord);
- LOG.debug("maxSrcColor: " + maxSrcColor);
-
- COSDictionary cosDictionary = shadingType4.getCOSDictionary();
COSStream cosStream = (COSStream) cosDictionary;
- //The Decode key specifies how
- //to decode coordinate and color component data into the ranges of values
- //appropriate for each. The ranges are specified as [xmin xmax ymin ymax c1,min,
- //c1,max,..., cn, min, cn,max].
- //
- // see p344
- COSArray decode = (COSArray) cosDictionary.getDictionaryObject(COSName.DECODE);
- LOG.debug("decode: " + decode);
- PDRange rangeX = shadingType4.getDecodeForParameter(0);
- PDRange rangeY = shadingType4.getDecodeForParameter(1);
- LOG.debug("rangeX: " + rangeX.getMin() + ", " + rangeX.getMax());
- LOG.debug("rangeY: " + rangeY.getMin() + ", " + rangeY.getMax());
+ ImageInputStream mciis = new MemoryCacheImageInputStream(cosStream.getUnfilteredStream());
+ byte flag = (byte) 0;
- PDRange[] colRangeTab = new PDRange[numberOfColorComponents];
- for (int i = 0; i < numberOfColorComponents; ++i)
+ try
{
- colRangeTab[i] = shadingType4.getDecodeForParameter(2 + i);
+ flag = (byte) (mciis.readBits(bitsPerFlag) & 3);
}
-
- LOG.debug("bitsPerCoordinate: " + bitsPerCoordinate);
- bitsPerFlag = shadingType4.getBitsPerFlag();
- LOG.debug("bitsPerFlag: " + bitsPerFlag); //TODO handle cases where bitperflag isn't 8
- LOG.debug("Stream size: " + cosStream.getInt(COSName.LENGTH));
-
- // get background values if available
- COSArray bg = shadingType4.getBackground();
- if (bg != null)
+ catch (EOFException ex)
{
- background = bg.toFloatArray();
+ LOG.error(ex);
}
- //TODO missing: BBox, AntiAlias (p. 305 in 1.7 spec)
- // p318:
- // reading in sequence from higher-order to lower-order bit positions
- ImageInputStream mciis = new MemoryCacheImageInputStream(cosStream.getUnfilteredStream());
while (true)
{
+ Vertex p0, p1, p2;
+ Point2D[] ps;
+ float[][] cs;
+ int lastIndex;
try
{
- byte flag = (byte) (mciis.readBits(bitsPerFlag) & 3);
- LOG.debug("flag: " + flag);
switch (flag)
{
case 0:
- Vertex v1 = readVertex(mciis, flag, maxSrcCoord, maxSrcColor, rangeX, rangeY, colRangeTab);
- Vertex v2 = readVertex(mciis, (byte) mciis.readBits(bitsPerFlag), maxSrcCoord, maxSrcColor,
- rangeX, rangeY, colRangeTab);
- Vertex v3 = readVertex(mciis, (byte) mciis.readBits(bitsPerFlag), maxSrcCoord, maxSrcColor,
- rangeX, rangeY, colRangeTab);
-
- // add them after they're read, so that they are never added if there is a premature EOF
- vertexList.add(v1);
- vertexList.add(v2);
- vertexList.add(v3);
+ p0 = readVertex(mciis, maxSrcCoord, maxSrcColor, rangeX, rangeY, colRange, ctm, xform);
+ flag = (byte) (mciis.readBits(bitsPerFlag) & 3);
+ if (flag != 0)
+ {
+ LOG.error("bad triangle: " + flag);
+ }
+ p1 = readVertex(mciis, maxSrcCoord, maxSrcColor, rangeX, rangeY, colRange, ctm, xform);
+ mciis.readBits(bitsPerFlag);
+ if (flag != 0)
+ {
+ LOG.error("bad triangle: " + flag);
+ }
+ p2 = readVertex(mciis, maxSrcCoord, maxSrcColor, rangeX, rangeY, colRange, ctm, xform);
+ ps = new Point2D[]
+ {
+ p0.point, p1.point, p2.point
+ };
+ cs = new float[][]
+ {
+ p0.color, p1.color, p2.color
+ };
+ list.add(new ShadedTriangle(ps, cs));
+ flag = (byte) (mciis.readBits(bitsPerFlag) & 3);
break;
case 1:
+ lastIndex = list.size() - 1;
+ if (lastIndex < 0)
+ {
+ LOG.error("broken data stream: " + list.size());
+ }
+ else
+ {
+ ShadedTriangle preTri = list.get(lastIndex);
+ p2 = readVertex(mciis, maxSrcCoord, maxSrcColor, rangeX, rangeY, colRange, ctm, xform);
+ ps = new Point2D[]
+ {
+ preTri.corner[1], preTri.corner[2], p2.point
+ };
+ cs = new float[][]
+ {
+ preTri.color[1], preTri.color[2], p2.color
+ };
+ list.add(new ShadedTriangle(ps, cs));
+ flag = (byte) (mciis.readBits(bitsPerFlag) & 3);
+ }
+ break;
case 2:
- vertexList.add(readVertex(mciis, flag, maxSrcCoord, maxSrcColor, rangeX, rangeY, colRangeTab));
+ lastIndex = list.size() - 1;
+ if (lastIndex < 0)
+ {
+ LOG.error("broken data stream: " + list.size());
+ }
+ else
+ {
+ ShadedTriangle preTri = list.get(lastIndex);
+ p2 = readVertex(mciis, maxSrcCoord, maxSrcColor, rangeX, rangeY, colRange, ctm, xform);
+ ps = new Point2D[]
+ {
+ preTri.corner[0], preTri.corner[2], p2.point
+ };
+ cs = new float[][]
+ {
+ preTri.color[0], preTri.color[2], p2.color
+ };
+ list.add(new ShadedTriangle(ps, cs));
+ flag = (byte) (mciis.readBits(bitsPerFlag) & 3);
+ }
break;
default:
LOG.warn("bad flag: " + flag);
@@ -142,121 +183,11 @@ class Type4ShadingContext extends Gourau
}
catch (EOFException ex)
{
- LOG.debug("EOF");
- if (vertexList.size() < 3)
- {
- LOG.warn("Incomplete mesh is ignored");
- vertexList.clear();
- }
- else if (vertexList.size() > 1 && vertexList.get(0).flag != 0)
- {
- LOG.warn("Mesh with incorrect start flag " + vertexList.get(0).flag + " is ignored");
- vertexList.clear();
- }
- // check that there are 3 entries if there is a 0 flag
- int vi = 0;
- while (vi < vertexList.size())
- {
- if (vertexList.get(vi).flag == 0)
- {
- if (vi + 2 >= vertexList.size())
- {
- LOG.warn("Mesh with incomplete triangle");
- // remove rest
- while (vertexList.size() >= vi + 1)
- {
- vertexList.remove(vi);
- }
- break;
- }
- vi += 3;
- }
- else
- {
- ++vi;
- }
- }
break;
}
}
mciis.close();
- transformVertices(vertexList, ctm, xform, pageHeight);
- createTriangleList(vertexList);
+ return list;
}
- /**
- * Create GouraudTriangle list from vertices, see p.316 of pdf spec 1.7.
- *
- * @param vertexList list of vertices
- */
- private void createTriangleList(ArrayList<Vertex> vertexList)
- {
- Point2D a = null, b = null, c = null;
- float[] aColor = null, bColor = null, cColor = null;
- int vi = 0;
- while (vi < vertexList.size())
- {
- Vertex v = vertexList.get(vi);
- switch (v.flag)
- {
- case 0:
- a = v.point;
- aColor = v.color;
- ++vi;
-
- v = vertexList.get(vi);
- b = v.point;
- bColor = v.color;
- ++vi;
-
- v = vertexList.get(vi);
- c = v.point;
- cColor = v.color;
- break;
-
- case 1:
- a = b;
- aColor = bColor;
-
- b = c;
- bColor = cColor;
-
- v = vertexList.get(vi);
- c = v.point;
- cColor = v.color;
- break;
-
- case 2:
- b = c;
- bColor = cColor;
-
- v = vertexList.get(vi);
- c = v.point;
- cColor = v.color;
- break;
-
- default:
- break;
- }
- ++vi;
- GouraudTriangle g = new GouraudTriangle(a, aColor, b, bColor, c, cColor);
- if (!g.isEmpty())
- {
- triangleList.add(g);
- }
- else
- {
- LOG.debug("triangle is empty!");
- }
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void dispose()
- {
- super.dispose();
- }
}
Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingPaint.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingPaint.java?rev=1617131&r1=1617130&r2=1617131&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingPaint.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingPaint.java Sun Aug 10 16:34:17 2014
@@ -24,56 +24,51 @@ import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.ColorModel;
import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.pdfbox.util.Matrix;
/**
- * This represents the Paint of an type4 shading.
- *
+ * AWT PaintContext for Gouraud Triangle Mesh (Type 4) shading.
*/
public class Type4ShadingPaint implements Paint
{
+ private static final Log LOG = LogFactory.getLog(Type4ShadingPaint.class);
+
private PDShadingType4 shading;
- private Matrix currentTransformationMatrix;
+ private Matrix ctm;
private int pageHeight;
/**
* Constructor.
*
- * @param shadingType4 the shading resources
+ * @param shading the shading resources
* @param ctm current transformation matrix
- * @param pageHeightValue the height of the page
+ * @param pageHeight the height of the page
*/
- public Type4ShadingPaint(PDShadingType4 shadingType4, Matrix ctm, int pageHeightValue)
+ public Type4ShadingPaint(PDShadingType4 shading, Matrix ctm, int pageHeight)
{
- shading = shadingType4;
- currentTransformationMatrix = ctm;
- pageHeight = pageHeightValue;
+ this.shading = shading;
+ this.ctm = ctm;
+ this.pageHeight = pageHeight;
}
- /**
- * {@inheritDoc}
- */
public int getTransparency()
{
return 0;
}
- /**
- * {@inheritDoc}
- */
- public PaintContext createContext(ColorModel cm, Rectangle deviceBounds,
- Rectangle2D userBounds, AffineTransform xform, RenderingHints hints)
+ public PaintContext createContext(ColorModel cm, Rectangle deviceBounds, Rectangle2D userBounds,
+ AffineTransform xform, RenderingHints hints)
{
try
{
- return new Type4ShadingContext(shading, cm, xform, currentTransformationMatrix, pageHeight);
+ return new Type4ShadingContext(shading, cm, xform, ctm, pageHeight, deviceBounds);
}
catch (IOException ex)
{
- Logger.getLogger(Type4ShadingPaint.class.getName()).log(Level.SEVERE, null, ex);
+ LOG.error(ex);
return null;
}
}
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=1617131&r1=1617130&r2=1617131&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 Sun Aug 10 16:34:17 2014
@@ -16,7 +16,9 @@
*/
package org.apache.pdfbox.pdmodel.graphics.shading;
+import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
+import java.awt.geom.Point2D;
import java.awt.image.ColorModel;
import java.io.EOFException;
import java.io.IOException;
@@ -25,156 +27,117 @@ import javax.imageio.stream.ImageInputSt
import javax.imageio.stream.MemoryCacheImageInputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSDictionary;
-import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSStream;
import org.apache.pdfbox.pdmodel.common.PDRange;
import org.apache.pdfbox.util.Matrix;
/**
- *
- * This represents the Paint of a type 5 (Gouraud triangle lattice) shading
- * context.
+ * AWT PaintContext for Gouraud Triangle Lattice (Type 5) shading.
*
* @author Tilman Hausherr
+ * @author Shaola Ren
*/
-public class Type5ShadingContext extends GouraudShadingContext
+class Type5ShadingContext extends GouraudShadingContext
{
private static final Log LOG = LogFactory.getLog(Type5ShadingContext.class);
/**
* Constructor creates an instance to be used for fill operations.
*
- * @param shadingType5 the shading type to be used
- * @param colorModelValue the color model to be used
+ * @param shading the shading type to be used
+ * @param cm 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
- *
* @throws IOException if something went wrong
*/
- public Type5ShadingContext(PDShadingType5 shadingType5, ColorModel colorModelValue,
- AffineTransform xform, Matrix ctm, int pageHeight) throws IOException
+ public Type5ShadingContext(PDShadingType5 shading, ColorModel cm, AffineTransform xform,
+ Matrix ctm, int pageHeight, Rectangle dBounds) throws IOException
{
- super(shadingType5, colorModelValue, xform, ctm, pageHeight);
+ super(shading, cm, xform, ctm, pageHeight, dBounds);
LOG.debug("Type5ShadingContext");
+
+ // PDFBOX-1966 flip the AffineTransform in 1.8 branch
+ xform.scale(1,-1);
+ xform.translate(0, -pageHeight);
+
+ triangleList = getTriangleList(xform, ctm);
+ pixelTable = calcPixelTable();
+ }
- bitsPerColorComponent = shadingType5.getBitsPerComponent();
- LOG.debug("bitsPerColorComponent: " + bitsPerColorComponent);
- bitsPerCoordinate = shadingType5.getBitsPerCoordinate();
- LOG.debug(Math.pow(2, bitsPerCoordinate) - 1);
+ private ArrayList<ShadedTriangle> getTriangleList(AffineTransform xform, Matrix ctm) throws IOException
+ {
+ ArrayList<ShadedTriangle> list = new ArrayList<ShadedTriangle>();
+ PDShadingType5 latticeTriangleShadingType = (PDShadingType5) shading;
+ COSDictionary cosDictionary = latticeTriangleShadingType.getCOSDictionary();
+ PDRange rangeX = latticeTriangleShadingType.getDecodeForParameter(0);
+ PDRange rangeY = latticeTriangleShadingType.getDecodeForParameter(1);
+ int numPerRow = latticeTriangleShadingType.getVerticesPerRow();
+ PDRange[] colRange = new PDRange[numberOfColorComponents];
+ for (int i = 0; i < numberOfColorComponents; ++i)
+ {
+ colRange[i] = latticeTriangleShadingType.getDecodeForParameter(2 + i);
+ }
+ ArrayList<Vertex> vlist = new ArrayList<Vertex>();
long maxSrcCoord = (long) Math.pow(2, bitsPerCoordinate) - 1;
long maxSrcColor = (long) Math.pow(2, bitsPerColorComponent) - 1;
- LOG.debug("maxSrcCoord: " + maxSrcCoord);
- LOG.debug("maxSrcColor: " + maxSrcColor);
-
- COSDictionary cosDictionary = shadingType5.getCOSDictionary();
COSStream cosStream = (COSStream) cosDictionary;
- //The Decode key specifies how
- //to decode coordinate and color component data into the ranges of values
- //appropriate for each. The ranges are specified as [xmin xmax ymin ymax c1,min,
- //c1,max,..., cn, min, cn,max].
- //
- // see p344
- COSArray decode = (COSArray) cosDictionary.getDictionaryObject(COSName.DECODE);
- LOG.debug("decode: " + decode);
- PDRange rangeX = shadingType5.getDecodeForParameter(0);
- PDRange rangeY = shadingType5.getDecodeForParameter(1);
- LOG.debug("rangeX: " + rangeX.getMin() + ", " + rangeX.getMax());
- LOG.debug("rangeY: " + rangeY.getMin() + ", " + rangeY.getMax());
-
- PDRange[] colRangeTab = new PDRange[numberOfColorComponents];
- for (int i = 0; i < numberOfColorComponents; ++i)
+ ImageInputStream mciis = new MemoryCacheImageInputStream(cosStream.getUnfilteredStream());
+ while (true)
{
- colRangeTab[i] = shadingType5.getDecodeForParameter(2 + i);
+ Vertex p;
+ try
+ {
+ p = readVertex(mciis, maxSrcCoord, maxSrcColor, rangeX, rangeY, colRange, ctm, xform);
+ vlist.add(p);
+ }
+ catch (EOFException ex)
+ {
+ break;
+ }
}
-
- LOG.debug("bitsPerCoordinate: " + bitsPerCoordinate);
-
- // get background values if available
- COSArray bg = shadingType5.getBackground();
- if (bg != null)
+ int sz = vlist.size(), rowNum = sz / numPerRow;
+ Vertex[][] latticeArray = new Vertex[rowNum][numPerRow];
+ if (rowNum < 2)
{
- background = bg.toFloatArray();
+ return triangleList;
+ }
+ for (int i = 0; i < rowNum; i++)
+ {
+ for (int j = 0; j < numPerRow; j++)
+ {
+ latticeArray[i][j] = vlist.get(i * numPerRow + j);
+ }
}
- //TODO missing: BBox, AntiAlias (p. 305 in 1.7 spec)
-
- // p318:
- // reading in sequence from higher-order to lower-order bit positions
- ImageInputStream mciis = new MemoryCacheImageInputStream(cosStream.getUnfilteredStream());
-
- int verticesPerRow = shadingType5.getVerticesPerRow(); //TODO check >=2
- LOG.debug("verticesPerRow" + verticesPerRow);
-
- try
+ for (int i = 0; i < rowNum - 1; i++)
{
- ArrayList<Vertex> prevVertexRow = new ArrayList<Vertex>();
- while (true)
+ for (int j = 0; j < numPerRow - 1; j++)
{
- // read a vertex row
- ArrayList<Vertex> vertexList = new ArrayList<Vertex>();
- for (int row = 0; row < verticesPerRow; ++row)
+ Point2D[] ps = new Point2D[]
{
- vertexList.add(readVertex(mciis, (byte) 0, maxSrcCoord, maxSrcColor, rangeX, rangeY, colRangeTab));
- }
- transformVertices(vertexList, ctm, xform, pageHeight);
-
- // create the triangles from two rows
- if (!prevVertexRow.isEmpty())
+ latticeArray[i][j].point, latticeArray[i][j + 1].point, latticeArray[i + 1][j].point
+ };
+ float[][] cs = new float[][]
+ {
+ latticeArray[i][j].color, latticeArray[i][j + 1].color, latticeArray[i + 1][j].color
+ };
+ list.add(new ShadedTriangle(ps, cs));
+ ps = new Point2D[]
{
- for (int vj = 0; vj < vertexList.size() - 1; ++vj)
- {
- // p.192,194 pdf spec 1.7
- Vertex vij = prevVertexRow.get(vj); // v i,j
- 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
- 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;
+ latticeArray[i][j + 1].point, latticeArray[i + 1][j].point, latticeArray[i + 1][j + 1].point
+ };
+ cs = new float[][]
+ {
+ latticeArray[i][j + 1].color, latticeArray[i + 1][j].color, latticeArray[i + 1][j + 1].color
+ };
+ list.add(new ShadedTriangle(ps, cs));
}
}
- catch (EOFException ex)
- {
- LOG.debug("EOF");
- }
-
- mciis.close();
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void dispose()
- {
- super.dispose();
+ return list;
}
}
Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingPaint.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingPaint.java?rev=1617131&r1=1617130&r2=1617131&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingPaint.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingPaint.java Sun Aug 10 16:34:17 2014
@@ -24,34 +24,34 @@ import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.ColorModel;
import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.apache.pdfbox.util.Matrix;
/**
- * This represents the Paint of an type5 shading.
- *
- *
+ * AWT Paint for Gouraud Triangle Lattice (Type 5) shading.
*/
public class Type5ShadingPaint implements Paint
{
+ private static final Log LOG = LogFactory.getLog(Type5ShadingPaint.class);
+
private PDShadingType5 shading;
- private Matrix currentTransformationMatrix;
+ private Matrix ctm;
private int pageHeight;
/**
* Constructor.
*
- * @param shadingType5 the shading resources
+ * @param shading the shading resources
* @param ctm current transformation matrix
- * @param pageHeightValue
+ * @param pageHeight the height of the page
*/
- public Type5ShadingPaint(PDShadingType5 shadingType5, Matrix ctm, int pageHeightValue)
+ public Type5ShadingPaint(PDShadingType5 shading, Matrix ctm, int pageHeight)
{
- shading = shadingType5;
- currentTransformationMatrix = ctm;
- pageHeight = pageHeightValue;
+ this.shading = shading;
+ this.ctm = ctm;
+ this.pageHeight = pageHeight;
}
/**
@@ -70,11 +70,11 @@ public class Type5ShadingPaint implement
{
try
{
- return new Type5ShadingContext(shading, cm, xform, currentTransformationMatrix, pageHeight);
+ return new Type5ShadingContext(shading, cm, xform, ctm, pageHeight, deviceBounds);
}
catch (IOException ex)
{
- Logger.getLogger(Type5ShadingPaint.class.getName()).log(Level.SEVERE, null, ex);
+ LOG.error(ex);
return null;
}
}
Added: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type6ShadingContext.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type6ShadingContext.java?rev=1617131&view=auto
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type6ShadingContext.java (added)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type6ShadingContext.java Sun Aug 10 16:34:17 2014
@@ -0,0 +1,85 @@
+/*
+ * 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.geom.AffineTransform;
+import java.awt.geom.Point2D;
+import java.awt.image.ColorModel;
+import java.io.IOException;
+import java.util.ArrayList;
+import org.apache.pdfbox.cos.COSArray;
+import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.pdmodel.common.PDRange;
+import org.apache.pdfbox.util.Matrix;
+
+/**
+ * AWT PaintContext for coons patch meshes (type 6) shading. This was done as
+ * part of GSoC2014, Tilman Hausherr is the mentor.
+ *
+ * @author Shaola Ren
+ */
+class Type6ShadingContext extends PatchMeshesShadingContext
+{
+
+ /**
+ * Constructor creates an instance to be used for fill operations.
+ *
+ * @param shading the shading type 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
+ * @throws IOException if something went wrong
+ */
+ public Type6ShadingContext(PDShadingType6 shading, ColorModel colorModel, AffineTransform xform,
+ Matrix ctm, int pageHeight, Rectangle dBounds) throws IOException
+ {
+ super(shading, colorModel, xform, ctm, pageHeight, dBounds);
+
+ // PDFBOX-1966 flip the AffineTransform in 1.8 branch
+ xform.scale(1,-1);
+ xform.translate(0, -pageHeight);
+
+ patchList = getCoonsPatchList(xform, ctm);
+ pixelTable = calcPixelTable();
+ }
+
+ // get the patch list which forms the type 6 shading image from data stream
+ private ArrayList<Patch> getCoonsPatchList(AffineTransform xform, Matrix ctm) throws IOException
+ {
+ PDShadingType6 coonsShadingType = (PDShadingType6) patchMeshesShadingType;
+ COSDictionary cosDictionary = coonsShadingType.getCOSDictionary();
+ PDRange rangeX = coonsShadingType.getDecodeForParameter(0);
+ PDRange rangeY = coonsShadingType.getDecodeForParameter(1);
+
+ PDRange[] colRange = new PDRange[numberOfColorComponents];
+ for (int i = 0; i < numberOfColorComponents; ++i)
+ {
+ colRange[i] = coonsShadingType.getDecodeForParameter(2 + i);
+ }
+ return getPatchList(xform, ctm, cosDictionary, rangeX, rangeY, colRange, 12);
+ }
+
+ @Override
+ protected Patch generatePatch(Point2D[] points, float[][] color)
+ {
+ return new CoonsPatch(points, color);
+ }
+
+}
Propchange: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type6ShadingContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type6ShadingPaint.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type6ShadingPaint.java?rev=1617131&view=auto
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type6ShadingPaint.java (added)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type6ShadingPaint.java Sun Aug 10 16:34:17 2014
@@ -0,0 +1,82 @@
+/*
+ * 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.Paint;
+import java.awt.PaintContext;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.ColorModel;
+import java.io.IOException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.pdfbox.util.Matrix;
+
+/**
+ * AWT Paint for coons patch meshes (Type 6) shading. This was done as part of
+ * GSoC2014, Tilman Hausherr is the mentor.
+ *
+ * @author Shaola Ren
+ */
+public class Type6ShadingPaint implements Paint
+{
+ private static final Log LOG = LogFactory.getLog(Type6ShadingPaint.class);
+
+ private final PDShadingType6 shading;
+ private final Matrix ctm;
+ private final int pageHeight;
+
+ /**
+ * Constructor.
+ *
+ * @param shading the shading resources
+ * @param ctm current transformation matrix
+ * @param pageHeight the height of the page
+ */
+ public Type6ShadingPaint(PDShadingType6 shading, Matrix ctm, int pageHeight)
+ {
+ this.shading = shading;
+ this.ctm = ctm;
+ this.pageHeight = pageHeight;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getTransparency()
+ {
+ return 0;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public PaintContext createContext(ColorModel cm, Rectangle deviceBounds, Rectangle2D userBounds,
+ AffineTransform xform, RenderingHints hints)
+ {
+ try
+ {
+ return new Type6ShadingContext(shading, cm, xform, ctm, pageHeight, deviceBounds);
+ }
+ catch (IOException ex)
+ {
+ LOG.error(ex);
+ return null;
+ }
+ }
+}
Propchange: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type6ShadingPaint.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type7ShadingContext.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type7ShadingContext.java?rev=1617131&view=auto
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type7ShadingContext.java (added)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type7ShadingContext.java Sun Aug 10 16:34:17 2014
@@ -0,0 +1,83 @@
+/*
+ * 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.geom.AffineTransform;
+import java.awt.geom.Point2D;
+import java.awt.image.ColorModel;
+import java.io.IOException;
+import java.util.ArrayList;
+import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.pdmodel.common.PDRange;
+import org.apache.pdfbox.util.Matrix;
+
+/**
+ * AWT PaintContext for tensor-product patch meshes (type 7) shading. This was
+ * done as part of GSoC2014, Tilman Hausherr is the mentor.
+ *
+ * @author Shaola Ren
+ */
+class Type7ShadingContext extends PatchMeshesShadingContext
+{
+
+ /**
+ * Constructor creates an instance to be used for fill operations.
+ *
+ * @param shading the shading type 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
+ * @throws IOException if something went wrong
+ */
+ public Type7ShadingContext(PDShadingType7 shading, ColorModel colorModel, AffineTransform xform,
+ Matrix ctm, int pageHeight, Rectangle dBounds) throws IOException
+ {
+ super(shading, colorModel, xform, ctm, pageHeight, dBounds);
+
+ // PDFBOX-1966 flip the AffineTransform in 1.8 branch
+ xform.scale(1,-1);
+ xform.translate(0, -pageHeight);
+
+ patchList = getTensorPatchList(xform, ctm);
+ pixelTable = calcPixelTable();
+ }
+
+ // get the patch list which forms the type 7 shading image from data stream
+ private ArrayList<Patch> getTensorPatchList(AffineTransform xform, Matrix ctm) throws IOException
+ {
+ PDShadingType7 tensorShadingType = (PDShadingType7) patchMeshesShadingType;
+ COSDictionary cosDictionary = tensorShadingType.getCOSDictionary();
+ PDRange rangeX = tensorShadingType.getDecodeForParameter(0);
+ PDRange rangeY = tensorShadingType.getDecodeForParameter(1);
+ PDRange[] colRange = new PDRange[numberOfColorComponents];
+ for (int i = 0; i < numberOfColorComponents; ++i)
+ {
+ colRange[i] = tensorShadingType.getDecodeForParameter(2 + i);
+ }
+ return getPatchList(xform, ctm, cosDictionary, rangeX, rangeY, colRange, 16);
+ }
+
+ @Override
+ protected Patch generatePatch(Point2D[] points, float[][] color)
+ {
+ return new TensorPatch(points, color);
+ }
+
+}
Propchange: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type7ShadingContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type7ShadingPaint.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type7ShadingPaint.java?rev=1617131&view=auto
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type7ShadingPaint.java (added)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type7ShadingPaint.java Sun Aug 10 16:34:17 2014
@@ -0,0 +1,82 @@
+/*
+ * 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.Paint;
+import java.awt.PaintContext;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.ColorModel;
+import java.io.IOException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.pdfbox.util.Matrix;
+
+/**
+ * AWT Paint for tensor-product patch meshes (Type 7) shading. This was done as
+ * part of GSoC2014, Tilman Hausherr is the mentor.
+ *
+ * @author Shaola Ren
+ */
+public class Type7ShadingPaint implements Paint
+{
+ private static final Log LOG = LogFactory.getLog(Type7ShadingPaint.class);
+
+ private final PDShadingType7 shading;
+ private final Matrix ctm;
+ private final int pageHeight;
+
+ /**
+ * Constructor.
+ *
+ * @param shading the shading resources
+ * @param ctm current transformation matrix
+ * @param pageHeight the height of the page
+ */
+ public Type7ShadingPaint(PDShadingType7 shading, Matrix ctm, int pageHeight)
+ {
+ this.shading = shading;
+ this.ctm = ctm;
+ this.pageHeight = pageHeight;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getTransparency()
+ {
+ return 0;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public PaintContext createContext(ColorModel cm, Rectangle deviceBounds, Rectangle2D userBounds,
+ AffineTransform xform, RenderingHints hints)
+ {
+ try
+ {
+ return new Type7ShadingContext(shading, cm, xform, ctm, pageHeight, deviceBounds);
+ }
+ catch (IOException ex)
+ {
+ LOG.error(ex);
+ return null;
+ }
+ }
+}
Propchange: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type7ShadingPaint.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Vertex.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Vertex.java?rev=1617131&r1=1617130&r2=1617131&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Vertex.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Vertex.java Sun Aug 10 16:34:17 2014
@@ -14,28 +14,24 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package org.apache.pdfbox.pdmodel.graphics.shading;
import java.awt.geom.Point2D;
/**
- *
- * Helper class to deal with Vertices for type 4 and 5 shading.
+ * Vertex for Type 4 and Type 5 shadings.
*
* @author Tilman Hausherr
*/
class Vertex
{
- public byte flag; // used only with type 4 shading
public Point2D point;
public float[] color;
- public Vertex(byte flag, Point2D point, float[] color)
+ public Vertex(Point2D p, float[] c)
{
- this.flag = flag;
- this.point = point;
- this.color = color.clone();
+ point = p;
+ color = c.clone();
}
@Override
@@ -44,13 +40,12 @@ class Vertex
String colorStr = "";
for (float f : color)
{
- if (colorStr.length() > 0)
+ if (!colorStr.isEmpty())
{
colorStr += " ";
}
colorStr += String.format("%3.2f", f);
}
- return "Vertex{" + flag + ": " + point + ", colors=[" + colorStr + "] }";
+ return "Vertex{" + " " + point + ", colors=[" + colorStr + "] }";
}
-
}