[SCM] WebKit Debian packaging branch, webkit-1.2, updated. upstream/1.1.90-6072-g9a69373

yong.li at torchmobile.com yong.li at torchmobile.com
Thu Apr 8 00:55:09 UTC 2010


The following commit has been merged in the webkit-1.2 branch:
commit d9b8e211d28657df58d63c8b296f004d61eb92da
Author: yong.li at torchmobile.com <yong.li at torchmobile.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue Jan 5 23:08:32 2010 +0000

    2010-01-05  Yong Li  <yoli at 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):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@52831 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 693ba8c..40d8a0c 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,26 @@
+2010-01-05  Yong Li  <yoli at 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):
+
 2010-01-05  Adam Barth  <abarth at webkit.org>
 
         Rubber stamped by Dimitri Glazkov.
diff --git a/WebCore/platform/image-decoders/ImageDecoder.cpp b/WebCore/platform/image-decoders/ImageDecoder.cpp
index a16b940..1b23111 100644
--- a/WebCore/platform/image-decoders/ImageDecoder.cpp
+++ b/WebCore/platform/image-decoders/ImageDecoder.cpp
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2008-2009 Torch Mobile, Inc.
+ * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Library General Public
@@ -34,17 +35,38 @@
 #include "SharedBuffer.h"
 #include "XBMImageDecoder.h"
 
+using namespace std;
+
 namespace WebCore {
 
+static unsigned copyFromSharedBuffer(char* buffer, unsigned bufferLength, const SharedBuffer& sharedBuffer, unsigned offset)
+{
+    unsigned bytesExtracted = 0;
+    const char* moreData;
+    while (unsigned moreDataLength = sharedBuffer.getSomeData(moreData, offset)) {
+        unsigned bytesToCopy = min(bufferLength - bytesExtracted, moreDataLength);
+        memcpy(buffer + bytesExtracted, moreData, bytesToCopy);
+        bytesExtracted += bytesToCopy;
+        if (bytesExtracted == bufferLength)
+            break;
+        offset += bytesToCopy;
+    }
+    return bytesExtracted;
+}
+
 ImageDecoder* ImageDecoder::create(const SharedBuffer& data)
 {
+    // XBMs require 8 bytes of info.
+    static const unsigned maxMarkerLength = 8;
+
+    char contents[maxMarkerLength];
+    unsigned length = copyFromSharedBuffer(contents, maxMarkerLength, data, 0);
+
     // We need at least 4 bytes to figure out what kind of image we're dealing with.
-    int length = data.size();
     if (length < 4)
         return 0;
 
-    const unsigned char* uContents = (const unsigned char*)data.data();
-    const char* contents = data.data();
+    const unsigned char* uContents = reinterpret_cast<const unsigned char*>(contents);
 
     // GIFs begin with GIF8(7 or 9).
     if (strncmp(contents, "GIF8", 4) == 0)
diff --git a/WebCore/platform/image-decoders/ImageDecoder.h b/WebCore/platform/image-decoders/ImageDecoder.h
index de24828..4355f63 100644
--- a/WebCore/platform/image-decoders/ImageDecoder.h
+++ b/WebCore/platform/image-decoders/ImageDecoder.h
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
  * Copyright (C) 2008-2009 Torch Mobile, Inc.
+ * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
  * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
  *
  * Redistribution and use in source and binary forms, with or without
@@ -200,6 +201,7 @@ namespace WebCore {
         ImageDecoder()
             : m_failed(false)
             , m_sizeAvailable(false)
+            , m_isAllDataReceived(false)
 #if ENABLE(IMAGE_DECODER_DOWN_SAMPLING)
             , m_maxNumPixels(-1)
             , m_scaled(false)
@@ -218,7 +220,12 @@ namespace WebCore {
         virtual String filenameExtension() const = 0;
 
         // All specific decoder plugins must do something with the data they are given.
-        virtual void setData(SharedBuffer* data, bool allDataReceived) { m_data = data; }
+        bool isAllDataReceived() const { return m_isAllDataReceived; }
+        virtual void setData(SharedBuffer* data, bool allDataReceived)
+        {
+            m_data = data;
+            m_isAllDataReceived = allDataReceived;
+        }
 
         // Whether or not the size information has been decoded yet. This default
         // implementation just returns true if the size has been set and we have not
@@ -326,6 +333,7 @@ namespace WebCore {
 
         IntSize m_size;
         bool m_sizeAvailable;
+        bool m_isAllDataReceived;
     };
 
 } // namespace WebCore
diff --git a/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp b/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp
index 2ea012b..fa2c8b6 100644
--- a/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp
+++ b/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2006 Apple Computer, Inc.
  * Copyright (C) 2007-2009 Torch Mobile, Inc.
+ * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
  *
  * Portions are Copyright (C) 2001 mozilla.org
  *
@@ -75,6 +76,8 @@ public:
         , m_decodingSizeOnly(false)
         , m_interlaceBuffer(0)
         , m_hasAlpha(0)
+        , m_hasFinishedDecoding(false)
+        , m_currentBufferSize(0)
     {
         m_png = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, decodingFailed, decodingWarning);
         m_info = png_create_info_struct(m_png);
@@ -92,9 +95,14 @@ public:
         delete []m_interlaceBuffer;
         m_interlaceBuffer = 0;
         m_readOffset = 0;
+        m_hasFinishedDecoding = false;
     }
 
-    void decode(const Vector<char>& data, bool sizeOnly)
+    unsigned currentBufferSize() const { return m_currentBufferSize; }
+
+    void setComplete() { m_hasFinishedDecoding = true; }
+
+    void decode(const SharedBuffer& data, bool sizeOnly)
     {
         m_decodingSizeOnly = sizeOnly;
 
@@ -104,13 +112,17 @@ public:
             return;
         }
 
-        // Go ahead and assume we consumed all the data.  If we consume less, the
-        // callback will adjust our read offset accordingly.  Do not attempt to adjust the
-        // offset after png_process_data returns.
-        unsigned offset = m_readOffset;
-        unsigned remaining = data.size() - m_readOffset;
-        m_readOffset = data.size();
-        png_process_data(m_png, m_info, (png_bytep)(data.data()) + offset, remaining);
+        PNGImageDecoder* decoder = static_cast<PNGImageDecoder*>(png_get_progressive_ptr(m_png));
+        const char* segment;
+        while (unsigned segmentLength = data.getSomeData(segment, m_readOffset)) {
+            m_readOffset += segmentLength;
+            m_currentBufferSize = m_readOffset;
+            png_process_data(m_png, m_info, reinterpret_cast<png_bytep>(const_cast<char*>(segment)), segmentLength);
+            if ((sizeOnly && decoder->isSizeAvailable()) || m_hasFinishedDecoding)
+                break;
+        }
+        if (!m_hasFinishedDecoding && decoder->isAllDataReceived())
+            decoder->pngComplete();
     }
 
     bool decodingSizeOnly() const { return m_decodingSizeOnly; }
@@ -133,6 +145,8 @@ private:
     png_infop m_info;
     png_bytep m_interlaceBuffer;
     bool m_hasAlpha;
+    bool m_hasFinishedDecoding;
+    unsigned m_currentBufferSize;
 };
 
 PNGImageDecoder::PNGImageDecoder()
@@ -189,7 +203,7 @@ void PNGImageDecoder::decode(bool sizeOnly)
     if (m_failed)
         return;
 
-    m_reader->decode(m_data->buffer(), sizeOnly);
+    m_reader->decode(*m_data, sizeOnly);
     
     if (m_failed || (!m_frameBufferCache.isEmpty() && m_frameBufferCache[0].status() == RGBA32Buffer::FrameComplete)) {
         delete m_reader;
@@ -297,7 +311,7 @@ void PNGImageDecoder::headerAvailable()
 
     if (reader()->decodingSizeOnly()) {
         // If we only needed the size, halt the reader.     
-        reader()->setReadOffset(m_data->size() - png->buffer_size);
+        reader()->setReadOffset(reader()->currentBufferSize() - png->buffer_size);
         png->buffer_size = 0;
     }
 }
@@ -423,6 +437,8 @@ void pngComplete(png_structp png, png_infop info)
 
 void PNGImageDecoder::pngComplete()
 {
+    m_reader->setComplete();
+
     if (m_frameBufferCache.isEmpty())
         return;
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list