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 2381553002: Move toXYZD50() to SkColorSpace_Base (Closed)
Patch Set: Rebase 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
« no previous file with comments | « include/core/SkColorSpace.h ('k') | src/core/SkColorSpaceXform.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "SkColorSpacePriv.h" 10 #include "SkColorSpacePriv.h"
11 #include "SkOnce.h" 11 #include "SkOnce.h"
12 12
13 SkColorSpace::SkColorSpace(const SkMatrix44& toXYZD50)
14 : fToXYZD50(toXYZD50)
15 {}
16
17 SkColorSpace_Base::SkColorSpace_Base(SkGammaNamed gammaNamed, const SkMatrix44& toXYZD50) 13 SkColorSpace_Base::SkColorSpace_Base(SkGammaNamed gammaNamed, const SkMatrix44& toXYZD50)
18 : INHERITED(toXYZD50) 14 : fGammaNamed(gammaNamed)
19 , fGammaNamed(gammaNamed)
20 , fGammas(nullptr) 15 , fGammas(nullptr)
21 , fProfileData(nullptr) 16 , fProfileData(nullptr)
17 , fToXYZD50(toXYZD50)
22 , fFromXYZD50(SkMatrix44::kUninitialized_Constructor) 18 , fFromXYZD50(SkMatrix44::kUninitialized_Constructor)
23 {} 19 {}
24 20
25 SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkColorLookUpTable> colorLUT, SkGamma Named gammaNamed, 21 SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkColorLookUpTable> colorLUT, SkGamma Named gammaNamed,
26 sk_sp<SkGammas> gammas, const SkMatrix44& t oXYZD50, 22 sk_sp<SkGammas> gammas, const SkMatrix44& t oXYZD50,
27 sk_sp<SkData> profileData) 23 sk_sp<SkData> profileData)
28 : INHERITED(toXYZD50) 24 : fColorLUT(std::move(colorLUT))
29 , fColorLUT(std::move(colorLUT))
30 , fGammaNamed(gammaNamed) 25 , fGammaNamed(gammaNamed)
31 , fGammas(std::move(gammas)) 26 , fGammas(std::move(gammas))
32 , fProfileData(std::move(profileData)) 27 , fProfileData(std::move(profileData))
28 , fToXYZD50(toXYZD50)
33 , fFromXYZD50(SkMatrix44::kUninitialized_Constructor) 29 , fFromXYZD50(SkMatrix44::kUninitialized_Constructor)
34 {} 30 {}
35 31
36 static constexpr float gSRGB_toXYZD50[] { 32 static constexpr float gSRGB_toXYZD50[] {
37 0.4358f, 0.3853f, 0.1430f, // Rx, Gx, Bx 33 0.4358f, 0.3853f, 0.1430f, // Rx, Gx, Bx
38 0.2224f, 0.7170f, 0.0606f, // Ry, Gy, Gz 34 0.2224f, 0.7170f, 0.0606f, // Ry, Gy, Gz
39 0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz 35 0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz
40 }; 36 };
41 37
42 static constexpr float gAdobeRGB_toXYZD50[] { 38 static constexpr float gAdobeRGB_toXYZD50[] {
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 default: 181 default:
186 break; 182 break;
187 } 183 }
188 return nullptr; 184 return nullptr;
189 } 185 }
190 186
191 sk_sp<SkColorSpace> SkColorSpace::makeLinearGamma() { 187 sk_sp<SkColorSpace> SkColorSpace::makeLinearGamma() {
192 if (this->gammaIsLinear()) { 188 if (this->gammaIsLinear()) {
193 return sk_ref_sp(this); 189 return sk_ref_sp(this);
194 } 190 }
195 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, fToXYZD50); 191 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, as_CSB(this)->fToXYZD 50);
196 } 192 }
197 193
198 //////////////////////////////////////////////////////////////////////////////// /////////////////// 194 //////////////////////////////////////////////////////////////////////////////// ///////////////////
199 195
200 bool SkColorSpace::gammaCloseToSRGB() const { 196 bool SkColorSpace::gammaCloseToSRGB() const {
201 return kSRGB_SkGammaNamed == as_CSB(this)->fGammaNamed || 197 return kSRGB_SkGammaNamed == as_CSB(this)->fGammaNamed ||
202 k2Dot2Curve_SkGammaNamed == as_CSB(this)->fGammaNamed; 198 k2Dot2Curve_SkGammaNamed == as_CSB(this)->fGammaNamed;
203 } 199 }
204 200
205 bool SkColorSpace::gammaIsLinear() const { 201 bool SkColorSpace::gammaIsLinear() const {
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 // If we have a named gamma, write the enum and the matrix. 300 // If we have a named gamma, write the enum and the matrix.
305 switch (as_CSB(this)->fGammaNamed) { 301 switch (as_CSB(this)->fGammaNamed) {
306 case kSRGB_SkGammaNamed: 302 case kSRGB_SkGammaNamed:
307 case k2Dot2Curve_SkGammaNamed: 303 case k2Dot2Curve_SkGammaNamed:
308 case kLinear_SkGammaNamed: { 304 case kLinear_SkGammaNamed: {
309 if (memory) { 305 if (memory) {
310 *((ColorSpaceHeader*) memory) = 306 *((ColorSpaceHeader*) memory) =
311 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)-> fGammaNamed, 307 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)-> fGammaNamed,
312 ColorSpaceHeader::kMatrix_Fla g); 308 ColorSpaceHeader::kMatrix_Fla g);
313 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) ); 309 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) );
314 fToXYZD50.as3x4RowMajorf((float*) memory); 310 as_CSB(this)->fToXYZD50.as3x4RowMajorf((float*) memory);
315 } 311 }
316 return sizeof(ColorSpaceHeader) + 12 * sizeof(float); 312 return sizeof(ColorSpaceHeader) + 12 * sizeof(float);
317 } 313 }
318 default: 314 default:
319 // Otherwise, write the gamma values and the matrix. 315 // Otherwise, write the gamma values and the matrix.
320 if (memory) { 316 if (memory) {
321 *((ColorSpaceHeader*) memory) = 317 *((ColorSpaceHeader*) memory) =
322 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)-> fGammaNamed, 318 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)-> fGammaNamed,
323 ColorSpaceHeader::kFloatGamma _Flag); 319 ColorSpaceHeader::kFloatGamma _Flag);
324 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) ); 320 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) );
325 321
326 const SkGammas* gammas = as_CSB(this)->gammas(); 322 const SkGammas* gammas = as_CSB(this)->gammas();
327 SkASSERT(gammas); 323 SkASSERT(gammas);
328 SkASSERT(SkGammas::Type::kValue_Type == gammas->fRedType && 324 SkASSERT(SkGammas::Type::kValue_Type == gammas->fRedType &&
329 SkGammas::Type::kValue_Type == gammas->fGreenType & & 325 SkGammas::Type::kValue_Type == gammas->fGreenType & &
330 SkGammas::Type::kValue_Type == gammas->fBlueType); 326 SkGammas::Type::kValue_Type == gammas->fBlueType);
331 *(((float*) memory) + 0) = gammas->fRedData.fValue; 327 *(((float*) memory) + 0) = gammas->fRedData.fValue;
332 *(((float*) memory) + 1) = gammas->fGreenData.fValue; 328 *(((float*) memory) + 1) = gammas->fGreenData.fValue;
333 *(((float*) memory) + 2) = gammas->fBlueData.fValue; 329 *(((float*) memory) + 2) = gammas->fBlueData.fValue;
334 memory = SkTAddOffset<void>(memory, 3 * sizeof(float)); 330 memory = SkTAddOffset<void>(memory, 3 * sizeof(float));
335 331
336 fToXYZD50.as3x4RowMajorf((float*) memory); 332 as_CSB(this)->fToXYZD50.as3x4RowMajorf((float*) memory);
337 } 333 }
338 return sizeof(ColorSpaceHeader) + 15 * sizeof(float); 334 return sizeof(ColorSpaceHeader) + 15 * sizeof(float);
339 } 335 }
340 } 336 }
341 337
342 // Otherwise, serialize the ICC data. 338 // Otherwise, serialize the ICC data.
343 size_t profileSize = as_CSB(this)->fProfileData->size(); 339 size_t profileSize = as_CSB(this)->fProfileData->size();
344 if (SkAlign4(profileSize) != (uint32_t) SkAlign4(profileSize)) { 340 if (SkAlign4(profileSize) != (uint32_t) SkAlign4(profileSize)) {
345 return 0; 341 return 0;
346 } 342 }
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 return false; 450 return false;
455 } 451 }
456 452
457 // It's important to check fProfileData before named gammas. Some profiles may have named 453 // It's important to check fProfileData before named gammas. Some profiles may have named
458 // gammas, but also include other wacky features that cause us to save the d ata. 454 // gammas, but also include other wacky features that cause us to save the d ata.
459 switch (as_CSB(src)->fGammaNamed) { 455 switch (as_CSB(src)->fGammaNamed) {
460 case kSRGB_SkGammaNamed: 456 case kSRGB_SkGammaNamed:
461 case k2Dot2Curve_SkGammaNamed: 457 case k2Dot2Curve_SkGammaNamed:
462 case kLinear_SkGammaNamed: 458 case kLinear_SkGammaNamed:
463 return (as_CSB(src)->fGammaNamed == as_CSB(dst)->fGammaNamed) && 459 return (as_CSB(src)->fGammaNamed == as_CSB(dst)->fGammaNamed) &&
464 (src->fToXYZD50 == dst->fToXYZD50); 460 (as_CSB(src)->fToXYZD50 == as_CSB(dst)->fToXYZD50);
465 default: 461 default:
466 if (as_CSB(src)->fGammaNamed != as_CSB(dst)->fGammaNamed) { 462 if (as_CSB(src)->fGammaNamed != as_CSB(dst)->fGammaNamed) {
467 return false; 463 return false;
468 } 464 }
469 465
470 // It is unlikely that we will reach this case. 466 // It is unlikely that we will reach this case.
471 sk_sp<SkData> srcData = src->serialize(); 467 sk_sp<SkData> srcData = src->serialize();
472 sk_sp<SkData> dstData = dst->serialize(); 468 sk_sp<SkData> dstData = dst->serialize();
473 return srcData->size() == dstData->size() && 469 return srcData->size() == dstData->size() &&
474 0 == memcmp(srcData->data(), dstData->data(), srcData->size() ); 470 0 == memcmp(srcData->data(), dstData->data(), srcData->size() );
475 } 471 }
476 } 472 }
OLDNEW
« no previous file with comments | « include/core/SkColorSpace.h ('k') | src/core/SkColorSpaceXform.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698