blob: 156d07af460c32cd6abd403028a63546cfc226fe [file] [log] [blame]
Matt Sarettcdc651d2017-03-30 12:41:48 -04001/*
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
Stan Iliev45fd9952017-12-18 14:46:30 -050011#include "SkCanvas.h"
Florin Malita39e08552017-07-06 14:16:18 -040012#include "SkColor.h"
Mike Kleinc8579562018-08-07 13:21:21 -040013#include "SkColorSpaceXformSteps.h"
14#include "SkRasterPipeline.h"
Florin Malita39e08552017-07-06 14:16:18 -040015#include "SkRefCnt.h"
16#include "SkTHash.h"
Mike Kleinc8579562018-08-07 13:21:21 -040017#include "../jumper/SkJumper.h"
Florin Malita39e08552017-07-06 14:16:18 -040018
19class SkBitmap;
20class SkColorFilter;
21class SkColorSpace;
22class SkColorSpaceXform;
23class SkImage;
24class SkImageFilter;
25class SkPaint;
26class SkShader;
Matt Sarettcdc651d2017-03-30 12:41:48 -040027
28class SkColorSpaceXformer : public SkNoncopyable {
29public:
30 static std::unique_ptr<SkColorSpaceXformer> Make(sk_sp<SkColorSpace> dst);
31
Florin Malita39e08552017-07-06 14:16:18 -040032 ~SkColorSpaceXformer();
33
Mike Klein2814d912017-05-10 12:35:51 -040034 sk_sp<SkImage> apply(const SkImage*);
35 sk_sp<SkImage> apply(const SkBitmap&);
36 sk_sp<SkColorFilter> apply(const SkColorFilter*);
37 sk_sp<SkImageFilter> apply(const SkImageFilter*);
38 sk_sp<SkShader> apply(const SkShader*);
39 SkPaint apply(const SkPaint&);
Matt Sarettcdc651d2017-03-30 12:41:48 -040040 void apply(SkColor dst[], const SkColor src[], int n);
Matt Sarett6d72ed92017-04-10 16:35:33 -040041 SkColor apply(SkColor srgb);
Matt Sarettcdc651d2017-03-30 12:41:48 -040042
Matt Sarette22a6a22017-04-12 16:26:21 -040043 sk_sp<SkColorSpace> dst() const { return fDst; }
44
Stan Iliev45fd9952017-12-18 14:46:30 -050045 SkCanvas::Lattice apply(const SkCanvas::Lattice&, SkColor*, int);
46
Matt Sarettcdc651d2017-03-30 12:41:48 -040047private:
Mike Kleinc8579562018-08-07 13:21:21 -040048#ifdef SK_LEGACY_COLORSPACE_XFORMER_IMPL
Florin Malita24a2ecf2017-07-06 15:12:12 -040049 SkColorSpaceXformer(sk_sp<SkColorSpace> dst, std::unique_ptr<SkColorSpaceXform> fromSRGB);
Mike Kleinc8579562018-08-07 13:21:21 -040050#else
51 explicit SkColorSpaceXformer(sk_sp<SkColorSpace> dst);
52#endif
Matt Sarettcdc651d2017-03-30 12:41:48 -040053
Florin Malita5449aad2017-07-10 11:14:40 -040054 template <typename T>
55 using Cache = SkTHashMap<sk_sp<T>, sk_sp<T>>;
56
57 template <typename T>
58 sk_sp<T> cachedApply(const T*, Cache<T>*, sk_sp<T> (*)(const T*, SkColorSpaceXformer*));
59
60 void purgeCaches();
61
62 class AutoCachePurge;
63
Matt Sarettcdc651d2017-03-30 12:41:48 -040064 sk_sp<SkColorSpace> fDst;
Mike Kleinc8579562018-08-07 13:21:21 -040065#ifdef SK_LEGACY_COLORSPACE_XFORMER_IMPL
Matt Sarettcdc651d2017-03-30 12:41:48 -040066 std::unique_ptr<SkColorSpaceXform> fFromSRGB;
Mike Kleinc8579562018-08-07 13:21:21 -040067#else
68 SkSTArenaAlloc<256> fAlloc;
69 std::function<void(size_t, size_t, size_t, size_t)> fFromSRGB;
70 SkColorSpaceXformSteps fFromSRGBSteps;
71 SkJumper_MemoryCtx fFromSRGBSrc{nullptr,0};
72 SkJumper_MemoryCtx fFromSRGBDst{nullptr,0};
73#endif
Florin Malita39e08552017-07-06 14:16:18 -040074
Florin Malita5449aad2017-07-10 11:14:40 -040075 size_t fReentryCount; // tracks the number of nested apply() calls for cache purging.
76
77 Cache<SkImage > fImageCache;
78 Cache<SkColorFilter> fColorFilterCache;
79 Cache<SkImageFilter> fImageFilterCache;
Matt Sarettcdc651d2017-03-30 12:41:48 -040080};
81
82#endif