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 |