Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(887)

Unified Diff: third_party/WebKit/Source/platform/image-decoders/png/PNGImageReader.h

Issue 1567053002: Animated PNG implementation Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Moved some code to PNGImageReader.cpp and PNGImageReader.h Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/image-decoders/png/PNGImageReader.h
diff --git a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageReader.h b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageReader.h
index 4144201a9b66088d12704bdf2d64feb9eac6c822..eea2106852f09406221ebef1fba3e8ef3c37070c 100644
--- a/third_party/WebKit/Source/platform/image-decoders/png/PNGImageReader.h
+++ b/third_party/WebKit/Source/platform/image-decoders/png/PNGImageReader.h
@@ -52,14 +52,52 @@ class PLATFORM_EXPORT PNGImageReader final {
PNGImageReader(PNGImageDecoder*, size_t offset);
~PNGImageReader();
- bool decode(const SegmentReader&, bool sizeOnly);
+ struct FrameInfo {
+ size_t start;
+ size_t finish;
+ png_uint_32 width;
+ png_uint_32 height;
+ png_uint_32 xOffset;
+ png_uint_32 yOffset;
+ unsigned duration;
+ unsigned dispose;
+ unsigned blend;
+ };
+
+ inline void processData(const SegmentReader& data,
+ size_t index,
+ size_t offset,
+ size_t endOffset) {
+ const char* segment;
+ while (size_t segmentLength = data.getSomeData(segment, offset)) {
+ if (endOffset && offset + segmentLength > endOffset)
+ segmentLength = endOffset - offset;
+
+ offset += segmentLength;
+ png_process_data(m_png, m_info,
+ reinterpret_cast<png_bytep>(const_cast<char*>(segment)),
+ segmentLength);
+
+ if (offset == endOffset)
+ break;
+ }
+ if (!index)
+ m_decodeOffset = offset;
+ }
+
+ bool parse(SegmentReader&);
+ bool decode(SegmentReader&, size_t index);
png_structp pngPtr() const { return m_png; }
png_infop infoPtr() const { return m_info; }
- size_t getReadOffset() const { return m_readOffset; }
- void setReadOffset(size_t offset) { m_readOffset = offset; }
- size_t currentBufferSize() const { return m_currentBufferSize; }
- bool decodingSizeOnly() const { return m_decodingSizeOnly; }
+ int repetitionCount() const { return m_repetitionCount; }
+ size_t imagesCount() const {
+ return m_frames.isEmpty() ? 1 : m_frames.size() - m_posterFrame;
+ }
+ const FrameInfo* frameInfo(size_t index) const {
+ return m_frames.isEmpty() ? &m_currentFrame
+ : &m_frames[index + m_posterFrame];
+ }
void setHasAlpha(bool hasAlpha) { m_hasAlpha = hasAlpha; }
bool hasAlpha() const { return m_hasAlpha; }
@@ -73,8 +111,18 @@ class PLATFORM_EXPORT PNGImageReader final {
png_infop m_info;
PNGImageDecoder* m_decoder;
size_t m_readOffset;
- size_t m_currentBufferSize;
- bool m_decodingSizeOnly;
+ size_t m_parseOffset;
+ size_t m_decodeOffset;
+ size_t m_infoSize;
+ bool m_isAnimated;
+ bool m_isParsed;
+ png_uint_32 m_width;
+ png_uint_32 m_height;
+ int m_repetitionCount;
+ size_t m_posterFrame;
+ size_t m_visibleFrames;
+ FrameInfo m_currentFrame;
+ Vector<FrameInfo> m_frames;
bool m_hasAlpha;
std::unique_ptr<png_byte[]> m_interlaceBuffer;
};

Powered by Google App Engine
This is Rietveld 408576698