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 "SkColor.h" 12 #include "SkRefCnt.h" 13 #include "SkTHash.h" 14 15 class SkBitmap; 16 class SkColorFilter; 17 class SkColorSpace; 18 class SkColorSpaceXform; 19 class SkImage; 20 class SkImageFilter; 21 class SkPaint; 22 class SkShader; 23 24 class SkColorSpaceXformer : public SkNoncopyable { 25 public: 26 static std::unique_ptr<SkColorSpaceXformer> Make(sk_sp<SkColorSpace> dst); 27 28 ~SkColorSpaceXformer(); 29 30 sk_sp<SkImage> apply(const SkImage*); 31 sk_sp<SkImage> apply(const SkBitmap&); 32 sk_sp<SkColorFilter> apply(const SkColorFilter*); 33 sk_sp<SkImageFilter> apply(const SkImageFilter*); 34 sk_sp<SkShader> apply(const SkShader*); 35 SkPaint apply(const SkPaint&); 36 void apply(SkColor dst[], const SkColor src[], int n); 37 SkColor apply(SkColor srgb); 38 39 sk_sp<SkColorSpace> dst() const { return fDst; } 40 41 private: 42 SkColorSpaceXformer(sk_sp<SkColorSpace> dst, std::unique_ptr<SkColorSpaceXform> fromSRGB); 43 44 template <typename T> 45 using Cache = SkTHashMap<sk_sp<T>, sk_sp<T>>; 46 47 template <typename T> 48 sk_sp<T> cachedApply(const T*, Cache<T>*, sk_sp<T> (*)(const T*, SkColorSpaceXformer*)); 49 50 void purgeCaches(); 51 52 class AutoCachePurge; 53 54 sk_sp<SkColorSpace> fDst; 55 std::unique_ptr<SkColorSpaceXform> fFromSRGB; 56 57 size_t fReentryCount; // tracks the number of nested apply() calls for cache purging. 58 59 Cache<SkImage > fImageCache; 60 Cache<SkColorFilter> fColorFilterCache; 61 Cache<SkImageFilter> fImageFilterCache; 62 }; 63 64 #endif 65