Add an SkColorSpaceXformer image filter cache
The cache is scoped with the SkColorSpaceXformer object.
This ensures we're not transforming nodes with a degree > 1 multiple
times, and preserves the DAG topology.
Change-Id: I0b072cdac95f9f1c34e0565ed4f258aba986e1ae
Reviewed-on: https://skia-review.googlesource.com/21726
Commit-Queue: Florin Malita <fmalita@chromium.org>
Reviewed-by: Mike Reed <reed@google.com>
diff --git a/src/core/SkColorSpaceXformer.cpp b/src/core/SkColorSpaceXformer.cpp
index 1e5206e..301a7f1 100644
--- a/src/core/SkColorSpaceXformer.cpp
+++ b/src/core/SkColorSpaceXformer.cpp
@@ -10,12 +10,15 @@
#include "SkColorSpaceXform_Base.h"
#include "SkDrawLooper.h"
#include "SkGradientShader.h"
+#include "SkImage.h"
#include "SkImage_Base.h"
#include "SkImageFilter.h"
#include "SkImagePriv.h"
#include "SkMakeUnique.h"
#include "SkShaderBase.h"
+SkColorSpaceXformer::~SkColorSpaceXformer() {}
+
std::unique_ptr<SkColorSpaceXformer> SkColorSpaceXformer::Make(sk_sp<SkColorSpace> dst) {
std::unique_ptr<SkColorSpaceXform> fromSRGB = SkColorSpaceXform_Base::New(
SkColorSpace::MakeSRGB().get(), dst.get(), SkTransferFunctionBehavior::kIgnore);
@@ -50,7 +53,18 @@
}
sk_sp<SkImageFilter> SkColorSpaceXformer::apply(const SkImageFilter* imageFilter) {
- return imageFilter ? imageFilter->makeColorSpace(this) : nullptr;
+ if (!imageFilter) {
+ return nullptr;
+ }
+
+ if (auto* xformedFilter = fFilterCache.find(imageFilter->fUniqueID)) {
+ return sk_ref_sp(xformedFilter->get());
+ }
+
+ auto xformedFilter = imageFilter->makeColorSpace(this);
+ fFilterCache.set(imageFilter->fUniqueID, xformedFilter);
+
+ return xformedFilter;
}
sk_sp<SkShader> SkColorSpaceXformer::apply(const SkShader* shader) {