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)); |