forked from mirrors/gecko-dev
		
	 680815cd6e
			
		
	
	
		680815cd6e
		
	
	
	
	
		
			
			This patch was generated automatically by the "modeline.py" script, available here: https://github.com/amccreight/moz-source-tools/blob/master/modeline.py For every file that is modified in this patch, the changes are as follows: (1) The patch changes the file to use the exact C++ mode lines from the Mozilla coding style guide, available here: https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Coding_Style#Mode_Line (2) The patch deletes any blank lines between the mode line & the MPL boilerplate comment. (3) If the file previously had the mode lines and MPL boilerplate in a single contiguous C++ comment, then the patch splits them into separate C++ comments, to match the boilerplate in the coding style. MozReview-Commit-ID: EuRsDue63tK --HG-- extra : rebase_source : 3356d4b80ff6213935192e87cdbc9103fec6084c
		
			
				
	
	
		
			92 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| #ifndef ScrollVelocityQueue_h_
 | |
| #define ScrollVelocityQueue_h_
 | |
| 
 | |
| #include "nsTArray.h"
 | |
| #include "nsPoint.h"
 | |
| #include "mozilla/TimeStamp.h"
 | |
| 
 | |
| class nsPresContext;
 | |
| 
 | |
| namespace mozilla {
 | |
| namespace layout {
 | |
| 
 | |
| /**
 | |
|  * ScrollVelocityQueue is used to determine the current velocity of a
 | |
|  * scroll frame, derived from scroll position samples.
 | |
|  *
 | |
|  * Using the last iteration's scroll position, stored in mLastPosition, a
 | |
|  * delta of the scroll position is calculated and accumulated in mAccumulator
 | |
|  * until the refresh driver returns a new timestamp for MostRecentRefresh().
 | |
|  *
 | |
|  * When there is a new timestamp from the refresh driver, the accumulated
 | |
|  * change in scroll position is divided by the delta of the timestamp to
 | |
|  * get an average velocity over that period.  This velocity is pushed into
 | |
|  * mQueue as a std::pair associating each velocity with the
 | |
|  * duration over which it was sampled.
 | |
|  *
 | |
|  * Samples are removed from mQueue, leaving only those necessary to determine
 | |
|  * the average velocity over the recent relevant period, which has a duration
 | |
|  * set by the apz.velocity_relevance_time_ms preference.
 | |
|  *
 | |
|  * The velocity of each sample is clamped to a value set by the
 | |
|  * layout.css.scroll-snap.prediction-max-velocity.
 | |
|  *
 | |
|  * As the average velocity will later be integrated over a duration set by
 | |
|  * the layout.css.scroll-snap.prediction-sensitivity preference and the
 | |
|  * velocity samples are clamped to a set value, the maximum expected scroll
 | |
|  * offset can be calculated.  This maximum offset is used to clamp
 | |
|  * mAccumulator, eliminating samples that would otherwise result in scroll
 | |
|  * snap position selection that is not consistent with the user's perception
 | |
|  * of scroll velocity.
 | |
|  */
 | |
| 
 | |
| class ScrollVelocityQueue final {
 | |
| public:
 | |
|   explicit ScrollVelocityQueue(nsPresContext *aPresContext)
 | |
|     : mPresContext(aPresContext) {}
 | |
| 
 | |
|   // Sample() is to be called periodically when scroll movement occurs, to
 | |
|   // record samples of scroll position used later by GetVelocity().
 | |
|   void Sample(const nsPoint& aScrollPosition);
 | |
| 
 | |
|   // Discards velocity samples, resulting in velocity of 0 returned by
 | |
|   // GetVelocity until move scroll position updates.
 | |
|   void Reset();
 | |
| 
 | |
|   // Get scroll velocity averaged from recent movement, in appunits / second
 | |
|   nsPoint GetVelocity();
 | |
| private:
 | |
|   // A queue of (duration, velocity) pairs; these are the historical average
 | |
|   // velocities over the given durations.  Durations are in milliseconds,
 | |
|   // velocities are in app units per second.
 | |
|   nsTArray<std::pair<uint32_t, nsPoint> > mQueue;
 | |
| 
 | |
|   // Accumulates the distance and direction travelled by the scroll frame since
 | |
|   // mSampleTime.
 | |
|   nsPoint mAccumulator;
 | |
| 
 | |
|   // Time that mAccumulator was last reset and began accumulating.
 | |
|   TimeStamp mSampleTime;
 | |
| 
 | |
|   // Scroll offset at the mAccumulator was last reset and began
 | |
|   // accumulating.
 | |
|   nsPoint mLastPosition;
 | |
| 
 | |
|   // PresContext of the containing frame, used to get timebase
 | |
|   nsPresContext* mPresContext;
 | |
| 
 | |
|   // Remove samples from mQueue that no longer contribute to GetVelocity()
 | |
|   // due to their age
 | |
|   void TrimQueue();
 | |
| };
 | |
| 
 | |
| } // namespace layout
 | |
| } // namespace mozilla
 | |
| 
 | |
| #endif  /* !defined(ScrollVelocityQueue_h_) */
 |