| Index: content/browser/android/overscroll_glow.cc
|
| diff --git a/content/browser/android/overscroll_glow.cc b/content/browser/android/overscroll_glow.cc
|
| deleted file mode 100644
|
| index edebea9e9e47fb96805bbd581160f4522fe3bd06..0000000000000000000000000000000000000000
|
| --- a/content/browser/android/overscroll_glow.cc
|
| +++ /dev/null
|
| @@ -1,279 +0,0 @@
|
| -// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "content/browser/android/overscroll_glow.h"
|
| -
|
| -#include "cc/layers/layer.h"
|
| -#include "content/browser/android/edge_effect_base.h"
|
| -#include "content/public/browser/android/compositor.h"
|
| -
|
| -using std::max;
|
| -using std::min;
|
| -
|
| -namespace content {
|
| -
|
| -namespace {
|
| -
|
| -const float kEpsilon = 1e-3f;
|
| -
|
| -bool IsApproxZero(float value) {
|
| - return std::abs(value) < kEpsilon;
|
| -}
|
| -
|
| -gfx::Vector2dF ZeroSmallComponents(gfx::Vector2dF vector) {
|
| - if (IsApproxZero(vector.x()))
|
| - vector.set_x(0);
|
| - if (IsApproxZero(vector.y()))
|
| - vector.set_y(0);
|
| - return vector;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -OverscrollGlow::OverscrollGlow(OverscrollGlowClient* client)
|
| - : client_(client),
|
| - edge_offsets_(),
|
| - initialized_(false),
|
| - allow_horizontal_overscroll_(true),
|
| - allow_vertical_overscroll_(true) {
|
| - DCHECK(client);
|
| -}
|
| -
|
| -OverscrollGlow::~OverscrollGlow() {
|
| - Detach();
|
| -}
|
| -
|
| -void OverscrollGlow::Reset() {
|
| - if (!initialized_)
|
| - return;
|
| - Detach();
|
| - for (size_t i = 0; i < EDGE_COUNT; ++i)
|
| - edge_effects_[i]->Finish();
|
| -}
|
| -
|
| -bool OverscrollGlow::IsActive() const {
|
| - if (!initialized_)
|
| - return false;
|
| - for (size_t i = 0; i < EDGE_COUNT; ++i) {
|
| - if (!edge_effects_[i]->IsFinished())
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -float OverscrollGlow::GetVisibleAlpha() const {
|
| - float max_alpha = 0;
|
| - for (size_t i = 0; i < EDGE_COUNT; ++i) {
|
| - if (!edge_effects_[i]->IsFinished())
|
| - max_alpha = std::max(max_alpha, edge_effects_[i]->GetAlpha());
|
| - }
|
| - return std::min(max_alpha, 1.f);
|
| -}
|
| -
|
| -bool OverscrollGlow::OnOverscrolled(base::TimeTicks current_time,
|
| - const gfx::Vector2dF& accumulated_overscroll,
|
| - gfx::Vector2dF overscroll_delta,
|
| - gfx::Vector2dF velocity,
|
| - const gfx::Vector2dF& overscroll_location) {
|
| - // The size of the glow determines the relative effect of the inputs; an
|
| - // empty-sized effect is effectively disabled.
|
| - if (viewport_size_.IsEmpty())
|
| - return false;
|
| -
|
| - if (!allow_horizontal_overscroll_) {
|
| - overscroll_delta.set_x(0);
|
| - velocity.set_x(0);
|
| - }
|
| - if (!allow_vertical_overscroll_) {
|
| - overscroll_delta.set_y(0);
|
| - velocity.set_y(0);
|
| - }
|
| -
|
| - // Ignore sufficiently small values that won't meaningfuly affect animation.
|
| - overscroll_delta = ZeroSmallComponents(overscroll_delta);
|
| - if (overscroll_delta.IsZero()) {
|
| - if (initialized_)
|
| - Release(current_time);
|
| - return CheckNeedsAnimate();
|
| - }
|
| -
|
| - if (!InitializeIfNecessary())
|
| - return false;
|
| -
|
| - gfx::Vector2dF old_overscroll = accumulated_overscroll - overscroll_delta;
|
| - bool x_overscroll_started =
|
| - !IsApproxZero(overscroll_delta.x()) && IsApproxZero(old_overscroll.x());
|
| - bool y_overscroll_started =
|
| - !IsApproxZero(overscroll_delta.y()) && IsApproxZero(old_overscroll.y());
|
| -
|
| - velocity = ZeroSmallComponents(velocity);
|
| - if (!velocity.IsZero())
|
| - Absorb(current_time, velocity, x_overscroll_started, y_overscroll_started);
|
| - else
|
| - Pull(current_time, overscroll_delta, overscroll_location);
|
| -
|
| - return CheckNeedsAnimate();
|
| -}
|
| -
|
| -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)) {
|
| - EdgeEffectBase::Edge edge = static_cast<EdgeEffectBase::Edge>(i);
|
| - edge_effects_[i]->ApplyToLayers(edge, viewport_size_, edge_offsets_[i]);
|
| - }
|
| - }
|
| -
|
| - return CheckNeedsAnimate();
|
| -}
|
| -
|
| -void OverscrollGlow::OnFrameUpdated(
|
| - const gfx::SizeF& viewport_size,
|
| - const gfx::SizeF& content_size,
|
| - const gfx::Vector2dF& content_scroll_offset) {
|
| - viewport_size_ = viewport_size;
|
| - edge_offsets_[EdgeEffectBase::EDGE_TOP] = -content_scroll_offset.y();
|
| - edge_offsets_[EdgeEffectBase::EDGE_LEFT] = -content_scroll_offset.x();
|
| - edge_offsets_[EdgeEffectBase::EDGE_BOTTOM] = content_size.height() -
|
| - content_scroll_offset.y() -
|
| - viewport_size.height();
|
| - edge_offsets_[EdgeEffectBase::EDGE_RIGHT] =
|
| - content_size.width() - content_scroll_offset.x() - viewport_size.width();
|
| -
|
| - // Only allow overscroll on scrollable axes, matching platform behavior.
|
| - allow_horizontal_overscroll_ =
|
| - std::ceil(viewport_size_.width()) < std::floor(content_size.width());
|
| - allow_vertical_overscroll_ =
|
| - std::ceil(viewport_size_.height()) < std::floor(content_size.height());
|
| -}
|
| -
|
| -bool OverscrollGlow::CheckNeedsAnimate() {
|
| - if (!initialized_) {
|
| - Detach();
|
| - return false;
|
| - }
|
| -
|
| - if (IsActive())
|
| - return true;
|
| -
|
| - Detach();
|
| - return false;
|
| -}
|
| -
|
| -void OverscrollGlow::UpdateLayerAttachment(cc::Layer* parent) {
|
| - DCHECK(parent);
|
| - if (!root_layer_.get())
|
| - return;
|
| -
|
| - if (!CheckNeedsAnimate())
|
| - return;
|
| -
|
| - if (root_layer_->parent() != parent)
|
| - parent->AddChild(root_layer_);
|
| -
|
| - for (size_t i = 0; i < EDGE_COUNT; ++i)
|
| - edge_effects_[i]->SetParent(root_layer_.get());
|
| -}
|
| -
|
| -void OverscrollGlow::Detach() {
|
| - if (root_layer_.get())
|
| - root_layer_->RemoveFromParent();
|
| -}
|
| -
|
| -bool OverscrollGlow::InitializeIfNecessary() {
|
| - if (initialized_)
|
| - return true;
|
| -
|
| - DCHECK(!root_layer_.get());
|
| - root_layer_ = cc::Layer::Create(Compositor::LayerSettings());
|
| - for (size_t i = 0; i < EDGE_COUNT; ++i) {
|
| - edge_effects_[i] = client_->CreateEdgeEffect();
|
| - DCHECK(edge_effects_[i]);
|
| - }
|
| -
|
| - initialized_ = true;
|
| - return true;
|
| -}
|
| -
|
| -void OverscrollGlow::Pull(base::TimeTicks current_time,
|
| - const gfx::Vector2dF& overscroll_delta,
|
| - const gfx::Vector2dF& overscroll_location) {
|
| - DCHECK(initialized_);
|
| - DCHECK(!overscroll_delta.IsZero());
|
| - 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);
|
| - const float edge_pull[EDGE_COUNT] = {
|
| - min(overscroll_pull.y(), 0.f), // Top
|
| - min(overscroll_pull.x(), 0.f), // Left
|
| - max(overscroll_pull.y(), 0.f), // Bottom
|
| - max(overscroll_pull.x(), 0.f) // Right
|
| - };
|
| -
|
| - gfx::Vector2dF displacement =
|
| - gfx::ScaleVector2d(overscroll_location, inv_width, inv_height);
|
| - displacement.set_x(max(0.f, min(1.f, displacement.x())));
|
| - displacement.set_y(max(0.f, min(1.f, displacement.y())));
|
| - const float edge_displacement[EDGE_COUNT] = {
|
| - 1.f - displacement.x(), // Top
|
| - displacement.y(), // Left
|
| - displacement.x(), // Bottom
|
| - 1.f - displacement.y() // Right
|
| - };
|
| -
|
| - for (size_t i = 0; i < EDGE_COUNT; ++i) {
|
| - if (!edge_pull[i])
|
| - continue;
|
| -
|
| - edge_effects_[i]->Pull(
|
| - current_time, std::abs(edge_pull[i]), edge_displacement[i]);
|
| - GetOppositeEdge(i)->Release(current_time);
|
| - }
|
| -}
|
| -
|
| -void OverscrollGlow::Absorb(base::TimeTicks current_time,
|
| - const gfx::Vector2dF& velocity,
|
| - bool x_overscroll_started,
|
| - bool y_overscroll_started) {
|
| - DCHECK(initialized_);
|
| - DCHECK(!velocity.IsZero());
|
| -
|
| - // Only trigger on initial overscroll at a non-zero velocity
|
| - const float overscroll_velocities[EDGE_COUNT] = {
|
| - y_overscroll_started ? min(velocity.y(), 0.f) : 0, // Top
|
| - x_overscroll_started ? min(velocity.x(), 0.f) : 0, // Left
|
| - y_overscroll_started ? max(velocity.y(), 0.f) : 0, // Bottom
|
| - x_overscroll_started ? max(velocity.x(), 0.f) : 0 // Right
|
| - };
|
| -
|
| - for (size_t i = 0; i < EDGE_COUNT; ++i) {
|
| - if (!overscroll_velocities[i])
|
| - continue;
|
| -
|
| - edge_effects_[i]->Absorb(current_time, std::abs(overscroll_velocities[i]));
|
| - GetOppositeEdge(i)->Release(current_time);
|
| - }
|
| -}
|
| -
|
| -void OverscrollGlow::Release(base::TimeTicks current_time) {
|
| - DCHECK(initialized_);
|
| - for (size_t i = 0; i < EDGE_COUNT; ++i)
|
| - edge_effects_[i]->Release(current_time);
|
| -}
|
| -
|
| -EdgeEffectBase* OverscrollGlow::GetOppositeEdge(int edge_index) {
|
| - DCHECK(initialized_);
|
| - return edge_effects_[(edge_index + 2) % EDGE_COUNT].get();
|
| -}
|
| -
|
| -} // namespace content
|
|
|