| Index: src/utils/SkDeferredCanvas.cpp | 
| diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp | 
| index b46e92a4a09690d60da94d95a634aad43b799f7d..cce5dde538333a5a097ca692b0f01728aab4ba16 100644 | 
| --- a/src/utils/SkDeferredCanvas.cpp | 
| +++ b/src/utils/SkDeferredCanvas.cpp | 
| @@ -526,6 +526,8 @@ SkDeferredCanvas::SkDeferredCanvas(SkDeferredDevice* device) : SkCanvas (device) | 
| void SkDeferredCanvas::init() { | 
| fBitmapSizeThreshold = kDeferredCanvasBitmapSizeThreshold; | 
| fDeferredDrawing = true; // On by default | 
| +    fCachedCanvasSize.setEmpty(); | 
| +    fCachedCanvasSizeDirty = true; | 
| } | 
|  | 
| void SkDeferredCanvas::setMaxRecordingStorage(size_t maxStorage) { | 
| @@ -589,6 +591,14 @@ bool SkDeferredCanvas::isFreshFrame() const { | 
| return this->getDeferredDevice()->isFreshFrame(); | 
| } | 
|  | 
| +SkISize SkDeferredCanvas::getCanvasSize() const { | 
| +    if (fCachedCanvasSizeDirty) { | 
| +        fCachedCanvasSize = this->getBaseLayerSize(); | 
| +        fCachedCanvasSizeDirty = false; | 
| +    } | 
| +    return fCachedCanvasSize; | 
| +} | 
| + | 
| bool SkDeferredCanvas::hasPendingCommands() const { | 
| return this->getDeferredDevice()->hasPendingCommands(); | 
| } | 
| @@ -609,6 +619,7 @@ SkSurface* SkDeferredCanvas::setSurface(SkSurface* surface) { | 
| // all pending commands, which can help to seamlessly recover from | 
| // a lost accelerated graphics context. | 
| deferredDevice->setSurface(surface); | 
| +    fCachedCanvasSizeDirty = true; | 
| return surface; | 
| } | 
|  | 
| @@ -632,7 +643,7 @@ SkImage* SkDeferredCanvas::newImageSnapshot() { | 
| bool SkDeferredCanvas::isFullFrame(const SkRect* rect, | 
| const SkPaint* paint) const { | 
| SkCanvas* canvas = this->drawingCanvas(); | 
| -    SkISize canvasSize = this->getDeviceSize(); | 
| +    SkISize canvasSize = this->getCanvasSize(); | 
| if (rect) { | 
| if (!canvas->getTotalMatrix().rectStaysRect()) { | 
| return false; // conservative | 
|  |