diff options
Diffstat (limited to 'layout/generic/ScrollPositionUpdate.h')
-rw-r--r-- | layout/generic/ScrollPositionUpdate.h | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/layout/generic/ScrollPositionUpdate.h b/layout/generic/ScrollPositionUpdate.h new file mode 100644 index 0000000000..6b1e055295 --- /dev/null +++ b/layout/generic/ScrollPositionUpdate.h @@ -0,0 +1,126 @@ +/* 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 mozilla_ScrollPositionUpdate_h_ +#define mozilla_ScrollPositionUpdate_h_ + +#include <cstdint> +#include <iosfwd> + +#include "nsPoint.h" +#include "mozilla/ScrollOrigin.h" +#include "mozilla/ScrollTypes.h" +#include "Units.h" + +namespace mozilla { + +enum class ScrollUpdateType { + // A scroll update to a specific destination, regardless of the current + // scroll position. + Absolute, + // A scroll update by a specific amount, based off a given starting scroll + // position. XXX Fold this into PureRelative, it should be relatively + // straightforward after bug 1655733. + Relative, + // A scroll update by a specific amount, where only the delta is provided. + // The delta should be applied to whatever the current scroll position is + // on the receiver side. + PureRelative, +}; + +struct ScrollGeneration { + private: + // Private constructor; use New() to get a new instance. + explicit ScrollGeneration(uint64_t aValue); + + public: + // Dummy constructor, needed for IPDL purposes. Not intended for manual use. + ScrollGeneration(); + + // Returns a new ScrollGeneration with a unique value. + static ScrollGeneration New(); + + bool operator<(const ScrollGeneration& aOther) const; + bool operator==(const ScrollGeneration& aOther) const; + bool operator!=(const ScrollGeneration& aOther) const; + + friend std::ostream& operator<<(std::ostream& aStream, + const ScrollGeneration& aGen); + + private: + static uint64_t sCounter; + uint64_t mValue; +}; + +/** + * This class represents an update to the scroll position that is initiated by + * something on the main thread. A list of these classes is accumulated by + * scrollframes on the main thread, and the list is sent over as part of a + * paint transaction to the compositor. The compositor can then iterate through + * the scroll updates and apply/merge them with scrolling that has already + * occurred independently on the compositor side. + */ +class ScrollPositionUpdate { + public: + // Constructor for IPC use only. + explicit ScrollPositionUpdate(); + + // Create a ScrollPositionUpdate for a newly created (or reconstructed) + // scrollframe. + static ScrollPositionUpdate NewScrollframe(nsPoint aInitialPosition); + // Create a ScrollPositionUpdate for a new absolute/instant scroll, to + // the given destination. + static ScrollPositionUpdate NewScroll(ScrollOrigin aOrigin, + nsPoint aDestination); + // Create a ScrollPositionUpdate for a new relative/instant scroll, with + // the given source/destination. + static ScrollPositionUpdate NewRelativeScroll(nsPoint aSource, + nsPoint aDestination); + // Create a ScrollPositionUpdate for a new absolute/smooth scroll, which + // animates smoothly to the given destination from whatever the current + // scroll position is in the receiver. + static ScrollPositionUpdate NewSmoothScroll(ScrollOrigin aOrigin, + nsPoint aDestination); + // Create a ScrollPositionUpdate for a new pure-relative scroll. The + // aMode parameter controls whether or not this is a smooth animation or + // instantaneous scroll. + static ScrollPositionUpdate NewPureRelativeScroll(ScrollOrigin aOrigin, + ScrollMode aMode, + const nsPoint& aDelta); + + bool operator==(const ScrollPositionUpdate& aOther) const; + + ScrollGeneration GetGeneration() const; + ScrollUpdateType GetType() const; + ScrollMode GetMode() const; + ScrollOrigin GetOrigin() const; + // GetDestination is only valid for Absolute and Relative types; it asserts + // otherwise. + CSSPoint GetDestination() const; + // GetSource is only valid for the Relative type; it asserts otherwise. + CSSPoint GetSource() const; + // GetDelta is only valid for the PureRelative type; it asserts otherwise. + CSSPoint GetDelta() const; + + friend std::ostream& operator<<(std::ostream& aStream, + const ScrollPositionUpdate& aUpdate); + + private: + ScrollGeneration mScrollGeneration; + // Refer to the ScrollUpdateType documentation for what the types mean. + // All fields are populated for all types, except as noted below. + ScrollUpdateType mType; + ScrollMode mScrollMode; + ScrollOrigin mScrollOrigin; + // mDestination is not populated when mType == PureRelative. + CSSPoint mDestination; + // mSource is not populated when mType == Absolute || mType == PureRelative. + CSSPoint mSource; + // mDelta is not populated when mType == Absolute || mType == Relative. + CSSPoint mDelta; +}; + +} // namespace mozilla + +#endif // mozilla_ScrollPositionUpdate_h_ |