Index: src/core/SkColorSpace.cpp |
diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp |
index 172082b781e9b69fb5b3f984a16497a0c3436ae0..b3fad724915d0a39d1f22a56a8433579e3420786 100644 |
--- a/src/core/SkColorSpace.cpp |
+++ b/src/core/SkColorSpace.cpp |
@@ -554,7 +554,7 @@ bool load_matrix(SkMatrix44* toXYZ, const uint8_t* src, size_t len) { |
return true; |
} |
-bool SkColorSpace::LoadA2B0(SkColorLookUpTable* colorLUT, sk_sp<SkGammas> gammas, SkMatrix44* toXYZ, |
+bool SkColorSpace::LoadA2B0(SkColorLookUpTable* colorLUT, SkGammaCurve* gammas, SkMatrix44* toXYZ, |
const uint8_t* src, size_t len) { |
if (len < 32) { |
SkColorSpacePrintf("A to B tag is too small (%d bytes).", len); |
@@ -604,7 +604,7 @@ bool SkColorSpace::LoadA2B0(SkColorLookUpTable* colorLUT, sk_sp<SkGammas> gammas |
uint32_t offsetToMCurves = read_big_endian_int(src + 20); |
if (0 != offsetToMCurves && offsetToMCurves < len) { |
- if (!SkColorSpace::LoadGammas(&gammas->fRed, outputChannels, src + offsetToMCurves, |
+ if (!SkColorSpace::LoadGammas(gammas, outputChannels, src + offsetToMCurves, |
len - offsetToMCurves)) { |
SkColorSpacePrintf("Failed to read M curves from A to B tag.\n"); |
} |
@@ -680,23 +680,25 @@ sk_sp<SkColorSpace> SkColorSpace::NewICC(const void* base, size_t len) { |
// It is not uncommon to see missing or empty gamma tags. This indicates |
// that we should use unit gamma. |
- sk_sp<SkGammas> gammas(new SkGammas()); |
+ SkGammaCurve curves[3]; |
r = ICCTag::Find(tags.get(), tagCount, kTAG_rTRC); |
g = ICCTag::Find(tags.get(), tagCount, kTAG_gTRC); |
b = ICCTag::Find(tags.get(), tagCount, kTAG_bTRC); |
- if (!r || !SkColorSpace::LoadGammas(&gammas->fRed, 1, |
+ if (!r || !SkColorSpace::LoadGammas(&curves[0], 1, |
r->addr((const uint8_t*) base), r->fLength)) { |
SkColorSpacePrintf("Failed to read R gamma tag.\n"); |
} |
- if (!g || !SkColorSpace::LoadGammas(&gammas->fGreen, 1, |
+ if (!g || !SkColorSpace::LoadGammas(&curves[1], 1, |
g->addr((const uint8_t*) base), g->fLength)) { |
SkColorSpacePrintf("Failed to read G gamma tag.\n"); |
} |
- if (!b || !SkColorSpace::LoadGammas(&gammas->fBlue, 1, |
+ if (!b || !SkColorSpace::LoadGammas(&curves[2], 1, |
b->addr((const uint8_t*) base), b->fLength)) { |
SkColorSpacePrintf("Failed to read B gamma tag.\n"); |
} |
+ sk_sp<SkGammas> gammas(new SkGammas(std::move(curves[0]), std::move(curves[1]), |
+ std::move(curves[2]))); |
SkMatrix44 mat(SkMatrix44::kUninitialized_Constructor); |
mat.set3x3ColMajorf(toXYZ); |
if (gammas->isValues()) { |
@@ -716,13 +718,15 @@ sk_sp<SkColorSpace> SkColorSpace::NewICC(const void* base, size_t len) { |
const ICCTag* a2b0 = ICCTag::Find(tags.get(), tagCount, kTAG_A2B0); |
if (a2b0) { |
SkAutoTDelete<SkColorLookUpTable> colorLUT(new SkColorLookUpTable()); |
- sk_sp<SkGammas> gammas(new SkGammas()); |
+ SkGammaCurve curves[3]; |
SkMatrix44 toXYZ(SkMatrix44::kUninitialized_Constructor); |
- if (!SkColorSpace::LoadA2B0(colorLUT, gammas, &toXYZ, |
+ if (!SkColorSpace::LoadA2B0(colorLUT, curves, &toXYZ, |
a2b0->addr((const uint8_t*) base), a2b0->fLength)) { |
return_null("Failed to parse A2B0 tag"); |
} |
+ sk_sp<SkGammas> gammas(new SkGammas(std::move(curves[0]), std::move(curves[1]), |
+ std::move(curves[2]))); |
if (colorLUT->fTable) { |
return sk_sp<SkColorSpace>(new SkColorSpace(colorLUT.release(), gammas, toXYZ)); |
} else if (gammas->isValues()) { |