Override drawRRect in fake SkBitmapDevices.

Recent changes to SkBitmapDevice modified ::drawRRect() to take
an optimized drawing case. Some subclasses of SkBitmapDevice were
depending on the old behavior of calling ::drawPath(). Since they
do not draw, attempting to take the drawing path can cause problems.
For these subclasses, call drawPath() in the subclass.

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

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

git-svn-id: http://skia.googlecode.com/svn/trunk/src@12247 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/device/xps/SkXPSDevice.cpp b/device/xps/SkXPSDevice.cpp
index 86b8c7d..4686066 100644
--- a/device/xps/SkXPSDevice.cpp
+++ b/device/xps/SkXPSDevice.cpp
@@ -1203,6 +1203,14 @@
     this->internalDrawRect(d, r, true, paint);
 }
 
+void SkXPSDevice::drawRRect(const SkDraw& d,
+                            const SkRRect& rr,
+                            const SkPaint& paint) {
+    SkPath path;
+    path.addRRect(rr);
+    this->drawPath(d, path, paint, NULL, true);
+}
+
 void SkXPSDevice::internalDrawRect(const SkDraw& d,
                                    const SkRect& r,
                                    bool transformRect,
diff --git a/utils/SkDeferredCanvas.cpp b/utils/SkDeferredCanvas.cpp
index ce5eb5e..b94b2fe 100644
--- a/utils/SkDeferredCanvas.cpp
+++ b/utils/SkDeferredCanvas.cpp
@@ -137,6 +137,7 @@
 //-----------------------------------------------------------------------------
 // DeferredDevice
 //-----------------------------------------------------------------------------
+// FIXME: Derive from SkBaseDevice.
 class DeferredDevice : public SkBitmapDevice {
 public:
     explicit DeferredDevice(SkBaseDevice* immediateDevice);
@@ -197,6 +198,9 @@
     virtual void drawRect(const SkDraw&, const SkRect& r,
                             const SkPaint& paint) SK_OVERRIDE
         {SkASSERT(0);}
+    virtual void drawRRect(const SkDraw&, const SkRRect& rr,
+                           const SkPaint& paint) SK_OVERRIDE
+        {SkASSERT(0);}
     virtual void drawPath(const SkDraw&, const SkPath& path,
                             const SkPaint& paint,
                             const SkMatrix* prePathMatrix = NULL,
diff --git a/utils/SkPictureUtils.cpp b/utils/SkPictureUtils.cpp
index ce51614..ffd9aa4 100644
--- a/utils/SkPictureUtils.cpp
+++ b/utils/SkPictureUtils.cpp
@@ -46,6 +46,7 @@
  *  This device will route all bitmaps (primitives and in shaders) to its PRSet.
  *  It should never actually draw anything, so there need not be any pixels
  *  behind its device-bitmap.
+ *  FIXME: Derive from SkBaseDevice.
  */
 class GatherPixelRefDevice : public SkBitmapDevice {
 private:
@@ -93,6 +94,10 @@
                           const SkPaint& paint) SK_OVERRIDE {
         this->addBitmapFromPaint(paint);
     }
+    virtual void drawRRect(const SkDraw&, const SkRRect&,
+                           const SkPaint& paint) SK_OVERRIDE {
+        this->addBitmapFromPaint(paint);
+    }
     virtual void drawOval(const SkDraw&, const SkRect&,
                           const SkPaint& paint) SK_OVERRIDE {
         this->addBitmapFromPaint(paint);