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