[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.18-1-697-g2f78b87
yong.li at torchmobile.com
yong.li at torchmobile.com
Wed Jan 20 22:13:28 UTC 2010
The following commit has been merged in the debian/unstable branch:
commit 2304701812d3cec3394e9001a75b92d1e5b6ff1c
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