| Index: src/utils/SkDeferredCanvas.cpp
|
| diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp
|
| index 94b3694708af1e2ad53c7e903e079b1da9fa93dd..5d625e070d310a74c0fadc4a1e8e2786644f3d58 100644
|
| --- a/src/utils/SkDeferredCanvas.cpp
|
| +++ b/src/utils/SkDeferredCanvas.cpp
|
| @@ -154,6 +154,7 @@ public:
|
| void skipPendingCommands();
|
| void setMaxRecordingStorage(size_t);
|
| void recordedDrawCommand();
|
| + void setIsDrawingToLayer(bool value) {fIsDrawingToLayer = value;}
|
|
|
| virtual SkImageInfo imageInfo() const SK_OVERRIDE;
|
|
|
| @@ -256,6 +257,7 @@ private:
|
| SkDeferredCanvas::NotificationClient* fNotificationClient;
|
| bool fFreshFrame;
|
| bool fCanDiscardCanvasContents;
|
| + bool fIsDrawingToLayer;
|
| size_t fMaxRecordingStorageBytes;
|
| size_t fPreviousStorageAllocated;
|
| };
|
| @@ -308,7 +310,7 @@ void SkDeferredDevice::setNotificationClient(
|
| }
|
|
|
| void SkDeferredDevice::skipPendingCommands() {
|
| - if (!fRecordingCanvas->isDrawingToLayer()) {
|
| + if (!fIsDrawingToLayer) {
|
| fCanDiscardCanvasContents = true;
|
| if (fPipeController.hasPendingCommands()) {
|
| fFreshFrame = true;
|
| @@ -522,6 +524,7 @@ void SkDeferredCanvas::init() {
|
| fDeferredDrawing = true; // On by default
|
| fCachedCanvasSize.setEmpty();
|
| fCachedCanvasSizeDirty = true;
|
| + fSaveLevel = 0;
|
| }
|
|
|
| void SkDeferredCanvas::setMaxRecordingStorage(size_t maxStorage) {
|
| @@ -673,6 +676,7 @@ bool SkDeferredCanvas::isFullFrame(const SkRect* rect,
|
| }
|
|
|
| void SkDeferredCanvas::willSave() {
|
| + fSaveLevel++;
|
| this->drawingCanvas()->save();
|
| this->recordedDrawCommand();
|
| this->INHERITED::willSave();
|
| @@ -680,6 +684,9 @@ void SkDeferredCanvas::willSave() {
|
|
|
| SkCanvas::SaveLayerStrategy SkDeferredCanvas::willSaveLayer(const SkRect* bounds,
|
| const SkPaint* paint, SaveFlags flags) {
|
| + fSaveLevel++;
|
| + fSaveLayerStack.push(fSaveLevel);
|
| + this->getDeferredDevice()->setIsDrawingToLayer(true);
|
| this->drawingCanvas()->saveLayer(bounds, paint, flags);
|
| this->recordedDrawCommand();
|
| this->INHERITED::willSaveLayer(bounds, paint, flags);
|
| @@ -688,15 +695,19 @@ SkCanvas::SaveLayerStrategy SkDeferredCanvas::willSaveLayer(const SkRect* bounds
|
| }
|
|
|
| void SkDeferredCanvas::willRestore() {
|
| + SkASSERT(fSaveLayerStack.isEmpty() || fSaveLayerStack.top() <= fSaveLevel);
|
| + if (!fSaveLayerStack.isEmpty() && fSaveLayerStack.top() == fSaveLevel) {
|
| + fSaveLayerStack.pop();
|
| + if (fSaveLayerStack.isEmpty())
|
| + {
|
| + this->getDeferredDevice()->setIsDrawingToLayer(false);
|
| + }
|
| + }
|
| this->drawingCanvas()->restore();
|
| this->recordedDrawCommand();
|
| this->INHERITED::willRestore();
|
| }
|
|
|
| -bool SkDeferredCanvas::isDrawingToLayer() const {
|
| - return this->drawingCanvas()->isDrawingToLayer();
|
| -}
|
| -
|
| void SkDeferredCanvas::didConcat(const SkMatrix& matrix) {
|
| this->drawingCanvas()->concat(matrix);
|
| this->recordedDrawCommand();
|
|
|