1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5 #include "ScrollPositionUpdate.h"
6
7 #include <ostream>
8
9 #include "mozilla/Assertions.h"
10
11 namespace mozilla {
12
13 uint64_t ScrollGeneration::sCounter = 0;
14
New()15 ScrollGeneration ScrollGeneration::New() {
16 uint64_t value = ++sCounter;
17 return ScrollGeneration(value);
18 }
19
ScrollGeneration()20 ScrollGeneration::ScrollGeneration() : mValue(0) {}
21
ScrollGeneration(uint64_t aValue)22 ScrollGeneration::ScrollGeneration(uint64_t aValue) : mValue(aValue) {}
23
operator <(const ScrollGeneration & aOther) const24 bool ScrollGeneration::operator<(const ScrollGeneration& aOther) const {
25 return mValue < aOther.mValue;
26 }
27
operator ==(const ScrollGeneration & aOther) const28 bool ScrollGeneration::operator==(const ScrollGeneration& aOther) const {
29 return mValue == aOther.mValue;
30 }
31
operator !=(const ScrollGeneration & aOther) const32 bool ScrollGeneration::operator!=(const ScrollGeneration& aOther) const {
33 return !(*this == aOther);
34 }
35
operator <<(std::ostream & aStream,const ScrollGeneration & aGen)36 std::ostream& operator<<(std::ostream& aStream, const ScrollGeneration& aGen) {
37 return aStream << aGen.mValue;
38 }
39
ScrollPositionUpdate()40 ScrollPositionUpdate::ScrollPositionUpdate()
41 : mType(ScrollUpdateType::Absolute),
42 mScrollMode(ScrollMode::Normal),
43 mScrollOrigin(ScrollOrigin::None) {}
44
45 /*static*/
NewScrollframe(nsPoint aInitialPosition)46 ScrollPositionUpdate ScrollPositionUpdate::NewScrollframe(
47 nsPoint aInitialPosition) {
48 ScrollPositionUpdate ret;
49 ret.mScrollGeneration = ScrollGeneration::New();
50 ret.mScrollMode = ScrollMode::Instant;
51 ret.mDestination = CSSPoint::FromAppUnits(aInitialPosition);
52 return ret;
53 }
54
55 /*static*/
NewScroll(ScrollOrigin aOrigin,nsPoint aDestination)56 ScrollPositionUpdate ScrollPositionUpdate::NewScroll(ScrollOrigin aOrigin,
57 nsPoint aDestination) {
58 MOZ_ASSERT(aOrigin != ScrollOrigin::NotSpecified);
59 MOZ_ASSERT(aOrigin != ScrollOrigin::None);
60
61 ScrollPositionUpdate ret;
62 ret.mScrollGeneration = ScrollGeneration::New();
63 ret.mType = ScrollUpdateType::Absolute;
64 ret.mScrollMode = ScrollMode::Instant;
65 ret.mScrollOrigin = aOrigin;
66 ret.mDestination = CSSPoint::FromAppUnits(aDestination);
67 return ret;
68 }
69
70 /*static*/
NewRelativeScroll(nsPoint aSource,nsPoint aDestination)71 ScrollPositionUpdate ScrollPositionUpdate::NewRelativeScroll(
72 nsPoint aSource, nsPoint aDestination) {
73 ScrollPositionUpdate ret;
74 ret.mScrollGeneration = ScrollGeneration::New();
75 ret.mType = ScrollUpdateType::Relative;
76 ret.mScrollMode = ScrollMode::Instant;
77 ret.mScrollOrigin = ScrollOrigin::Relative;
78 ret.mDestination = CSSPoint::FromAppUnits(aDestination);
79 ret.mSource = CSSPoint::FromAppUnits(aSource);
80 return ret;
81 }
82
83 /*static*/
NewSmoothScroll(ScrollOrigin aOrigin,nsPoint aDestination)84 ScrollPositionUpdate ScrollPositionUpdate::NewSmoothScroll(
85 ScrollOrigin aOrigin, nsPoint aDestination) {
86 MOZ_ASSERT(aOrigin != ScrollOrigin::NotSpecified);
87 MOZ_ASSERT(aOrigin != ScrollOrigin::None);
88
89 ScrollPositionUpdate ret;
90 ret.mScrollGeneration = ScrollGeneration::New();
91 ret.mType = ScrollUpdateType::Absolute;
92 ret.mScrollMode = ScrollMode::SmoothMsd;
93 ret.mScrollOrigin = aOrigin;
94 ret.mDestination = CSSPoint::FromAppUnits(aDestination);
95 return ret;
96 }
97
98 /*static*/
NewPureRelativeScroll(ScrollOrigin aOrigin,ScrollMode aMode,const nsPoint & aDelta)99 ScrollPositionUpdate ScrollPositionUpdate::NewPureRelativeScroll(
100 ScrollOrigin aOrigin, ScrollMode aMode, const nsPoint& aDelta) {
101 MOZ_ASSERT(aOrigin != ScrollOrigin::NotSpecified);
102 MOZ_ASSERT(aOrigin != ScrollOrigin::None);
103
104 ScrollPositionUpdate ret;
105 ret.mScrollGeneration = ScrollGeneration::New();
106 ret.mType = ScrollUpdateType::PureRelative;
107 ret.mScrollMode = aMode;
108 ret.mScrollOrigin = aOrigin;
109 ret.mDelta = CSSPoint::FromAppUnits(aDelta);
110 return ret;
111 }
112
operator ==(const ScrollPositionUpdate & aOther) const113 bool ScrollPositionUpdate::operator==(
114 const ScrollPositionUpdate& aOther) const {
115 // instances are immutable, and all the fields are set when the generation
116 // is set. So if the generation matches, these instances are identical.
117 return mScrollGeneration == aOther.mScrollGeneration;
118 }
119
GetGeneration() const120 ScrollGeneration ScrollPositionUpdate::GetGeneration() const {
121 return mScrollGeneration;
122 }
123
GetType() const124 ScrollUpdateType ScrollPositionUpdate::GetType() const { return mType; }
125
GetMode() const126 ScrollMode ScrollPositionUpdate::GetMode() const { return mScrollMode; }
127
GetOrigin() const128 ScrollOrigin ScrollPositionUpdate::GetOrigin() const { return mScrollOrigin; }
129
GetDestination() const130 CSSPoint ScrollPositionUpdate::GetDestination() const {
131 MOZ_ASSERT(mType == ScrollUpdateType::Absolute ||
132 mType == ScrollUpdateType::Relative);
133 return mDestination;
134 }
135
GetSource() const136 CSSPoint ScrollPositionUpdate::GetSource() const {
137 MOZ_ASSERT(mType == ScrollUpdateType::Relative);
138 return mSource;
139 }
140
GetDelta() const141 CSSPoint ScrollPositionUpdate::GetDelta() const {
142 MOZ_ASSERT(mType == ScrollUpdateType::PureRelative);
143 return mDelta;
144 }
145
operator <<(std::ostream & aStream,const ScrollPositionUpdate & aUpdate)146 std::ostream& operator<<(std::ostream& aStream,
147 const ScrollPositionUpdate& aUpdate) {
148 aStream << "{ gen=" << aUpdate.mScrollGeneration
149 << ", type=" << (int)aUpdate.mType
150 << ", mode=" << (int)aUpdate.mScrollMode
151 << ", origin=" << (int)aUpdate.mScrollOrigin
152 << ", dst=" << aUpdate.mDestination << ", src=" << aUpdate.mSource
153 << ", delta=" << aUpdate.mDelta << " }";
154 return aStream;
155 }
156
157 } // namespace mozilla
158