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

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

Issue 377013002: android: Use UIResource for overscroll glow (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addressed comments Created 6 years, 5 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
Index: content/browser/android/edge_effect.cc
diff --git a/content/browser/android/edge_effect.cc b/content/browser/android/edge_effect.cc
index 94e5b512e20505bf5ad12c59f9258e88f9fa41b1..992a129cabdde61df04939c46d4e2bf21b774576 100644
--- a/content/browser/android/edge_effect.cc
+++ b/content/browser/android/edge_effect.cc
@@ -5,6 +5,9 @@
#include "content/browser/android/edge_effect.h"
#include "cc/layers/layer.h"
+#include "cc/layers/ui_resource_layer.h"
+#include "ui/base/android/system_ui_resource_layer.h"
+#include "ui/base/android/system_ui_resource_manager.h"
namespace content {
@@ -141,29 +144,75 @@ void UpdateLayer(cc::Layer* layer,
layer->SetOpacity(Clamp(opacity, 0.f, 1.f));
}
-} // namespace
-
-EdgeEffect::EdgeEffect(scoped_refptr<cc::Layer> edge,
- scoped_refptr<cc::Layer> glow)
- : edge_(edge)
- , glow_(glow)
- , edge_alpha_(0)
- , edge_scale_y_(0)
- , glow_alpha_(0)
- , glow_scale_y_(0)
- , edge_alpha_start_(0)
- , edge_alpha_finish_(0)
- , edge_scale_y_start_(0)
- , edge_scale_y_finish_(0)
- , glow_alpha_start_(0)
- , glow_alpha_finish_(0)
- , glow_scale_y_start_(0)
- , glow_scale_y_finish_(0)
- , state_(STATE_IDLE)
- , pull_distance_(0) {
+} // namespace
+
+class EdgeEffect::EffectLayer : public ui::SystemUIResourceLayer {
+ public:
+ static scoped_ptr<EffectLayer> Create(
+ ui::SystemUIResourceManager::Type type,
+ ui::SystemUIResourceManager* resource_manager) {
+ return make_scoped_ptr(new EffectLayer(type, resource_manager));
+ }
+
+ virtual ~EffectLayer() {
+ resource_manager_->Unsubscribe(type_, this);
+ ui_resource_layer_->RemoveFromParent();
+ }
+
+ // ui::SystemUIResourceLayer implementation.
+ virtual void SetUIResourceId(cc::UIResourceId id) OVERRIDE {
+ ui_resource_id_ = id;
+ ui_resource_layer_->SetUIResourceId(id);
+ }
+
+ cc::Layer* layer() { return ui_resource_layer_.get(); }
+
+ void SetParent(cc::Layer* parent) {
+ if (ui_resource_layer_->parent() != parent)
+ parent->AddChild(ui_resource_layer_);
jdduke (slow) 2014/07/28 20:45:38 Do we need a null check on |parent|? Otherwise we
+ ui_resource_layer_->SetUIResourceId(ui_resource_id_);
+ }
+
+ private:
+ EffectLayer(ui::SystemUIResourceManager::Type type,
+ ui::SystemUIResourceManager* resource_manager)
+ : ui_resource_id_(0),
+ ui_resource_layer_(cc::UIResourceLayer::Create()),
+ type_(type),
+ resource_manager_(resource_manager) {
+ resource_manager_->Subscribe(type_, this);
+ }
+
+ cc::UIResourceId ui_resource_id_;
+ scoped_refptr<cc::UIResourceLayer> ui_resource_layer_;
+ ui::SystemUIResourceManager::Type type_;
+ ui::SystemUIResourceManager* resource_manager_;
+
+ DISALLOW_COPY_AND_ASSIGN(EffectLayer);
+};
+
+EdgeEffect::EdgeEffect(ui::SystemUIResourceManager* resource_manager)
+ : edge_alpha_(0),
+ edge_scale_y_(0),
+ glow_alpha_(0),
+ glow_scale_y_(0),
+ edge_alpha_start_(0),
+ edge_alpha_finish_(0),
+ edge_scale_y_start_(0),
+ edge_scale_y_finish_(0),
+ glow_alpha_start_(0),
+ glow_alpha_finish_(0),
+ glow_scale_y_start_(0),
+ glow_scale_y_finish_(0),
+ state_(STATE_IDLE),
+ pull_distance_(0) {
+ edge_ = EffectLayer::Create(ui::SystemUIResourceManager::OVERSCROLL_EDGE,
+ resource_manager);
+ glow_ = EffectLayer::Create(ui::SystemUIResourceManager::OVERSCROLL_GLOW,
+ resource_manager);
// Prevent the provided layers from drawing until the effect is activated.
- DisableLayer(edge_.get());
- DisableLayer(glow_.get());
+ DisableLayer(edge_->layer());
+ DisableLayer(glow_->layer());
}
EdgeEffect::~EdgeEffect() { }
@@ -173,8 +222,8 @@ bool EdgeEffect::IsFinished() const {
}
void EdgeEffect::Finish() {
- DisableLayer(edge_.get());
- DisableLayer(glow_.get());
+ DisableLayer(edge_->layer());
+ DisableLayer(glow_->layer());
pull_distance_ = 0;
state_ = STATE_IDLE;
}
@@ -359,8 +408,8 @@ void EdgeEffect::ApplyToLayers(gfx::SizeF window_size,
// An empty window size, while meaningless, is also relatively harmless, and
// will simply prevent any drawing of the layers.
if (window_size.IsEmpty()) {
- DisableLayer(edge_.get());
- DisableLayer(glow_.get());
+ DisableLayer(edge_->layer());
+ DisableLayer(glow_->layer());
return;
}
@@ -368,13 +417,26 @@ void EdgeEffect::ApplyToLayers(gfx::SizeF window_size,
const int scaled_glow_height = static_cast<int>(
std::min(glow_height * glow_scale_y_ * kGlowHeightToWidthRatio * 0.6f,
glow_height * kMaxGlowHeight) + 0.5f);
- UpdateLayer(
- glow_.get(), edge, window_size, offset, scaled_glow_height, glow_alpha_);
+ UpdateLayer(glow_->layer(),
+ edge,
+ window_size,
+ offset,
+ scaled_glow_height,
+ glow_alpha_);
// Edge
- const int scaled_edge_height = static_cast<int>(edge_height * edge_scale_y_);
- UpdateLayer(
- edge_.get(), edge, window_size, offset, scaled_edge_height, edge_alpha_);
+ const int scaled_edge_height = static_cast<int>(edge_height * edge_scale_y_);
+ UpdateLayer(edge_->layer(),
+ edge,
+ window_size,
+ offset,
+ scaled_edge_height,
+ edge_alpha_);
+}
+
+void EdgeEffect::SetParent(cc::Layer* parent) {
+ edge_->SetParent(parent);
+ glow_->SetParent(parent);
}
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698