Chromium Code Reviews| Index: content/browser/android/overscroll_glow.cc |
| diff --git a/content/browser/android/overscroll_glow.cc b/content/browser/android/overscroll_glow.cc |
| index fb491f3ebaacfbd5b4364601e56e10de80b23dbb..715f0f77f1bb9193487663430aa591daf93ae82d 100644 |
| --- a/content/browser/android/overscroll_glow.cc |
| +++ b/content/browser/android/overscroll_glow.cc |
| @@ -6,11 +6,11 @@ |
| #include "base/debug/trace_event.h" |
| #include "base/lazy_instance.h" |
| -#include "base/threading/worker_pool.h" |
| -#include "cc/layers/image_layer.h" |
| +#include "cc/layers/ui_resource_layer.h" |
| #include "content/browser/android/edge_effect.h" |
| -#include "skia/ext/image_operations.h" |
| -#include "ui/gfx/android/java_bitmap.h" |
| +#include "ui/base/android/system_ui_resource.h" |
| +#include "ui/base/android/system_ui_resource_layer.h" |
| +#include "ui/base/android/system_ui_resource_manager.h" |
| using std::max; |
| using std::min; |
| @@ -20,57 +20,9 @@ namespace content { |
| namespace { |
| const float kEpsilon = 1e-3f; |
| -const int kScaledEdgeHeight = 12; |
| -const int kScaledGlowHeight = 64; |
| const float kEdgeHeightAtMdpi = 12.f; |
| const float kGlowHeightAtMdpi = 128.f; |
| -SkBitmap CreateSkBitmapFromAndroidResource(const char* name, gfx::Size size) { |
| - base::android::ScopedJavaLocalRef<jobject> jobj = |
| - gfx::CreateJavaBitmapFromAndroidResource(name, size); |
| - if (jobj.is_null()) |
| - return SkBitmap(); |
| - |
| - SkBitmap bitmap = CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(jobj.obj())); |
| - if (bitmap.isNull()) |
| - return bitmap; |
| - |
| - return skia::ImageOperations::Resize( |
| - bitmap, skia::ImageOperations::RESIZE_BOX, size.width(), size.height()); |
| -} |
| - |
| -class OverscrollResources { |
| - public: |
| - OverscrollResources() { |
| - TRACE_EVENT0("browser", "OverscrollResources::Create"); |
| - edge_bitmap_ = |
| - CreateSkBitmapFromAndroidResource("android:drawable/overscroll_edge", |
| - gfx::Size(128, kScaledEdgeHeight)); |
| - glow_bitmap_ = |
| - CreateSkBitmapFromAndroidResource("android:drawable/overscroll_glow", |
| - gfx::Size(128, kScaledGlowHeight)); |
| - } |
| - |
| - const SkBitmap& edge_bitmap() const { return edge_bitmap_; } |
| - const SkBitmap& glow_bitmap() const { return glow_bitmap_; } |
| - |
| - private: |
| - SkBitmap edge_bitmap_; |
| - SkBitmap glow_bitmap_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(OverscrollResources); |
| -}; |
| - |
| -// Leaky to allow access from a worker thread. |
| -base::LazyInstance<OverscrollResources>::Leaky g_overscroll_resources = |
| - LAZY_INSTANCE_INITIALIZER; |
| - |
| -scoped_refptr<cc::Layer> CreateImageLayer(const SkBitmap& bitmap) { |
| - scoped_refptr<cc::ImageLayer> layer = cc::ImageLayer::Create(); |
| - layer->SetBitmap(bitmap); |
| - return layer; |
| -} |
| - |
| bool IsApproxZero(float value) { |
| return std::abs(value) < kEpsilon; |
| } |
| @@ -83,25 +35,56 @@ gfx::Vector2dF ZeroSmallComponents(gfx::Vector2dF vector) { |
| return vector; |
| } |
| -// Force loading of any necessary resources. This function is thread-safe. |
| -void EnsureResources() { |
| - g_overscroll_resources.Get(); |
| -} |
| +class OverscrollGlowLayer : public ui::SystemUIResourceLayer, |
| + public OverscrollGlowLayerWrapper { |
| + public: |
| + static scoped_ptr<OverscrollGlowLayer> Create( |
| + ui::SystemUIResource::Type type, |
| + ui::SystemUIResourceManager* resource_manager) { |
| + return make_scoped_ptr(new OverscrollGlowLayer(type, resource_manager)); |
| + } |
| + |
| + // ui::SystemUIResourceLayer implementation |
| + virtual void SetUIResourceId(cc::UIResourceId id) OVERRIDE { |
| + ui_resource_layer_->SetUIResourceId(id); |
| + } |
| + |
| + // OverscrollGlowLayerWrapper implementation |
| + virtual scoped_refptr<cc::Layer> layer() OVERRIDE { |
| + return ui_resource_layer_; |
| + } |
| -} // namespace |
| + virtual ~OverscrollGlowLayer() { |
| + resource_manager_->Unsubscribe(type_, this); |
| + ui_resource_layer_->RemoveFromParent(); |
| + } |
| + |
| + private: |
| + OverscrollGlowLayer(ui::SystemUIResource::Type type, |
| + ui::SystemUIResourceManager* resource_manager) |
| + : ui_resource_layer_(cc::UIResourceLayer::Create()), |
| + type_(type), |
| + resource_manager_(resource_manager) { |
| + resource_manager_->Subscribe(type_, this); |
| + } |
| -scoped_ptr<OverscrollGlow> OverscrollGlow::Create(bool enabled) { |
| - // Don't block the main thread with effect resource loading during creation. |
| - // Effect instantiation is deferred until the effect overscrolls, in which |
| - // case the main thread may block until the resource has loaded. |
| - if (enabled && g_overscroll_resources == NULL) |
| - base::WorkerPool::PostTask(FROM_HERE, base::Bind(EnsureResources), true); |
| + scoped_refptr<cc::UIResourceLayer> ui_resource_layer_; |
| + ui::SystemUIResource::Type type_; |
| + ui::SystemUIResourceManager* resource_manager_; |
| - return make_scoped_ptr(new OverscrollGlow(enabled)); |
| + DISALLOW_COPY_AND_ASSIGN(OverscrollGlowLayer); |
| +}; |
| + |
| +} // namespace |
| + |
| +scoped_ptr<OverscrollGlow> OverscrollGlow::Create( |
| + ui::SystemUIResourceManager* resource_manager) { |
| + return make_scoped_ptr(new OverscrollGlow(resource_manager)); |
| } |
| -OverscrollGlow::OverscrollGlow(bool enabled) |
| - : enabled_(enabled), initialized_(false) {} |
| +OverscrollGlow::OverscrollGlow(ui::SystemUIResourceManager* resource_manager) |
| + : enabled_(true), initialized_(false), resource_manager_(resource_manager) { |
| +} |
| OverscrollGlow::~OverscrollGlow() { |
| Detach(); |
| @@ -222,6 +205,13 @@ void OverscrollGlow::UpdateLayerAttachment(cc::Layer* parent) { |
| if (root_layer_->parent() != parent) |
| parent->AddChild(root_layer_); |
| + |
| + // Attempt to attach a valid resource Id to all subscribing layers. Must |
| + // take place after layer attachment. |
| + resource_manager_->RefreshResourceOnSubscribers( |
|
powei
2014/07/12 00:24:47
this the hacky part. We need to call this to upda
jdduke (slow)
2014/07/12 01:01:09
Hmm, yeah I'll think about this.
|
| + ui::SystemUIResource::OVERSCROLL_EDGE); |
| + resource_manager_->RefreshResourceOnSubscribers( |
| + ui::SystemUIResource::OVERSCROLL_GLOW); |
| } |
| void OverscrollGlow::Detach() { |
| @@ -234,21 +224,18 @@ bool OverscrollGlow::InitializeIfNecessary() { |
| if (initialized_) |
| return true; |
| - const SkBitmap& edge = g_overscroll_resources.Get().edge_bitmap(); |
| - const SkBitmap& glow = g_overscroll_resources.Get().glow_bitmap(); |
| - if (edge.isNull() || glow.isNull()) { |
| - Disable(); |
| - return false; |
| - } |
| - |
| DCHECK(!root_layer_); |
| root_layer_ = cc::Layer::Create(); |
| for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) { |
| - scoped_refptr<cc::Layer> edge_layer = CreateImageLayer(edge); |
| - scoped_refptr<cc::Layer> glow_layer = CreateImageLayer(glow); |
| - root_layer_->AddChild(edge_layer); |
| - root_layer_->AddChild(glow_layer); |
| - edge_effects_[i] = make_scoped_ptr(new EdgeEffect(edge_layer, glow_layer)); |
| + scoped_ptr<OverscrollGlowLayer> edge_layer = OverscrollGlowLayer::Create( |
| + ui::SystemUIResource::OVERSCROLL_EDGE, resource_manager_); |
| + scoped_ptr<OverscrollGlowLayer> glow_layer = OverscrollGlowLayer::Create( |
| + ui::SystemUIResource::OVERSCROLL_GLOW, resource_manager_); |
| + root_layer_->AddChild(edge_layer->layer()); |
| + root_layer_->AddChild(glow_layer->layer()); |
| + edge_effects_[i] = make_scoped_ptr( |
| + new EdgeEffect(edge_layer.PassAs<OverscrollGlowLayerWrapper>(), |
| + glow_layer.PassAs<OverscrollGlowLayerWrapper>())); |
| } |
| initialized_ = true; |