Chromium Code Reviews| Index: src/image/SkImage.cpp |
| diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp |
| index b8a321cea1906549e437e3b805762e43406ccf21..b92ba0daf63cc947edb2a3b15bace09b35d5254f 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; |
| + } |
| + |
|
robertphillips
2016/09/21 15:05:26
Is there no way we can just have one kDefaultImage
Brian Osman
2016/09/21 15:39:21
Done.
|
| + static const size_t kCacheSize = 32 * 1024 * 1024; |
| + SkAutoTUnref<SkImageFilterCache> cache(SkImageFilterCache::Create(kCacheSize)); |
| + 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 { |