blob: a6486776093dad0ef6de3ae5451a0136bd2a2e38 [file] [log] [blame]
msarett31d097e82016-10-11 12:15:03 -07001/*
2 * Copyright 2016 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 SkColorSpaceXform_Base_DEFINED
9#define SkColorSpaceXform_Base_DEFINED
10
11#include "SkColorSpace.h"
12#include "SkColorSpace_Base.h"
13#include "SkColorSpaceXform.h"
Matt Sarettf4898862016-10-16 10:20:41 -040014#include "SkResourceCache.h"
15
raftias94888332016-10-18 10:02:51 -070016class SkColorSpace_XYZ;
17
Matt Sarettf4898862016-10-16 10:20:41 -040018class SkColorSpaceXform_Base : public SkColorSpaceXform {
19public:
20 static constexpr int kDstGammaTableSize = 1024;
21
22protected:
23 virtual bool onApply(ColorFormat dstFormat, void* dst, ColorFormat srcFormat, const void* src,
24 int count, SkAlphaType alphaType) const = 0;
25
26private:
27 static void BuildDstGammaTables(const uint8_t* outGammaTables[3], uint8_t* gammaTableStorage,
raftias94888332016-10-18 10:02:51 -070028 const SkColorSpace_XYZ* space, bool gammasAreMatching);
Matt Sarettf4898862016-10-16 10:20:41 -040029
30 friend class SkColorSpaceXform;
raftias94888332016-10-18 10:02:51 -070031 friend class SkColorSpace_XYZ;
Matt Sarettf4898862016-10-16 10:20:41 -040032};
msarett31d097e82016-10-11 12:15:03 -070033
34enum SrcGamma {
35 kLinear_SrcGamma,
36 kTable_SrcGamma,
37};
38
39enum DstGamma {
40 kLinear_DstGamma,
41 kSRGB_DstGamma,
42 k2Dot2_DstGamma,
43 kTable_DstGamma,
44};
45
46enum ColorSpaceMatch {
47 kNone_ColorSpaceMatch,
48 kGamut_ColorSpaceMatch,
49 kFull_ColorSpaceMatch,
50};
51
52template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM>
Matt Sarettf4898862016-10-16 10:20:41 -040053class SkColorSpaceXform_XYZ : public SkColorSpaceXform_Base {
msarett31d097e82016-10-11 12:15:03 -070054protected:
55 bool onApply(ColorFormat dstFormat, void* dst, ColorFormat srcFormat, const void* src,
56 int count, SkAlphaType alphaType) const override;
57
58private:
raftias94888332016-10-18 10:02:51 -070059 SkColorSpaceXform_XYZ(SkColorSpace_XYZ* srcSpace, const SkMatrix44& srcToDst,
60 SkColorSpace_XYZ* dstSpace);
msarett31d097e82016-10-11 12:15:03 -070061
62 // Contain pointers into storage or pointers into precomputed tables.
63 const float* fSrcGammaTables[3];
Matt Sarettf4898862016-10-16 10:20:41 -040064 SkAutoTMalloc<float> fSrcStorage;
msarett31d097e82016-10-11 12:15:03 -070065 const uint8_t* fDstGammaTables[3];
Matt Sarettf4898862016-10-16 10:20:41 -040066 sk_sp<SkData> fDstStorage;
msarett31d097e82016-10-11 12:15:03 -070067
68 float fSrcToDst[16];
69
70 friend class SkColorSpaceXform;
raftias94888332016-10-18 10:02:51 -070071 friend std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(SkColorSpace_XYZ* space);
msarett31d097e82016-10-11 12:15:03 -070072};
73
74// For testing. Bypasses opts for when src and dst color spaces are equal.
raftias94888332016-10-18 10:02:51 -070075std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(SkColorSpace_XYZ* space);
msarett31d097e82016-10-11 12:15:03 -070076
77#endif