Chromium Code Reviews| 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 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 106 case kSRGB_SkGammaNamed: | 106 case kSRGB_SkGammaNamed: |
| 107 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { | 107 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { |
| 108 return SkColorSpace::NewNamed(kSRGB_Named); | 108 return SkColorSpace::NewNamed(kSRGB_Named); |
| 109 } | 109 } |
| 110 break; | 110 break; |
| 111 case k2Dot2Curve_SkGammaNamed: | 111 case k2Dot2Curve_SkGammaNamed: |
| 112 if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { | 112 if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { |
| 113 return SkColorSpace::NewNamed(kAdobeRGB_Named); | 113 return SkColorSpace::NewNamed(kAdobeRGB_Named); |
| 114 } | 114 } |
| 115 break; | 115 break; |
| 116 case kLinear_SkGammaNamed: | |
| 117 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { | |
| 118 return SkColorSpace::NewNamed(kSRGBLinear_Named); | |
| 119 } | |
| 120 break; | |
| 116 case kNonStandard_SkGammaNamed: | 121 case kNonStandard_SkGammaNamed: |
| 117 // This is not allowed. | 122 // This is not allowed. |
| 118 return nullptr; | 123 return nullptr; |
| 119 default: | 124 default: |
| 120 break; | 125 break; |
| 121 } | 126 } |
| 122 | 127 |
| 123 return sk_sp<SkColorSpace>(new SkColorSpace_Base(gammaNamed, toXYZD50)); | 128 return sk_sp<SkColorSpace>(new SkColorSpace_Base(gammaNamed, toXYZD50)); |
| 124 } | 129 } |
| 125 | 130 |
| 126 sk_sp<SkColorSpace> SkColorSpace::NewRGB(RenderTargetGamma gamma, const SkMatrix 44& toXYZD50) { | 131 sk_sp<SkColorSpace> SkColorSpace::NewRGB(RenderTargetGamma gamma, const SkMatrix 44& toXYZD50) { |
| 127 switch (gamma) { | 132 switch (gamma) { |
| 128 case kLinear_RenderTargetGamma: | 133 case kLinear_RenderTargetGamma: |
| 129 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, toXYZD50); | 134 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, toXYZD50); |
| 130 case kSRGB_RenderTargetGamma: | 135 case kSRGB_RenderTargetGamma: |
| 131 return SkColorSpace_Base::NewRGB(kSRGB_SkGammaNamed, toXYZD50); | 136 return SkColorSpace_Base::NewRGB(kSRGB_SkGammaNamed, toXYZD50); |
| 132 default: | 137 default: |
| 133 return nullptr; | 138 return nullptr; |
| 134 } | 139 } |
| 135 } | 140 } |
| 136 | 141 |
| 137 static SkColorSpace* gAdobeRGB; | 142 static SkColorSpace* gAdobeRGB; |
| 138 static SkColorSpace* gSRGB; | 143 static SkColorSpace* gSRGB; |
| 144 static SkColorSpace* gSRGBLinear; | |
| 139 | 145 |
| 140 sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { | 146 sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { |
| 141 static SkOnce sRGBOnce; | 147 static SkOnce sRGBOnce; |
| 142 static SkOnce adobeRGBOnce; | 148 static SkOnce adobeRGBOnce; |
| 149 static SkOnce sRGBLinearOnce; | |
| 143 | 150 |
| 144 switch (named) { | 151 switch (named) { |
| 145 case kSRGB_Named: { | 152 case kSRGB_Named: { |
| 146 sRGBOnce([] { | 153 sRGBOnce([] { |
| 147 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); | 154 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); |
| 148 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); | 155 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); |
| 149 | 156 |
| 150 // Force the mutable type mask to be computed. This avoids race s. | 157 // Force the mutable type mask to be computed. This avoids race s. |
| 151 (void)srgbToxyzD50.getType(); | 158 (void)srgbToxyzD50.getType(); |
| 152 gSRGB = new SkColorSpace_Base(kSRGB_SkGammaNamed, srgbToxyzD50); | 159 gSRGB = new SkColorSpace_Base(kSRGB_SkGammaNamed, srgbToxyzD50); |
| 153 }); | 160 }); |
| 154 return sk_ref_sp<SkColorSpace>(gSRGB); | 161 return sk_ref_sp<SkColorSpace>(gSRGB); |
| 155 } | 162 } |
| 156 case kAdobeRGB_Named: { | 163 case kAdobeRGB_Named: { |
| 157 adobeRGBOnce([] { | 164 adobeRGBOnce([] { |
| 158 SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Construct or); | 165 SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Construct or); |
| 159 adobergbToxyzD50.set3x3RowMajorf(gAdobeRGB_toXYZD50); | 166 adobergbToxyzD50.set3x3RowMajorf(gAdobeRGB_toXYZD50); |
| 160 | 167 |
| 161 // Force the mutable type mask to be computed. This avoids race s. | 168 // Force the mutable type mask to be computed. This avoids race s. |
| 162 (void)adobergbToxyzD50.getType(); | 169 (void)adobergbToxyzD50.getType(); |
| 163 gAdobeRGB = new SkColorSpace_Base(k2Dot2Curve_SkGammaNamed, adob ergbToxyzD50); | 170 gAdobeRGB = new SkColorSpace_Base(k2Dot2Curve_SkGammaNamed, adob ergbToxyzD50); |
| 164 }); | 171 }); |
| 165 return sk_ref_sp<SkColorSpace>(gAdobeRGB); | 172 return sk_ref_sp<SkColorSpace>(gAdobeRGB); |
| 166 } | 173 } |
| 174 case kSRGBLinear_Named: { | |
| 175 sRGBLinearOnce([] { | |
| 176 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); | |
| 177 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); | |
| 178 | |
| 179 // Force the mutable type mask to be computed. This avoids race s. | |
| 180 (void)srgbToxyzD50.getType(); | |
| 181 gSRGBLinear = new SkColorSpace_Base(kLinear_SkGammaNamed, srgbTo xyzD50); | |
| 182 }); | |
| 183 return sk_ref_sp<SkColorSpace>(gSRGBLinear); | |
| 184 } | |
| 167 default: | 185 default: |
| 168 break; | 186 break; |
| 169 } | 187 } |
| 170 return nullptr; | 188 return nullptr; |
| 171 } | 189 } |
| 172 | 190 |
| 173 sk_sp<SkColorSpace> SkColorSpace::makeLinearGamma() { | 191 sk_sp<SkColorSpace> SkColorSpace::makeLinearGamma() { |
| 174 if (this->gammaIsLinear()) { | 192 if (this->gammaIsLinear()) { |
| 175 return sk_ref_sp(this); | 193 return sk_ref_sp(this); |
| 176 } | 194 } |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 266 ColorSpaceHeader::Pack(k0_Version, kSRGB_Named, | 284 ColorSpaceHeader::Pack(k0_Version, kSRGB_Named, |
| 267 as_CSB(this)->fGammaNamed, 0); | 285 as_CSB(this)->fGammaNamed, 0); |
| 268 } | 286 } |
| 269 return sizeof(ColorSpaceHeader); | 287 return sizeof(ColorSpaceHeader); |
| 270 } else if (this == gAdobeRGB) { | 288 } else if (this == gAdobeRGB) { |
| 271 if (memory) { | 289 if (memory) { |
| 272 *((ColorSpaceHeader*) memory) = | 290 *((ColorSpaceHeader*) memory) = |
| 273 ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named, | 291 ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named, |
| 274 as_CSB(this)->fGammaNamed, 0); | 292 as_CSB(this)->fGammaNamed, 0); |
| 275 } | 293 } |
| 294 return sizeof(ColorSpaceHeader); | |
|
Brian Osman
2016/09/27 20:49:49
Unrelated bug fix. (Discovered this while making t
msarett
2016/09/27 20:53:52
+1
| |
| 295 } else if (this == gSRGBLinear) { | |
| 296 if (memory) { | |
| 297 *((ColorSpaceHeader*)memory) = | |
| 298 ColorSpaceHeader::Pack(k0_Version, kSRGBLinear_Named, | |
| 299 as_CSB(this)->fGammaNamed, 0); | |
| 300 } | |
| 301 return sizeof(ColorSpaceHeader); | |
| 276 } | 302 } |
| 277 | 303 |
| 278 // If we have a named gamma, write the enum and the matrix. | 304 // If we have a named gamma, write the enum and the matrix. |
| 279 switch (as_CSB(this)->fGammaNamed) { | 305 switch (as_CSB(this)->fGammaNamed) { |
| 280 case kSRGB_SkGammaNamed: | 306 case kSRGB_SkGammaNamed: |
| 281 case k2Dot2Curve_SkGammaNamed: | 307 case k2Dot2Curve_SkGammaNamed: |
| 282 case kLinear_SkGammaNamed: { | 308 case kLinear_SkGammaNamed: { |
| 283 if (memory) { | 309 if (memory) { |
| 284 *((ColorSpaceHeader*) memory) = | 310 *((ColorSpaceHeader*) memory) = |
| 285 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)-> fGammaNamed, | 311 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)-> fGammaNamed, |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 441 return false; | 467 return false; |
| 442 } | 468 } |
| 443 | 469 |
| 444 // It is unlikely that we will reach this case. | 470 // It is unlikely that we will reach this case. |
| 445 sk_sp<SkData> srcData = src->serialize(); | 471 sk_sp<SkData> srcData = src->serialize(); |
| 446 sk_sp<SkData> dstData = dst->serialize(); | 472 sk_sp<SkData> dstData = dst->serialize(); |
| 447 return srcData->size() == dstData->size() && | 473 return srcData->size() == dstData->size() && |
| 448 0 == memcmp(srcData->data(), dstData->data(), srcData->size() ); | 474 0 == memcmp(srcData->data(), dstData->data(), srcData->size() ); |
| 449 } | 475 } |
| 450 } | 476 } |
| OLD | NEW |