Index: tools/PictureRenderer.cpp |
diff --git a/tools/PictureRenderer.cpp b/tools/PictureRenderer.cpp |
index 0875c5ab65c31aba3ef21f1c8228d07f1b3178b2..270b61fd2832624aa146e5f116caf614d71521c3 100644 |
--- a/tools/PictureRenderer.cpp |
+++ b/tools/PictureRenderer.cpp |
@@ -24,6 +24,7 @@ |
#include "SkMatrix.h" |
#include "SkMultiPictureDraw.h" |
#include "SkOSFile.h" |
+#include "SkPaintFilterCanvas.h" |
#include "SkPicture.h" |
#include "SkPictureRecorder.h" |
#include "SkPictureUtils.h" |
@@ -87,12 +88,16 @@ void PictureRenderer::CopyString(SkString* dest, const SkString* src) { |
} |
} |
-class FlagsDrawFilter : public SkDrawFilter { |
+class FlagsFilterCanvas : public SkPaintFilterCanvas { |
public: |
- FlagsDrawFilter(PictureRenderer::DrawFilterFlags* flags) : |
- fFlags(flags) {} |
+ FlagsFilterCanvas(SkCanvas* canvas, PictureRenderer::DrawFilterFlags* flags) |
+ : INHERITED(canvas->imageInfo().width(), canvas->imageInfo().height()) |
+ , fFlags(flags) { |
+ this->addCanvas(canvas); |
+ } |
- virtual bool filter(SkPaint* paint, Type t) { |
+protected: |
+ void onFilterPaint(SkPaint* paint, Type t) const override { |
paint->setFlags(paint->getFlags() & ~fFlags[t] & SkPaint::kAllFlags); |
if (PictureRenderer::kMaskFilter_DrawFilterFlag & fFlags[t]) { |
SkMaskFilter* maskFilter = paint->getMaskFilter(); |
@@ -105,21 +110,13 @@ public: |
} else if (PictureRenderer::kSlightHinting_DrawFilterFlag & fFlags[t]) { |
paint->setHinting(SkPaint::kSlight_Hinting); |
} |
- return true; |
} |
private: |
- PictureRenderer::DrawFilterFlags* fFlags; |
-}; |
+ const PictureRenderer::DrawFilterFlags* fFlags; |
-static void setUpFilter(SkCanvas* canvas, PictureRenderer::DrawFilterFlags* drawFilters) { |
- if (drawFilters && !canvas->getDrawFilter()) { |
- canvas->setDrawFilter(SkNEW_ARGS(FlagsDrawFilter, (drawFilters)))->unref(); |
- if (drawFilters[0] & PictureRenderer::kAAClip_DrawFilterFlag) { |
- canvas->setAllowSoftClip(false); |
- } |
- } |
-} |
+ typedef SkPaintFilterCanvas INHERITED; |
+}; |
SkCanvas* PictureRenderer::setupCanvas() { |
const int width = this->getViewWidth(); |
@@ -128,12 +125,13 @@ SkCanvas* PictureRenderer::setupCanvas() { |
} |
SkCanvas* PictureRenderer::setupCanvas(int width, int height) { |
- SkCanvas* canvas; |
+ SkAutoTUnref<SkCanvas> canvas; |
+ |
switch(fDeviceType) { |
case kBitmap_DeviceType: { |
SkBitmap bitmap; |
sk_tools::setup_bitmap(&bitmap, width, height); |
- canvas = SkNEW_ARGS(SkCanvas, (bitmap)); |
+ canvas.reset(SkNEW_ARGS(SkCanvas, (bitmap))); |
} |
break; |
#if SK_SUPPORT_GPU |
@@ -165,7 +163,7 @@ SkCanvas* PictureRenderer::setupCanvas(int width, int height) { |
if (!device) { |
return NULL; |
} |
- canvas = SkNEW_ARGS(SkCanvas, (device)); |
+ canvas.reset(SkNEW_ARGS(SkCanvas, (device))); |
break; |
} |
#endif |
@@ -173,14 +171,22 @@ SkCanvas* PictureRenderer::setupCanvas(int width, int height) { |
SkASSERT(0); |
return NULL; |
} |
- setUpFilter(canvas, fDrawFilters); |
+ |
+ if (fHasDrawFilters) { |
+ if (fDrawFilters[0] & PictureRenderer::kAAClip_DrawFilterFlag) { |
+ canvas->setAllowSoftClip(false); |
+ } |
+ |
+ canvas.reset(SkNEW_ARGS(FlagsFilterCanvas, (canvas.get(), fDrawFilters))); |
+ } |
+ |
this->scaleToScaleFactor(canvas); |
// Pictures often lie about their extent (i.e., claim to be 100x100 but |
// only ever draw to 90x100). Clear here so the undrawn portion will have |
// a consistent color |
canvas->clear(SK_ColorTRANSPARENT); |
- return canvas; |
+ return canvas.detach(); |
} |
void PictureRenderer::scaleToScaleFactor(SkCanvas* canvas) { |