1 /*
2  * Copyright 2017 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkColorSpaceXformer_DEFINED
9 #define SkColorSpaceXformer_DEFINED
10 
11 #include "SkCanvas.h"
12 #include "SkColor.h"
13 #include "SkRefCnt.h"
14 #include "SkTHash.h"
15 
16 class SkBitmap;
17 class SkColorFilter;
18 class SkColorSpace;
19 class SkColorSpaceXform;
20 class SkImage;
21 class SkImageFilter;
22 class SkPaint;
23 class SkShader;
24 
25 class SkColorSpaceXformer : public SkNoncopyable {
26 public:
27     static std::unique_ptr<SkColorSpaceXformer> Make(sk_sp<SkColorSpace> dst);
28 
29     ~SkColorSpaceXformer();
30 
31     sk_sp<SkImage> apply(const SkImage*);
32     sk_sp<SkImage> apply(const SkBitmap&);
33     sk_sp<SkColorFilter> apply(const SkColorFilter*);
34     sk_sp<SkImageFilter> apply(const SkImageFilter*);
35     sk_sp<SkShader>      apply(const SkShader*);
36     SkPaint apply(const SkPaint&);
37     void apply(SkColor dst[], const SkColor src[], int n);
38     SkColor apply(SkColor srgb);
39 
dst()40     sk_sp<SkColorSpace> dst() const { return fDst; }
41 
42     SkCanvas::Lattice apply(const SkCanvas::Lattice&, SkColor*, int);
43 
44 private:
45     SkColorSpaceXformer(sk_sp<SkColorSpace> dst, std::unique_ptr<SkColorSpaceXform> fromSRGB);
46 
47     template <typename T>
48     using Cache = SkTHashMap<sk_sp<T>, sk_sp<T>>;
49 
50     template <typename T>
51     sk_sp<T> cachedApply(const T*, Cache<T>*, sk_sp<T> (*)(const T*, SkColorSpaceXformer*));
52 
53     void purgeCaches();
54 
55     class AutoCachePurge;
56 
57     sk_sp<SkColorSpace>                fDst;
58     std::unique_ptr<SkColorSpaceXform> fFromSRGB;
59 
60     size_t fReentryCount; // tracks the number of nested apply() calls for cache purging.
61 
62     Cache<SkImage      > fImageCache;
63     Cache<SkColorFilter> fColorFilterCache;
64     Cache<SkImageFilter> fImageFilterCache;
65 };
66 
67 #endif
68