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

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 #include "SkPoint3.h" 14 #include "SkPoint3.h"
13 15
14 bool SkColorSpacePrimaries::toXYZD50(SkMatrix44* toXYZ_D50) const { 16 bool SkColorSpacePrimaries::toXYZD50(SkMatrix44* toXYZ_D50) const {
15 if (!is_zero_to_one(fRX) || !is_zero_to_one(fRY) || 17 if (!is_zero_to_one(fRX) || !is_zero_to_one(fRY) ||
16 !is_zero_to_one(fGX) || !is_zero_to_one(fGY) || 18 !is_zero_to_one(fGX) || !is_zero_to_one(fGY) ||
17 !is_zero_to_one(fBX) || !is_zero_to_one(fBY) || 19 !is_zero_to_one(fBX) || !is_zero_to_one(fBY) ||
18 !is_zero_to_one(fWX) || !is_zero_to_one(fWY)) 20 !is_zero_to_one(fWX) || !is_zero_to_one(fWY))
19 { 21 {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 77
76 toXYZ.postConcat(DXToD50); 78 toXYZ.postConcat(DXToD50);
77 toXYZ_D50->set3x3(toXYZ[0], toXYZ[3], toXYZ[6], 79 toXYZ_D50->set3x3(toXYZ[0], toXYZ[3], toXYZ[6],
78 toXYZ[1], toXYZ[4], toXYZ[7], 80 toXYZ[1], toXYZ[4], toXYZ[7],
79 toXYZ[2], toXYZ[5], toXYZ[8]); 81 toXYZ[2], toXYZ[5], toXYZ[8]);
80 return true; 82 return true;
81 } 83 }
82 84
83 //////////////////////////////////////////////////////////////////////////////// /////////////////// 85 //////////////////////////////////////////////////////////////////////////////// ///////////////////
84 86
85 SkColorSpace_Base::SkColorSpace_Base(SkGammaNamed gammaNamed, const SkMatrix44& toXYZD50) 87 SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkData> profileData)
86 : fGammaNamed(gammaNamed) 88 : fProfileData(std::move(profileData))
87 , fGammas(nullptr)
88 , fProfileData(nullptr)
89 , fToXYZD50(toXYZD50)
90 , fFromXYZD50(SkMatrix44::kUninitialized_Constructor)
91 {}
92
93 SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkColorLookUpTable> colorLUT, SkGamma Named gammaNamed,
94 sk_sp<SkGammas> gammas, const SkMatrix44& t oXYZD50,
95 sk_sp<SkData> profileData)
96 : fColorLUT(std::move(colorLUT))
97 , fGammaNamed(gammaNamed)
98 , fGammas(std::move(gammas))
99 , fProfileData(std::move(profileData))
100 , fToXYZD50(toXYZD50)
101 , fFromXYZD50(SkMatrix44::kUninitialized_Constructor)
102 {} 89 {}
103 90
104 static constexpr float gSRGB_toXYZD50[] { 91 static constexpr float gSRGB_toXYZD50[] {
105 0.4358f, 0.3853f, 0.1430f, // Rx, Gx, Bx 92 0.4358f, 0.3853f, 0.1430f, // Rx, Gx, Bx
106 0.2224f, 0.7170f, 0.0606f, // Ry, Gy, Gz 93 0.2224f, 0.7170f, 0.0606f, // Ry, Gy, Gz
107 0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz 94 0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz
108 }; 95 };
109 96
110 static constexpr float gAdobeRGB_toXYZD50[] { 97 static constexpr float gAdobeRGB_toXYZD50[] {
111 0.6098f, 0.2052f, 0.1492f, // Rx, Gx, Bx 98 0.6098f, 0.2052f, 0.1492f, // Rx, Gx, Bx
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 } 142 }
156 143
157 if (kNonStandard_SkGammaNamed == gammaNamed) { 144 if (kNonStandard_SkGammaNamed == gammaNamed) {
158 sk_sp<SkGammas> gammas = sk_sp<SkGammas>(new SkGammas()); 145 sk_sp<SkGammas> gammas = sk_sp<SkGammas>(new SkGammas());
159 gammas->fRedType = SkGammas::Type::kValue_Type; 146 gammas->fRedType = SkGammas::Type::kValue_Type;
160 gammas->fGreenType = SkGammas::Type::kValue_Type; 147 gammas->fGreenType = SkGammas::Type::kValue_Type;
161 gammas->fBlueType = SkGammas::Type::kValue_Type; 148 gammas->fBlueType = SkGammas::Type::kValue_Type;
162 gammas->fRedData.fValue = values[0]; 149 gammas->fRedData.fValue = values[0];
163 gammas->fGreenData.fValue = values[1]; 150 gammas->fGreenData.fValue = values[1];
164 gammas->fBlueData.fValue = values[2]; 151 gammas->fBlueData.fValue = values[2];
165 return sk_sp<SkColorSpace>(new SkColorSpace_Base(nullptr, kNonStandard_S kGammaNamed, gammas, 152 return sk_sp<SkColorSpace>(new SkColorSpace_XYZTRC(kNonStandard_SkGammaN amed,
166 toXYZD50, nullptr)); 153 gammas, toXYZD50, nul lptr));
167 } 154 }
168 155
169 return SkColorSpace_Base::NewRGB(gammaNamed, toXYZD50); 156 return SkColorSpace_Base::NewRGB(gammaNamed, toXYZD50);
170 } 157 }
171 158
172 sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(SkGammaNamed gammaNamed, const SkM atrix44& toXYZD50) { 159 sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(SkGammaNamed gammaNamed, const SkM atrix44& toXYZD50) {
173 switch (gammaNamed) { 160 switch (gammaNamed) {
174 case kSRGB_SkGammaNamed: 161 case kSRGB_SkGammaNamed:
175 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { 162 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) {
176 return SkColorSpace::NewNamed(kSRGB_Named); 163 return SkColorSpace::NewNamed(kSRGB_Named);
177 } 164 }
178 break; 165 break;
179 case k2Dot2Curve_SkGammaNamed: 166 case k2Dot2Curve_SkGammaNamed:
180 if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { 167 if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) {
181 return SkColorSpace::NewNamed(kAdobeRGB_Named); 168 return SkColorSpace::NewNamed(kAdobeRGB_Named);
182 } 169 }
183 break; 170 break;
184 case kLinear_SkGammaNamed: 171 case kLinear_SkGammaNamed:
185 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { 172 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) {
186 return SkColorSpace::NewNamed(kSRGBLinear_Named); 173 return SkColorSpace::NewNamed(kSRGBLinear_Named);
187 } 174 }
188 break; 175 break;
189 case kNonStandard_SkGammaNamed: 176 case kNonStandard_SkGammaNamed:
190 // This is not allowed. 177 // This is not allowed.
191 return nullptr; 178 return nullptr;
192 default: 179 default:
193 break; 180 break;
194 } 181 }
195 182
196 return sk_sp<SkColorSpace>(new SkColorSpace_Base(gammaNamed, toXYZD50)); 183 return sk_sp<SkColorSpace>(new SkColorSpace_XYZTRC(gammaNamed, toXYZD50));
197 } 184 }
198 185
199 sk_sp<SkColorSpace> SkColorSpace::NewRGB(RenderTargetGamma gamma, const SkMatrix 44& toXYZD50) { 186 sk_sp<SkColorSpace> SkColorSpace::NewRGB(RenderTargetGamma gamma, const SkMatrix 44& toXYZD50) {
200 switch (gamma) { 187 switch (gamma) {
201 case kLinear_RenderTargetGamma: 188 case kLinear_RenderTargetGamma:
202 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, toXYZD50); 189 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, toXYZD50);
203 case kSRGB_RenderTargetGamma: 190 case kSRGB_RenderTargetGamma:
204 return SkColorSpace_Base::NewRGB(kSRGB_SkGammaNamed, toXYZD50); 191 return SkColorSpace_Base::NewRGB(kSRGB_SkGammaNamed, toXYZD50);
205 default: 192 default:
206 return nullptr; 193 return nullptr;
(...skipping 20 matching lines...) Expand all
227 *fn = coeffs; 214 *fn = coeffs;
228 gammas->fRedType = SkGammas::Type::kParam_Type; 215 gammas->fRedType = SkGammas::Type::kParam_Type;
229 gammas->fGreenType = SkGammas::Type::kParam_Type; 216 gammas->fGreenType = SkGammas::Type::kParam_Type;
230 gammas->fBlueType = SkGammas::Type::kParam_Type; 217 gammas->fBlueType = SkGammas::Type::kParam_Type;
231 218
232 SkGammas::Data data; 219 SkGammas::Data data;
233 data.fParamOffset = 0; 220 data.fParamOffset = 0;
234 gammas->fRedData = data; 221 gammas->fRedData = data;
235 gammas->fGreenData = data; 222 gammas->fGreenData = data;
236 gammas->fBlueData = data; 223 gammas->fBlueData = data;
237 return sk_sp<SkColorSpace>(new SkColorSpace_Base(nullptr, kNonStandard_SkGam maNamed, 224 return sk_sp<SkColorSpace>(new SkColorSpace_XYZTRC(kNonStandard_SkGammaNamed ,
238 std::move(gammas), toXYZD50 , nullptr)); 225 std::move(gammas), toXYZD 50, nullptr));
239 } 226 }
240 227
241 static SkColorSpace* gAdobeRGB; 228 static SkColorSpace* gAdobeRGB;
242 static SkColorSpace* gSRGB; 229 static SkColorSpace* gSRGB;
243 static SkColorSpace* gSRGBLinear; 230 static SkColorSpace* gSRGBLinear;
244 231
245 sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { 232 sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) {
246 static SkOnce sRGBOnce; 233 static SkOnce sRGBOnce;
247 static SkOnce adobeRGBOnce; 234 static SkOnce adobeRGBOnce;
248 static SkOnce sRGBLinearOnce; 235 static SkOnce sRGBLinearOnce;
249 236
250 switch (named) { 237 switch (named) {
251 case kSRGB_Named: { 238 case kSRGB_Named: {
252 sRGBOnce([] { 239 sRGBOnce([] {
253 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); 240 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor);
254 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); 241 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50);
255 242
256 // Force the mutable type mask to be computed. This avoids race s. 243 // Force the mutable type mask to be computed. This avoids race s.
257 (void)srgbToxyzD50.getType(); 244 (void)srgbToxyzD50.getType();
258 gSRGB = new SkColorSpace_Base(kSRGB_SkGammaNamed, srgbToxyzD50); 245 gSRGB = new SkColorSpace_XYZTRC(kSRGB_SkGammaNamed, srgbToxyzD50 );
259 }); 246 });
260 return sk_ref_sp<SkColorSpace>(gSRGB); 247 return sk_ref_sp<SkColorSpace>(gSRGB);
261 } 248 }
262 case kAdobeRGB_Named: { 249 case kAdobeRGB_Named: {
263 adobeRGBOnce([] { 250 adobeRGBOnce([] {
264 SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Construct or); 251 SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Construct or);
265 adobergbToxyzD50.set3x3RowMajorf(gAdobeRGB_toXYZD50); 252 adobergbToxyzD50.set3x3RowMajorf(gAdobeRGB_toXYZD50);
266 253
267 // Force the mutable type mask to be computed. This avoids race s. 254 // Force the mutable type mask to be computed. This avoids race s.
268 (void)adobergbToxyzD50.getType(); 255 (void)adobergbToxyzD50.getType();
269 gAdobeRGB = new SkColorSpace_Base(k2Dot2Curve_SkGammaNamed, adob ergbToxyzD50); 256 gAdobeRGB = new SkColorSpace_XYZTRC(k2Dot2Curve_SkGammaNamed, ad obergbToxyzD50);
270 }); 257 });
271 return sk_ref_sp<SkColorSpace>(gAdobeRGB); 258 return sk_ref_sp<SkColorSpace>(gAdobeRGB);
272 } 259 }
273 case kSRGBLinear_Named: { 260 case kSRGBLinear_Named: {
274 sRGBLinearOnce([] { 261 sRGBLinearOnce([] {
275 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); 262 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor);
276 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); 263 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50);
277 264
278 // Force the mutable type mask to be computed. This avoids race s. 265 // Force the mutable type mask to be computed. This avoids race s.
279 (void)srgbToxyzD50.getType(); 266 (void)srgbToxyzD50.getType();
280 gSRGBLinear = new SkColorSpace_Base(kLinear_SkGammaNamed, srgbTo xyzD50); 267 gSRGBLinear = new SkColorSpace_XYZTRC(kLinear_SkGammaNamed, srgb ToxyzD50);
281 }); 268 });
282 return sk_ref_sp<SkColorSpace>(gSRGBLinear); 269 return sk_ref_sp<SkColorSpace>(gSRGBLinear);
283 } 270 }
284 default: 271 default:
285 break; 272 break;
286 } 273 }
287 return nullptr; 274 return nullptr;
288 } 275 }
289 276
290 sk_sp<SkColorSpace> SkColorSpace_Base::makeLinearGamma() {
291 if (this->gammaIsLinear()) {
292 return sk_ref_sp(this);
293 }
294 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, as_CSB(this)->fToXYZD 50);
295 }
296
297 //////////////////////////////////////////////////////////////////////////////// /////////////////// 277 //////////////////////////////////////////////////////////////////////////////// ///////////////////
298 278
299 bool SkColorSpace::gammaCloseToSRGB() const { 279 bool SkColorSpace::gammaCloseToSRGB() const {
300 return kSRGB_SkGammaNamed == as_CSB(this)->fGammaNamed || 280 return as_CSB(this)->onGammaCloseToSRGB();
301 k2Dot2Curve_SkGammaNamed == as_CSB(this)->fGammaNamed;
302 } 281 }
303 282
304 bool SkColorSpace::gammaIsLinear() const { 283 bool SkColorSpace::gammaIsLinear() const {
305 return kLinear_SkGammaNamed == as_CSB(this)->fGammaNamed; 284 return as_CSB(this)->onGammaIsLinear();
306 }
307
308 const SkMatrix44& SkColorSpace_Base::fromXYZD50() const {
309 fFromXYZOnce([this] {
310 if (!fToXYZD50.invert(&fFromXYZD50)) {
311 // If a client gives us a dst gamut with a transform that we can't i nvert, we will
312 // simply give them back a transform to sRGB gamut.
313 SkDEBUGFAIL("Non-invertible XYZ matrix, defaulting to sRGB");
314 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor);
315 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50);
316 srgbToxyzD50.invert(&fFromXYZD50);
317 }
318 });
319 return fFromXYZD50;
320 } 285 }
321 286
322 //////////////////////////////////////////////////////////////////////////////// /////////////////// 287 //////////////////////////////////////////////////////////////////////////////// ///////////////////
323 288
324 enum Version { 289 enum Version {
325 k0_Version, // Initial version, header + flags for matrix and profile 290 k0_Version, // Initial version, header + flags for matrix and profile
326 }; 291 };
327 292
328 struct ColorSpaceHeader { 293 struct ColorSpaceHeader {
329 /** 294 /**
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 uint8_t fVersion; // Always zero 343 uint8_t fVersion; // Always zero
379 uint8_t fNamed; // Must be a SkColorSpace::Named 344 uint8_t fNamed; // Must be a SkColorSpace::Named
380 uint8_t fGammaNamed; // Must be a SkGammaNamed 345 uint8_t fGammaNamed; // Must be a SkGammaNamed
381 uint8_t fFlags; // Some combination of the flags listed above 346 uint8_t fFlags; // Some combination of the flags listed above
382 }; 347 };
383 348
384 size_t SkColorSpace::writeToMemory(void* memory) const { 349 size_t SkColorSpace::writeToMemory(void* memory) const {
385 // Start by trying the serialization fast path. If we haven't saved ICC pro file data, 350 // Start by trying the serialization fast path. If we haven't saved ICC pro file data,
386 // we must have a profile that we can serialize easily. 351 // we must have a profile that we can serialize easily.
387 if (!as_CSB(this)->fProfileData) { 352 if (!as_CSB(this)->fProfileData) {
353 // Profile data is mandatory for A2B0 color spaces.
354 SkASSERT(as_CSB(this)->type() == SkColorSpace_Base::Type::kXYZTRC);
355 const SkColorSpace_XYZTRC* thisXYZ = static_cast<const SkColorSpace_XYZT RC*>(this);
388 // If we have a named profile, only write the enum. 356 // If we have a named profile, only write the enum.
357 const SkGammaNamed gammaNamed = thisXYZ->gammaNamed();
389 if (this == gSRGB) { 358 if (this == gSRGB) {
390 if (memory) { 359 if (memory) {
391 *((ColorSpaceHeader*) memory) = 360 *((ColorSpaceHeader*) memory) =
392 ColorSpaceHeader::Pack(k0_Version, kSRGB_Named, 361 ColorSpaceHeader::Pack(k0_Version, kSRGB_Named, gammaNam ed, 0);
393 as_CSB(this)->fGammaNamed, 0);
394 } 362 }
395 return sizeof(ColorSpaceHeader); 363 return sizeof(ColorSpaceHeader);
396 } else if (this == gAdobeRGB) { 364 } else if (this == gAdobeRGB) {
397 if (memory) { 365 if (memory) {
398 *((ColorSpaceHeader*) memory) = 366 *((ColorSpaceHeader*) memory) =
399 ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named, 367 ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named, gamm aNamed, 0);
400 as_CSB(this)->fGammaNamed, 0);
401 } 368 }
402 return sizeof(ColorSpaceHeader); 369 return sizeof(ColorSpaceHeader);
403 } else if (this == gSRGBLinear) { 370 } else if (this == gSRGBLinear) {
404 if (memory) { 371 if (memory) {
405 *((ColorSpaceHeader*)memory) = 372 *((ColorSpaceHeader*) memory) =
406 ColorSpaceHeader::Pack(k0_Version, kSRGBLinear_Named, 373 ColorSpaceHeader::Pack(k0_Version, kSRGBLinear_Named, ga mmaNamed, 0);
407 as_CSB(this)->fGammaNamed, 0);
408 } 374 }
409 return sizeof(ColorSpaceHeader); 375 return sizeof(ColorSpaceHeader);
410 } 376 }
411 377
412 // If we have a named gamma, write the enum and the matrix. 378 // If we have a named gamma, write the enum and the matrix.
413 switch (as_CSB(this)->fGammaNamed) { 379 switch (gammaNamed) {
414 case kSRGB_SkGammaNamed: 380 case kSRGB_SkGammaNamed:
415 case k2Dot2Curve_SkGammaNamed: 381 case k2Dot2Curve_SkGammaNamed:
416 case kLinear_SkGammaNamed: { 382 case kLinear_SkGammaNamed: {
417 if (memory) { 383 if (memory) {
418 *((ColorSpaceHeader*) memory) = 384 *((ColorSpaceHeader*) memory) =
419 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)-> fGammaNamed, 385 ColorSpaceHeader::Pack(k0_Version, 0, gammaNamed,
420 ColorSpaceHeader::kMatrix_Fla g); 386 ColorSpaceHeader::kMatrix_Fla g);
421 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) ); 387 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) );
422 as_CSB(this)->fToXYZD50.as3x4RowMajorf((float*) memory); 388 thisXYZ->toXYZD50()->as3x4RowMajorf((float*) memory);
423 } 389 }
424 return sizeof(ColorSpaceHeader) + 12 * sizeof(float); 390 return sizeof(ColorSpaceHeader) + 12 * sizeof(float);
425 } 391 }
426 default: 392 default:
427 const SkGammas* gammas = as_CSB(this)->gammas(); 393 const SkGammas* gammas = thisXYZ->gammas();
428 SkASSERT(gammas); 394 SkASSERT(gammas);
429 if (gammas->isValue(0) && gammas->isValue(1) && gammas->isValue( 2)) { 395 if (gammas->isValue(0) && gammas->isValue(1) && gammas->isValue( 2)) {
430 if (memory) { 396 if (memory) {
431 *((ColorSpaceHeader*) memory) = 397 *((ColorSpaceHeader*) memory) =
432 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(thi s)->fGammaNamed, 398 ColorSpaceHeader::Pack(k0_Version, 0, thisXYZ->f GammaNamed,
433 ColorSpaceHeader::kFloatG amma_Flag); 399 ColorSpaceHeader::kFloatG amma_Flag);
434 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHea der)); 400 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHea der));
435 401
436 *(((float*) memory) + 0) = gammas->fRedData.fValue; 402 *(((float*) memory) + 0) = gammas->fRedData.fValue;
437 *(((float*) memory) + 1) = gammas->fGreenData.fValue; 403 *(((float*) memory) + 1) = gammas->fGreenData.fValue;
438 *(((float*) memory) + 2) = gammas->fBlueData.fValue; 404 *(((float*) memory) + 2) = gammas->fBlueData.fValue;
439 memory = SkTAddOffset<void>(memory, 3 * sizeof(float)); 405 memory = SkTAddOffset<void>(memory, 3 * sizeof(float));
440 406
441 as_CSB(this)->fToXYZD50.as3x4RowMajorf((float*) memory); 407 thisXYZ->fToXYZD50.as3x4RowMajorf((float*) memory);
442 } 408 }
443 409
444 return sizeof(ColorSpaceHeader) + 15 * sizeof(float); 410 return sizeof(ColorSpaceHeader) + 15 * sizeof(float);
445 } else { 411 } else {
446 SkASSERT(gammas->isParametric(0)); 412 SkASSERT(gammas->isParametric(0));
447 SkASSERT(gammas->isParametric(1)); 413 SkASSERT(gammas->isParametric(1));
448 SkASSERT(gammas->isParametric(2)); 414 SkASSERT(gammas->isParametric(2));
449 SkASSERT(gammas->data(0) == gammas->data(1)); 415 SkASSERT(gammas->data(0) == gammas->data(1));
450 SkASSERT(gammas->data(0) == gammas->data(2)); 416 SkASSERT(gammas->data(0) == gammas->data(2));
451 417
452 if (memory) { 418 if (memory) {
453 *((ColorSpaceHeader*) memory) = 419 *((ColorSpaceHeader*) memory) =
454 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(thi s)->fGammaNamed, 420 ColorSpaceHeader::Pack(k0_Version, 0, thisXYZ->f GammaNamed,
455 ColorSpaceHeader::kTransf erFn_Flag); 421 ColorSpaceHeader::kTransf erFn_Flag);
456 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHea der)); 422 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHea der));
457 423
458 *(((float*) memory) + 0) = gammas->params(0).fA; 424 *(((float*) memory) + 0) = gammas->params(0).fA;
459 *(((float*) memory) + 1) = gammas->params(0).fB; 425 *(((float*) memory) + 1) = gammas->params(0).fB;
460 *(((float*) memory) + 2) = gammas->params(0).fC; 426 *(((float*) memory) + 2) = gammas->params(0).fC;
461 *(((float*) memory) + 3) = gammas->params(0).fD; 427 *(((float*) memory) + 3) = gammas->params(0).fD;
462 *(((float*) memory) + 4) = gammas->params(0).fE; 428 *(((float*) memory) + 4) = gammas->params(0).fE;
463 *(((float*) memory) + 5) = gammas->params(0).fF; 429 *(((float*) memory) + 5) = gammas->params(0).fF;
464 *(((float*) memory) + 6) = gammas->params(0).fG; 430 *(((float*) memory) + 6) = gammas->params(0).fG;
465 memory = SkTAddOffset<void>(memory, 7 * sizeof(float)); 431 memory = SkTAddOffset<void>(memory, 7 * sizeof(float));
466 432
467 as_CSB(this)->fToXYZD50.as3x4RowMajorf((float*) memory); 433 thisXYZ->fToXYZD50.as3x4RowMajorf((float*) memory);
468 } 434 }
469 435
470 return sizeof(ColorSpaceHeader) + 19 * sizeof(float); 436 return sizeof(ColorSpaceHeader) + 19 * sizeof(float);
471 } 437 }
472 } 438 }
473 } 439 }
474 440
475 // Otherwise, serialize the ICC data. 441 // Otherwise, serialize the ICC data.
476 size_t profileSize = as_CSB(this)->fProfileData->size(); 442 size_t profileSize = as_CSB(this)->fProfileData->size();
477 if (SkAlign4(profileSize) != (uint32_t) SkAlign4(profileSize)) { 443 if (SkAlign4(profileSize) != (uint32_t) SkAlign4(profileSize)) {
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 554
589 bool SkColorSpace::Equals(const SkColorSpace* src, const SkColorSpace* dst) { 555 bool SkColorSpace::Equals(const SkColorSpace* src, const SkColorSpace* dst) {
590 if (src == dst) { 556 if (src == dst) {
591 return true; 557 return true;
592 } 558 }
593 559
594 if (!src || !dst) { 560 if (!src || !dst) {
595 return false; 561 return false;
596 } 562 }
597 563
564
msarett 2016/10/14 21:31:39 nit: remove line
raftias 2016/10/17 15:28:02 Done.
598 SkData* srcData = as_CSB(src)->fProfileData.get(); 565 SkData* srcData = as_CSB(src)->fProfileData.get();
599 SkData* dstData = as_CSB(dst)->fProfileData.get(); 566 SkData* dstData = as_CSB(dst)->fProfileData.get();
600 if (srcData || dstData) { 567 if (srcData || dstData) {
601 if (srcData && dstData) { 568 if (srcData && dstData) {
602 return srcData->size() == dstData->size() && 569 return srcData->size() == dstData->size() &&
603 0 == memcmp(srcData->data(), dstData->data(), srcData->size() ); 570 0 == memcmp(srcData->data(), dstData->data(), srcData->size() );
604 } 571 }
605 572
606 return false; 573 return false;
607 } 574 }
608 575
609 // It's important to check fProfileData before named gammas. Some profiles may have named 576 // profiles are mandatory for A2B0 color spaces
610 // gammas, but also include other wacky features that cause us to save the d ata. 577 SkASSERT(as_CSB(src)->type() == SkColorSpace_Base::Type::kXYZTRC);
611 switch (as_CSB(src)->fGammaNamed) { 578 const SkColorSpace_XYZTRC* srcXYZ = static_cast<const SkColorSpace_XYZTRC*>( src);
579 const SkColorSpace_XYZTRC* dstXYZ = static_cast<const SkColorSpace_XYZTRC*>( dst);
580
581 switch (srcXYZ->gammaNamed()) {
612 case kSRGB_SkGammaNamed: 582 case kSRGB_SkGammaNamed:
613 case k2Dot2Curve_SkGammaNamed: 583 case k2Dot2Curve_SkGammaNamed:
614 case kLinear_SkGammaNamed: 584 case kLinear_SkGammaNamed:
615 return (as_CSB(src)->fGammaNamed == as_CSB(dst)->fGammaNamed) && 585 return (srcXYZ->gammaNamed() == dstXYZ->gammaNamed()) &&
616 (as_CSB(src)->fToXYZD50 == as_CSB(dst)->fToXYZD50); 586 (*srcXYZ->toXYZD50() == *dstXYZ->toXYZD50());
617 default: 587 default:
618 if (as_CSB(src)->fGammaNamed != as_CSB(dst)->fGammaNamed) { 588 if (srcXYZ->gammaNamed() != dstXYZ->gammaNamed()) {
619 return false; 589 return false;
620 } 590 }
621 591
622 // It is unlikely that we will reach this case. 592 // It is unlikely that we will reach this case.
623 sk_sp<SkData> srcData = src->serialize(); 593 sk_sp<SkData> serializedSrcData = src->serialize();
624 sk_sp<SkData> dstData = dst->serialize(); 594 sk_sp<SkData> serializedDstData = dst->serialize();
625 return srcData->size() == dstData->size() && 595 return serializedSrcData->size() == serializedDstData->size() &&
626 0 == memcmp(srcData->data(), dstData->data(), srcData->size() ); 596 0 == memcmp(serializedSrcData->data(), serializedDstData->dat a(),
597 serializedSrcData->size());
627 } 598 }
599
msarett 2016/10/14 21:31:39 nit: remove line
raftias 2016/10/17 15:28:02 Done.
628 } 600 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698