Changeset 284596 in webkit
- Timestamp:
- Oct 21, 2021, 2:53:50 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 7 edited
-
ChangeLog (modified) (1 diff)
-
platform/ScrollAnimation.h (modified) (1 diff)
-
platform/ScrollAnimationSmooth.cpp (modified) (4 diffs)
-
platform/ScrollAnimationSmooth.h (modified) (2 diffs)
-
platform/ScrollAnimator.cpp (modified) (1 diff)
-
platform/ScrollingEffectsController.cpp (modified) (2 diffs)
-
platform/ScrollingEffectsController.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r284591 r284596 1 2021-10-21 Chris Lord <clord@igalia.com> 2 3 [GTK] Slow scrolling (not matching GTK native scroll amount) 4 https://bugs.webkit.org/show_bug.cgi?id=197100 5 6 Reviewed by Simon Fraser. 7 8 Fix up behaviour with interrupting smooth scrolling, mainly on 9 keyboard-initiated scrolling, but also for the mouse-wheel. When 10 interrupting a smooth scroll, the animation curve is now changed from 11 ease-in-out to ease-out and the duration is recalculated. 12 13 No new tests, covered by existing tests. 14 15 * platform/ScrollAnimation.h: 16 (WebCore::ScrollAnimation::destinationOffset const): 17 * platform/ScrollAnimationSmooth.cpp: 18 (WebCore::ScrollAnimationSmooth::ScrollAnimationSmooth): 19 (WebCore::ScrollAnimationSmooth::startAnimatedScrollToDestination): 20 (WebCore::ScrollAnimationSmooth::retargetActiveAnimation): 21 (WebCore::ScrollAnimationSmooth::animateScroll): 22 (WebCore::ScrollAnimationSmooth::startOrRetargetAnimation): Deleted. 23 * platform/ScrollAnimationSmooth.h: 24 * platform/ScrollAnimator.cpp: 25 (WebCore::ScrollAnimator::scroll): 26 * platform/ScrollingEffectsController.cpp: 27 (WebCore::ScrollingEffectsController::retargetAnimatedScrollBy): 28 (WebCore::ScrollingEffectsController::handleWheelEvent): 29 * platform/ScrollingEffectsController.h: 30 1 31 2021-10-20 Brady Eidson <beidson@apple.com> 2 32 -
trunk/Source/WebCore/platform/ScrollAnimation.h
r284136 r284596 79 79 80 80 FloatPoint currentOffset() const { return m_currentOffset; } 81 virtual std::optional<FloatPoint> destinationOffset() const { return std::nullopt; } 81 82 82 83 virtual void serviceAnimation(MonotonicTime) = 0; -
trunk/Source/WebCore/platform/ScrollAnimationSmooth.cpp
r283851 r284596 42 42 ScrollAnimationSmooth::ScrollAnimationSmooth(ScrollAnimationClient& client) 43 43 : ScrollAnimation(Type::Smooth, client) 44 , m_ easeInOutTimingFunction(CubicBezierTimingFunction::create(CubicBezierTimingFunction::TimingFunctionPreset::EaseInOut))44 , m_timingFunction(CubicBezierTimingFunction::create()) 45 45 { 46 46 } … … 50 50 bool ScrollAnimationSmooth::startAnimatedScrollToDestination(const FloatPoint& fromOffset, const FloatPoint& destinationOffset) 51 51 { 52 m_startOffset = fromOffset;53 m_duration = durationFromDistance(destinationOffset - m_startOffset);52 if (!isActive() && fromOffset == destinationOffset) 53 return false; 54 54 55 55 auto extents = m_client.scrollExtentsForAnimation(*this); 56 return startOrRetargetAnimation(extents, destinationOffset); 56 57 m_startTime = MonotonicTime::now(); 58 m_startOffset = fromOffset; 59 m_destinationOffset = destinationOffset.constrainedBetween(extents.minimumScrollOffset(), extents.maximumScrollOffset()); 60 m_duration = durationFromDistance(m_destinationOffset - m_startOffset); 61 downcast<CubicBezierTimingFunction>(*m_timingFunction).setTimingFunctionPreset(CubicBezierTimingFunction::TimingFunctionPreset::EaseInOut); 62 63 if (!isActive()) 64 didStart(MonotonicTime::now()); 65 66 return true; 57 67 } 58 68 … … 63 73 64 74 auto extents = m_client.scrollExtentsForAnimation(*this); 65 return startOrRetargetAnimation(extents, newOffset);66 }67 75 68 bool ScrollAnimationSmooth::startOrRetargetAnimation(const ScrollExtents& extents, const FloatPoint& destinationOffset) 69 { 70 m_destinationOffset = destinationOffset.constrainedBetween(extents.minimumScrollOffset(), extents.maximumScrollOffset()); 71 bool needToScroll = m_startOffset != m_destinationOffset; 76 m_startTime = MonotonicTime::now(); 77 m_startOffset = m_currentOffset; 78 m_destinationOffset = newOffset.constrainedBetween(extents.minimumScrollOffset(), extents.maximumScrollOffset()); 79 m_duration = durationFromDistance(m_destinationOffset - m_startOffset); 80 downcast<CubicBezierTimingFunction>(*m_timingFunction).setTimingFunctionPreset(CubicBezierTimingFunction::TimingFunctionPreset::EaseOut); 81 m_timingFunction = CubicBezierTimingFunction::create(CubicBezierTimingFunction::TimingFunctionPreset::EaseOut); 72 82 73 if ( needToScroll && !isActive())74 didStart(MonotonicTime::now());83 if (m_currentOffset == m_destinationOffset) 84 return false; 75 85 76 return needToScroll;86 return true; 77 87 } 78 88 … … 109 119 110 120 double fractionComplete = (currentTime - m_startTime) / m_duration; 111 double progress = m_ easeInOutTimingFunction->transformProgress(fractionComplete, m_duration.value());121 double progress = m_timingFunction->transformProgress(fractionComplete, m_duration.value()); 112 122 113 123 m_currentOffset = { -
trunk/Source/WebCore/platform/ScrollAnimationSmooth.h
r283548 r284596 42 42 bool retargetActiveAnimation(const FloatPoint& newOffset) final; 43 43 44 const FloatPoint& destinationOffset() const{ return m_destinationOffset; }44 std::optional<FloatPoint> destinationOffset() const final { return m_destinationOffset; } 45 45 46 46 private: 47 48 bool startOrRetargetAnimation(const ScrollExtents&, const FloatPoint& destinationOffset);49 47 50 48 void updateScrollExtents() final; … … 60 58 FloatPoint m_destinationOffset; 61 59 62 RefPtr<TimingFunction> m_ easeInOutTimingFunction;60 RefPtr<TimingFunction> m_timingFunction; 63 61 }; 64 62 -
trunk/Source/WebCore/platform/ScrollAnimator.cpp
r284575 r284596 90 90 91 91 if (m_scrollableArea.scrollAnimatorEnabled() && platformAllowsScrollAnimation() && !behavior.contains(ScrollBehavior::NeverAnimate)) { 92 if (m_scrollController.retargetAnimatedScrollBy(delta)) 93 return true; 94 92 95 auto startOffset = offsetFromPosition(m_currentPosition); 93 96 auto extents = scrollExtents(); -
trunk/Source/WebCore/platform/ScrollingEffectsController.cpp
r284302 r284596 119 119 } 120 120 121 bool ScrollingEffectsController::retargetAnimatedScrollBy(FloatSize offset) 122 { 123 if (!is<ScrollAnimationSmooth>(m_currentAnimation.get())) 124 return false; 125 126 LOG_WITH_STREAM(ScrollAnimations, stream << "ScrollingEffectsController " << this << " retargetAnimatedScrollBy " << offset); 127 128 ASSERT(m_currentAnimation->isActive()); 129 if (auto destinationOffset = m_currentAnimation->destinationOffset()) 130 return m_currentAnimation->retargetActiveAnimation(*destinationOffset + offset); 131 132 return false; 133 } 134 121 135 void ScrollingEffectsController::stopAnimatedScroll() 122 136 { … … 352 366 #if ENABLE(SMOOTH_SCROLLING) 353 367 if (m_client.scrollAnimationEnabled() && !m_inScrollGesture) { 354 if (is<ScrollAnimationSmooth>(m_currentAnimation.get())) { 355 auto lastDestinationOffset = downcast<ScrollAnimationSmooth>(*m_currentAnimation).destinationOffset(); 356 retargetAnimatedScroll(lastDestinationOffset + FloatSize { deltaX, deltaY }); 357 } else 368 if (!retargetAnimatedScrollBy({ deltaX, deltaY })) 358 369 startAnimatedScrollToDestination(scrollOffset, scrollOffset + FloatSize { deltaX, deltaY }); 359 370 return true; -
trunk/Source/WebCore/platform/ScrollingEffectsController.h
r284302 r284596 136 136 bool startAnimatedScrollToDestination(FloatPoint startOffset, FloatPoint destinationOffset); 137 137 bool retargetAnimatedScroll(FloatPoint newDestinationOffset); 138 bool retargetAnimatedScrollBy(FloatSize); 138 139 void stopAnimatedScroll(); 139 140
Note:
See TracChangeset
for help on using the changeset viewer.