Home | History | Annotate | Download | only in core
      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