Chromium Code Reviews| Index: third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageReader.cpp |
| diff --git a/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageReader.cpp b/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageReader.cpp |
| index 7e10d1d10a1a57d2d6724d62ce89a52d1bbad3c1..43736b09c37d33dd9fc6f34bc848d4e08537c173 100644 |
| --- a/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageReader.cpp |
| +++ b/third_party/WebKit/Source/platform/image-decoders/bmp/BMPImageReader.cpp |
| @@ -79,6 +79,7 @@ BMPImageReader::BMPImageReader(ImageDecoder* parent, size_t decodedAndHeaderOffs |
| , m_needToProcessColorTable(false) |
| , m_seenNonZeroAlphaPixel(false) |
| , m_seenZeroAlphaPixel(false) |
| + , m_hasPixelsWithAlpha(false) |
| , m_isInICO(isInICO) |
| , m_decodingAndMask(false) |
| { |
| @@ -119,10 +120,6 @@ bool BMPImageReader::decodeBMP(bool onlySize) |
| if (!m_buffer->setSize(m_parent->size().width(), m_parent->size().height())) |
| return m_parent->setFailed(); // Unable to allocate. |
| m_buffer->setStatus(ImageFrame::FramePartial); |
|
scroggo_chromium
2016/05/16 20:32:08
Previously, this set the alpha to false for a part
|
| - // setSize() calls eraseARGB(), which resets the alpha flag, so we force |
| - // it back to false here. We'll set it true below in all cases where |
| - // these 0s could actually show through. |
| - m_buffer->setHasAlpha(false); |
| // For BMPs, the frame always fills the entire image. |
| m_buffer->setOriginalFrameRect(IntRect(IntPoint(), m_parent->size())); |
| @@ -151,6 +148,7 @@ bool BMPImageReader::decodeBMP(bool onlySize) |
| return false; |
| // Done! |
| + m_buffer->setHasAlpha(m_hasPixelsWithAlpha); |
| m_buffer->setStatus(ImageFrame::FrameComplete); |
| return true; |
| } |
| @@ -610,7 +608,7 @@ BMPImageReader::ProcessingResult BMPImageReader::processRLEData() |
| case 0: // Magic token: EOL |
| // Skip any remaining pixels in this row. |
| if (m_coord.x() < m_parent->size().width()) |
| - m_buffer->setHasAlpha(true); |
| + m_hasPixelsWithAlpha = true; |
| moveBufferToNextRow(); |
| m_decodedOffset += 2; |
| @@ -619,7 +617,7 @@ BMPImageReader::ProcessingResult BMPImageReader::processRLEData() |
| case 1: // Magic token: EOF |
| // Skip any remaining pixels in the image. |
| if ((m_coord.x() < m_parent->size().width()) || (m_isTopDown ? (m_coord.y() < (m_parent->size().height() - 1)) : (m_coord.y() > 0))) |
| - m_buffer->setHasAlpha(true); |
| + m_hasPixelsWithAlpha = true; |
| // There's no need to move |m_coord| here to trigger the caller |
| // to call setPixelsChanged(). If the only thing that's changed |
| // is the alpha state, that will be properly written into the |
| @@ -637,7 +635,7 @@ BMPImageReader::ProcessingResult BMPImageReader::processRLEData() |
| const uint8_t dx = readUint8(2); |
| const uint8_t dy = readUint8(3); |
| if (dx || dy) |
| - m_buffer->setHasAlpha(true); |
| + m_hasPixelsWithAlpha = true; |
| if (((m_coord.x() + dx) > m_parent->size().width()) || pastEndOfImage(dy)) |
| return Failure; |
| @@ -749,7 +747,7 @@ BMPImageReader::ProcessingResult BMPImageReader::processNonRLEData(bool inRLE, i |
| // web will not be doing a lot of inverting. |
| if (colorIndex) { |
| setRGBA(0, 0, 0, 0); |
| - m_buffer->setHasAlpha(true); |
| + m_hasPixelsWithAlpha = true; |
| } else |
| m_coord.move(1, 0); |
| } else { |
| @@ -785,8 +783,9 @@ BMPImageReader::ProcessingResult BMPImageReader::processNonRLEData(bool inRLE, i |
| if (m_seenZeroAlphaPixel) { |
| m_buffer->zeroFillPixelData(); |
| m_seenZeroAlphaPixel = false; |
| - } else if (alpha != 255) |
| - m_buffer->setHasAlpha(true); |
| + } else if (alpha != 255) { |
| + m_hasPixelsWithAlpha = true; |
| + } |
| } |
| setRGBA(getComponent(pixel, 0), getComponent(pixel, 1), |