Index: src/image/SkImage.cpp |
diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp |
index b8a321cea1906549e437e3b805762e43406ccf21..6e65050a657e1d4557212d5dfd50eb186cf3fbeb 100644 |
--- a/src/image/SkImage.cpp |
+++ b/src/image/SkImage.cpp |
@@ -11,6 +11,7 @@ |
#include "SkData.h" |
#include "SkImageEncoder.h" |
#include "SkImageFilter.h" |
+#include "SkImageFilterCache.h" |
#include "SkImageGenerator.h" |
#include "SkImagePriv.h" |
#include "SkImageShader.h" |
@@ -334,40 +335,41 @@ sk_sp<SkImage> SkImage::MakeFromPicture(sk_sp<SkPicture> picture, const SkISize& |
sk_sp<SkImage> SkImage::makeWithFilter(const SkImageFilter* filter, const SkIRect& subset, |
const SkIRect& clipBounds, SkIRect* outSubset, |
SkIPoint* offset) const { |
- if (!filter || !outSubset || !offset || !this->bounds().contains(subset)) { |
- return nullptr; |
- } |
- sk_sp<SkSpecialImage> srcSpecialImage = SkSpecialImage::MakeFromImage( |
- subset, sk_ref_sp(const_cast<SkImage*>(this))); |
- if (!srcSpecialImage) { |
- return nullptr; |
- } |
- |
- // FIXME: build a cache here. |
- SkImageFilter::Context context(SkMatrix::I(), clipBounds, nullptr); |
- sk_sp<SkSpecialImage> result = |
- filter->filterImage(srcSpecialImage.get(), context, offset); |
- |
- if (!result) { |
- return nullptr; |
- } |
- |
- SkIRect fullSize = SkIRect::MakeWH(result->width(), result->height()); |
+ if (!filter || !outSubset || !offset || !this->bounds().contains(subset)) { |
+ return nullptr; |
+ } |
+ sk_sp<SkSpecialImage> srcSpecialImage = SkSpecialImage::MakeFromImage( |
+ subset, sk_ref_sp(const_cast<SkImage*>(this))); |
+ if (!srcSpecialImage) { |
+ return nullptr; |
+ } |
+ |
+ SkAutoTUnref<SkImageFilterCache> cache( |
+ SkImageFilterCache::Create(SkImageFilterCache::kDefaultTransientSize)); |
+ SkImageFilter::Context context(SkMatrix::I(), clipBounds, cache.get()); |
+ sk_sp<SkSpecialImage> result = |
+ filter->filterImage(srcSpecialImage.get(), context, offset); |
+ |
+ if (!result) { |
+ return nullptr; |
+ } |
+ |
+ SkIRect fullSize = SkIRect::MakeWH(result->width(), result->height()); |
#if SK_SUPPORT_GPU |
- if (result->isTextureBacked()) { |
- GrContext* context = result->getContext(); |
- sk_sp<GrTexture> texture = result->asTextureRef(context); |
- fullSize = SkIRect::MakeWH(texture->width(), texture->height()); |
- } |
+ if (result->isTextureBacked()) { |
+ GrContext* context = result->getContext(); |
+ sk_sp<GrTexture> texture = result->asTextureRef(context); |
+ fullSize = SkIRect::MakeWH(texture->width(), texture->height()); |
+ } |
#endif |
- *outSubset = SkIRect::MakeWH(result->width(), result->height()); |
- if (!outSubset->intersect(clipBounds.makeOffset(-offset->x(), -offset->y()))) { |
- return nullptr; |
- } |
- offset->fX += outSubset->x(); |
- offset->fY += outSubset->y(); |
- // This isn't really a "tight" subset, but includes any texture padding. |
- return result->makeTightSubset(fullSize); |
+ *outSubset = SkIRect::MakeWH(result->width(), result->height()); |
+ if (!outSubset->intersect(clipBounds.makeOffset(-offset->x(), -offset->y()))) { |
+ return nullptr; |
+ } |
+ offset->fX += outSubset->x(); |
+ offset->fY += outSubset->y(); |
+ // This isn't really a "tight" subset, but includes any texture padding. |
+ return result->makeTightSubset(fullSize); |
} |
bool SkImage::isLazyGenerated() const { |