Chromium Code Reviews| Index: Source/platform/mac/ScrollAnimatorMac.mm |
| diff --git a/Source/platform/mac/ScrollAnimatorMac.mm b/Source/platform/mac/ScrollAnimatorMac.mm |
| index 3c06aac6d4e3475e67238207d8f5c09ae0132280..e3422f49b523d7c63f09416a59372e9b5858c35c 100644 |
| --- a/Source/platform/mac/ScrollAnimatorMac.mm |
| +++ b/Source/platform/mac/ScrollAnimatorMac.mm |
| @@ -29,6 +29,8 @@ |
| #include "platform/PlatformGestureEvent.h" |
| #include "platform/PlatformWheelEvent.h" |
| +#include "platform/Timer.h" |
| +#include "platform/animation/TimingFunction.h" |
| #include "platform/geometry/FloatRect.h" |
| #include "platform/geometry/IntRect.h" |
| #include "platform/mac/BlockExceptions.h" |
| @@ -292,9 +294,65 @@ enum FeatureToAnimate { |
| ExpansionTransition |
| }; |
| -@interface WebScrollbarPartAnimation : NSAnimation |
| -{ |
| +@class WebScrollbarPartAnimation; |
| + |
| +class WebScrollbarPartAnimationTimer { |
|
Alexei Svitkine (slow)
2014/09/03 15:39:35
Can you add a comment on the class briefly summari
Alexei Svitkine (slow)
2014/09/03 15:39:36
Nit: Not sure on Blink style, but maybe this shoul
Robert Sesek
2014/09/03 16:51:11
I codesearched and it seems mostly to be for tests
Robert Sesek
2014/09/03 16:51:11
Done.
|
| +public: |
| + WebScrollbarPartAnimationTimer(WebScrollbarPartAnimation* animation, |
| + CFTimeInterval duration) |
| + : m_timer(this, &WebScrollbarPartAnimationTimer::timerFired) |
| + , m_startTime(0.0) |
| + , m_duration(duration) |
| + , m_animation(animation) |
| + , m_timingFunction(CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseInOut)) |
| + { |
| + } |
| + |
| + ~WebScrollbarPartAnimationTimer() {} |
| + |
| + void start() |
| + { |
| + m_startTime = CACurrentMediaTime(); |
| + m_timer.startRepeating(1.0 / 35.0, FROM_HERE); |
|
Alexei Svitkine (slow)
2014/09/03 15:39:35
Nit: Can you add a comment about where this consta
Robert Sesek
2014/09/03 16:51:11
Done. All OS versions use a framerate of 60Hz, tho
|
| + } |
| + |
| + void stop() |
| + { |
| + m_timer.stop(); |
| + [m_animation setCurrentProgress:1]; |
| + } |
| + |
| + void setDuration(CFTimeInterval duration) |
| + { |
| + m_duration = duration; |
| + } |
| + |
| +private: |
| + void timerFired(Timer<WebScrollbarPartAnimationTimer>*) |
| + { |
| + CFTimeInterval currentTime = CACurrentMediaTime(); |
| + CFTimeInterval delta = currentTime - m_startTime; |
| + |
| + if (delta >= m_duration) { |
| + stop(); |
| + return; |
| + } |
| + |
| + double fraction = delta / m_duration; |
| + double progress = m_timingFunction->evaluate(fraction, 0.001); |
| + [m_animation setCurrentProgress:progress]; |
| + } |
| + |
| + Timer<WebScrollbarPartAnimationTimer> m_timer; |
| + CFTimeInterval m_startTime; |
| + CFTimeInterval m_duration; |
| + WebScrollbarPartAnimation* m_animation; |
| + CubicBezierTimingFunction* m_timingFunction; |
| +}; |
| + |
| +@interface WebScrollbarPartAnimation : NSObject { |
| Scrollbar* _scrollbar; |
| + OwnPtr<WebScrollbarPartAnimationTimer> _timer; |
| RetainPtr<ScrollbarPainter> _scrollbarPainter; |
| FeatureToAnimate _featureToAnimate; |
| CGFloat _startValue; |
| @@ -307,17 +365,16 @@ enum FeatureToAnimate { |
| - (id)initWithScrollbar:(Scrollbar*)scrollbar featureToAnimate:(FeatureToAnimate)featureToAnimate animateFrom:(CGFloat)startValue animateTo:(CGFloat)endValue duration:(NSTimeInterval)duration |
| { |
| - self = [super initWithDuration:duration animationCurve:NSAnimationEaseInOut]; |
| + self = [super init]; |
| if (!self) |
| return nil; |
| + _timer = adoptPtr(new WebScrollbarPartAnimationTimer(self, duration)); |
| _scrollbar = scrollbar; |
| _featureToAnimate = featureToAnimate; |
| _startValue = startValue; |
| _endValue = endValue; |
| - [self setAnimationBlockingMode:NSAnimationNonblocking]; |
| - |
| return self; |
| } |
| @@ -326,8 +383,17 @@ enum FeatureToAnimate { |
| ASSERT(_scrollbar); |
| _scrollbarPainter = scrollbarPainterForScrollbar(_scrollbar); |
| + _timer->start(); |
| +} |
| + |
| +- (void)stopAnimation |
| +{ |
| + _timer->stop(); |
| +} |
| - [super startAnimation]; |
| +- (void)setDuration:(CFTimeInterval)duration |
| +{ |
| + _timer->setDuration(duration); |
| } |
| - (void)setStartValue:(CGFloat)startValue |
| @@ -342,8 +408,6 @@ enum FeatureToAnimate { |
| - (void)setCurrentProgress:(NSAnimationProgress)progress |
| { |
| - [super setCurrentProgress:progress]; |
| - |
| ASSERT(_scrollbar); |
| CGFloat currentValue; |