Changeset 56007 in webkit
- Timestamp:
- Mar 15, 2010 1:08:33 PM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r56006 r56007 1 2010-03-11 Peter Kasting <pkasting@google.com> 2 3 Reviewed by Adam Barth. 4 5 Clean up more bits of the open-source image decoders. In addition to 6 simplifying things somewhat, this makes all the decoders the same in 7 terms of how they construct "image reader" subclasses and init scale 8 data. 9 10 https://bugs.webkit.org/show_bug.cgi?id=36040 11 12 No functional change, so no tests. 13 14 * platform/image-decoders/ImageDecoder.h: Reorder a few declarations to try and group/order members slightly better. 15 (WebCore::ImageDecoder::ImageDecoder): 16 * platform/image-decoders/gif/GIFImageDecoder.cpp: Move reader construction into decode(). Prep scale data in setSize(). Remove useless comment. 17 (WebCore::GIFImageDecoder::setData): 18 (WebCore::GIFImageDecoder::setSize): 19 (WebCore::GIFImageDecoder::frameBufferAtIndex): 20 (WebCore::GIFImageDecoder::decode): 21 * platform/image-decoders/gif/GIFImageDecoder.h: Prep scale data in setSize(). 22 * platform/image-decoders/gif/GIFImageReader.cpp: Prep scale data in setSize(). 23 (GIFImageReader::read): 24 * platform/image-decoders/ico/ICOImageDecoder.cpp: Shorten code. 25 (WebCore::ICOImageDecoder::setSize): 26 * platform/image-decoders/jpeg/JPEGImageDecoder.cpp: Fix style. Move reader construction into decode(). 27 (WebCore::JPEGImageReader::close): 28 (WebCore::JPEGImageReader::skipBytes): 29 (WebCore::JPEGImageDecoder::decode): 30 * platform/image-decoders/jpeg/JPEGImageDecoder.h: Move reader construction into decode(). 31 (WebCore::JPEGImageDecoder::filenameExtension): 32 * platform/image-decoders/png/PNGImageDecoder.cpp: Move reader construction into decode(). Track completion on decoder, not reader. Prep scale data in setSize(). Remove useless comment. 33 (WebCore::PNGImageReader::PNGImageReader): 34 (WebCore::PNGImageReader::close): 35 (WebCore::PNGImageReader::decode): 36 (WebCore::PNGImageDecoder::setSize): 37 (WebCore::PNGImageDecoder::frameBufferAtIndex): 38 (WebCore::PNGImageDecoder::headerAvailable): 39 (WebCore::PNGImageDecoder::pngComplete): 40 (WebCore::PNGImageDecoder::decode): 41 * platform/image-decoders/png/PNGImageDecoder.h: Move reader construction into decode(). Track completion on decoder, not reader. Prep scale data in setSize(). 42 (WebCore::PNGImageDecoder::filenameExtension): 43 (WebCore::PNGImageDecoder::isComplete): 44 1 45 2010-03-15 Philippe Normand <pnormand@igalia.com> 2 46 -
trunk/WebCore/platform/image-decoders/ImageDecoder.h
r55687 r56007 206 206 : m_scaled(false) 207 207 , m_sizeAvailable(false) 208 , m_maxNumPixels(-1) 208 209 , m_isAllDataReceived(false) 209 , m_maxNumPixels(-1)210 210 , m_failed(false) 211 211 { … … 326 326 327 327 RefPtr<SharedBuffer> m_data; // The encoded data. 328 Vector<RGBA32Buffer> m_frameBufferCache; 329 bool m_scaled; 328 330 Vector<int> m_scaledColumns; 329 331 Vector<int> m_scaledRows; 330 bool m_scaled;331 Vector<RGBA32Buffer> m_frameBufferCache;332 332 333 333 private: … … 345 345 IntSize m_size; 346 346 bool m_sizeAvailable; 347 int m_maxNumPixels; 347 348 bool m_isAllDataReceived; 348 int m_maxNumPixels;349 349 bool m_failed; 350 350 }; -
trunk/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp
r55687 r56007 50 50 // We need to rescan the frame count, as the new data may have changed it. 51 51 m_alreadyScannedThisDataForFrameCount = false; 52 53 if (!m_reader && !failed())54 m_reader.set(new GIFImageReader(this));55 52 } 56 53 … … 61 58 62 59 return ImageDecoder::isSizeAvailable(); 60 } 61 62 bool GIFImageDecoder::setSize(unsigned width, unsigned height) 63 { 64 if (!ImageDecoder::setSize(width, height)) 65 return false; 66 67 prepareScaleDataIfNecessary(); 68 return true; 63 69 } 64 70 … … 110 116 RGBA32Buffer& frame = m_frameBufferCache[index]; 111 117 if (frame.status() != RGBA32Buffer::FrameComplete) 112 decode(index + 1, GIFFullQuery); // Decode this frame.118 decode(index + 1, GIFFullQuery); 113 119 return &frame; 114 120 } … … 164 170 } 165 171 166 bool GIFImageDecoder::sizeNowAvailable(unsigned width, unsigned height)167 {168 if (!setSize(width, height))169 return false;170 171 prepareScaleDataIfNecessary();172 return true;173 }174 175 172 void GIFImageDecoder::decodingHalted(unsigned bytesLeft) 176 173 { … … 292 289 void GIFImageDecoder::decode(unsigned haltAtFrame, GIFQuery query) 293 290 { 294 if (failed() || !m_reader)291 if (failed()) 295 292 return; 293 294 if (!m_reader) 295 m_reader.set(new GIFImageReader(this)); 296 296 297 297 if (!m_reader->read((const unsigned char*)m_data->data() + m_readOffset, m_data->size() - m_readOffset, query, haltAtFrame)) -
trunk/WebCore/platform/image-decoders/gif/GIFImageDecoder.h
r54823 r56007 46 46 virtual void setData(SharedBuffer* data, bool allDataReceived); 47 47 virtual bool isSizeAvailable(); 48 virtual bool setSize(unsigned width, unsigned height); 48 49 virtual size_t frameCount(); 49 50 virtual int repetitionCount() const; … … 52 53 53 54 // Callbacks from the GIF reader. 54 bool sizeNowAvailable(unsigned width, unsigned height);55 55 void decodingHalted(unsigned bytesLeft); 56 56 bool haveDecodedRow(unsigned frameIndex, unsigned char* rowBuffer, unsigned char* rowEnd, unsigned rowNumber, unsigned repeatCount, bool writeTransparentPixels); -
trunk/WebCore/platform/image-decoders/gif/GIFImageReader.cpp
r54984 r56007 520 520 521 521 // CALLBACK: Inform the decoderplugin of our size. 522 if (clientptr && !clientptr->s izeNowAvailable(screen_width, screen_height))522 if (clientptr && !clientptr->setSize(screen_width, screen_height)) 523 523 return false; 524 524 … … 747 747 748 748 // CALLBACK: Inform the decoderplugin of our size. 749 if (clientptr && !clientptr->s izeNowAvailable(screen_width, screen_height))749 if (clientptr && !clientptr->setSize(screen_width, screen_height)) 750 750 return false; 751 751 } -
trunk/WebCore/platform/image-decoders/ico/ICOImageDecoder.cpp
r55687 r56007 89 89 bool ICOImageDecoder::setSize(unsigned width, unsigned height) 90 90 { 91 if (m_frameSize.isEmpty())92 return ImageDecoder::setSize(width, height);93 94 91 // The size calculated inside the BMPImageReader had better match the one in 95 92 // the icon directory. 96 if (IntSize(width, height) != m_frameSize) 97 setFailed(); 98 return !failed(); 93 return m_frameSize.isEmpty() ? ImageDecoder::setSize(width, height) : ((IntSize(width, height) == m_frameSize) || setFailed()); 99 94 } 100 95 -
trunk/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
r55687 r56007 132 132 } 133 133 134 void close() { 134 void close() 135 { 135 136 decoder_source_mgr* src = (decoder_source_mgr*)m_info.src; 136 137 if (src) … … 141 142 } 142 143 143 void skipBytes(long num_bytes) { 144 void skipBytes(long numBytes) 145 { 144 146 decoder_source_mgr* src = (decoder_source_mgr*)m_info.src; 145 long bytesToSkip = std::min(num _bytes, (long)src->pub.bytes_in_buffer);147 long bytesToSkip = std::min(numBytes, (long)src->pub.bytes_in_buffer); 146 148 src->pub.bytes_in_buffer -= (size_t)bytesToSkip; 147 149 src->pub.next_input_byte += bytesToSkip; 148 150 149 m_bytesToSkip = std::max(num _bytes - bytesToSkip, static_cast<long>(0));151 m_bytesToSkip = std::max(numBytes - bytesToSkip, static_cast<long>(0)); 150 152 } 151 153 … … 377 379 JPEGImageDecoder::~JPEGImageDecoder() 378 380 { 379 }380 381 void JPEGImageDecoder::setData(SharedBuffer* data, bool allDataReceived)382 {383 if (failed())384 return;385 386 ImageDecoder::setData(data, allDataReceived);387 388 if (!m_reader && !failed())389 m_reader.set(new JPEGImageReader(this));390 381 } 391 382 … … 491 482 void JPEGImageDecoder::decode(bool onlySize) 492 483 { 493 if (failed() || !m_reader)484 if (failed()) 494 485 return; 486 487 if (!m_reader) 488 m_reader.set(new JPEGImageReader(this)); 495 489 496 490 if (!m_reader->decode(m_data->buffer(), onlySize)) -
trunk/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.h
r54823 r56007 43 43 // ImageDecoder 44 44 virtual String filenameExtension() const { return "jpg"; } 45 virtual void setData(SharedBuffer* data, bool allDataReceived);46 45 virtual bool isSizeAvailable(); 47 46 virtual bool setSize(unsigned width, unsigned height); -
trunk/WebCore/platform/image-decoders/png/PNGImageDecoder.cpp
r55687 r56007 96 96 , m_interlaceBuffer(0) 97 97 , m_hasAlpha(false) 98 , m_hasFinishedDecoding(false)99 98 , m_currentBufferSize(0) 100 99 { … … 117 116 m_interlaceBuffer = 0; 118 117 m_readOffset = 0; 119 m_hasFinishedDecoding = false;120 118 } 121 119 122 120 unsigned currentBufferSize() const { return m_currentBufferSize; } 123 124 void setComplete() { m_hasFinishedDecoding = true; }125 121 126 122 void decode(const SharedBuffer& data, bool sizeOnly) … … 144 140 // merely want to check if we've managed to set the size, not 145 141 // (recursively) trigger additional decoding if we haven't. 146 if ( (sizeOnly && decoder->ImageDecoder::isSizeAvailable()) || m_hasFinishedDecoding)142 if (sizeOnly ? decoder->ImageDecoder::isSizeAvailable() : decoder->isComplete()) 147 143 return; 148 144 } 149 if (! m_hasFinishedDecoding&& decoder->isAllDataReceived())145 if (!decoder->isComplete() && decoder->isAllDataReceived()) 150 146 decoder->pngComplete(); 151 147 } … … 169 165 png_bytep m_interlaceBuffer; 170 166 bool m_hasAlpha; 171 bool m_hasFinishedDecoding;172 167 unsigned m_currentBufferSize; 173 168 }; … … 181 176 } 182 177 183 void PNGImageDecoder::setData(SharedBuffer* data, bool allDataReceived)184 {185 if (failed())186 return;187 188 ImageDecoder::setData(data, allDataReceived);189 190 if (!m_reader && !failed())191 m_reader.set(new PNGImageReader(this));192 }193 178 bool PNGImageDecoder::isSizeAvailable() 194 179 { … … 199 184 } 200 185 186 bool PNGImageDecoder::setSize(unsigned width, unsigned height) 187 { 188 if (!ImageDecoder::setSize(width, height)) 189 return false; 190 191 prepareScaleDataIfNecessary(); 192 return true; 193 } 194 201 195 RGBA32Buffer* PNGImageDecoder::frameBufferAtIndex(size_t index) 202 196 { … … 209 203 RGBA32Buffer& frame = m_frameBufferCache[0]; 210 204 if (frame.status() != RGBA32Buffer::FrameComplete) 211 decode(false); // Decode this frame.205 decode(false); 212 206 return &frame; 213 207 } … … 227 221 228 222 // We can fill in the size now that the header is available. 229 if (!ImageDecoder::isSizeAvailable()) { 230 if (!setSize(width, height)) { 231 // Size unreasonable, bail out. 232 longjmp(png->jmpbuf, 1); 233 return; 234 } 235 prepareScaleDataIfNecessary(); 223 if (!setSize(width, height)) { 224 longjmp(png->jmpbuf, 1); 225 return; 236 226 } 237 227 … … 370 360 void PNGImageDecoder::pngComplete() 371 361 { 372 m_reader->setComplete();373 374 362 if (!m_frameBufferCache.isEmpty()) 375 363 m_frameBufferCache.first().setStatus(RGBA32Buffer::FrameComplete); … … 378 366 void PNGImageDecoder::decode(bool onlySize) 379 367 { 380 if (failed() || !m_reader) 381 return; 368 if (failed()) 369 return; 370 371 if (!m_reader) 372 m_reader.set(new PNGImageReader(this)); 382 373 383 374 m_reader->decode(*m_data, onlySize); 384 375 385 if (failed() || (!m_frameBufferCache.isEmpty() && m_frameBufferCache[0].status() == RGBA32Buffer::FrameComplete))376 if (failed() || isComplete()) 386 377 m_reader.clear(); 387 378 } -
trunk/WebCore/platform/image-decoders/png/PNGImageDecoder.h
r55687 r56007 42 42 // ImageDecoder 43 43 virtual String filenameExtension() const { return "png"; } 44 virtual void setData(SharedBuffer* data, bool allDataReceived);45 44 virtual bool isSizeAvailable(); 45 virtual bool setSize(unsigned width, unsigned height); 46 46 virtual RGBA32Buffer* frameBufferAtIndex(size_t index); 47 47 … … 50 50 void rowAvailable(unsigned char* rowBuffer, unsigned rowIndex, int interlacePass); 51 51 void pngComplete(); 52 53 bool isComplete() const 54 { 55 return !m_frameBufferCache.isEmpty() && (m_frameBufferCache.first().status() == RGBA32Buffer::FrameComplete); 56 } 52 57 53 58 private:
Note: See TracChangeset
for help on using the changeset viewer.