ScrollAnimationSmooth.h [plain text]
#pragma once
#include "ScrollAnimation.h"
#if ENABLE(SMOOTH_SCROLLING)
#include "Timer.h"
namespace WebCore {
class FloatPoint;
class ScrollableArea;
class ScrollAnimationSmooth final: public ScrollAnimation {
public:
ScrollAnimationSmooth(ScrollableArea&, const FloatPoint&, WTF::Function<void (FloatPoint&&)>&& notifyPositionChangedFunction);
virtual ~ScrollAnimationSmooth();
enum class Curve {
Linear,
Quadratic,
Cubic,
Quartic,
Bounce
};
private:
bool scroll(ScrollbarOrientation, ScrollGranularity, float step, float multiplier) override;
void stop() override;
void updateVisibleLengths() override;
void setCurrentPosition(const FloatPoint&) override;
struct PerAxisData {
PerAxisData() = delete;
PerAxisData(float position, int length)
: currentPosition(position)
, desiredPosition(position)
, visibleLength(length)
{
}
float currentPosition { 0 };
double currentVelocity { 0 };
double desiredPosition { 0 };
double desiredVelocity { 0 };
double startPosition { 0 };
MonotonicTime startTime;
double startVelocity { 0 };
Seconds animationTime;
MonotonicTime lastAnimationTime;
double attackPosition { 0 };
Seconds attackTime;
Curve attackCurve { Curve::Quadratic };
double releasePosition { 0 };
Seconds releaseTime;
Curve releaseCurve { Curve::Quadratic };
int visibleLength { 0 };
};
bool updatePerAxisData(PerAxisData&, ScrollGranularity, float delta, float minScrollPosition, float maxScrollPosition);
bool animateScroll(PerAxisData&, MonotonicTime currentTime);
void requestAnimationTimerFired();
void startNextTimer(Seconds delay);
void animationTimerFired();
bool animationTimerActive() const;
WTF::Function<void (FloatPoint&&)> m_notifyPositionChangedFunction;
PerAxisData m_horizontalData;
PerAxisData m_verticalData;
MonotonicTime m_startTime;
Timer m_animationTimer;
};
}
#endif // ENABLE(SMOOTH_SCROLLING)