Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(69)

Unified Diff: content/browser/android/overscroll_glow.cc

Issue 1419123002: android: move overscroll effects to ui/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix exports for component build Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/android/overscroll_glow.h ('k') | content/browser/android/overscroll_refresh.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « content/browser/android/overscroll_glow.h ('k') | content/browser/android/overscroll_refresh.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698