Index: src/core/SkCanvas.cpp |
=================================================================== |
--- src/core/SkCanvas.cpp (revision 10709) |
+++ src/core/SkCanvas.cpp (working copy) |
@@ -214,6 +214,7 @@ |
class SkCanvas::MCRec { |
public: |
MCRec* fNext; |
+ int fFlags; |
SkMatrix* fMatrix; // points to either fMatrixStorage or prev MCRec |
SkRasterClip* fRasterClip; // points to either fRegionStorage or prev MCRec |
SkDrawFilter* fFilter; // the current filter (or null) |
@@ -227,7 +228,7 @@ |
*/ |
DeviceCM* fTopLayer; |
- MCRec(const MCRec* prev, int flags) { |
+ MCRec(const MCRec* prev, int flags) : fFlags(flags) { |
if (NULL != prev) { |
if (flags & SkCanvas::kMatrix_SaveFlag) { |
fMatrixStorage = *prev->fMatrix; |
@@ -720,8 +721,9 @@ |
newTop->fNext = fMCRec; |
fMCRec = newTop; |
- fClipStack.save(); |
- SkASSERT(fClipStack.getSaveCount() == this->getSaveCount() - 1); |
+ if (SkCanvas::kClip_SaveFlag & flags) { |
+ fClipStack.save(); |
+ } |
return saveCount; |
} |
@@ -896,7 +898,10 @@ |
fDeviceCMDirty = true; |
fLocalBoundsCompareTypeDirty = true; |
- fClipStack.restore(); |
+ if (SkCanvas::kClip_SaveFlag & fMCRec->fFlags) { |
+ fClipStack.restore(); |
+ } |
+ |
// reserve our layer (if any) |
DeviceCM* layer = fMCRec->fLayer; // may be null |
// now detach it from fMCRec so we can pop(). Gets freed after its drawn |