OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) | 2 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) |
3 * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. All rights reserved. | 3 * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. 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 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 BitmapImage::~BitmapImage() | 100 BitmapImage::~BitmapImage() |
101 { | 101 { |
102 stopAnimation(); | 102 stopAnimation(); |
103 } | 103 } |
104 | 104 |
105 bool BitmapImage::currentFrameHasSingleSecurityOrigin() const | 105 bool BitmapImage::currentFrameHasSingleSecurityOrigin() const |
106 { | 106 { |
107 return true; | 107 return true; |
108 } | 108 } |
109 | 109 |
110 void BitmapImage::destroyDecodedData(bool destroyAll) | 110 void BitmapImage::destroyDecodedData() |
111 { | 111 { |
112 for (size_t i = 0; i < m_frames.size(); ++i) { | 112 for (size_t i = 0; i < m_frames.size(); ++i) { |
113 // The underlying frame isn't actually changing (we're just trying to | 113 // The underlying frame isn't actually changing (we're just trying to |
114 // save the memory for the framebuffer data), so we don't need to clear | 114 // save the memory for the framebuffer data), so we don't need to clear |
115 // the metadata. | 115 // the metadata. |
116 m_frames[i].clear(false); | 116 m_frames[i].clear(false); |
117 } | 117 } |
118 | 118 |
119 size_t frameBytesCleared = m_source.clearCacheExceptFrame(destroyAll ? kNotF
ound : m_currentFrame); | 119 size_t frameBytesCleared = m_source.clearCacheExceptFrame(kNotFound); |
120 notifyMemoryChanged(-safeCast<int>(frameBytesCleared)); | 120 notifyMemoryChanged(-safeCast<int>(frameBytesCleared)); |
121 } | 121 } |
122 | 122 |
123 void BitmapImage::destroyDecodedDataIfNecessary() | |
124 { | |
125 // Animated images >5MB are considered large enough that we'll only hang on | |
126 // to one frame at a time. | |
127 static const size_t cLargeAnimationCutoff = 5242880; | |
128 size_t allFrameBytes = 0; | |
129 for (size_t i = 0; i < m_frames.size(); ++i) | |
130 allFrameBytes += m_frames[i].m_frameBytes; | |
131 | |
132 if (allFrameBytes > cLargeAnimationCutoff) { | |
133 destroyDecodedData(false); | |
134 } | |
135 } | |
136 | |
137 void BitmapImage::notifyMemoryChanged(int delta) | 123 void BitmapImage::notifyMemoryChanged(int delta) |
138 { | 124 { |
139 if (delta && getImageObserver()) | 125 if (delta && getImageObserver()) |
140 getImageObserver()->decodedSizeChanged(this, delta); | 126 getImageObserver()->decodedSizeChanged(this, delta); |
141 } | 127 } |
142 | 128 |
143 int BitmapImage::totalFrameBytes() | 129 int BitmapImage::totalFrameBytes() |
144 { | 130 { |
145 const size_t numFrames = frameCount(); | 131 const size_t numFrames = frameCount(); |
146 size_t totalBytes = 0; | 132 size_t totalBytes = 0; |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 m_frameTimer.clear(); | 550 m_frameTimer.clear(); |
565 } | 551 } |
566 | 552 |
567 void BitmapImage::resetAnimation() | 553 void BitmapImage::resetAnimation() |
568 { | 554 { |
569 stopAnimation(); | 555 stopAnimation(); |
570 m_currentFrame = 0; | 556 m_currentFrame = 0; |
571 m_repetitionsComplete = 0; | 557 m_repetitionsComplete = 0; |
572 m_desiredFrameStartTime = 0; | 558 m_desiredFrameStartTime = 0; |
573 m_animationFinished = false; | 559 m_animationFinished = false; |
574 | |
575 // For extremely large animations, when the animation is reset, we just thro
w everything away. | |
576 destroyDecodedDataIfNecessary(); | |
577 } | 560 } |
578 | 561 |
579 bool BitmapImage::maybeAnimated() | 562 bool BitmapImage::maybeAnimated() |
580 { | 563 { |
581 if (m_animationFinished) | 564 if (m_animationFinished) |
582 return false; | 565 return false; |
583 if (frameCount() > 1) | 566 if (frameCount() > 1) |
584 return true; | 567 return true; |
585 | 568 |
586 return m_source.repetitionCount() != cAnimationNone; | 569 return m_source.repetitionCount() != cAnimationNone; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
624 // because it is 0 (see comments on its declaration in ImageAnimation.h)
. | 607 // because it is 0 (see comments on its declaration in ImageAnimation.h)
. |
625 if ((repetitionCount(true) != cAnimationLoopInfinite && m_repetitionsCom
plete > m_repetitionCount) | 608 if ((repetitionCount(true) != cAnimationLoopInfinite && m_repetitionsCom
plete > m_repetitionCount) |
626 || (m_animationPolicy == ImageAnimationPolicyAnimateOnce && m_repeti
tionsComplete > 0)) { | 609 || (m_animationPolicy == ImageAnimationPolicyAnimateOnce && m_repeti
tionsComplete > 0)) { |
627 m_animationFinished = true; | 610 m_animationFinished = true; |
628 m_desiredFrameStartTime = 0; | 611 m_desiredFrameStartTime = 0; |
629 --m_currentFrame; | 612 --m_currentFrame; |
630 advancedAnimation = false; | 613 advancedAnimation = false; |
631 } else | 614 } else |
632 m_currentFrame = 0; | 615 m_currentFrame = 0; |
633 } | 616 } |
634 destroyDecodedDataIfNecessary(); | |
635 | 617 |
636 // We need to draw this frame if we advanced to it while not skipping, or if | 618 // We need to draw this frame if we advanced to it while not skipping, or if |
637 // while trying to skip frames we hit the last frame and thus had to stop. | 619 // while trying to skip frames we hit the last frame and thus had to stop. |
638 if (skippingFrames != advancedAnimation) | 620 if (skippingFrames != advancedAnimation) |
639 getImageObserver()->animationAdvanced(this); | 621 getImageObserver()->animationAdvanced(this); |
640 return advancedAnimation; | 622 return advancedAnimation; |
641 } | 623 } |
642 | 624 |
643 } // namespace blink | 625 } // namespace blink |
OLD | NEW |