Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2008, 2009, Google Inc. All rights reserved. | 2 * Copyright (c) 2008, 2009, Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 795 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 806 // RGB data. Decode pixels one at a time, left to right. | 806 // RGB data. Decode pixels one at a time, left to right. |
| 807 while (m_coord.x() < endX) { | 807 while (m_coord.x() < endX) { |
| 808 const uint32_t pixel = readCurrentPixel(bytesPerPixel); | 808 const uint32_t pixel = readCurrentPixel(bytesPerPixel); |
| 809 | 809 |
| 810 // Some BMPs specify an alpha channel but don't actually use it | 810 // Some BMPs specify an alpha channel but don't actually use it |
| 811 // (it contains all 0s). To avoid displaying these images as | 811 // (it contains all 0s). To avoid displaying these images as |
| 812 // fully-transparent, decode as if images are fully opaque | 812 // fully-transparent, decode as if images are fully opaque |
| 813 // until we actually see a non-zero alpha value; at that point, | 813 // until we actually see a non-zero alpha value; at that point, |
| 814 // reset any previously-decoded pixels to fully transparent and | 814 // reset any previously-decoded pixels to fully transparent and |
| 815 // continue decoding based on the real alpha channel values. | 815 // continue decoding based on the real alpha channel values. |
| 816 // As an optimization, avoid setting "hasAlpha" to true for | |
| 817 // images where all alpha values are 255; opaque images are | |
| 818 // faster to draw. | |
| 819 int alpha = getAlpha(pixel); | 816 int alpha = getAlpha(pixel); |
| 820 if (!m_seenNonZeroAlphaPixel && !alpha) { | 817 if (!m_seenNonZeroAlphaPixel && !alpha) { |
| 821 m_seenZeroAlphaPixel = true; | 818 m_seenZeroAlphaPixel = true; |
| 822 alpha = 255; | 819 alpha = 255; |
| 823 } else { | 820 } else { |
| 824 m_seenNonZeroAlphaPixel = true; | 821 m_seenNonZeroAlphaPixel = true; |
| 825 if (m_seenZeroAlphaPixel) { | 822 if (m_seenZeroAlphaPixel) { |
| 826 m_buffer->zeroFillPixelData(); | 823 m_buffer->zeroFillPixelData(); |
| 827 m_seenZeroAlphaPixel = false; | 824 m_seenZeroAlphaPixel = false; |
| 828 } else if (alpha != 255) | 825 } else |
|
Peter Kasting
2017/03/16 19:43:27
I'm still confused. If you really want to do this
cblume
2017/03/16 20:39:45
I think those are different.
An image may or may n
| |
| 829 m_buffer->setHasAlpha(true); | 826 m_buffer->setHasAlpha(true); |
| 830 } | 827 } |
| 831 | 828 |
| 832 setRGBA(getComponent(pixel, 0), getComponent(pixel, 1), | 829 setRGBA(getComponent(pixel, 0), getComponent(pixel, 1), |
| 833 getComponent(pixel, 2), alpha); | 830 getComponent(pixel, 2), alpha); |
| 834 } | 831 } |
| 835 } | 832 } |
| 836 | 833 |
| 837 // Success, keep going. | 834 // Success, keep going. |
| 838 m_decodedOffset += paddedNumBytes; | 835 m_decodedOffset += paddedNumBytes; |
| 839 if (inRLE) | 836 if (inRLE) |
| 840 return Success; | 837 return Success; |
| 841 moveBufferToNextRow(); | 838 moveBufferToNextRow(); |
| 842 } | 839 } |
| 843 | 840 |
| 844 // Finished decoding whole image. | 841 // Finished decoding whole image. |
| 845 return Success; | 842 return Success; |
| 846 } | 843 } |
| 847 | 844 |
| 848 void BMPImageReader::moveBufferToNextRow() { | 845 void BMPImageReader::moveBufferToNextRow() { |
| 849 m_coord.move(-m_coord.x(), m_isTopDown ? 1 : -1); | 846 m_coord.move(-m_coord.x(), m_isTopDown ? 1 : -1); |
| 850 } | 847 } |
| 851 | 848 |
| 852 } // namespace blink | 849 } // namespace blink |
| OLD | NEW |