Index: content/browser/android/overscroll_glow.cc |
diff --git a/content/browser/android/overscroll_glow.cc b/content/browser/android/overscroll_glow.cc |
index 6df795a2db2ecb5931fb486041b06d7666984c2d..a5355d4fd9fb606096bb49b10c86e7a36e084ec9 100644 |
--- a/content/browser/android/overscroll_glow.cc |
+++ b/content/browser/android/overscroll_glow.cc |
@@ -77,7 +77,7 @@ gfx::SizeF ComputeSize(OverscrollGlow::Edge edge, |
OverscrollGlow::OverscrollGlow(const EdgeEffectProvider& edge_effect_provider) |
: edge_effect_provider_(edge_effect_provider), |
- enabled_(true), |
+ edge_offsets_(), |
initialized_(false) { |
DCHECK(!edge_effect_provider_.is_null()); |
} |
@@ -86,45 +86,30 @@ OverscrollGlow::~OverscrollGlow() { |
Detach(); |
} |
-void OverscrollGlow::Enable() { |
- enabled_ = true; |
-} |
- |
-void OverscrollGlow::Disable() { |
- if (!enabled_) |
+void OverscrollGlow::Reset() { |
+ if (!initialized_) |
return; |
- enabled_ = false; |
- if (!enabled_ && initialized_) { |
- Detach(); |
- for (size_t i = 0; i < EDGE_COUNT; ++i) |
- edge_effects_[i]->Finish(); |
- } |
+ Detach(); |
+ for (size_t i = 0; i < EDGE_COUNT; ++i) |
+ edge_effects_[i]->Finish(); |
} |
-bool OverscrollGlow::OnOverscrolled(cc::Layer* overscrolling_layer, |
- base::TimeTicks current_time, |
+bool OverscrollGlow::OnOverscrolled(base::TimeTicks current_time, |
gfx::Vector2dF accumulated_overscroll, |
gfx::Vector2dF overscroll_delta, |
gfx::Vector2dF velocity, |
gfx::Vector2dF displacement) { |
- DCHECK(overscrolling_layer); |
- |
- if (!enabled_) |
- return false; |
- |
// The size of the glow determines the relative effect of the inputs; an |
// empty-sized effect is effectively disabled. |
- if (display_params_.size.IsEmpty()) |
+ if (viewport_size_.IsEmpty()) |
return false; |
// Ignore sufficiently small values that won't meaningfuly affect animation. |
overscroll_delta = ZeroSmallComponents(overscroll_delta); |
if (overscroll_delta.IsZero()) { |
- if (initialized_) { |
+ if (initialized_) |
Release(current_time); |
- UpdateLayerAttachment(overscrolling_layer); |
- } |
- return NeedsAnimate(); |
+ return CheckNeedsAnimate(); |
} |
if (!InitializeIfNecessary()) |
@@ -142,45 +127,55 @@ bool OverscrollGlow::OnOverscrolled(cc::Layer* overscrolling_layer, |
else |
Pull(current_time, overscroll_delta, displacement); |
- UpdateLayerAttachment(overscrolling_layer); |
- return NeedsAnimate(); |
+ return CheckNeedsAnimate(); |
} |
-bool OverscrollGlow::Animate(base::TimeTicks current_time) { |
- if (!NeedsAnimate()) { |
- Detach(); |
+bool OverscrollGlow::Animate(base::TimeTicks current_time, |
+ cc::Layer* parent_layer) { |
+ DCHECK(parent_layer); |
+ if (!CheckNeedsAnimate()) |
return false; |
- } |
+ |
+ UpdateLayerAttachment(parent_layer); |
for (size_t i = 0; i < EDGE_COUNT; ++i) { |
if (edge_effects_[i]->Update(current_time)) { |
Edge edge = static_cast<Edge>(i); |
edge_effects_[i]->ApplyToLayers( |
- ComputeSize(edge, display_params_.size), |
- ComputeTransform( |
- edge, display_params_.size, display_params_.edge_offsets[i])); |
+ ComputeSize(edge, viewport_size_), |
+ ComputeTransform(edge, viewport_size_, edge_offsets_[i])); |
} |
} |
- if (!NeedsAnimate()) { |
- Detach(); |
- return false; |
- } |
- |
- return true; |
+ return CheckNeedsAnimate(); |
} |
-void OverscrollGlow::UpdateDisplayParameters(const DisplayParameters& params) { |
- display_params_ = params; |
+void OverscrollGlow::UpdateDisplay( |
+ const gfx::SizeF& viewport_size, |
+ const gfx::SizeF& content_size, |
+ const gfx::Vector2dF& content_scroll_offset) { |
+ viewport_size_ = viewport_size; |
+ edge_offsets_[OverscrollGlow::EDGE_TOP] = -content_scroll_offset.y(); |
+ edge_offsets_[OverscrollGlow::EDGE_LEFT] = -content_scroll_offset.x(); |
+ edge_offsets_[OverscrollGlow::EDGE_BOTTOM] = content_size.height() - |
+ content_scroll_offset.y() - |
+ viewport_size.height(); |
+ edge_offsets_[OverscrollGlow::EDGE_RIGHT] = |
+ content_size.width() - content_scroll_offset.x() - viewport_size.width(); |
} |
-bool OverscrollGlow::NeedsAnimate() const { |
- if (!enabled_ || !initialized_) |
+bool OverscrollGlow::CheckNeedsAnimate() { |
+ if (!initialized_) { |
+ Detach(); |
return false; |
+ } |
+ |
for (size_t i = 0; i < EDGE_COUNT; ++i) { |
if (!edge_effects_[i]->IsFinished()) |
return true; |
} |
+ |
+ Detach(); |
return false; |
} |
@@ -189,10 +184,8 @@ void OverscrollGlow::UpdateLayerAttachment(cc::Layer* parent) { |
if (!root_layer_.get()) |
return; |
- if (!NeedsAnimate()) { |
- Detach(); |
+ if (!CheckNeedsAnimate()) |
return; |
- } |
if (root_layer_->parent() != parent) |
parent->AddChild(root_layer_); |
@@ -207,7 +200,6 @@ void OverscrollGlow::Detach() { |
} |
bool OverscrollGlow::InitializeIfNecessary() { |
- DCHECK(enabled_); |
if (initialized_) |
return true; |
@@ -225,10 +217,11 @@ bool OverscrollGlow::InitializeIfNecessary() { |
void OverscrollGlow::Pull(base::TimeTicks current_time, |
const gfx::Vector2dF& overscroll_delta, |
const gfx::Vector2dF& overscroll_location) { |
- DCHECK(enabled_ && initialized_); |
+ DCHECK(initialized_); |
DCHECK(!overscroll_delta.IsZero()); |
- const float inv_width = 1.f / display_params_.size.width(); |
- const float inv_height = 1.f / display_params_.size.height(); |
+ DCHECK(!viewport_size_.IsEmpty()); |
+ const float inv_width = 1.f / viewport_size_.width(); |
+ const float inv_height = 1.f / viewport_size_.height(); |
gfx::Vector2dF overscroll_pull = |
gfx::ScaleVector2d(overscroll_delta, inv_width, inv_height); |
@@ -264,7 +257,7 @@ void OverscrollGlow::Absorb(base::TimeTicks current_time, |
const gfx::Vector2dF& velocity, |
bool x_overscroll_started, |
bool y_overscroll_started) { |
- DCHECK(enabled_ && initialized_); |
+ DCHECK(initialized_); |
DCHECK(!velocity.IsZero()); |
// Only trigger on initial overscroll at a non-zero velocity |
@@ -295,8 +288,4 @@ EdgeEffectBase* OverscrollGlow::GetOppositeEdge(int edge_index) { |
return edge_effects_[(edge_index + 2) % EDGE_COUNT].get(); |
} |
-OverscrollGlow::DisplayParameters::DisplayParameters() { |
- edge_offsets[0] = edge_offsets[1] = edge_offsets[2] = edge_offsets[3] = 0.f; |
-} |
- |
} // namespace content |