| 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 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 // the other hand, it makes animations "less accurate" for pages that try to | 483 // the other hand, it makes animations "less accurate" for pages that try to |
| 484 // sync an image and some other resource (e.g. audio), especially if users | 484 // sync an image and some other resource (e.g. audio), especially if users |
| 485 // switch tabs (and thus stop drawing the animation, which will pause it) | 485 // switch tabs (and thus stop drawing the animation, which will pause it) |
| 486 // during that initial loop, then switch back later. | 486 // during that initial loop, then switch back later. |
| 487 if (nextFrame == 0 && m_repetitionsComplete == 0 && | 487 if (nextFrame == 0 && m_repetitionsComplete == 0 && |
| 488 m_desiredFrameStartTime < time) | 488 m_desiredFrameStartTime < time) |
| 489 m_desiredFrameStartTime = time; | 489 m_desiredFrameStartTime = time; |
| 490 | 490 |
| 491 if (catchUpIfNecessary == DoNotCatchUp || time < m_desiredFrameStartTime) { | 491 if (catchUpIfNecessary == DoNotCatchUp || time < m_desiredFrameStartTime) { |
| 492 // Haven't yet reached time for next frame to start; delay until then. | 492 // Haven't yet reached time for next frame to start; delay until then. |
| 493 m_frameTimer = wrapUnique( | 493 m_frameTimer = WTF::wrapUnique( |
| 494 new Timer<BitmapImage>(this, &BitmapImage::advanceAnimation)); | 494 new Timer<BitmapImage>(this, &BitmapImage::advanceAnimation)); |
| 495 m_frameTimer->startOneShot(std::max(m_desiredFrameStartTime - time, 0.), | 495 m_frameTimer->startOneShot(std::max(m_desiredFrameStartTime - time, 0.), |
| 496 BLINK_FROM_HERE); | 496 BLINK_FROM_HERE); |
| 497 } else { | 497 } else { |
| 498 // We've already reached or passed the time for the next frame to start. | 498 // We've already reached or passed the time for the next frame to start. |
| 499 // See if we've also passed the time for frames after that to start, in | 499 // See if we've also passed the time for frames after that to start, in |
| 500 // case we need to skip some frames entirely. Remember not to advance | 500 // case we need to skip some frames entirely. Remember not to advance |
| 501 // to an incomplete frame. | 501 // to an incomplete frame. |
| 502 for (size_t frameAfterNext = (nextFrame + 1) % frameCount(); | 502 for (size_t frameAfterNext = (nextFrame + 1) % frameCount(); |
| 503 frameIsCompleteAtIndex(frameAfterNext); | 503 frameIsCompleteAtIndex(frameAfterNext); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 514 return; | 514 return; |
| 515 } | 515 } |
| 516 m_desiredFrameStartTime = frameAfterNextStartTime; | 516 m_desiredFrameStartTime = frameAfterNextStartTime; |
| 517 nextFrame = frameAfterNext; | 517 nextFrame = frameAfterNext; |
| 518 } | 518 } |
| 519 | 519 |
| 520 // Post a task to advance the frame immediately. m_desiredFrameStartTime | 520 // Post a task to advance the frame immediately. m_desiredFrameStartTime |
| 521 // may be in the past, meaning the next time through this function we'll | 521 // may be in the past, meaning the next time through this function we'll |
| 522 // kick off the next advancement sooner than this frame's duration would | 522 // kick off the next advancement sooner than this frame's duration would |
| 523 // suggest. | 523 // suggest. |
| 524 m_frameTimer = wrapUnique(new Timer<BitmapImage>( | 524 m_frameTimer = WTF::wrapUnique(new Timer<BitmapImage>( |
| 525 this, &BitmapImage::advanceAnimationWithoutCatchUp)); | 525 this, &BitmapImage::advanceAnimationWithoutCatchUp)); |
| 526 m_frameTimer->startOneShot(0, BLINK_FROM_HERE); | 526 m_frameTimer->startOneShot(0, BLINK_FROM_HERE); |
| 527 } | 527 } |
| 528 } | 528 } |
| 529 | 529 |
| 530 void BitmapImage::stopAnimation() { | 530 void BitmapImage::stopAnimation() { |
| 531 // This timer is used to animate all occurrences of this image. Don't | 531 // This timer is used to animate all occurrences of this image. Don't |
| 532 // invalidate the timer unless all renderers have stopped drawing. | 532 // invalidate the timer unless all renderers have stopped drawing. |
| 533 m_frameTimer.reset(); | 533 m_frameTimer.reset(); |
| 534 } | 534 } |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 m_animationPolicy == ImageAnimationPolicyAnimateOnce) { | 597 m_animationPolicy == ImageAnimationPolicyAnimateOnce) { |
| 598 m_animationFinished = true; | 598 m_animationFinished = true; |
| 599 m_desiredFrameStartTime = 0; | 599 m_desiredFrameStartTime = 0; |
| 600 | 600 |
| 601 // We skipped to the last frame and cannot advance further. The | 601 // We skipped to the last frame and cannot advance further. The |
| 602 // observer will not receive animationAdvanced notifications while | 602 // observer will not receive animationAdvanced notifications while |
| 603 // skipping but we still need to notify the observer to draw the | 603 // skipping but we still need to notify the observer to draw the |
| 604 // last frame. Skipping frames occurs while painting so we do not | 604 // last frame. Skipping frames occurs while painting so we do not |
| 605 // synchronously notify the observer which could cause a layout. | 605 // synchronously notify the observer which could cause a layout. |
| 606 if (advancement == SkipFramesToCatchUp) { | 606 if (advancement == SkipFramesToCatchUp) { |
| 607 m_frameTimer = wrapUnique(new Timer<BitmapImage>( | 607 m_frameTimer = WTF::wrapUnique(new Timer<BitmapImage>( |
| 608 this, &BitmapImage::notifyObserversOfAnimationAdvance)); | 608 this, &BitmapImage::notifyObserversOfAnimationAdvance)); |
| 609 m_frameTimer->startOneShot(0, BLINK_FROM_HERE); | 609 m_frameTimer->startOneShot(0, BLINK_FROM_HERE); |
| 610 } | 610 } |
| 611 | 611 |
| 612 return false; | 612 return false; |
| 613 } | 613 } |
| 614 | 614 |
| 615 // Loop the animation back to the first frame. | 615 // Loop the animation back to the first frame. |
| 616 m_currentFrame = 0; | 616 m_currentFrame = 0; |
| 617 } | 617 } |
| 618 | 618 |
| 619 // We need to draw this frame if we advanced to it while not skipping. | 619 // We need to draw this frame if we advanced to it while not skipping. |
| 620 if (advancement != SkipFramesToCatchUp) | 620 if (advancement != SkipFramesToCatchUp) |
| 621 getImageObserver()->animationAdvanced(this); | 621 getImageObserver()->animationAdvanced(this); |
| 622 | 622 |
| 623 return true; | 623 return true; |
| 624 } | 624 } |
| 625 | 625 |
| 626 void BitmapImage::notifyObserversOfAnimationAdvance(TimerBase*) { | 626 void BitmapImage::notifyObserversOfAnimationAdvance(TimerBase*) { |
| 627 getImageObserver()->animationAdvanced(this); | 627 getImageObserver()->animationAdvanced(this); |
| 628 } | 628 } |
| 629 | 629 |
| 630 } // namespace blink | 630 } // namespace blink |
| OLD | NEW |