summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/image-decoders/skia/BMPImageReader.h
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/image-decoders/skia/BMPImageReader.h')
-rw-r--r--WebCore/platform/image-decoders/skia/BMPImageReader.h327
1 files changed, 0 insertions, 327 deletions
diff --git a/WebCore/platform/image-decoders/skia/BMPImageReader.h b/WebCore/platform/image-decoders/skia/BMPImageReader.h
deleted file mode 100644
index 0edf7b0..0000000
--- a/WebCore/platform/image-decoders/skia/BMPImageReader.h
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * Copyright (c) 2008, 2009, Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef BMPImageReader_h
-#define BMPImageReader_h
-
-#include <stdint.h>
-#include "ImageDecoder.h"
-
-namespace WebCore {
-
- // This class decodes a BMP image. It is used as a base for the BMP and ICO
- // decoders, which wrap it in the appropriate code to read file headers, etc.
- class BMPImageReader : public ImageDecoder {
- public:
- BMPImageReader();
-
- // Does the actual decoding. |data| starts at the beginning of the file,
- // but may be incomplete.
- virtual void decodeImage(SharedBuffer* data) = 0;
-
- // ImageDecoder
- virtual void setData(SharedBuffer* data, bool allDataReceived);
- virtual RGBA32Buffer* frameBufferAtIndex(size_t index);
-
- protected:
- enum AndMaskState {
- None,
- NotYetDecoded,
- Decoding,
- };
-
- // Decodes a single BMP, starting with an info header.
- void decodeBMP(SharedBuffer* data);
-
- // Read a value from |data[m_decodedOffset + additionalOffset]|, converting
- // from little to native endianness.
- inline uint16_t readUint16(SharedBuffer* data, int additionalOffset) const
- {
- uint16_t result;
- memcpy(&result, &data->data()[m_decodedOffset + additionalOffset], 2);
- #if PLATFORM(BIG_ENDIAN)
- result = ((result & 0xff) << 8) | ((result & 0xff00) >> 8);
- #endif
- return result;
- }
-
- inline uint32_t readUint32(SharedBuffer* data, int additionalOffset) const
- {
- uint32_t result;
- memcpy(&result, &data->data()[m_decodedOffset + additionalOffset], 4);
- #if PLATFORM(BIG_ENDIAN)
- result = ((result & 0xff) << 24) | ((result & 0xff00) << 8) |
- ((result & 0xff0000) >> 8) | ((result & 0xff000000) >> 24);
- #endif
- return result;
- }
-
- // An index into |m_data| representing how much we've already decoded.
- size_t m_decodedOffset;
-
- // The file offset at which the BMP info header starts.
- size_t m_headerOffset;
-
- // The file offset at which the actual image bits start. When decoding ICO
- // files, this is set to 0, since it's not stored anywhere in a header; the
- // reader functions expect the image data to start immediately after the
- // header and (if necessary) color table.
- size_t m_imgDataOffset;
-
- // ICOs store a 1bpp "mask" immediately after the main bitmap image data
- // (and, confusingly, add its height to the biHeight value in the info
- // header, thus doubling it). This variable tracks whether we have such a
- // mask and if we've started decoding it yet.
- AndMaskState m_andMaskState;
-
- private:
- // The various BMP compression types. We don't currently decode all these.
- enum CompressionType {
- // Universal types
- RGB = 0,
- RLE8 = 1,
- RLE4 = 2,
- // Windows V3+ only
- BITFIELDS = 3,
- JPEG = 4,
- PNG = 5,
- // OS/2 2.x-only
- HUFFMAN1D, // Stored in file as 3
- RLE24, // Stored in file as 4
- };
-
- // These are based on the Windows BITMAPINFOHEADER and RGBTRIPLE structs,
- // but with unnecessary entries removed.
- struct BitmapInfoHeader {
- uint32_t biSize;
- int32_t biWidth;
- int32_t biHeight;
- uint16_t biBitCount;
- CompressionType biCompression;
- uint32_t biClrUsed;
- };
- struct RGBTriple {
- uint8_t rgbBlue;
- uint8_t rgbGreen;
- uint8_t rgbRed;
- };
-
- // Determines the size of the BMP info header. Returns true if the size is
- // valid.
- bool getInfoHeaderSize(SharedBuffer* data);
-
- // Processes the BMP info header. Returns true if the info header could be
- // decoded.
- bool processInfoHeader(SharedBuffer* data);
-
- // Helper function for processInfoHeader() which does the actual reading of
- // header values from the byte stream. Returns false on error.
- bool readInfoHeader(SharedBuffer* data);
-
- // Returns true if this is a Windows V4+ BMP.
- inline bool isWindowsV4Plus() const
- {
- // Windows V4 info header is 108 bytes. V5 is 124 bytes.
- return (m_infoHeader.biSize == 108) || (m_infoHeader.biSize == 124);
- }
-
- // Returns false if consistency errors are found in the info header.
- bool isInfoHeaderValid() const;
-
- // For BI_BITFIELDS images, initializes the m_bitMasks[] and m_bitOffsets[]
- // arrays. processInfoHeader() will initialize these for other compression
- // types where needed.
- bool processBitmasks(SharedBuffer* data);
-
- // For paletted images, allocates and initializes the m_colorTable[] array.
- bool processColorTable(SharedBuffer* data);
-
- // Processes an RLE-encoded image. Returns true if the entire image was
- // decoded.
- bool processRLEData(SharedBuffer* data);
-
- // Processes a set of non-RLE-compressed pixels. Two cases:
- // * inRLE = true: the data is inside an RLE-encoded bitmap. Tries to
- // process |numPixels| pixels on the current row; returns true on
- // success.
- // * inRLE = false: the data is inside a non-RLE-encoded bitmap.
- // |numPixels| is ignored. Expects |m_coord| to point at the beginning
- // of the next row to be decoded. Tries to process as many complete
- // rows as possible. Returns true if the whole image was decoded.
- bool processNonRLEData(SharedBuffer* data, bool inRLE, int numPixels);
-
- // Returns true if the current y-coordinate plus |numRows| would be past
- // the end of the image. Here "plus" means "toward the end of the image",
- // so downwards for m_isTopDown images and upwards otherwise.
- inline bool pastEndOfImage(int numRows)
- {
- return m_isTopDown
- ? ((m_coord.y() + numRows) >= size().height())
- : ((m_coord.y() - numRows) < 0);
- }
-
- // Returns the pixel data for the current X coordinate in a uint32_t.
- // Assumes m_decodedOffset has been set to the beginning of the current
- // row.
- // NOTE: Only as many bytes of the return value as are needed to hold the
- // pixel data will actually be set.
- inline uint32_t readCurrentPixel(SharedBuffer* data, int bytesPerPixel) const
- {
- const int additionalOffset = m_coord.x() * bytesPerPixel;
- switch (bytesPerPixel) {
- case 2:
- return readUint16(data, additionalOffset);
-
- case 3: {
- // It doesn't matter that we never set the most significant byte of
- // the return value here in little-endian mode, the caller won't
- // read it.
- uint32_t pixel;
- memcpy(&pixel,
- &data->data()[m_decodedOffset + additionalOffset], 3);
- #if PLATFORM(BIG_ENDIAN)
- pixel = ((pixel & 0xff00) << 8) | ((pixel & 0xff0000) >> 8) |
- ((pixel & 0xff000000) >> 24);
- #endif
- return pixel;
- }
-
- case 4:
- return readUint32(data, additionalOffset);
-
- default:
- ASSERT_NOT_REACHED();
- return 0;
- }
- }
-
- // Returns the value of the desired component (0, 1, 2, 3 == R, G, B, A) in
- // the given pixel data.
- inline unsigned getComponent(uint32_t pixel, int component) const
- {
- return ((pixel & m_bitMasks[component]) >> m_bitShiftsRight[component])
- << m_bitShiftsLeft[component];
- }
-
- inline unsigned getAlpha(uint32_t pixel) const
- {
- // For images without alpha, return alpha of 0xff.
- if (m_bitMasks[3] == 0)
- return 0xff;
-
- return getComponent(pixel, 3);
- }
-
- // Sets the current pixel to the color given by |colorIndex|. This also
- // increments the relevant local variables to move the current pixel right
- // by one.
- inline void setI(size_t colorIndex)
- {
- setRGBA(m_colorTable[colorIndex].rgbRed, m_colorTable[colorIndex].rgbGreen,
- m_colorTable[colorIndex].rgbBlue, 0xff);
- }
-
- // Like setI(), but with the individual component values specified.
- inline void setRGBA(unsigned red, unsigned green, unsigned blue, unsigned alpha)
- {
- RGBA32Buffer::setRGBA(
- m_frameBufferCache.first().bitmap().getAddr32(m_coord.x(), m_coord.y()),
- red, green, blue, alpha);
- m_coord.move(1, 0);
- }
-
- // Fills pixels from the current X-coordinate up to, but not including,
- // |endCoord| with the color given by the individual components. This also
- // increments the relevant local variables to move the current pixel right
- // to |endCoord|.
- inline void fillRGBA(int endCoord, unsigned red, unsigned green, unsigned blue, unsigned alpha)
- {
- while (m_coord.x() < endCoord)
- setRGBA(red, green, blue, alpha);
- }
-
- // Resets the relevant local variables to start drawing at the left edge of
- // the "next" row, where "next" is above or below the current row depending
- // on the value of |m_isTopDown|.
- void moveBufferToNextRow();
-
- // The BMP info header.
- BitmapInfoHeader m_infoHeader;
-
- // True if this is an OS/2 1.x (aka Windows 2.x) BMP. The struct layouts
- // for this type of BMP are slightly different from the later, more common
- // formats.
- bool m_isOS21x;
-
- // True if this is an OS/2 2.x BMP. The meanings of compression types 3
- // and 4 for this type of BMP differ from Windows V3+ BMPs.
- //
- // This will be falsely negative in some cases, but only ones where the way
- // we misinterpret the data is irrelevant.
- bool m_isOS22x;
-
- // True if the BMP is not vertically flipped, that is, the first line of
- // raster data in the file is the top line of the image.
- bool m_isTopDown;
-
- // These flags get set to false as we finish each processing stage.
- bool m_needToProcessBitmasks;
- bool m_needToProcessColorTable;
-
- // Masks/offsets for the color values for non-palette formats. These are
- // bitwise, with array entries 0, 1, 2, 3 corresponding to R, G, B, A.
- //
- // The right/left shift values are meant to be applied after the masks.
- // We need to right shift to compensate for the bitfields' offsets into the
- // 32 bits of pixel data, and left shift to scale the color values up for
- // fields with less than 8 bits of precision. Sadly, we can't just combine
- // these into one shift value because the net shift amount could go either
- // direction. (If only "<< -x" were equivalent to ">> x"...)
- uint32_t m_bitMasks[4];
- int m_bitShiftsRight[4];
- int m_bitShiftsLeft[4];
-
- // The color palette, for paletted formats.
- size_t m_tableSizeInBytes;
- Vector<RGBTriple> m_colorTable;
-
- // The coordinate to which we've decoded the image.
- IntPoint m_coord;
-
- // Variables that track whether we've seen pixels with alpha values != 0
- // and == 0, respectively. See comments in processNonRLEData() on how
- // these are used.
- bool m_seenNonZeroAlphaPixel;
- bool m_seenZeroAlphaPixel;
- };
-
-} // namespace WebCore
-
-#endif