Chromium Code Reviews| Index: Source/platform/image-decoders/bmp/BMPImageReader.cpp |
| diff --git a/Source/platform/image-decoders/bmp/BMPImageReader.cpp b/Source/platform/image-decoders/bmp/BMPImageReader.cpp |
| index 8cbd07bf04386c7ebe77a3d325aec33f459e93c1..da10c63b3b06a301866350d052aa888ce0b0b6b0 100644 |
| --- a/Source/platform/image-decoders/bmp/BMPImageReader.cpp |
| +++ b/Source/platform/image-decoders/bmp/BMPImageReader.cpp |
| @@ -166,7 +166,9 @@ bool BMPImageReader::readInfoHeaderSize() |
| ASSERT(m_decodedOffset == m_headerOffset); |
| if ((m_decodedOffset > m_data->size()) || ((m_data->size() - m_decodedOffset) < 4)) |
| return false; |
| - m_infoHeader.biSize = readUint32(0); |
| + |
| + FastSharedBufferReader fastReader(m_data); |
| + m_infoHeader.biSize = readUint32(&fastReader, 0); |
| // Don't increment m_decodedOffset here, it just makes the code in |
| // processInfoHeader() more confusing. |
| @@ -241,23 +243,25 @@ bool BMPImageReader::readInfoHeader() |
| m_infoHeader.biCompression = RGB; |
| m_infoHeader.biClrUsed = 0; |
| + FastSharedBufferReader fastReader(m_data); |
| + |
| if (m_isOS21x) { |
| - m_infoHeader.biWidth = readUint16(4); |
| - m_infoHeader.biHeight = readUint16(6); |
| + m_infoHeader.biWidth = readUint16(&fastReader, 4); |
| + m_infoHeader.biHeight = readUint16(&fastReader, 6); |
| ASSERT(!m_isInICO); // ICO is a Windows format, not OS/2! |
| - m_infoHeader.biBitCount = readUint16(10); |
| + m_infoHeader.biBitCount = readUint16(&fastReader, 10); |
| return true; |
| } |
| - m_infoHeader.biWidth = readUint32(4); |
| - m_infoHeader.biHeight = readUint32(8); |
| + m_infoHeader.biWidth = readUint32(&fastReader, 4); |
| + m_infoHeader.biHeight = readUint32(&fastReader, 8); |
| if (m_isInICO) |
| m_infoHeader.biHeight /= 2; |
| - m_infoHeader.biBitCount = readUint16(14); |
| + m_infoHeader.biBitCount = readUint16(&fastReader, 14); |
| // Read compression type, if present. |
| if (m_infoHeader.biSize >= 20) { |
| - uint32_t biCompression = readUint32(16); |
| + uint32_t biCompression = readUint32(&fastReader, 16); |
| // Detect OS/2 2.x-specific compression types. |
| if ((biCompression == 3) && (m_infoHeader.biBitCount == 1)) { |
| @@ -273,8 +277,9 @@ bool BMPImageReader::readInfoHeader() |
| } |
| // Read colors used, if present. |
| - if (m_infoHeader.biSize >= 36) |
| - m_infoHeader.biClrUsed = readUint32(32); |
| + if (m_infoHeader.biSize >= 36) { |
|
Peter Kasting
2015/08/31 19:53:42
Nit: No {}
scroggo_chromium
2015/09/01 22:50:30
Done.
|
| + m_infoHeader.biClrUsed = readUint32(&fastReader, 32); |
| + } |
| // Windows V4+ can safely read the four bitmasks from 40-56 bytes in, so do |
| // that here. If the bit depth is less than 16, these values will be ignored |
| @@ -287,10 +292,10 @@ bool BMPImageReader::readInfoHeader() |
| // For non-Windows V4+, m_bitMasks[] et. al will be initialized later |
| // during processBitmasks(). |
| if (isWindowsV4Plus()) { |
| - m_bitMasks[0] = readUint32(40); |
| - m_bitMasks[1] = readUint32(44); |
| - m_bitMasks[2] = readUint32(48); |
| - m_bitMasks[3] = readUint32(52); |
| + m_bitMasks[0] = readUint32(&fastReader, 40); |
| + m_bitMasks[1] = readUint32(&fastReader, 44); |
| + m_bitMasks[2] = readUint32(&fastReader, 48); |
| + m_bitMasks[3] = readUint32(&fastReader, 52); |
| } |
| // Detect top-down BMPs. |
| @@ -430,9 +435,11 @@ bool BMPImageReader::processBitmasks() |
| // Read bitmasks. |
| if ((m_data->size() - m_decodedOffset) < bitmasksSize) |
| return false; |
| - m_bitMasks[0] = readUint32(0); |
| - m_bitMasks[1] = readUint32(4); |
| - m_bitMasks[2] = readUint32(8); |
| + |
| + FastSharedBufferReader fastReader(m_data); |
| + m_bitMasks[0] = readUint32(&fastReader, 0); |
| + m_bitMasks[1] = readUint32(&fastReader, 4); |
| + m_bitMasks[2] = readUint32(&fastReader, 8); |
| m_decodedOffset += bitmasksSize; |
| } |
| @@ -542,9 +549,9 @@ bool BMPImageReader::processColorTable() |
| return false; |
| m_colorTable.resize(m_infoHeader.biClrUsed); |
| for (size_t i = 0; i < m_infoHeader.biClrUsed; ++i) { |
| - m_colorTable[i].rgbBlue = m_data->data()[m_decodedOffset++]; |
| - m_colorTable[i].rgbGreen = m_data->data()[m_decodedOffset++]; |
| - m_colorTable[i].rgbRed = m_data->data()[m_decodedOffset++]; |
| + m_colorTable[i].rgbBlue = getByte(m_decodedOffset++); |
| + m_colorTable[i].rgbGreen = getByte(m_decodedOffset++); |
| + m_colorTable[i].rgbRed = getByte(m_decodedOffset++); |
| // Skip padding byte (not present on OS/2 1.x). |
| if (!m_isOS21x) |
| ++m_decodedOffset; |
| @@ -594,8 +601,8 @@ BMPImageReader::ProcessingResult BMPImageReader::processRLEData() |
| // For every entry except EOF, we'd better not have reached the end of |
| // the image. |
| - const uint8_t count = m_data->data()[m_decodedOffset]; |
| - const uint8_t code = m_data->data()[m_decodedOffset + 1]; |
| + const uint8_t count = getByte(m_decodedOffset); |
| + const uint8_t code = getByte(m_decodedOffset + 1); |
| if ((count || (code != 1)) && pastEndOfImage(0)) |
| return Failure; |
| @@ -629,8 +636,8 @@ BMPImageReader::ProcessingResult BMPImageReader::processRLEData() |
| // Fail if this takes us past the end of the desired row or |
| // past the end of the image. |
| - const uint8_t dx = m_data->data()[m_decodedOffset + 2]; |
| - const uint8_t dy = m_data->data()[m_decodedOffset + 3]; |
| + const uint8_t dx = getByte(m_decodedOffset + 2); |
| + const uint8_t dy = getByte(m_decodedOffset + 3); |
| if (dx || dy) |
| m_buffer->setHasAlpha(true); |
| if (((m_coord.x() + dx) > m_parent->size().width()) || pastEndOfImage(dy)) |
| @@ -670,7 +677,7 @@ BMPImageReader::ProcessingResult BMPImageReader::processRLEData() |
| return InsufficientData; |
| // One BGR triple that we copy |count| times. |
| - fillRGBA(endX, m_data->data()[m_decodedOffset + 3], m_data->data()[m_decodedOffset + 2], code, 0xff); |
| + fillRGBA(endX, getByte(m_decodedOffset + 3), getByte(m_decodedOffset + 2), code, 0xff); |
| m_decodedOffset += 4; |
| } else { |
| // RLE8 has one color index that gets repeated; RLE4 has two |
| @@ -733,7 +740,7 @@ BMPImageReader::ProcessingResult BMPImageReader::processNonRLEData(bool inRLE, i |
| // the most significant bits in the byte). |
| const uint8_t mask = (1 << m_infoHeader.biBitCount) - 1; |
| for (size_t byte = 0; byte < unpaddedNumBytes; ++byte) { |
| - uint8_t pixelData = m_data->data()[m_decodedOffset + byte]; |
| + uint8_t pixelData = getByte(m_decodedOffset + byte); |
| for (size_t pixel = 0; (pixel < pixelsPerByte) && (m_coord.x() < endX); ++pixel) { |
| const size_t colorIndex = (pixelData >> (8 - m_infoHeader.biBitCount)) & mask; |
| if (m_decodingAndMask) { |
| @@ -758,9 +765,11 @@ BMPImageReader::ProcessingResult BMPImageReader::processNonRLEData(bool inRLE, i |
| } |
| } |
| } else { |
| + FastSharedBufferReader fastReader(m_data); |
| + |
| // RGB data. Decode pixels one at a time, left to right. |
| while (m_coord.x() < endX) { |
| - const uint32_t pixel = readCurrentPixel(bytesPerPixel); |
| + const uint32_t pixel = readCurrentPixel(&fastReader, bytesPerPixel); |
| // Some BMPs specify an alpha channel but don't actually use it |
| // (it contains all 0s). To avoid displaying these images as |