/* 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 #include #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_