1/*
2 * Copyright (C) 2016 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#if ENABLE(CSS_SCROLL_SNAP)
29
30#include "AxisScrollSnapOffsets.h"
31#include "PlatformWheelEvent.h"
32#include "ScrollTypes.h"
33#include <wtf/Optional.h>
34#include <wtf/Seconds.h>
35
36namespace WebCore {
37
38class FloatPoint;
39class FloatSize;
40
41class ScrollingMomentumCalculator {
42public:
43 ScrollingMomentumCalculator(const FloatSize& viewportSize, const FloatSize& contentSize, const FloatPoint& initialOffset, const FloatSize& initialDelta, const FloatSize& initialVelocity);
44 static std::unique_ptr<ScrollingMomentumCalculator> create(const FloatSize& viewportSize, const FloatSize& contentSize, const FloatPoint& initialOffset, const FloatSize& initialDelta, const FloatSize& initialVelocity);
45 WEBCORE_EXPORT static void setPlatformMomentumScrollingPredictionEnabled(bool);
46 virtual ~ScrollingMomentumCalculator() = default;
47
48 virtual FloatPoint scrollOffsetAfterElapsedTime(Seconds) = 0;
49 virtual Seconds animationDuration() = 0;
50 virtual FloatSize predictedDestinationOffset();
51 void setRetargetedScrollOffset(const FloatSize&);
52
53protected:
54 const FloatSize& retargetedScrollOffset() const { return m_retargetedScrollOffset.value(); }
55 virtual void retargetedScrollOffsetDidChange() { }
56
57 FloatSize m_initialDelta;
58 FloatSize m_initialVelocity;
59 FloatSize m_initialScrollOffset;
60 FloatSize m_viewportSize;
61 FloatSize m_contentSize;
62
63private:
64 Optional<FloatSize> m_retargetedScrollOffset;
65};
66
67class BasicScrollingMomentumCalculator final : public ScrollingMomentumCalculator {
68public:
69 BasicScrollingMomentumCalculator(const FloatSize& viewportSize, const FloatSize& contentSize, const FloatPoint& initialOffset, const FloatSize& initialDelta, const FloatSize& initialVelocity);
70
71private:
72 FloatPoint scrollOffsetAfterElapsedTime(Seconds) final;
73 Seconds animationDuration() final;
74 void initializeInterpolationCoefficientsIfNecessary();
75 void initializeSnapProgressCurve();
76 float animationProgressAfterElapsedTime(Seconds) const;
77 FloatSize linearlyInterpolatedOffsetAtProgress(float progress);
78 FloatSize cubicallyInterpolatedOffsetAtProgress(float progress) const;
79
80 float m_snapAnimationCurveMagnitude { 0 };
81 float m_snapAnimationDecayFactor { 0 };
82 FloatSize m_snapAnimationCurveCoefficients[4] { };
83 bool m_forceLinearAnimationCurve { false };
84 bool m_momentumCalculatorRequiresInitialization { true };
85 Optional<FloatSize> m_predictedDestinationOffset;
86};
87
88} // namespace WebCore
89
90#endif // ENABLE(CSS_SCROLL_SNAP)
91