Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: src/core/SkColorSpace.cpp

Issue 2389983002: Refactored SkColorSpace and added in a Lab PCS GM (Closed)
Patch Set: responding to comments Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698