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

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

Issue 23068027: Animated WebP: Optimize decoding in case of seeking (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@add_noblend_image
Patch Set: Created 7 years, 4 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 unified diff | Download patch
« no previous file with comments | « no previous file | Source/core/platform/image-decoders/ImageDecoder.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. 2 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
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 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. 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 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 enum FrameDisposalMethod { 57 enum FrameDisposalMethod {
58 // If you change the numeric values of these, make sure you audit 58 // If you change the numeric values of these, make sure you audit
59 // all users, as some users may cast raw values to/from these 59 // all users, as some users may cast raw values to/from these
60 // constants. 60 // constants.
61 DisposeNotSpecified, // Leave frame in framebuffer 61 DisposeNotSpecified, // Leave frame in framebuffer
62 DisposeKeep, // Leave frame in framebuffer 62 DisposeKeep, // Leave frame in framebuffer
63 DisposeOverwriteBgcolor, // Clear frame to transparent 63 DisposeOverwriteBgcolor, // Clear frame to transparent
64 DisposeOverwritePrevious // Clear frame to previous framebuffer 64 DisposeOverwritePrevious // Clear frame to previous framebuffer
65 // contents 65 // contents
66 }; 66 };
67 // Indicates how transparent pixels of the current frame rectangles are
68 // blended with those of the previous frame buffer.
69 enum FrameBlendingMethod {
70 BlendWithPrevious, // Compose the rectangle of current frame by blen ding it with corresponding pixels in the previous (disposed) framebuffer.
71 BlendOverwrite, // Compose the rectangle of current frame by over-wr iting the corresponding pixels in the previous (disposed) framebuffer.
72 };
Peter Kasting 2013/08/22 00:08:37 I don't think I really understand what's going on
urvang (Google) 2013/08/22 01:49:36 That's the idea, more of less. To be more precise
67 typedef uint32_t PixelData; 73 typedef uint32_t PixelData;
68 74
69 ImageFrame(); 75 ImageFrame();
70 76
71 ImageFrame(const ImageFrame& other) { operator=(other); } 77 ImageFrame(const ImageFrame& other) { operator=(other); }
72 78
73 // For backends which refcount their data, this operator doesn't need to 79 // For backends which refcount their data, this operator doesn't need to
74 // create a new copy of the image data, only increase the ref count. 80 // create a new copy of the image data, only increase the ref count.
75 ImageFrame& operator=(const ImageFrame& other); 81 ImageFrame& operator=(const ImageFrame& other);
76 82
(...skipping 30 matching lines...) Expand all
107 // Returns a caller-owned pointer to the underlying native image data. 113 // Returns a caller-owned pointer to the underlying native image data.
108 // (Actual use: This pointer will be owned by BitmapImage and freed in 114 // (Actual use: This pointer will be owned by BitmapImage and freed in
109 // FrameData::clear()). 115 // FrameData::clear()).
110 PassRefPtr<NativeImageSkia> asNewNativeImage() const; 116 PassRefPtr<NativeImageSkia> asNewNativeImage() const;
111 117
112 bool hasAlpha() const; 118 bool hasAlpha() const;
113 const IntRect& originalFrameRect() const { return m_originalFrameRect; } 119 const IntRect& originalFrameRect() const { return m_originalFrameRect; }
114 FrameStatus status() const { return m_status; } 120 FrameStatus status() const { return m_status; }
115 unsigned duration() const { return m_duration; } 121 unsigned duration() const { return m_duration; }
116 FrameDisposalMethod disposalMethod() const { return m_disposalMethod; } 122 FrameDisposalMethod disposalMethod() const { return m_disposalMethod; }
123 FrameBlendingMethod blendingMethod() const { return m_blendingMethod; }
117 bool premultiplyAlpha() const { return m_premultiplyAlpha; } 124 bool premultiplyAlpha() const { return m_premultiplyAlpha; }
118 SkBitmap::Allocator* allocator() const { return m_allocator; } 125 SkBitmap::Allocator* allocator() const { return m_allocator; }
119 const SkBitmap& getSkBitmap() const { return m_bitmap->bitmap(); } 126 const SkBitmap& getSkBitmap() const { return m_bitmap->bitmap(); }
120 127
121 size_t requiredPreviousFrameIndex() const 128 size_t requiredPreviousFrameIndex() const
122 { 129 {
123 ASSERT(m_requiredPreviousFrameIndexValid); 130 ASSERT(m_requiredPreviousFrameIndexValid);
124 return m_requiredPreviousFrameIndex; 131 return m_requiredPreviousFrameIndex;
125 } 132 }
126 #if !ASSERT_DISABLED 133 #if !ASSERT_DISABLED
127 bool requiredPreviousFrameIndexValid() const { return m_requiredPrevious FrameIndexValid; } 134 bool requiredPreviousFrameIndexValid() const { return m_requiredPrevious FrameIndexValid; }
128 #endif 135 #endif
129 void setHasAlpha(bool alpha); 136 void setHasAlpha(bool alpha);
130 void setOriginalFrameRect(const IntRect& r) { m_originalFrameRect = r; } 137 void setOriginalFrameRect(const IntRect& r) { m_originalFrameRect = r; }
131 void setStatus(FrameStatus status); 138 void setStatus(FrameStatus status);
132 void setDuration(unsigned duration) { m_duration = duration; } 139 void setDuration(unsigned duration) { m_duration = duration; }
133 void setDisposalMethod(FrameDisposalMethod method) { m_disposalMethod = method; } 140 void setDisposalMethod(FrameDisposalMethod method) { m_disposalMethod = method; }
141 void setBlendingMethod(FrameBlendingMethod method) { m_blendingMethod = method; }
134 void setPremultiplyAlpha(bool premultiplyAlpha) { m_premultiplyAlpha = p remultiplyAlpha; } 142 void setPremultiplyAlpha(bool premultiplyAlpha) { m_premultiplyAlpha = p remultiplyAlpha; }
135 void setMemoryAllocator(SkBitmap::Allocator* allocator) { m_allocator = allocator; } 143 void setMemoryAllocator(SkBitmap::Allocator* allocator) { m_allocator = allocator; }
136 void setSkBitmap(const SkBitmap& bitmap) { m_bitmap = NativeImageSkia::c reate(bitmap); } 144 void setSkBitmap(const SkBitmap& bitmap) { m_bitmap = NativeImageSkia::c reate(bitmap); }
137 145
138 void setRequiredPreviousFrameIndex(size_t previousFrameIndex) 146 void setRequiredPreviousFrameIndex(size_t previousFrameIndex)
139 { 147 {
140 m_requiredPreviousFrameIndex = previousFrameIndex; 148 m_requiredPreviousFrameIndex = previousFrameIndex;
141 #if !ASSERT_DISABLED 149 #if !ASSERT_DISABLED
142 m_requiredPreviousFrameIndexValid = true; 150 m_requiredPreviousFrameIndexValid = true;
143 #endif 151 #endif
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 200
193 RefPtr<NativeImageSkia> m_bitmap; 201 RefPtr<NativeImageSkia> m_bitmap;
194 SkBitmap::Allocator* m_allocator; 202 SkBitmap::Allocator* m_allocator;
195 bool m_hasAlpha; 203 bool m_hasAlpha;
196 // This will always just be the entire buffer except for GIF or WebP 204 // This will always just be the entire buffer except for GIF or WebP
197 // frames whose original rect was smaller than the overall image size. 205 // frames whose original rect was smaller than the overall image size.
198 IntRect m_originalFrameRect; 206 IntRect m_originalFrameRect;
199 FrameStatus m_status; 207 FrameStatus m_status;
200 unsigned m_duration; 208 unsigned m_duration;
201 FrameDisposalMethod m_disposalMethod; 209 FrameDisposalMethod m_disposalMethod;
210 FrameBlendingMethod m_blendingMethod;
202 bool m_premultiplyAlpha; 211 bool m_premultiplyAlpha;
203 212
204 // The frame that must be decoded before this frame can be decoded. 213 // The frame that must be decoded before this frame can be decoded.
205 // WTF::notFound if this frame doesn't require any previous frame. 214 // WTF::notFound if this frame doesn't require any previous frame.
206 // This is used by ImageDecoder::clearCacheExceptFrame(), and will never 215 // This is used by ImageDecoder::clearCacheExceptFrame(), and will never
207 // be read for image formats that do not have multiple frames. 216 // be read for image formats that do not have multiple frames.
208 size_t m_requiredPreviousFrameIndex; 217 size_t m_requiredPreviousFrameIndex;
209 #if !ASSERT_DISABLED 218 #if !ASSERT_DISABLED
210 bool m_requiredPreviousFrameIndexValid; 219 bool m_requiredPreviousFrameIndexValid;
211 #endif 220 #endif
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 // If the image has a cursor hot-spot, stores it in the argument 385 // If the image has a cursor hot-spot, stores it in the argument
377 // and returns true. Otherwise returns false. 386 // and returns true. Otherwise returns false.
378 virtual bool hotSpot(IntPoint&) const { return false; } 387 virtual bool hotSpot(IntPoint&) const { return false; }
379 388
380 virtual void setMemoryAllocator(SkBitmap::Allocator* allocator) 389 virtual void setMemoryAllocator(SkBitmap::Allocator* allocator)
381 { 390 {
382 // FIXME: this doesn't work for images with multiple frames. 391 // FIXME: this doesn't work for images with multiple frames.
383 if (m_frameBufferCache.isEmpty()) { 392 if (m_frameBufferCache.isEmpty()) {
384 m_frameBufferCache.resize(1); 393 m_frameBufferCache.resize(1);
385 m_frameBufferCache[0].setRequiredPreviousFrameIndex( 394 m_frameBufferCache[0].setRequiredPreviousFrameIndex(
386 findRequiredPreviousFrame(0)); 395 findRequiredPreviousFrame(0, false));
387 } 396 }
388 m_frameBufferCache[0].setMemoryAllocator(allocator); 397 m_frameBufferCache[0].setMemoryAllocator(allocator);
389 } 398 }
390 399
391 protected: 400 protected:
392 // Calculates the most recent frame whose image data may be needed in 401 // Calculates the most recent frame whose image data may be needed in
393 // order to decode frame |frameIndex|, based on frame disposal methods. 402 // order to decode frame |frameIndex|, based on frame disposal methods
403 // and 'frameRectIsOpaque', where 'frameRectIsOpaque' signifies whether
404 // the rectangle of frame at 'frameIndex' is known to be opaque.
394 // If no previous frame's data is required, returns WTF::notFound. 405 // If no previous frame's data is required, returns WTF::notFound.
395 // 406 //
396 // This function requires that the previous frame's 407 // This function requires that the previous frame's
397 // |m_requiredPreviousFrameIndex| member has been set correctly. The 408 // |m_requiredPreviousFrameIndex| member has been set correctly. The
398 // easiest way to ensure this is for subclasses to call this method and 409 // easiest way to ensure this is for subclasses to call this method and
399 // store the result on the frame via setRequiredPreviousFrameIndex() 410 // store the result on the frame via setRequiredPreviousFrameIndex()
400 // as soon as the frame has been created and parsed sufficiently to 411 // as soon as the frame has been created and parsed sufficiently to
401 // determine the disposal method; assuming this happens for all frames 412 // determine the disposal method; assuming this happens for all frames
402 // in order, the required invariant will hold. 413 // in order, the required invariant will hold.
403 // 414 //
404 // Image formats which do not use more than one frame do not need to 415 // Image formats which do not use more than one frame do not need to
405 // worry about this; see comments on 416 // worry about this; see comments on
406 // ImageFrame::m_requiredPreviousFrameIndex. 417 // ImageFrame::m_requiredPreviousFrameIndex.
407 size_t findRequiredPreviousFrame(size_t frameIndex); 418 size_t findRequiredPreviousFrame(size_t frameIndex, bool frameRectIsOpaq ue);
408 419
409 virtual void clearFrameBuffer(size_t frameIndex); 420 virtual void clearFrameBuffer(size_t frameIndex);
410 421
411 RefPtr<SharedBuffer> m_data; // The encoded data. 422 RefPtr<SharedBuffer> m_data; // The encoded data.
412 Vector<ImageFrame, 1> m_frameBufferCache; 423 Vector<ImageFrame, 1> m_frameBufferCache;
413 bool m_premultiplyAlpha; 424 bool m_premultiplyAlpha;
414 bool m_ignoreGammaAndColorProfile; 425 bool m_ignoreGammaAndColorProfile;
415 ImageOrientation m_orientation; 426 ImageOrientation m_orientation;
416 427
417 private: 428 private:
418 // Some code paths compute the size of the image as "width * height * 4" 429 // Some code paths compute the size of the image as "width * height * 4"
419 // and return it as a (signed) int. Avoid overflow. 430 // and return it as a (signed) int. Avoid overflow.
420 static bool isOverSize(unsigned width, unsigned height) 431 static bool isOverSize(unsigned width, unsigned height)
421 { 432 {
422 unsigned long long total_size = static_cast<unsigned long long>(widt h) 433 unsigned long long total_size = static_cast<unsigned long long>(widt h)
423 * static_cast<unsigned long long>(heig ht); 434 * static_cast<unsigned long long>(heig ht);
424 return total_size > ((1 << 29) - 1); 435 return total_size > ((1 << 29) - 1);
425 } 436 }
426 437
427 IntSize m_size; 438 IntSize m_size;
428 bool m_sizeAvailable; 439 bool m_sizeAvailable;
429 bool m_isAllDataReceived; 440 bool m_isAllDataReceived;
430 bool m_failed; 441 bool m_failed;
431 }; 442 };
432 443
433 } // namespace WebCore 444 } // namespace WebCore
434 445
435 #endif 446 #endif
OLDNEW
« no previous file with comments | « no previous file | Source/core/platform/image-decoders/ImageDecoder.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698