Index: ui/events/android/scroller.cc |
diff --git a/ui/gfx/android/scroller.cc b/ui/events/android/scroller.cc |
similarity index 86% |
rename from ui/gfx/android/scroller.cc |
rename to ui/events/android/scroller.cc |
index b9aea380d1ee33660fc8152439b24b48a1cf42d3..17c457b3f740cb7e96a51b4ad1337fde69cc29a6 100644 |
--- a/ui/gfx/android/scroller.cc |
+++ b/ui/events/android/scroller.cc |
@@ -2,13 +2,13 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "ui/gfx/android/scroller.h" |
+#include "ui/events/android/scroller.h" |
#include <cmath> |
#include "base/lazy_instance.h" |
-namespace gfx { |
+namespace ui { |
namespace { |
// Default scroll duration from android.widget.Scroller. |
@@ -122,9 +122,7 @@ struct SplineConstants { |
} |
private: |
- enum { |
- NUM_SAMPLES = 100 |
- }; |
+ enum { NUM_SAMPLES = 100 }; |
float spline_position_[NUM_SAMPLES + 1]; |
float spline_time_[NUM_SAMPLES + 1]; |
@@ -160,8 +158,8 @@ base::LazyInstance<SplineConstants>::Leaky g_spline_constants = |
} // namespace |
Scroller::Config::Config() |
- : fling_friction(kDefaultFriction), |
- flywheel_enabled(false) {} |
+ : fling_friction(kDefaultFriction), flywheel_enabled(false) { |
+} |
Scroller::Scroller(const Config& config) |
: mode_(UNDEFINED), |
@@ -187,9 +185,27 @@ Scroller::Scroller(const Config& config) |
distance_(0), |
fling_friction_(config.fling_friction), |
deceleration_(ComputeDeceleration(fling_friction_)), |
- tuning_coeff_(ComputeDeceleration(0.84f)) {} |
+ tuning_coeff_(ComputeDeceleration(0.84f)) { |
+} |
+ |
+Scroller::~Scroller() { |
+} |
-Scroller::~Scroller() {} |
+bool Scroller::ComputeScrollOffset(base::TimeTicks time, |
+ gfx::Vector2dF* offset, |
+ gfx::Vector2dF* velocity) { |
+ DCHECK(offset); |
+ DCHECK(velocity); |
+ if (!ComputeScrollOffsetInternal(time)) { |
+ *offset = gfx::Vector2dF(GetFinalX(), GetFinalY()); |
+ *velocity = gfx::Vector2dF(); |
+ return false; |
+ } |
+ |
+ *offset = gfx::Vector2dF(GetCurrX(), GetCurrY()); |
+ *velocity = gfx::Vector2dF(GetCurrVelocityX(), GetCurrVelocityY()); |
+ return true; |
+} |
void Scroller::StartScroll(float start_x, |
float start_y, |
@@ -210,6 +226,7 @@ void Scroller::StartScroll(float start_x, |
float dy, |
base::TimeTicks start_time, |
base::TimeDelta duration) { |
+ DCHECK_GT(duration.ToInternalValue(), 0); |
mode_ = SCROLL_MODE; |
finished_ = false; |
duration_ = duration; |
@@ -232,6 +249,8 @@ void Scroller::Fling(float start_x, |
float min_y, |
float max_y, |
base::TimeTicks start_time) { |
+ DCHECK(velocity_x || velocity_y); |
+ |
// Continue a scroll or fling in progress. |
if (flywheel_enabled_ && !finished_) { |
float old_velocity_x = GetCurrVelocityX(); |
@@ -250,6 +269,7 @@ void Scroller::Fling(float start_x, |
velocity_ = velocity; |
duration_ = GetSplineFlingDuration(velocity); |
+ DCHECK_GT(duration_.ToInternalValue(), 0); |
duration_seconds_reciprocal_ = 1.0 / duration_.InSecondsF(); |
start_time_ = start_time; |
curr_time_ = start_time_; |
@@ -276,68 +296,6 @@ void Scroller::Fling(float start_x, |
RecomputeDeltas(); |
} |
-bool Scroller::ComputeScrollOffset(base::TimeTicks time) { |
- if (finished_) |
- return false; |
- |
- if (time == curr_time_) |
- return true; |
- |
- base::TimeDelta time_passed = time - start_time_; |
- |
- if (time_passed < base::TimeDelta()) { |
- time_passed = base::TimeDelta(); |
- } |
- |
- if (time_passed >= duration_) { |
- curr_x_ = final_x_; |
- curr_y_ = final_y_; |
- curr_time_ = start_time_ + duration_; |
- finished_ = true; |
- return true; |
- } |
- |
- curr_time_ = time; |
- |
- const float t = time_passed.InSecondsF() * duration_seconds_reciprocal_; |
- |
- switch (mode_) { |
- case UNDEFINED: |
- NOTREACHED() << "|StartScroll()| or |Fling()| must be called prior to " |
- "scroll offset computation."; |
- return false; |
- |
- case SCROLL_MODE: { |
- float x = g_viscosity_constants.Get().ApplyViscosity(t); |
- |
- curr_x_ = start_x_ + x * delta_x_; |
- curr_y_ = start_y_ + x * delta_y_; |
- } break; |
- |
- case FLING_MODE: { |
- float distance_coef = 1.f; |
- float velocity_coef = 0.f; |
- g_spline_constants.Get().CalculateCoefficients( |
- t, &distance_coef, &velocity_coef); |
- |
- curr_velocity_ = velocity_coef * distance_ * duration_seconds_reciprocal_; |
- |
- curr_x_ = start_x_ + distance_coef * delta_x_; |
- curr_x_ = Clamped(curr_x_, min_x_, max_x_); |
- |
- curr_y_ = start_y_ + distance_coef * delta_y_; |
- curr_y_ = Clamped(curr_y_, min_y_, max_y_); |
- |
- float diff_x = std::abs(curr_x_ - final_x_); |
- float diff_y = std::abs(curr_y_ - final_y_); |
- if (diff_x < kThresholdForFlingEnd && diff_y < kThresholdForFlingEnd) |
- finished_ = true; |
- } break; |
- } |
- |
- return true; |
-} |
- |
void Scroller::ExtendDuration(base::TimeDelta extend) { |
base::TimeDelta passed = GetTimePassed(); |
duration_ = passed + extend; |
@@ -365,19 +323,29 @@ void Scroller::AbortAnimation() { |
finished_ = true; |
} |
-void Scroller::ForceFinished(bool finished) { finished_ = finished; } |
+void Scroller::ForceFinished(bool finished) { |
+ finished_ = finished; |
+} |
-bool Scroller::IsFinished() const { return finished_; } |
+bool Scroller::IsFinished() const { |
+ return finished_; |
+} |
base::TimeDelta Scroller::GetTimePassed() const { |
return curr_time_ - start_time_; |
} |
-base::TimeDelta Scroller::GetDuration() const { return duration_; } |
+base::TimeDelta Scroller::GetDuration() const { |
+ return duration_; |
+} |
-float Scroller::GetCurrX() const { return curr_x_; } |
+float Scroller::GetCurrX() const { |
+ return curr_x_; |
+} |
-float Scroller::GetCurrY() const { return curr_y_; } |
+float Scroller::GetCurrY() const { |
+ return curr_y_; |
+} |
float Scroller::GetCurrVelocity() const { |
if (finished_) |
@@ -395,19 +363,83 @@ float Scroller::GetCurrVelocityY() const { |
return delta_y_norm_ * GetCurrVelocity(); |
} |
-float Scroller::GetStartX() const { return start_x_; } |
+float Scroller::GetStartX() const { |
+ return start_x_; |
+} |
-float Scroller::GetStartY() const { return start_y_; } |
+float Scroller::GetStartY() const { |
+ return start_y_; |
+} |
-float Scroller::GetFinalX() const { return final_x_; } |
+float Scroller::GetFinalX() const { |
+ return final_x_; |
+} |
-float Scroller::GetFinalY() const { return final_y_; } |
+float Scroller::GetFinalY() const { |
+ return final_y_; |
+} |
bool Scroller::IsScrollingInDirection(float xvel, float yvel) const { |
return !finished_ && Signum(xvel) == Signum(delta_x_) && |
Signum(yvel) == Signum(delta_y_); |
} |
+bool Scroller::ComputeScrollOffsetInternal(base::TimeTicks time) { |
+ if (finished_) |
+ return false; |
+ |
+ if (time <= start_time_) |
+ return true; |
+ |
+ if (time == curr_time_) |
+ return true; |
+ |
+ base::TimeDelta time_passed = time - start_time_; |
+ if (time_passed >= duration_) { |
+ AbortAnimation(); |
+ return false; |
+ } |
+ |
+ curr_time_ = time; |
+ |
+ const float u = time_passed.InSecondsF() * duration_seconds_reciprocal_; |
+ switch (mode_) { |
+ case UNDEFINED: |
+ NOTREACHED() << "|StartScroll()| or |Fling()| must be called prior to " |
+ "scroll offset computation."; |
+ return false; |
+ |
+ case SCROLL_MODE: { |
+ float x = g_viscosity_constants.Get().ApplyViscosity(u); |
+ |
+ curr_x_ = start_x_ + x * delta_x_; |
+ curr_y_ = start_y_ + x * delta_y_; |
+ } break; |
+ |
+ case FLING_MODE: { |
+ float distance_coef = 1.f; |
+ float velocity_coef = 0.f; |
+ g_spline_constants.Get().CalculateCoefficients( |
+ u, &distance_coef, &velocity_coef); |
+ |
+ curr_velocity_ = velocity_coef * distance_ * duration_seconds_reciprocal_; |
+ |
+ curr_x_ = start_x_ + distance_coef * delta_x_; |
+ curr_x_ = Clamped(curr_x_, min_x_, max_x_); |
+ |
+ curr_y_ = start_y_ + distance_coef * delta_y_; |
+ curr_y_ = Clamped(curr_y_, min_y_, max_y_); |
+ |
+ float diff_x = std::abs(curr_x_ - final_x_); |
+ float diff_y = std::abs(curr_y_ - final_y_); |
+ if (diff_x < kThresholdForFlingEnd && diff_y < kThresholdForFlingEnd) |
+ AbortAnimation(); |
+ } break; |
+ } |
+ |
+ return !finished_; |
+} |
+ |
void Scroller::RecomputeDeltas() { |
delta_x_ = final_x_ - start_x_; |
delta_y_ = final_y_ - start_y_; |
@@ -441,4 +473,4 @@ double Scroller::GetSplineFlingDistance(float velocity) const { |
std::exp(kDecelerationRate / decel_minus_one * l); |
} |
-} // namespace gfx |
+} // namespace ui |