| Index: Source/platform/image-decoders/bmp/BMPImageReader.h
|
| diff --git a/Source/platform/image-decoders/bmp/BMPImageReader.h b/Source/platform/image-decoders/bmp/BMPImageReader.h
|
| index 3938b6c53b54694bd53633f20fb64dee06f54463..83d70caf4a5bc5cbc5559ae760cc74958289e1f1 100644
|
| --- a/Source/platform/image-decoders/bmp/BMPImageReader.h
|
| +++ b/Source/platform/image-decoders/bmp/BMPImageReader.h
|
| @@ -31,10 +31,9 @@
|
| #ifndef BMPImageReader_h
|
| #define BMPImageReader_h
|
|
|
| -#include "platform/image-decoders/FastSharedBufferReader.h"
|
| +#include <stdint.h>
|
| #include "platform/image-decoders/ImageDecoder.h"
|
| #include "wtf/CPU.h"
|
| -#include <stdint.h>
|
|
|
| namespace blink {
|
|
|
| @@ -43,16 +42,26 @@ namespace blink {
|
| class PLATFORM_EXPORT BMPImageReader {
|
| WTF_MAKE_FAST_ALLOCATED(BMPImageReader);
|
| public:
|
| - // Read a value from |buffer|, converting to an int assuming little
|
| - // endianness
|
| - static inline uint16_t readUint16(const char* buffer)
|
| + // Read a value from |data[offset]|, converting from little to native
|
| + // endianness.
|
| + static inline uint16_t readUint16(SharedBuffer* data, int offset)
|
| {
|
| - return *reinterpret_cast<const uint16_t*>(buffer);
|
| + uint16_t result;
|
| + memcpy(&result, &data->data()[offset], 2);
|
| + #if CPU(BIG_ENDIAN)
|
| + result = ((result & 0xff) << 8) | ((result & 0xff00) >> 8);
|
| + #endif
|
| + return result;
|
| }
|
|
|
| - static inline uint32_t readUint32(const char* buffer)
|
| + static inline uint32_t readUint32(SharedBuffer* data, int offset)
|
| {
|
| - return *reinterpret_cast<const uint32_t*>(buffer);
|
| + uint32_t result;
|
| + memcpy(&result, &data->data()[offset], 4);
|
| + #if CPU(BIG_ENDIAN)
|
| + result = ((result & 0xff) << 24) | ((result & 0xff00) << 8) | ((result & 0xff0000) >> 8) | ((result & 0xff000000) >> 24);
|
| + #endif
|
| + return result;
|
| }
|
|
|
| // |parent| is the decoder that owns us.
|
| @@ -62,11 +71,7 @@ public:
|
| BMPImageReader(ImageDecoder* parent, size_t decodedAndHeaderOffset, size_t imgDataOffset, bool isInICO);
|
|
|
| void setBuffer(ImageFrame* buffer) { m_buffer = buffer; }
|
| - void setData(SharedBuffer* data)
|
| - {
|
| - m_data = data;
|
| - m_fastReader.setData(data);
|
| - }
|
| + void setData(SharedBuffer* data) { m_data = data; }
|
|
|
| // Does the actual decoding. If |onlySize| is true, decoding only
|
| // progresses as far as necessary to get the image size. Returns
|
| @@ -119,23 +124,14 @@ private:
|
| uint8_t rgbRed;
|
| };
|
|
|
| - inline uint8_t readUint8(size_t offset) const
|
| - {
|
| - return m_fastReader.getOneByte(m_decodedOffset + offset);
|
| - }
|
| -
|
| inline uint16_t readUint16(int offset) const
|
| {
|
| - char buffer[2];
|
| - const char* data = m_fastReader.getConsecutiveData(m_decodedOffset + offset, 2, buffer);
|
| - return readUint16(data);
|
| + return readUint16(m_data.get(), m_decodedOffset + offset);
|
| }
|
|
|
| inline uint32_t readUint32(int offset) const
|
| {
|
| - char buffer[4];
|
| - const char* data = m_fastReader.getConsecutiveData(m_decodedOffset + offset, 4, buffer);
|
| - return readUint32(data);
|
| + return readUint32(m_data.get(), m_decodedOffset + offset);
|
| }
|
|
|
| // Determines the size of the BMP info header. Returns true if the size
|
| @@ -202,24 +198,25 @@ private:
|
| // the pixel data will actually be set.
|
| inline uint32_t readCurrentPixel(int bytesPerPixel) const
|
| {
|
| - // We need at most 4 bytes, starting at m_decodedOffset + offset.
|
| - char buffer[4];
|
| const int offset = m_coord.x() * bytesPerPixel;
|
| - const char* encodedPixel = m_fastReader.getConsecutiveData(m_decodedOffset + offset, bytesPerPixel, buffer);
|
| switch (bytesPerPixel) {
|
| case 2:
|
| - return readUint16(encodedPixel);
|
| + return readUint16(offset);
|
|
|
| case 3: {
|
| // It doesn't matter that we never set the most significant byte
|
| - // of the return value, the caller won't read it.
|
| + // of the return value here in little-endian mode, the caller
|
| + // won't read it.
|
| uint32_t pixel;
|
| - memcpy(&pixel, encodedPixel, 3);
|
| + memcpy(&pixel, &m_data->data()[m_decodedOffset + offset], 3);
|
| + #if CPU(BIG_ENDIAN)
|
| + pixel = ((pixel & 0xff00) << 8) | ((pixel & 0xff0000) >> 8) | ((pixel & 0xff000000) >> 24);
|
| + #endif
|
| return pixel;
|
| }
|
|
|
| case 4:
|
| - return readUint32(encodedPixel);
|
| + return readUint32(offset);
|
|
|
| default:
|
| ASSERT_NOT_REACHED();
|
| @@ -286,7 +283,6 @@ private:
|
|
|
| // The file to decode.
|
| RefPtr<SharedBuffer> m_data;
|
| - FastSharedBufferReader m_fastReader;
|
|
|
| // An index into |m_data| representing how much we've already decoded.
|
| size_t m_decodedOffset;
|
|
|