Index: Source/core/platform/graphics/BitmapImage.cpp |
diff --git a/Source/core/platform/graphics/BitmapImage.cpp b/Source/core/platform/graphics/BitmapImage.cpp |
index 53b4573b13343ed12abbf3aaf03539b10e3d8356..e63f1c7f602652b311d3f287165df8feeffd048b 100644 |
--- a/Source/core/platform/graphics/BitmapImage.cpp |
+++ b/Source/core/platform/graphics/BitmapImage.cpp |
@@ -112,43 +112,32 @@ bool BitmapImage::hasSingleSecurityOrigin() const |
} |
-void BitmapImage::destroyDecodedData(bool destroyAll) |
+void BitmapImage::destroyDecodedData() |
{ |
- unsigned frameBytesCleared = 0; |
- const size_t clearBeforeFrame = destroyAll ? m_frames.size() : m_currentFrame; |
- |
- // Because we can advance frames without always needing to decode the actual |
- // bitmap data, |m_currentFrame| may be larger than m_frames.size(); |
- // make sure not to walk off the end of the container in this case. |
- for (size_t i = 0; i < std::min(clearBeforeFrame, m_frames.size()); ++i) { |
+ for (size_t i = 0; i < m_frames.size(); ++i) { |
// The underlying frame isn't actually changing (we're just trying to |
// save the memory for the framebuffer data), so we don't need to clear |
// the metadata. |
- unsigned frameBytes = m_frames[i].m_frameBytes; |
- if (m_frames[i].clear(false)) |
- frameBytesCleared += frameBytes; |
+ m_frames[i].clear(false); |
} |
- destroyMetadataAndNotify(frameBytesCleared); |
- |
- m_source.clear(destroyAll, clearBeforeFrame, data(), m_allDataReceived); |
- return; |
+ destroyMetadataAndNotify(m_source.clearCacheExceptFrame(m_currentFrame)); |
} |
-void BitmapImage::destroyDecodedDataIfNecessary(bool destroyAll) |
+void BitmapImage::destroyDecodedDataIfNecessary() |
{ |
// Animated images >5MB are considered large enough that we'll only hang on |
// to one frame at a time. |
- static const unsigned cLargeAnimationCutoff = 5242880; |
- unsigned allFrameBytes = 0; |
+ static const size_t cLargeAnimationCutoff = 5242880; |
+ size_t allFrameBytes = 0; |
for (size_t i = 0; i < m_frames.size(); ++i) |
allFrameBytes += m_frames[i].m_frameBytes; |
if (allFrameBytes > cLargeAnimationCutoff) |
- destroyDecodedData(destroyAll); |
+ destroyDecodedData(); |
} |
-void BitmapImage::destroyMetadataAndNotify(unsigned frameBytesCleared) |
+void BitmapImage::destroyMetadataAndNotify(size_t frameBytesCleared) |
{ |
m_isSolidColor = false; |
m_checkedForSolidColor = false; |
@@ -582,7 +571,7 @@ void BitmapImage::resetAnimation() |
m_animationFinished = false; |
// For extremely large animations, when the animation is reset, we just throw everything away. |
- destroyDecodedDataIfNecessary(true); |
+ destroyDecodedDataIfNecessary(); |
} |
unsigned BitmapImage::decodedSize() const |
@@ -612,7 +601,6 @@ bool BitmapImage::internalAdvanceAnimation(bool skippingFrames) |
++m_currentFrame; |
bool advancedAnimation = true; |
- bool destroyAll = false; |
if (m_currentFrame >= frameCount()) { |
++m_repetitionsComplete; |
@@ -626,12 +614,10 @@ bool BitmapImage::internalAdvanceAnimation(bool skippingFrames) |
m_desiredFrameStartTime = 0; |
--m_currentFrame; |
advancedAnimation = false; |
- } else { |
+ } else |
m_currentFrame = 0; |
- destroyAll = true; |
- } |
} |
- destroyDecodedDataIfNecessary(destroyAll); |
+ destroyDecodedDataIfNecessary(); |
// We need to draw this frame if we advanced to it while not skipping, or if |
// while trying to skip frames we hit the last frame and thus had to stop. |