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