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 "SkColorPriv.h" | 8 #include "SkColorPriv.h" |
9 #include "SkColorSpace_Base.h" | 9 #include "SkColorSpace_Base.h" |
10 #include "SkColorSpacePriv.h" | 10 #include "SkColorSpacePriv.h" |
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 params.fF); | 439 params.fF); |
440 outGammaTables[i] = &gammaTableStorage[i * gammaTableSize]; | 440 outGammaTables[i] = &gammaTableStorage[i * gammaTableSize]; |
441 } | 441 } |
442 } | 442 } |
443 } | 443 } |
444 } | 444 } |
445 } | 445 } |
446 | 446 |
447 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 447 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
448 | 448 |
449 static inline bool compute_gamut_xform(SkMatrix44* srcToDst, const SkMatrix44& s
rcToXYZ, | 449 static inline void compute_gamut_xform(SkMatrix44* srcToDst, const SkColorSpace*
src, |
450 const SkMatrix44& dstToXYZ) { | 450 const SkColorSpace* dst) { |
451 if (!dstToXYZ.invert(srcToDst)) { | 451 *srcToDst = as_CSB(dst)->fromXYZD50(); |
452 return false; | 452 srcToDst->postConcat(src->toXYZD50()); |
453 } | |
454 | |
455 srcToDst->postConcat(srcToXYZ); | |
456 return true; | |
457 } | 453 } |
458 | 454 |
459 static inline bool is_almost_identity(const SkMatrix44& srcToDst) { | 455 static inline bool is_almost_identity(const SkMatrix44& srcToDst) { |
460 for (int i = 0; i < 4; i++) { | 456 for (int i = 0; i < 4; i++) { |
461 for (int j = 0; j < 4; j++) { | 457 for (int j = 0; j < 4; j++) { |
462 float expected = (i == j) ? 1.0f : 0.0f; | 458 float expected = (i == j) ? 1.0f : 0.0f; |
463 if (!color_space_almost_equal(srcToDst.getFloat(i,j), expected)) { | 459 if (!color_space_almost_equal(srcToDst.getFloat(i,j), expected)) { |
464 return false; | 460 return false; |
465 } | 461 } |
466 } | 462 } |
467 } | 463 } |
468 return true; | 464 return true; |
469 } | 465 } |
470 | 466 |
471 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 467 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
472 | 468 |
473 std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(const sk_sp<SkColorSpa
ce>& srcSpace, | 469 std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(const sk_sp<SkColorSpa
ce>& srcSpace, |
474 const sk_sp<SkColorSpa
ce>& dstSpace) { | 470 const sk_sp<SkColorSpa
ce>& dstSpace) { |
475 if (!srcSpace || !dstSpace) { | 471 if (!srcSpace || !dstSpace) { |
476 // Invalid input | 472 // Invalid input |
477 return nullptr; | 473 return nullptr; |
478 } | 474 } |
479 | 475 |
480 ColorSpaceMatch csm = kNone_ColorSpaceMatch; | 476 ColorSpaceMatch csm = kNone_ColorSpaceMatch; |
481 SkMatrix44 srcToDst(SkMatrix44::kUninitialized_Constructor); | 477 SkMatrix44 srcToDst(SkMatrix44::kUninitialized_Constructor); |
482 if (SkColorSpace::Equals(srcSpace.get(), dstSpace.get())) { | 478 if (SkColorSpace::Equals(srcSpace.get(), dstSpace.get())) { |
483 srcToDst.setIdentity(); | 479 srcToDst.setIdentity(); |
484 csm = kFull_ColorSpaceMatch; | 480 csm = kFull_ColorSpaceMatch; |
485 } else if (!compute_gamut_xform(&srcToDst, srcSpace->xyz(), dstSpace->xyz())
) { | 481 } else { |
486 return nullptr; | 482 compute_gamut_xform(&srcToDst, srcSpace.get(), dstSpace.get()); |
487 } else if (is_almost_identity(srcToDst)) { | 483 |
488 srcToDst.setIdentity(); | 484 if (is_almost_identity(srcToDst)) { |
489 csm = kGamut_ColorSpaceMatch; | 485 srcToDst.setIdentity(); |
| 486 csm = kGamut_ColorSpaceMatch; |
| 487 } |
490 } | 488 } |
491 | 489 |
492 switch (csm) { | 490 switch (csm) { |
493 case kNone_ColorSpaceMatch: | 491 case kNone_ColorSpaceMatch: |
494 switch (as_CSB(dstSpace)->gammaNamed()) { | 492 switch (as_CSB(dstSpace)->gammaNamed()) { |
495 case kSRGB_SkGammaNamed: | 493 case kSRGB_SkGammaNamed: |
496 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base | 494 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXf
orm_Base |
497 <kSRGB_SkGammaNamed, kNone_ColorSpaceMatch> | 495 <kSRGB_SkGammaNamed, kNone_ColorSpaceMatch> |
498 (srcSpace, srcToDst, dstSpace)); | 496 (srcSpace, srcToDst, dstSpace)); |
499 case k2Dot2Curve_SkGammaNamed: | 497 case k2Dot2Curve_SkGammaNamed: |
(...skipping 704 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1204 SkASSERT(false); | 1202 SkASSERT(false); |
1205 return; | 1203 return; |
1206 } | 1204 } |
1207 } | 1205 } |
1208 | 1206 |
1209 std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(const sk_sp<SkColorSpace>&
space) { | 1207 std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(const sk_sp<SkColorSpace>&
space) { |
1210 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base | 1208 return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
1211 <kNonStandard_SkGammaNamed, kNone_ColorSpaceMatch> | 1209 <kNonStandard_SkGammaNamed, kNone_ColorSpaceMatch> |
1212 (space, SkMatrix::I(), space)); | 1210 (space, SkMatrix::I(), space)); |
1213 } | 1211 } |
OLD | NEW |