Changeset 56007 in webkit


Ignore:
Timestamp:
Mar 15, 2010 1:08:33 PM (14 years ago)
Author:
pkasting@chromium.org
Message:

Clean up more bits of the open-source image decoders. In addition to
simplifying things somewhat, this makes all the decoders the same in
terms of how they construct "image reader" subclasses and init scale
data.

Reviewed by Adam Barth.

https://bugs.webkit.org/show_bug.cgi?id=36040

No functional change, so no tests.

  • platform/image-decoders/ImageDecoder.h: Reorder a few declarations to try and group/order members slightly better.

(WebCore::ImageDecoder::ImageDecoder):

  • platform/image-decoders/gif/GIFImageDecoder.cpp: Move reader construction into decode(). Prep scale data in setSize(). Remove useless comment.

(WebCore::GIFImageDecoder::setData):
(WebCore::GIFImageDecoder::setSize):
(WebCore::GIFImageDecoder::frameBufferAtIndex):
(WebCore::GIFImageDecoder::decode):

  • platform/image-decoders/gif/GIFImageDecoder.h: Prep scale data in setSize().
  • platform/image-decoders/gif/GIFImageReader.cpp: Prep scale data in setSize().

(GIFImageReader::read):

  • platform/image-decoders/ico/ICOImageDecoder.cpp: Shorten code.

(WebCore::ICOImageDecoder::setSize):

  • platform/image-decoders/jpeg/JPEGImageDecoder.cpp: Fix style. Move reader construction into decode().

(WebCore::JPEGImageReader::close):
(WebCore::JPEGImageReader::skipBytes):
(WebCore::JPEGImageDecoder::decode):

  • platform/image-decoders/jpeg/JPEGImageDecoder.h: Move reader construction into decode().

(WebCore::JPEGImageDecoder::filenameExtension):

  • platform/image-decoders/png/PNGImageDecoder.cpp: Move reader construction into decode(). Track completion on decoder, not reader. Prep scale data in setSize(). Remove useless comment.

(WebCore::PNGImageReader::PNGImageReader):
(WebCore::PNGImageReader::close):
(WebCore::PNGImageReader::decode):
(WebCore::PNGImageDecoder::setSize):
(WebCore::PNGImageDecoder::frameBufferAtIndex):
(WebCore::PNGImageDecoder::headerAvailable):
(WebCore::PNGImageDecoder::pngComplete):
(WebCore::PNGImageDecoder::decode):

  • platform/image-decoders/png/PNGImageDecoder.h: Move reader construction into decode(). Track completion on decoder, not reader. Prep scale data in setSize().

(WebCore::PNGImageDecoder::filenameExtension):
(WebCore::PNGImageDecoder::isComplete):

Location:
trunk/WebCore
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r56006 r56007  
     12010-03-11  Peter Kasting  <pkasting@google.com>
     2
     3        Reviewed by Adam Barth.
     4
     5        Clean up more bits of the open-source image decoders.  In addition to
     6        simplifying things somewhat, this makes all the decoders the same in
     7        terms of how they construct "image reader" subclasses and init scale
     8        data.
     9
     10        https://bugs.webkit.org/show_bug.cgi?id=36040
     11
     12        No functional change, so no tests.
     13
     14        * platform/image-decoders/ImageDecoder.h: Reorder a few declarations to try and group/order members slightly better.
     15        (WebCore::ImageDecoder::ImageDecoder):
     16        * platform/image-decoders/gif/GIFImageDecoder.cpp: Move reader construction into decode().  Prep scale data in setSize().  Remove useless comment.
     17        (WebCore::GIFImageDecoder::setData):
     18        (WebCore::GIFImageDecoder::setSize):
     19        (WebCore::GIFImageDecoder::frameBufferAtIndex):
     20        (WebCore::GIFImageDecoder::decode):
     21        * platform/image-decoders/gif/GIFImageDecoder.h: Prep scale data in setSize().
     22        * platform/image-decoders/gif/GIFImageReader.cpp: Prep scale data in setSize().
     23        (GIFImageReader::read):
     24        * platform/image-decoders/ico/ICOImageDecoder.cpp: Shorten code.
     25        (WebCore::ICOImageDecoder::setSize):
     26        * platform/image-decoders/jpeg/JPEGImageDecoder.cpp: Fix style.  Move reader construction into decode().
     27        (WebCore::JPEGImageReader::close):
     28        (WebCore::JPEGImageReader::skipBytes):
     29        (WebCore::JPEGImageDecoder::decode):
     30        * platform/image-decoders/jpeg/JPEGImageDecoder.h: Move reader construction into decode().
     31        (WebCore::JPEGImageDecoder::filenameExtension):
     32        * platform/image-decoders/png/PNGImageDecoder.cpp: Move reader construction into decode().  Track completion on decoder, not reader.  Prep scale data in setSize().  Remove useless comment.
     33        (WebCore::PNGImageReader::PNGImageReader):
     34        (WebCore::PNGImageReader::close):
     35        (WebCore::PNGImageReader::decode):
     36        (WebCore::PNGImageDecoder::setSize):
     37        (WebCore::PNGImageDecoder::frameBufferAtIndex):
     38        (WebCore::PNGImageDecoder::headerAvailable):
     39        (WebCore::PNGImageDecoder::pngComplete):
     40        (WebCore::PNGImageDecoder::decode):
     41        * platform/image-decoders/png/PNGImageDecoder.h: Move reader construction into decode().  Track completion on decoder, not reader.  Prep scale data in setSize().
     42        (WebCore::PNGImageDecoder::filenameExtension):
     43        (WebCore::PNGImageDecoder::isComplete):
     44
    1452010-03-15  Philippe Normand  <pnormand@igalia.com>
    246
  • trunk/WebCore/platform/image-decoders/ImageDecoder.h

    r55687 r56007  
    206206            : m_scaled(false)
    207207            , m_sizeAvailable(false)
     208            , m_maxNumPixels(-1)
    208209            , m_isAllDataReceived(false)
    209             , m_maxNumPixels(-1)
    210210            , m_failed(false)
    211211        {
     
    326326
    327327        RefPtr<SharedBuffer> m_data; // The encoded data.
     328        Vector<RGBA32Buffer> m_frameBufferCache;
     329        bool m_scaled;
    328330        Vector<int> m_scaledColumns;
    329331        Vector<int> m_scaledRows;
    330         bool m_scaled;
    331         Vector<RGBA32Buffer> m_frameBufferCache;
    332332
    333333    private:
     
    345345        IntSize m_size;
    346346        bool m_sizeAvailable;
     347        int m_maxNumPixels;
    347348        bool m_isAllDataReceived;
    348         int m_maxNumPixels;
    349349        bool m_failed;
    350350    };
  • trunk/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp

    r55687 r56007  
    5050    // We need to rescan the frame count, as the new data may have changed it.
    5151    m_alreadyScannedThisDataForFrameCount = false;
    52 
    53     if (!m_reader && !failed())
    54         m_reader.set(new GIFImageReader(this));
    5552}
    5653
     
    6158
    6259    return ImageDecoder::isSizeAvailable();
     60}
     61
     62bool GIFImageDecoder::setSize(unsigned width, unsigned height)
     63{
     64    if (!ImageDecoder::setSize(width, height))
     65        return false;
     66
     67    prepareScaleDataIfNecessary();
     68    return true;
    6369}
    6470
     
    110116    RGBA32Buffer& frame = m_frameBufferCache[index];
    111117    if (frame.status() != RGBA32Buffer::FrameComplete)
    112         decode(index + 1, GIFFullQuery); // Decode this frame.
     118        decode(index + 1, GIFFullQuery);
    113119    return &frame;
    114120}
     
    164170}
    165171
    166 bool GIFImageDecoder::sizeNowAvailable(unsigned width, unsigned height)
    167 {
    168     if (!setSize(width, height))
    169         return false;
    170 
    171     prepareScaleDataIfNecessary();
    172     return true;
    173 }
    174 
    175172void GIFImageDecoder::decodingHalted(unsigned bytesLeft)
    176173{
     
    292289void GIFImageDecoder::decode(unsigned haltAtFrame, GIFQuery query)
    293290{
    294     if (failed() || !m_reader)
     291    if (failed())
    295292        return;
     293
     294    if (!m_reader)
     295        m_reader.set(new GIFImageReader(this));
    296296
    297297    if (!m_reader->read((const unsigned char*)m_data->data() + m_readOffset, m_data->size() - m_readOffset, query, haltAtFrame))
  • trunk/WebCore/platform/image-decoders/gif/GIFImageDecoder.h

    r54823 r56007  
    4646        virtual void setData(SharedBuffer* data, bool allDataReceived);
    4747        virtual bool isSizeAvailable();
     48        virtual bool setSize(unsigned width, unsigned height);
    4849        virtual size_t frameCount();
    4950        virtual int repetitionCount() const;
     
    5253
    5354        // Callbacks from the GIF reader.
    54         bool sizeNowAvailable(unsigned width, unsigned height);
    5555        void decodingHalted(unsigned bytesLeft);
    5656        bool haveDecodedRow(unsigned frameIndex, unsigned char* rowBuffer, unsigned char* rowEnd, unsigned rowNumber, unsigned repeatCount, bool writeTransparentPixels);
  • trunk/WebCore/platform/image-decoders/gif/GIFImageReader.cpp

    r54984 r56007  
    520520
    521521      // CALLBACK: Inform the decoderplugin of our size.
    522       if (clientptr && !clientptr->sizeNowAvailable(screen_width, screen_height))
     522      if (clientptr && !clientptr->setSize(screen_width, screen_height))
    523523        return false;
    524524     
     
    747747
    748748        // CALLBACK: Inform the decoderplugin of our size.
    749         if (clientptr && !clientptr->sizeNowAvailable(screen_width, screen_height))
     749        if (clientptr && !clientptr->setSize(screen_width, screen_height))
    750750          return false;
    751751      }
  • trunk/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp

    r55687 r56007  
    8989bool ICOImageDecoder::setSize(unsigned width, unsigned height)
    9090{
    91     if (m_frameSize.isEmpty())
    92         return ImageDecoder::setSize(width, height);
    93 
    9491    // The size calculated inside the BMPImageReader had better match the one in
    9592    // the icon directory.
    96     if (IntSize(width, height) != m_frameSize)
    97         setFailed();
    98     return !failed();
     93    return m_frameSize.isEmpty() ? ImageDecoder::setSize(width, height) : ((IntSize(width, height) == m_frameSize) || setFailed());
    9994}
    10095
  • trunk/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp

    r55687 r56007  
    132132    }
    133133
    134     void close() {
     134    void close()
     135    {
    135136        decoder_source_mgr* src = (decoder_source_mgr*)m_info.src;
    136137        if (src)
     
    141142    }
    142143
    143     void skipBytes(long num_bytes) {
     144    void skipBytes(long numBytes)
     145    {
    144146        decoder_source_mgr* src = (decoder_source_mgr*)m_info.src;
    145         long bytesToSkip = std::min(num_bytes, (long)src->pub.bytes_in_buffer);
     147        long bytesToSkip = std::min(numBytes, (long)src->pub.bytes_in_buffer);
    146148        src->pub.bytes_in_buffer -= (size_t)bytesToSkip;
    147149        src->pub.next_input_byte += bytesToSkip;
    148150
    149         m_bytesToSkip = std::max(num_bytes - bytesToSkip, static_cast<long>(0));
     151        m_bytesToSkip = std::max(numBytes - bytesToSkip, static_cast<long>(0));
    150152    }
    151153
     
    377379JPEGImageDecoder::~JPEGImageDecoder()
    378380{
    379 }
    380 
    381 void JPEGImageDecoder::setData(SharedBuffer* data, bool allDataReceived)
    382 {
    383     if (failed())
    384         return;
    385 
    386     ImageDecoder::setData(data, allDataReceived);
    387 
    388     if (!m_reader && !failed())
    389         m_reader.set(new JPEGImageReader(this));
    390381}
    391382
     
    491482void JPEGImageDecoder::decode(bool onlySize)
    492483{
    493     if (failed() || !m_reader)
     484    if (failed())
    494485        return;
     486
     487    if (!m_reader)
     488        m_reader.set(new JPEGImageReader(this));
    495489
    496490    if (!m_reader->decode(m_data->buffer(), onlySize))
  • trunk/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.h

    r54823 r56007  
    4343        // ImageDecoder
    4444        virtual String filenameExtension() const { return "jpg"; }
    45         virtual void setData(SharedBuffer* data, bool allDataReceived);
    4645        virtual bool isSizeAvailable();
    4746        virtual bool setSize(unsigned width, unsigned height);
  • trunk/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp

    r55687 r56007  
    9696        , m_interlaceBuffer(0)
    9797        , m_hasAlpha(false)
    98         , m_hasFinishedDecoding(false)
    9998        , m_currentBufferSize(0)
    10099    {
     
    117116        m_interlaceBuffer = 0;
    118117        m_readOffset = 0;
    119         m_hasFinishedDecoding = false;
    120118    }
    121119
    122120    unsigned currentBufferSize() const { return m_currentBufferSize; }
    123 
    124     void setComplete() { m_hasFinishedDecoding = true; }
    125121
    126122    void decode(const SharedBuffer& data, bool sizeOnly)
     
    144140            // merely want to check if we've managed to set the size, not
    145141            // (recursively) trigger additional decoding if we haven't.
    146             if ((sizeOnly && decoder->ImageDecoder::isSizeAvailable()) || m_hasFinishedDecoding)
     142            if (sizeOnly ? decoder->ImageDecoder::isSizeAvailable() : decoder->isComplete())
    147143                return;
    148144        }
    149         if (!m_hasFinishedDecoding && decoder->isAllDataReceived())
     145        if (!decoder->isComplete() && decoder->isAllDataReceived())
    150146            decoder->pngComplete();
    151147    }
     
    169165    png_bytep m_interlaceBuffer;
    170166    bool m_hasAlpha;
    171     bool m_hasFinishedDecoding;
    172167    unsigned m_currentBufferSize;
    173168};
     
    181176}
    182177
    183 void PNGImageDecoder::setData(SharedBuffer* data, bool allDataReceived)
    184 {
    185     if (failed())
    186         return;
    187 
    188     ImageDecoder::setData(data, allDataReceived);
    189 
    190     if (!m_reader && !failed())
    191         m_reader.set(new PNGImageReader(this));
    192 }
    193178bool PNGImageDecoder::isSizeAvailable()
    194179{
     
    199184}
    200185
     186bool PNGImageDecoder::setSize(unsigned width, unsigned height)
     187{
     188    if (!ImageDecoder::setSize(width, height))
     189        return false;
     190
     191    prepareScaleDataIfNecessary();
     192    return true;
     193}
     194
    201195RGBA32Buffer* PNGImageDecoder::frameBufferAtIndex(size_t index)
    202196{
     
    209203    RGBA32Buffer& frame = m_frameBufferCache[0];
    210204    if (frame.status() != RGBA32Buffer::FrameComplete)
    211         decode(false); // Decode this frame.
     205        decode(false);
    212206    return &frame;
    213207}
     
    227221   
    228222    // We can fill in the size now that the header is available.
    229     if (!ImageDecoder::isSizeAvailable()) {
    230         if (!setSize(width, height)) {
    231             // Size unreasonable, bail out.
    232             longjmp(png->jmpbuf, 1);
    233             return;
    234         }
    235         prepareScaleDataIfNecessary();
     223    if (!setSize(width, height)) {
     224        longjmp(png->jmpbuf, 1);
     225        return;
    236226    }
    237227
     
    370360void PNGImageDecoder::pngComplete()
    371361{
    372     m_reader->setComplete();
    373 
    374362    if (!m_frameBufferCache.isEmpty())
    375363        m_frameBufferCache.first().setStatus(RGBA32Buffer::FrameComplete);
     
    378366void PNGImageDecoder::decode(bool onlySize)
    379367{
    380     if (failed() || !m_reader)
    381         return;
     368    if (failed())
     369        return;
     370
     371    if (!m_reader)
     372        m_reader.set(new PNGImageReader(this));
    382373
    383374    m_reader->decode(*m_data, onlySize);
    384375   
    385     if (failed() || (!m_frameBufferCache.isEmpty() && m_frameBufferCache[0].status() == RGBA32Buffer::FrameComplete))
     376    if (failed() || isComplete())
    386377        m_reader.clear();
    387378}
  • trunk/WebCore/platform/image-decoders/png/PNGImageDecoder.h

    r55687 r56007  
    4242        // ImageDecoder
    4343        virtual String filenameExtension() const { return "png"; }
    44         virtual void setData(SharedBuffer* data, bool allDataReceived);
    4544        virtual bool isSizeAvailable();
     45        virtual bool setSize(unsigned width, unsigned height);
    4646        virtual RGBA32Buffer* frameBufferAtIndex(size_t index);
    4747
     
    5050        void rowAvailable(unsigned char* rowBuffer, unsigned rowIndex, int interlacePass);
    5151        void pngComplete();
     52
     53        bool isComplete() const
     54        {
     55            return !m_frameBufferCache.isEmpty() && (m_frameBufferCache.first().status() == RGBA32Buffer::FrameComplete);
     56        }
    5257
    5358    private:
Note: See TracChangeset for help on using the changeset viewer.