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