Changeset 52831 in webkit


Ignore:
Timestamp:
Jan 5, 2010 3:08:32 PM (14 years ago)
Author:
yong.li@torchmobile.com
Message:

2010-01-05 Yong Li <yoli@rim.com>

Reviewed by Darin Adler.

Make PNG image decoder work with segmented SharedBuffer
https://bugs.webkit.org/show_bug.cgi?id=33213

  • platform/image-decoders/ImageDecoder.cpp: (WebCore::ImageDecoder::create):
  • platform/image-decoders/ImageDecoder.h: (WebCore::ImageDecoder::ImageDecoder): (WebCore::ImageDecoder::isAllDataReceived): (WebCore::ImageDecoder::setData):
  • platform/image-decoders/png/PNGImageDecoder.cpp: (WebCore::PNGImageReader::PNGImageReader): (WebCore::PNGImageReader::close): (WebCore::PNGImageReader::currentBufferSize): (WebCore::PNGImageReader::setComplete): (WebCore::PNGImageReader::decode): (WebCore::PNGImageDecoder::decode): (WebCore::PNGImageDecoder::headerAvailable): (WebCore::PNGImageDecoder::pngComplete):
Location:
trunk/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r52823 r52831  
     12010-01-05  Yong Li  <yoli@rim.com>
     2
     3        Reviewed by Darin Adler.
     4
     5        Make PNG image decoder work with segmented SharedBuffer
     6        https://bugs.webkit.org/show_bug.cgi?id=33213
     7
     8        * platform/image-decoders/ImageDecoder.cpp:
     9        (WebCore::ImageDecoder::create):
     10        * platform/image-decoders/ImageDecoder.h:
     11        (WebCore::ImageDecoder::ImageDecoder):
     12        (WebCore::ImageDecoder::isAllDataReceived):
     13        (WebCore::ImageDecoder::setData):
     14        * platform/image-decoders/png/PNGImageDecoder.cpp:
     15        (WebCore::PNGImageReader::PNGImageReader):
     16        (WebCore::PNGImageReader::close):
     17        (WebCore::PNGImageReader::currentBufferSize):
     18        (WebCore::PNGImageReader::setComplete):
     19        (WebCore::PNGImageReader::decode):
     20        (WebCore::PNGImageDecoder::decode):
     21        (WebCore::PNGImageDecoder::headerAvailable):
     22        (WebCore::PNGImageDecoder::pngComplete):
     23
    1242010-01-05  Adam Barth  <abarth@webkit.org>
    225
  • trunk/WebCore/platform/image-decoders/ImageDecoder.cpp

    r47868 r52831  
    11/*
    22 * Copyright (C) 2008-2009 Torch Mobile, Inc.
     3 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
    34 *
    45 *  This library is free software; you can redistribute it and/or
     
    3536#include "XBMImageDecoder.h"
    3637
     38using namespace std;
     39
    3740namespace WebCore {
    3841
     42static unsigned copyFromSharedBuffer(char* buffer, unsigned bufferLength, const SharedBuffer& sharedBuffer, unsigned offset)
     43{
     44    unsigned bytesExtracted = 0;
     45    const char* moreData;
     46    while (unsigned moreDataLength = sharedBuffer.getSomeData(moreData, offset)) {
     47        unsigned bytesToCopy = min(bufferLength - bytesExtracted, moreDataLength);
     48        memcpy(buffer + bytesExtracted, moreData, bytesToCopy);
     49        bytesExtracted += bytesToCopy;
     50        if (bytesExtracted == bufferLength)
     51            break;
     52        offset += bytesToCopy;
     53    }
     54    return bytesExtracted;
     55}
     56
    3957ImageDecoder* ImageDecoder::create(const SharedBuffer& data)
    4058{
     59    // XBMs require 8 bytes of info.
     60    static const unsigned maxMarkerLength = 8;
     61
     62    char contents[maxMarkerLength];
     63    unsigned length = copyFromSharedBuffer(contents, maxMarkerLength, data, 0);
     64
    4165    // We need at least 4 bytes to figure out what kind of image we're dealing with.
    42     int length = data.size();
    4366    if (length < 4)
    4467        return 0;
    4568
    46     const unsigned char* uContents = (const unsigned char*)data.data();
    47     const char* contents = data.data();
     69    const unsigned char* uContents = reinterpret_cast<const unsigned char*>(contents);
    4870
    4971    // GIFs begin with GIF8(7 or 9).
  • trunk/WebCore/platform/image-decoders/ImageDecoder.h

    r51179 r52831  
    22 * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
    33 * Copyright (C) 2008-2009 Torch Mobile, Inc.
     4 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
    45 * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
    56 *
     
    201202            : m_failed(false)
    202203            , m_sizeAvailable(false)
     204            , m_isAllDataReceived(false)
    203205#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING)
    204206            , m_maxNumPixels(-1)
     
    219221
    220222        // All specific decoder plugins must do something with the data they are given.
    221         virtual void setData(SharedBuffer* data, bool allDataReceived) { m_data = data; }
     223        bool isAllDataReceived() const { return m_isAllDataReceived; }
     224        virtual void setData(SharedBuffer* data, bool allDataReceived)
     225        {
     226            m_data = data;
     227            m_isAllDataReceived = allDataReceived;
     228        }
    222229
    223230        // Whether or not the size information has been decoded yet. This default
     
    327334        IntSize m_size;
    328335        bool m_sizeAvailable;
     336        bool m_isAllDataReceived;
    329337    };
    330338
  • trunk/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp

    r52483 r52831  
    22 * Copyright (C) 2006 Apple Computer, Inc.
    33 * Copyright (C) 2007-2009 Torch Mobile, Inc.
     4 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
    45 *
    56 * Portions are Copyright (C) 2001 mozilla.org
     
    7677        , m_interlaceBuffer(0)
    7778        , m_hasAlpha(0)
     79        , m_hasFinishedDecoding(false)
     80        , m_currentBufferSize(0)
    7881    {
    7982        m_png = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, decodingFailed, decodingWarning);
     
    9396        m_interlaceBuffer = 0;
    9497        m_readOffset = 0;
    95     }
    96 
    97     void decode(const Vector<char>& data, bool sizeOnly)
     98        m_hasFinishedDecoding = false;
     99    }
     100
     101    unsigned currentBufferSize() const { return m_currentBufferSize; }
     102
     103    void setComplete() { m_hasFinishedDecoding = true; }
     104
     105    void decode(const SharedBuffer& data, bool sizeOnly)
    98106    {
    99107        m_decodingSizeOnly = sizeOnly;
     
    105113        }
    106114
    107         // Go ahead and assume we consumed all the data.  If we consume less, the
    108         // callback will adjust our read offset accordingly.  Do not attempt to adjust the
    109         // offset after png_process_data returns.
    110         unsigned offset = m_readOffset;
    111         unsigned remaining = data.size() - m_readOffset;
    112         m_readOffset = data.size();
    113         png_process_data(m_png, m_info, (png_bytep)(data.data()) + offset, remaining);
     115        PNGImageDecoder* decoder = static_cast<PNGImageDecoder*>(png_get_progressive_ptr(m_png));
     116        const char* segment;
     117        while (unsigned segmentLength = data.getSomeData(segment, m_readOffset)) {
     118            m_readOffset += segmentLength;
     119            m_currentBufferSize = m_readOffset;
     120            png_process_data(m_png, m_info, reinterpret_cast<png_bytep>(const_cast<char*>(segment)), segmentLength);
     121            if ((sizeOnly && decoder->isSizeAvailable()) || m_hasFinishedDecoding)
     122                break;
     123        }
     124        if (!m_hasFinishedDecoding && decoder->isAllDataReceived())
     125            decoder->pngComplete();
    114126    }
    115127
     
    134146    png_bytep m_interlaceBuffer;
    135147    bool m_hasAlpha;
     148    bool m_hasFinishedDecoding;
     149    unsigned m_currentBufferSize;
    136150};
    137151
     
    190204        return;
    191205
    192     m_reader->decode(m_data->buffer(), sizeOnly);
     206    m_reader->decode(*m_data, sizeOnly);
    193207   
    194208    if (m_failed || (!m_frameBufferCache.isEmpty() && m_frameBufferCache[0].status() == RGBA32Buffer::FrameComplete)) {
     
    298312    if (reader()->decodingSizeOnly()) {
    299313        // If we only needed the size, halt the reader.     
    300         reader()->setReadOffset(m_data->size() - png->buffer_size);
     314        reader()->setReadOffset(reader()->currentBufferSize() - png->buffer_size);
    301315        png->buffer_size = 0;
    302316    }
     
    424438void PNGImageDecoder::pngComplete()
    425439{
     440    m_reader->setComplete();
     441
    426442    if (m_frameBufferCache.isEmpty())
    427443        return;
Note: See TracChangeset for help on using the changeset viewer.