OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkColorSpace.h" | 8 #include "SkColorSpace.h" |
9 #include "SkColorSpacePriv.h" | 9 #include "SkColorSpacePriv.h" |
10 #include "SkOnce.h" | 10 #include "SkOnce.h" |
11 | 11 |
12 static bool color_space_almost_equal(float a, float b) { | 12 static bool color_space_almost_equal(float a, float b) { |
13 return SkTAbs(a - b) < 0.01f; | 13 return SkTAbs(a - b) < 0.01f; |
14 } | 14 } |
15 | 15 |
16 ////////////////////////////////////////////////////////////////////////////////
////////////////// | 16 ////////////////////////////////////////////////////////////////////////////////
////////////////// |
17 | 17 |
18 SkColorSpace::SkColorSpace(sk_sp<SkGammas> gammas, const SkMatrix44& toXYZD50, N
amed named) | 18 SkColorSpace::SkColorSpace(sk_sp<SkGammas> gammas, const SkMatrix44& toXYZD50, N
amed named) |
19 : fGammas(gammas) | 19 : fGammas(gammas) |
| 20 , fGammaNamed(kNonStandard_GammaNamed) |
20 , fToXYZD50(toXYZD50) | 21 , fToXYZD50(toXYZD50) |
21 , fNamed(named) | 22 , fNamed(named) |
22 {} | 23 {} |
| 24 |
| 25 SkColorSpace::SkColorSpace(sk_sp<SkGammas> gammas, GammaNamed gammaNamed, |
| 26 const SkMatrix44& toXYZD50, Named named) |
| 27 : fGammas(gammas) |
| 28 , fGammaNamed(gammaNamed) |
| 29 , fToXYZD50(toXYZD50) |
| 30 , fNamed(named) |
| 31 {} |
23 | 32 |
24 SkColorSpace::SkColorSpace(SkColorLookUpTable* colorLUT, sk_sp<SkGammas> gammas, | 33 SkColorSpace::SkColorSpace(SkColorLookUpTable* colorLUT, sk_sp<SkGammas> gammas, |
25 const SkMatrix44& toXYZD50) | 34 const SkMatrix44& toXYZD50) |
26 : fColorLUT(colorLUT) | 35 : fColorLUT(colorLUT) |
27 , fGammas(gammas) | 36 , fGammas(gammas) |
| 37 , fGammaNamed(kNonStandard_GammaNamed) |
28 , fToXYZD50(toXYZD50) | 38 , fToXYZD50(toXYZD50) |
29 , fNamed(kUnknown_Named) | 39 , fNamed(kUnknown_Named) |
30 {} | 40 {} |
31 | 41 |
32 const float gSRGB_toXYZD50[] { | 42 const float gSRGB_toXYZD50[] { |
33 0.4358f, 0.2224f, 0.0139f, // * R | 43 0.4358f, 0.2224f, 0.0139f, // * R |
34 0.3853f, 0.7170f, 0.0971f, // * G | 44 0.3853f, 0.7170f, 0.0971f, // * G |
35 0.1430f, 0.0606f, 0.7139f, // * B | 45 0.1430f, 0.0606f, 0.7139f, // * B |
36 }; | 46 }; |
37 | 47 |
(...skipping 21 matching lines...) Expand all Loading... |
59 color_space_almost_equal(toXYZD50.getFloat(2, 2), standard[8]) && | 69 color_space_almost_equal(toXYZD50.getFloat(2, 2), standard[8]) && |
60 color_space_almost_equal(toXYZD50.getFloat(0, 3), 0.0f) && | 70 color_space_almost_equal(toXYZD50.getFloat(0, 3), 0.0f) && |
61 color_space_almost_equal(toXYZD50.getFloat(1, 3), 0.0f) && | 71 color_space_almost_equal(toXYZD50.getFloat(1, 3), 0.0f) && |
62 color_space_almost_equal(toXYZD50.getFloat(2, 3), 0.0f) && | 72 color_space_almost_equal(toXYZD50.getFloat(2, 3), 0.0f) && |
63 color_space_almost_equal(toXYZD50.getFloat(3, 0), 0.0f) && | 73 color_space_almost_equal(toXYZD50.getFloat(3, 0), 0.0f) && |
64 color_space_almost_equal(toXYZD50.getFloat(3, 1), 0.0f) && | 74 color_space_almost_equal(toXYZD50.getFloat(3, 1), 0.0f) && |
65 color_space_almost_equal(toXYZD50.getFloat(3, 2), 0.0f) && | 75 color_space_almost_equal(toXYZD50.getFloat(3, 2), 0.0f) && |
66 color_space_almost_equal(toXYZD50.getFloat(3, 3), 1.0f); | 76 color_space_almost_equal(toXYZD50.getFloat(3, 3), 1.0f); |
67 } | 77 } |
68 | 78 |
69 static SkOnce gStandardGammasOnce; | 79 static SkOnce gSRGBCurveGammasOnce; |
70 static SkGammas* gStandardGammas; | 80 static SkGammas* gSRGBCurveGammas; |
| 81 static SkOnce gLinearGammasOnce; |
| 82 static SkGammas* gLinearGammas; |
71 | 83 |
72 sk_sp<SkColorSpace> SkColorSpace::NewRGB(float gammaVals[3], const SkMatrix44& t
oXYZD50) { | 84 sk_sp<SkColorSpace> SkColorSpace::NewRGB(float gammaVals[3], const SkMatrix44& t
oXYZD50) { |
73 sk_sp<SkGammas> gammas = nullptr; | 85 sk_sp<SkGammas> gammas = nullptr; |
| 86 GammaNamed gammaNamed = kNonStandard_GammaNamed; |
74 | 87 |
75 // Check if we really have sRGB or Adobe RGB | 88 // Check if we really have sRGB or Adobe RGB |
76 if (color_space_almost_equal(2.2f, gammaVals[0]) && | 89 if (color_space_almost_equal(2.2f, gammaVals[0]) && |
77 color_space_almost_equal(2.2f, gammaVals[1]) && | 90 color_space_almost_equal(2.2f, gammaVals[1]) && |
78 color_space_almost_equal(2.2f, gammaVals[2])) | 91 color_space_almost_equal(2.2f, gammaVals[2])) |
79 { | 92 { |
80 gStandardGammasOnce([] { | 93 gSRGBCurveGammasOnce([] { |
81 gStandardGammas = new SkGammas(2.2f, 2.2f, 2.2f); | 94 gSRGBCurveGammas = new SkGammas(2.2f, 2.2f, 2.2f); |
82 }); | 95 }); |
83 gammas = sk_ref_sp(gStandardGammas); | 96 gammas = sk_ref_sp(gSRGBCurveGammas); |
| 97 gammaNamed = kSRGBCurve_GammaNamed; |
84 | 98 |
85 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { | 99 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { |
86 return SkColorSpace::NewNamed(kSRGB_Named); | 100 return SkColorSpace::NewNamed(kSRGB_Named); |
87 } else if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { | 101 } else if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { |
88 return SkColorSpace::NewNamed(kAdobeRGB_Named); | 102 return SkColorSpace::NewNamed(kAdobeRGB_Named); |
89 } | 103 } |
| 104 } else if (color_space_almost_equal(1.0f, gammaVals[0]) && |
| 105 color_space_almost_equal(1.0f, gammaVals[1]) && |
| 106 color_space_almost_equal(1.0f, gammaVals[2])) |
| 107 { |
| 108 gLinearGammasOnce([] { |
| 109 gLinearGammas = new SkGammas(1.0f, 1.0f, 1.0f); |
| 110 }); |
| 111 gammas = sk_ref_sp(gLinearGammas); |
| 112 gammaNamed = kLinear_GammaNamed; |
90 } | 113 } |
91 | 114 |
92 if (!gammas) { | 115 if (!gammas) { |
93 gammas = sk_sp<SkGammas>(new SkGammas(gammaVals[0], gammaVals[1], gammaV
als[2])); | 116 gammas = sk_sp<SkGammas>(new SkGammas(gammaVals[0], gammaVals[1], gammaV
als[2])); |
94 } | 117 } |
95 return sk_sp<SkColorSpace>(new SkColorSpace(gammas, toXYZD50, kUnknown_Named
)); | 118 return sk_sp<SkColorSpace>(new SkColorSpace(gammas, gammaNamed, toXYZD50, kU
nknown_Named)); |
96 } | 119 } |
97 | 120 |
98 sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { | 121 sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { |
99 static SkOnce sRGBOnce; | 122 static SkOnce sRGBOnce; |
100 static SkColorSpace* sRGB; | 123 static SkColorSpace* sRGB; |
101 static SkOnce adobeRGBOnce; | 124 static SkOnce adobeRGBOnce; |
102 static SkColorSpace* adobeRGB; | 125 static SkColorSpace* adobeRGB; |
103 | 126 |
104 switch (named) { | 127 switch (named) { |
105 case kSRGB_Named: { | 128 case kSRGB_Named: { |
106 gStandardGammasOnce([] { | 129 gSRGBCurveGammasOnce([] { |
107 gStandardGammas = new SkGammas(2.2f, 2.2f, 2.2f); | 130 gSRGBCurveGammas = new SkGammas(2.2f, 2.2f, 2.2f); |
108 }); | 131 }); |
109 | 132 |
110 sRGBOnce([] { | 133 sRGBOnce([] { |
111 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); | 134 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); |
112 srgbToxyzD50.set3x3ColMajorf(gSRGB_toXYZD50); | 135 srgbToxyzD50.set3x3ColMajorf(gSRGB_toXYZD50); |
113 sRGB = new SkColorSpace(sk_ref_sp(gStandardGammas), srgbToxyzD50
, kSRGB_Named); | 136 sRGB = new SkColorSpace(sk_ref_sp(gSRGBCurveGammas), kSRGBCurve_
GammaNamed, |
| 137 srgbToxyzD50, kSRGB_Named); |
114 }); | 138 }); |
115 return sk_ref_sp(sRGB); | 139 return sk_ref_sp(sRGB); |
116 } | 140 } |
117 case kAdobeRGB_Named: { | 141 case kAdobeRGB_Named: { |
118 gStandardGammasOnce([] { | 142 // Note that AdobeRGB has a very similar gamma curve to sRGB. |
119 gStandardGammas = new SkGammas(2.2f, 2.2f, 2.2f); | 143 gSRGBCurveGammasOnce([] { |
| 144 gSRGBCurveGammas = new SkGammas(2.2f, 2.2f, 2.2f); |
120 }); | 145 }); |
121 | 146 |
122 adobeRGBOnce([] { | 147 adobeRGBOnce([] { |
123 SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Construct
or); | 148 SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Construct
or); |
124 adobergbToxyzD50.set3x3ColMajorf(gAdobeRGB_toXYZD50); | 149 adobergbToxyzD50.set3x3ColMajorf(gAdobeRGB_toXYZD50); |
125 adobeRGB = new SkColorSpace(sk_ref_sp(gStandardGammas), adobergb
ToxyzD50, | 150 adobeRGB = new SkColorSpace(sk_ref_sp(gSRGBCurveGammas), kSRGBCu
rve_GammaNamed, |
126 kAdobeRGB_Named); | 151 adobergbToxyzD50, kAdobeRGB_Named); |
127 }); | 152 }); |
128 return sk_ref_sp(adobeRGB); | 153 return sk_ref_sp(adobeRGB); |
129 } | 154 } |
130 default: | 155 default: |
131 break; | 156 break; |
132 } | 157 } |
133 return nullptr; | 158 return nullptr; |
134 } | 159 } |
135 | 160 |
136 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 161 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
737 } | 762 } |
738 } | 763 } |
739 | 764 |
740 } | 765 } |
741 default: | 766 default: |
742 break; | 767 break; |
743 } | 768 } |
744 | 769 |
745 return_null("ICC profile contains unsupported colorspace"); | 770 return_null("ICC profile contains unsupported colorspace"); |
746 } | 771 } |
OLD | NEW |