Index: third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp |
diff --git a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp |
index 960d5e02be9d121765d633d53abe90b32cf7a90e..c6dd020fb592272615f73e0492c1a1401e46f1a9 100644 |
--- a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp |
+++ b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.cpp |
@@ -225,6 +225,8 @@ void DeferredImageDecoder::activateLazyDecoding() |
const bool isSingleFrame = m_actualDecoder->repetitionCount() == cAnimationNone || (m_allDataReceived && m_actualDecoder->frameCount() == 1u); |
m_frameGenerator = ImageFrameGenerator::create(SkISize::Make(m_actualDecoder->decodedSize().width(), m_actualDecoder->decodedSize().height()), m_data, m_allDataReceived, !isSingleFrame); |
+ // GIF images support Index8 decoding: other decoders do not. |
+ m_frameGenerator->setDecoderCanDecodeToIndex8(m_filenameExtension == "gif"); |
} |
void DeferredImageDecoder::prepareLazyDecodedFrames() |
@@ -265,7 +267,7 @@ void DeferredImageDecoder::prepareLazyDecodedFrames() |
} |
} |
-inline SkImageInfo imageInfoFrom(const SkISize& decodedSize, bool knownToBeOpaque) |
+static inline SkImageInfo imageInfoFrom(const SkISize& decodedSize, bool knownToBeOpaque) |
{ |
return SkImageInfo::MakeN32(decodedSize.width(), decodedSize.height(), knownToBeOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); |
} |
@@ -276,8 +278,13 @@ PassRefPtr<SkImage> DeferredImageDecoder::createFrameImageAtIndex(size_t index, |
ASSERT(decodedSize.width() > 0); |
ASSERT(decodedSize.height() > 0); |
- DecodingImageGenerator* generator = new DecodingImageGenerator(m_frameGenerator, imageInfoFrom(decodedSize, knownToBeOpaque), index); |
- RefPtr<SkImage> image = adoptRef(SkImage::NewFromGenerator(generator)); // SkImage takes ownership of the generator. |
+ const SkImageInfo info = m_frameGenerator->canDecodeTo(index, kIndex_8_SkColorType) |
+ ? SkImageInfo::Make(decodedSize.width(), decodedSize.height(), kIndex_8_SkColorType, |
+ knownToBeOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType) |
+ : imageInfoFrom(decodedSize, knownToBeOpaque); |
+ |
+ DecodingImageGenerator* generator = new DecodingImageGenerator(m_frameGenerator, info, index); |
+ RefPtr<SkImage> image = adoptRef(SkImage::NewFromGenerator(generator)); |
if (!image) |
return nullptr; |