Index: src/core/SkCanvas.cpp |
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp |
index 0888a01fa459615322717b5896d68bed5e0dc229..9f3dd78dcc1e5e66906154fe184a7b8cfd1d1b61 100644 |
--- a/src/core/SkCanvas.cpp |
+++ b/src/core/SkCanvas.cpp |
@@ -348,7 +348,7 @@ public: |
SkPaint tmp; |
tmp.setImageFilter(fOrigPaint.getImageFilter()); |
(void)canvas->internalSaveLayer(bounds, &tmp, |
- SkCanvas::kARGB_ClipLayer_SaveFlag, true); |
+ SkCanvas::kARGB_ClipLayer_SaveFlag, true, false); |
// we'll clear the imageFilter for the actual draws in next(), so |
// it will only be applied during the restore(). |
fDoClearImageFilter = true; |
@@ -807,6 +807,7 @@ int SkCanvas::internalSave(SaveFlags flags) { |
} |
int SkCanvas::save(SaveFlags flags) { |
+ this->onSave(flags); |
// call shared impl |
return this->internalSave(flags); |
} |
@@ -865,7 +866,9 @@ bool SkCanvas::clipRectBounds(const SkRect* bounds, SaveFlags flags, |
int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, |
SaveFlags flags) { |
- return this->internalSaveLayer(bounds, paint, flags, false); |
+ // Overriding classes may return false to signal that we don't need to create a layer. |
+ bool skipLayer = !this->onSaveLayer(bounds, paint, flags); |
+ return this->internalSaveLayer(bounds, paint, flags, false, skipLayer); |
} |
static SkBaseDevice* createCompatibleDevice(SkCanvas* canvas, |
@@ -875,7 +878,7 @@ static SkBaseDevice* createCompatibleDevice(SkCanvas* canvas, |
} |
int SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint, |
- SaveFlags flags, bool justForImageFilter) { |
+ SaveFlags flags, bool justForImageFilter, bool skipLayer) { |
#ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG |
flags = (SaveFlags)(flags | kClipToLayer_SaveFlag); |
#endif |
@@ -891,6 +894,9 @@ int SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint, |
return count; |
} |
+ if (skipLayer) |
+ return count; |
+ |
// Kill the imagefilter if our device doesn't allow it |
SkLazyPaint lazyP; |
if (paint && paint->getImageFilter()) { |
@@ -946,6 +952,7 @@ int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha, |
void SkCanvas::restore() { |
// check for underflow |
if (fMCStack.count() > 1) { |
+ this->onRestore(); |
this->internalRestore(); |
} |
} |