From cac8d01eabd05d11365f56b6af3f30bccb173487 Mon Sep 17 00:00:00 2001 From: "scroggo@google.com" Date: Tue, 12 Nov 2013 17:10:02 +0000 Subject: [PATCH] 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@12247 2bbb7eff-a529-9590-31e7-b0007b416f81 --- include/device/xps/SkXPSDevice.h | 5 +++++ src/device/xps/SkXPSDevice.cpp | 8 ++++++++ src/utils/SkDeferredCanvas.cpp | 4 ++++ src/utils/SkPictureUtils.cpp | 5 +++++ 4 files changed, 22 insertions(+) diff --git a/include/device/xps/SkXPSDevice.h b/include/device/xps/SkXPSDevice.h index c33e4503a1..e79081c4e8 100644 --- a/include/device/xps/SkXPSDevice.h +++ b/include/device/xps/SkXPSDevice.h @@ -85,6 +85,11 @@ protected: const SkRect& r, const SkPaint& paint) SK_OVERRIDE; + virtual void drawRRect( + const SkDraw&, + const SkRRect&, + const SkPaint& paint) SK_OVERRIDE; + virtual void drawPath( const SkDraw&, const SkPath& platonicPath, diff --git a/src/device/xps/SkXPSDevice.cpp b/src/device/xps/SkXPSDevice.cpp index 86b8c7d849..4686066dbf 100644 --- a/src/device/xps/SkXPSDevice.cpp +++ b/src/device/xps/SkXPSDevice.cpp @@ -1203,6 +1203,14 @@ void SkXPSDevice::drawRect(const SkDraw& d, 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/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp index ce5eb5e6ab..b94b2feac4 100644 --- a/src/utils/SkDeferredCanvas.cpp +++ b/src/utils/SkDeferredCanvas.cpp @@ -137,6 +137,7 @@ void DeferredPipeController::playback(bool silent) { //----------------------------------------------------------------------------- // DeferredDevice //----------------------------------------------------------------------------- +// FIXME: Derive from SkBaseDevice. class DeferredDevice : public SkBitmapDevice { public: explicit DeferredDevice(SkBaseDevice* immediateDevice); @@ -197,6 +198,9 @@ protected: 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/src/utils/SkPictureUtils.cpp b/src/utils/SkPictureUtils.cpp index ce51614654..ffd9aa4429 100644 --- a/src/utils/SkPictureUtils.cpp +++ b/src/utils/SkPictureUtils.cpp @@ -46,6 +46,7 @@ static void nothing_to_do() {} * 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 @@ public: 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);