Index: src/core/SkDevice.cpp |
diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp |
index 34c171db9071109cb668619964b037dbee95ad21..a0dd93bff915a215d4f78347b5e6da96d2cd224d 100644 |
--- a/src/core/SkDevice.cpp |
+++ b/src/core/SkDevice.cpp |
@@ -402,6 +402,35 @@ void SkBaseDevice::drawTextOnPath(const SkDraw& draw, const void* text, size_t b |
////////////////////////////////////////////////////////////////////////////////////////// |
+bool SkBaseDevice::canCallFilterSprite(const SkMatrix* ctm, const SkPaint& paint) { |
+ if (ctm && (ctm->getType() & ~SkMatrix::kTranslate_Mask)) { |
+ return false; |
+ } |
+ const SkImageFilter* filter = paint.getImageFilter(); |
+ return filter && !this->canHandleImageFilter(filter); |
+} |
+ |
+void SkBaseDevice::filterSprite(const SkDraw& draw, const SkBitmap& bitmap, int x, int y, |
+ const SkPaint& paint) { |
+ SkImageFilter* filter = paint.getImageFilter(); |
+ SkASSERT(filter && !this->canHandleImageFilter(filter)); |
+ |
+ SkImageFilter::DeviceProxy proxy(this); |
+ SkBitmap dst; |
+ SkIPoint offset = SkIPoint::Make(0, 0); |
+ SkMatrix matrix = *draw.fMatrix; |
+ matrix.postTranslate(SkIntToScalar(-x), SkIntToScalar(-y)); |
+ const SkIRect clipBounds = bitmap.bounds(); |
+ SkAutoTUnref<SkImageFilter::Cache> cache(this->getImageFilterCache()); |
+ SkImageFilter::Context ctx(matrix, clipBounds, cache.get(), |
+ SkImageFilter::kApprox_SizeConstraint); |
+ if (filter->filterImage(&proxy, bitmap, ctx, &dst, &offset)) { |
+ SkPaint tmpUnfiltered(paint); |
+ tmpUnfiltered.setImageFilter(nullptr); |
+ this->drawSprite(draw, dst, x + offset.x(), y + offset.y(), tmpUnfiltered); |
+ } |
+} |
+ |
uint32_t SkBaseDevice::filterTextFlags(const SkPaint& paint) const { |
uint32_t flags = paint.getFlags(); |