/* * Copyright 2017 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkColorSpaceXformer_DEFINED #define SkColorSpaceXformer_DEFINED #include "SkCanvas.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 Make(sk_sp dst); ~SkColorSpaceXformer(); sk_sp apply(const SkImage*); sk_sp apply(const SkBitmap&); sk_sp apply(const SkColorFilter*); sk_sp apply(const SkImageFilter*); sk_sp apply(const SkShader*); SkPaint apply(const SkPaint&); void apply(SkColor dst[], const SkColor src[], int n); SkColor apply(SkColor srgb); sk_sp dst() const { return fDst; } SkCanvas::Lattice apply(const SkCanvas::Lattice&, SkColor*, int); private: SkColorSpaceXformer(sk_sp dst, std::unique_ptr fromSRGB); template using Cache = SkTHashMap, sk_sp>; template sk_sp cachedApply(const T*, Cache*, sk_sp (*)(const T*, SkColorSpaceXformer*)); void purgeCaches(); class AutoCachePurge; sk_sp fDst; std::unique_ptr fFromSRGB; size_t fReentryCount; // tracks the number of nested apply() calls for cache purging. Cache fImageCache; Cache fColorFilterCache; Cache fImageFilterCache; }; #endif