Chromium Code Reviews| Index: src/utils/SkDeferredCanvas.cpp |
| diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp |
| index 94b3694708af1e2ad53c7e903e079b1da9fa93dd..5d9832be338c0611ea84bda5a3d70ab437129abd 100644 |
| --- a/src/utils/SkDeferredCanvas.cpp |
| +++ b/src/utils/SkDeferredCanvas.cpp |
| @@ -23,6 +23,8 @@ enum { |
| // Deferred canvas will auto-flush when recording reaches this limit |
| kDefaultMaxRecordingStorageBytes = 64*1024*1024, |
| kDeferredCanvasBitmapSizeThreshold = ~0U, // Disables this feature |
| + |
| + kNoSaveLayerIndex = -1, |
| }; |
| enum PlaybackMode { |
| @@ -154,6 +156,7 @@ public: |
| void skipPendingCommands(); |
| void setMaxRecordingStorage(size_t); |
| void recordedDrawCommand(); |
| + void setIsDrawingToLayer(bool value) {fIsDrawingToLayer = value;} |
| virtual SkImageInfo imageInfo() const SK_OVERRIDE; |
| @@ -256,6 +259,7 @@ private: |
| SkDeferredCanvas::NotificationClient* fNotificationClient; |
| bool fFreshFrame; |
| bool fCanDiscardCanvasContents; |
| + bool fIsDrawingToLayer; |
| size_t fMaxRecordingStorageBytes; |
| size_t fPreviousStorageAllocated; |
| }; |
| @@ -308,7 +312,7 @@ void SkDeferredDevice::setNotificationClient( |
| } |
| void SkDeferredDevice::skipPendingCommands() { |
| - if (!fRecordingCanvas->isDrawingToLayer()) { |
| + if (!fIsDrawingToLayer) { |
| fCanDiscardCanvasContents = true; |
| if (fPipeController.hasPendingCommands()) { |
| fFreshFrame = true; |
| @@ -522,6 +526,8 @@ void SkDeferredCanvas::init() { |
| fDeferredDrawing = true; // On by default |
| fCachedCanvasSize.setEmpty(); |
| fCachedCanvasSizeDirty = true; |
| + fSaveLevel = 0; |
| + fFirstSaveLayerIndex = kNoSaveLayerIndex; |
| } |
| void SkDeferredCanvas::setMaxRecordingStorage(size_t maxStorage) { |
| @@ -673,6 +679,7 @@ bool SkDeferredCanvas::isFullFrame(const SkRect* rect, |
| } |
| void SkDeferredCanvas::willSave() { |
| + fSaveLevel++; |
| this->drawingCanvas()->save(); |
| this->recordedDrawCommand(); |
| this->INHERITED::willSave(); |
| @@ -680,6 +687,11 @@ void SkDeferredCanvas::willSave() { |
| SkCanvas::SaveLayerStrategy SkDeferredCanvas::willSaveLayer(const SkRect* bounds, |
| const SkPaint* paint, SaveFlags flags) { |
| + fSaveLevel++; |
| + if (fFirstSaveLayerIndex == kNoSaveLayerIndex) { |
|
mtklein
2014/12/15 19:05:25
It was neat to learn this doesn't need a stack, hu
|
| + fFirstSaveLayerIndex = fSaveLevel; |
| + this->getDeferredDevice()->setIsDrawingToLayer(true); |
| + } |
| this->drawingCanvas()->saveLayer(bounds, paint, flags); |
| this->recordedDrawCommand(); |
| this->INHERITED::willSaveLayer(bounds, paint, flags); |
| @@ -688,15 +700,17 @@ SkCanvas::SaveLayerStrategy SkDeferredCanvas::willSaveLayer(const SkRect* bounds |
| } |
| void SkDeferredCanvas::willRestore() { |
| + SkASSERT(fFirstSaveLayerIndex == kNoSaveLayerIndex || fFirstSaveLayerIndex <= fSaveLevel); |
| + if (fFirstSaveLayerIndex == fSaveLevel) { |
| + fFirstSaveLayerIndex = kNoSaveLayerIndex; |
| + this->getDeferredDevice()->setIsDrawingToLayer(false); |
| + } |
| + fSaveLevel--; |
| 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(); |