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.h b/src/core/SkColorSpaceXformer.h
index f780071..75db040 100644
--- a/src/core/SkColorSpaceXformer.h
+++ b/src/core/SkColorSpaceXformer.h
@@ -8,15 +8,25 @@
#ifndef SkColorSpaceXformer_DEFINED
#define SkColorSpaceXformer_DEFINED
-#include "SkColorSpaceXform.h"
-#include "SkImage.h"
-#include "SkShader.h"
-#include "SkImageFilter.h"
+#include "SkColor.h"
+#include "SkRefCnt.h"
+#include "SkTHash.h"
+
+class SkBitmap;
+class SkColorFilter;
+class SkColorSpace;
+class SkColorSpaceXform;
+class SkImage;
+class SkImageFilter;
+class SkPaint;
+class SkShader;
class SkColorSpaceXformer : public SkNoncopyable {
public:
static std::unique_ptr<SkColorSpaceXformer> Make(sk_sp<SkColorSpace> dst);
+ ~SkColorSpaceXformer();
+
sk_sp<SkImage> apply(const SkImage*);
sk_sp<SkImage> apply(const SkBitmap&);
sk_sp<SkColorFilter> apply(const SkColorFilter*);
@@ -29,10 +39,12 @@
sk_sp<SkColorSpace> dst() const { return fDst; }
private:
- SkColorSpaceXformer() {}
+ SkColorSpaceXformer() = default;
sk_sp<SkColorSpace> fDst;
std::unique_ptr<SkColorSpaceXform> fFromSRGB;
+
+ SkTHashMap<uint32_t, sk_sp<SkImageFilter>> fFilterCache;
};
#endif