You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2014/12/31 22:48:57 UTC
svn commit: r1648779 -
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/TilingPaint.java
Author: jahewson
Date: Wed Dec 31 21:48:56 2014
New Revision: 1648779
URL: http://svn.apache.org/r1648779
Log:
PDFBOX-1094: Take into account the parent stream's matrix in TilingPaint
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/TilingPaint.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/TilingPaint.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/TilingPaint.java?rev=1648779&r1=1648778&r2=1648779&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/TilingPaint.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/TilingPaint.java Wed Dec 31 21:48:56 2014
@@ -51,6 +51,7 @@ class TilingPaint implements Paint
{
private final PDTilingPattern pattern;
private final TexturePaint paint;
+ private final PageDrawer drawer;
/**
* Creates a new colored tiling Paint.
@@ -64,8 +65,9 @@ class TilingPaint implements Paint
public TilingPaint(PageDrawer drawer, PDTilingPattern pattern, AffineTransform xform)
throws IOException
{
+ this.drawer = drawer;
this.paint = new TexturePaint(getImage(drawer, pattern, null, null, xform),
- getAnchorRect(pattern));
+ getAnchorRect(pattern, drawer));
this.pattern = pattern;
}
@@ -82,8 +84,9 @@ class TilingPaint implements Paint
public TilingPaint(PageDrawer drawer, PDTilingPattern pattern, PDColorSpace colorSpace,
PDColor color, AffineTransform xform) throws IOException
{
+ this.drawer = drawer;
this.paint = new TexturePaint(getImage(drawer, pattern, colorSpace, color, xform),
- getAnchorRect(pattern));
+ getAnchorRect(pattern, drawer));
this.pattern = pattern;
}
@@ -96,11 +99,13 @@ class TilingPaint implements Paint
{
AffineTransform xformPattern = (AffineTransform)xform.clone();
+ // pattern space -> user space
+ Matrix patternMatrix = Matrix.concatenate(drawer.getInitialMatrix(), pattern.getMatrix());
+
// applies the pattern matrix with scaling removed
- Matrix patternMatrix = pattern.getMatrix();
AffineTransform patternNoScale = patternMatrix.createAffineTransform();
patternNoScale.scale(1 / patternMatrix.getScalingFactorX(),
- 1 / patternMatrix.getScalingFactorY());
+ 1 / patternMatrix.getScalingFactorY());
xformPattern.concatenate(patternNoScale);
return paint.createContext(cm, deviceBounds, userBounds, xformPattern, hints);
@@ -117,7 +122,7 @@ class TilingPaint implements Paint
ColorModel cm = new ComponentColorModel(outputCS, true, false,
Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE);
- Rectangle2D anchor = getAnchorRect(pattern);
+ Rectangle2D anchor = getAnchorRect(pattern, drawer);
float width = (float)Math.abs(anchor.getWidth());
float height = (float)Math.abs(anchor.getHeight());
@@ -152,16 +157,19 @@ class TilingPaint implements Paint
// device scale transform (i.e. DPI)
graphics.scale(xformMatrix.getScalingFactorX(), xformMatrix.getScalingFactorY());
+ // pattern space -> user space
+ Matrix patternMatrix = Matrix.concatenate(drawer.getInitialMatrix(), pattern.getMatrix());
+
// apply only the scaling from the pattern transform, doing scaling here improves the
// image quality and prevents large scale-down factors from creating huge tiling cells.
- Matrix patternMatrix = Matrix.getScaleInstance(
- Math.abs(pattern.getMatrix().getScalingFactorX()),
- Math.abs(pattern.getMatrix().getScalingFactorY()));
+ patternMatrix = Matrix.getScaleInstance(
+ Math.abs(patternMatrix.getScalingFactorX()),
+ Math.abs(patternMatrix.getScalingFactorY()));
// move origin to (0,0)
patternMatrix.concatenate(
Matrix.getTranslatingInstance(-pattern.getBBox().getLowerLeftX(),
- -pattern.getBBox().getLowerLeftY()));
+ -pattern.getBBox().getLowerLeftY()));
// render using PageDrawer
drawer.drawTilingPattern(graphics, pattern, colorSpace, color, patternMatrix);
@@ -190,7 +198,7 @@ class TilingPaint implements Paint
/**
* Returns the anchor rectangle, which includes the XStep/YStep and scaling.
*/
- private static Rectangle2D getAnchorRect(PDTilingPattern pattern)
+ private static Rectangle2D getAnchorRect(PDTilingPattern pattern, PageDrawer drawer)
{
float xStep = pattern.getXStep();
if (xStep == 0)
@@ -204,8 +212,11 @@ class TilingPaint implements Paint
yStep = pattern.getBBox().getHeight();
}
- float xScale = pattern.getMatrix().getScalingFactorX();
- float yScale = pattern.getMatrix().getScalingFactorY();
+ // pattern space -> user space
+ Matrix patternMatrix = Matrix.concatenate(drawer.getInitialMatrix(), pattern.getMatrix());
+
+ float xScale = patternMatrix.getScalingFactorX();
+ float yScale = patternMatrix.getScalingFactorY();
// returns the anchor rect with scaling applied
PDRectangle anchor = pattern.getBBox();