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 "SkColorSpace_Base.h" | 9 #include "SkColorSpace_Base.h" |
10 #include "SkColorSpace_A2B0.h" | |
11 #include "SkColorSpace_XYZTRC.h" | |
10 #include "SkColorSpacePriv.h" | 12 #include "SkColorSpacePriv.h" |
11 #include "SkOnce.h" | 13 #include "SkOnce.h" |
12 | 14 |
13 SkColorSpace_Base::SkColorSpace_Base(SkGammaNamed gammaNamed, const SkMatrix44& toXYZD50) | 15 SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkData> profileData) |
14 : fGammaNamed(gammaNamed) | 16 : fProfileData(std::move(profileData)) |
15 , fGammas(nullptr) | |
16 , fProfileData(nullptr) | |
17 , fToXYZD50(toXYZD50) | |
18 , fFromXYZD50(SkMatrix44::kUninitialized_Constructor) | |
19 {} | |
20 | |
21 SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkColorLookUpTable> colorLUT, SkGamma Named gammaNamed, | |
22 sk_sp<SkGammas> gammas, const SkMatrix44& t oXYZD50, | |
23 sk_sp<SkData> profileData) | |
24 : fColorLUT(std::move(colorLUT)) | |
25 , fGammaNamed(gammaNamed) | |
26 , fGammas(std::move(gammas)) | |
27 , fProfileData(std::move(profileData)) | |
28 , fToXYZD50(toXYZD50) | |
29 , fFromXYZD50(SkMatrix44::kUninitialized_Constructor) | |
30 {} | 17 {} |
31 | 18 |
32 static constexpr float gSRGB_toXYZD50[] { | 19 static constexpr float gSRGB_toXYZD50[] { |
33 0.4358f, 0.3853f, 0.1430f, // Rx, Gx, Bx | 20 0.4358f, 0.3853f, 0.1430f, // Rx, Gx, Bx |
34 0.2224f, 0.7170f, 0.0606f, // Ry, Gy, Gz | 21 0.2224f, 0.7170f, 0.0606f, // Ry, Gy, Gz |
35 0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz | 22 0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz |
36 }; | 23 }; |
37 | 24 |
38 static constexpr float gAdobeRGB_toXYZD50[] { | 25 static constexpr float gAdobeRGB_toXYZD50[] { |
39 0.6098f, 0.2052f, 0.1492f, // Rx, Gx, Bx | 26 0.6098f, 0.2052f, 0.1492f, // Rx, Gx, Bx |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
83 } | 70 } |
84 | 71 |
85 if (kNonStandard_SkGammaNamed == gammaNamed) { | 72 if (kNonStandard_SkGammaNamed == gammaNamed) { |
86 sk_sp<SkGammas> gammas = sk_sp<SkGammas>(new SkGammas()); | 73 sk_sp<SkGammas> gammas = sk_sp<SkGammas>(new SkGammas()); |
87 gammas->fRedType = SkGammas::Type::kValue_Type; | 74 gammas->fRedType = SkGammas::Type::kValue_Type; |
88 gammas->fGreenType = SkGammas::Type::kValue_Type; | 75 gammas->fGreenType = SkGammas::Type::kValue_Type; |
89 gammas->fBlueType = SkGammas::Type::kValue_Type; | 76 gammas->fBlueType = SkGammas::Type::kValue_Type; |
90 gammas->fRedData.fValue = values[0]; | 77 gammas->fRedData.fValue = values[0]; |
91 gammas->fGreenData.fValue = values[1]; | 78 gammas->fGreenData.fValue = values[1]; |
92 gammas->fBlueData.fValue = values[2]; | 79 gammas->fBlueData.fValue = values[2]; |
93 return sk_sp<SkColorSpace>(new SkColorSpace_Base(nullptr, kNonStandard_S kGammaNamed, gammas, | 80 return sk_sp<SkColorSpace>(new SkColorSpace_XYZTRC(kNonStandard_SkGammaN amed, |
94 toXYZD50, nullptr)); | 81 gammas, toXYZD50, nul lptr)); |
95 } | 82 } |
96 | 83 |
97 return SkColorSpace_Base::NewRGB(gammaNamed, toXYZD50); | 84 return SkColorSpace_Base::NewRGB(gammaNamed, toXYZD50); |
98 } | 85 } |
99 | 86 |
100 sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(SkGammaNamed gammaNamed, const SkM atrix44& toXYZD50) { | 87 sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(SkGammaNamed gammaNamed, const SkM atrix44& toXYZD50) { |
101 switch (gammaNamed) { | 88 switch (gammaNamed) { |
102 case kSRGB_SkGammaNamed: | 89 case kSRGB_SkGammaNamed: |
103 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { | 90 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { |
104 return SkColorSpace::NewNamed(kSRGB_Named); | 91 return SkColorSpace::NewNamed(kSRGB_Named); |
105 } | 92 } |
106 break; | 93 break; |
107 case k2Dot2Curve_SkGammaNamed: | 94 case k2Dot2Curve_SkGammaNamed: |
108 if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { | 95 if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { |
109 return SkColorSpace::NewNamed(kAdobeRGB_Named); | 96 return SkColorSpace::NewNamed(kAdobeRGB_Named); |
110 } | 97 } |
111 break; | 98 break; |
112 case kLinear_SkGammaNamed: | 99 case kLinear_SkGammaNamed: |
113 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { | 100 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { |
114 return SkColorSpace::NewNamed(kSRGBLinear_Named); | 101 return SkColorSpace::NewNamed(kSRGBLinear_Named); |
115 } | 102 } |
116 break; | 103 break; |
117 case kNonStandard_SkGammaNamed: | 104 case kNonStandard_SkGammaNamed: |
118 // This is not allowed. | 105 // This is not allowed. |
119 return nullptr; | 106 return nullptr; |
120 default: | 107 default: |
121 break; | 108 break; |
122 } | 109 } |
123 | 110 |
124 return sk_sp<SkColorSpace>(new SkColorSpace_Base(gammaNamed, toXYZD50)); | 111 return sk_sp<SkColorSpace>(new SkColorSpace_XYZTRC(gammaNamed, toXYZD50)); |
125 } | 112 } |
126 | 113 |
127 sk_sp<SkColorSpace> SkColorSpace::NewRGB(RenderTargetGamma gamma, const SkMatrix 44& toXYZD50) { | 114 sk_sp<SkColorSpace> SkColorSpace::NewRGB(RenderTargetGamma gamma, const SkMatrix 44& toXYZD50) { |
128 switch (gamma) { | 115 switch (gamma) { |
129 case kLinear_RenderTargetGamma: | 116 case kLinear_RenderTargetGamma: |
130 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, toXYZD50); | 117 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, toXYZD50); |
131 case kSRGB_RenderTargetGamma: | 118 case kSRGB_RenderTargetGamma: |
132 return SkColorSpace_Base::NewRGB(kSRGB_SkGammaNamed, toXYZD50); | 119 return SkColorSpace_Base::NewRGB(kSRGB_SkGammaNamed, toXYZD50); |
133 default: | 120 default: |
134 return nullptr; | 121 return nullptr; |
(...skipping 10 matching lines...) Expand all Loading... | |
145 static SkOnce sRGBLinearOnce; | 132 static SkOnce sRGBLinearOnce; |
146 | 133 |
147 switch (named) { | 134 switch (named) { |
148 case kSRGB_Named: { | 135 case kSRGB_Named: { |
149 sRGBOnce([] { | 136 sRGBOnce([] { |
150 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); | 137 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); |
151 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); | 138 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); |
152 | 139 |
153 // Force the mutable type mask to be computed. This avoids race s. | 140 // Force the mutable type mask to be computed. This avoids race s. |
154 (void)srgbToxyzD50.getType(); | 141 (void)srgbToxyzD50.getType(); |
155 gSRGB = new SkColorSpace_Base(kSRGB_SkGammaNamed, srgbToxyzD50); | 142 gSRGB = new SkColorSpace_XYZTRC(kSRGB_SkGammaNamed, srgbToxyzD50 ); |
156 }); | 143 }); |
157 return sk_ref_sp<SkColorSpace>(gSRGB); | 144 return sk_ref_sp<SkColorSpace>(gSRGB); |
158 } | 145 } |
159 case kAdobeRGB_Named: { | 146 case kAdobeRGB_Named: { |
160 adobeRGBOnce([] { | 147 adobeRGBOnce([] { |
161 SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Construct or); | 148 SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Construct or); |
162 adobergbToxyzD50.set3x3RowMajorf(gAdobeRGB_toXYZD50); | 149 adobergbToxyzD50.set3x3RowMajorf(gAdobeRGB_toXYZD50); |
163 | 150 |
164 // Force the mutable type mask to be computed. This avoids race s. | 151 // Force the mutable type mask to be computed. This avoids race s. |
165 (void)adobergbToxyzD50.getType(); | 152 (void)adobergbToxyzD50.getType(); |
166 gAdobeRGB = new SkColorSpace_Base(k2Dot2Curve_SkGammaNamed, adob ergbToxyzD50); | 153 gAdobeRGB = new SkColorSpace_XYZTRC(k2Dot2Curve_SkGammaNamed, ad obergbToxyzD50); |
167 }); | 154 }); |
168 return sk_ref_sp<SkColorSpace>(gAdobeRGB); | 155 return sk_ref_sp<SkColorSpace>(gAdobeRGB); |
169 } | 156 } |
170 case kSRGBLinear_Named: { | 157 case kSRGBLinear_Named: { |
171 sRGBLinearOnce([] { | 158 sRGBLinearOnce([] { |
172 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); | 159 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); |
173 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); | 160 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); |
174 | 161 |
175 // Force the mutable type mask to be computed. This avoids race s. | 162 // Force the mutable type mask to be computed. This avoids race s. |
176 (void)srgbToxyzD50.getType(); | 163 (void)srgbToxyzD50.getType(); |
177 gSRGBLinear = new SkColorSpace_Base(kLinear_SkGammaNamed, srgbTo xyzD50); | 164 gSRGBLinear = new SkColorSpace_XYZTRC(kLinear_SkGammaNamed, srgb ToxyzD50); |
178 }); | 165 }); |
179 return sk_ref_sp<SkColorSpace>(gSRGBLinear); | 166 return sk_ref_sp<SkColorSpace>(gSRGBLinear); |
180 } | 167 } |
181 default: | 168 default: |
182 break; | 169 break; |
183 } | 170 } |
184 return nullptr; | 171 return nullptr; |
185 } | 172 } |
186 | 173 |
187 sk_sp<SkColorSpace> SkColorSpace::makeLinearGamma() { | 174 sk_sp<SkColorSpace> SkColorSpace::makeLinearGamma() { |
188 if (this->gammaIsLinear()) { | 175 return as_CSB(this)->makeLinearGammaImpl(); |
189 return sk_ref_sp(this); | |
190 } | |
191 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, as_CSB(this)->fToXYZD 50); | |
192 } | 176 } |
193 | 177 |
194 //////////////////////////////////////////////////////////////////////////////// /////////////////// | 178 //////////////////////////////////////////////////////////////////////////////// /////////////////// |
195 | 179 |
196 bool SkColorSpace::gammaCloseToSRGB() const { | 180 bool SkColorSpace::gammaCloseToSRGB() const { |
197 return kSRGB_SkGammaNamed == as_CSB(this)->fGammaNamed || | 181 return as_CSB(this)->gammaCloseToSRGBImpl(); |
198 k2Dot2Curve_SkGammaNamed == as_CSB(this)->fGammaNamed; | |
199 } | 182 } |
200 | 183 |
201 bool SkColorSpace::gammaIsLinear() const { | 184 bool SkColorSpace::gammaIsLinear() const { |
202 return kLinear_SkGammaNamed == as_CSB(this)->fGammaNamed; | 185 return as_CSB(this)->gammaIsLinearImpl(); |
203 } | |
204 | |
205 const SkMatrix44& SkColorSpace_Base::fromXYZD50() const { | |
206 fFromXYZOnce([this] { | |
207 if (!fToXYZD50.invert(&fFromXYZD50)) { | |
208 // If a client gives us a dst gamut with a transform that we can't i nvert, we will | |
209 // simply give them back a transform to sRGB gamut. | |
210 SkDEBUGFAIL("Non-invertible XYZ matrix, defaulting to sRGB"); | |
211 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); | |
212 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); | |
213 srgbToxyzD50.invert(&fFromXYZD50); | |
214 } | |
215 }); | |
216 return fFromXYZD50; | |
217 } | 186 } |
218 | 187 |
219 //////////////////////////////////////////////////////////////////////////////// /////////////////// | 188 //////////////////////////////////////////////////////////////////////////////// /////////////////// |
220 | 189 |
221 enum Version { | 190 enum Version { |
222 k0_Version, // Initial version, header + flags for matrix and profile | 191 k0_Version, // Initial version, header + flags for matrix and profile |
223 }; | 192 }; |
224 | 193 |
225 struct ColorSpaceHeader { | 194 struct ColorSpaceHeader { |
226 /** | 195 /** |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
266 uint8_t fVersion; // Always zero | 235 uint8_t fVersion; // Always zero |
267 uint8_t fNamed; // Must be a SkColorSpace::Named | 236 uint8_t fNamed; // Must be a SkColorSpace::Named |
268 uint8_t fGammaNamed; // Must be a SkGammaNamed | 237 uint8_t fGammaNamed; // Must be a SkGammaNamed |
269 uint8_t fFlags; // Some combination of the flags listed above | 238 uint8_t fFlags; // Some combination of the flags listed above |
270 }; | 239 }; |
271 | 240 |
272 size_t SkColorSpace::writeToMemory(void* memory) const { | 241 size_t SkColorSpace::writeToMemory(void* memory) const { |
273 // Start by trying the serialization fast path. If we haven't saved ICC pro file data, | 242 // Start by trying the serialization fast path. If we haven't saved ICC pro file data, |
274 // we must have a profile that we can serialize easily. | 243 // we must have a profile that we can serialize easily. |
275 if (!as_CSB(this)->fProfileData) { | 244 if (!as_CSB(this)->fProfileData) { |
245 // Profile data is mandatory for A2B0 color spaces. | |
276 // If we have a named profile, only write the enum. | 246 // If we have a named profile, only write the enum. |
msarett
2016/10/11 13:40:30
Please move this comment down to just above the "i
| |
247 SkASSERT(as_CSB(this)->type() == SkColorSpace_Base::Type::kXYZTRC); | |
248 const SkColorSpace_XYZTRC* thisXYZ = static_cast<const SkColorSpace_XYZT RC*>(this); | |
249 const SkGammaNamed gammaNamed = thisXYZ->gammaNamed(); | |
277 if (this == gSRGB) { | 250 if (this == gSRGB) { |
278 if (memory) { | 251 if (memory) { |
279 *((ColorSpaceHeader*) memory) = | 252 *((ColorSpaceHeader*) memory) = |
280 ColorSpaceHeader::Pack(k0_Version, kSRGB_Named, | 253 ColorSpaceHeader::Pack(k0_Version, kSRGB_Named, gammaNam ed, 0); |
281 as_CSB(this)->fGammaNamed, 0); | |
282 } | 254 } |
283 return sizeof(ColorSpaceHeader); | 255 return sizeof(ColorSpaceHeader); |
284 } else if (this == gAdobeRGB) { | 256 } else if (this == gAdobeRGB) { |
285 if (memory) { | 257 if (memory) { |
286 *((ColorSpaceHeader*) memory) = | 258 *((ColorSpaceHeader*) memory) = |
287 ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named, | 259 ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named, gamm aNamed, 0); |
288 as_CSB(this)->fGammaNamed, 0); | |
289 } | 260 } |
290 return sizeof(ColorSpaceHeader); | 261 return sizeof(ColorSpaceHeader); |
291 } else if (this == gSRGBLinear) { | 262 } else if (this == gSRGBLinear) { |
292 if (memory) { | 263 if (memory) { |
293 *((ColorSpaceHeader*)memory) = | 264 *((ColorSpaceHeader*)memory) = |
294 ColorSpaceHeader::Pack(k0_Version, kSRGBLinear_Named, | 265 ColorSpaceHeader::Pack(k0_Version, kSRGBLinear_Named, ga mmaNamed, 0); |
295 as_CSB(this)->fGammaNamed, 0); | |
296 } | 266 } |
297 return sizeof(ColorSpaceHeader); | 267 return sizeof(ColorSpaceHeader); |
298 } | 268 } |
299 | 269 |
300 // If we have a named gamma, write the enum and the matrix. | 270 // If we have a named gamma, write the enum and the matrix. |
301 switch (as_CSB(this)->fGammaNamed) { | 271 switch (gammaNamed) { |
302 case kSRGB_SkGammaNamed: | 272 case kSRGB_SkGammaNamed: |
303 case k2Dot2Curve_SkGammaNamed: | 273 case k2Dot2Curve_SkGammaNamed: |
304 case kLinear_SkGammaNamed: { | 274 case kLinear_SkGammaNamed: { |
305 if (memory) { | 275 if (memory) { |
306 *((ColorSpaceHeader*) memory) = | 276 *((ColorSpaceHeader*) memory) = |
307 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)-> fGammaNamed, | 277 ColorSpaceHeader::Pack(k0_Version, 0, gammaNamed, |
308 ColorSpaceHeader::kMatrix_Fla g); | 278 ColorSpaceHeader::kMatrix_Fla g); |
309 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) ); | 279 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) ); |
310 as_CSB(this)->fToXYZD50.as3x4RowMajorf((float*) memory); | 280 thisXYZ->toXYZD50()->as3x4RowMajorf((float*) memory); |
311 } | 281 } |
312 return sizeof(ColorSpaceHeader) + 12 * sizeof(float); | 282 return sizeof(ColorSpaceHeader) + 12 * sizeof(float); |
313 } | 283 } |
314 default: | 284 default: |
315 // Otherwise, write the gamma values and the matrix. | 285 // Otherwise, write the gamma values and the matrix. |
316 if (memory) { | 286 if (memory) { |
317 *((ColorSpaceHeader*) memory) = | 287 *((ColorSpaceHeader*) memory) = |
318 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)-> fGammaNamed, | 288 ColorSpaceHeader::Pack(k0_Version, 0, gammaNamed, |
319 ColorSpaceHeader::kFloatGamma _Flag); | 289 ColorSpaceHeader::kFloatGamma _Flag); |
320 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) ); | 290 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) ); |
321 | 291 |
322 const SkGammas* gammas = as_CSB(this)->gammas(); | 292 const SkGammas* gammas = thisXYZ->gammas(); |
323 SkASSERT(gammas); | 293 SkASSERT(gammas); |
324 SkASSERT(SkGammas::Type::kValue_Type == gammas->fRedType && | 294 SkASSERT(SkGammas::Type::kValue_Type == gammas->fRedType && |
325 SkGammas::Type::kValue_Type == gammas->fGreenType & & | 295 SkGammas::Type::kValue_Type == gammas->fGreenType & & |
326 SkGammas::Type::kValue_Type == gammas->fBlueType); | 296 SkGammas::Type::kValue_Type == gammas->fBlueType); |
327 *(((float*) memory) + 0) = gammas->fRedData.fValue; | 297 *(((float*) memory) + 0) = gammas->fRedData.fValue; |
328 *(((float*) memory) + 1) = gammas->fGreenData.fValue; | 298 *(((float*) memory) + 1) = gammas->fGreenData.fValue; |
329 *(((float*) memory) + 2) = gammas->fBlueData.fValue; | 299 *(((float*) memory) + 2) = gammas->fBlueData.fValue; |
330 memory = SkTAddOffset<void>(memory, 3 * sizeof(float)); | 300 memory = SkTAddOffset<void>(memory, 3 * sizeof(float)); |
331 | 301 |
332 as_CSB(this)->fToXYZD50.as3x4RowMajorf((float*) memory); | 302 thisXYZ->toXYZD50()->as3x4RowMajorf((float*) memory); |
333 } | 303 } |
334 return sizeof(ColorSpaceHeader) + 15 * sizeof(float); | 304 return sizeof(ColorSpaceHeader) + 15 * sizeof(float); |
335 } | 305 } |
336 } | 306 } |
337 | 307 |
338 // Otherwise, serialize the ICC data. | 308 // Otherwise, serialize the ICC data. |
339 size_t profileSize = as_CSB(this)->fProfileData->size(); | 309 size_t profileSize = as_CSB(this)->fProfileData->size(); |
340 if (SkAlign4(profileSize) != (uint32_t) SkAlign4(profileSize)) { | 310 if (SkAlign4(profileSize) != (uint32_t) SkAlign4(profileSize)) { |
341 return 0; | 311 return 0; |
342 } | 312 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
431 } | 401 } |
432 | 402 |
433 bool SkColorSpace::Equals(const SkColorSpace* src, const SkColorSpace* dst) { | 403 bool SkColorSpace::Equals(const SkColorSpace* src, const SkColorSpace* dst) { |
434 if (src == dst) { | 404 if (src == dst) { |
435 return true; | 405 return true; |
436 } | 406 } |
437 | 407 |
438 if (!src || !dst) { | 408 if (!src || !dst) { |
439 return false; | 409 return false; |
440 } | 410 } |
411 | |
412 if (as_CSB(src)->type() != as_CSB(dst)->type()) { | |
413 return false; | |
414 } | |
441 | 415 |
442 SkData* srcData = as_CSB(src)->fProfileData.get(); | 416 SkData* srcData = as_CSB(src)->fProfileData.get(); |
443 SkData* dstData = as_CSB(dst)->fProfileData.get(); | 417 SkData* dstData = as_CSB(dst)->fProfileData.get(); |
444 if (srcData || dstData) { | 418 if (srcData || dstData) { |
445 if (srcData && dstData) { | 419 if (srcData && dstData) { |
446 return srcData->size() == dstData->size() && | 420 return srcData->size() == dstData->size() && |
447 0 == memcmp(srcData->data(), dstData->data(), srcData->size() ); | 421 0 == memcmp(srcData->data(), dstData->data(), srcData->size() ); |
448 } | 422 } |
449 | 423 |
450 return false; | 424 return false; |
451 } | 425 } |
452 | 426 |
453 // It's important to check fProfileData before named gammas. Some profiles may have named | 427 // It's important to check fProfileData before named gammas. Some profiles may have named |
454 // gammas, but also include other wacky features that cause us to save the d ata. | 428 // gammas, but also include other wacky features that cause us to save the d ata. |
msarett
2016/10/11 13:40:31
I believe you don't need any of this? Won't the f
raftias
2016/10/14 17:10:15
Yeah, I guess there wouldn't be any A2B0 profiles
| |
455 switch (as_CSB(src)->fGammaNamed) { | 429 if (as_CSB(src)->type() == SkColorSpace_Base::Type::kXYZTRC) { |
456 case kSRGB_SkGammaNamed: | 430 const SkColorSpace_XYZTRC& srcXYZ = *static_cast<const SkColorSpace_XYZT RC*>(src); |
457 case k2Dot2Curve_SkGammaNamed: | 431 const SkColorSpace_XYZTRC& dstXYZ = *static_cast<const SkColorSpace_XYZT RC*>(dst); |
458 case kLinear_SkGammaNamed: | 432 |
459 return (as_CSB(src)->fGammaNamed == as_CSB(dst)->fGammaNamed) && | 433 switch (srcXYZ.gammaNamed()) { |
460 (as_CSB(src)->fToXYZD50 == as_CSB(dst)->fToXYZD50); | 434 case kSRGB_SkGammaNamed: |
461 default: | 435 case k2Dot2Curve_SkGammaNamed: |
462 if (as_CSB(src)->fGammaNamed != as_CSB(dst)->fGammaNamed) { | 436 case kLinear_SkGammaNamed: |
437 return (srcXYZ.gammaNamed() == dstXYZ.gammaNamed()) && | |
438 (*srcXYZ.toXYZD50() == *dstXYZ.toXYZD50()); | |
439 default: | |
440 if (srcXYZ.gammaNamed() != dstXYZ.gammaNamed()) { | |
441 return false; | |
442 } | |
443 } | |
444 // TRC tables still need checking | |
445 } else { | |
446 const SkColorSpace_A2B0& srcA2B = *static_cast<const SkColorSpace_A2B0*> (src); | |
447 const SkColorSpace_A2B0& dstA2B = *static_cast<const SkColorSpace_A2B0*> (dst); | |
448 | |
449 const SkGammaNamed aNamed = srcA2B.aCurveNamed(); | |
450 const SkGammaNamed bNamed = srcA2B.bCurveNamed(); | |
451 const SkGammaNamed mNamed = srcA2B.mCurveNamed(); | |
452 if ((aNamed != dstA2B.aCurveNamed()) || | |
453 (bNamed != dstA2B.bCurveNamed()) || | |
454 (mNamed != dstA2B.mCurveNamed())) { | |
455 return false; | |
456 } | |
457 if (aNamed != kNonStandard_SkGammaNamed && | |
458 bNamed != kNonStandard_SkGammaNamed && | |
459 mNamed != kNonStandard_SkGammaNamed) { | |
460 // All gammas are the same type and are not tables/parametric, so se e if | |
461 // the matrices differ | |
462 if ((srcA2B.matrix() != dstA2B.matrix()) || | |
463 (srcA2B.matrix() != dstA2B.matrix()) || | |
464 (srcA2B.matrix() != dstA2B.matrix())) { | |
463 return false; | 465 return false; |
464 } | 466 } |
467 } | |
468 // a/b/m-curve tables and CLUT (if applicable) still need checking | |
469 } | |
465 | 470 |
466 // It is unlikely that we will reach this case. | 471 // It is unlikely that we will reach this case. |
467 sk_sp<SkData> srcData = src->serialize(); | 472 sk_sp<SkData> serializedSrcData = src->serialize(); |
msarett
2016/10/11 13:40:30
Thanks, I should not have shadowed my other variab
| |
468 sk_sp<SkData> dstData = dst->serialize(); | 473 sk_sp<SkData> serializedDstData = dst->serialize(); |
469 return srcData->size() == dstData->size() && | 474 return serializedSrcData->size() == serializedDstData->size() && |
470 0 == memcmp(srcData->data(), dstData->data(), srcData->size() ); | 475 0 == memcmp(serializedSrcData->data(), serializedDstData->data(), |
471 } | 476 serializedSrcData->size()); |
472 } | 477 } |
OLD | NEW |