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/src@11842 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/core/SkBBoxRecord.cpp b/core/SkBBoxRecord.cpp
index 1e6c69b..08ae990 100644
--- a/core/SkBBoxRecord.cpp
+++ b/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/core/SkBBoxRecord.h b/core/SkBBoxRecord.h
index fa8b282..e95ece4 100644
--- a/core/SkBBoxRecord.h
+++ b/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/core/SkCanvas.cpp b/core/SkCanvas.cpp
index 7add524..8fbdda6 100644
--- a/core/SkCanvas.cpp
+++ b/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/core/SkPictureRecord.cpp b/core/SkPictureRecord.cpp
index f7a7633..bf7a34e 100644
--- a/core/SkPictureRecord.cpp
+++ b/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/core/SkPictureRecord.h b/core/SkPictureRecord.h
index d80182c..33229cf 100644
--- a/core/SkPictureRecord.h
+++ b/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/pipe/SkGPipeWrite.cpp b/pipe/SkGPipeWrite.cpp
index 57d4a0f..f14cdac 100644
--- a/pipe/SkGPipeWrite.cpp
+++ b/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/utils/SkDeferredCanvas.cpp b/utils/SkDeferredCanvas.cpp
index ce5eb5e..bc00ab0 100644
--- a/utils/SkDeferredCanvas.cpp
+++ b/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/utils/SkDumpCanvas.cpp b/utils/SkDumpCanvas.cpp
index 0e1a232..6658ee2 100644
--- a/utils/SkDumpCanvas.cpp
+++ b/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/utils/SkLuaCanvas.cpp b/utils/SkLuaCanvas.cpp
index c5ec006..3b74596 100644
--- a/utils/SkLuaCanvas.cpp
+++ b/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/utils/SkNWayCanvas.cpp b/utils/SkNWayCanvas.cpp
index eeb1bc2..8075bc4 100644
--- a/utils/SkNWayCanvas.cpp
+++ b/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/utils/SkProxyCanvas.cpp b/utils/SkProxyCanvas.cpp
index f530313..3bc9652 100644
--- a/utils/SkProxyCanvas.cpp
+++ b/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/utils/debugger/SkDebugCanvas.cpp b/utils/debugger/SkDebugCanvas.cpp
index bf81983..2add914 100644
--- a/utils/debugger/SkDebugCanvas.cpp
+++ b/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/utils/debugger/SkDebugCanvas.h b/utils/debugger/SkDebugCanvas.h
index 705f49a..2b17b6f 100644
--- a/utils/debugger/SkDebugCanvas.h
+++ b/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;