Changeset 53411 in webkit
- Timestamp:
- Jan 18, 2010 9:46:39 AM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r53410 r53411 1 2010-01-18 Peter Kasting <pkasting@google.com> 2 3 Reviewed by Adam Barth. 4 5 Simplify image decoders slightly by using OwnPtr instead of raw pointers 6 and eliminating a basically-useless wrapper class in the GIF decoder. 7 https://bugs.webkit.org/show_bug.cgi?id=28751 8 9 * platform/graphics/qt/ImageDecoderQt.cpp: 10 (WebCore::ImageDecoderQt::ImageDecoderQt): 11 (WebCore::ImageDecoderQt::~ImageDecoderQt): 12 (WebCore::ImageDecoderQt::setData): 13 (WebCore::ImageDecoderQt::internalReadImage): 14 (WebCore::ImageDecoderQt::failRead): 15 * platform/graphics/qt/ImageDecoderQt.h: 16 * platform/image-decoders/gif/GIFImageDecoder.cpp: 17 (WebCore::GIFImageDecoder::GIFImageDecoder): 18 (WebCore::GIFImageDecoder::~GIFImageDecoder): 19 (WebCore::GIFImageDecoder::setData): 20 (WebCore::GIFImageDecoder::frameCount): 21 (WebCore::GIFImageDecoder::repetitionCount): 22 (WebCore::GIFImageDecoder::decode): 23 (WebCore::GIFImageDecoder::decodingHalted): 24 (WebCore::GIFImageDecoder::initFrameBuffer): 25 (WebCore::GIFImageDecoder::haveDecodedRow): 26 (WebCore::GIFImageDecoder::gifComplete): 27 * platform/image-decoders/gif/GIFImageDecoder.h: 28 * platform/image-decoders/jpeg/JPEGImageDecoder.cpp: 29 (WebCore::JPEGImageDecoder::JPEGImageDecoder): 30 (WebCore::JPEGImageDecoder::~JPEGImageDecoder): 31 (WebCore::JPEGImageDecoder::setData): 32 (WebCore::JPEGImageDecoder::decode): 33 * platform/image-decoders/jpeg/JPEGImageDecoder.h: 34 * platform/image-decoders/png/PNGImageDecoder.cpp: 35 (WebCore::PNGImageDecoder::PNGImageDecoder): 36 (WebCore::PNGImageDecoder::~PNGImageDecoder): 37 (WebCore::PNGImageDecoder::setData): 38 (WebCore::PNGImageDecoder::decode): 39 (WebCore::PNGImageDecoder::headerAvailable): 40 (WebCore::PNGImageDecoder::rowAvailable): 41 * platform/image-decoders/png/PNGImageDecoder.h: 42 1 43 2010-01-18 Daniel Cheng <dcheng@google.com> 2 44 -
trunk/WebCore/platform/graphics/qt/ImageDecoderQt.cpp
r52657 r53411 48 48 49 49 ImageDecoderQt::ImageDecoderQt() 50 : m_buffer(0) 51 , m_reader(0) 52 , m_repetitionCount(cAnimationNone) 50 : m_repetitionCount(cAnimationNone) 53 51 { 54 52 } … … 56 54 ImageDecoderQt::~ImageDecoderQt() 57 55 { 58 delete m_reader;59 delete m_buffer;60 56 } 61 57 … … 78 74 // Attempt to load the data 79 75 QByteArray imageData = QByteArray::fromRawData(m_data->data(), m_data->size()); 80 m_buffer = new QBuffer;76 m_buffer.set(new QBuffer); 81 77 m_buffer->setData(imageData); 82 78 m_buffer->open(QBuffer::ReadOnly); 83 m_reader = new QImageReader(m_buffer, m_format);79 m_reader.set(new QImageReader(m_buffer.get(), m_format)); 84 80 85 81 // This will force the JPEG decoder to use JDCT_IFAST … … 184 180 return; 185 181 186 delete m_reader; 187 delete m_buffer; 188 m_buffer = 0; 189 m_reader = 0; 182 m_reader.clear(); 183 m_buffer.clear(); 190 184 } 191 185 … … 235 229 { 236 230 setFailed(); 237 delete m_reader; 238 delete m_buffer; 239 m_reader = 0; 240 m_buffer = 0; 231 m_reader.clear(); 232 m_buffer.clear(); 241 233 } 242 234 } -
trunk/WebCore/platform/graphics/qt/ImageDecoderQt.h
r52657 r53411 34 34 #include <QtCore/QHash> 35 35 #include <QtCore/QBuffer> 36 #include <wtf/OwnPtr.h> 36 37 37 38 namespace WebCore { … … 67 68 private: 68 69 QByteArray m_format; 69 QBuffer*m_buffer;70 QImageReader*m_reader;70 OwnPtr<QBuffer> m_buffer; 71 OwnPtr<QImageReader> m_reader; 71 72 mutable int m_repetitionCount; 72 73 }; -
trunk/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp
r53311 r53411 30 30 namespace WebCore { 31 31 32 class GIFImageDecoderPrivate {33 public:34 GIFImageDecoderPrivate(GIFImageDecoder* decoder = 0)35 : m_reader(decoder)36 , m_readOffset(0)37 {38 }39 40 ~GIFImageDecoderPrivate()41 {42 m_reader.close();43 }44 45 bool decode(SharedBuffer* data,46 GIFImageDecoder::GIFQuery query = GIFImageDecoder::GIFFullQuery,47 unsigned int haltFrame = -1)48 {49 return m_reader.read((const unsigned char*)data->data() + m_readOffset, data->size() - m_readOffset,50 query,51 haltFrame);52 }53 54 unsigned frameCount() const { return m_reader.images_count; }55 int repetitionCount() const { return m_reader.loop_count; }56 57 void setReadOffset(unsigned o) { m_readOffset = o; }58 59 bool isTransparent() const { return m_reader.frame_reader->is_transparent; }60 61 void getColorMap(unsigned char*& map, unsigned& size) const62 {63 if (m_reader.frame_reader->is_local_colormap_defined) {64 map = m_reader.frame_reader->local_colormap;65 size = (unsigned)m_reader.frame_reader->local_colormap_size;66 } else {67 map = m_reader.global_colormap;68 size = m_reader.global_colormap_size;69 }70 }71 72 unsigned frameXOffset() const { return m_reader.frame_reader->x_offset; }73 unsigned frameYOffset() const { return m_reader.frame_reader->y_offset; }74 unsigned frameWidth() const { return m_reader.frame_reader->width; }75 unsigned frameHeight() const { return m_reader.frame_reader->height; }76 77 int transparentPixel() const { return m_reader.frame_reader->tpixel; }78 79 unsigned duration() const { return m_reader.frame_reader->delay_time; }80 81 private:82 GIFImageReader m_reader;83 unsigned m_readOffset;84 };85 86 32 GIFImageDecoder::GIFImageDecoder() 87 33 : m_frameCountValid(true) 88 34 , m_repetitionCount(cAnimationLoopOnce) 89 , m_read er(0)35 , m_readOffset(0) 90 36 { 91 37 } … … 93 39 GIFImageDecoder::~GIFImageDecoder() 94 40 { 95 delete m_reader;96 41 } 97 42 … … 110 55 // Create the GIF reader. 111 56 if (!m_reader && !m_failed) 112 m_reader = new GIFImageDecoderPrivate(this);57 m_reader.set(new GIFImageReader(this)); 113 58 } 114 59 … … 133 78 // state, but for now we just crawl all the data. Note that this is no worse than what 134 79 // ImageIO does on Mac right now (it also crawls all the data again). 135 GIFImage DecoderPrivate reader;80 GIFImageReader reader(0); 136 81 // This function may fail, but we want to keep any partial data it may 137 82 // have decoded, so don't mark it is invalid. If there is an overflow 138 83 // or some serious error, m_failed will have gotten set for us. 139 reader. decode(m_data.get(), GIFFrameCountQuery);84 reader.read((const unsigned char*)m_data->data(), m_data->size(), GIFFrameCountQuery, -1); 140 85 m_frameCountValid = true; 141 m_frameBufferCache.resize(reader. frameCount());86 m_frameBufferCache.resize(reader.images_count); 142 87 } 143 88 … … 162 107 // seen a loop count yet; in this case we return our previously-cached 163 108 // value. 164 const int repetitionCount = m_reader-> repetitionCount();109 const int repetitionCount = m_reader->loop_count; 165 110 if (repetitionCount != cLoopCountNotSeen) 166 111 m_repetitionCount = repetitionCount; … … 236 181 return; 237 182 238 m_failed = !m_reader-> decode(m_data.get(), query, haltAtFrame);183 m_failed = !m_reader->read((const unsigned char*)m_data->data() + m_readOffset, m_data->size() - m_readOffset, query, haltAtFrame); 239 184 240 if (m_failed) { 241 delete m_reader; 242 m_reader = 0; 243 } 185 if (m_failed) 186 m_reader.clear(); 244 187 } 245 188 … … 255 198 void GIFImageDecoder::decodingHalted(unsigned bytesLeft) 256 199 { 257 m_read er->setReadOffset(m_data->size() - bytesLeft);200 m_readOffset = m_data->size() - bytesLeft; 258 201 } 259 202 … … 261 204 { 262 205 // Initialize the frame rect in our buffer. 263 IntRect frameRect(m_reader->frameXOffset(), m_reader->frameYOffset(),264 m_reader->frameWidth(), m_reader->frameHeight());206 const GIFFrameReader* frameReader = m_reader->frame_reader; 207 IntRect frameRect(frameReader->x_offset, frameReader->y_offset, frameReader->width, frameReader->height); 265 208 266 209 // Make sure the frameRect doesn't extend past the bottom-right of the buffer. 267 210 if (frameRect.right() > size().width()) 268 frameRect.setWidth(size().width() - m_reader->frameXOffset());211 frameRect.setWidth(size().width() - frameReader->x_offset); 269 212 if (frameRect.bottom() > size().height()) 270 frameRect.setHeight(size().height() - m_reader->frameYOffset());213 frameRect.setHeight(size().height() - frameReader->y_offset); 271 214 272 215 RGBA32Buffer* const buffer = &m_frameBufferCache[frameIndex]; … … 347 290 bool writeTransparentPixels) 348 291 { 292 const GIFFrameReader* frameReader = m_reader->frame_reader; 349 293 // The pixel data and coordinates supplied to us are relative to the frame's 350 294 // origin within the entire image size, i.e. 351 // (m_reader->frameXOffset(), m_reader->frameYOffset()). There is no 352 // guarantee that 353 // (rowEnd - rowBuffer) == (size().width() - m_reader->frameXOffset()), so 295 // (frameReader->x_offset, frameReader->y_offset). There is no guarantee 296 // that (rowEnd - rowBuffer) == (size().width() - frameReader->x_offset), so 354 297 // we must ensure we don't run off the end of either the source data or the 355 298 // row's X-coordinates. 356 int xBegin = upperBoundScaledX( m_reader->frameXOffset());357 int yBegin = upperBoundScaledY( m_reader->frameYOffset()+ rowNumber);299 int xBegin = upperBoundScaledX(frameReader->x_offset); 300 int yBegin = upperBoundScaledY(frameReader->y_offset + rowNumber); 358 301 int xEnd = lowerBoundScaledX(std::min(xBegin + static_cast<int>(rowEnd - rowBuffer), size().width()) - 1, xBegin + 1) + 1; 359 302 int yEnd = lowerBoundScaledY(std::min(yBegin + static_cast<int>(repeatCount), size().height()) - 1, yBegin + 1) + 1; … … 362 305 363 306 // Get the colormap. 307 const unsigned char* colorMap; 364 308 unsigned colorMapSize; 365 unsigned char* colorMap; 366 m_reader->getColorMap(colorMap, colorMapSize); 309 if (frameReader->is_local_colormap_defined) { 310 colorMap = frameReader->local_colormap; 311 colorMapSize = (unsigned)frameReader->local_colormap_size; 312 } else { 313 colorMap = m_reader->global_colormap; 314 colorMapSize = m_reader->global_colormap_size; 315 } 367 316 if (!colorMap) 368 317 return true; … … 375 324 // Write one row's worth of data into the frame. 376 325 for (int x = xBegin; x < xEnd; ++x) { 377 const unsigned char sourceValue = *(rowBuffer + (m_scaled ? m_scaledColumns[x] : x) - m_reader->frameXOffset());378 if ((! m_reader->isTransparent() || (sourceValue != m_reader->transparentPixel())) && (sourceValue < colorMapSize)) {326 const unsigned char sourceValue = *(rowBuffer + (m_scaled ? m_scaledColumns[x] : x) - frameReader->x_offset); 327 if ((!frameReader->is_transparent || (sourceValue != frameReader->tpixel)) && (sourceValue < colorMapSize)) { 379 328 const size_t colorIndex = static_cast<size_t>(sourceValue) * 3; 380 329 buffer.setRGBA(x, yBegin, colorMap[colorIndex], colorMap[colorIndex + 1], colorMap[colorIndex + 2], 255); … … 449 398 { 450 399 if (m_reader) 451 m_repetitionCount = m_reader->repetitionCount(); 452 delete m_reader; 453 m_reader = 0; 400 m_repetitionCount = m_reader->loop_count; 401 m_reader.clear(); 454 402 } 455 403 -
trunk/WebCore/platform/image-decoders/gif/GIFImageDecoder.h
r52833 r53411 28 28 29 29 #include "ImageDecoder.h" 30 #include <wtf/OwnPtr.h> 31 32 class GIFImageReader; 30 33 31 34 namespace WebCore { 32 33 class GIFImageDecoderPrivate;34 35 35 36 // This class decodes the GIF image format. … … 81 82 bool m_currentBufferSawAlpha; 82 83 mutable int m_repetitionCount; 83 GIFImageDecoderPrivate* m_reader; 84 OwnPtr<GIFImageReader> m_reader; 85 unsigned m_readOffset; 84 86 }; 85 87 -
trunk/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
r53309 r53411 401 401 402 402 JPEGImageDecoder::JPEGImageDecoder() 403 : m_reader(0) 404 {}403 { 404 } 405 405 406 406 JPEGImageDecoder::~JPEGImageDecoder() 407 407 { 408 delete m_reader;409 408 } 410 409 … … 420 419 // Create the JPEG reader. 421 420 if (!m_reader && !m_failed) 422 m_reader = new JPEGImageReader(this);421 m_reader.set(new JPEGImageReader(this)); 423 422 } 424 423 … … 463 462 m_failed = !m_reader->decode(m_data->buffer(), sizeOnly); 464 463 465 if (m_failed || (!m_frameBufferCache.isEmpty() && m_frameBufferCache[0].status() == RGBA32Buffer::FrameComplete)) { 466 delete m_reader; 467 m_reader = 0; 468 } 464 if (m_failed || (!m_frameBufferCache.isEmpty() && m_frameBufferCache[0].status() == RGBA32Buffer::FrameComplete)) 465 m_reader.clear(); 469 466 } 470 467 -
trunk/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.h
r53309 r53411 29 29 30 30 #include "ImageDecoder.h" 31 #include <wtf/OwnPtr.h> 31 32 32 33 namespace WebCore { … … 56 57 void decode(bool sizeOnly = false); 57 58 58 JPEGImageReader* reader() { return m_reader; }59 60 59 bool outputScanlines(); 61 60 void jpegComplete(); 62 61 63 62 private: 64 JPEGImageReader*m_reader;63 OwnPtr<JPEGImageReader> m_reader; 65 64 }; 66 65 -
trunk/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp
r53309 r53411 151 151 152 152 PNGImageDecoder::PNGImageDecoder() 153 : m_reader(0)154 153 { 155 154 } … … 157 156 PNGImageDecoder::~PNGImageDecoder() 158 157 { 159 delete m_reader;160 158 } 161 159 … … 171 169 // Create the PNG reader. 172 170 if (!m_reader && !m_failed) 173 m_reader = new PNGImageReader(this);171 m_reader.set(new PNGImageReader(this)); 174 172 } 175 173 … … 206 204 m_reader->decode(*m_data, sizeOnly); 207 205 208 if (m_failed || (!m_frameBufferCache.isEmpty() && m_frameBufferCache[0].status() == RGBA32Buffer::FrameComplete)) { 209 delete m_reader; 210 m_reader = 0; 211 } 206 if (m_failed || (!m_frameBufferCache.isEmpty() && m_frameBufferCache[0].status() == RGBA32Buffer::FrameComplete)) 207 m_reader.clear(); 212 208 } 213 209 … … 238 234 void PNGImageDecoder::headerAvailable() 239 235 { 240 png_structp png = reader()->pngPtr();241 png_infop info = reader()->infoPtr();236 png_structp png = m_reader->pngPtr(); 237 png_infop info = m_reader->infoPtr(); 242 238 png_uint_32 width = png->width; 243 239 png_uint_32 height = png->height; … … 306 302 ASSERT(channels == 3 || channels == 4); 307 303 308 reader()->setHasAlpha(channels == 4);309 310 if ( reader()->decodingSizeOnly()) {304 m_reader->setHasAlpha(channels == 4); 305 306 if (m_reader->decodingSizeOnly()) { 311 307 // If we only needed the size, halt the reader. 312 reader()->setReadOffset(reader()->currentBufferSize() - png->buffer_size);308 m_reader->setReadOffset(m_reader->currentBufferSize() - png->buffer_size); 313 309 png->buffer_size = 0; 314 310 } … … 330 326 if (buffer.status() == RGBA32Buffer::FrameEmpty) { 331 327 if (!buffer.setSize(scaledSize().width(), scaledSize().height())) { 332 static_cast<PNGImageDecoder*>(png_get_progressive_ptr( reader()->pngPtr()))->decodingFailed();333 longjmp( reader()->pngPtr()->jmpbuf, 1);328 static_cast<PNGImageDecoder*>(png_get_progressive_ptr(m_reader->pngPtr()))->decodingFailed(); 329 longjmp(m_reader->pngPtr()->jmpbuf, 1); 334 330 return; 335 331 } … … 340 336 buffer.setRect(IntRect(IntPoint(), size())); 341 337 342 if ( reader()->pngPtr()->interlaced)343 reader()->createInterlaceBuffer((reader()->hasAlpha() ? 4 : 3) * size().width() * size().height());338 if (m_reader->pngPtr()->interlaced) 339 m_reader->createInterlaceBuffer((m_reader->hasAlpha() ? 4 : 3) * size().width() * size().height()); 344 340 } 345 341 … … 375 371 */ 376 372 377 png_structp png = reader()->pngPtr();378 bool hasAlpha = reader()->hasAlpha();373 png_structp png = m_reader->pngPtr(); 374 bool hasAlpha = m_reader->hasAlpha(); 379 375 unsigned colorChannels = hasAlpha ? 4 : 3; 380 376 png_bytep row; 381 png_bytep interlaceBuffer = reader()->interlaceBuffer();377 png_bytep interlaceBuffer = m_reader->interlaceBuffer(); 382 378 if (interlaceBuffer) { 383 379 row = interlaceBuffer + (rowIndex * colorChannels * size().width()); -
trunk/WebCore/platform/image-decoders/png/PNGImageDecoder.h
r44825 r53411 28 28 29 29 #include "ImageDecoder.h" 30 #include <wtf/OwnPtr.h> 30 31 31 32 namespace WebCore { … … 51 52 void decode(bool sizeOnly = false); 52 53 53 PNGImageReader* reader() { return m_reader; }54 55 54 // Callbacks from libpng 56 55 void decodingFailed(); … … 60 59 61 60 private: 62 PNGImageReader*m_reader;61 OwnPtr<PNGImageReader> m_reader; 63 62 }; 64 63
Note: See TracChangeset
for help on using the changeset viewer.