De-virtualize SkCanvas save/restore.
authorfmalita@google.com <fmalita@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 11 Mar 2014 21:04:41 +0000 (21:04 +0000)
committerfmalita@google.com <fmalita@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 11 Mar 2014 21:04:41 +0000 (21:04 +0000)
This moves the state management logic into non-virtual SkCanvas methods,
and turns the virtuals into protected notifiers.

R=robertphillips@google.com, reed@google.com

Review URL: https://codereview.chromium.org/194713008

git-svn-id: http://skia.googlecode.com/svn/trunk@13747 2bbb7eff-a529-9590-31e7-b0007b416f81

21 files changed:
experimental/PdfViewer/SkNulCanvas.h
include/core/SkCanvas.h
include/utils/SkDeferredCanvas.h
include/utils/SkDumpCanvas.h
include/utils/SkLuaCanvas.h
include/utils/SkNWayCanvas.h
include/utils/SkProxyCanvas.h
src/core/SkBBoxHierarchyRecord.cpp
src/core/SkBBoxHierarchyRecord.h
src/core/SkCanvas.cpp
src/core/SkPictureRecord.cpp
src/core/SkPictureRecord.h
src/pipe/SkGPipeWrite.cpp
src/utils/SkDeferredCanvas.cpp
src/utils/SkDumpCanvas.cpp
src/utils/SkLuaCanvas.cpp
src/utils/SkNWayCanvas.cpp
src/utils/SkNoSaveLayerCanvas.h
src/utils/SkProxyCanvas.cpp
src/utils/debugger/SkDebugCanvas.cpp
src/utils/debugger/SkDebugCanvas.h

index 1c12a5b88faba60d52a1961152cef9cd9e47d0a8..7c1c1cabd934f86f7b5670a65e9d39f422033960 100644 (file)
@@ -26,13 +26,6 @@ public:
     explicit SkNulCanvas(const SkBitmap& bitmap) : SkCanvas(bitmap) {}
     virtual ~SkNulCanvas() {}
 
-    virtual int save(SaveFlags flags = kMatrixClip_SaveFlag) SK_OVERRIDE {return 0;}
-    virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
-                          SaveFlags flags = kARGB_ClipLayer_SaveFlag) SK_OVERRIDE {return 0;}
-    int saveLayerAlpha(const SkRect* bounds, U8CPU alpha,
-                       SaveFlags flags = kARGB_ClipLayer_SaveFlag) {return 0;}
-    virtual void restore() SK_OVERRIDE {}
-    int getSaveCount() const {return 0;}
     virtual bool isDrawingToLayer() const SK_OVERRIDE {return false;}
     virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE {return true;}
     virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE {return true;}
@@ -106,6 +99,12 @@ protected:
     virtual SkCanvas* canvasForDrawIter() {return NULL;}
     virtual SkBaseDevice* setDevice(SkBaseDevice* device) {return NULL;}
 
+    virtual bool onSaveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags flags)
+        SK_OVERRIDE {
+        this->INHERITED::onSaveLayer(bounds, paint, flags);
+        return false;
+    }
+
     virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE {}
     virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE {}
     virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE {}
index 773df89d789843ee4ef5b042403c57136afb94e6..50d319c7721f56ce5f4c240290ac1f40f578fe3b 100644 (file)
@@ -358,7 +358,7 @@ public:
                      by calls to save/restore.
         @return The value to pass to restoreToCount() to balance this save()
     */
-    virtual int save(SaveFlags flags = kMatrixClip_SaveFlag);
+    int save(SaveFlags flags = kMatrixClip_SaveFlag);
 
     /** This behaves the same as save(), but in addition it allocates an
         offscreen bitmap. All drawing calls are directed there, and only when
@@ -373,8 +373,8 @@ public:
         @param flags  LayerFlags
         @return The value to pass to restoreToCount() to balance this save()
     */
-    virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
-                          SaveFlags flags = kARGB_ClipLayer_SaveFlag);
+    int saveLayer(const SkRect* bounds, const SkPaint* paint,
+                  SaveFlags flags = kARGB_ClipLayer_SaveFlag);
 
     /** This behaves the same as save(), but in addition it allocates an
         offscreen bitmap. All drawing calls are directed there, and only when
@@ -396,7 +396,7 @@ public:
         call.
         It is an error to call restore() more times than save() was called.
     */
-    virtual void restore();
+    void restore();
 
     /** Returns the number of matrix/clip states on the SkCanvas' private stack.
         This will equal # save() calls - # restore() calls + 1. The save count on
@@ -1178,6 +1178,14 @@ protected:
     // default impl defers to its device
     virtual const void* onPeekPixels(SkImageInfo*, size_t* rowBytes);
 
+    // Subclass save/restore notifiers. These are called *before* updating the canvas state.
+    // Overriders should call the corresponding INHERITED method up the inheritance chain.
+    // For onSaveLayer(), returning false suppresses full layer allocation (and forces
+    // the base impl to only perform a state save + bounds clip).
+    virtual void onSave(SaveFlags);
+    virtual bool onSaveLayer(const SkRect*, const SkPaint*, SaveFlags);
+    virtual void onRestore();
+
     virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&);
 
     enum ClipEdgeStyle {
@@ -1277,7 +1285,7 @@ private:
                                 const SkRect& dst, const SkPaint* paint);
     void internalDrawPaint(const SkPaint& paint);
     int internalSaveLayer(const SkRect* bounds, const SkPaint* paint,
-                          SaveFlags, bool justForImageFilter);
+                          SaveFlags, bool justForImageFilter, bool skipLayer);
     void internalDrawDevice(SkBaseDevice*, int x, int y, const SkPaint*);
 
     // shared by save() and saveLayer()
index b26ddbc952bc623e7df269bd77e263a38f35b158..210b7fb1894c70a17de77efee1af1ed49ea5fec3 100644 (file)
@@ -138,10 +138,6 @@ public:
     void silentFlush();
 
     // Overrides of the SkCanvas interface
-    virtual int save(SaveFlags flags) SK_OVERRIDE;
-    virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
-                          SaveFlags flags) SK_OVERRIDE;
-    virtual void restore() SK_OVERRIDE;
     virtual bool isDrawingToLayer() const SK_OVERRIDE;
     virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
     virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
@@ -193,6 +189,10 @@ public:
     virtual SkDrawFilter* setDrawFilter(SkDrawFilter* filter) SK_OVERRIDE;
 
 protected:
+    virtual void onSave(SaveFlags) SK_OVERRIDE;
+    virtual bool onSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
+    virtual void onRestore() SK_OVERRIDE;
+
     virtual void onDrawDRRect(const SkRRect&, const SkRRect&,
                               const SkPaint&) SK_OVERRIDE;
 
index 5e3249cbee5ceef1ec1c318e5fd2ad85ea595d8e..c990690d943270c174e741892f3cfae76afc161d 100644 (file)
@@ -74,11 +74,6 @@ public:
 
     int getNestLevel() const { return fNestLevel; }
 
-    virtual int save(SaveFlags) SK_OVERRIDE;
-    virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
-                          SaveFlags) SK_OVERRIDE;
-    virtual void restore() SK_OVERRIDE;
-
     virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
     virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
     virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
@@ -124,6 +119,10 @@ public:
     virtual void endCommentGroup() SK_OVERRIDE;
 
 protected:
+    virtual void onSave(SaveFlags) SK_OVERRIDE;
+    virtual bool onSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
+    virtual void onRestore() SK_OVERRIDE;
+
     virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
     virtual void onPushCull(const SkRect& cullRect) SK_OVERRIDE;
     virtual void onPopCull() SK_OVERRIDE;
index a4f30bc349f0b6a61a8ed4ce839cccecdbd47232..ae76ec2911711546c5bd83059bdc0a7f049cfdc0 100644 (file)
@@ -20,11 +20,6 @@ public:
     SkLuaCanvas(int width, int height, lua_State*, const char function[]);
     virtual ~SkLuaCanvas();
 
-    virtual int save(SaveFlags flags) SK_OVERRIDE;
-    virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
-                          SaveFlags flags) SK_OVERRIDE;
-    virtual void restore() SK_OVERRIDE;
-
     virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
     virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
     virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
@@ -67,6 +62,10 @@ public:
     virtual void drawData(const void* data, size_t length) SK_OVERRIDE;
 
 protected:
+    virtual void onSave(SaveFlags) SK_OVERRIDE;
+    virtual bool onSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
+    virtual void onRestore() SK_OVERRIDE;
+
     virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
 
     virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
index 84f4b4a177288baf09a918fceb8bedb58220f01e..56cad84bb602b7bf08eac1e76e68ef190e3c1e12 100644 (file)
@@ -23,10 +23,6 @@ public:
     ///////////////////////////////////////////////////////////////////////////
     // These are forwarded to the N canvases we're referencing
 
-    virtual int save(SaveFlags) SK_OVERRIDE;
-    virtual int saveLayer(const SkRect* bounds, const SkPaint*,
-                          SaveFlags) SK_OVERRIDE;
-    virtual void restore() SK_OVERRIDE;
     virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
     virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
     virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
@@ -81,6 +77,10 @@ public:
 protected:
     SkTDArray<SkCanvas*> fList;
 
+    virtual void onSave(SaveFlags) SK_OVERRIDE;
+    virtual bool onSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
+    virtual void onRestore() SK_OVERRIDE;
+
     virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
 
     virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
index d682ba3b44124436bfe47156c76696789fb8a10f..329d7e367f39cf8c733037e7d9ecaa1f0be888a9 100644 (file)
@@ -26,11 +26,6 @@ public:
     SkCanvas*   getProxy() const { return fProxy; }
     void        setProxy(SkCanvas* proxy);
 
-    virtual int save(SaveFlags flags = kMatrixClip_SaveFlag) SK_OVERRIDE;
-    virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
-                          SaveFlags flags = kARGB_ClipLayer_SaveFlag) SK_OVERRIDE;
-    virtual void restore() SK_OVERRIDE;
-
     virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
     virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
     virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
@@ -80,6 +75,10 @@ public:
     virtual SkDrawFilter* setDrawFilter(SkDrawFilter* filter) SK_OVERRIDE;
 
 protected:
+    virtual void onSave(SaveFlags) SK_OVERRIDE;
+    virtual bool onSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
+    virtual void onRestore() SK_OVERRIDE;
+
     virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
 
     virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
index 5d310be7bcd3d28a74a1ef823ac019306e7fddd3..e7a30f61f1495b6503a3ce3b94b6fbba62bde214 100644 (file)
@@ -26,20 +26,20 @@ void SkBBoxHierarchyRecord::handleBBox(const SkRect& bounds) {
     fBoundingHierarchy->insert(draw, r, true);
 }
 
-int SkBBoxHierarchyRecord::save(SaveFlags flags) {
+void SkBBoxHierarchyRecord::onSave(SaveFlags flags) {
     fStateTree->appendSave();
-    return INHERITED::save(flags);
+    this->INHERITED::onSave(flags);
 }
 
-int SkBBoxHierarchyRecord::saveLayer(const SkRect* bounds, const SkPaint* paint,
-                                     SaveFlags flags) {
+bool SkBBoxHierarchyRecord::onSaveLayer(const SkRect* bounds, const SkPaint* paint,
+                                        SaveFlags flags) {
     fStateTree->appendSaveLayer(this->writeStream().bytesWritten());
-    return INHERITED::saveLayer(bounds, paint, flags);
+    return this->INHERITED::onSaveLayer(bounds, paint, flags);
 }
 
-void SkBBoxHierarchyRecord::restore() {
+void SkBBoxHierarchyRecord::onRestore() {
     fStateTree->appendRestore();
-    INHERITED::restore();
+    this->INHERITED::onRestore();
 }
 
 bool SkBBoxHierarchyRecord::translate(SkScalar dx, SkScalar dy) {
index 80f59c39078486c33ca828f6525e2f330050d5aa..80c809cfbd568b8bc14bcd18220b8f6b4a120252 100644 (file)
@@ -23,11 +23,6 @@ public:
 
     virtual void handleBBox(const SkRect& bounds) SK_OVERRIDE;
 
-    virtual int save(SaveFlags flags = kMatrixClip_SaveFlag) SK_OVERRIDE;
-    virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
-                          SaveFlags flags = kARGB_ClipLayer_SaveFlag) SK_OVERRIDE;
-    virtual void restore() SK_OVERRIDE;
-
     virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
     virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
     virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
@@ -39,6 +34,10 @@ public:
     virtual bool shouldRewind(void* data) SK_OVERRIDE;
 
 protected:
+    virtual void onSave(SaveFlags) SK_OVERRIDE;
+    virtual bool onSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
+    virtual void onRestore() SK_OVERRIDE;
+
     virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
     virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
     virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
index 0888a01fa459615322717b5896d68bed5e0dc229..bd75f7dbdea0f37fc3351bbe180ebd48d40e2277 100644 (file)
@@ -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;
@@ -806,7 +806,12 @@ int SkCanvas::internalSave(SaveFlags flags) {
     return saveCount;
 }
 
+void SkCanvas::onSave(SaveFlags) {
+    // Do nothing. Subclasses may do something.
+}
+
 int SkCanvas::save(SaveFlags flags) {
+    this->onSave(flags);
     // call shared impl
     return this->internalSave(flags);
 }
@@ -863,9 +868,16 @@ bool SkCanvas::clipRectBounds(const SkRect* bounds, SaveFlags flags,
     return true;
 }
 
+bool SkCanvas::onSaveLayer(const SkRect*, const SkPaint*, SaveFlags) {
+    // Do nothing. Subclasses may do something.
+    return true;
+}
+
 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 +887,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 +903,11 @@ int SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint,
         return count;
     }
 
+    // FIXME: do onSaveLayer() overriders returning false really care about the clipRectBounds()
+    // call above?
+    if (skipLayer)
+        return count;
+
     // Kill the imagefilter if our device doesn't allow it
     SkLazyPaint lazyP;
     if (paint && paint->getImageFilter()) {
@@ -943,9 +960,14 @@ int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha,
     }
 }
 
+void SkCanvas::onRestore() {
+    // Do nothing. Subclasses may do something.
+}
+
 void SkCanvas::restore() {
     // check for underflow
     if (fMCStack.count() > 1) {
+        this->onRestore();
         this->internalRestore();
     }
 }
index 08b69b85271cec5d1ce3de314e5bdd1ec9dafe7b..497ce8ec5474606c91adebd3320db111b630ae84 100644 (file)
@@ -146,7 +146,7 @@ static inline uint32_t getPaintOffset(DrawType op, uint32_t opSize) {
     return gPaintOffsets[op] * sizeof(uint32_t) + overflow;
 }
 
-int SkPictureRecord::save(SaveFlags flags) {
+void SkPictureRecord::onSave(SaveFlags flags) {
 
 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE
     fMCMgr.save(flags);
@@ -156,7 +156,8 @@ int SkPictureRecord::save(SaveFlags flags) {
     fRestoreOffsetStack.push(-(int32_t)fWriter.bytesWritten());
     this->recordSave(flags);
 #endif
-    return this->INHERITED::save(flags);
+
+    this->INHERITED::onSave(flags);
 }
 
 void SkPictureRecord::recordSave(SaveFlags flags) {
@@ -168,12 +169,11 @@ void SkPictureRecord::recordSave(SaveFlags flags) {
     this->validate(initialOffset, size);
 }
 
-int SkPictureRecord::saveLayer(const SkRect* bounds, const SkPaint* paint,
-                               SaveFlags flags) {
+bool SkPictureRecord::onSaveLayer(const SkRect* bounds, const SkPaint* paint,
+                                  SaveFlags flags) {
 
-    int count;
 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE
-    count = fMCMgr.saveLayer(bounds, paint, flags);
+    fMCMgr.saveLayer(bounds, paint, flags);
 #else
     // record the offset to us, making it non-positive to distinguish a save
     // from a clip entry.
@@ -184,15 +184,13 @@ int SkPictureRecord::saveLayer(const SkRect* bounds, const SkPaint* paint,
     }
 #endif
 
-    /*  Don't actually call INHERITED::saveLayer, because that will try to allocate
-        an offscreen device (potentially very big) which we don't actually need
+    this->INHERITED::onSaveLayer(bounds, paint, flags);
+    /*  No need for a (potentially very big) layer which we don't actually need
         at this time (and may not be able to afford since during record our
         clip starts out the size of the picture, which is often much larger
         than the size of the actual device we'll use during playback).
      */
-    count = this->INHERITED::save(flags);
-    this->clipRectBounds(bounds, flags, NULL);
-    return count;
+    return false;
 }
 
 void SkPictureRecord::recordSaveLayer(const SkRect* bounds, const SkPaint* paint,
@@ -605,7 +603,7 @@ static void apply_optimization_to_bbh(PictureRecordOptType opt, SkPictureStateTr
     }
 }
 
-void SkPictureRecord::restore() {
+void SkPictureRecord::onRestore() {
     // FIXME: SkDeferredCanvas needs to be refactored to respect
     // save/restore balancing so that the following test can be
     // turned on permanently.
@@ -653,7 +651,7 @@ void SkPictureRecord::restore() {
     fRestoreOffsetStack.pop();
 #endif
 
-    return this->INHERITED::restore();
+    this->INHERITED::onRestore();
 }
 
 void SkPictureRecord::recordRestore(bool fillInSkips) {
index e91c1c5c1229ffba2d71e2ee9258273f19c0d7c5..ccb1d08163207e3ed7952e9d5b743be9918a0147 100644 (file)
@@ -37,9 +37,6 @@ public:
     SkPictureRecord(const SkISize& dimensions, uint32_t recordFlags);
     virtual ~SkPictureRecord();
 
-    virtual int save(SaveFlags) SK_OVERRIDE;
-    virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags) SK_OVERRIDE;
-    virtual void restore() SK_OVERRIDE;
     virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
     virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
     virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
@@ -227,6 +224,11 @@ protected:
     const void* onPeekPixels(SkImageInfo*, size_t*) SK_OVERRIDE {
         return NULL;
     }
+
+    virtual void onSave(SaveFlags) SK_OVERRIDE;
+    virtual bool onSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
+    virtual void onRestore() SK_OVERRIDE;
+
     virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
     virtual void onPushCull(const SkRect&) SK_OVERRIDE;
     virtual void onPopCull() SK_OVERRIDE;
index 43209f644b9e64743d02f02e1e24800fe3959e55..146f49cf9cf75311e42b516db3683a6bb0efc147 100644 (file)
@@ -229,10 +229,6 @@ public:
     }
 
     // overrides from SkCanvas
-    virtual int save(SaveFlags) SK_OVERRIDE;
-    virtual int saveLayer(const SkRect* bounds, const SkPaint*,
-                          SaveFlags) SK_OVERRIDE;
-    virtual void restore() SK_OVERRIDE;
     virtual bool isDrawingToLayer() const SK_OVERRIDE;
     virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
     virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
@@ -287,6 +283,10 @@ public:
     bool shuttleBitmap(const SkBitmap&, int32_t slot);
 
 protected:
+    virtual void onSave(SaveFlags) SK_OVERRIDE;
+    virtual bool onSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
+    virtual void onRestore() SK_OVERRIDE;
+
     virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
 
     virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
@@ -514,16 +514,17 @@ uint32_t SkGPipeCanvas::getTypefaceID(SkTypeface* face) {
 #define NOTIFY_SETUP(canvas)    \
     AutoPipeNotify apn(canvas)
 
-int SkGPipeCanvas::save(SaveFlags flags) {
+void SkGPipeCanvas::onSave(SaveFlags flags) {
     NOTIFY_SETUP(this);
     if (this->needOpBytes()) {
         this->writeOp(kSave_DrawOp, 0, flags);
     }
-    return this->INHERITED::save(flags);
+
+    this->INHERITED::onSave(flags);
 }
 
-int SkGPipeCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
-                             SaveFlags saveFlags) {
+bool SkGPipeCanvas::onSaveLayer(const SkRect* bounds, const SkPaint* paint,
+                                SaveFlags saveFlags) {
     NOTIFY_SETUP(this);
     size_t size = 0;
     unsigned opFlags = 0;
@@ -547,21 +548,23 @@ int SkGPipeCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
     if (kNoSaveLayer == fFirstSaveLayerStackLevel){
         fFirstSaveLayerStackLevel = this->getSaveCount();
     }
-    // we just pass on the save, so we don't create a layer
-    return this->INHERITED::save(saveFlags);
+
+    this->INHERITED::onSaveLayer(bounds, paint, saveFlags);
+    // we don't create a layer
+    return false;
 }
 
-void SkGPipeCanvas::restore() {
+void SkGPipeCanvas::onRestore() {
     NOTIFY_SETUP(this);
     if (this->needOpBytes()) {
         this->writeOp(kRestore_DrawOp);
     }
 
-    this->INHERITED::restore();
-
-    if (this->getSaveCount() == fFirstSaveLayerStackLevel){
+    if (this->getSaveCount() - 1 == fFirstSaveLayerStackLevel){
         fFirstSaveLayerStackLevel = kNoSaveLayer;
     }
+
+    this->INHERITED::onRestore();
 }
 
 bool SkGPipeCanvas::isDrawingToLayer() const {
index efe750188e7103b190782c537032d9cd6b4f5a47..8b617b30e8f1fcb4ad941ab016bf0fc69e79ce59 100644 (file)
@@ -739,28 +739,25 @@ bool SkDeferredCanvas::isFullFrame(const SkRect* rect,
         SkIntToScalar(canvasSize.fWidth), SkIntToScalar(canvasSize.fHeight)));
 }
 
-int SkDeferredCanvas::save(SaveFlags flags) {
+void SkDeferredCanvas::onSave(SaveFlags flags) {
     this->drawingCanvas()->save(flags);
-    int val = this->INHERITED::save(flags);
     this->recordedDrawCommand();
-
-    return val;
+    this->INHERITED::onSave(flags);
 }
 
-int SkDeferredCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
-                                SaveFlags flags) {
+bool SkDeferredCanvas::onSaveLayer(const SkRect* bounds, const SkPaint* paint,
+                                   SaveFlags flags) {
     this->drawingCanvas()->saveLayer(bounds, paint, flags);
-    int count = this->INHERITED::save(flags);
-    this->clipRectBounds(bounds, flags, NULL);
     this->recordedDrawCommand();
-
-    return count;
+    this->INHERITED::onSaveLayer(bounds, paint, flags);
+    // No need for a full layer.
+    return false;
 }
 
-void SkDeferredCanvas::restore() {
+void SkDeferredCanvas::onRestore() {
     this->drawingCanvas()->restore();
-    this->INHERITED::restore();
     this->recordedDrawCommand();
+    this->INHERITED::onRestore();
 }
 
 bool SkDeferredCanvas::isDrawingToLayer() const {
index 4805d6287c5203df9dab37ddbda95d5543ee0841..ccc5124f30f9694df56c8d8310a1cd1e1b8fd814 100644 (file)
@@ -192,13 +192,13 @@ void SkDumpCanvas::dump(Verb verb, const SkPaint* paint,
 
 ///////////////////////////////////////////////////////////////////////////////
 
-int SkDumpCanvas::save(SaveFlags flags) {
+void SkDumpCanvas::onSave(SaveFlags flags) {
     this->dump(kSave_Verb, NULL, "save(0x%X)", flags);
-    return this->INHERITED::save(flags);
+    this->INHERITED::onSave(flags);
 }
 
-int SkDumpCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
-                             SaveFlags flags) {
+bool SkDumpCanvas::onSaveLayer(const SkRect* bounds, const SkPaint* paint,
+                               SaveFlags flags) {
     SkString str;
     str.printf("saveLayer(0x%X)", flags);
     if (bounds) {
@@ -214,12 +214,12 @@ int SkDumpCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
         }
     }
     this->dump(kSave_Verb, paint, str.c_str());
-    return this->INHERITED::saveLayer(bounds, paint, flags);
+    return this->INHERITED::onSaveLayer(bounds, paint, flags);
 }
 
-void SkDumpCanvas::restore() {
-    this->INHERITED::restore();
+void SkDumpCanvas::onRestore() {
     this->dump(kRestore_Verb, NULL, "restore");
+    this->INHERITED::onRestore();
 }
 
 bool SkDumpCanvas::translate(SkScalar dx, SkScalar dy) {
index 0f13073049e1797cd82ec173d8c235c2ea86e3ed..2679fd25bd327de1719f2c1bf6238d7b464d3332 100644 (file)
@@ -81,13 +81,13 @@ SkLuaCanvas::SkLuaCanvas(int width, int height, lua_State* L, const char func[])
 
 SkLuaCanvas::~SkLuaCanvas() {}
 
-int SkLuaCanvas::save(SaveFlags flags) {
+void SkLuaCanvas::onSave(SaveFlags flags) {
     AUTO_LUA("save");
-    return this->INHERITED::save(flags);
+    this->INHERITED::onSave(flags);
 }
 
-int SkLuaCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
-                             SaveFlags flags) {
+bool SkLuaCanvas::onSaveLayer(const SkRect* bounds, const SkPaint* paint,
+                              SaveFlags flags) {
     AUTO_LUA("saveLayer");
     if (bounds) {
         lua.pushRect(*bounds, "bounds");
@@ -95,12 +95,15 @@ int SkLuaCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
     if (paint) {
         lua.pushPaint(*paint, "paint");
     }
-    return this->INHERITED::save(flags);
+
+    this->INHERITED::onSaveLayer(bounds, paint, flags);
+    // No need for a layer.
+    return false;
 }
 
-void SkLuaCanvas::restore() {
+void SkLuaCanvas::onRestore() {
     AUTO_LUA("restore");
-    this->INHERITED::restore();
+    this->INHERITED::onRestore();
 }
 
 bool SkLuaCanvas::translate(SkScalar dx, SkScalar dy) {
index a9543f9c02f4d4ad04c769d0a1e7fa6f1cab602c..6fbec962044091f647704c236ab20e3dc1411dc8 100644 (file)
@@ -57,29 +57,33 @@ private:
     SkCanvas* fCanvas;
 };
 
-int SkNWayCanvas::save(SaveFlags flags) {
+void SkNWayCanvas::onSave(SaveFlags flags) {
     Iter iter(fList);
     while (iter.next()) {
         iter->save(flags);
     }
-    return this->INHERITED::save(flags);
+
+    this->INHERITED::onSave(flags);
 }
 
-int SkNWayCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
-                                    SaveFlags flags) {
+bool SkNWayCanvas::onSaveLayer(const SkRect* bounds, const SkPaint* paint,
+                               SaveFlags flags) {
     Iter iter(fList);
     while (iter.next()) {
         iter->saveLayer(bounds, paint, flags);
     }
-    return this->INHERITED::saveLayer(bounds, paint, flags);
+
+    this->INHERITED::onSaveLayer(bounds, paint, flags);
+    // No need for a layer.
+    return false;
 }
 
-void SkNWayCanvas::restore() {
+void SkNWayCanvas::onRestore() {
     Iter iter(fList);
     while (iter.next()) {
         iter->restore();
     }
-    this->INHERITED::restore();
+    this->INHERITED::onRestore();
 }
 
 bool SkNWayCanvas::translate(SkScalar dx, SkScalar dy) {
index 60fad87237b91818a7517abea5abd4076432aac2..037fcecab5fe47737623dd3b9dfa9725c9d25622 100644 (file)
@@ -18,21 +18,13 @@ class SkNoSaveLayerCanvas : public SkCanvas {
 public:
     SkNoSaveLayerCanvas(SkBaseDevice* device) : INHERITED(device) {}
 
-    // turn saveLayer() into save() for speed, should not affect correctness.
-    virtual int saveLayer(const SkRect* bounds,
-                          const SkPaint* paint,
-                          SaveFlags flags) SK_OVERRIDE {
-
-        // Like SkPictureRecord, we don't want to create layers, but we do need
-        // to respect the save and (possibly) its rect-clip.
-        int count = this->INHERITED::save(flags);
-        if (NULL != bounds) {
-            this->INHERITED::clipRectBounds(bounds, flags, NULL);
-        }
-        return count;
+protected:
+    virtual bool onSaveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags flags)
+        SK_OVERRIDE {
+        this->INHERITED::onSaveLayer(bounds, paint, flags);
+        return false;
     }
 
-protected:
     // disable aa for speed
     virtual void onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle) SK_OVERRIDE {
         this->INHERITED::onClipRect(rect, op, kHard_ClipEdgeStyle);
index 0a9d7a80c20a6b8f11313753bb3d1beffed63fb0..f61a31d9b3f3bdc95a0876619990c21d1bf25ee0 100644 (file)
@@ -21,17 +21,22 @@ void SkProxyCanvas::setProxy(SkCanvas* proxy) {
 
 ///////////////////////////////// Overrides ///////////
 
-int SkProxyCanvas::save(SaveFlags flags) {
-    return fProxy->save(flags);
+void SkProxyCanvas::onSave(SaveFlags flags) {
+    fProxy->save(flags);
+    this->INHERITED::onSave(flags);
 }
 
-int SkProxyCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
-                             SaveFlags flags) {
-    return fProxy->saveLayer(bounds, paint, flags);
+bool SkProxyCanvas::onSaveLayer(const SkRect* bounds, const SkPaint* paint,
+                                SaveFlags flags) {
+    fProxy->saveLayer(bounds, paint, flags);
+    this->INHERITED::onSaveLayer(bounds, paint, flags);
+    // No need for a layer.
+    return false;
 }
 
-void SkProxyCanvas::restore() {
+void SkProxyCanvas::onRestore() {
     fProxy->restore();
+    this->INHERITED::onRestore();
 }
 
 bool SkProxyCanvas::translate(SkScalar dx, SkScalar dy) {
index 08e6d94f9e58eb717f363b9a50e70ffd624bc6f9..67ecc65b08689742c35bf77a6be5821f1358ce2d 100644 (file)
@@ -530,8 +530,9 @@ void SkDebugCanvas::onPopCull() {
     this->addDrawCommand(new SkPopCullCommand());
 }
 
-void SkDebugCanvas::restore() {
-    addDrawCommand(new SkRestoreCommand());
+void SkDebugCanvas::onRestore() {
+    this->addDrawCommand(new SkRestoreCommand());
+    this->INHERITED::onRestore();
 }
 
 bool SkDebugCanvas::rotate(SkScalar degrees) {
@@ -539,15 +540,17 @@ bool SkDebugCanvas::rotate(SkScalar degrees) {
     return true;
 }
 
-int SkDebugCanvas::save(SaveFlags flags) {
-    addDrawCommand(new SkSaveCommand(flags));
-    return true;
+void SkDebugCanvas::onSave(SaveFlags flags) {
+    this->addDrawCommand(new SkSaveCommand(flags));
+    this->INHERITED::onSave(flags);
 }
 
-int SkDebugCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
-        SaveFlags flags) {
-    addDrawCommand(new SkSaveLayerCommand(bounds, paint, flags));
-    return true;
+bool SkDebugCanvas::onSaveLayer(const SkRect* bounds, const SkPaint* paint,
+                                SaveFlags flags) {
+    this->addDrawCommand(new SkSaveLayerCommand(bounds, paint, flags));
+    this->INHERITED::onSaveLayer(bounds, paint, flags);
+    // No need for a full layer.
+    return false;
 }
 
 bool SkDebugCanvas::scale(SkScalar sx, SkScalar sy) {
index 0bbb640a984fa12e85fb717696c82ca30996cf01..24824c964db44e7f1e1688b9f5e443795d7d37d3 100644 (file)
@@ -206,14 +206,8 @@ public:
                               const uint16_t indices[], int indexCount,
                               const SkPaint&) SK_OVERRIDE;
 
-    virtual void restore() SK_OVERRIDE;
-
     virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
 
-    virtual int save(SaveFlags) SK_OVERRIDE;
-
-    virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags) SK_OVERRIDE;
-
     virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
 
     virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE;
@@ -248,6 +242,10 @@ public:
     }
 
 protected:
+    virtual void onSave(SaveFlags) SK_OVERRIDE;
+    virtual bool onSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
+    virtual void onRestore() SK_OVERRIDE;
+
     virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
     virtual void onPushCull(const SkRect& cullRect) SK_OVERRIDE;
     virtual void onPopCull() SK_OVERRIDE;