Index: content/browser/android/composited_touch_handle_drawable.cc |
diff --git a/content/browser/android/composited_touch_handle_drawable.cc b/content/browser/android/composited_touch_handle_drawable.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0bfe37a33afb45fb5df985e06a2b1856f4b56679 |
--- /dev/null |
+++ b/content/browser/android/composited_touch_handle_drawable.cc |
@@ -0,0 +1,150 @@ |
+// Copyright 2014 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/composited_touch_handle_drawable.h" |
+ |
+#include "base/debug/trace_event.h" |
+#include "base/lazy_instance.h" |
+#include "base/logging.h" |
+#include "cc/layers/ui_resource_layer.h" |
+#include "jni/HandleViewResources_jni.h" |
+#include "ui/gfx/android/java_bitmap.h" |
+ |
+namespace content { |
+ |
+namespace { |
+ |
+static SkBitmap CreateSkBitmapFromAndroidResource(int resource_id) { |
+ base::android::ScopedJavaLocalRef<jobject> jobj = |
+ gfx::CreateJavaBitmapFromAndroidResource(resource_id); |
+ if (jobj.is_null()) |
+ return SkBitmap(); |
+ |
+ return CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(jobj.obj())); |
+} |
+ |
+class HandleResources { |
+ public: |
+ HandleResources() { |
+ TRACE_EVENT0("browser", "HandleResources::Create"); |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ jobject context = base::android::GetApplicationContext(); |
+ |
+ left_bitmap_ = CreateSkBitmapFromAndroidResource( |
+ Java_HandleViewResources_getLeftHandleResourceId(env, context)); |
+ right_bitmap_ = CreateSkBitmapFromAndroidResource( |
+ Java_HandleViewResources_getRightHandleResourceId(env, context)); |
+ center_bitmap_ = CreateSkBitmapFromAndroidResource( |
+ Java_HandleViewResources_getCenterHandleResourceId(env, context)); |
+ |
+ left_bitmap_.setImmutable(); |
+ right_bitmap_.setImmutable(); |
+ center_bitmap_.setImmutable(); |
+ } |
+ |
+ const SkBitmap& GetBitmap(TouchHandleOrientation orientation) { |
+ switch (orientation) { |
+ case TOUCH_HANDLE_LEFT: |
+ return left_bitmap_; |
+ case TOUCH_HANDLE_RIGHT: |
+ return right_bitmap_; |
+ case TOUCH_HANDLE_CENTER: |
+ return center_bitmap_; |
+ case TOUCH_HANDLE_ORIENTATION_UNDEFINED: |
+ NOTREACHED() << "Invalid touch handle orientation."; |
+ return center_bitmap_; |
+ }; |
+ } |
+ |
+ private: |
+ SkBitmap left_bitmap_; |
+ SkBitmap right_bitmap_; |
+ SkBitmap center_bitmap_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(HandleResources); |
+}; |
+ |
+base::LazyInstance<HandleResources>::Leaky g_selection_resources; |
+ |
+} // namespace |
+ |
+CompositedTouchHandleDrawable::CompositedTouchHandleDrawable( |
+ cc::Layer* root_layer, |
+ float dpi_scale) |
+ : dpi_scale_(dpi_scale), |
+ orientation_(TOUCH_HANDLE_ORIENTATION_UNDEFINED), |
+ layer_(cc::UIResourceLayer::Create()) { |
+ DCHECK(root_layer); |
+ root_layer->AddChild(layer_.get()); |
+} |
+ |
+CompositedTouchHandleDrawable::~CompositedTouchHandleDrawable() { |
+ Detach(); |
+} |
+ |
+void CompositedTouchHandleDrawable::SetOrientation( |
+ TouchHandleOrientation orientation) { |
+ DCHECK(layer_->parent()); |
+ orientation_ = orientation; |
+ |
+ const SkBitmap& bitmap = g_selection_resources.Get().GetBitmap(orientation); |
+ layer_->SetBitmap(bitmap); |
+ layer_->SetBounds(gfx::Size(bitmap.width(), bitmap.height())); |
+ |
+ switch (orientation_) { |
+ case TOUCH_HANDLE_LEFT: |
+ focal_offset_from_origin_ = gfx::Vector2dF(bitmap.width() * 0.75f, 0); |
+ break; |
+ case TOUCH_HANDLE_RIGHT: |
+ focal_offset_from_origin_ = gfx::Vector2dF(bitmap.width() * 0.25f, 0); |
+ break; |
+ case TOUCH_HANDLE_CENTER: |
+ focal_offset_from_origin_ = gfx::Vector2dF(bitmap.width() * 0.5f, 0); |
+ break; |
+ case TOUCH_HANDLE_ORIENTATION_UNDEFINED: |
+ NOTREACHED() << "Invalid touch handle orientation."; |
+ break; |
+ }; |
+ |
+ layer_->SetPosition(focal_position_ - focal_offset_from_origin_); |
+} |
+ |
+void CompositedTouchHandleDrawable::SetAlpha(float alpha) { |
+ DCHECK(layer_->parent()); |
+ layer_->SetOpacity(std::max(0.f, std::min(1.f, alpha))); |
+} |
+ |
+void CompositedTouchHandleDrawable::SetFocus(const gfx::PointF& position) { |
+ DCHECK(layer_->parent()); |
+ focal_position_ = gfx::ScalePoint(position, dpi_scale_); |
+ layer_->SetPosition(focal_position_ - focal_offset_from_origin_); |
+} |
+ |
+void CompositedTouchHandleDrawable::SetVisible(bool visible) { |
+ DCHECK(layer_->parent()); |
+ layer_->SetIsDrawable(visible); |
+} |
+ |
+bool CompositedTouchHandleDrawable::ContainsPoint( |
+ const gfx::PointF& point) const { |
+ return BoundingRect().Contains(gfx::ScalePoint(point, dpi_scale_)); |
+} |
+ |
+void CompositedTouchHandleDrawable::Detach() { |
+ layer_->RemoveFromParent(); |
+} |
+ |
+gfx::RectF CompositedTouchHandleDrawable::BoundingRect() const { |
+ return gfx::RectF(layer_->position().x(), |
+ layer_->position().y(), |
+ layer_->bounds().width(), |
+ layer_->bounds().height()); |
+} |
+ |
+// static |
+bool CompositedTouchHandleDrawable::RegisterHandleViewResources(JNIEnv* env) { |
+ return RegisterNativesImpl(env); |
+} |
+ |
+} // namespace content |