Index: src/pdf/SkPDFShader.cpp |
diff --git a/src/pdf/SkPDFShader.cpp b/src/pdf/SkPDFShader.cpp |
index 20df873cbd14b7ba60a7a252cab2d499cf3518e9..54528ce38b245ab16dd7ae158bd2989d26a465e5 100644 |
--- a/src/pdf/SkPDFShader.cpp |
+++ b/src/pdf/SkPDFShader.cpp |
@@ -1219,6 +1219,15 @@ SkPDFShader::State::State(const SkShader& shader, const SkMatrix& canvasTransfor |
// * shade the whole area |
// * use the result as a bitmap shader |
+ // bbox is in device space. While that's exactly what we want for sizing our bitmap, |
+ // we need to map it into shader space for adjustments (to match |
+ // SkPDFImageShader::Create's behavior). |
+ SkRect shaderRect = SkRect::Make(bbox); |
robertphillips
2015/02/12 21:12:59
inverse_transform_bbox ?
f(malita)
2015/02/12 21:28:33
Done.
|
+ if (!inverseTransformBBox(canvasTransform, &shaderRect)) { |
+ fImage.reset(); |
+ return; |
+ } |
+ |
// Clamp the bitmap size to about 1M pixels |
static const SkScalar kMaxBitmapArea = 1024 * 1024; |
SkScalar bitmapArea = rasterScale * bbox.width() * rasterScale * bbox.height(); |
@@ -1228,8 +1237,8 @@ SkPDFShader::State::State(const SkShader& shader, const SkMatrix& canvasTransfor |
SkISize size = SkISize::Make(SkScalarRoundToInt(rasterScale * bbox.width()), |
SkScalarRoundToInt(rasterScale * bbox.height())); |
- SkSize scale = SkSize::Make(SkIntToScalar(size.width()) / SkIntToScalar(bbox.width()), |
- SkIntToScalar(size.height()) / SkIntToScalar(bbox.height())); |
+ SkSize scale = SkSize::Make(SkIntToScalar(size.width()) / shaderRect.width(), |
+ SkIntToScalar(size.height()) / shaderRect.height()); |
fImage.allocN32Pixels(size.width(), size.height()); |
fImage.eraseColor(SK_ColorTRANSPARENT); |
@@ -1239,10 +1248,10 @@ SkPDFShader::State::State(const SkShader& shader, const SkMatrix& canvasTransfor |
SkCanvas canvas(fImage); |
canvas.scale(scale.width(), scale.height()); |
- canvas.translate(-SkIntToScalar(bbox.x()), -SkIntToScalar(bbox.y())); |
+ canvas.translate(-shaderRect.x(), -shaderRect.y()); |
canvas.drawPaint(p); |
- fShaderTransform.setTranslate(SkIntToScalar(bbox.x()), SkIntToScalar(bbox.y())); |
+ fShaderTransform.setTranslate(shaderRect.x(), shaderRect.y()); |
fShaderTransform.preScale(1 / scale.width(), 1 / scale.height()); |
} else { |
SkASSERT(matrix.isIdentity()); |