| Index: src/core/SkColorSpace.cpp
|
| diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp
|
| index 3f93f162331f188175b51e84dc529efb215e535b..f988c7d3232e3468a2cb6831be9ecdb285c327db 100644
|
| --- a/src/core/SkColorSpace.cpp
|
| +++ b/src/core/SkColorSpace.cpp
|
| @@ -32,10 +32,10 @@ SkColorSpace_Base::SkColorSpace_Base(GammaNamed gammaNamed, const SkMatrix44& to
|
| , fProfileData(nullptr)
|
| {}
|
|
|
| -SkColorSpace_Base::SkColorSpace_Base(SkColorLookUpTable* colorLUT, sk_sp<SkGammas> gammas,
|
| +SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkColorLookUpTable> colorLUT, sk_sp<SkGammas> gammas,
|
| const SkMatrix44& toXYZD50, sk_sp<SkData> profileData)
|
| : INHERITED(kNonStandard_GammaNamed, toXYZD50, kUnknown_Named)
|
| - , fColorLUT(colorLUT)
|
| + , fColorLUT(std::move(colorLUT))
|
| , fGammas(std::move(gammas))
|
| , fProfileData(std::move(profileData))
|
| {}
|
| @@ -677,7 +677,7 @@ bool load_color_lut(SkColorLookUpTable* colorLUT, uint32_t inputChannels, uint32
|
| }
|
| size_t dataLen = len - kColorLUTHeaderSize;
|
|
|
| - SkASSERT(inputChannels <= SkColorLookUpTable::kMaxChannels && 3 == outputChannels);
|
| + SkASSERT(3 == inputChannels && 3 == outputChannels);
|
| colorLUT->fInputChannels = inputChannels;
|
| colorLUT->fOutputChannels = outputChannels;
|
| uint32_t numEntries = 1;
|
| @@ -783,11 +783,10 @@ bool load_a2b0(SkColorLookUpTable* colorLUT, SkGammaCurve* gammas, SkMatrix44* t
|
| // must be zero.
|
| uint8_t inputChannels = src[8];
|
| uint8_t outputChannels = src[9];
|
| - if (0 == inputChannels || inputChannels > SkColorLookUpTable::kMaxChannels ||
|
| - 3 != outputChannels) {
|
| - // The color LUT assumes that there are at most 16 input channels. For RGB
|
| - // profiles, output channels should be 3.
|
| - SkColorSpacePrintf("Too many input or output channels in A to B tag.\n");
|
| + if (3 != inputChannels || 3 != outputChannels) {
|
| + // We only handle (supposedly) RGB inputs and RGB outputs. The numbers of input
|
| + // channels and output channels both must be 3.
|
| + SkColorSpacePrintf("Input and output channels must equal 3 in A to B tag.\n");
|
| return false;
|
| }
|
|
|
| @@ -936,21 +935,22 @@ sk_sp<SkColorSpace> SkColorSpace::NewICC(const void* input, size_t len) {
|
| // Recognize color profile specified by A2B0 tag.
|
| const ICCTag* a2b0 = ICCTag::Find(tags.get(), tagCount, kTAG_A2B0);
|
| if (a2b0) {
|
| - SkAutoTDelete<SkColorLookUpTable> colorLUT(new SkColorLookUpTable());
|
| + sk_sp<SkColorLookUpTable> colorLUT = sk_make_sp<SkColorLookUpTable>();
|
| SkGammaCurve curves[3];
|
| SkMatrix44 toXYZ(SkMatrix44::kUninitialized_Constructor);
|
| - if (!load_a2b0(colorLUT, curves, &toXYZ, a2b0->addr((const uint8_t*) base),
|
| + if (!load_a2b0(colorLUT.get(), curves, &toXYZ, a2b0->addr((const uint8_t*) base),
|
| a2b0->fLength)) {
|
| return_null("Failed to parse A2B0 tag");
|
| }
|
|
|
| GammaNamed gammaNamed = SkGammas::Named(curves);
|
| - if (colorLUT->fTable || kNonStandard_GammaNamed == gammaNamed) {
|
| + colorLUT = colorLUT->fTable ? colorLUT : nullptr;
|
| + if (colorLUT || kNonStandard_GammaNamed == gammaNamed) {
|
| sk_sp<SkGammas> gammas = sk_make_sp<SkGammas>(std::move(curves[0]),
|
| std::move(curves[1]),
|
| std::move(curves[2]));
|
|
|
| - return sk_sp<SkColorSpace>(new SkColorSpace_Base(colorLUT.release(),
|
| + return sk_sp<SkColorSpace>(new SkColorSpace_Base(std::move(colorLUT),
|
| std::move(gammas), toXYZ,
|
| std::move(data)));
|
| } else {
|
|
|