Chromium Code Reviews| Index: third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp |
| diff --git a/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp b/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp |
| index b332fd9d54f678d45843a7c906dc1d3ff6805cb7..3b29a47ee3e6abb65d0afd9fc57f98248844b922 100644 |
| --- a/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp |
| +++ b/third_party/WebKit/Source/platform/graphics/ImageFrameGenerator.cpp |
| @@ -143,7 +143,7 @@ bool ImageFrameGenerator::decodeAndScale(const SkImageInfo& info, size_t index, |
| m_externalAllocator = adoptPtr(new ExternalMemoryAllocator(info, pixels, rowBytes)); |
| - SkBitmap bitmap = tryToResumeDecode(scaledSize, index); |
| + SkBitmap bitmap = tryToResumeDecode(scaledSize, index, info.colorType()); |
| if (bitmap.isNull()) |
| return false; |
| @@ -205,7 +205,7 @@ bool ImageFrameGenerator::decodeToYUV(SkISize componentSizes[3], void* planes[3] |
| return yuvDecoded; |
| } |
| -SkBitmap ImageFrameGenerator::tryToResumeDecode(const SkISize& scaledSize, size_t index) |
| +SkBitmap ImageFrameGenerator::tryToResumeDecode(const SkISize& scaledSize, size_t index, SkColorType outType) |
| { |
| TRACE_EVENT1("blink", "ImageFrameGenerator::tryToResumeDecodeAndScale", "index", static_cast<int>(index)); |
| @@ -214,7 +214,7 @@ SkBitmap ImageFrameGenerator::tryToResumeDecode(const SkISize& scaledSize, size_ |
| ASSERT(!resumeDecoding || decoder); |
| SkBitmap fullSizeImage; |
| - bool complete = decode(index, &decoder, &fullSizeImage); |
| + bool complete = decode(index, &decoder, &fullSizeImage, outType); |
| if (!decoder) |
| return SkBitmap(); |
| @@ -280,19 +280,17 @@ void ImageFrameGenerator::setHasAlpha(size_t index, bool hasAlpha) |
| m_hasAlpha[index] = hasAlpha; |
| } |
| -bool ImageFrameGenerator::decode(size_t index, ImageDecoder** decoder, SkBitmap* bitmap) |
| +bool ImageFrameGenerator::decode(size_t index, ImageDecoder** decoder, SkBitmap* bitmap, SkColorType outType) |
| { |
| TRACE_EVENT2("blink", "ImageFrameGenerator::decode", "width", m_fullSize.width(), "height", m_fullSize.height()); |
| ASSERT(decoder); |
| SharedBuffer* data = 0; |
| bool allDataReceived = false; |
| - bool newDecoder = false; |
| m_data.data(&data, &allDataReceived); |
| // Try to create an ImageDecoder if we are not given one. |
| if (!*decoder) { |
| - newDecoder = true; |
| if (m_imageDecoderFactory) |
| *decoder = m_imageDecoderFactory->create().leakPtr(); |
| @@ -303,15 +301,23 @@ bool ImageFrameGenerator::decode(size_t index, ImageDecoder** decoder, SkBitmap* |
| return false; |
| } |
| - if (!m_isMultiFrame && newDecoder && allDataReceived) { |
| + if (!m_isMultiFrame && allDataReceived) { |
|
scroggo_chromium
2015/10/19 20:41:36
It seems like removing newDecoder is a separate be
aleksandar.stojiljkovic
2015/10/20 09:51:12
Yes.
That code was originally contributed here:
ht
scroggo_chromium
2015/10/20 15:06:41
Does it need to be tied to the change to support 5
aleksandar.stojiljkovic
2015/10/20 18:28:41
It makes this use case possible: images originally
aleksandar.stojiljkovic
2015/10/20 18:57:56
It is also required for decode to display resoluti
|
| // If we're using an external memory allocator that means we're decoding |
| // directly into the output memory and we can save one memcpy. |
| ASSERT(m_externalAllocator.get()); |
| (*decoder)->setMemoryAllocator(m_externalAllocator.get()); |
| } |
| (*decoder)->setData(data, allDataReceived); |
| - |
| + if (outType == kRGB_565_SkColorType) { |
| + if (!(*decoder)->setDecodeRGB565Enabled(true)) { |
| + ASSERT(false); |
| + return false; |
| + } |
| + } |
| ImageFrame* frame = (*decoder)->frameBufferAtIndex(index); |
| + // restore back to default |
| + (*decoder)->setDecodeRGB565Enabled(false); |
|
scroggo_chromium
2015/10/19 20:41:36
What happens if the caller tries to switch back an
aleksandar.stojiljkovic
2015/10/20 09:51:12
clear the image frame happens in call to ImageFram
scroggo_chromium
2015/10/20 15:06:41
Agreed. But ImageDecoder only calls setSize if it
aleksandar.stojiljkovic
2015/10/20 18:28:41
It is something I've seen happening every time on
|
| + |
| // For multi-frame image decoders, we need to know how many frames are |
| // in that image in order to release the decoder when all frames are |
| // decoded. frameCount() is reliable only if all data is received and set in |
| @@ -379,4 +385,27 @@ bool ImageFrameGenerator::getYUVComponentSizes(SkISize componentSizes[3]) |
| return updateYUVComponentSizes(decoder.get(), componentSizes, ImageDecoder::SizeForMemoryAllocation); |
| } |
| +bool ImageFrameGenerator::canDecodeToRGB565() |
| +{ |
| + // as the same buffer could be used to store consecutive frames, avoid the complexity |
| + // since some of consecutive frames could have alpha |
| + if (m_isMultiFrame) |
| + return false; |
| + |
| + // FIXME check how much this cost (decoder creation) and, also for getYUVComponentSizes, |
| + // cache it in ImageDecodingStore for the real decode |
| + SharedBuffer* data = 0; |
| + bool allDataReceived = false; |
| + m_data.data(&data, &allDataReceived); |
| + |
| + // partially received data needs to have alpha |
| + if (!allDataReceived) |
| + return false; |
| + |
| + OwnPtr<ImageDecoder> decoder = ImageDecoder::create(*data, ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied); |
| + if (!decoder) |
| + return false; |
| + return decoder->canDecodeToRGB565(); |
| +} |
| + |
| } // namespace blink |