| 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 "SkColorSpacePriv.h" | 10 #include "SkColorSpacePriv.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 sk_sp<SkData> profileData) | 27 sk_sp<SkData> profileData) |
| 28 : INHERITED(toXYZD50) | 28 : INHERITED(toXYZD50) |
| 29 , fColorLUT(std::move(colorLUT)) | 29 , fColorLUT(std::move(colorLUT)) |
| 30 , fGammaNamed(gammaNamed) | 30 , fGammaNamed(gammaNamed) |
| 31 , fGammas(std::move(gammas)) | 31 , fGammas(std::move(gammas)) |
| 32 , fProfileData(std::move(profileData)) | 32 , fProfileData(std::move(profileData)) |
| 33 , fFromXYZD50(SkMatrix44::kUninitialized_Constructor) | 33 , fFromXYZD50(SkMatrix44::kUninitialized_Constructor) |
| 34 {} | 34 {} |
| 35 | 35 |
| 36 static constexpr float gSRGB_toXYZD50[] { | 36 static constexpr float gSRGB_toXYZD50[] { |
| 37 0.4358f, 0.2224f, 0.0139f, // * R | 37 0.4358f, 0.3853f, 0.1430f, // Rx, Gx, Bx |
| 38 0.3853f, 0.7170f, 0.0971f, // * G | 38 0.2224f, 0.7170f, 0.0606f, // Ry, Gy, Gz |
| 39 0.1430f, 0.0606f, 0.7139f, // * B | 39 0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz |
| 40 }; | 40 }; |
| 41 | 41 |
| 42 static constexpr float gAdobeRGB_toXYZD50[] { | 42 static constexpr float gAdobeRGB_toXYZD50[] { |
| 43 0.6098f, 0.3111f, 0.0195f, // * R | 43 0.6098f, 0.2052f, 0.1492f, // Rx, Gx, Bx |
| 44 0.2052f, 0.6257f, 0.0609f, // * G | 44 0.3111f, 0.6257f, 0.0632f, // Ry, Gy, By |
| 45 0.1492f, 0.0632f, 0.7448f, // * B | 45 0.0195f, 0.0609f, 0.7448f, // Rz, Gz, Bz |
| 46 }; | 46 }; |
| 47 | 47 |
| 48 /** | 48 /** |
| 49 * Checks if our toXYZ matrix is a close match to a known color gamut. | 49 * Checks if our toXYZ matrix is a close match to a known color gamut. |
| 50 * | 50 * |
| 51 * @param toXYZD50 transformation matrix deduced from profile data | 51 * @param toXYZD50 transformation matrix deduced from profile data |
| 52 * @param standard 3x3 canonical transformation matrix | 52 * @param standard 3x3 canonical transformation matrix |
| 53 */ | 53 */ |
| 54 static bool xyz_almost_equal(const SkMatrix44& toXYZD50, const float* standard)
{ | 54 static bool xyz_almost_equal(const SkMatrix44& toXYZD50, const float* standard)
{ |
| 55 return color_space_almost_equal(toXYZD50.getFloat(0, 0), standard[0]) && | 55 return color_space_almost_equal(toXYZD50.getFloat(0, 0), standard[0]) && |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 // If we have a named gamma, write the enum and the matrix. | 274 // If we have a named gamma, write the enum and the matrix. |
| 275 switch (as_CSB(this)->fGammaNamed) { | 275 switch (as_CSB(this)->fGammaNamed) { |
| 276 case kSRGB_SkGammaNamed: | 276 case kSRGB_SkGammaNamed: |
| 277 case k2Dot2Curve_SkGammaNamed: | 277 case k2Dot2Curve_SkGammaNamed: |
| 278 case kLinear_SkGammaNamed: { | 278 case kLinear_SkGammaNamed: { |
| 279 if (memory) { | 279 if (memory) { |
| 280 *((ColorSpaceHeader*) memory) = | 280 *((ColorSpaceHeader*) memory) = |
| 281 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)->
fGammaNamed, | 281 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)->
fGammaNamed, |
| 282 ColorSpaceHeader::kMatrix_Fla
g); | 282 ColorSpaceHeader::kMatrix_Fla
g); |
| 283 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader)
); | 283 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader)
); |
| 284 fToXYZD50.as4x3ColMajorf((float*) memory); | 284 fToXYZD50.as3x4RowMajorf((float*) memory); |
| 285 } | 285 } |
| 286 return sizeof(ColorSpaceHeader) + 12 * sizeof(float); | 286 return sizeof(ColorSpaceHeader) + 12 * sizeof(float); |
| 287 } | 287 } |
| 288 default: | 288 default: |
| 289 // Otherwise, write the gamma values and the matrix. | 289 // Otherwise, write the gamma values and the matrix. |
| 290 if (memory) { | 290 if (memory) { |
| 291 *((ColorSpaceHeader*) memory) = | 291 *((ColorSpaceHeader*) memory) = |
| 292 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)->
fGammaNamed, | 292 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)->
fGammaNamed, |
| 293 ColorSpaceHeader::kFloatGamma
_Flag); | 293 ColorSpaceHeader::kFloatGamma
_Flag); |
| 294 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader)
); | 294 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader)
); |
| 295 | 295 |
| 296 const SkGammas* gammas = as_CSB(this)->gammas(); | 296 const SkGammas* gammas = as_CSB(this)->gammas(); |
| 297 SkASSERT(gammas); | 297 SkASSERT(gammas); |
| 298 SkASSERT(SkGammas::Type::kValue_Type == gammas->fRedType && | 298 SkASSERT(SkGammas::Type::kValue_Type == gammas->fRedType && |
| 299 SkGammas::Type::kValue_Type == gammas->fGreenType &
& | 299 SkGammas::Type::kValue_Type == gammas->fGreenType &
& |
| 300 SkGammas::Type::kValue_Type == gammas->fBlueType); | 300 SkGammas::Type::kValue_Type == gammas->fBlueType); |
| 301 *(((float*) memory) + 0) = gammas->fRedData.fValue; | 301 *(((float*) memory) + 0) = gammas->fRedData.fValue; |
| 302 *(((float*) memory) + 1) = gammas->fGreenData.fValue; | 302 *(((float*) memory) + 1) = gammas->fGreenData.fValue; |
| 303 *(((float*) memory) + 2) = gammas->fBlueData.fValue; | 303 *(((float*) memory) + 2) = gammas->fBlueData.fValue; |
| 304 memory = SkTAddOffset<void>(memory, 3 * sizeof(float)); | 304 memory = SkTAddOffset<void>(memory, 3 * sizeof(float)); |
| 305 | 305 |
| 306 fToXYZD50.as4x3ColMajorf((float*) memory); | 306 fToXYZD50.as3x4RowMajorf((float*) memory); |
| 307 } | 307 } |
| 308 return sizeof(ColorSpaceHeader) + 15 * sizeof(float); | 308 return sizeof(ColorSpaceHeader) + 15 * sizeof(float); |
| 309 } | 309 } |
| 310 } | 310 } |
| 311 | 311 |
| 312 // Otherwise, serialize the ICC data. | 312 // Otherwise, serialize the ICC data. |
| 313 size_t profileSize = as_CSB(this)->fProfileData->size(); | 313 size_t profileSize = as_CSB(this)->fProfileData->size(); |
| 314 if (SkAlign4(profileSize) != (uint32_t) SkAlign4(profileSize)) { | 314 if (SkAlign4(profileSize) != (uint32_t) SkAlign4(profileSize)) { |
| 315 return 0; | 315 return 0; |
| 316 } | 316 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 | 355 |
| 356 switch ((SkGammaNamed) header.fGammaNamed) { | 356 switch ((SkGammaNamed) header.fGammaNamed) { |
| 357 case kSRGB_SkGammaNamed: | 357 case kSRGB_SkGammaNamed: |
| 358 case k2Dot2Curve_SkGammaNamed: | 358 case k2Dot2Curve_SkGammaNamed: |
| 359 case kLinear_SkGammaNamed: { | 359 case kLinear_SkGammaNamed: { |
| 360 if (ColorSpaceHeader::kMatrix_Flag != header.fFlags || length < 12 *
sizeof(float)) { | 360 if (ColorSpaceHeader::kMatrix_Flag != header.fFlags || length < 12 *
sizeof(float)) { |
| 361 return nullptr; | 361 return nullptr; |
| 362 } | 362 } |
| 363 | 363 |
| 364 SkMatrix44 toXYZ(SkMatrix44::kUninitialized_Constructor); | 364 SkMatrix44 toXYZ(SkMatrix44::kUninitialized_Constructor); |
| 365 toXYZ.set4x3ColMajorf((const float*) data); | 365 toXYZ.set3x4RowMajorf((const float*) data); |
| 366 return SkColorSpace_Base::NewRGB((SkGammaNamed) header.fGammaNamed,
toXYZ); | 366 return SkColorSpace_Base::NewRGB((SkGammaNamed) header.fGammaNamed,
toXYZ); |
| 367 } | 367 } |
| 368 default: | 368 default: |
| 369 break; | 369 break; |
| 370 } | 370 } |
| 371 | 371 |
| 372 switch (header.fFlags) { | 372 switch (header.fFlags) { |
| 373 case ColorSpaceHeader::kICC_Flag: { | 373 case ColorSpaceHeader::kICC_Flag: { |
| 374 if (length < sizeof(uint32_t)) { | 374 if (length < sizeof(uint32_t)) { |
| 375 return nullptr; | 375 return nullptr; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 389 return nullptr; | 389 return nullptr; |
| 390 } | 390 } |
| 391 | 391 |
| 392 float gammas[3]; | 392 float gammas[3]; |
| 393 gammas[0] = *(((const float*) data) + 0); | 393 gammas[0] = *(((const float*) data) + 0); |
| 394 gammas[1] = *(((const float*) data) + 1); | 394 gammas[1] = *(((const float*) data) + 1); |
| 395 gammas[2] = *(((const float*) data) + 2); | 395 gammas[2] = *(((const float*) data) + 2); |
| 396 data = SkTAddOffset<const void>(data, 3 * sizeof(float)); | 396 data = SkTAddOffset<const void>(data, 3 * sizeof(float)); |
| 397 | 397 |
| 398 SkMatrix44 toXYZ(SkMatrix44::kUninitialized_Constructor); | 398 SkMatrix44 toXYZ(SkMatrix44::kUninitialized_Constructor); |
| 399 toXYZ.set4x3ColMajorf((const float*) data); | 399 toXYZ.set3x4RowMajorf((const float*) data); |
| 400 return SkColorSpace_Base::NewRGB(gammas, toXYZ); | 400 return SkColorSpace_Base::NewRGB(gammas, toXYZ); |
| 401 } | 401 } |
| 402 default: | 402 default: |
| 403 return nullptr; | 403 return nullptr; |
| 404 } | 404 } |
| 405 } | 405 } |
| 406 | 406 |
| 407 bool SkColorSpace::Equals(const SkColorSpace* src, const SkColorSpace* dst) { | 407 bool SkColorSpace::Equals(const SkColorSpace* src, const SkColorSpace* dst) { |
| 408 if (src == dst) { | 408 if (src == dst) { |
| 409 return true; | 409 return true; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 437 return false; | 437 return false; |
| 438 } | 438 } |
| 439 | 439 |
| 440 // It is unlikely that we will reach this case. | 440 // It is unlikely that we will reach this case. |
| 441 sk_sp<SkData> srcData = src->serialize(); | 441 sk_sp<SkData> srcData = src->serialize(); |
| 442 sk_sp<SkData> dstData = dst->serialize(); | 442 sk_sp<SkData> dstData = dst->serialize(); |
| 443 return srcData->size() == dstData->size() && | 443 return srcData->size() == dstData->size() && |
| 444 0 == memcmp(srcData->data(), dstData->data(), srcData->size()
); | 444 0 == memcmp(srcData->data(), dstData->data(), srcData->size()
); |
| 445 } | 445 } |
| 446 } | 446 } |
| OLD | NEW |