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..49a053f65443fdad8226cbf40eb7ea46738ff4b7 100644 |
| --- a/content/browser/android/overscroll_glow.cc |
| +++ b/content/browser/android/overscroll_glow.cc |
| @@ -6,10 +6,8 @@ |
| #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" |
| using std::max; |
| @@ -20,57 +18,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( |
|
powei
2014/07/08 19:12:43
I didn't move this over. I thought BitmapHelper.d
jdduke (slow)
2014/07/08 20:10:11
Unfortunately no, if you look at the comments, dec
powei
2014/07/09 20:41:03
This is the only consumer. I can move it to java_
|
| - 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,20 +33,9 @@ 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(); |
| -} |
| - |
| } // namespace |
| 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); |
| - |
| return make_scoped_ptr(new OverscrollGlow(enabled)); |
| } |
| @@ -124,6 +63,8 @@ void OverscrollGlow::Disable() { |
| bool OverscrollGlow::OnOverscrolled(cc::Layer* overscrolling_layer, |
| base::TimeTicks current_time, |
| + cc::UIResourceId edge_ui_resource, |
| + cc::UIResourceId glow_ui_resource, |
| gfx::Vector2dF accumulated_overscroll, |
| gfx::Vector2dF overscroll_delta, |
| gfx::Vector2dF velocity) { |
| @@ -142,7 +83,8 @@ bool OverscrollGlow::OnOverscrolled(cc::Layer* overscrolling_layer, |
| if (overscroll_delta.IsZero()) { |
| if (initialized_) { |
| Release(current_time); |
| - UpdateLayerAttachment(overscrolling_layer); |
| + UpdateLayerAttachment( |
| + overscrolling_layer, edge_ui_resource, glow_ui_resource); |
| } |
| return NeedsAnimate(); |
| } |
| @@ -167,7 +109,9 @@ bool OverscrollGlow::OnOverscrolled(cc::Layer* overscrolling_layer, |
| else |
| Pull(current_time, overscroll_delta); |
| - UpdateLayerAttachment(overscrolling_layer); |
| + UpdateLayerAttachment( |
| + overscrolling_layer, edge_ui_resource, glow_ui_resource); |
| + |
| return NeedsAnimate(); |
| } |
| @@ -210,7 +154,9 @@ bool OverscrollGlow::NeedsAnimate() const { |
| return false; |
| } |
| -void OverscrollGlow::UpdateLayerAttachment(cc::Layer* parent) { |
| +void OverscrollGlow::UpdateLayerAttachment(cc::Layer* parent, |
| + cc::UIResourceId edge_ui_resource, |
| + cc::UIResourceId glow_ui_resource) { |
| DCHECK(parent); |
| if (!root_layer_) |
| return; |
| @@ -222,6 +168,12 @@ void OverscrollGlow::UpdateLayerAttachment(cc::Layer* parent) { |
| if (root_layer_->parent() != parent) |
| parent->AddChild(root_layer_); |
| + |
| + // UIResources addition needs to take place after layer attachment. |
| + for (size_t i = 0; i < EdgeEffect::EDGE_COUNT; ++i) { |
| + if (edge_effects_[i]) |
| + edge_effects_[i]->SetUIResources(edge_ui_resource, glow_ui_resource); |
| + } |
| } |
| void OverscrollGlow::Detach() { |
| @@ -234,18 +186,13 @@ 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); |
| + scoped_refptr<cc::UIResourceLayer> edge_layer = |
| + cc::UIResourceLayer::Create(); |
| + scoped_refptr<cc::UIResourceLayer> glow_layer = |
| + cc::UIResourceLayer::Create(); |
| root_layer_->AddChild(edge_layer); |
| root_layer_->AddChild(glow_layer); |
| edge_effects_[i] = make_scoped_ptr(new EdgeEffect(edge_layer, glow_layer)); |