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 "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 
     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