summaryrefslogtreecommitdiffstats
path: root/layout/generic/ScrollPositionUpdate.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
commit2aa4a82499d4becd2284cdb482213d541b8804dd (patch)
treeb80bf8bf13c3766139fbacc530efd0dd9d54394c /layout/generic/ScrollPositionUpdate.cpp
parentInitial commit. (diff)
downloadfirefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz
firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'layout/generic/ScrollPositionUpdate.cpp')
-rw-r--r--layout/generic/ScrollPositionUpdate.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/layout/generic/ScrollPositionUpdate.cpp b/layout/generic/ScrollPositionUpdate.cpp
new file mode 100644
index 0000000000..885085efd7
--- /dev/null
+++ b/layout/generic/ScrollPositionUpdate.cpp
@@ -0,0 +1,157 @@
+/* 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/. */
+
+#include "ScrollPositionUpdate.h"
+
+#include <ostream>
+
+#include "mozilla/Assertions.h"
+
+namespace mozilla {
+
+uint64_t ScrollGeneration::sCounter = 0;
+
+ScrollGeneration ScrollGeneration::New() {
+ uint64_t value = ++sCounter;
+ return ScrollGeneration(value);
+}
+
+ScrollGeneration::ScrollGeneration() : mValue(0) {}
+
+ScrollGeneration::ScrollGeneration(uint64_t aValue) : mValue(aValue) {}
+
+bool ScrollGeneration::operator<(const ScrollGeneration& aOther) const {
+ return mValue < aOther.mValue;
+}
+
+bool ScrollGeneration::operator==(const ScrollGeneration& aOther) const {
+ return mValue == aOther.mValue;
+}
+
+bool ScrollGeneration::operator!=(const ScrollGeneration& aOther) const {
+ return !(*this == aOther);
+}
+
+std::ostream& operator<<(std::ostream& aStream, const ScrollGeneration& aGen) {
+ return aStream << aGen.mValue;
+}
+
+ScrollPositionUpdate::ScrollPositionUpdate()
+ : mType(ScrollUpdateType::Absolute),
+ mScrollMode(ScrollMode::Normal),
+ mScrollOrigin(ScrollOrigin::None) {}
+
+/*static*/
+ScrollPositionUpdate ScrollPositionUpdate::NewScrollframe(
+ nsPoint aInitialPosition) {
+ ScrollPositionUpdate ret;
+ ret.mScrollGeneration = ScrollGeneration::New();
+ ret.mScrollMode = ScrollMode::Instant;
+ ret.mDestination = CSSPoint::FromAppUnits(aInitialPosition);
+ return ret;
+}
+
+/*static*/
+ScrollPositionUpdate ScrollPositionUpdate::NewScroll(ScrollOrigin aOrigin,
+ nsPoint aDestination) {
+ MOZ_ASSERT(aOrigin != ScrollOrigin::NotSpecified);
+ MOZ_ASSERT(aOrigin != ScrollOrigin::None);
+
+ ScrollPositionUpdate ret;
+ ret.mScrollGeneration = ScrollGeneration::New();
+ ret.mType = ScrollUpdateType::Absolute;
+ ret.mScrollMode = ScrollMode::Instant;
+ ret.mScrollOrigin = aOrigin;
+ ret.mDestination = CSSPoint::FromAppUnits(aDestination);
+ return ret;
+}
+
+/*static*/
+ScrollPositionUpdate ScrollPositionUpdate::NewRelativeScroll(
+ nsPoint aSource, nsPoint aDestination) {
+ ScrollPositionUpdate ret;
+ ret.mScrollGeneration = ScrollGeneration::New();
+ ret.mType = ScrollUpdateType::Relative;
+ ret.mScrollMode = ScrollMode::Instant;
+ ret.mScrollOrigin = ScrollOrigin::Relative;
+ ret.mDestination = CSSPoint::FromAppUnits(aDestination);
+ ret.mSource = CSSPoint::FromAppUnits(aSource);
+ return ret;
+}
+
+/*static*/
+ScrollPositionUpdate ScrollPositionUpdate::NewSmoothScroll(
+ ScrollOrigin aOrigin, nsPoint aDestination) {
+ MOZ_ASSERT(aOrigin != ScrollOrigin::NotSpecified);
+ MOZ_ASSERT(aOrigin != ScrollOrigin::None);
+
+ ScrollPositionUpdate ret;
+ ret.mScrollGeneration = ScrollGeneration::New();
+ ret.mType = ScrollUpdateType::Absolute;
+ ret.mScrollMode = ScrollMode::SmoothMsd;
+ ret.mScrollOrigin = aOrigin;
+ ret.mDestination = CSSPoint::FromAppUnits(aDestination);
+ return ret;
+}
+
+/*static*/
+ScrollPositionUpdate ScrollPositionUpdate::NewPureRelativeScroll(
+ ScrollOrigin aOrigin, ScrollMode aMode, const nsPoint& aDelta) {
+ MOZ_ASSERT(aOrigin != ScrollOrigin::NotSpecified);
+ MOZ_ASSERT(aOrigin != ScrollOrigin::None);
+
+ ScrollPositionUpdate ret;
+ ret.mScrollGeneration = ScrollGeneration::New();
+ ret.mType = ScrollUpdateType::PureRelative;
+ ret.mScrollMode = aMode;
+ ret.mScrollOrigin = aOrigin;
+ ret.mDelta = CSSPoint::FromAppUnits(aDelta);
+ return ret;
+}
+
+bool ScrollPositionUpdate::operator==(
+ const ScrollPositionUpdate& aOther) const {
+ // instances are immutable, and all the fields are set when the generation
+ // is set. So if the generation matches, these instances are identical.
+ return mScrollGeneration == aOther.mScrollGeneration;
+}
+
+ScrollGeneration ScrollPositionUpdate::GetGeneration() const {
+ return mScrollGeneration;
+}
+
+ScrollUpdateType ScrollPositionUpdate::GetType() const { return mType; }
+
+ScrollMode ScrollPositionUpdate::GetMode() const { return mScrollMode; }
+
+ScrollOrigin ScrollPositionUpdate::GetOrigin() const { return mScrollOrigin; }
+
+CSSPoint ScrollPositionUpdate::GetDestination() const {
+ MOZ_ASSERT(mType == ScrollUpdateType::Absolute ||
+ mType == ScrollUpdateType::Relative);
+ return mDestination;
+}
+
+CSSPoint ScrollPositionUpdate::GetSource() const {
+ MOZ_ASSERT(mType == ScrollUpdateType::Relative);
+ return mSource;
+}
+
+CSSPoint ScrollPositionUpdate::GetDelta() const {
+ MOZ_ASSERT(mType == ScrollUpdateType::PureRelative);
+ return mDelta;
+}
+
+std::ostream& operator<<(std::ostream& aStream,
+ const ScrollPositionUpdate& aUpdate) {
+ aStream << "{ gen=" << aUpdate.mScrollGeneration
+ << ", type=" << (int)aUpdate.mType
+ << ", mode=" << (int)aUpdate.mScrollMode
+ << ", origin=" << (int)aUpdate.mScrollOrigin
+ << ", dst=" << aUpdate.mDestination << ", src=" << aUpdate.mSource
+ << ", delta=" << aUpdate.mDelta << " }";
+ return aStream;
+}
+
+} // namespace mozilla