| 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 "SkColorSpacePriv.h" | 9 #include "SkColorSpacePriv.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(sk_sp<SkGammas> gammas, const SkMatrix44& toXYZD50, N
amed named) | 18 SkColorSpace::SkColorSpace(sk_sp<SkGammas> gammas, const SkMatrix44& toXYZD50, N
amed named) |
| 19 : fGammas(gammas) | 19 : fGammas(gammas) |
| 20 , fGammaNamed(kNonStandard_GammaNamed) |
| 20 , fToXYZD50(toXYZD50) | 21 , fToXYZD50(toXYZD50) |
| 21 , fNamed(named) | 22 , fNamed(named) |
| 22 {} | 23 {} |
| 24 |
| 25 SkColorSpace::SkColorSpace(sk_sp<SkGammas> gammas, GammaNamed gammaNamed, |
| 26 const SkMatrix44& toXYZD50, Named named) |
| 27 : fGammas(gammas) |
| 28 , fGammaNamed(gammaNamed) |
| 29 , fToXYZD50(toXYZD50) |
| 30 , fNamed(named) |
| 31 {} |
| 23 | 32 |
| 24 SkColorSpace::SkColorSpace(SkColorLookUpTable* colorLUT, sk_sp<SkGammas> gammas, | 33 SkColorSpace::SkColorSpace(SkColorLookUpTable* colorLUT, sk_sp<SkGammas> gammas, |
| 25 const SkMatrix44& toXYZD50) | 34 const SkMatrix44& toXYZD50) |
| 26 : fColorLUT(colorLUT) | 35 : fColorLUT(colorLUT) |
| 27 , fGammas(gammas) | 36 , fGammas(gammas) |
| 37 , fGammaNamed(kNonStandard_GammaNamed) |
| 28 , fToXYZD50(toXYZD50) | 38 , fToXYZD50(toXYZD50) |
| 29 , fNamed(kUnknown_Named) | 39 , fNamed(kUnknown_Named) |
| 30 {} | 40 {} |
| 31 | 41 |
| 32 const float gSRGB_toXYZD50[] { | 42 const float gSRGB_toXYZD50[] { |
| 33 0.4358f, 0.2224f, 0.0139f, // * R | 43 0.4358f, 0.2224f, 0.0139f, // * R |
| 34 0.3853f, 0.7170f, 0.0971f, // * G | 44 0.3853f, 0.7170f, 0.0971f, // * G |
| 35 0.1430f, 0.0606f, 0.7139f, // * B | 45 0.1430f, 0.0606f, 0.7139f, // * B |
| 36 }; | 46 }; |
| 37 | 47 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 59 color_space_almost_equal(toXYZD50.getFloat(2, 2), standard[8]) && | 69 color_space_almost_equal(toXYZD50.getFloat(2, 2), standard[8]) && |
| 60 color_space_almost_equal(toXYZD50.getFloat(0, 3), 0.0f) && | 70 color_space_almost_equal(toXYZD50.getFloat(0, 3), 0.0f) && |
| 61 color_space_almost_equal(toXYZD50.getFloat(1, 3), 0.0f) && | 71 color_space_almost_equal(toXYZD50.getFloat(1, 3), 0.0f) && |
| 62 color_space_almost_equal(toXYZD50.getFloat(2, 3), 0.0f) && | 72 color_space_almost_equal(toXYZD50.getFloat(2, 3), 0.0f) && |
| 63 color_space_almost_equal(toXYZD50.getFloat(3, 0), 0.0f) && | 73 color_space_almost_equal(toXYZD50.getFloat(3, 0), 0.0f) && |
| 64 color_space_almost_equal(toXYZD50.getFloat(3, 1), 0.0f) && | 74 color_space_almost_equal(toXYZD50.getFloat(3, 1), 0.0f) && |
| 65 color_space_almost_equal(toXYZD50.getFloat(3, 2), 0.0f) && | 75 color_space_almost_equal(toXYZD50.getFloat(3, 2), 0.0f) && |
| 66 color_space_almost_equal(toXYZD50.getFloat(3, 3), 1.0f); | 76 color_space_almost_equal(toXYZD50.getFloat(3, 3), 1.0f); |
| 67 } | 77 } |
| 68 | 78 |
| 69 static SkOnce gStandardGammasOnce; | 79 static SkOnce gSRGBCurveGammasOnce; |
| 70 static SkGammas* gStandardGammas; | 80 static SkGammas* gSRGBCurveGammas; |
| 81 static SkOnce gLinearGammasOnce; |
| 82 static SkGammas* gLinearGammas; |
| 71 | 83 |
| 72 sk_sp<SkColorSpace> SkColorSpace::NewRGB(float gammaVals[3], const SkMatrix44& t
oXYZD50) { | 84 sk_sp<SkColorSpace> SkColorSpace::NewRGB(float gammaVals[3], const SkMatrix44& t
oXYZD50) { |
| 73 sk_sp<SkGammas> gammas = nullptr; | 85 sk_sp<SkGammas> gammas = nullptr; |
| 86 GammaNamed gammaNamed = kNonStandard_GammaNamed; |
| 74 | 87 |
| 75 // Check if we really have sRGB or Adobe RGB | 88 // Check if we really have sRGB or Adobe RGB |
| 76 if (color_space_almost_equal(2.2f, gammaVals[0]) && | 89 if (color_space_almost_equal(2.2f, gammaVals[0]) && |
| 77 color_space_almost_equal(2.2f, gammaVals[1]) && | 90 color_space_almost_equal(2.2f, gammaVals[1]) && |
| 78 color_space_almost_equal(2.2f, gammaVals[2])) | 91 color_space_almost_equal(2.2f, gammaVals[2])) |
| 79 { | 92 { |
| 80 gStandardGammasOnce([] { | 93 gSRGBCurveGammasOnce([] { |
| 81 gStandardGammas = new SkGammas(2.2f, 2.2f, 2.2f); | 94 gSRGBCurveGammas = new SkGammas(2.2f, 2.2f, 2.2f); |
| 82 }); | 95 }); |
| 83 gammas = sk_ref_sp(gStandardGammas); | 96 gammas = sk_ref_sp(gSRGBCurveGammas); |
| 97 gammaNamed = kSRGBCurve_GammaNamed; |
| 84 | 98 |
| 85 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { | 99 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { |
| 86 return SkColorSpace::NewNamed(kSRGB_Named); | 100 return SkColorSpace::NewNamed(kSRGB_Named); |
| 87 } else if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { | 101 } else if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { |
| 88 return SkColorSpace::NewNamed(kAdobeRGB_Named); | 102 return SkColorSpace::NewNamed(kAdobeRGB_Named); |
| 89 } | 103 } |
| 104 } else if (color_space_almost_equal(1.0f, gammaVals[0]) && |
| 105 color_space_almost_equal(1.0f, gammaVals[1]) && |
| 106 color_space_almost_equal(1.0f, gammaVals[2])) |
| 107 { |
| 108 gLinearGammasOnce([] { |
| 109 gLinearGammas = new SkGammas(1.0f, 1.0f, 1.0f); |
| 110 }); |
| 111 gammas = sk_ref_sp(gLinearGammas); |
| 112 gammaNamed = kLinear_GammaNamed; |
| 90 } | 113 } |
| 91 | 114 |
| 92 if (!gammas) { | 115 if (!gammas) { |
| 93 gammas = sk_sp<SkGammas>(new SkGammas(gammaVals[0], gammaVals[1], gammaV
als[2])); | 116 gammas = sk_sp<SkGammas>(new SkGammas(gammaVals[0], gammaVals[1], gammaV
als[2])); |
| 94 } | 117 } |
| 95 return sk_sp<SkColorSpace>(new SkColorSpace(gammas, toXYZD50, kUnknown_Named
)); | 118 return sk_sp<SkColorSpace>(new SkColorSpace(gammas, gammaNamed, toXYZD50, kU
nknown_Named)); |
| 96 } | 119 } |
| 97 | 120 |
| 98 sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { | 121 sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { |
| 99 static SkOnce sRGBOnce; | 122 static SkOnce sRGBOnce; |
| 100 static SkColorSpace* sRGB; | 123 static SkColorSpace* sRGB; |
| 101 static SkOnce adobeRGBOnce; | 124 static SkOnce adobeRGBOnce; |
| 102 static SkColorSpace* adobeRGB; | 125 static SkColorSpace* adobeRGB; |
| 103 | 126 |
| 104 switch (named) { | 127 switch (named) { |
| 105 case kSRGB_Named: { | 128 case kSRGB_Named: { |
| 106 gStandardGammasOnce([] { | 129 gSRGBCurveGammasOnce([] { |
| 107 gStandardGammas = new SkGammas(2.2f, 2.2f, 2.2f); | 130 gSRGBCurveGammas = new SkGammas(2.2f, 2.2f, 2.2f); |
| 108 }); | 131 }); |
| 109 | 132 |
| 110 sRGBOnce([] { | 133 sRGBOnce([] { |
| 111 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); | 134 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); |
| 112 srgbToxyzD50.set3x3ColMajorf(gSRGB_toXYZD50); | 135 srgbToxyzD50.set3x3ColMajorf(gSRGB_toXYZD50); |
| 113 sRGB = new SkColorSpace(sk_ref_sp(gStandardGammas), srgbToxyzD50
, kSRGB_Named); | 136 sRGB = new SkColorSpace(sk_ref_sp(gSRGBCurveGammas), kSRGBCurve_
GammaNamed, |
| 137 srgbToxyzD50, kSRGB_Named); |
| 114 }); | 138 }); |
| 115 return sk_ref_sp(sRGB); | 139 return sk_ref_sp(sRGB); |
| 116 } | 140 } |
| 117 case kAdobeRGB_Named: { | 141 case kAdobeRGB_Named: { |
| 118 gStandardGammasOnce([] { | 142 // Note that AdobeRGB has a very similar gamma curve to sRGB. |
| 119 gStandardGammas = new SkGammas(2.2f, 2.2f, 2.2f); | 143 gSRGBCurveGammasOnce([] { |
| 144 gSRGBCurveGammas = new SkGammas(2.2f, 2.2f, 2.2f); |
| 120 }); | 145 }); |
| 121 | 146 |
| 122 adobeRGBOnce([] { | 147 adobeRGBOnce([] { |
| 123 SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Construct
or); | 148 SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Construct
or); |
| 124 adobergbToxyzD50.set3x3ColMajorf(gAdobeRGB_toXYZD50); | 149 adobergbToxyzD50.set3x3ColMajorf(gAdobeRGB_toXYZD50); |
| 125 adobeRGB = new SkColorSpace(sk_ref_sp(gStandardGammas), adobergb
ToxyzD50, | 150 adobeRGB = new SkColorSpace(sk_ref_sp(gSRGBCurveGammas), kSRGBCu
rve_GammaNamed, |
| 126 kAdobeRGB_Named); | 151 adobergbToxyzD50, kAdobeRGB_Named); |
| 127 }); | 152 }); |
| 128 return sk_ref_sp(adobeRGB); | 153 return sk_ref_sp(adobeRGB); |
| 129 } | 154 } |
| 130 default: | 155 default: |
| 131 break; | 156 break; |
| 132 } | 157 } |
| 133 return nullptr; | 158 return nullptr; |
| 134 } | 159 } |
| 135 | 160 |
| 136 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 161 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| (...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 737 } | 762 } |
| 738 } | 763 } |
| 739 | 764 |
| 740 } | 765 } |
| 741 default: | 766 default: |
| 742 break; | 767 break; |
| 743 } | 768 } |
| 744 | 769 |
| 745 return_null("ICC profile contains unsupported colorspace"); | 770 return_null("ICC profile contains unsupported colorspace"); |
| 746 } | 771 } |
| OLD | NEW |