| 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()); | 
|  |