add draw filter option to picture_bench

Option allows adding a draw filter option per type
or for all types. All SkPaint flags may be filtered,
plus disabling blur and setting the hint level.
Review URL: https://codereview.appspot.com/6816092

git-svn-id: http://skia.googlecode.com/svn/trunk@6318 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tools/PictureRenderer.cpp b/tools/PictureRenderer.cpp
index cb68f39..59ba680 100644
--- a/tools/PictureRenderer.cpp
+++ b/tools/PictureRenderer.cpp
@@ -16,6 +16,7 @@
 #endif
 #include "SkGraphics.h"
 #include "SkImageEncoder.h"
+#include "SkMaskFilter.h"
 #include "SkMatrix.h"
 #include "SkPicture.h"
 #include "SkRTree.h"
@@ -51,25 +52,58 @@
     fCanvas.reset(this->setupCanvas());
 }
 
+class FlagsDrawFilter : public SkDrawFilter {
+public:
+    FlagsDrawFilter(PictureRenderer::DrawFilterFlags* flags) :
+        fFlags(flags) {}
+
+    virtual void filter(SkPaint* paint, Type t) {
+        paint->setFlags(paint->getFlags() & ~fFlags[t] & SkPaint::kAllFlags);
+        if (PictureRenderer::kBlur_DrawFilterFlag & fFlags[t]) {
+            SkMaskFilter* maskFilter = paint->getMaskFilter();
+            SkMaskFilter::BlurInfo blurInfo;
+            if (maskFilter && maskFilter->asABlur(&blurInfo)) {
+                paint->setMaskFilter(NULL);
+            }
+        }
+        if (PictureRenderer::kHinting_DrawFilterFlag & fFlags[t]) {
+            paint->setHinting(SkPaint::kNo_Hinting);
+        } else if (PictureRenderer::kSlightHinting_DrawFilterFlag & fFlags[t]) {
+            paint->setHinting(SkPaint::kSlight_Hinting);
+        }
+    }
+
+private:
+    PictureRenderer::DrawFilterFlags* fFlags;
+};
+
+static SkCanvas* setUpFilter(SkCanvas* canvas, PictureRenderer::DrawFilterFlags* drawFilters) {
+    if (drawFilters && !canvas->getDrawFilter()) {
+        canvas->setDrawFilter(SkNEW_ARGS(FlagsDrawFilter, (drawFilters)))->unref();
+    }
+    return canvas;
+}
+
 SkCanvas* PictureRenderer::setupCanvas() {
     return this->setupCanvas(fPicture->width(), fPicture->height());
 }
 
 SkCanvas* PictureRenderer::setupCanvas(int width, int height) {
+    SkCanvas* canvas;
     switch(fDeviceType) {
         case kBitmap_DeviceType: {
             SkBitmap bitmap;
             sk_tools::setup_bitmap(&bitmap, width, height);
-            return SkNEW_ARGS(SkCanvas, (bitmap));
-            break;
+            canvas = SkNEW_ARGS(SkCanvas, (bitmap));
+            return setUpFilter(canvas, fDrawFilters);
         }
 #if SK_SUPPORT_GPU
         case kGPU_DeviceType: {
             SkAutoTUnref<SkGpuDevice> device(SkNEW_ARGS(SkGpuDevice,
                                                     (fGrContext, SkBitmap::kARGB_8888_Config,
                                                     width, height)));
-            return SkNEW_ARGS(SkCanvas, (device.get()));
-            break;
+            canvas = SkNEW_ARGS(SkCanvas, (device.get()));
+            return setUpFilter(canvas, fDrawFilters);
         }
 #endif
         default: