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

Unified Diff: Source/core/platform/image-decoders/ImageDecoder.h

Issue 15350006: Decode GIF image frames on demand. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 7 years, 7 months 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: Source/core/platform/image-decoders/ImageDecoder.h
diff --git a/Source/core/platform/image-decoders/ImageDecoder.h b/Source/core/platform/image-decoders/ImageDecoder.h
index 724e27c918dc3e3c7a5dcd00f2ef98bfa3cd2aeb..d57464e311533caafaf0d8cfd05eb1bf2f688287 100644
--- a/Source/core/platform/image-decoders/ImageDecoder.h
+++ b/Source/core/platform/image-decoders/ImageDecoder.h
@@ -115,6 +115,11 @@ namespace WebCore {
FrameDisposalMethod disposalMethod() const { return m_disposalMethod; }
bool premultiplyAlpha() const { return m_premultiplyAlpha; }
void reportMemoryUsage(MemoryObjectInfo*) const;
+ size_t requiredPreviousFrameIndex() const
+ {
+ ASSERT(m_requiredPreviousFrameIndexValid);
+ return m_requiredPreviousFrameIndex;
+ }
void setHasAlpha(bool alpha);
void setOriginalFrameRect(const IntRect& r) { m_originalFrameRect = r; }
@@ -122,6 +127,13 @@ namespace WebCore {
void setDuration(unsigned duration) { m_duration = duration; }
void setDisposalMethod(FrameDisposalMethod method) { m_disposalMethod = method; }
void setPremultiplyAlpha(bool premultiplyAlpha) { m_premultiplyAlpha = premultiplyAlpha; }
+ void setRequiredPreviousFrameIndex(size_t previousFrameIndex)
+ {
+ m_requiredPreviousFrameIndex = previousFrameIndex;
+#ifndef NDEBUG
+ m_requiredPreviousFrameIndexValid = true;
+#endif
+ }
inline void setRGBA(int x, int y, unsigned r, unsigned g, unsigned b, unsigned a)
{
@@ -200,6 +212,13 @@ namespace WebCore {
unsigned m_duration;
FrameDisposalMethod m_disposalMethod;
bool m_premultiplyAlpha;
+
+ // The frame that must be decoded before this frame can be decoded.
+ // |notFound| if this frame doesn't require any previous frame.
Peter Kasting 2013/05/29 02:02:18 Nit: Add this at end: This is used by ImageDecode
Xianzhu 2013/05/29 18:37:01 Done.
+ size_t m_requiredPreviousFrameIndex;
+#ifndef NDEBUG
+ bool m_requiredPreviousFrameIndexValid;
+#endif
};
// ImageDecoder is a base for all format-specific decoders
@@ -358,10 +377,12 @@ namespace WebCore {
bool failed() const { return m_failed; }
- // Clears decoded pixel data from before the provided frame unless that
+ // Clears decoded pixel data except the provided frame unless that
// data may be needed to decode future frames (e.g. due to GIF frame
- // compositing).
- virtual void clearFrameBufferCache(size_t) { }
+ // compositing). Pass a value greater than the frame count to clear
+ // decoded pixel data of all frames.
+ // Returns number of bytes of the cleared frames.
Peter Kasting 2013/05/29 02:02:18 Nit: How about this comment: Clears decoded pixel
Xianzhu 2013/05/29 18:37:01 Done.
+ size_t clearCacheExceptFrame(size_t);
// If the image has a cursor hot-spot, stores it in the argument
// and returns true. Otherwise returns false.
@@ -378,6 +399,18 @@ namespace WebCore {
}
protected:
+ // Finds the previous required frame for decoding the given frame based
+ // on the parsed meta data. Returns notFound if this frame doesn't
+ // require any previous frame.
+ //
+ // Subclasses should call this function and cache the result by calling
+ // ImageFrame::setRequiredPreviousFrame() when a new frame is created,
+ // and must ensure all previous frame's required previous frame has been
+ // cached before calling this method.
Peter Kasting 2013/05/29 02:02:18 Nit: How about this comment: Calculates the most
Xianzhu 2013/05/29 18:37:01 Done.
+ size_t findRequiredPreviousFrame(size_t frameIndex);
+
+ virtual void clearFrameBuffer(size_t frameIndex);
+
RefPtr<SharedBuffer> m_data; // The encoded data.
Vector<ImageFrame, 1> m_frameBufferCache;
bool m_premultiplyAlpha;

Powered by Google App Engine
This is Rietveld 408576698