Home | History | Annotate | Download | only in bmp
      1 /*
      2  * Copyright (c) 2008, 2009, Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #include "config.h"
     32 #include "platform/image-decoders/bmp/BMPImageReader.h"
     33 
     34 namespace {
     35 
     36 // See comments on m_lookupTableAddresses in the header.
     37 const uint8_t nBitTo8BitlookupTable[] = {
     38     // 1 bit
     39     0, 255,
     40     // 2 bits
     41     0, 85, 170, 255,
     42     // 3 bits
     43     0, 36, 73, 109, 146, 182, 219, 255,
     44     // 4 bits
     45     0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255,
     46     // 5 bits
     47     0, 8, 16, 25, 33, 41, 49, 58, 66, 74, 82, 90, 99, 107, 115, 123,
     48     132, 140, 148, 156, 165, 173, 181, 189, 197, 206, 214, 222, 230, 239, 247, 255,
     49     // 6 bits
     50     0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 45, 49, 53, 57, 61,
     51     65, 69, 73, 77, 81, 85, 89, 93, 97, 101, 105, 109, 113, 117, 121, 125,
     52     130, 134, 138, 142, 146, 150, 154, 158, 162, 166, 170, 174, 178, 182, 186, 190,
     53     194, 198, 202, 206, 210, 215, 219, 223, 227, 231, 235, 239, 243, 247, 251, 255,
     54     // 7 bits
     55     0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30,
     56     32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62,
     57     64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94,
     58     96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126,
     59     129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159,
     60     161, 163, 165, 167, 169, 171, 173, 175, 177, 179, 181, 183, 185, 187, 189, 191,
     61     193, 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 219, 221, 223,
     62     225, 227, 229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 255,
     63 };
     64 
     65 }
     66 
     67 namespace blink {
     68 
     69 BMPImageReader::BMPImageReader(ImageDecoder* parent, size_t decodedAndHeaderOffset, size_t imgDataOffset, bool isInICO)
     70     : m_parent(parent)
     71     , m_buffer(0)
     72     , m_decodedOffset(decodedAndHeaderOffset)
     73     , m_headerOffset(decodedAndHeaderOffset)
     74     , m_imgDataOffset(imgDataOffset)
     75     , m_isOS21x(false)
     76     , m_isOS22x(false)
     77     , m_isTopDown(false)
     78     , m_needToProcessBitmasks(false)
     79     , m_needToProcessColorTable(false)
     80     , m_seenNonZeroAlphaPixel(false)
     81     , m_seenZeroAlphaPixel(false)
     82     , m_isInICO(isInICO)
     83     , m_decodingAndMask(false)
     84 {
     85     // Clue-in decodeBMP() that we need to detect the correct info header size.
     86     memset(&m_infoHeader, 0, sizeof(m_infoHeader));
     87 }
     88 
     89 bool BMPImageReader::decodeBMP(bool onlySize)
     90 {
     91     // Calculate size of info header.
     92     if (!m_infoHeader.biSize && !readInfoHeaderSize())
     93         return false;
     94 
     95     // Read and process info header.
     96     if ((m_decodedOffset < (m_headerOffset + m_infoHeader.biSize)) && !processInfoHeader())
     97         return false;
     98 
     99     // processInfoHeader() set the size, so if that's all we needed, we're done.
    100     if (onlySize)
    101         return true;
    102 
    103     // Read and process the bitmasks, if needed.
    104     if (m_needToProcessBitmasks && !processBitmasks())
    105         return false;
    106 
    107     // Read and process the color table, if needed.
    108     if (m_needToProcessColorTable && !processColorTable())
    109         return false;
    110 
    111     // Initialize the framebuffer if needed.
    112     ASSERT(m_buffer);  // Parent should set this before asking us to decode!
    113     if (m_buffer->status() == ImageFrame::FrameEmpty) {
    114         if (!m_buffer->setSize(m_parent->size().width(), m_parent->size().height()))
    115             return m_parent->setFailed(); // Unable to allocate.
    116         m_buffer->setStatus(ImageFrame::FramePartial);
    117         // setSize() calls eraseARGB(), which resets the alpha flag, so we force
    118         // it back to false here.  We'll set it true below in all cases where
    119         // these 0s could actually show through.
    120         m_buffer->setHasAlpha(false);
    121 
    122         // For BMPs, the frame always fills the entire image.
    123         m_buffer->setOriginalFrameRect(IntRect(IntPoint(), m_parent->size()));
    124 
    125         if (!m_isTopDown)
    126             m_coord.setY(m_parent->size().height() - 1);
    127     }
    128 
    129     // Decode the data.
    130     if (!m_decodingAndMask && !pastEndOfImage(0)) {
    131         if ((m_infoHeader.biCompression != RLE4) && (m_infoHeader.biCompression != RLE8) && (m_infoHeader.biCompression != RLE24)) {
    132             const ProcessingResult result = processNonRLEData(false, 0);
    133             if (result != Success)
    134                 return (result == Failure) ? m_parent->setFailed() : false;
    135         } else if (!processRLEData())
    136             return false;
    137     }
    138 
    139     // If the image has an AND mask and there was no alpha data, process the
    140     // mask.
    141     if (m_isInICO && !m_decodingAndMask && !m_buffer->hasAlpha()) {
    142         // Reset decoding coordinates to start of image.
    143         m_coord.setX(0);
    144         m_coord.setY(m_isTopDown ? 0 : (m_parent->size().height() - 1));
    145 
    146         // The AND mask is stored as 1-bit data.
    147         m_infoHeader.biBitCount = 1;
    148 
    149         m_decodingAndMask = true;
    150     }
    151     if (m_decodingAndMask) {
    152         const ProcessingResult result = processNonRLEData(false, 0);
    153         if (result != Success)
    154             return (result == Failure) ? m_parent->setFailed() : false;
    155     }
    156 
    157     // Done!
    158     m_buffer->setStatus(ImageFrame::FrameComplete);
    159     return true;
    160 }
    161 
    162 bool BMPImageReader::readInfoHeaderSize()
    163 {
    164     // Get size of info header.
    165     ASSERT(m_decodedOffset == m_headerOffset);
    166     if ((m_decodedOffset > m_data->size()) || ((m_data->size() - m_decodedOffset) < 4))
    167         return false;
    168     m_infoHeader.biSize = readUint32(0);
    169     // Don't increment m_decodedOffset here, it just makes the code in
    170     // processInfoHeader() more confusing.
    171 
    172     // Don't allow the header to overflow (which would be harmless here, but
    173     // problematic or at least confusing in other places), or to overrun the
    174     // image data.
    175     if (((m_headerOffset + m_infoHeader.biSize) < m_headerOffset) || (m_imgDataOffset && (m_imgDataOffset < (m_headerOffset + m_infoHeader.biSize))))
    176         return m_parent->setFailed();
    177 
    178     // See if this is a header size we understand:
    179     // OS/2 1.x: 12
    180     if (m_infoHeader.biSize == 12)
    181         m_isOS21x = true;
    182     // Windows V3: 40
    183     else if ((m_infoHeader.biSize == 40) || isWindowsV4Plus())
    184         ;
    185     // OS/2 2.x: any multiple of 4 between 16 and 64, inclusive, or 42 or 46
    186     else if ((m_infoHeader.biSize >= 16) && (m_infoHeader.biSize <= 64) && (!(m_infoHeader.biSize & 3) || (m_infoHeader.biSize == 42) || (m_infoHeader.biSize == 46)))
    187         m_isOS22x = true;
    188     else
    189         return m_parent->setFailed();
    190 
    191     return true;
    192 }
    193 
    194 bool BMPImageReader::processInfoHeader()
    195 {
    196     // Read info header.
    197     ASSERT(m_decodedOffset == m_headerOffset);
    198     if ((m_decodedOffset > m_data->size()) || ((m_data->size() - m_decodedOffset) < m_infoHeader.biSize) || !readInfoHeader())
    199         return false;
    200     m_decodedOffset += m_infoHeader.biSize;
    201 
    202     // Sanity-check header values.
    203     if (!isInfoHeaderValid())
    204         return m_parent->setFailed();
    205 
    206     // Set our size.
    207     if (!m_parent->setSize(m_infoHeader.biWidth, m_infoHeader.biHeight))
    208         return false;
    209 
    210     // For paletted images, bitmaps can set biClrUsed to 0 to mean "all
    211     // colors", so set it to the maximum number of colors for this bit depth.
    212     // Also do this for bitmaps that put too large a value here.
    213     if (m_infoHeader.biBitCount < 16) {
    214       const uint32_t maxColors = static_cast<uint32_t>(1) << m_infoHeader.biBitCount;
    215       if (!m_infoHeader.biClrUsed || (m_infoHeader.biClrUsed > maxColors))
    216           m_infoHeader.biClrUsed = maxColors;
    217     }
    218 
    219     // For any bitmaps that set their BitCount to the wrong value, reset the
    220     // counts now that we've calculated the number of necessary colors, since
    221     // other code relies on this value being correct.
    222     if (m_infoHeader.biCompression == RLE8)
    223         m_infoHeader.biBitCount = 8;
    224     else if (m_infoHeader.biCompression == RLE4)
    225         m_infoHeader.biBitCount = 4;
    226 
    227     // Tell caller what still needs to be processed.
    228     if (m_infoHeader.biBitCount >= 16)
    229         m_needToProcessBitmasks = true;
    230     else if (m_infoHeader.biBitCount)
    231         m_needToProcessColorTable = true;
    232 
    233     return true;
    234 }
    235 
    236 bool BMPImageReader::readInfoHeader()
    237 {
    238     // Pre-initialize some fields that not all headers set.
    239     m_infoHeader.biCompression = RGB;
    240     m_infoHeader.biClrUsed = 0;
    241 
    242     if (m_isOS21x) {
    243         m_infoHeader.biWidth = readUint16(4);
    244         m_infoHeader.biHeight = readUint16(6);
    245         ASSERT(!m_isInICO); // ICO is a Windows format, not OS/2!
    246         m_infoHeader.biBitCount = readUint16(10);
    247         return true;
    248     }
    249 
    250     m_infoHeader.biWidth = readUint32(4);
    251     m_infoHeader.biHeight = readUint32(8);
    252     if (m_isInICO)
    253         m_infoHeader.biHeight /= 2;
    254     m_infoHeader.biBitCount = readUint16(14);
    255 
    256     // Read compression type, if present.
    257     if (m_infoHeader.biSize >= 20) {
    258         uint32_t biCompression = readUint32(16);
    259 
    260         // Detect OS/2 2.x-specific compression types.
    261         if ((biCompression == 3) && (m_infoHeader.biBitCount == 1)) {
    262             m_infoHeader.biCompression = HUFFMAN1D;
    263             m_isOS22x = true;
    264         } else if ((biCompression == 4) && (m_infoHeader.biBitCount == 24)) {
    265             m_infoHeader.biCompression = RLE24;
    266             m_isOS22x = true;
    267         } else if (biCompression > 5)
    268             return m_parent->setFailed(); // Some type we don't understand.
    269         else
    270             m_infoHeader.biCompression = static_cast<CompressionType>(biCompression);
    271     }
    272 
    273     // Read colors used, if present.
    274     if (m_infoHeader.biSize >= 36)
    275         m_infoHeader.biClrUsed = readUint32(32);
    276 
    277     // Windows V4+ can safely read the four bitmasks from 40-56 bytes in, so do
    278     // that here. If the bit depth is less than 16, these values will be ignored
    279     // by the image data decoders. If the bit depth is at least 16 but the
    280     // compression format isn't BITFIELDS, the RGB bitmasks will be ignored and
    281     // overwritten in processBitmasks(). (The alpha bitmask will never be
    282     // overwritten: images that actually want alpha have to specify a valid
    283     // alpha mask. See comments in processBitmasks().)
    284     //
    285     // For non-Windows V4+, m_bitMasks[] et. al will be initialized later
    286     // during processBitmasks().
    287     if (isWindowsV4Plus()) {
    288         m_bitMasks[0] = readUint32(40);
    289         m_bitMasks[1] = readUint32(44);
    290         m_bitMasks[2] = readUint32(48);
    291         m_bitMasks[3] = readUint32(52);
    292     }
    293 
    294     // Detect top-down BMPs.
    295     if (m_infoHeader.biHeight < 0) {
    296         m_isTopDown = true;
    297         m_infoHeader.biHeight = -m_infoHeader.biHeight;
    298     }
    299 
    300     return true;
    301 }
    302 
    303 bool BMPImageReader::isInfoHeaderValid() const
    304 {
    305     // Non-positive widths/heights are invalid.  (We've already flipped the
    306     // sign of the height for top-down bitmaps.)
    307     if ((m_infoHeader.biWidth <= 0) || !m_infoHeader.biHeight)
    308         return false;
    309 
    310     // Only Windows V3+ has top-down bitmaps.
    311     if (m_isTopDown && (m_isOS21x || m_isOS22x))
    312         return false;
    313 
    314     // Only bit depths of 1, 4, 8, or 24 are universally supported.
    315     if ((m_infoHeader.biBitCount != 1) && (m_infoHeader.biBitCount != 4) && (m_infoHeader.biBitCount != 8) && (m_infoHeader.biBitCount != 24)) {
    316         // Windows V3+ additionally supports bit depths of 0 (for embedded
    317         // JPEG/PNG images), 16, and 32.
    318         if (m_isOS21x || m_isOS22x || (m_infoHeader.biBitCount && (m_infoHeader.biBitCount != 16) && (m_infoHeader.biBitCount != 32)))
    319             return false;
    320     }
    321 
    322     // Each compression type is only valid with certain bit depths (except RGB,
    323     // which can be used with any bit depth). Also, some formats do not support
    324     // some compression types.
    325     switch (m_infoHeader.biCompression) {
    326     case RGB:
    327         if (!m_infoHeader.biBitCount)
    328             return false;
    329         break;
    330 
    331     case RLE8:
    332         // Supposedly there are undocumented formats like "BitCount = 1,
    333         // Compression = RLE4" (which means "4 bit, but with a 2-color table"),
    334         // so also allow the paletted RLE compression types to have too low a
    335         // bit count; we'll correct this later.
    336         if (!m_infoHeader.biBitCount || (m_infoHeader.biBitCount > 8))
    337             return false;
    338         break;
    339 
    340     case RLE4:
    341         // See comments in RLE8.
    342         if (!m_infoHeader.biBitCount || (m_infoHeader.biBitCount > 4))
    343             return false;
    344         break;
    345 
    346     case BITFIELDS:
    347         // Only valid for Windows V3+.
    348         if (m_isOS21x || m_isOS22x || ((m_infoHeader.biBitCount != 16) && (m_infoHeader.biBitCount != 32)))
    349             return false;
    350         break;
    351 
    352     case JPEG:
    353     case PNG:
    354         // Only valid for Windows V3+.
    355         if (m_isOS21x || m_isOS22x || m_infoHeader.biBitCount)
    356             return false;
    357         break;
    358 
    359     case HUFFMAN1D:
    360         // Only valid for OS/2 2.x.
    361         if (!m_isOS22x || (m_infoHeader.biBitCount != 1))
    362             return false;
    363         break;
    364 
    365     case RLE24:
    366         // Only valid for OS/2 2.x.
    367         if (!m_isOS22x || (m_infoHeader.biBitCount != 24))
    368             return false;
    369         break;
    370 
    371     default:
    372         // Some type we don't understand.  This should have been caught in
    373         // readInfoHeader().
    374         ASSERT_NOT_REACHED();
    375         return false;
    376     }
    377 
    378     // Top-down bitmaps cannot be compressed; they must be RGB or BITFIELDS.
    379     if (m_isTopDown && (m_infoHeader.biCompression != RGB) && (m_infoHeader.biCompression != BITFIELDS))
    380         return false;
    381 
    382     // Reject the following valid bitmap types that we don't currently bother
    383     // decoding.  Few other people decode these either, they're unlikely to be
    384     // in much use.
    385     // TODO(pkasting): Consider supporting these someday.
    386     //   * Bitmaps larger than 2^16 pixels in either dimension (Windows
    387     //     probably doesn't draw these well anyway, and the decoded data would
    388     //     take a lot of memory).
    389     if ((m_infoHeader.biWidth >= (1 << 16)) || (m_infoHeader.biHeight >= (1 << 16)))
    390         return false;
    391     //   * Windows V3+ JPEG-in-BMP and PNG-in-BMP bitmaps (supposedly not found
    392     //     in the wild, only used to send data to printers?).
    393     if ((m_infoHeader.biCompression == JPEG) || (m_infoHeader.biCompression == PNG))
    394         return false;
    395     //   * OS/2 2.x Huffman-encoded monochrome bitmaps (see
    396     //      http://www.fileformat.info/mirror/egff/ch09_05.htm , re: "G31D"
    397     //      algorithm).
    398     if (m_infoHeader.biCompression == HUFFMAN1D)
    399         return false;
    400 
    401     return true;
    402 }
    403 
    404 bool BMPImageReader::processBitmasks()
    405 {
    406     // Create m_bitMasks[] values for R/G/B.
    407     if (m_infoHeader.biCompression != BITFIELDS) {
    408         // The format doesn't actually use bitmasks.  To simplify the decode
    409         // logic later, create bitmasks for the RGB data.  For Windows V4+,
    410         // this overwrites the masks we read from the header, which are
    411         // supposed to be ignored in non-BITFIELDS cases.
    412         // 16 bits:    MSB <-                     xRRRRRGG GGGBBBBB -> LSB
    413         // 24/32 bits: MSB <- [AAAAAAAA] RRRRRRRR GGGGGGGG BBBBBBBB -> LSB
    414         const int numBits = (m_infoHeader.biBitCount == 16) ? 5 : 8;
    415         for (int i = 0; i <= 2; ++i)
    416             m_bitMasks[i] = ((static_cast<uint32_t>(1) << (numBits * (3 - i))) - 1) ^ ((static_cast<uint32_t>(1) << (numBits * (2 - i))) - 1);
    417     } else if (!isWindowsV4Plus()) {
    418         // For Windows V4+ BITFIELDS mode bitmaps, this was already done when
    419         // we read the info header.
    420 
    421         // Fail if we don't have enough file space for the bitmasks.
    422         static const size_t SIZEOF_BITMASKS = 12;
    423         if (((m_headerOffset + m_infoHeader.biSize + SIZEOF_BITMASKS) < (m_headerOffset + m_infoHeader.biSize)) || (m_imgDataOffset && (m_imgDataOffset < (m_headerOffset + m_infoHeader.biSize + SIZEOF_BITMASKS))))
    424             return m_parent->setFailed();
    425 
    426         // Read bitmasks.
    427         if ((m_data->size() - m_decodedOffset) < SIZEOF_BITMASKS)
    428             return false;
    429         m_bitMasks[0] = readUint32(0);
    430         m_bitMasks[1] = readUint32(4);
    431         m_bitMasks[2] = readUint32(8);
    432 
    433         m_decodedOffset += SIZEOF_BITMASKS;
    434     }
    435 
    436     // Alpha is a poorly-documented and inconsistently-used feature.
    437     //
    438     // Windows V4+ has an alpha bitmask in the info header. Unlike the R/G/B
    439     // bitmasks, the MSDN docs don't indicate that it is only valid for the
    440     // BITFIELDS compression format, so we respect it at all times.
    441     //
    442     // To complicate things, Windows V3 BMPs, which lack this mask, can specify
    443     // 32bpp format, which to any sane reader would imply an 8-bit alpha
    444     // channel -- and for BMPs-in-ICOs, that's precisely what's intended to
    445     // happen. There also exist standalone BMPs in this format which clearly
    446     // expect the alpha channel to be respected. However, there are many other
    447     // BMPs which, for example, fill this channel with all 0s, yet clearly
    448     // expect to not be displayed as a fully-transparent rectangle.
    449     //
    450     // If these were the only two types of Windows V3, 32bpp BMPs in the wild,
    451     // we could distinguish between them by scanning the alpha channel in the
    452     // image, looking for nonzero values, and only enabling alpha if we found
    453     // some. (It turns out we have to do this anyway, because, crazily, there
    454     // are also Windows V4+ BMPs with an explicit, non-zero alpha mask, which
    455     // then zero-fill their alpha channels! See comments in
    456     // processNonRLEData().)
    457     //
    458     // Unfortunately there are also V3 BMPs -- indeed, probably more than the
    459     // number of 32bpp, V3 BMPs which intentionally use alpha -- which specify
    460     // 32bpp format, use nonzero (and non-255) alpha values, and yet expect to
    461     // be rendered fully-opaque. And other browsers do so.
    462     //
    463     // So it's impossible to display every BMP in the way its creators intended,
    464     // and we have to choose what to break. Given the paragraph above, we match
    465     // other browsers and ignore alpha in Windows V3 BMPs except inside ICO
    466     // files.
    467     if (!isWindowsV4Plus())
    468         m_bitMasks[3] = (m_isInICO && (m_infoHeader.biCompression != BITFIELDS) && (m_infoHeader.biBitCount == 32)) ? static_cast<uint32_t>(0xff000000) : 0;
    469 
    470     // We've now decoded all the non-image data we care about.  Skip anything
    471     // else before the actual raster data.
    472     if (m_imgDataOffset)
    473         m_decodedOffset = m_imgDataOffset;
    474     m_needToProcessBitmasks = false;
    475 
    476     // Check masks and set shift and LUT address values.
    477     for (int i = 0; i < 4; ++i) {
    478         // Trim the mask to the allowed bit depth.  Some Windows V4+ BMPs
    479         // specify a bogus alpha channel in bits that don't exist in the pixel
    480         // data (for example, bits 25-31 in a 24-bit RGB format).
    481         if (m_infoHeader.biBitCount < 32)
    482             m_bitMasks[i] &= ((static_cast<uint32_t>(1) << m_infoHeader.biBitCount) - 1);
    483 
    484         // For empty masks (common on the alpha channel, especially after the
    485         // trimming above), quickly clear the shift and LUT address and
    486         // continue, to avoid an infinite loop in the counting code below.
    487         uint32_t tempMask = m_bitMasks[i];
    488         if (!tempMask) {
    489             m_bitShiftsRight[i] = 0;
    490             m_lookupTableAddresses[i] = 0;
    491             continue;
    492         }
    493 
    494         // Make sure bitmask does not overlap any other bitmasks.
    495         for (int j = 0; j < i; ++j) {
    496             if (tempMask & m_bitMasks[j])
    497                 return m_parent->setFailed();
    498         }
    499 
    500         // Count offset into pixel data.
    501         for (m_bitShiftsRight[i] = 0; !(tempMask & 1); tempMask >>= 1)
    502             ++m_bitShiftsRight[i];
    503 
    504         // Count size of mask.
    505         size_t numBits = 0;
    506         for (; tempMask & 1; tempMask >>= 1)
    507             ++numBits;
    508 
    509         // Make sure bitmask is contiguous.
    510         if (tempMask)
    511             return m_parent->setFailed();
    512 
    513         // Since RGBABuffer tops out at 8 bits per channel, adjust the shift
    514         // amounts to use the most significant 8 bits of the channel.
    515         if (numBits >= 8) {
    516             m_bitShiftsRight[i] += (numBits - 8);
    517             numBits = 0;
    518         }
    519 
    520         // Calculate LUT address.
    521         m_lookupTableAddresses[i] = numBits ? (nBitTo8BitlookupTable + (1 << numBits) - 2) : 0;
    522     }
    523 
    524     return true;
    525 }
    526 
    527 bool BMPImageReader::processColorTable()
    528 {
    529     size_t tableSizeInBytes = m_infoHeader.biClrUsed * (m_isOS21x ? 3 : 4);
    530 
    531     // Fail if we don't have enough file space for the color table.
    532     if (((m_headerOffset + m_infoHeader.biSize + tableSizeInBytes) < (m_headerOffset + m_infoHeader.biSize)) || (m_imgDataOffset && (m_imgDataOffset < (m_headerOffset + m_infoHeader.biSize + tableSizeInBytes))))
    533         return m_parent->setFailed();
    534 
    535     // Read color table.
    536     if ((m_decodedOffset > m_data->size()) || ((m_data->size() - m_decodedOffset) < tableSizeInBytes))
    537         return false;
    538     m_colorTable.resize(m_infoHeader.biClrUsed);
    539     for (size_t i = 0; i < m_infoHeader.biClrUsed; ++i) {
    540         m_colorTable[i].rgbBlue = m_data->data()[m_decodedOffset++];
    541         m_colorTable[i].rgbGreen = m_data->data()[m_decodedOffset++];
    542         m_colorTable[i].rgbRed = m_data->data()[m_decodedOffset++];
    543         // Skip padding byte (not present on OS/2 1.x).
    544         if (!m_isOS21x)
    545             ++m_decodedOffset;
    546     }
    547 
    548     // We've now decoded all the non-image data we care about.  Skip anything
    549     // else before the actual raster data.
    550     if (m_imgDataOffset)
    551         m_decodedOffset = m_imgDataOffset;
    552     m_needToProcessColorTable = false;
    553 
    554     return true;
    555 }
    556 
    557 bool BMPImageReader::processRLEData()
    558 {
    559     if (m_decodedOffset > m_data->size())
    560         return false;
    561 
    562     // RLE decoding is poorly specified.  Two main problems:
    563     // (1) Are EOL markers necessary?  What happens when we have too many
    564     //     pixels for one row?
    565     //     http://www.fileformat.info/format/bmp/egff.htm says extra pixels
    566     //     should wrap to the next line.  Real BMPs I've encountered seem to
    567     //     instead expect extra pixels to be ignored until the EOL marker is
    568     //     seen, although this has only happened in a few cases and I suspect
    569     //     those BMPs may be invalid.  So we only change lines on EOL (or Delta
    570     //     with dy > 0), and fail in most cases when pixels extend past the end
    571     //     of the line.
    572     // (2) When Delta, EOL, or EOF are seen, what happens to the "skipped"
    573     //     pixels?
    574     //     http://www.daubnet.com/formats/BMP.html says these should be filled
    575     //     with color 0.  However, the "do nothing" and "don't care" comments
    576     //     of other references suggest leaving these alone, i.e. letting them
    577     //     be transparent to the background behind the image.  This seems to
    578     //     match how MSPAINT treats BMPs, so we do that.  Note that when we
    579     //     actually skip pixels for a case like this, we need to note on the
    580     //     framebuffer that we have alpha.
    581 
    582     // Impossible to decode row-at-a-time, so just do things as a stream of
    583     // bytes.
    584     while (true) {
    585         // Every entry takes at least two bytes; bail if there isn't enough
    586         // data.
    587         if ((m_data->size() - m_decodedOffset) < 2)
    588             return false;
    589 
    590         // For every entry except EOF, we'd better not have reached the end of
    591         // the image.
    592         const uint8_t count = m_data->data()[m_decodedOffset];
    593         const uint8_t code = m_data->data()[m_decodedOffset + 1];
    594         if ((count || (code != 1)) && pastEndOfImage(0))
    595             return m_parent->setFailed();
    596 
    597         // Decode.
    598         if (!count) {
    599             switch (code) {
    600             case 0:  // Magic token: EOL
    601                 // Skip any remaining pixels in this row.
    602                 if (m_coord.x() < m_parent->size().width())
    603                     m_buffer->setHasAlpha(true);
    604                 moveBufferToNextRow();
    605 
    606                 m_decodedOffset += 2;
    607                 break;
    608 
    609             case 1:  // Magic token: EOF
    610                 // Skip any remaining pixels in the image.
    611                 if ((m_coord.x() < m_parent->size().width()) || (m_isTopDown ? (m_coord.y() < (m_parent->size().height() - 1)) : (m_coord.y() > 0)))
    612                     m_buffer->setHasAlpha(true);
    613                 return true;
    614 
    615             case 2: {  // Magic token: Delta
    616                 // The next two bytes specify dx and dy.  Bail if there isn't
    617                 // enough data.
    618                 if ((m_data->size() - m_decodedOffset) < 4)
    619                     return false;
    620 
    621                 // Fail if this takes us past the end of the desired row or
    622                 // past the end of the image.
    623                 const uint8_t dx = m_data->data()[m_decodedOffset + 2];
    624                 const uint8_t dy = m_data->data()[m_decodedOffset + 3];
    625                 if (dx || dy)
    626                     m_buffer->setHasAlpha(true);
    627                 if (((m_coord.x() + dx) > m_parent->size().width()) || pastEndOfImage(dy))
    628                     return m_parent->setFailed();
    629 
    630                 // Skip intervening pixels.
    631                 m_coord.move(dx, m_isTopDown ? dy : -dy);
    632 
    633                 m_decodedOffset += 4;
    634                 break;
    635             }
    636 
    637             default: { // Absolute mode
    638                 // |code| pixels specified as in BI_RGB, zero-padded at the end
    639                 // to a multiple of 16 bits.
    640                 // Because processNonRLEData() expects m_decodedOffset to
    641                 // point to the beginning of the pixel data, bump it past
    642                 // the escape bytes and then reset if decoding failed.
    643                 m_decodedOffset += 2;
    644                 const ProcessingResult result = processNonRLEData(true, code);
    645                 if (result == Failure)
    646                     return m_parent->setFailed();
    647                 if (result == InsufficientData) {
    648                     m_decodedOffset -= 2;
    649                     return false;
    650                 }
    651                 break;
    652             }
    653             }
    654         } else {  // Encoded mode
    655             // The following color data is repeated for |count| total pixels.
    656             // Strangely, some BMPs seem to specify excessively large counts
    657             // here; ignore pixels past the end of the row.
    658             const int endX = std::min(m_coord.x() + count, m_parent->size().width());
    659 
    660             if (m_infoHeader.biCompression == RLE24) {
    661                 // Bail if there isn't enough data.
    662                 if ((m_data->size() - m_decodedOffset) < 4)
    663                     return false;
    664 
    665                 // One BGR triple that we copy |count| times.
    666                 fillRGBA(endX, m_data->data()[m_decodedOffset + 3], m_data->data()[m_decodedOffset + 2], code, 0xff);
    667                 m_decodedOffset += 4;
    668             } else {
    669                 // RLE8 has one color index that gets repeated; RLE4 has two
    670                 // color indexes in the upper and lower 4 bits of the byte,
    671                 // which are alternated.
    672                 size_t colorIndexes[2] = {code, code};
    673                 if (m_infoHeader.biCompression == RLE4) {
    674                     colorIndexes[0] = (colorIndexes[0] >> 4) & 0xf;
    675                     colorIndexes[1] &= 0xf;
    676                 }
    677                 for (int which = 0; m_coord.x() < endX; ) {
    678                     // Some images specify color values past the end of the
    679                     // color table; set these pixels to black.
    680                     if (colorIndexes[which] < m_infoHeader.biClrUsed)
    681                         setI(colorIndexes[which]);
    682                     else
    683                         setRGBA(0, 0, 0, 255);
    684                     which = !which;
    685                 }
    686 
    687                 m_decodedOffset += 2;
    688             }
    689         }
    690     }
    691 }
    692 
    693 BMPImageReader::ProcessingResult BMPImageReader::processNonRLEData(bool inRLE, int numPixels)
    694 {
    695     if (m_decodedOffset > m_data->size())
    696         return InsufficientData;
    697 
    698     if (!inRLE)
    699         numPixels = m_parent->size().width();
    700 
    701     // Fail if we're being asked to decode more pixels than remain in the row.
    702     const int endX = m_coord.x() + numPixels;
    703     if (endX > m_parent->size().width())
    704         return Failure;
    705 
    706     // Determine how many bytes of data the requested number of pixels
    707     // requires.
    708     const size_t pixelsPerByte = 8 / m_infoHeader.biBitCount;
    709     const size_t bytesPerPixel = m_infoHeader.biBitCount / 8;
    710     const size_t unpaddedNumBytes = (m_infoHeader.biBitCount < 16) ? ((numPixels + pixelsPerByte - 1) / pixelsPerByte) : (numPixels * bytesPerPixel);
    711     // RLE runs are zero-padded at the end to a multiple of 16 bits.  Non-RLE
    712     // data is in rows and is zero-padded to a multiple of 32 bits.
    713     const size_t alignBits = inRLE ? 1 : 3;
    714     const size_t paddedNumBytes = (unpaddedNumBytes + alignBits) & ~alignBits;
    715 
    716     // Decode as many rows as we can.  (For RLE, where we only want to decode
    717     // one row, we've already checked that this condition is true.)
    718     while (!pastEndOfImage(0)) {
    719         // Bail if we don't have enough data for the desired number of pixels.
    720         if ((m_data->size() - m_decodedOffset) < paddedNumBytes)
    721             return InsufficientData;
    722 
    723         if (m_infoHeader.biBitCount < 16) {
    724             // Paletted data.  Pixels are stored little-endian within bytes.
    725             // Decode pixels one byte at a time, left to right (so, starting at
    726             // the most significant bits in the byte).
    727             const uint8_t mask = (1 << m_infoHeader.biBitCount) - 1;
    728             for (size_t byte = 0; byte < unpaddedNumBytes; ++byte) {
    729                 uint8_t pixelData = m_data->data()[m_decodedOffset + byte];
    730                 for (size_t pixel = 0; (pixel < pixelsPerByte) && (m_coord.x() < endX); ++pixel) {
    731                     const size_t colorIndex = (pixelData >> (8 - m_infoHeader.biBitCount)) & mask;
    732                     if (m_decodingAndMask) {
    733                         // There's no way to accurately represent an AND + XOR
    734                         // operation as an RGBA image, so where the AND values
    735                         // are 1, we simply set the framebuffer pixels to fully
    736                         // transparent, on the assumption that most ICOs on the
    737                         // web will not be doing a lot of inverting.
    738                         if (colorIndex) {
    739                             setRGBA(0, 0, 0, 0);
    740                             m_buffer->setHasAlpha(true);
    741                         } else
    742                             m_coord.move(1, 0);
    743                     } else {
    744                         // See comments near the end of processRLEData().
    745                         if (colorIndex < m_infoHeader.biClrUsed)
    746                             setI(colorIndex);
    747                         else
    748                             setRGBA(0, 0, 0, 255);
    749                     }
    750                     pixelData <<= m_infoHeader.biBitCount;
    751                 }
    752             }
    753         } else {
    754             // RGB data.  Decode pixels one at a time, left to right.
    755             while (m_coord.x() < endX) {
    756                 const uint32_t pixel = readCurrentPixel(bytesPerPixel);
    757 
    758                 // Some BMPs specify an alpha channel but don't actually use it
    759                 // (it contains all 0s).  To avoid displaying these images as
    760                 // fully-transparent, decode as if images are fully opaque
    761                 // until we actually see a non-zero alpha value; at that point,
    762                 // reset any previously-decoded pixels to fully transparent and
    763                 // continue decoding based on the real alpha channel values.
    764                 // As an optimization, avoid setting "hasAlpha" to true for
    765                 // images where all alpha values are 255; opaque images are
    766                 // faster to draw.
    767                 int alpha = getAlpha(pixel);
    768                 if (!m_seenNonZeroAlphaPixel && !alpha) {
    769                     m_seenZeroAlphaPixel = true;
    770                     alpha = 255;
    771                 } else {
    772                     m_seenNonZeroAlphaPixel = true;
    773                     if (m_seenZeroAlphaPixel) {
    774                         m_buffer->zeroFillPixelData();
    775                         m_seenZeroAlphaPixel = false;
    776                     } else if (alpha != 255)
    777                         m_buffer->setHasAlpha(true);
    778                 }
    779 
    780                 setRGBA(getComponent(pixel, 0), getComponent(pixel, 1),
    781                         getComponent(pixel, 2), alpha);
    782             }
    783         }
    784 
    785         // Success, keep going.
    786         m_decodedOffset += paddedNumBytes;
    787         if (inRLE)
    788             return Success;
    789         moveBufferToNextRow();
    790     }
    791 
    792     // Finished decoding whole image.
    793     return Success;
    794 }
    795 
    796 void BMPImageReader::moveBufferToNextRow()
    797 {
    798     m_coord.move(-m_coord.x(), m_isTopDown ? 1 : -1);
    799 }
    800 
    801 } // namespace blink
    802