blob: d2fd70ee8643b1fe074ecc7bdd898ed1396f961e [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 explicit SkColorSpaceXformer(sk_sp<SkColorSpace> dst);
Matt Sarettcdc651d2017-03-30 12:41:48 -040049
Florin Malita5449aad2017-07-10 11:14:40 -040050 template <typename T>
51 using Cache = SkTHashMap<sk_sp<T>, sk_sp<T>>;
52
53 template <typename T>
54 sk_sp<T> cachedApply(const T*, Cache<T>*, sk_sp<T> (*)(const T*, SkColorSpaceXformer*));
55
56 void purgeCaches();
57
58 class AutoCachePurge;
59
Mike Klein9faf9fd2018-08-09 10:04:38 -040060 sk_sp<SkColorSpace> fDst;
Mike Kleinc8579562018-08-07 13:21:21 -040061 SkSTArenaAlloc<256> fAlloc;
62 std::function<void(size_t, size_t, size_t, size_t)> fFromSRGB;
63 SkColorSpaceXformSteps fFromSRGBSteps;
64 SkJumper_MemoryCtx fFromSRGBSrc{nullptr,0};
65 SkJumper_MemoryCtx fFromSRGBDst{nullptr,0};
Florin Malita39e08552017-07-06 14:16:18 -040066
Florin Malita5449aad2017-07-10 11:14:40 -040067 size_t fReentryCount; // tracks the number of nested apply() calls for cache purging.
68
69 Cache<SkImage > fImageCache;
70 Cache<SkColorFilter> fColorFilterCache;
71 Cache<SkImageFilter> fImageFilterCache;
Matt Sarettcdc651d2017-03-30 12:41:48 -040072};
73
74#endif