Changeset 52831 in webkit
- Timestamp:
- Jan 5, 2010 3:08:32 PM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r52823 r52831 1 2010-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 1 24 2010-01-05 Adam Barth <abarth@webkit.org> 2 25 -
trunk/WebCore/platform/image-decoders/ImageDecoder.cpp
r47868 r52831 1 1 /* 2 2 * Copyright (C) 2008-2009 Torch Mobile, Inc. 3 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. 3 4 * 4 5 * This library is free software; you can redistribute it and/or … … 35 36 #include "XBMImageDecoder.h" 36 37 38 using namespace std; 39 37 40 namespace WebCore { 38 41 42 static 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 39 57 ImageDecoder* ImageDecoder::create(const SharedBuffer& data) 40 58 { 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 41 65 // We need at least 4 bytes to figure out what kind of image we're dealing with. 42 int length = data.size();43 66 if (length < 4) 44 67 return 0; 45 68 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); 48 70 49 71 // GIFs begin with GIF8(7 or 9). -
trunk/WebCore/platform/image-decoders/ImageDecoder.h
r51179 r52831 2 2 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. 3 3 * Copyright (C) 2008-2009 Torch Mobile, Inc. 4 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. 4 5 * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies) 5 6 * … … 201 202 : m_failed(false) 202 203 , m_sizeAvailable(false) 204 , m_isAllDataReceived(false) 203 205 #if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) 204 206 , m_maxNumPixels(-1) … … 219 221 220 222 // 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 } 222 229 223 230 // Whether or not the size information has been decoded yet. This default … … 327 334 IntSize m_size; 328 335 bool m_sizeAvailable; 336 bool m_isAllDataReceived; 329 337 }; 330 338 -
trunk/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp
r52483 r52831 2 2 * Copyright (C) 2006 Apple Computer, Inc. 3 3 * Copyright (C) 2007-2009 Torch Mobile, Inc. 4 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. 4 5 * 5 6 * Portions are Copyright (C) 2001 mozilla.org … … 76 77 , m_interlaceBuffer(0) 77 78 , m_hasAlpha(0) 79 , m_hasFinishedDecoding(false) 80 , m_currentBufferSize(0) 78 81 { 79 82 m_png = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, decodingFailed, decodingWarning); … … 93 96 m_interlaceBuffer = 0; 94 97 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) 98 106 { 99 107 m_decodingSizeOnly = sizeOnly; … … 105 113 } 106 114 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(); 114 126 } 115 127 … … 134 146 png_bytep m_interlaceBuffer; 135 147 bool m_hasAlpha; 148 bool m_hasFinishedDecoding; 149 unsigned m_currentBufferSize; 136 150 }; 137 151 … … 190 204 return; 191 205 192 m_reader->decode( m_data->buffer(), sizeOnly);206 m_reader->decode(*m_data, sizeOnly); 193 207 194 208 if (m_failed || (!m_frameBufferCache.isEmpty() && m_frameBufferCache[0].status() == RGBA32Buffer::FrameComplete)) { … … 298 312 if (reader()->decodingSizeOnly()) { 299 313 // 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); 301 315 png->buffer_size = 0; 302 316 } … … 424 438 void PNGImageDecoder::pngComplete() 425 439 { 440 m_reader->setComplete(); 441 426 442 if (m_frameBufferCache.isEmpty()) 427 443 return;
Note: See TracChangeset
for help on using the changeset viewer.