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 #include "SkPoint3.h" | 14 #include "SkPoint3.h" |
| 13 | 15 |
| 14 bool SkColorSpacePrimaries::toXYZD50(SkMatrix44* toXYZ_D50) const { | 16 bool SkColorSpacePrimaries::toXYZD50(SkMatrix44* toXYZ_D50) const { |
| 15 if (!is_zero_to_one(fRX) || !is_zero_to_one(fRY) || | 17 if (!is_zero_to_one(fRX) || !is_zero_to_one(fRY) || |
| 16 !is_zero_to_one(fGX) || !is_zero_to_one(fGY) || | 18 !is_zero_to_one(fGX) || !is_zero_to_one(fGY) || |
| 17 !is_zero_to_one(fBX) || !is_zero_to_one(fBY) || | 19 !is_zero_to_one(fBX) || !is_zero_to_one(fBY) || |
| 18 !is_zero_to_one(fWX) || !is_zero_to_one(fWY)) | 20 !is_zero_to_one(fWX) || !is_zero_to_one(fWY)) |
| 19 { | 21 { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 75 | 77 |
| 76 toXYZ.postConcat(DXToD50); | 78 toXYZ.postConcat(DXToD50); |
| 77 toXYZ_D50->set3x3(toXYZ[0], toXYZ[3], toXYZ[6], | 79 toXYZ_D50->set3x3(toXYZ[0], toXYZ[3], toXYZ[6], |
| 78 toXYZ[1], toXYZ[4], toXYZ[7], | 80 toXYZ[1], toXYZ[4], toXYZ[7], |
| 79 toXYZ[2], toXYZ[5], toXYZ[8]); | 81 toXYZ[2], toXYZ[5], toXYZ[8]); |
| 80 return true; | 82 return true; |
| 81 } | 83 } |
| 82 | 84 |
| 83 //////////////////////////////////////////////////////////////////////////////// /////////////////// | 85 //////////////////////////////////////////////////////////////////////////////// /////////////////// |
| 84 | 86 |
| 85 SkColorSpace_Base::SkColorSpace_Base(SkGammaNamed gammaNamed, const SkMatrix44& toXYZD50) | 87 SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkData> profileData) |
| 86 : fGammaNamed(gammaNamed) | 88 : fProfileData(std::move(profileData)) |
| 87 , fGammas(nullptr) | |
| 88 , fProfileData(nullptr) | |
| 89 , fToXYZD50(toXYZD50) | |
| 90 , fFromXYZD50(SkMatrix44::kUninitialized_Constructor) | |
| 91 {} | |
| 92 | |
| 93 SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkColorLookUpTable> colorLUT, SkGamma Named gammaNamed, | |
| 94 sk_sp<SkGammas> gammas, const SkMatrix44& t oXYZD50, | |
| 95 sk_sp<SkData> profileData) | |
| 96 : fColorLUT(std::move(colorLUT)) | |
| 97 , fGammaNamed(gammaNamed) | |
| 98 , fGammas(std::move(gammas)) | |
| 99 , fProfileData(std::move(profileData)) | |
| 100 , fToXYZD50(toXYZD50) | |
| 101 , fFromXYZD50(SkMatrix44::kUninitialized_Constructor) | |
| 102 {} | 89 {} |
| 103 | 90 |
| 104 static constexpr float gSRGB_toXYZD50[] { | 91 static constexpr float gSRGB_toXYZD50[] { |
| 105 0.4358f, 0.3853f, 0.1430f, // Rx, Gx, Bx | 92 0.4358f, 0.3853f, 0.1430f, // Rx, Gx, Bx |
| 106 0.2224f, 0.7170f, 0.0606f, // Ry, Gy, Gz | 93 0.2224f, 0.7170f, 0.0606f, // Ry, Gy, Gz |
| 107 0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz | 94 0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz |
| 108 }; | 95 }; |
| 109 | 96 |
| 110 static constexpr float gAdobeRGB_toXYZD50[] { | 97 static constexpr float gAdobeRGB_toXYZD50[] { |
| 111 0.6098f, 0.2052f, 0.1492f, // Rx, Gx, Bx | 98 0.6098f, 0.2052f, 0.1492f, // Rx, Gx, Bx |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 155 } | 142 } |
| 156 | 143 |
| 157 if (kNonStandard_SkGammaNamed == gammaNamed) { | 144 if (kNonStandard_SkGammaNamed == gammaNamed) { |
| 158 sk_sp<SkGammas> gammas = sk_sp<SkGammas>(new SkGammas()); | 145 sk_sp<SkGammas> gammas = sk_sp<SkGammas>(new SkGammas()); |
| 159 gammas->fRedType = SkGammas::Type::kValue_Type; | 146 gammas->fRedType = SkGammas::Type::kValue_Type; |
| 160 gammas->fGreenType = SkGammas::Type::kValue_Type; | 147 gammas->fGreenType = SkGammas::Type::kValue_Type; |
| 161 gammas->fBlueType = SkGammas::Type::kValue_Type; | 148 gammas->fBlueType = SkGammas::Type::kValue_Type; |
| 162 gammas->fRedData.fValue = values[0]; | 149 gammas->fRedData.fValue = values[0]; |
| 163 gammas->fGreenData.fValue = values[1]; | 150 gammas->fGreenData.fValue = values[1]; |
| 164 gammas->fBlueData.fValue = values[2]; | 151 gammas->fBlueData.fValue = values[2]; |
| 165 return sk_sp<SkColorSpace>(new SkColorSpace_Base(nullptr, kNonStandard_S kGammaNamed, gammas, | 152 return sk_sp<SkColorSpace>(new SkColorSpace_XYZTRC(kNonStandard_SkGammaN amed, |
| 166 toXYZD50, nullptr)); | 153 gammas, toXYZD50, nul lptr)); |
| 167 } | 154 } |
| 168 | 155 |
| 169 return SkColorSpace_Base::NewRGB(gammaNamed, toXYZD50); | 156 return SkColorSpace_Base::NewRGB(gammaNamed, toXYZD50); |
| 170 } | 157 } |
| 171 | 158 |
| 172 sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(SkGammaNamed gammaNamed, const SkM atrix44& toXYZD50) { | 159 sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(SkGammaNamed gammaNamed, const SkM atrix44& toXYZD50) { |
| 173 switch (gammaNamed) { | 160 switch (gammaNamed) { |
| 174 case kSRGB_SkGammaNamed: | 161 case kSRGB_SkGammaNamed: |
| 175 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { | 162 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { |
| 176 return SkColorSpace::NewNamed(kSRGB_Named); | 163 return SkColorSpace::NewNamed(kSRGB_Named); |
| 177 } | 164 } |
| 178 break; | 165 break; |
| 179 case k2Dot2Curve_SkGammaNamed: | 166 case k2Dot2Curve_SkGammaNamed: |
| 180 if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { | 167 if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) { |
| 181 return SkColorSpace::NewNamed(kAdobeRGB_Named); | 168 return SkColorSpace::NewNamed(kAdobeRGB_Named); |
| 182 } | 169 } |
| 183 break; | 170 break; |
| 184 case kLinear_SkGammaNamed: | 171 case kLinear_SkGammaNamed: |
| 185 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { | 172 if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { |
| 186 return SkColorSpace::NewNamed(kSRGBLinear_Named); | 173 return SkColorSpace::NewNamed(kSRGBLinear_Named); |
| 187 } | 174 } |
| 188 break; | 175 break; |
| 189 case kNonStandard_SkGammaNamed: | 176 case kNonStandard_SkGammaNamed: |
| 190 // This is not allowed. | 177 // This is not allowed. |
| 191 return nullptr; | 178 return nullptr; |
| 192 default: | 179 default: |
| 193 break; | 180 break; |
| 194 } | 181 } |
| 195 | 182 |
| 196 return sk_sp<SkColorSpace>(new SkColorSpace_Base(gammaNamed, toXYZD50)); | 183 return sk_sp<SkColorSpace>(new SkColorSpace_XYZTRC(gammaNamed, toXYZD50)); |
| 197 } | 184 } |
| 198 | 185 |
| 199 sk_sp<SkColorSpace> SkColorSpace::NewRGB(RenderTargetGamma gamma, const SkMatrix 44& toXYZD50) { | 186 sk_sp<SkColorSpace> SkColorSpace::NewRGB(RenderTargetGamma gamma, const SkMatrix 44& toXYZD50) { |
| 200 switch (gamma) { | 187 switch (gamma) { |
| 201 case kLinear_RenderTargetGamma: | 188 case kLinear_RenderTargetGamma: |
| 202 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, toXYZD50); | 189 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, toXYZD50); |
| 203 case kSRGB_RenderTargetGamma: | 190 case kSRGB_RenderTargetGamma: |
| 204 return SkColorSpace_Base::NewRGB(kSRGB_SkGammaNamed, toXYZD50); | 191 return SkColorSpace_Base::NewRGB(kSRGB_SkGammaNamed, toXYZD50); |
| 205 default: | 192 default: |
| 206 return nullptr; | 193 return nullptr; |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 227 *fn = coeffs; | 214 *fn = coeffs; |
| 228 gammas->fRedType = SkGammas::Type::kParam_Type; | 215 gammas->fRedType = SkGammas::Type::kParam_Type; |
| 229 gammas->fGreenType = SkGammas::Type::kParam_Type; | 216 gammas->fGreenType = SkGammas::Type::kParam_Type; |
| 230 gammas->fBlueType = SkGammas::Type::kParam_Type; | 217 gammas->fBlueType = SkGammas::Type::kParam_Type; |
| 231 | 218 |
| 232 SkGammas::Data data; | 219 SkGammas::Data data; |
| 233 data.fParamOffset = 0; | 220 data.fParamOffset = 0; |
| 234 gammas->fRedData = data; | 221 gammas->fRedData = data; |
| 235 gammas->fGreenData = data; | 222 gammas->fGreenData = data; |
| 236 gammas->fBlueData = data; | 223 gammas->fBlueData = data; |
| 237 return sk_sp<SkColorSpace>(new SkColorSpace_Base(nullptr, kNonStandard_SkGam maNamed, | 224 return sk_sp<SkColorSpace>(new SkColorSpace_XYZTRC(kNonStandard_SkGammaNamed , |
| 238 std::move(gammas), toXYZD50 , nullptr)); | 225 std::move(gammas), toXYZD 50, nullptr)); |
| 239 } | 226 } |
| 240 | 227 |
| 241 static SkColorSpace* gAdobeRGB; | 228 static SkColorSpace* gAdobeRGB; |
| 242 static SkColorSpace* gSRGB; | 229 static SkColorSpace* gSRGB; |
| 243 static SkColorSpace* gSRGBLinear; | 230 static SkColorSpace* gSRGBLinear; |
| 244 | 231 |
| 245 sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { | 232 sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { |
| 246 static SkOnce sRGBOnce; | 233 static SkOnce sRGBOnce; |
| 247 static SkOnce adobeRGBOnce; | 234 static SkOnce adobeRGBOnce; |
| 248 static SkOnce sRGBLinearOnce; | 235 static SkOnce sRGBLinearOnce; |
| 249 | 236 |
| 250 switch (named) { | 237 switch (named) { |
| 251 case kSRGB_Named: { | 238 case kSRGB_Named: { |
| 252 sRGBOnce([] { | 239 sRGBOnce([] { |
| 253 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); | 240 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); |
| 254 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); | 241 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); |
| 255 | 242 |
| 256 // Force the mutable type mask to be computed. This avoids race s. | 243 // Force the mutable type mask to be computed. This avoids race s. |
| 257 (void)srgbToxyzD50.getType(); | 244 (void)srgbToxyzD50.getType(); |
| 258 gSRGB = new SkColorSpace_Base(kSRGB_SkGammaNamed, srgbToxyzD50); | 245 gSRGB = new SkColorSpace_XYZTRC(kSRGB_SkGammaNamed, srgbToxyzD50 ); |
| 259 }); | 246 }); |
| 260 return sk_ref_sp<SkColorSpace>(gSRGB); | 247 return sk_ref_sp<SkColorSpace>(gSRGB); |
| 261 } | 248 } |
| 262 case kAdobeRGB_Named: { | 249 case kAdobeRGB_Named: { |
| 263 adobeRGBOnce([] { | 250 adobeRGBOnce([] { |
| 264 SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Construct or); | 251 SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Construct or); |
| 265 adobergbToxyzD50.set3x3RowMajorf(gAdobeRGB_toXYZD50); | 252 adobergbToxyzD50.set3x3RowMajorf(gAdobeRGB_toXYZD50); |
| 266 | 253 |
| 267 // Force the mutable type mask to be computed. This avoids race s. | 254 // Force the mutable type mask to be computed. This avoids race s. |
| 268 (void)adobergbToxyzD50.getType(); | 255 (void)adobergbToxyzD50.getType(); |
| 269 gAdobeRGB = new SkColorSpace_Base(k2Dot2Curve_SkGammaNamed, adob ergbToxyzD50); | 256 gAdobeRGB = new SkColorSpace_XYZTRC(k2Dot2Curve_SkGammaNamed, ad obergbToxyzD50); |
| 270 }); | 257 }); |
| 271 return sk_ref_sp<SkColorSpace>(gAdobeRGB); | 258 return sk_ref_sp<SkColorSpace>(gAdobeRGB); |
| 272 } | 259 } |
| 273 case kSRGBLinear_Named: { | 260 case kSRGBLinear_Named: { |
| 274 sRGBLinearOnce([] { | 261 sRGBLinearOnce([] { |
| 275 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); | 262 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); |
| 276 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); | 263 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); |
| 277 | 264 |
| 278 // Force the mutable type mask to be computed. This avoids race s. | 265 // Force the mutable type mask to be computed. This avoids race s. |
| 279 (void)srgbToxyzD50.getType(); | 266 (void)srgbToxyzD50.getType(); |
| 280 gSRGBLinear = new SkColorSpace_Base(kLinear_SkGammaNamed, srgbTo xyzD50); | 267 gSRGBLinear = new SkColorSpace_XYZTRC(kLinear_SkGammaNamed, srgb ToxyzD50); |
| 281 }); | 268 }); |
| 282 return sk_ref_sp<SkColorSpace>(gSRGBLinear); | 269 return sk_ref_sp<SkColorSpace>(gSRGBLinear); |
| 283 } | 270 } |
| 284 default: | 271 default: |
| 285 break; | 272 break; |
| 286 } | 273 } |
| 287 return nullptr; | 274 return nullptr; |
| 288 } | 275 } |
| 289 | 276 |
| 290 sk_sp<SkColorSpace> SkColorSpace_Base::makeLinearGamma() { | |
| 291 if (this->gammaIsLinear()) { | |
| 292 return sk_ref_sp(this); | |
| 293 } | |
| 294 return SkColorSpace_Base::NewRGB(kLinear_SkGammaNamed, as_CSB(this)->fToXYZD 50); | |
| 295 } | |
| 296 | |
| 297 //////////////////////////////////////////////////////////////////////////////// /////////////////// | 277 //////////////////////////////////////////////////////////////////////////////// /////////////////// |
| 298 | 278 |
| 299 bool SkColorSpace::gammaCloseToSRGB() const { | 279 bool SkColorSpace::gammaCloseToSRGB() const { |
| 300 return kSRGB_SkGammaNamed == as_CSB(this)->fGammaNamed || | 280 return as_CSB(this)->onGammaCloseToSRGB(); |
| 301 k2Dot2Curve_SkGammaNamed == as_CSB(this)->fGammaNamed; | |
| 302 } | 281 } |
| 303 | 282 |
| 304 bool SkColorSpace::gammaIsLinear() const { | 283 bool SkColorSpace::gammaIsLinear() const { |
| 305 return kLinear_SkGammaNamed == as_CSB(this)->fGammaNamed; | 284 return as_CSB(this)->onGammaIsLinear(); |
| 306 } | |
| 307 | |
| 308 const SkMatrix44& SkColorSpace_Base::fromXYZD50() const { | |
| 309 fFromXYZOnce([this] { | |
| 310 if (!fToXYZD50.invert(&fFromXYZD50)) { | |
| 311 // If a client gives us a dst gamut with a transform that we can't i nvert, we will | |
| 312 // simply give them back a transform to sRGB gamut. | |
| 313 SkDEBUGFAIL("Non-invertible XYZ matrix, defaulting to sRGB"); | |
| 314 SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); | |
| 315 srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); | |
| 316 srgbToxyzD50.invert(&fFromXYZD50); | |
| 317 } | |
| 318 }); | |
| 319 return fFromXYZD50; | |
| 320 } | 285 } |
| 321 | 286 |
| 322 //////////////////////////////////////////////////////////////////////////////// /////////////////// | 287 //////////////////////////////////////////////////////////////////////////////// /////////////////// |
| 323 | 288 |
| 324 enum Version { | 289 enum Version { |
| 325 k0_Version, // Initial version, header + flags for matrix and profile | 290 k0_Version, // Initial version, header + flags for matrix and profile |
| 326 }; | 291 }; |
| 327 | 292 |
| 328 struct ColorSpaceHeader { | 293 struct ColorSpaceHeader { |
| 329 /** | 294 /** |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 378 uint8_t fVersion; // Always zero | 343 uint8_t fVersion; // Always zero |
| 379 uint8_t fNamed; // Must be a SkColorSpace::Named | 344 uint8_t fNamed; // Must be a SkColorSpace::Named |
| 380 uint8_t fGammaNamed; // Must be a SkGammaNamed | 345 uint8_t fGammaNamed; // Must be a SkGammaNamed |
| 381 uint8_t fFlags; // Some combination of the flags listed above | 346 uint8_t fFlags; // Some combination of the flags listed above |
| 382 }; | 347 }; |
| 383 | 348 |
| 384 size_t SkColorSpace::writeToMemory(void* memory) const { | 349 size_t SkColorSpace::writeToMemory(void* memory) const { |
| 385 // Start by trying the serialization fast path. If we haven't saved ICC pro file data, | 350 // Start by trying the serialization fast path. If we haven't saved ICC pro file data, |
| 386 // we must have a profile that we can serialize easily. | 351 // we must have a profile that we can serialize easily. |
| 387 if (!as_CSB(this)->fProfileData) { | 352 if (!as_CSB(this)->fProfileData) { |
| 353 // Profile data is mandatory for A2B0 color spaces. | |
| 354 SkASSERT(as_CSB(this)->type() == SkColorSpace_Base::Type::kXYZTRC); | |
| 355 const SkColorSpace_XYZTRC* thisXYZ = static_cast<const SkColorSpace_XYZT RC*>(this); | |
| 388 // If we have a named profile, only write the enum. | 356 // If we have a named profile, only write the enum. |
| 357 const SkGammaNamed gammaNamed = thisXYZ->gammaNamed(); | |
| 389 if (this == gSRGB) { | 358 if (this == gSRGB) { |
| 390 if (memory) { | 359 if (memory) { |
| 391 *((ColorSpaceHeader*) memory) = | 360 *((ColorSpaceHeader*) memory) = |
| 392 ColorSpaceHeader::Pack(k0_Version, kSRGB_Named, | 361 ColorSpaceHeader::Pack(k0_Version, kSRGB_Named, gammaNam ed, 0); |
| 393 as_CSB(this)->fGammaNamed, 0); | |
| 394 } | 362 } |
| 395 return sizeof(ColorSpaceHeader); | 363 return sizeof(ColorSpaceHeader); |
| 396 } else if (this == gAdobeRGB) { | 364 } else if (this == gAdobeRGB) { |
| 397 if (memory) { | 365 if (memory) { |
| 398 *((ColorSpaceHeader*) memory) = | 366 *((ColorSpaceHeader*) memory) = |
| 399 ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named, | 367 ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named, gamm aNamed, 0); |
| 400 as_CSB(this)->fGammaNamed, 0); | |
| 401 } | 368 } |
| 402 return sizeof(ColorSpaceHeader); | 369 return sizeof(ColorSpaceHeader); |
| 403 } else if (this == gSRGBLinear) { | 370 } else if (this == gSRGBLinear) { |
| 404 if (memory) { | 371 if (memory) { |
| 405 *((ColorSpaceHeader*)memory) = | 372 *((ColorSpaceHeader*) memory) = |
| 406 ColorSpaceHeader::Pack(k0_Version, kSRGBLinear_Named, | 373 ColorSpaceHeader::Pack(k0_Version, kSRGBLinear_Named, ga mmaNamed, 0); |
| 407 as_CSB(this)->fGammaNamed, 0); | |
| 408 } | 374 } |
| 409 return sizeof(ColorSpaceHeader); | 375 return sizeof(ColorSpaceHeader); |
| 410 } | 376 } |
| 411 | 377 |
| 412 // If we have a named gamma, write the enum and the matrix. | 378 // If we have a named gamma, write the enum and the matrix. |
| 413 switch (as_CSB(this)->fGammaNamed) { | 379 switch (gammaNamed) { |
| 414 case kSRGB_SkGammaNamed: | 380 case kSRGB_SkGammaNamed: |
| 415 case k2Dot2Curve_SkGammaNamed: | 381 case k2Dot2Curve_SkGammaNamed: |
| 416 case kLinear_SkGammaNamed: { | 382 case kLinear_SkGammaNamed: { |
| 417 if (memory) { | 383 if (memory) { |
| 418 *((ColorSpaceHeader*) memory) = | 384 *((ColorSpaceHeader*) memory) = |
| 419 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)-> fGammaNamed, | 385 ColorSpaceHeader::Pack(k0_Version, 0, gammaNamed, |
| 420 ColorSpaceHeader::kMatrix_Fla g); | 386 ColorSpaceHeader::kMatrix_Fla g); |
| 421 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) ); | 387 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader) ); |
| 422 as_CSB(this)->fToXYZD50.as3x4RowMajorf((float*) memory); | 388 thisXYZ->toXYZD50()->as3x4RowMajorf((float*) memory); |
| 423 } | 389 } |
| 424 return sizeof(ColorSpaceHeader) + 12 * sizeof(float); | 390 return sizeof(ColorSpaceHeader) + 12 * sizeof(float); |
| 425 } | 391 } |
| 426 default: | 392 default: |
| 427 const SkGammas* gammas = as_CSB(this)->gammas(); | 393 const SkGammas* gammas = thisXYZ->gammas(); |
| 428 SkASSERT(gammas); | 394 SkASSERT(gammas); |
| 429 if (gammas->isValue(0) && gammas->isValue(1) && gammas->isValue( 2)) { | 395 if (gammas->isValue(0) && gammas->isValue(1) && gammas->isValue( 2)) { |
| 430 if (memory) { | 396 if (memory) { |
| 431 *((ColorSpaceHeader*) memory) = | 397 *((ColorSpaceHeader*) memory) = |
| 432 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(thi s)->fGammaNamed, | 398 ColorSpaceHeader::Pack(k0_Version, 0, thisXYZ->f GammaNamed, |
| 433 ColorSpaceHeader::kFloatG amma_Flag); | 399 ColorSpaceHeader::kFloatG amma_Flag); |
| 434 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHea der)); | 400 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHea der)); |
| 435 | 401 |
| 436 *(((float*) memory) + 0) = gammas->fRedData.fValue; | 402 *(((float*) memory) + 0) = gammas->fRedData.fValue; |
| 437 *(((float*) memory) + 1) = gammas->fGreenData.fValue; | 403 *(((float*) memory) + 1) = gammas->fGreenData.fValue; |
| 438 *(((float*) memory) + 2) = gammas->fBlueData.fValue; | 404 *(((float*) memory) + 2) = gammas->fBlueData.fValue; |
| 439 memory = SkTAddOffset<void>(memory, 3 * sizeof(float)); | 405 memory = SkTAddOffset<void>(memory, 3 * sizeof(float)); |
| 440 | 406 |
| 441 as_CSB(this)->fToXYZD50.as3x4RowMajorf((float*) memory); | 407 thisXYZ->fToXYZD50.as3x4RowMajorf((float*) memory); |
| 442 } | 408 } |
| 443 | 409 |
| 444 return sizeof(ColorSpaceHeader) + 15 * sizeof(float); | 410 return sizeof(ColorSpaceHeader) + 15 * sizeof(float); |
| 445 } else { | 411 } else { |
| 446 SkASSERT(gammas->isParametric(0)); | 412 SkASSERT(gammas->isParametric(0)); |
| 447 SkASSERT(gammas->isParametric(1)); | 413 SkASSERT(gammas->isParametric(1)); |
| 448 SkASSERT(gammas->isParametric(2)); | 414 SkASSERT(gammas->isParametric(2)); |
| 449 SkASSERT(gammas->data(0) == gammas->data(1)); | 415 SkASSERT(gammas->data(0) == gammas->data(1)); |
| 450 SkASSERT(gammas->data(0) == gammas->data(2)); | 416 SkASSERT(gammas->data(0) == gammas->data(2)); |
| 451 | 417 |
| 452 if (memory) { | 418 if (memory) { |
| 453 *((ColorSpaceHeader*) memory) = | 419 *((ColorSpaceHeader*) memory) = |
| 454 ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(thi s)->fGammaNamed, | 420 ColorSpaceHeader::Pack(k0_Version, 0, thisXYZ->f GammaNamed, |
| 455 ColorSpaceHeader::kTransf erFn_Flag); | 421 ColorSpaceHeader::kTransf erFn_Flag); |
| 456 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHea der)); | 422 memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHea der)); |
| 457 | 423 |
| 458 *(((float*) memory) + 0) = gammas->params(0).fA; | 424 *(((float*) memory) + 0) = gammas->params(0).fA; |
| 459 *(((float*) memory) + 1) = gammas->params(0).fB; | 425 *(((float*) memory) + 1) = gammas->params(0).fB; |
| 460 *(((float*) memory) + 2) = gammas->params(0).fC; | 426 *(((float*) memory) + 2) = gammas->params(0).fC; |
| 461 *(((float*) memory) + 3) = gammas->params(0).fD; | 427 *(((float*) memory) + 3) = gammas->params(0).fD; |
| 462 *(((float*) memory) + 4) = gammas->params(0).fE; | 428 *(((float*) memory) + 4) = gammas->params(0).fE; |
| 463 *(((float*) memory) + 5) = gammas->params(0).fF; | 429 *(((float*) memory) + 5) = gammas->params(0).fF; |
| 464 *(((float*) memory) + 6) = gammas->params(0).fG; | 430 *(((float*) memory) + 6) = gammas->params(0).fG; |
| 465 memory = SkTAddOffset<void>(memory, 7 * sizeof(float)); | 431 memory = SkTAddOffset<void>(memory, 7 * sizeof(float)); |
| 466 | 432 |
| 467 as_CSB(this)->fToXYZD50.as3x4RowMajorf((float*) memory); | 433 thisXYZ->fToXYZD50.as3x4RowMajorf((float*) memory); |
| 468 } | 434 } |
| 469 | 435 |
| 470 return sizeof(ColorSpaceHeader) + 19 * sizeof(float); | 436 return sizeof(ColorSpaceHeader) + 19 * sizeof(float); |
| 471 } | 437 } |
| 472 } | 438 } |
| 473 } | 439 } |
| 474 | 440 |
| 475 // Otherwise, serialize the ICC data. | 441 // Otherwise, serialize the ICC data. |
| 476 size_t profileSize = as_CSB(this)->fProfileData->size(); | 442 size_t profileSize = as_CSB(this)->fProfileData->size(); |
| 477 if (SkAlign4(profileSize) != (uint32_t) SkAlign4(profileSize)) { | 443 if (SkAlign4(profileSize) != (uint32_t) SkAlign4(profileSize)) { |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 588 | 554 |
| 589 bool SkColorSpace::Equals(const SkColorSpace* src, const SkColorSpace* dst) { | 555 bool SkColorSpace::Equals(const SkColorSpace* src, const SkColorSpace* dst) { |
| 590 if (src == dst) { | 556 if (src == dst) { |
| 591 return true; | 557 return true; |
| 592 } | 558 } |
| 593 | 559 |
| 594 if (!src || !dst) { | 560 if (!src || !dst) { |
| 595 return false; | 561 return false; |
| 596 } | 562 } |
| 597 | 563 |
| 564 | |
|
msarett
2016/10/14 21:31:39
nit: remove line
raftias
2016/10/17 15:28:02
Done.
| |
| 598 SkData* srcData = as_CSB(src)->fProfileData.get(); | 565 SkData* srcData = as_CSB(src)->fProfileData.get(); |
| 599 SkData* dstData = as_CSB(dst)->fProfileData.get(); | 566 SkData* dstData = as_CSB(dst)->fProfileData.get(); |
| 600 if (srcData || dstData) { | 567 if (srcData || dstData) { |
| 601 if (srcData && dstData) { | 568 if (srcData && dstData) { |
| 602 return srcData->size() == dstData->size() && | 569 return srcData->size() == dstData->size() && |
| 603 0 == memcmp(srcData->data(), dstData->data(), srcData->size() ); | 570 0 == memcmp(srcData->data(), dstData->data(), srcData->size() ); |
| 604 } | 571 } |
| 605 | 572 |
| 606 return false; | 573 return false; |
| 607 } | 574 } |
| 608 | 575 |
| 609 // It's important to check fProfileData before named gammas. Some profiles may have named | 576 // profiles are mandatory for A2B0 color spaces |
| 610 // gammas, but also include other wacky features that cause us to save the d ata. | 577 SkASSERT(as_CSB(src)->type() == SkColorSpace_Base::Type::kXYZTRC); |
| 611 switch (as_CSB(src)->fGammaNamed) { | 578 const SkColorSpace_XYZTRC* srcXYZ = static_cast<const SkColorSpace_XYZTRC*>( src); |
| 579 const SkColorSpace_XYZTRC* dstXYZ = static_cast<const SkColorSpace_XYZTRC*>( dst); | |
| 580 | |
| 581 switch (srcXYZ->gammaNamed()) { | |
| 612 case kSRGB_SkGammaNamed: | 582 case kSRGB_SkGammaNamed: |
| 613 case k2Dot2Curve_SkGammaNamed: | 583 case k2Dot2Curve_SkGammaNamed: |
| 614 case kLinear_SkGammaNamed: | 584 case kLinear_SkGammaNamed: |
| 615 return (as_CSB(src)->fGammaNamed == as_CSB(dst)->fGammaNamed) && | 585 return (srcXYZ->gammaNamed() == dstXYZ->gammaNamed()) && |
| 616 (as_CSB(src)->fToXYZD50 == as_CSB(dst)->fToXYZD50); | 586 (*srcXYZ->toXYZD50() == *dstXYZ->toXYZD50()); |
| 617 default: | 587 default: |
| 618 if (as_CSB(src)->fGammaNamed != as_CSB(dst)->fGammaNamed) { | 588 if (srcXYZ->gammaNamed() != dstXYZ->gammaNamed()) { |
| 619 return false; | 589 return false; |
| 620 } | 590 } |
| 621 | 591 |
| 622 // It is unlikely that we will reach this case. | 592 // It is unlikely that we will reach this case. |
| 623 sk_sp<SkData> srcData = src->serialize(); | 593 sk_sp<SkData> serializedSrcData = src->serialize(); |
| 624 sk_sp<SkData> dstData = dst->serialize(); | 594 sk_sp<SkData> serializedDstData = dst->serialize(); |
| 625 return srcData->size() == dstData->size() && | 595 return serializedSrcData->size() == serializedDstData->size() && |
| 626 0 == memcmp(srcData->data(), dstData->data(), srcData->size() ); | 596 0 == memcmp(serializedSrcData->data(), serializedDstData->dat a(), |
| 597 serializedSrcData->size()); | |
| 627 } | 598 } |
| 599 | |
|
msarett
2016/10/14 21:31:39
nit: remove line
raftias
2016/10/17 15:28:02
Done.
| |
| 628 } | 600 } |
| OLD | NEW |