If the path is a rect, call drawRect to raster the geometry in SkCanvas::drawPath to get better performance.

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

Author: yunchao.he@intel.com

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

git-svn-id: http://skia.googlecode.com/svn/trunk@11842 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/PdfViewer/SkNulCanvas.h b/experimental/PdfViewer/SkNulCanvas.h
index 8ec2d32..c43ea82 100644
--- a/experimental/PdfViewer/SkNulCanvas.h
+++ b/experimental/PdfViewer/SkNulCanvas.h
@@ -55,10 +55,8 @@
     virtual void drawPaint(const SkPaint& paint) {}
     virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
                             const SkPaint& paint) {}
-    virtual void drawRect(const SkRect& rect, const SkPaint& paint) {}
     virtual void drawOval(const SkRect& oval, const SkPaint&) {}
     virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) {}
-    virtual void drawPath(const SkPath& path, const SkPaint& paint) {}
     virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
                             const SkPaint* paint = NULL) {}
     virtual void drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
@@ -95,6 +93,8 @@
     virtual SkDrawFilter* setDrawFilter(SkDrawFilter* filter) {return NULL;}
 
 protected:
+    virtual void onDrawRect(const SkRect& rect, const SkPaint& paint) {}
+    virtual void onDrawPath(const SkPath& path, const SkPaint& paint) {}
     virtual SkCanvas* canvasForDrawIter() {return NULL;}
     virtual SkBaseDevice* setDevice(SkBaseDevice* device) {return NULL;}
 
diff --git a/experimental/SimpleCocoaApp/SimpleApp.mm b/experimental/SimpleCocoaApp/SimpleApp.mm
index 7dac2a4..2156209 100644
--- a/experimental/SimpleCocoaApp/SimpleApp.mm
+++ b/experimental/SimpleCocoaApp/SimpleApp.mm
@@ -135,7 +135,7 @@
 }
 
 class PathCanvas : public SkCanvas {
-    virtual void drawPath(const SkPath& path, const SkPaint& paint) {
+    virtual void onDrawPath(const SkPath& path, const SkPaint& paint) {
         if (nameonly) {
             SkDebugf("    %s%d,\n", filename.c_str(), ++count);
             return;
diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h
index dc3953e..8c09a9c 100644
--- a/include/core/SkCanvas.h
+++ b/include/core/SkCanvas.h
@@ -575,16 +575,20 @@
         will be filled or stroked based on the Style in the paint.
         @param rect     The rect to be drawn
         @param paint    The paint used to draw the rect
+
+        Overriding this function is deprecated. It will be made non-virtual
+        soon. Instead override onDrawRect.
     */
-    virtual void drawRect(const SkRect& rect, const SkPaint& paint);
+    virtual void drawRect(const SkRect& rect, const SkPaint& paint) {
+        this->onDrawRect(rect, paint);
+    }
 
     /** Draw the specified rectangle using the specified paint. The rectangle
         will be filled or framed based on the Style in the paint.
         @param rect     The rect to be drawn
         @param paint    The paint used to draw the rect
     */
-    void drawIRect(const SkIRect& rect, const SkPaint& paint)
-    {
+    void drawIRect(const SkIRect& rect, const SkPaint& paint) {
         SkRect r;
         r.set(rect);    // promotes the ints to scalars
         this->drawRect(r, paint);
@@ -656,8 +660,18 @@
         filled or framed based on the Style in the paint.
         @param path     The path to be drawn
         @param paint    The paint used to draw the path
+
+        Overriding this function is deprecated. It will be made non-virtual
+        soon. Instead override onDrawRect.
     */
-    virtual void drawPath(const SkPath& path, const SkPaint& paint);
+    virtual void drawPath(const SkPath& path, const SkPaint& paint) {
+        SkRect rect;
+        if (path.isRect(&rect)) {
+            this->onDrawRect(rect, paint);
+        } else {
+            this->onDrawPath(path, paint);
+        }
+    }
 
     /** Draw the specified bitmap, with its top/left corner at (x,y), using the
         specified paint, transformed by the current matrix. Note: if the paint
@@ -1034,6 +1048,10 @@
     // can perform copy-on-write or invalidate any cached images
     void predrawNotify();
 
+    virtual void onDrawRect(const SkRect& rect, const SkPaint& paint);
+
+    virtual void onDrawPath(const SkPath& path, const SkPaint& paint);
+
     /** DEPRECATED -- use constructor(device)
 
      Marked as 'protected' to avoid new clients using this before we can
diff --git a/include/utils/SkDeferredCanvas.h b/include/utils/SkDeferredCanvas.h
index c0613ed..052c667 100644
--- a/include/utils/SkDeferredCanvas.h
+++ b/include/utils/SkDeferredCanvas.h
@@ -162,10 +162,7 @@
     virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
                             const SkPaint& paint) SK_OVERRIDE;
     virtual void drawOval(const SkRect&, const SkPaint& paint) SK_OVERRIDE;
-    virtual void drawRect(const SkRect& rect, const SkPaint& paint) SK_OVERRIDE;
     virtual void drawRRect(const SkRRect&, const SkPaint& paint) SK_OVERRIDE;
-    virtual void drawPath(const SkPath& path, const SkPaint& paint)
-                          SK_OVERRIDE;
     virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left,
                             SkScalar top, const SkPaint* paint)
                             SK_OVERRIDE;
@@ -234,6 +231,8 @@
     };
 
 protected:
+    virtual void onDrawRect(const SkRect& rect, const SkPaint& paint) SK_OVERRIDE;
+    virtual void onDrawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE;
     virtual SkCanvas* canvasForDrawIter();
     DeferredDevice* getDeferredDevice() const;
 
diff --git a/include/utils/SkDumpCanvas.h b/include/utils/SkDumpCanvas.h
index 96b45e7..d3ff9a1 100644
--- a/include/utils/SkDumpCanvas.h
+++ b/include/utils/SkDumpCanvas.h
@@ -93,9 +93,7 @@
     virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
                             const SkPaint& paint) SK_OVERRIDE;
     virtual void drawOval(const SkRect&, const SkPaint& paint) SK_OVERRIDE;
-    virtual void drawRect(const SkRect&, const SkPaint& paint) SK_OVERRIDE;
     virtual void drawRRect(const SkRRect&, const SkPaint& paint) SK_OVERRIDE;
-    virtual void drawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE;
     virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
                             const SkPaint* paint) SK_OVERRIDE;
     virtual void drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
@@ -126,6 +124,10 @@
     virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE;
     virtual void endCommentGroup() SK_OVERRIDE;
 
+protected:
+    virtual void onDrawRect(const SkRect&, const SkPaint& paint) SK_OVERRIDE;
+    virtual void onDrawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE;
+
 private:
     Dumper* fDumper;
     int     fNestLevel; // for nesting recursive elements like pictures
diff --git a/include/utils/SkLuaCanvas.h b/include/utils/SkLuaCanvas.h
index c34d134..b604d3c 100644
--- a/include/utils/SkLuaCanvas.h
+++ b/include/utils/SkLuaCanvas.h
@@ -42,9 +42,7 @@
     virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
                             const SkPaint& paint) SK_OVERRIDE;
     virtual void drawOval(const SkRect&, const SkPaint& paint) SK_OVERRIDE;
-    virtual void drawRect(const SkRect&, const SkPaint& paint) SK_OVERRIDE;
     virtual void drawRRect(const SkRRect&, const SkPaint& paint) SK_OVERRIDE;
-    virtual void drawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE;
     virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
                             const SkPaint* paint) SK_OVERRIDE;
     virtual void drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
@@ -72,6 +70,10 @@
                               const SkPaint& paint) SK_OVERRIDE;
     virtual void drawData(const void* data, size_t length) SK_OVERRIDE;
 
+protected:
+    virtual void onDrawRect(const SkRect&, const SkPaint& paint) SK_OVERRIDE;
+    virtual void onDrawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE;
+
 private:
     lua_State*  fL;
     SkString    fFunc;
diff --git a/include/utils/SkNWayCanvas.h b/include/utils/SkNWayCanvas.h
index c48bcab..6791c51 100644
--- a/include/utils/SkNWayCanvas.h
+++ b/include/utils/SkNWayCanvas.h
@@ -43,9 +43,7 @@
     virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
                             const SkPaint&) SK_OVERRIDE;
     virtual void drawOval(const SkRect&, const SkPaint&) SK_OVERRIDE;
-    virtual void drawRect(const SkRect&, const SkPaint&) SK_OVERRIDE;
     virtual void drawRRect(const SkRRect&, const SkPaint&) SK_OVERRIDE;
-    virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
     virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
                             const SkPaint*) SK_OVERRIDE;
     virtual void drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
@@ -80,6 +78,8 @@
     virtual void endCommentGroup() SK_OVERRIDE;
 
 protected:
+    virtual void onDrawRect(const SkRect&, const SkPaint&) SK_OVERRIDE;
+    virtual void onDrawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
     SkTDArray<SkCanvas*> fList;
 
     class Iter;
diff --git a/include/utils/SkProxyCanvas.h b/include/utils/SkProxyCanvas.h
index 383e532..54cdc3b 100644
--- a/include/utils/SkProxyCanvas.h
+++ b/include/utils/SkProxyCanvas.h
@@ -48,9 +48,7 @@
     virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
                             const SkPaint& paint) SK_OVERRIDE;
     virtual void drawOval(const SkRect&, const SkPaint& paint) SK_OVERRIDE;
-    virtual void drawRect(const SkRect&, const SkPaint& paint) SK_OVERRIDE;
     virtual void drawRRect(const SkRRect&, const SkPaint& paint) SK_OVERRIDE;
-    virtual void drawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE;
     virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
                             const SkPaint* paint = NULL) SK_OVERRIDE;
     virtual void drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
@@ -85,6 +83,10 @@
     virtual SkBounder* setBounder(SkBounder* bounder) SK_OVERRIDE;
     virtual SkDrawFilter* setDrawFilter(SkDrawFilter* filter) SK_OVERRIDE;
 
+protected:
+    virtual void onDrawRect(const SkRect&, const SkPaint& paint) SK_OVERRIDE;
+    virtual void onDrawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE;
+
 private:
     SkCanvas*   fProxy;
 
diff --git a/src/core/SkBBoxRecord.cpp b/src/core/SkBBoxRecord.cpp
index 1e6c69b..08ae990 100644
--- a/src/core/SkBBoxRecord.cpp
+++ b/src/core/SkBBoxRecord.cpp
@@ -20,23 +20,23 @@
     }
 }
 
-void SkBBoxRecord::drawRect(const SkRect& rect, const SkPaint& paint) {
+void SkBBoxRecord::onDrawRect(const SkRect& rect, const SkPaint& paint) {
     if (this->transformBounds(rect, &paint)) {
-        INHERITED::drawRect(rect, paint);
+        INHERITED::onDrawRect(rect, paint);
     }
 }
 
-void SkBBoxRecord::drawPath(const SkPath& path, const SkPaint& paint) {
+void SkBBoxRecord::onDrawPath(const SkPath& path, const SkPaint& paint) {
     if (path.isInverseFillType()) {
         // If path is inverse filled, use the current clip bounds as the
         // path's device-space bounding box.
         SkIRect clipBounds;
         if (this->getClipDeviceBounds(&clipBounds)) {
             this->handleBBox(SkRect::MakeFromIRect(clipBounds));
-            INHERITED::drawPath(path, paint);
+            INHERITED::onDrawPath(path, paint);
         }
     } else if (this->transformBounds(path.getBounds(), &paint)) {
-        INHERITED::drawPath(path, paint);
+        INHERITED::onDrawPath(path, paint);
     }
 }
 
diff --git a/src/core/SkBBoxRecord.h b/src/core/SkBBoxRecord.h
index fa8b282..e95ece4 100644
--- a/src/core/SkBBoxRecord.h
+++ b/src/core/SkBBoxRecord.h
@@ -31,8 +31,6 @@
 
     virtual void drawOval(const SkRect& rect, const SkPaint& paint) SK_OVERRIDE;
     virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE;
-    virtual void drawRect(const SkRect& rect, const SkPaint& paint) SK_OVERRIDE;
-    virtual void drawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE;
     virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
                             const SkPaint& paint) SK_OVERRIDE;
     virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
@@ -65,6 +63,10 @@
                               const SkPaint& paint) SK_OVERRIDE;
     virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
 
+protected:
+    virtual void onDrawRect(const SkRect& rect, const SkPaint& paint) SK_OVERRIDE;
+    virtual void onDrawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE;
+
 private:
     /**
      * Takes a bounding box in current canvas view space, accounts for stroking and effects, and
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 7add524..8fbdda6 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -1631,7 +1631,7 @@
     LOOPER_END
 }
 
-void SkCanvas::drawRect(const SkRect& r, const SkPaint& paint) {
+void SkCanvas::onDrawRect(const SkRect& r, const SkPaint& paint) {
     CHECK_SHADER_NOSETCONTEXT(paint);
 
     if (paint.canComputeFastBounds()) {
@@ -1699,7 +1699,7 @@
 }
 
 
-void SkCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
+void SkCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
     CHECK_SHADER_NOSETCONTEXT(paint);
 
     if (!path.isFinite()) {
diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp
index f7a7633..bf7a34e 100644
--- a/src/core/SkPictureRecord.cpp
+++ b/src/core/SkPictureRecord.cpp
@@ -868,7 +868,7 @@
     this->validate(initialOffset, size);
 }
 
-void SkPictureRecord::drawRect(const SkRect& rect, const SkPaint& paint) {
+void SkPictureRecord::onDrawRect(const SkRect& rect, const SkPaint& paint) {
     // op + paint index + rect
     uint32_t size = 2 * kUInt32Size + sizeof(rect);
     size_t initialOffset = this->addDraw(DRAW_RECT, &size);
@@ -895,7 +895,7 @@
     }
 }
 
-void SkPictureRecord::drawPath(const SkPath& path, const SkPaint& paint) {
+void SkPictureRecord::onDrawPath(const SkPath& path, const SkPaint& paint) {
     // op + paint index + path index
     uint32_t size = 3 * kUInt32Size;
     size_t initialOffset = this->addDraw(DRAW_PATH, &size);
diff --git a/src/core/SkPictureRecord.h b/src/core/SkPictureRecord.h
index d80182c..33229cf 100644
--- a/src/core/SkPictureRecord.h
+++ b/src/core/SkPictureRecord.h
@@ -53,9 +53,7 @@
     virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
                             const SkPaint&) SK_OVERRIDE;
     virtual void drawOval(const SkRect&, const SkPaint&) SK_OVERRIDE;
-    virtual void drawRect(const SkRect&, const SkPaint&) SK_OVERRIDE;
     virtual void drawRRect(const SkRRect&, const SkPaint&) SK_OVERRIDE;
-    virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
     virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
                             const SkPaint*) SK_OVERRIDE;
     virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src,
@@ -106,6 +104,10 @@
     void beginRecording();
     void endRecording();
 
+protected:
+    virtual void onDrawRect(const SkRect&, const SkPaint&) SK_OVERRIDE;
+    virtual void onDrawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
+
 private:
     void handleOptimization(int opt);
     void recordRestoreOffsetPlaceholder(SkRegion::Op);
diff --git a/src/pipe/SkGPipeWrite.cpp b/src/pipe/SkGPipeWrite.cpp
index 57d4a0f..f14cdac 100644
--- a/src/pipe/SkGPipeWrite.cpp
+++ b/src/pipe/SkGPipeWrite.cpp
@@ -224,9 +224,7 @@
     virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
                             const SkPaint&) SK_OVERRIDE;
     virtual void drawOval(const SkRect&, const SkPaint&) SK_OVERRIDE;
-    virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
     virtual void drawRRect(const SkRRect&, const SkPaint&) SK_OVERRIDE;
-    virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
     virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
                             const SkPaint*) SK_OVERRIDE;
     virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src,
@@ -264,6 +262,11 @@
      * according to slot.
      */
     bool shuttleBitmap(const SkBitmap&, int32_t slot);
+
+protected:
+    virtual void onDrawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
+    virtual void onDrawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
+
 private:
     enum {
         kNoSaveLayer = -1,
@@ -715,7 +718,7 @@
     }
 }
 
-void SkGPipeCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
+void SkGPipeCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
     NOTIFY_SETUP(this);
     this->writePaint(paint);
     if (this->needOpBytes(sizeof(SkRect))) {
@@ -733,7 +736,7 @@
     }
 }
 
-void SkGPipeCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
+void SkGPipeCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
     NOTIFY_SETUP(this);
     this->writePaint(paint);
     if (this->needOpBytes(path.writeToMemory(NULL))) {
diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp
index ce5eb5e..bc00ab0 100644
--- a/src/utils/SkDeferredCanvas.cpp
+++ b/src/utils/SkDeferredCanvas.cpp
@@ -846,7 +846,7 @@
     this->recordedDrawCommand();
 }
 
-void SkDeferredCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
+void SkDeferredCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
     if (fDeferredDrawing && this->isFullFrame(&rect, &paint) &&
         isPaintOpaque(&paint)) {
         this->getDeferredDevice()->skipPendingCommands();
@@ -869,7 +869,7 @@
     }
 }
 
-void SkDeferredCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
+void SkDeferredCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
     AutoImmediateDrawIfNeeded autoDraw(*this, &paint);
     this->drawingCanvas()->drawPath(path, paint);
     this->recordedDrawCommand();
diff --git a/src/utils/SkDumpCanvas.cpp b/src/utils/SkDumpCanvas.cpp
index 0e1a232..6658ee2 100644
--- a/src/utils/SkDumpCanvas.cpp
+++ b/src/utils/SkDumpCanvas.cpp
@@ -323,7 +323,7 @@
     this->dump(kDrawOval_Verb, &paint, "drawOval(%s)", str.c_str());
 }
 
-void SkDumpCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
+void SkDumpCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
     SkString str;
     toString(rect, &str);
     this->dump(kDrawRect_Verb, &paint, "drawRect(%s)", str.c_str());
@@ -335,7 +335,7 @@
     this->dump(kDrawRRect_Verb, &paint, "drawRRect(%s)", str.c_str());
 }
 
-void SkDumpCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
+void SkDumpCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
     SkString str;
     toString(path, &str);
     this->dump(kDrawPath_Verb, &paint, "drawPath(%s)", str.c_str());
diff --git a/src/utils/SkLuaCanvas.cpp b/src/utils/SkLuaCanvas.cpp
index c5ec006..3b74596 100644
--- a/src/utils/SkLuaCanvas.cpp
+++ b/src/utils/SkLuaCanvas.cpp
@@ -187,7 +187,7 @@
     lua.pushPaint(paint, "paint");
 }
 
-void SkLuaCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
+void SkLuaCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
     AUTO_LUA("drawRect");
     lua.pushRect(rect, "rect");
     lua.pushPaint(paint, "paint");
@@ -199,7 +199,7 @@
     lua.pushPaint(paint, "paint");
 }
 
-void SkLuaCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
+void SkLuaCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
     AUTO_LUA("drawPath");
     lua.pushPath(path, "path");
     lua.pushPaint(paint, "paint");
diff --git a/src/utils/SkNWayCanvas.cpp b/src/utils/SkNWayCanvas.cpp
index eeb1bc2..8075bc4 100644
--- a/src/utils/SkNWayCanvas.cpp
+++ b/src/utils/SkNWayCanvas.cpp
@@ -190,7 +190,7 @@
     }
 }
 
-void SkNWayCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
+void SkNWayCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
     Iter iter(fList);
     while (iter.next()) {
         iter->drawRect(rect, paint);
@@ -204,7 +204,7 @@
     }
 }
 
-void SkNWayCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
+void SkNWayCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
     Iter iter(fList);
     while (iter.next()) {
         iter->drawPath(path, paint);
diff --git a/src/utils/SkProxyCanvas.cpp b/src/utils/SkProxyCanvas.cpp
index f530313..3bc9652 100644
--- a/src/utils/SkProxyCanvas.cpp
+++ b/src/utils/SkProxyCanvas.cpp
@@ -87,7 +87,7 @@
     fProxy->drawOval(rect, paint);
 }
 
-void SkProxyCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
+void SkProxyCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
     fProxy->drawRect(rect, paint);
 }
 
@@ -95,7 +95,7 @@
     fProxy->drawRRect(rrect, paint);
 }
 
-void SkProxyCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
+void SkProxyCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
     fProxy->drawPath(path, paint);
 }
 
diff --git a/src/utils/debugger/SkDebugCanvas.cpp b/src/utils/debugger/SkDebugCanvas.cpp
index bf81983..2add914 100644
--- a/src/utils/debugger/SkDebugCanvas.cpp
+++ b/src/utils/debugger/SkDebugCanvas.cpp
@@ -321,7 +321,7 @@
     addDrawCommand(new SkDrawPaintCommand(paint));
 }
 
-void SkDebugCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
+void SkDebugCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
     addDrawCommand(new SkDrawPathCommand(path, paint));
 }
 
@@ -345,7 +345,7 @@
         new SkDrawPosTextHCommand(text, byteLength, xpos, constY, paint));
 }
 
-void SkDebugCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
+void SkDebugCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
     // NOTE(chudy): Messing up when renamed to DrawRect... Why?
     addDrawCommand(new SkDrawRectCommand(rect, paint));
 }
diff --git a/src/utils/debugger/SkDebugCanvas.h b/src/utils/debugger/SkDebugCanvas.h
index 705f49a..2b17b6f 100644
--- a/src/utils/debugger/SkDebugCanvas.h
+++ b/src/utils/debugger/SkDebugCanvas.h
@@ -182,8 +182,6 @@
 
     virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
 
-    virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
-
     virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
 
     virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
@@ -196,8 +194,6 @@
                               const SkScalar xpos[], SkScalar constY,
                               const SkPaint&) SK_OVERRIDE;
 
-    virtual void drawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
-
     virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE;
 
     virtual void drawSprite(const SkBitmap&, int left, int top,
@@ -235,6 +231,11 @@
     static const int kVizImageHeight = 256;
     static const int kVizImageWidth = 256;
 
+protected:
+    virtual void onDrawRect(const SkRect& rect, const SkPaint&) SK_OVERRIDE;
+
+    virtual void onDrawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
+
 private:
     SkTDArray<SkDrawCommand*> fCommandVector;
     int fHeight;
diff --git a/tests/TileGridTest.cpp b/tests/TileGridTest.cpp
index 8f5b18a..3466871 100644
--- a/tests/TileGridTest.cpp
+++ b/tests/TileGridTest.cpp
@@ -25,13 +25,14 @@
     MockCanvas(SkBaseDevice* device) : SkCanvas(device)
     {}
 
-    virtual void drawRect(const SkRect& rect, const SkPaint&)
+    SkTDArray<SkRect> fRects;
+
+protected:
+    virtual void onDrawRect(const SkRect& rect, const SkPaint&)
     {
         // This capture occurs before quick reject.
         fRects.push(rect);
     }
-
-    SkTDArray<SkRect> fRects;
 };
 
 class TileGridTest {