Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006 Apple Computer, Inc. | 2 * Copyright (C) 2006 Apple Computer, Inc. |
| 3 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. | 3 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. |
| 4 * | 4 * |
| 5 * Portions are Copyright (C) 2001 mozilla.org | 5 * Portions are Copyright (C) 2001 mozilla.org |
| 6 * | 6 * |
| 7 * Other contributors: | 7 * Other contributors: |
| 8 * Stuart Parmenter <stuart@mozilla.com> | 8 * Stuart Parmenter <stuart@mozilla.com> |
| 9 * | 9 * |
| 10 * This library is free software; you can redistribute it and/or | 10 * This library is free software; you can redistribute it and/or |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 156 bool m_hasAlpha; | 156 bool m_hasAlpha; |
| 157 OwnPtr<png_byte[]> m_interlaceBuffer; | 157 OwnPtr<png_byte[]> m_interlaceBuffer; |
| 158 #if USE(QCMSLIB) | 158 #if USE(QCMSLIB) |
| 159 OwnPtr<png_byte[]> m_rowBuffer; | 159 OwnPtr<png_byte[]> m_rowBuffer; |
| 160 #endif | 160 #endif |
| 161 }; | 161 }; |
| 162 | 162 |
| 163 PNGImageDecoder::PNGImageDecoder(AlphaOption alphaOption, GammaAndColorProfileOp tion colorOptions, size_t maxDecodedBytes, size_t offset) | 163 PNGImageDecoder::PNGImageDecoder(AlphaOption alphaOption, GammaAndColorProfileOp tion colorOptions, size_t maxDecodedBytes, size_t offset) |
| 164 : ImageDecoder(alphaOption, colorOptions, maxDecodedBytes) | 164 : ImageDecoder(alphaOption, colorOptions, maxDecodedBytes) |
| 165 , m_offset(offset) | 165 , m_offset(offset) |
| 166 , m_hasPixelsWithAlpha(false) | |
| 166 { | 167 { |
| 167 } | 168 } |
| 168 | 169 |
| 169 PNGImageDecoder::~PNGImageDecoder() | 170 PNGImageDecoder::~PNGImageDecoder() |
| 170 { | 171 { |
| 171 } | 172 } |
| 172 | 173 |
| 173 void PNGImageDecoder::headerAvailable() | 174 void PNGImageDecoder::headerAvailable() |
| 174 { | 175 { |
| 175 png_structp png = m_reader->pngPtr(); | 176 png_structp png = m_reader->pngPtr(); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 306 | 307 |
| 307 #if USE(QCMSLIB) | 308 #if USE(QCMSLIB) |
| 308 if (colorTransform()) { | 309 if (colorTransform()) { |
| 309 m_reader->createRowBuffer(colorChannels * size().width()); | 310 m_reader->createRowBuffer(colorChannels * size().width()); |
| 310 if (!m_reader->rowBuffer()) { | 311 if (!m_reader->rowBuffer()) { |
| 311 longjmp(JMPBUF(png), 1); | 312 longjmp(JMPBUF(png), 1); |
| 312 return; | 313 return; |
| 313 } | 314 } |
| 314 } | 315 } |
| 315 #endif | 316 #endif |
| 316 buffer.setStatus(ImageFrame::FramePartial); | 317 buffer.setStatus(ImageFrame::FramePartial); |
|
scroggo_chromium
2016/05/16 20:32:08
Previously, a partially decoded PNG file will repo
| |
| 317 buffer.setHasAlpha(false); | |
| 318 | 318 |
| 319 // For PNGs, the frame always fills the entire image. | 319 // For PNGs, the frame always fills the entire image. |
| 320 buffer.setOriginalFrameRect(IntRect(IntPoint(), size())); | 320 buffer.setOriginalFrameRect(IntRect(IntPoint(), size())); |
| 321 } | 321 } |
| 322 | 322 |
| 323 /* libpng comments (here to explain what follows). | 323 /* libpng comments (here to explain what follows). |
| 324 * | 324 * |
| 325 * this function is called for every row in the image. If the | 325 * this function is called for every row in the image. If the |
| 326 * image is interlacing, and you turned on the interlace handler, | 326 * image is interlacing, and you turned on the interlace handler, |
| 327 * this function will be called for every row in every pass. | 327 * this function will be called for every row in every pass. |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 394 buffer.setRGBARaw(address++, pixel[0], pixel[1], pixel[2], pixel [3]); | 394 buffer.setRGBARaw(address++, pixel[0], pixel[1], pixel[2], pixel [3]); |
| 395 alphaMask &= pixel[3]; | 395 alphaMask &= pixel[3]; |
| 396 } | 396 } |
| 397 } | 397 } |
| 398 } else { | 398 } else { |
| 399 for (int x = 0; x < width; ++x, pixel += 3) { | 399 for (int x = 0; x < width; ++x, pixel += 3) { |
| 400 buffer.setRGBARaw(address++, pixel[0], pixel[1], pixel[2], 255); | 400 buffer.setRGBARaw(address++, pixel[0], pixel[1], pixel[2], 255); |
| 401 } | 401 } |
| 402 } | 402 } |
| 403 | 403 |
| 404 if (alphaMask != 255 && !buffer.hasAlpha()) | 404 if (alphaMask != 255 && !m_hasPixelsWithAlpha) |
| 405 buffer.setHasAlpha(true); | 405 m_hasPixelsWithAlpha = true; |
| 406 | 406 |
| 407 buffer.setPixelsChanged(true); | 407 buffer.setPixelsChanged(true); |
| 408 } | 408 } |
| 409 | 409 |
| 410 void PNGImageDecoder::complete() | 410 void PNGImageDecoder::complete() |
| 411 { | 411 { |
| 412 if (m_frameBufferCache.isEmpty()) | 412 if (m_frameBufferCache.isEmpty()) |
| 413 return; | 413 return; |
| 414 | 414 |
| 415 m_frameBufferCache[0].setHasAlpha(m_hasPixelsWithAlpha); | |
| 415 m_frameBufferCache[0].setStatus(ImageFrame::FrameComplete); | 416 m_frameBufferCache[0].setStatus(ImageFrame::FrameComplete); |
| 416 } | 417 } |
| 417 | 418 |
| 418 inline bool isComplete(const PNGImageDecoder* decoder) | |
| 419 { | |
| 420 return decoder->frameIsCompleteAtIndex(0); | |
| 421 } | |
| 422 | |
| 423 void PNGImageDecoder::decode(bool onlySize) | 419 void PNGImageDecoder::decode(bool onlySize) |
| 424 { | 420 { |
| 425 if (failed()) | 421 if (failed()) |
| 426 return; | 422 return; |
| 427 | 423 |
| 428 if (!m_reader) | 424 if (!m_reader) { |
|
scroggo_chromium
2016/05/16 20:32:08
This change is unnecessary.
aleksandar.stojiljkovic
2016/05/22 15:41:53
Done.
| |
| 429 m_reader = adoptPtr(new PNGImageReader(this, m_offset)); | 425 m_reader = adoptPtr(new PNGImageReader(this, m_offset)); |
| 426 } | |
| 430 | 427 |
| 431 // If we couldn't decode the image but have received all the data, decoding | 428 // If we couldn't decode the image but have received all the data, decoding |
| 432 // has failed. | 429 // has failed. |
| 433 if (!m_reader->decode(*m_data, onlySize) && isAllDataReceived()) | 430 if (!m_reader->decode(*m_data, onlySize) && isAllDataReceived()) |
| 434 setFailed(); | 431 setFailed(); |
| 435 | 432 |
| 436 // If decoding is done or failed, we don't need the PNGImageReader anymore. | 433 // If decoding is done or failed, we don't need the PNGImageReader anymore. |
| 437 if (isComplete(this) || failed()) | 434 if (frameIsCompleteAtIndex(0) || failed()) |
| 438 m_reader.clear(); | 435 m_reader.clear(); |
| 439 } | 436 } |
| 440 | 437 |
| 441 } // namespace blink | 438 } // namespace blink |
| OLD | NEW |