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 "SkColorSpace_A2B0.h" | |
| 11 #include "SkColorSpace_XYZTRC.h" | |
| 10 #include "SkColorSpacePriv.h" | 12 #include "SkColorSpacePriv.h" |
| 11 #include "SkOnce.h" | 13 #include "SkOnce.h" |
| 12 | 14 |
| 13 SkColorSpace_Base::SkColorSpace_Base(SkGammaNamed gammaNamed, const SkMatrix44& toXYZD50) | 15 SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkData> profileData) |
| 14 : fGammaNamed(gammaNamed) | 16 : fProfileData(std::move(profileData)) |
| 15 , fGammas(nullptr) | |
| 16 , fProfileData(nullptr) | |
| 17 , fToXYZD50(toXYZD50) | |
| 18 , fFromXYZD50(SkMatrix44::kUninitialized_Constructor) | |
| 19 {} | |
| 20 | |
| 21 SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkColorLookUpTable> colorLUT, SkGamma Named gammaNamed, | |
| 22 sk_sp<SkGammas> gammas, const SkMatrix44& t oXYZD50, | |
| 23 sk_sp<SkData> profileData) | |
| 24 : fColorLUT(std::move(colorLUT)) | |
| 25 , fGammaNamed(gammaNamed) | |
| 26 , fGammas(std::move(gammas)) | |
| 27 , fProfileData(std::move(profileData)) | |
| 28 , fToXYZD50(toXYZD50) | |
| 29 , fFromXYZD50(SkMatrix44::kUninitialized_Constructor) | |
| 30 {} | 17 {} |
| 31 | 18 |
| 32 static constexpr float gSRGB_toXYZD50[] { | 19 static constexpr float gSRGB_toXYZD50[] { |
| 33 0.4358f, 0.3853f, 0.1430f, // Rx, Gx, Bx | 20 0.4358f, 0.3853f, 0.1430f, // Rx, Gx, Bx |
| 34 0.2224f, 0.7170f, 0.0606f, // Ry, Gy, Gz | 21 0.2224f, 0.7170f, 0.0606f, // Ry, Gy, Gz |
| 35 0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz | 22 0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz |
| 36 }; | 23 }; |
| 37 | 24 |
| 38 static constexpr float gAdobeRGB_toXYZD50[] { | 25 static constexpr float gAdobeRGB_toXYZD50[] { |
| 39 0.6098f, 0.2052f, 0.1492f, // Rx, Gx, Bx | 26 0.6098f, 0.2052f, 0.1492f, // Rx, Gx, Bx |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 83 } | 70 } |
| 84 | 71 |
| 85 if (kNonStandard_SkGammaNamed == gammaNamed) { | 72 if (kNonStandard_SkGammaNamed == gammaNamed) { |
| 86 sk_sp<SkGammas> gammas = sk_sp<SkGammas>(new SkGammas()); | 73 sk_sp<SkGammas> gammas = sk_sp<SkGammas>(new SkGammas()); |
| 87 gammas->fRedType = SkGammas::Type::kValue_Type; | 74 gammas->fRedType = SkGammas::Type::kValue_Type; |
| 88 gammas->fGreenType = SkGammas::Type::kValue_Type; | 75 gammas->fGreenType = SkGammas::Type::kValue_Type; |
| 89 gammas->fBlueType = SkGammas::Type::kValue_Type; | 76 gammas->fBlueType = SkGammas::Type::kValue_Type; |
| 90 gammas->fRedData.fValue = values[0]; | 77 gammas->fRedData.fValue = values[0]; |
| 91 gammas->fGreenData.fValue = values[1]; | 78 gammas->fGreenData.fValue = values[1]; |
| 92 gammas->fBlueData.fValue = values[2]; | 79 gammas->fBlueData.fValue = values[2]; |
| 93 return sk_sp<SkColorSpace>(new SkColorSpace_Base(nullptr, kNonStandard_S kGammaNamed, gammas, | 80 return sk_sp<SkColorSpace>(new SkColorSpace_XYZTRC(kNonStandard_SkGammaN amed, |
| 94 toXYZD50, nullptr)); | 81 gammas, toXYZD50, nul lptr)); |
| 95 } | 82 } |
| 96 | 83 |
| 97 return SkColorSpace_Base::NewRGB(gammaNamed, toXYZD50); | 84 return SkColorSpace_Base::NewRGB(gammaNamed, toXYZD50); |
| 98 } | 85 } |
| 99 | 86 |
| 100 sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(SkGammaNamed gammaNamed, const SkM atrix44& toXYZD50) { | 87 sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(SkGammaNamed gammaNamed, const SkM atrix44& toXYZD50) { |
| 101 switch (gammaNamed) { | 88 switch (gammaNamed) { |
| 102 case kSRGB_SkGammaNamed: | 89 case kSRGB_SkGammaNamed: |
| 103 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { | 90 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { |
| 104 return SkColorSpace::NewNamed(kSRGB_Named); | 91 return SkColorSpace::NewNamed(kSRGB_Named); |
| 105 } | 92 } |
| 106 break; | 93 break; |
| 107 case k2Dot2Curve_SkGammaNamed: | 94 case k2Dot2Curve_SkGammaNamed: |
| 108 if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { | 95 if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { |
| 109 return SkColorSpace::NewNamed(kAdobeRGB_Named); | 96 return SkColorSpace::NewNamed(kAdobeRGB_Named); |
| 110 } | 97 } |
| 111 break; | 98 break; |
| 112 case kLinear_SkGammaNamed: | 99 case kLinear_SkGammaNamed: |
| 113 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { | 100 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { |
| 114 return SkColorSpace::NewNamed(kSRGBLinear_Named); | 101 return SkColorSpace::NewNamed(kSRGBLinear_Named); |
| 115 } | 102 } |
| 116 break; | 103 break; |
| 117 case kNonStandard_SkGammaNamed: | 104 case kNonStandard_SkGammaNamed: |
| 118 // This is not allowed. | 105 // This is not allowed. |
| 119 return nullptr; | 106 return nullptr; |
| 120 default: | 107 default: |
| 121 break; | 108 break; |
| 122 } | 109 } |
| 123 | 110 |
| 124 return sk_sp<SkColorSpace>(new SkColorSpace_Base(gammaNamed, toXYZD50)); | 111 return sk_sp<SkColorSpace>(new SkColorSpace_XYZTRC(gammaNamed, toXYZD50)); |
| 125 } | 112 } |
| 126 | 113 |
| 127 sk_sp<SkColorSpace> SkColorSpace::NewRGB(RenderTargetGamma gamma, const SkMatrix 44& toXYZD50) { | 114 sk_sp<SkColorSpace> SkColorSpace::NewRGB(RenderTargetGamma gamma, const SkMatrix 44& toXYZD50) { |
| 128 switch (gamma) { | 115 switch (gamma) { |
| 129 case kLinear_RenderTargetGamma: | 116 case kLinear_RenderTargetGamma: |
| 130 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, toXYZD50); | 117 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, toXYZD50); |
| 131 case kSRGB_RenderTargetGamma: | 118 case kSRGB_RenderTargetGamma: |
| 132 return SkColorSpace_Base::NewRGB(kSRGB_SkGammaNamed, toXYZD50); | 119 return SkColorSpace_Base::NewRGB(kSRGB_SkGammaNamed, toXYZD50); |
| 133 default: | 120 default: |
| 134 return nullptr; | 121 return nullptr; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 145 static SkOnce sRGBLinearOnce; | 132 static SkOnce sRGBLinearOnce; |
| 146 | 133 |
| 147 switch (named) { | 134 switch (named) { |
| 148 case kSRGB_Named: { | 135 case kSRGB_Named: { |
| 149 sRGBOnce([] { | 136 sRGBOnce([] { |
| 150 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); | 137 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); |
| 151 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); | 138 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); |
| 152 | 139 |
| 153 // Force the mutable type mask to be computed. This avoids race s. | 140 // Force the mutable type mask to be computed. This avoids race s. |
| 154 (void)srgbToxyzD50.getType(); | 141 (void)srgbToxyzD50.getType(); |
| 155 gSRGB = new SkColorSpace_Base(kSRGB_SkGammaNamed, srgbToxyzD50); | 142 gSRGB = new SkColorSpace_XYZTRC(kSRGB_SkGammaNamed, srgbToxyzD50 ); |
| 156 }); | 143 }); |
| 157 return sk_ref_sp<SkColorSpace>(gSRGB); | 144 return sk_ref_sp<SkColorSpace>(gSRGB); |
| 158 } | 145 } |
| 159 case kAdobeRGB_Named: { | 146 case kAdobeRGB_Named: { |
| 160 adobeRGBOnce([] { | 147 adobeRGBOnce([] { |
| 161 SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Construct or); | 148 SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Construct or); |
| 162 adobergbToxyzD50.set3x3RowMajorf(gAdobeRGB_toXYZD50); | 149 adobergbToxyzD50.set3x3RowMajorf(gAdobeRGB_toXYZD50); |
| 163 | 150 |
| 164 // Force the mutable type mask to be computed. This avoids race s. | 151 // Force the mutable type mask to be computed. This avoids race s. |
| 165 (void)adobergbToxyzD50.getType(); | 152 (void)adobergbToxyzD50.getType(); |
| 166 gAdobeRGB = new SkColorSpace_Base(k2Dot2Curve_SkGammaNamed, adob ergbToxyzD50); | 153 gAdobeRGB = new SkColorSpace_XYZTRC(k2Dot2Curve_SkGammaNamed, ad obergbToxyzD50); |
| 167 }); | 154 }); |
| 168 return sk_ref_sp<SkColorSpace>(gAdobeRGB); | 155 return sk_ref_sp<SkColorSpace>(gAdobeRGB); |
| 169 } | 156 } |
| 170 case kSRGBLinear_Named: { | 157 case kSRGBLinear_Named: { |
| 171 sRGBLinearOnce([] { | 158 sRGBLinearOnce([] { |
| 172 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); | 159 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); |
| 173 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); | 160 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); |
| 174 | 161 |
| 175 // Force the mutable type mask to be computed. This avoids race s. | 162 // Force the mutable type mask to be computed. This avoids race s. |
| 176 (void)srgbToxyzD50.getType(); | 163 (void)srgbToxyzD50.getType(); |
| 177 gSRGBLinear = new SkColorSpace_Base(kLinear_SkGammaNamed, srgbTo xyzD50); | 164 gSRGBLinear = new SkColorSpace_XYZTRC(kLinear_SkGammaNamed, srgb ToxyzD50); |
| 178 }); | 165 }); |
| 179 return sk_ref_sp<SkColorSpace>(gSRGBLinear); | 166 return sk_ref_sp<SkColorSpace>(gSRGBLinear); |
| 180 } | 167 } |
| 181 default: | 168 default: |
| 182 break; | 169 break; |
| 183 } | 170 } |
| 184 return nullptr; | 171 return nullptr; |
| 185 } | 172 } |
| 186 | 173 |
| 187 sk_sp<SkColorSpace> SkColorSpace::makeLinearGamma() { | 174 sk_sp<SkColorSpace> SkColorSpace::makeLinearGamma() { |
| 188 if (this->gammaIsLinear()) { | 175 return as_CSB(this)->makeLinearGammaImpl(); |
| 189 return sk_ref_sp(this); | |
| 190 } | |
| 191 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, as_CSB(this)->fToXYZD 50); | |
| 192 } | 176 } |
| 193 | 177 |
| 194 //////////////////////////////////////////////////////////////////////////////// /////////////////// | 178 //////////////////////////////////////////////////////////////////////////////// /////////////////// |
| 195 | 179 |
| 196 bool SkColorSpace::gammaCloseToSRGB() const { | 180 bool SkColorSpace::gammaCloseToSRGB() const { |
| 197 return kSRGB_SkGammaNamed == as_CSB(this)->fGammaNamed || | 181 return as_CSB(this)->gammaCloseToSRGBImpl(); |
| 198 k2Dot2Curve_SkGammaNamed == as_CSB(this)->fGammaNamed; | |
| 199 } | 182 } |
| 200 | 183 |
| 201 bool SkColorSpace::gammaIsLinear() const { | 184 bool SkColorSpace::gammaIsLinear() const { |
| 202 return kLinear_SkGammaNamed == as_CSB(this)->fGammaNamed; | 185 return as_CSB(this)->gammaIsLinearImpl(); |
| 203 } | |
| 204 | |
| 205 const SkMatrix44& SkColorSpace_Base::fromXYZD50() const { | |
| 206 fFromXYZOnce([this] { | |
| 207 if (!fToXYZD50.invert(&fFromXYZD50)) { | |
| 208 // If a client gives us a dst gamut with a transform that we can't i nvert, we will | |
| 209 // simply give them back a transform to sRGB gamut. | |
| 210 SkDEBUGFAIL("Non-invertible XYZ matrix, defaulting to sRGB"); | |
| 211 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); | |
| 212 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); | |
| 213 srgbToxyzD50.invert(&fFromXYZD50); | |
| 214 } | |
| 215 }); | |
| 216 return fFromXYZD50; | |
| 217 } | 186 } |
| 218 | 187 |
| 219 //////////////////////////////////////////////////////////////////////////////// /////////////////// | 188 //////////////////////////////////////////////////////////////////////////////// /////////////////// |
| 220 | 189 |
| 221 enum Version { | 190 enum Version { |
| 222 k0_Version, // Initial version, header + flags for matrix and profile | 191 k0_Version, // Initial version, header + flags for matrix and profile |
| 223 }; | 192 }; |
| 224 | 193 |
| 225 struct ColorSpaceHeader { | 194 struct ColorSpaceHeader { |
| 226 /** | 195 /** |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 266 uint8_t fVersion; // Always zero | 235 uint8_t fVersion; // Always zero |
| 267 uint8_t fNamed; // Must be a SkColorSpace::Named | 236 uint8_t fNamed; // Must be a SkColorSpace::Named |
| 268 uint8_t fGammaNamed; // Must be a SkGammaNamed | 237 uint8_t fGammaNamed; // Must be a SkGammaNamed |
| 269 uint8_t fFlags; // Some combination of the flags listed above | 238 uint8_t fFlags; // Some combination of the flags listed above |
| 270 }; | 239 }; |
| 271 | 240 |
| 272 size_t SkColorSpace::writeToMemory(void* memory) const { | 241 size_t SkColorSpace::writeToMemory(void* memory) const { |
| 273 // Start by trying the serialization fast path. If we haven't saved ICC pro file data, | 242 // Start by trying the serialization fast path. If we haven't saved ICC pro file data, |
| 274 // we must have a profile that we can serialize easily. | 243 // we must have a profile that we can serialize easily. |
| 275 if (!as_CSB(this)->fProfileData) { | 244 if (!as_CSB(this)->fProfileData) { |
| 245 // Profile data is mandatory for A2B0 color spaces. | |
| 276 // If we have a named profile, only write the enum. | 246 // If we have a named profile, only write the enum. |
|
msarett
2016/10/11 13:40:30
Please move this comment down to just above the "i
| |
| 247 SkASSERT(as_CSB(this)->type() == SkColorSpace_Base::Type::kXYZTRC); | |
| 248 const SkColorSpace_XYZTRC* thisXYZ = static_cast<const SkColorSpace_XYZT RC*>(this); | |
| 249 const SkGammaNamed gammaNamed = thisXYZ->gammaNamed(); | |
| 277 if (this == gSRGB) { | 250 if (this == gSRGB) { |
| 278 if (memory) { | 251 if (memory) { |
| 279 *((ColorSpaceHeader*) memory) = | 252 *((ColorSpaceHeader*) memory) = |
| 280 ColorSpaceHeader::Pack(k0_Version, kSRGB_Named, | 253 ColorSpaceHeader::Pack(k0_Version, kSRGB_Named, gammaNam ed, 0); |
| 281 as_CSB(this)->fGammaNamed, 0); | |
| 282 } | 254 } |
| 283 return sizeof(ColorSpaceHeader); | 255 return sizeof(ColorSpaceHeader); |
| 284 } else if (this == gAdobeRGB) { | 256 } else if (this == gAdobeRGB) { |
| 285 if (memory) { | 257 if (memory) { |
| 286 *((ColorSpaceHeader*) memory) = | 258 *((ColorSpaceHeader*) memory) = |
| 287 ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named, | 259 ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named, gamm aNamed, 0); |
| 288 as_CSB(this)->fGammaNamed, 0); | |
| 289 } | 260 } |
| 290 return sizeof(ColorSpaceHeader); | 261 return sizeof(ColorSpaceHeader); |
| 291 } else if (this == gSRGBLinear) { | 262 } else if (this == gSRGBLinear) { |
| 292 if (memory) { | 263 if (memory) { |
| 293 *((ColorSpaceHeader*)memory) = | 264 *((ColorSpaceHeader*)memory) = |
| 294 ColorSpaceHeader::Pack(k0_Version, kSRGBLinear_Named, | 265 ColorSpaceHeader::Pack(k0_Version, kSRGBLinear_Named, ga mmaNamed, 0); |
| 295 as_CSB(this)->fGammaNamed, 0); | |
| 296 } | 266 } |
| 297 return sizeof(ColorSpaceHeader); | 267 return sizeof(ColorSpaceHeader); |
| 298 } | 268 } |
| 299 | 269 |
| 300 // If we have a named gamma, write the enum and the matrix. | 270 // If we have a named gamma, write the enum and the matrix. |
| 301 switch (as_CSB(this)->fGammaNamed) { | 271 switch (gammaNamed) { |
| 302 case kSRGB_SkGammaNamed: | 272 case kSRGB_SkGammaNamed: |
| 303 case k2Dot2Curve_SkGammaNamed: | 273 case k2Dot2Curve_SkGammaNamed: |
| 304 case kLinear_SkGammaNamed: { | 274 case kLinear_SkGammaNamed: { |
| 305 if (memory) { | 275 if (memory) { |
| 306 *((ColorSpaceHeader*) memory) = | 276 *((ColorSpaceHeader*) memory) = |
| 307 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)-> fGammaNamed, | 277 ColorSpaceHeader::Pack(k0_Version, 0, gammaNamed, |
| 308 ColorSpaceHeader::kMatrix_Fla g); | 278 ColorSpaceHeader::kMatrix_Fla g); |
| 309 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) ); | 279 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) ); |
| 310 as_CSB(this)->fToXYZD50.as3x4RowMajorf((float*) memory); | 280 thisXYZ->toXYZD50()->as3x4RowMajorf((float*) memory); |
| 311 } | 281 } |
| 312 return sizeof(ColorSpaceHeader) + 12 * sizeof(float); | 282 return sizeof(ColorSpaceHeader) + 12 * sizeof(float); |
| 313 } | 283 } |
| 314 default: | 284 default: |
| 315 // Otherwise, write the gamma values and the matrix. | 285 // Otherwise, write the gamma values and the matrix. |
| 316 if (memory) { | 286 if (memory) { |
| 317 *((ColorSpaceHeader*) memory) = | 287 *((ColorSpaceHeader*) memory) = |
| 318 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)-> fGammaNamed, | 288 ColorSpaceHeader::Pack(k0_Version, 0, gammaNamed, |
| 319 ColorSpaceHeader::kFloatGamma _Flag); | 289 ColorSpaceHeader::kFloatGamma _Flag); |
| 320 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) ); | 290 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) ); |
| 321 | 291 |
| 322 const SkGammas* gammas = as_CSB(this)->gammas(); | 292 const SkGammas* gammas = thisXYZ->gammas(); |
| 323 SkASSERT(gammas); | 293 SkASSERT(gammas); |
| 324 SkASSERT(SkGammas::Type::kValue_Type == gammas->fRedType && | 294 SkASSERT(SkGammas::Type::kValue_Type == gammas->fRedType && |
| 325 SkGammas::Type::kValue_Type == gammas->fGreenType & & | 295 SkGammas::Type::kValue_Type == gammas->fGreenType & & |
| 326 SkGammas::Type::kValue_Type == gammas->fBlueType); | 296 SkGammas::Type::kValue_Type == gammas->fBlueType); |
| 327 *(((float*) memory) + 0) = gammas->fRedData.fValue; | 297 *(((float*) memory) + 0) = gammas->fRedData.fValue; |
| 328 *(((float*) memory) + 1) = gammas->fGreenData.fValue; | 298 *(((float*) memory) + 1) = gammas->fGreenData.fValue; |
| 329 *(((float*) memory) + 2) = gammas->fBlueData.fValue; | 299 *(((float*) memory) + 2) = gammas->fBlueData.fValue; |
| 330 memory = SkTAddOffset<void>(memory, 3 * sizeof(float)); | 300 memory = SkTAddOffset<void>(memory, 3 * sizeof(float)); |
| 331 | 301 |
| 332 as_CSB(this)->fToXYZD50.as3x4RowMajorf((float*) memory); | 302 thisXYZ->toXYZD50()->as3x4RowMajorf((float*) memory); |
| 333 } | 303 } |
| 334 return sizeof(ColorSpaceHeader) + 15 * sizeof(float); | 304 return sizeof(ColorSpaceHeader) + 15 * sizeof(float); |
| 335 } | 305 } |
| 336 } | 306 } |
| 337 | 307 |
| 338 // Otherwise, serialize the ICC data. | 308 // Otherwise, serialize the ICC data. |
| 339 size_t profileSize = as_CSB(this)->fProfileData->size(); | 309 size_t profileSize = as_CSB(this)->fProfileData->size(); |
| 340 if (SkAlign4(profileSize) != (uint32_t) SkAlign4(profileSize)) { | 310 if (SkAlign4(profileSize) != (uint32_t) SkAlign4(profileSize)) { |
| 341 return 0; | 311 return 0; |
| 342 } | 312 } |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 431 } | 401 } |
| 432 | 402 |
| 433 bool SkColorSpace::Equals(const SkColorSpace* src, const SkColorSpace* dst) { | 403 bool SkColorSpace::Equals(const SkColorSpace* src, const SkColorSpace* dst) { |
| 434 if (src == dst) { | 404 if (src == dst) { |
| 435 return true; | 405 return true; |
| 436 } | 406 } |
| 437 | 407 |
| 438 if (!src || !dst) { | 408 if (!src || !dst) { |
| 439 return false; | 409 return false; |
| 440 } | 410 } |
| 411 | |
| 412 if (as_CSB(src)->type() != as_CSB(dst)->type()) { | |
| 413 return false; | |
| 414 } | |
| 441 | 415 |
| 442 SkData* srcData = as_CSB(src)->fProfileData.get(); | 416 SkData* srcData = as_CSB(src)->fProfileData.get(); |
| 443 SkData* dstData = as_CSB(dst)->fProfileData.get(); | 417 SkData* dstData = as_CSB(dst)->fProfileData.get(); |
| 444 if (srcData || dstData) { | 418 if (srcData || dstData) { |
| 445 if (srcData && dstData) { | 419 if (srcData && dstData) { |
| 446 return srcData->size() == dstData->size() && | 420 return srcData->size() == dstData->size() && |
| 447 0 == memcmp(srcData->data(), dstData->data(), srcData->size() ); | 421 0 == memcmp(srcData->data(), dstData->data(), srcData->size() ); |
| 448 } | 422 } |
| 449 | 423 |
| 450 return false; | 424 return false; |
| 451 } | 425 } |
| 452 | 426 |
| 453 // It's important to check fProfileData before named gammas. Some profiles may have named | 427 // It's important to check fProfileData before named gammas. Some profiles may have named |
| 454 // gammas, but also include other wacky features that cause us to save the d ata. | 428 // gammas, but also include other wacky features that cause us to save the d ata. |
|
msarett
2016/10/11 13:40:31
I believe you don't need any of this? Won't the f
raftias
2016/10/14 17:10:15
Yeah, I guess there wouldn't be any A2B0 profiles
| |
| 455 switch (as_CSB(src)->fGammaNamed) { | 429 if (as_CSB(src)->type() == SkColorSpace_Base::Type::kXYZTRC) { |
| 456 case kSRGB_SkGammaNamed: | 430 const SkColorSpace_XYZTRC& srcXYZ = *static_cast<const SkColorSpace_XYZT RC*>(src); |
| 457 case k2Dot2Curve_SkGammaNamed: | 431 const SkColorSpace_XYZTRC& dstXYZ = *static_cast<const SkColorSpace_XYZT RC*>(dst); |
| 458 case kLinear_SkGammaNamed: | 432 |
| 459 return (as_CSB(src)->fGammaNamed == as_CSB(dst)->fGammaNamed) && | 433 switch (srcXYZ.gammaNamed()) { |
| 460 (as_CSB(src)->fToXYZD50 == as_CSB(dst)->fToXYZD50); | 434 case kSRGB_SkGammaNamed: |
| 461 default: | 435 case k2Dot2Curve_SkGammaNamed: |
| 462 if (as_CSB(src)->fGammaNamed != as_CSB(dst)->fGammaNamed) { | 436 case kLinear_SkGammaNamed: |
| 437 return (srcXYZ.gammaNamed() == dstXYZ.gammaNamed()) && | |
| 438 (*srcXYZ.toXYZD50() == *dstXYZ.toXYZD50()); | |
| 439 default: | |
| 440 if (srcXYZ.gammaNamed() != dstXYZ.gammaNamed()) { | |
| 441 return false; | |
| 442 } | |
| 443 } | |
| 444 // TRC tables still need checking | |
| 445 } else { | |
| 446 const SkColorSpace_A2B0& srcA2B = *static_cast<const SkColorSpace_A2B0*> (src); | |
| 447 const SkColorSpace_A2B0& dstA2B = *static_cast<const SkColorSpace_A2B0*> (dst); | |
| 448 | |
| 449 const SkGammaNamed aNamed = srcA2B.aCurveNamed(); | |
| 450 const SkGammaNamed bNamed = srcA2B.bCurveNamed(); | |
| 451 const SkGammaNamed mNamed = srcA2B.mCurveNamed(); | |
| 452 if ((aNamed != dstA2B.aCurveNamed()) || | |
| 453 (bNamed != dstA2B.bCurveNamed()) || | |
| 454 (mNamed != dstA2B.mCurveNamed())) { | |
| 455 return false; | |
| 456 } | |
| 457 if (aNamed != kNonStandard_SkGammaNamed && | |
| 458 bNamed != kNonStandard_SkGammaNamed && | |
| 459 mNamed != kNonStandard_SkGammaNamed) { | |
| 460 // All gammas are the same type and are not tables/parametric, so se e if | |
| 461 // the matrices differ | |
| 462 if ((srcA2B.matrix() != dstA2B.matrix()) || | |
| 463 (srcA2B.matrix() != dstA2B.matrix()) || | |
| 464 (srcA2B.matrix() != dstA2B.matrix())) { | |
| 463 return false; | 465 return false; |
| 464 } | 466 } |
| 467 } | |
| 468 // a/b/m-curve tables and CLUT (if applicable) still need checking | |
| 469 } | |
| 465 | 470 |
| 466 // It is unlikely that we will reach this case. | 471 // It is unlikely that we will reach this case. |
| 467 sk_sp<SkData> srcData = src->serialize(); | 472 sk_sp<SkData> serializedSrcData = src->serialize(); |
|
msarett
2016/10/11 13:40:30
Thanks, I should not have shadowed my other variab
| |
| 468 sk_sp<SkData> dstData = dst->serialize(); | 473 sk_sp<SkData> serializedDstData = dst->serialize(); |
| 469 return srcData->size() == dstData->size() && | 474 return serializedSrcData->size() == serializedDstData->size() && |
| 470 0 == memcmp(srcData->data(), dstData->data(), srcData->size() ); | 475 0 == memcmp(serializedSrcData->data(), serializedDstData->data(), |
| 471 } | 476 serializedSrcData->size()); |
| 472 } | 477 } |
| OLD | NEW |