Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/core/SkColorSpace.cpp

Issue 2000713003: Add SkColorSpace to SkImageInfo (Closed) Base URL: https://skia.googlesource.com/skia.git@public
Patch Set: Created 4 years, 7 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
« include/core/SkImageInfo.h ('K') | « src/codec/SkCodec.cpp ('k') | no next file » | 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 "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
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
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 }
OLDNEW
« include/core/SkImageInfo.h ('K') | « src/codec/SkCodec.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698