| 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 "SkOnce.h" | 10 #include "SkOnce.h" |
| 11 | 11 |
| 12 static bool color_space_almost_equal(float a, float b) { | 12 static bool color_space_almost_equal(float a, float b) { |
| 13 return SkTAbs(a - b) < 0.01f; | 13 return SkTAbs(a - b) < 0.01f; |
| 14 } | 14 } |
| 15 | 15 |
| 16 ////////////////////////////////////////////////////////////////////////////////
////////////////// | 16 ////////////////////////////////////////////////////////////////////////////////
////////////////// |
| 17 | 17 |
| 18 SkColorSpace::SkColorSpace(GammaNamed gammaNamed, const SkMatrix44& toXYZD50, Na
med named) | 18 SkColorSpace::SkColorSpace(GammaNamed gammaNamed, const SkMatrix44& toXYZD50, Na
med named) |
| 19 : fGammaNamed(kNonStandard_GammaNamed) | 19 : fGammaNamed(kNonStandard_GammaNamed) |
| 20 , fToXYZD50(toXYZD50) | 20 , fToXYZD50(toXYZD50) |
| 21 , fNamed(named) | 21 , fNamed(named) |
| 22 {} | 22 {} |
| 23 | 23 |
| 24 SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkGammas> gammas, const SkMatrix44& t
oXYZD50, | 24 SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkGammas> gammas, const SkMatrix44& t
oXYZD50, |
| 25 Named named) | 25 Named named) |
| 26 : INHERITED(kNonStandard_GammaNamed, toXYZD50, named) | 26 : INHERITED(kNonStandard_GammaNamed, toXYZD50, named) |
| 27 , fGammas(gammas) | 27 , fGammas(std::move(gammas)) |
| 28 {} | 28 {} |
| 29 | 29 |
| 30 SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkGammas> gammas, GammaNamed gammaNam
ed, | 30 SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkGammas> gammas, GammaNamed gammaNam
ed, |
| 31 const SkMatrix44& toXYZD50, Named named) | 31 const SkMatrix44& toXYZD50, Named named) |
| 32 : INHERITED(gammaNamed, toXYZD50, named) | 32 : INHERITED(gammaNamed, toXYZD50, named) |
| 33 , fGammas(gammas) | 33 , fGammas(std::move(gammas)) |
| 34 {} | 34 {} |
| 35 | 35 |
| 36 SkColorSpace_Base::SkColorSpace_Base(SkColorLookUpTable* colorLUT, sk_sp<SkGamma
s> gammas, | 36 SkColorSpace_Base::SkColorSpace_Base(SkColorLookUpTable* colorLUT, sk_sp<SkGamma
s> gammas, |
| 37 const SkMatrix44& toXYZD50) | 37 const SkMatrix44& toXYZD50) |
| 38 : INHERITED(kNonStandard_GammaNamed, toXYZD50, kUnknown_Named) | 38 : INHERITED(kNonStandard_GammaNamed, toXYZD50, kUnknown_Named) |
| 39 , fColorLUT(colorLUT) | 39 , fColorLUT(colorLUT) |
| 40 , fGammas(gammas) | 40 , fGammas(std::move(gammas)) |
| 41 {} | 41 {} |
| 42 | 42 |
| 43 const float gSRGB_toXYZD50[] { | 43 const float gSRGB_toXYZD50[] { |
| 44 0.4358f, 0.2224f, 0.0139f, // * R | 44 0.4358f, 0.2224f, 0.0139f, // * R |
| 45 0.3853f, 0.7170f, 0.0971f, // * G | 45 0.3853f, 0.7170f, 0.0971f, // * G |
| 46 0.1430f, 0.0606f, 0.7139f, // * B | 46 0.1430f, 0.0606f, 0.7139f, // * B |
| 47 }; | 47 }; |
| 48 | 48 |
| 49 const float gAdobeRGB_toXYZD50[] { | 49 const float gAdobeRGB_toXYZD50[] { |
| 50 0.6098f, 0.3111f, 0.0195f, // * R | 50 0.6098f, 0.3111f, 0.0195f, // * R |
| (...skipping 24 matching lines...) Expand all Loading... |
| 75 color_space_almost_equal(toXYZD50.getFloat(3, 1), 0.0f) && | 75 color_space_almost_equal(toXYZD50.getFloat(3, 1), 0.0f) && |
| 76 color_space_almost_equal(toXYZD50.getFloat(3, 2), 0.0f) && | 76 color_space_almost_equal(toXYZD50.getFloat(3, 2), 0.0f) && |
| 77 color_space_almost_equal(toXYZD50.getFloat(3, 3), 1.0f); | 77 color_space_almost_equal(toXYZD50.getFloat(3, 3), 1.0f); |
| 78 } | 78 } |
| 79 | 79 |
| 80 static SkOnce g2Dot2CurveGammasOnce; | 80 static SkOnce g2Dot2CurveGammasOnce; |
| 81 static SkGammas* g2Dot2CurveGammas; | 81 static SkGammas* g2Dot2CurveGammas; |
| 82 static SkOnce gLinearGammasOnce; | 82 static SkOnce gLinearGammasOnce; |
| 83 static SkGammas* gLinearGammas; | 83 static SkGammas* gLinearGammas; |
| 84 | 84 |
| 85 sk_sp<SkColorSpace> SkColorSpace::NewRGB(float gammaVals[3], const SkMatrix44& t
oXYZD50) { | 85 sk_sp<SkColorSpace> SkColorSpace::NewRGB(const float gammaVals[3], const SkMatri
x44& toXYZD50) { |
| 86 sk_sp<SkGammas> gammas = nullptr; | 86 sk_sp<SkGammas> gammas = nullptr; |
| 87 GammaNamed gammaNamed = kNonStandard_GammaNamed; | 87 GammaNamed gammaNamed = kNonStandard_GammaNamed; |
| 88 | 88 |
| 89 // Check if we really have sRGB or Adobe RGB | 89 // Check if we really have sRGB or Adobe RGB |
| 90 if (color_space_almost_equal(2.2f, gammaVals[0]) && | 90 if (color_space_almost_equal(2.2f, gammaVals[0]) && |
| 91 color_space_almost_equal(2.2f, gammaVals[1]) && | 91 color_space_almost_equal(2.2f, gammaVals[1]) && |
| 92 color_space_almost_equal(2.2f, gammaVals[2])) | 92 color_space_almost_equal(2.2f, gammaVals[2])) |
| 93 { | 93 { |
| 94 g2Dot2CurveGammasOnce([] { | 94 g2Dot2CurveGammasOnce([] { |
| 95 g2Dot2CurveGammas = new SkGammas(2.2f, 2.2f, 2.2f); | 95 g2Dot2CurveGammas = new SkGammas(2.2f, 2.2f, 2.2f); |
| (...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 788 mat.set3x3ColMajorf(toXYZ); | 788 mat.set3x3ColMajorf(toXYZ); |
| 789 if (gammas->isValues()) { | 789 if (gammas->isValues()) { |
| 790 // When we have values, take advantage of the NewFromRGB ini
tializer. | 790 // When we have values, take advantage of the NewFromRGB ini
tializer. |
| 791 // This allows us to check for canonical sRGB and Adobe RGB. | 791 // This allows us to check for canonical sRGB and Adobe RGB. |
| 792 float gammaVals[3]; | 792 float gammaVals[3]; |
| 793 gammaVals[0] = gammas->fRed.fValue; | 793 gammaVals[0] = gammas->fRed.fValue; |
| 794 gammaVals[1] = gammas->fGreen.fValue; | 794 gammaVals[1] = gammas->fGreen.fValue; |
| 795 gammaVals[2] = gammas->fBlue.fValue; | 795 gammaVals[2] = gammas->fBlue.fValue; |
| 796 return SkColorSpace::NewRGB(gammaVals, mat); | 796 return SkColorSpace::NewRGB(gammaVals, mat); |
| 797 } else { | 797 } else { |
| 798 return sk_sp<SkColorSpace>(new SkColorSpace_Base(gammas, mat
, kUnknown_Named)); | 798 return sk_sp<SkColorSpace>(new SkColorSpace_Base(std::move(g
ammas), mat, |
| 799 kUnknown_Na
med)); |
| 799 } | 800 } |
| 800 } | 801 } |
| 801 | 802 |
| 802 // Recognize color profile specified by A2B0 tag. | 803 // Recognize color profile specified by A2B0 tag. |
| 803 const ICCTag* a2b0 = ICCTag::Find(tags.get(), tagCount, kTAG_A2B0); | 804 const ICCTag* a2b0 = ICCTag::Find(tags.get(), tagCount, kTAG_A2B0); |
| 804 if (a2b0) { | 805 if (a2b0) { |
| 805 SkAutoTDelete<SkColorLookUpTable> colorLUT(new SkColorLookUpTabl
e()); | 806 SkAutoTDelete<SkColorLookUpTable> colorLUT(new SkColorLookUpTabl
e()); |
| 806 SkGammaCurve curves[3]; | 807 SkGammaCurve curves[3]; |
| 807 SkMatrix44 toXYZ(SkMatrix44::kUninitialized_Constructor); | 808 SkMatrix44 toXYZ(SkMatrix44::kUninitialized_Constructor); |
| 808 if (!load_a2b0(colorLUT, curves, &toXYZ, a2b0->addr((const uint8
_t*) base), | 809 if (!load_a2b0(colorLUT, curves, &toXYZ, a2b0->addr((const uint8
_t*) base), |
| 809 a2b0->fLength)) { | 810 a2b0->fLength)) { |
| 810 return_null("Failed to parse A2B0 tag"); | 811 return_null("Failed to parse A2B0 tag"); |
| 811 } | 812 } |
| 812 | 813 |
| 813 sk_sp<SkGammas> gammas(new SkGammas(std::move(curves[0]), std::m
ove(curves[1]), | 814 sk_sp<SkGammas> gammas(new SkGammas(std::move(curves[0]), std::m
ove(curves[1]), |
| 814 std::move(curves[2]))); | 815 std::move(curves[2]))); |
| 815 if (colorLUT->fTable) { | 816 if (colorLUT->fTable) { |
| 816 return sk_sp<SkColorSpace>(new SkColorSpace_Base(colorLUT.re
lease(), gammas, | 817 return sk_sp<SkColorSpace>(new SkColorSpace_Base(colorLUT.re
lease(), |
| 817 toXYZ)); | 818 std::move(g
ammas), toXYZ)); |
| 818 } else if (gammas->isValues()) { | 819 } else if (gammas->isValues()) { |
| 819 // When we have values, take advantage of the NewFromRGB ini
tializer. | 820 // When we have values, take advantage of the NewFromRGB ini
tializer. |
| 820 // This allows us to check for canonical sRGB and Adobe RGB. | 821 // This allows us to check for canonical sRGB and Adobe RGB. |
| 821 float gammaVals[3]; | 822 float gammaVals[3]; |
| 822 gammaVals[0] = gammas->fRed.fValue; | 823 gammaVals[0] = gammas->fRed.fValue; |
| 823 gammaVals[1] = gammas->fGreen.fValue; | 824 gammaVals[1] = gammas->fGreen.fValue; |
| 824 gammaVals[2] = gammas->fBlue.fValue; | 825 gammaVals[2] = gammas->fBlue.fValue; |
| 825 return SkColorSpace::NewRGB(gammaVals, toXYZ); | 826 return SkColorSpace::NewRGB(gammaVals, toXYZ); |
| 826 } else { | 827 } else { |
| 827 return sk_sp<SkColorSpace>(new SkColorSpace_Base(gammas, toX
YZ, | 828 return sk_sp<SkColorSpace>(new SkColorSpace_Base(std::move(g
ammas), toXYZ, |
| 828 kUnknown_Na
med)); | 829 kUnknown_Na
med)); |
| 829 } | 830 } |
| 830 } | 831 } |
| 831 | |
| 832 } | 832 } |
| 833 default: | 833 default: |
| 834 break; | 834 break; |
| 835 } | 835 } |
| 836 | 836 |
| 837 return_null("ICC profile contains unsupported colorspace"); | 837 return_null("ICC profile contains unsupported colorspace"); |
| 838 } | 838 } |
| OLD | NEW |