add allowImageFilter() so a device can allow/disallow filters
(esp. for printing)



git-svn-id: http://skia.googlecode.com/svn/trunk@2981 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index e9fcb57..87da90a 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -732,6 +732,16 @@
         return count;
     }
 
+    // Kill the imagefilter if our device doesn't allow it
+    SkLazyPaint lazyP;
+    if (paint && paint->getImageFilter()) {
+        if (!this->getTopDevice()->allowImageFilter(paint->getImageFilter())) {
+            SkPaint* p = lazyP.set(*paint);
+            p->setImageFilter(NULL);
+            paint = p;
+        }
+    }
+
     bool isOpaque;
     SkBitmap::Config config = resolve_config(this, ir, flags, &isOpaque);
 
@@ -889,7 +899,7 @@
     return fDevice->filterImage(filter, src, ctm, result, offset);
 }
 
-void SkCanvas::drawDevice(SkDevice* device, int x, int y,
+void SkCanvas::drawDevice(SkDevice* srcDev, int x, int y,
                           const SkPaint* paint) {
     SkPaint tmp;
     if (NULL == paint) {
@@ -899,20 +909,21 @@
 
     LOOPER_BEGIN(*paint, SkDrawFilter::kBitmap_Type)
     while (iter.next()) {
+        SkDevice* dstDev = iter.fDevice;
         paint = &looper.paint();
         SkImageFilter* filter = paint->getImageFilter();
         SkIPoint pos = { x - iter.getX(), y - iter.getY() };
         if (filter) {
-            DeviceImageFilterProxy proxy(device);
+            DeviceImageFilterProxy proxy(dstDev);
             SkBitmap dst;
-            const SkBitmap& src = device->accessBitmap(false);
+            const SkBitmap& src = srcDev->accessBitmap(false);
             if (filter->filterImage(&proxy, src, *iter.fMatrix, &dst, &pos)) {
                 SkPaint tmp(*paint);
                 tmp.setImageFilter(NULL);
-                iter.fDevice->drawSprite(iter, dst, pos.x(), pos.y(), tmp);
+                dstDev->drawSprite(iter, dst, pos.x(), pos.y(), tmp);
             }
         } else {
-            iter.fDevice->drawDevice(iter, device, pos.x(), pos.y(), *paint);
+            dstDev->drawDevice(iter, srcDev, pos.x(), pos.y(), *paint);
         }
     }
     LOOPER_END