Home | History | Annotate | Download | only in gif
      1 /* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* ***** BEGIN LICENSE BLOCK *****
      3  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
      4  *
      5  * The contents of this file are subject to the Mozilla Public License Version
      6  * 1.1 (the "License"); you may not use this file except in compliance with
      7  * the License. You may obtain a copy of the License at
      8  * http://www.mozilla.org/MPL/
      9  *
     10  * Software distributed under the License is distributed on an "AS IS" basis,
     11  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
     12  * for the specific language governing rights and limitations under the
     13  * License.
     14  *
     15  * The Original Code is mozilla.org code.
     16  *
     17  * The Initial Developer of the Original Code is
     18  * Netscape Communications Corporation.
     19  * Portions created by the Initial Developer are Copyright (C) 1998
     20  * the Initial Developer. All Rights Reserved.
     21  *
     22  * Contributor(s):
     23  *   Chris Saari <saari (at) netscape.com>
     24  *   Apple Computer
     25  *
     26  * Alternatively, the contents of this file may be used under the terms of
     27  * either the GNU General Public License Version 2 or later (the "GPL"), or
     28  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
     29  * in which case the provisions of the GPL or the LGPL are applicable instead
     30  * of those above. If you wish to allow use of your version of this file only
     31  * under the terms of either the GPL or the LGPL, and not to allow others to
     32  * use your version of this file under the terms of the MPL, indicate your
     33  * decision by deleting the provisions above and replace them with the notice
     34  * and other provisions required by the GPL or the LGPL. If you do not delete
     35  * the provisions above, a recipient may use your version of this file under
     36  * the terms of any one of the MPL, the GPL or the LGPL.
     37  *
     38  * ***** END LICENSE BLOCK ***** */
     39 
     40 /*
     41 The Graphics Interchange Format(c) is the copyright property of CompuServe
     42 Incorporated. Only CompuServe Incorporated is authorized to define, redefine,
     43 enhance, alter, modify or change in any way the definition of the format.
     44 
     45 CompuServe Incorporated hereby grants a limited, non-exclusive, royalty-free
     46 license for the use of the Graphics Interchange Format(sm) in computer
     47 software; computer software utilizing GIF(sm) must acknowledge ownership of the
     48 Graphics Interchange Format and its Service Mark by CompuServe Incorporated, in
     49 User and Technical Documentation. Computer software utilizing GIF, which is
     50 distributed or may be distributed without User or Technical Documentation must
     51 display to the screen or printer a message acknowledging ownership of the
     52 Graphics Interchange Format and the Service Mark by CompuServe Incorporated; in
     53 this case, the acknowledgement may be displayed in an opening screen or leading
     54 banner, or a closing screen or trailing banner. A message such as the following
     55 may be used:
     56 
     57     "The Graphics Interchange Format(c) is the Copyright property of
     58     CompuServe Incorporated. GIF(sm) is a Service Mark property of
     59     CompuServe Incorporated."
     60 
     61 For further information, please contact :
     62 
     63     CompuServe Incorporated
     64     Graphics Technology Department
     65     5000 Arlington Center Boulevard
     66     Columbus, Ohio  43220
     67     U. S. A.
     68 
     69 CompuServe Incorporated maintains a mailing list with all those individuals and
     70 organizations who wish to receive copies of this document when it is corrected
     71 or revised. This service is offered free of charge; please provide us with your
     72 mailing address.
     73 */
     74 
     75 #include "config.h"
     76 #include "platform/image-decoders/gif/GIFImageReader.h"
     77 
     78 #include <string.h>
     79 #include "platform/graphics/ImageSource.h"
     80 
     81 using blink::GIFImageDecoder;
     82 
     83 // GETN(n, s) requests at least 'n' bytes available from 'q', at start of state 's'.
     84 //
     85 // Note, the hold will never need to be bigger than 256 bytes to gather up in the hold,
     86 // as each GIF block (except colormaps) can never be bigger than 256 bytes.
     87 // Colormaps are directly copied in the resp. global_colormap or dynamically allocated local_colormap.
     88 // So a fixed buffer in GIFImageReader is good enough.
     89 // This buffer is only needed to copy left-over data from one GifWrite call to the next
     90 #define GETN(n, s) \
     91     do { \
     92         m_bytesToConsume = (n); \
     93         m_state = (s); \
     94     } while (0)
     95 
     96 // Get a 16-bit value stored in little-endian format.
     97 #define GETINT16(p)   ((p)[1]<<8|(p)[0])
     98 
     99 // Send the data to the display front-end.
    100 bool GIFLZWContext::outputRow(GIFRow::const_iterator rowBegin)
    101 {
    102     int drowStart = irow;
    103     int drowEnd = irow;
    104 
    105     // Haeberli-inspired hack for interlaced GIFs: Replicate lines while
    106     // displaying to diminish the "venetian-blind" effect as the image is
    107     // loaded. Adjust pixel vertical positions to avoid the appearance of the
    108     // image crawling up the screen as successive passes are drawn.
    109     if (m_frameContext->progressiveDisplay() && m_frameContext->interlaced() && ipass < 4) {
    110         unsigned rowDup = 0;
    111         unsigned rowShift = 0;
    112 
    113         switch (ipass) {
    114         case 1:
    115             rowDup = 7;
    116             rowShift = 3;
    117             break;
    118         case 2:
    119             rowDup = 3;
    120             rowShift = 1;
    121             break;
    122         case 3:
    123             rowDup = 1;
    124             rowShift = 0;
    125             break;
    126         default:
    127             break;
    128         }
    129 
    130         drowStart -= rowShift;
    131         drowEnd = drowStart + rowDup;
    132 
    133         // Extend if bottom edge isn't covered because of the shift upward.
    134         if (((m_frameContext->height() - 1) - drowEnd) <= rowShift)
    135             drowEnd = m_frameContext->height() - 1;
    136 
    137         // Clamp first and last rows to upper and lower edge of image.
    138         if (drowStart < 0)
    139             drowStart = 0;
    140 
    141         if ((unsigned)drowEnd >= m_frameContext->height())
    142             drowEnd = m_frameContext->height() - 1;
    143     }
    144 
    145     // Protect against too much image data.
    146     if ((unsigned)drowStart >= m_frameContext->height())
    147         return true;
    148 
    149     // CALLBACK: Let the client know we have decoded a row.
    150     if (!m_client->haveDecodedRow(m_frameContext->frameId(), rowBegin, m_frameContext->width(),
    151         drowStart, drowEnd - drowStart + 1, m_frameContext->progressiveDisplay() && m_frameContext->interlaced() && ipass > 1))
    152         return false;
    153 
    154     if (!m_frameContext->interlaced())
    155         irow++;
    156     else {
    157         do {
    158             switch (ipass) {
    159             case 1:
    160                 irow += 8;
    161                 if (irow >= m_frameContext->height()) {
    162                     ipass++;
    163                     irow = 4;
    164                 }
    165                 break;
    166 
    167             case 2:
    168                 irow += 8;
    169                 if (irow >= m_frameContext->height()) {
    170                     ipass++;
    171                     irow = 2;
    172                 }
    173                 break;
    174 
    175             case 3:
    176                 irow += 4;
    177                 if (irow >= m_frameContext->height()) {
    178                     ipass++;
    179                     irow = 1;
    180                 }
    181                 break;
    182 
    183             case 4:
    184                 irow += 2;
    185                 if (irow >= m_frameContext->height()) {
    186                     ipass++;
    187                     irow = 0;
    188                 }
    189                 break;
    190 
    191             default:
    192                 break;
    193             }
    194         } while (irow > (m_frameContext->height() - 1));
    195     }
    196     return true;
    197 }
    198 
    199 // Perform Lempel-Ziv-Welch decoding.
    200 // Returns true if decoding was successful. In this case the block will have been completely consumed and/or rowsRemaining will be 0.
    201 // Otherwise, decoding failed; returns false in this case, which will always cause the GIFImageReader to set the "decode failed" flag.
    202 bool GIFLZWContext::doLZW(const unsigned char* block, size_t bytesInBlock)
    203 {
    204     const size_t width = m_frameContext->width();
    205 
    206     if (rowIter == rowBuffer.end())
    207         return true;
    208 
    209     for (const unsigned char* ch = block; bytesInBlock-- > 0; ch++) {
    210         // Feed the next byte into the decoder's 32-bit input buffer.
    211         datum += ((int) *ch) << bits;
    212         bits += 8;
    213 
    214         // Check for underflow of decoder's 32-bit input buffer.
    215         while (bits >= codesize) {
    216             // Get the leading variable-length symbol from the data stream.
    217             int code = datum & codemask;
    218             datum >>= codesize;
    219             bits -= codesize;
    220 
    221             // Reset the dictionary to its original state, if requested.
    222             if (code == clearCode) {
    223                 codesize = m_frameContext->dataSize() + 1;
    224                 codemask = (1 << codesize) - 1;
    225                 avail = clearCode + 2;
    226                 oldcode = -1;
    227                 continue;
    228             }
    229 
    230             // Check for explicit end-of-stream code.
    231             if (code == (clearCode + 1)) {
    232                 // end-of-stream should only appear after all image data.
    233                 if (!rowsRemaining)
    234                     return true;
    235                 return false;
    236             }
    237 
    238             const int tempCode = code;
    239             unsigned short codeLength = 0;
    240             if (code < avail) {
    241                 // This is a pre-existing code, so we already know what it
    242                 // encodes.
    243                 codeLength = suffixLength[code];
    244                 rowIter += codeLength;
    245             } else if (code == avail && oldcode != -1) {
    246                 // This is a new code just being added to the dictionary.
    247                 // It must encode the contents of the previous code, plus
    248                 // the first character of the previous code again.
    249                 codeLength = suffixLength[oldcode] + 1;
    250                 rowIter += codeLength;
    251                 *--rowIter = firstchar;
    252                 code = oldcode;
    253             } else {
    254                 // This is an invalid code. The dictionary is just initialized
    255                 // and the code is incomplete. We don't know how to handle
    256                 // this case.
    257                 return false;
    258             }
    259 
    260             while (code >= clearCode) {
    261                 *--rowIter = suffix[code];
    262                 code = prefix[code];
    263             }
    264 
    265             *--rowIter = firstchar = suffix[code];
    266 
    267             // Define a new codeword in the dictionary as long as we've read
    268             // more than one value from the stream.
    269             if (avail < MAX_DICTIONARY_ENTRIES && oldcode != -1) {
    270                 prefix[avail] = oldcode;
    271                 suffix[avail] = firstchar;
    272                 suffixLength[avail] = suffixLength[oldcode] + 1;
    273                 ++avail;
    274 
    275                 // If we've used up all the codewords of a given length
    276                 // increase the length of codewords by one bit, but don't
    277                 // exceed the specified maximum codeword size.
    278                 if (!(avail & codemask) && avail < MAX_DICTIONARY_ENTRIES) {
    279                     ++codesize;
    280                     codemask += avail;
    281                 }
    282             }
    283             oldcode = tempCode;
    284             rowIter += codeLength;
    285 
    286             // Output as many rows as possible.
    287             GIFRow::iterator rowBegin = rowBuffer.begin();
    288             for (; rowBegin + width <= rowIter; rowBegin += width) {
    289                 if (!outputRow(rowBegin))
    290                     return false;
    291                 rowsRemaining--;
    292                 if (!rowsRemaining)
    293                     return true;
    294             }
    295 
    296             if (rowBegin != rowBuffer.begin()) {
    297                 // Move the remaining bytes to the beginning of the buffer.
    298                 const size_t bytesToCopy = rowIter - rowBegin;
    299                 memcpy(rowBuffer.begin(), rowBegin, bytesToCopy);
    300                 rowIter = rowBuffer.begin() + bytesToCopy;
    301             }
    302         }
    303     }
    304     return true;
    305 }
    306 
    307 void GIFColorMap::buildTable(const unsigned char* data, size_t length)
    308 {
    309     if (!m_isDefined || !m_table.isEmpty())
    310         return;
    311 
    312     RELEASE_ASSERT(m_position + m_colors * BYTES_PER_COLORMAP_ENTRY <= length);
    313     const unsigned char* srcColormap = data + m_position;
    314     m_table.resize(m_colors);
    315     for (Table::iterator iter = m_table.begin(); iter != m_table.end(); ++iter) {
    316         *iter = SkPackARGB32NoCheck(255, srcColormap[0], srcColormap[1], srcColormap[2]);
    317         srcColormap += BYTES_PER_COLORMAP_ENTRY;
    318     }
    319 }
    320 
    321 // Perform decoding for this frame. frameDecoded will be true if the entire frame is decoded.
    322 // Returns false if a decoding error occurred. This is a fatal error and causes the GIFImageReader to set the "decode failed" flag.
    323 // Otherwise, either not enough data is available to decode further than before, or the new data has been decoded successfully; returns true in this case.
    324 bool GIFFrameContext::decode(const unsigned char* data, size_t length, blink::GIFImageDecoder* client, bool* frameDecoded)
    325 {
    326     m_localColorMap.buildTable(data, length);
    327 
    328     *frameDecoded = false;
    329     if (!m_lzwContext) {
    330         // Wait for more data to properly initialize GIFLZWContext.
    331         if (!isDataSizeDefined() || !isHeaderDefined())
    332             return true;
    333 
    334         m_lzwContext = adoptPtr(new GIFLZWContext(client, this));
    335         if (!m_lzwContext->prepareToDecode()) {
    336             m_lzwContext.clear();
    337             return false;
    338         }
    339 
    340         m_currentLzwBlock = 0;
    341     }
    342 
    343     // Some bad GIFs have extra blocks beyond the last row, which we don't want to decode.
    344     while (m_currentLzwBlock < m_lzwBlocks.size() && m_lzwContext->hasRemainingRows()) {
    345         size_t blockPosition = m_lzwBlocks[m_currentLzwBlock].blockPosition;
    346         size_t blockSize = m_lzwBlocks[m_currentLzwBlock].blockSize;
    347         if (blockPosition + blockSize > length)
    348             return false;
    349         if (!m_lzwContext->doLZW(data + blockPosition, blockSize))
    350             return false;
    351         ++m_currentLzwBlock;
    352     }
    353 
    354     // If this frame is data complete then the previous loop must have completely decoded all LZW blocks.
    355     // There will be no more decoding for this frame so it's time to cleanup.
    356     if (isComplete()) {
    357         *frameDecoded = true;
    358         m_lzwContext.clear();
    359     }
    360     return true;
    361 }
    362 
    363 // Decode a frame.
    364 // This method uses GIFFrameContext:decode() to decode the frame; decoding error is reported to client as a critical failure.
    365 // Return true if decoding has progressed. Return false if an error has occurred.
    366 bool GIFImageReader::decode(size_t frameIndex)
    367 {
    368     m_globalColorMap.buildTable(data(0), m_data->size());
    369 
    370     bool frameDecoded = false;
    371     GIFFrameContext* currentFrame = m_frames[frameIndex].get();
    372 
    373     return currentFrame->decode(data(0), m_data->size(), m_client, &frameDecoded)
    374         && (!frameDecoded || m_client->frameComplete(frameIndex));
    375 }
    376 
    377 bool GIFImageReader::parse(GIFImageDecoder::GIFParseQuery query)
    378 {
    379     ASSERT(m_bytesRead <= m_data->size());
    380 
    381     return parseData(m_bytesRead, m_data->size() - m_bytesRead, query);
    382 }
    383 
    384 // Parse incoming GIF data stream into internal data structures.
    385 // Return true if parsing has progressed or there is not enough data.
    386 // Return false if a fatal error is encountered.
    387 bool GIFImageReader::parseData(size_t dataPosition, size_t len, GIFImageDecoder::GIFParseQuery query)
    388 {
    389     if (!len) {
    390         // No new data has come in since the last call, just ignore this call.
    391         return true;
    392     }
    393 
    394     if (len < m_bytesToConsume)
    395         return true;
    396 
    397     // This loop reads as many components from |m_data| as possible.
    398     // At the beginning of each iteration, dataPosition will be advanced by m_bytesToConsume to
    399     // point to the next component. len will be decremented accordingly.
    400     while (len >= m_bytesToConsume) {
    401         const size_t currentComponentPosition = dataPosition;
    402         const unsigned char* currentComponent = data(dataPosition);
    403 
    404         // Mark the current component as consumed. Note that currentComponent will remain pointed at this
    405         // component until the next loop iteration.
    406         dataPosition += m_bytesToConsume;
    407         len -= m_bytesToConsume;
    408 
    409         switch (m_state) {
    410         case GIFLZW:
    411             ASSERT(!m_frames.isEmpty());
    412             // m_bytesToConsume is the current component size because it hasn't been updated.
    413             m_frames.last()->addLzwBlock(currentComponentPosition, m_bytesToConsume);
    414             GETN(1, GIFSubBlock);
    415             break;
    416 
    417         case GIFLZWStart: {
    418             ASSERT(!m_frames.isEmpty());
    419             m_frames.last()->setDataSize(*currentComponent);
    420             GETN(1, GIFSubBlock);
    421             break;
    422         }
    423 
    424         case GIFType: {
    425             // All GIF files begin with "GIF87a" or "GIF89a".
    426             if (!strncmp((char*)currentComponent, "GIF89a", 6))
    427                 m_version = 89;
    428             else if (!strncmp((char*)currentComponent, "GIF87a", 6))
    429                 m_version = 87;
    430             else
    431                 return false;
    432             GETN(7, GIFGlobalHeader);
    433             break;
    434         }
    435 
    436         case GIFGlobalHeader: {
    437             // This is the height and width of the "screen" or frame into which images are rendered. The
    438             // individual images can be smaller than the screen size and located with an origin anywhere
    439             // within the screen.
    440             m_screenWidth = GETINT16(currentComponent);
    441             m_screenHeight = GETINT16(currentComponent + 2);
    442 
    443             // CALLBACK: Inform the decoderplugin of our size.
    444             // Note: A subsequent frame might have dimensions larger than the "screen" dimensions.
    445             if (m_client && !m_client->setSize(m_screenWidth, m_screenHeight))
    446                 return false;
    447 
    448             const size_t globalColorMapColors = 2 << (currentComponent[4] & 0x07);
    449 
    450             if ((currentComponent[4] & 0x80) && globalColorMapColors > 0) { /* global map */
    451                 m_globalColorMap.setTablePositionAndSize(dataPosition, globalColorMapColors);
    452                 GETN(BYTES_PER_COLORMAP_ENTRY * globalColorMapColors, GIFGlobalColormap);
    453                 break;
    454             }
    455 
    456             GETN(1, GIFImageStart);
    457             break;
    458         }
    459 
    460         case GIFGlobalColormap: {
    461             m_globalColorMap.setDefined();
    462             GETN(1, GIFImageStart);
    463             break;
    464         }
    465 
    466         case GIFImageStart: {
    467             if (*currentComponent == '!') { // extension.
    468                 GETN(2, GIFExtension);
    469                 break;
    470             }
    471 
    472             if (*currentComponent == ',') { // image separator.
    473                 GETN(9, GIFImageHeader);
    474                 break;
    475             }
    476 
    477             // If we get anything other than ',' (image separator), '!'
    478             // (extension), or ';' (trailer), there is extraneous data
    479             // between blocks. The GIF87a spec tells us to keep reading
    480             // until we find an image separator, but GIF89a says such
    481             // a file is corrupt. We follow Mozilla's implementation and
    482             // proceed as if the file were correctly terminated, so the
    483             // GIF will display.
    484             GETN(0, GIFDone);
    485             break;
    486         }
    487 
    488         case GIFExtension: {
    489             size_t bytesInBlock = currentComponent[1];
    490             GIFState exceptionState = GIFSkipBlock;
    491 
    492             switch (*currentComponent) {
    493             case 0xf9:
    494                 exceptionState = GIFControlExtension;
    495                 // The GIF spec mandates that the GIFControlExtension header block length is 4 bytes,
    496                 // and the parser for this block reads 4 bytes, so we must enforce that the buffer
    497                 // contains at least this many bytes. If the GIF specifies a different length, we
    498                 // allow that, so long as it's larger; the additional data will simply be ignored.
    499                 bytesInBlock = std::max(bytesInBlock, static_cast<size_t>(4));
    500                 break;
    501 
    502             // The GIF spec also specifies the lengths of the following two extensions' headers
    503             // (as 12 and 11 bytes, respectively). Because we ignore the plain text extension entirely
    504             // and sanity-check the actual length of the application extension header before reading it,
    505             // we allow GIFs to deviate from these values in either direction. This is important for
    506             // real-world compatibility, as GIFs in the wild exist with application extension headers
    507             // that are both shorter and longer than 11 bytes.
    508             case 0x01:
    509                 // ignoring plain text extension
    510                 break;
    511 
    512             case 0xff:
    513                 exceptionState = GIFApplicationExtension;
    514                 break;
    515 
    516             case 0xfe:
    517                 exceptionState = GIFConsumeComment;
    518                 break;
    519             }
    520 
    521             if (bytesInBlock)
    522                 GETN(bytesInBlock, exceptionState);
    523             else
    524                 GETN(1, GIFImageStart);
    525             break;
    526         }
    527 
    528         case GIFConsumeBlock: {
    529             if (!*currentComponent)
    530                 GETN(1, GIFImageStart);
    531             else
    532                 GETN(*currentComponent, GIFSkipBlock);
    533             break;
    534         }
    535 
    536         case GIFSkipBlock: {
    537             GETN(1, GIFConsumeBlock);
    538             break;
    539         }
    540 
    541         case GIFControlExtension: {
    542             addFrameIfNecessary();
    543             GIFFrameContext* currentFrame = m_frames.last().get();
    544             if (*currentComponent & 0x1)
    545                 currentFrame->setTransparentPixel(currentComponent[3]);
    546 
    547             // We ignore the "user input" bit.
    548 
    549             // NOTE: This relies on the values in the FrameDisposalMethod enum
    550             // matching those in the GIF spec!
    551             int disposalMethod = ((*currentComponent) >> 2) & 0x7;
    552             if (disposalMethod < 4) {
    553                 currentFrame->setDisposalMethod(static_cast<blink::ImageFrame::DisposalMethod>(disposalMethod));
    554             } else if (disposalMethod == 4) {
    555                 // Some specs say that disposal method 3 is "overwrite previous", others that setting
    556                 // the third bit of the field (i.e. method 4) is. We map both to the same value.
    557                 currentFrame->setDisposalMethod(blink::ImageFrame::DisposeOverwritePrevious);
    558             }
    559             currentFrame->setDelayTime(GETINT16(currentComponent + 1) * 10);
    560             GETN(1, GIFConsumeBlock);
    561             break;
    562         }
    563 
    564         case GIFCommentExtension: {
    565             if (*currentComponent)
    566                 GETN(*currentComponent, GIFConsumeComment);
    567             else
    568                 GETN(1, GIFImageStart);
    569             break;
    570         }
    571 
    572         case GIFConsumeComment: {
    573             GETN(1, GIFCommentExtension);
    574             break;
    575         }
    576 
    577         case GIFApplicationExtension: {
    578             // Check for netscape application extension.
    579             if (m_bytesToConsume == 11
    580                 && (!strncmp((char*)currentComponent, "NETSCAPE2.0", 11) || !strncmp((char*)currentComponent, "ANIMEXTS1.0", 11)))
    581                 GETN(1, GIFNetscapeExtensionBlock);
    582             else
    583                 GETN(1, GIFConsumeBlock);
    584             break;
    585         }
    586 
    587         // Netscape-specific GIF extension: animation looping.
    588         case GIFNetscapeExtensionBlock: {
    589             // GIFConsumeNetscapeExtension always reads 3 bytes from the stream; we should at least wait for this amount.
    590             if (*currentComponent)
    591                 GETN(std::max(3, static_cast<int>(*currentComponent)), GIFConsumeNetscapeExtension);
    592             else
    593                 GETN(1, GIFImageStart);
    594             break;
    595         }
    596 
    597         // Parse netscape-specific application extensions
    598         case GIFConsumeNetscapeExtension: {
    599             int netscapeExtension = currentComponent[0] & 7;
    600 
    601             // Loop entire animation specified # of times. Only read the loop count during the first iteration.
    602             if (netscapeExtension == 1) {
    603                 m_loopCount = GETINT16(currentComponent + 1);
    604 
    605                 // Zero loop count is infinite animation loop request.
    606                 if (!m_loopCount)
    607                     m_loopCount = blink::cAnimationLoopInfinite;
    608 
    609                 GETN(1, GIFNetscapeExtensionBlock);
    610             } else if (netscapeExtension == 2) {
    611                 // Wait for specified # of bytes to enter buffer.
    612 
    613                 // Don't do this, this extension doesn't exist (isn't used at all)
    614                 // and doesn't do anything, as our streaming/buffering takes care of it all...
    615                 // See: http://semmix.pl/color/exgraf/eeg24.htm
    616                 GETN(1, GIFNetscapeExtensionBlock);
    617             } else {
    618                 // 0,3-7 are yet to be defined netscape extension codes
    619                 return false;
    620             }
    621             break;
    622         }
    623 
    624         case GIFImageHeader: {
    625             unsigned height, width, xOffset, yOffset;
    626 
    627             /* Get image offsets, with respect to the screen origin */
    628             xOffset = GETINT16(currentComponent);
    629             yOffset = GETINT16(currentComponent + 2);
    630 
    631             /* Get image width and height. */
    632             width  = GETINT16(currentComponent + 4);
    633             height = GETINT16(currentComponent + 6);
    634 
    635             /* Work around broken GIF files where the logical screen
    636              * size has weird width or height.  We assume that GIF87a
    637              * files don't contain animations.
    638              */
    639             if (currentFrameIsFirstFrame()
    640                 && ((m_screenHeight < height) || (m_screenWidth < width) || (m_version == 87))) {
    641                 m_screenHeight = height;
    642                 m_screenWidth = width;
    643                 xOffset = 0;
    644                 yOffset = 0;
    645 
    646                 // CALLBACK: Inform the decoderplugin of our size.
    647                 if (m_client && !m_client->setSize(m_screenWidth, m_screenHeight))
    648                     return false;
    649             }
    650 
    651             // Work around more broken GIF files that have zero image width or height
    652             if (!height || !width) {
    653                 height = m_screenHeight;
    654                 width = m_screenWidth;
    655                 if (!height || !width)
    656                     return false;
    657             }
    658 
    659             if (query == GIFImageDecoder::GIFSizeQuery) {
    660                 // The decoder needs to stop. Hand back the number of bytes we consumed from
    661                 // buffer minus 9 (the amount we consumed to read the header).
    662                 setRemainingBytes(len + 9);
    663                 GETN(9, GIFImageHeader);
    664                 return true;
    665             }
    666 
    667             addFrameIfNecessary();
    668             GIFFrameContext* currentFrame = m_frames.last().get();
    669 
    670             currentFrame->setHeaderDefined();
    671             currentFrame->setRect(xOffset, yOffset, width, height);
    672             m_screenWidth = std::max(m_screenWidth, width);
    673             m_screenHeight = std::max(m_screenHeight, height);
    674             currentFrame->setInterlaced(currentComponent[8] & 0x40);
    675 
    676             // Overlaying interlaced, transparent GIFs over
    677             // existing image data using the Haeberli display hack
    678             // requires saving the underlying image in order to
    679             // avoid jaggies at the transparency edges. We are
    680             // unprepared to deal with that, so don't display such
    681             // images progressively. Which means only the first
    682             // frame can be progressively displayed.
    683             // FIXME: It is possible that a non-transparent frame
    684             // can be interlaced and progressively displayed.
    685             currentFrame->setProgressiveDisplay(currentFrameIsFirstFrame());
    686 
    687             const bool isLocalColormapDefined = currentComponent[8] & 0x80;
    688             if (isLocalColormapDefined) {
    689                 // The three low-order bits of currentComponent[8] specify the bits per pixel.
    690                 const size_t numColors = 2 << (currentComponent[8] & 0x7);
    691                 currentFrame->localColorMap().setTablePositionAndSize(dataPosition, numColors);
    692                 GETN(BYTES_PER_COLORMAP_ENTRY * numColors, GIFImageColormap);
    693                 break;
    694             }
    695 
    696             GETN(1, GIFLZWStart);
    697             break;
    698         }
    699 
    700         case GIFImageColormap: {
    701             ASSERT(!m_frames.isEmpty());
    702             m_frames.last()->localColorMap().setDefined();
    703             GETN(1, GIFLZWStart);
    704             break;
    705         }
    706 
    707         case GIFSubBlock: {
    708             const size_t bytesInBlock = *currentComponent;
    709             if (bytesInBlock)
    710                 GETN(bytesInBlock, GIFLZW);
    711             else {
    712                 // Finished parsing one frame; Process next frame.
    713                 ASSERT(!m_frames.isEmpty());
    714                 // Note that some broken GIF files do not have enough LZW blocks to fully
    715                 // decode all rows but we treat it as frame complete.
    716                 m_frames.last()->setComplete();
    717                 GETN(1, GIFImageStart);
    718             }
    719             break;
    720         }
    721 
    722         case GIFDone: {
    723             m_parseCompleted = true;
    724             return true;
    725         }
    726 
    727         default:
    728             // We shouldn't ever get here.
    729             return false;
    730             break;
    731         }
    732     }
    733 
    734     setRemainingBytes(len);
    735     return true;
    736 }
    737 
    738 void GIFImageReader::setRemainingBytes(size_t remainingBytes)
    739 {
    740     ASSERT(remainingBytes <= m_data->size());
    741     m_bytesRead = m_data->size() - remainingBytes;
    742 }
    743 
    744 void GIFImageReader::addFrameIfNecessary()
    745 {
    746     if (m_frames.isEmpty() || m_frames.last()->isComplete())
    747         m_frames.append(adoptPtr(new GIFFrameContext(m_frames.size())));
    748 }
    749 
    750 // FIXME: Move this method to close to doLZW().
    751 bool GIFLZWContext::prepareToDecode()
    752 {
    753     ASSERT(m_frameContext->isDataSizeDefined() && m_frameContext->isHeaderDefined());
    754 
    755     // Since we use a codesize of 1 more than the datasize, we need to ensure
    756     // that our datasize is strictly less than the MAX_DICTIONARY_ENTRY_BITS.
    757     if (m_frameContext->dataSize() >= MAX_DICTIONARY_ENTRY_BITS)
    758         return false;
    759     clearCode = 1 << m_frameContext->dataSize();
    760     avail = clearCode + 2;
    761     oldcode = -1;
    762     codesize = m_frameContext->dataSize() + 1;
    763     codemask = (1 << codesize) - 1;
    764     datum = bits = 0;
    765     ipass = m_frameContext->interlaced() ? 1 : 0;
    766     irow = 0;
    767 
    768     // We want to know the longest sequence encodable by a dictionary with
    769     // MAX_DICTIONARY_ENTRIES entries. If we ignore the need to encode the base
    770     // values themselves at the beginning of the dictionary, as well as the need
    771     // for a clear code or a termination code, we could use every entry to
    772     // encode a series of multiple values. If the input value stream looked
    773     // like "AAAAA..." (a long string of just one value), the first dictionary
    774     // entry would encode AA, the next AAA, the next AAAA, and so forth. Thus
    775     // the longest sequence would be MAX_DICTIONARY_ENTRIES + 1 values.
    776     //
    777     // However, we have to account for reserved entries. The first |datasize|
    778     // bits are reserved for the base values, and the next two entries are
    779     // reserved for the clear code and termination code. In theory a GIF can
    780     // set the datasize to 0, meaning we have just two reserved entries, making
    781     // the longest sequence (MAX_DICTIONARY_ENTIRES + 1) - 2 values long. Since
    782     // each value is a byte, this is also the number of bytes in the longest
    783     // encodable sequence.
    784     const size_t maxBytes = MAX_DICTIONARY_ENTRIES - 1;
    785 
    786     // Now allocate the output buffer. We decode directly into this buffer
    787     // until we have at least one row worth of data, then call outputRow().
    788     // This means worst case we may have (row width - 1) bytes in the buffer
    789     // and then decode a sequence |maxBytes| long to append.
    790     rowBuffer.resize(m_frameContext->width() - 1 + maxBytes);
    791     rowIter = rowBuffer.begin();
    792     rowsRemaining = m_frameContext->height();
    793 
    794     // Clearing the whole suffix table lets us be more tolerant of bad data.
    795     for (int i = 0; i < clearCode; ++i) {
    796         suffix[i] = i;
    797         suffixLength[i] = 1;
    798     }
    799     return true;
    800 }
    801