Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Unified Diff: src/utils/SkDeferredCanvas.cpp

Issue 803913005: Remove SkCanvas::isDrawingToLayer (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: init fix Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/pipe/SkGPipeWrite.cpp ('k') | tests/CanvasTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/utils/SkDeferredCanvas.cpp
diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp
index 94b3694708af1e2ad53c7e903e079b1da9fa93dd..5083cf7e42f1b5d8b79c95d351931f10c8616981 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;
};
@@ -278,6 +282,7 @@ void SkDeferredDevice::setSurface(SkSurface* surface) {
void SkDeferredDevice::init() {
fRecordingCanvas = NULL;
fFreshFrame = true;
+ fIsDrawingToLayer = false;
fCanDiscardCanvasContents = false;
fPreviousStorageAllocated = 0;
fMaxRecordingStorageBytes = kDefaultMaxRecordingStorageBytes;
@@ -308,7 +313,7 @@ void SkDeferredDevice::setNotificationClient(
}
void SkDeferredDevice::skipPendingCommands() {
- if (!fRecordingCanvas->isDrawingToLayer()) {
+ if (!fIsDrawingToLayer) {
fCanDiscardCanvasContents = true;
if (fPipeController.hasPendingCommands()) {
fFreshFrame = true;
@@ -522,6 +527,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 +680,7 @@ bool SkDeferredCanvas::isFullFrame(const SkRect* rect,
}
void SkDeferredCanvas::willSave() {
+ fSaveLevel++;
this->drawingCanvas()->save();
this->recordedDrawCommand();
this->INHERITED::willSave();
@@ -680,6 +688,11 @@ void SkDeferredCanvas::willSave() {
SkCanvas::SaveLayerStrategy SkDeferredCanvas::willSaveLayer(const SkRect* bounds,
const SkPaint* paint, SaveFlags flags) {
+ fSaveLevel++;
+ if (fFirstSaveLayerIndex == kNoSaveLayerIndex) {
+ fFirstSaveLayerIndex = fSaveLevel;
+ this->getDeferredDevice()->setIsDrawingToLayer(true);
+ }
this->drawingCanvas()->saveLayer(bounds, paint, flags);
this->recordedDrawCommand();
this->INHERITED::willSaveLayer(bounds, paint, flags);
@@ -688,15 +701,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();
« no previous file with comments | « src/pipe/SkGPipeWrite.cpp ('k') | tests/CanvasTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698