Index: src/pdf/SkPDFShader.cpp |
diff --git a/src/pdf/SkPDFShader.cpp b/src/pdf/SkPDFShader.cpp |
index b20be99b0a1bf21fe78e1f4466fe9829a0f37837..e9283bc2756f98d333c9d0de2344206e91f29f7b 100644 |
--- a/src/pdf/SkPDFShader.cpp |
+++ b/src/pdf/SkPDFShader.cpp |
@@ -24,7 +24,7 @@ |
#include "SkTSet.h" |
#include "SkTypes.h" |
-static bool inverseTransformBBox(const SkMatrix& matrix, SkRect* bbox) { |
+static bool inverse_transform_bbox(const SkMatrix& matrix, SkRect* bbox) { |
SkMatrix inverse; |
if (!matrix.invert(&inverse)) { |
return false; |
@@ -849,7 +849,7 @@ SkPDFFunctionShader* SkPDFFunctionShader::Create( |
SkRect bbox; |
bbox.set(state.fBBox); |
- if (!inverseTransformBBox(finalMatrix, &bbox)) { |
+ if (!inverse_transform_bbox(finalMatrix, &bbox)) { |
return NULL; |
} |
@@ -922,7 +922,7 @@ SkPDFImageShader* SkPDFImageShader::Create( |
finalMatrix.preConcat(state.fShaderTransform); |
SkRect deviceBounds; |
deviceBounds.set(state.fBBox); |
- if (!inverseTransformBBox(finalMatrix, &deviceBounds)) { |
+ if (!inverse_transform_bbox(finalMatrix, &deviceBounds)) { |
return NULL; |
} |
@@ -1200,6 +1200,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); |
+ if (!inverse_transform_bbox(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(); |
@@ -1209,8 +1218,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); |
@@ -1220,10 +1229,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()); |