Blink roll 25b6bd3a7a131ffe68d809546ad1a20707915cdc:3a503f41ae42e5b79cfcd2ff10e65afde...
[chromium-blink-merge.git] / content / browser / android / composited_touch_handle_drawable.cc
blob4c37e381c54a709c37846d6845daba9610dbe85a
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/browser/android/composited_touch_handle_drawable.h"
7 #include "base/debug/trace_event.h"
8 #include "base/lazy_instance.h"
9 #include "base/logging.h"
10 #include "cc/layers/ui_resource_layer.h"
11 #include "jni/HandleViewResources_jni.h"
12 #include "ui/gfx/android/java_bitmap.h"
14 namespace content {
16 namespace {
18 static SkBitmap CreateSkBitmapFromJavaBitmap(
19 base::android::ScopedJavaLocalRef<jobject> jbitmap) {
20 return jbitmap.is_null()
21 ? SkBitmap()
22 : CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(jbitmap.obj()));
25 class HandleResources {
26 public:
27 HandleResources() : loaded_(false) {
30 void LoadIfNecessary(jobject context) {
31 if (loaded_)
32 return;
34 loaded_ = true;
36 TRACE_EVENT0("browser", "HandleResources::Create");
37 JNIEnv* env = base::android::AttachCurrentThread();
38 if (!context)
39 context = base::android::GetApplicationContext();
41 left_bitmap_ = CreateSkBitmapFromJavaBitmap(
42 Java_HandleViewResources_getLeftHandleBitmap(env, context));
43 right_bitmap_ = CreateSkBitmapFromJavaBitmap(
44 Java_HandleViewResources_getRightHandleBitmap(env, context));
45 center_bitmap_ = CreateSkBitmapFromJavaBitmap(
46 Java_HandleViewResources_getCenterHandleBitmap(env, context));
48 left_bitmap_.setImmutable();
49 right_bitmap_.setImmutable();
50 center_bitmap_.setImmutable();
53 const SkBitmap& GetBitmap(TouchHandleOrientation orientation) {
54 DCHECK(loaded_);
55 switch (orientation) {
56 case TOUCH_HANDLE_LEFT:
57 return left_bitmap_;
58 case TOUCH_HANDLE_RIGHT:
59 return right_bitmap_;
60 case TOUCH_HANDLE_CENTER:
61 return center_bitmap_;
62 case TOUCH_HANDLE_ORIENTATION_UNDEFINED:
63 NOTREACHED() << "Invalid touch handle orientation.";
65 return center_bitmap_;
68 private:
69 SkBitmap left_bitmap_;
70 SkBitmap right_bitmap_;
71 SkBitmap center_bitmap_;
72 bool loaded_;
74 DISALLOW_COPY_AND_ASSIGN(HandleResources);
77 base::LazyInstance<HandleResources>::Leaky g_selection_resources;
79 } // namespace
81 CompositedTouchHandleDrawable::CompositedTouchHandleDrawable(
82 cc::Layer* root_layer,
83 float dpi_scale,
84 jobject context)
85 : dpi_scale_(dpi_scale),
86 orientation_(TOUCH_HANDLE_ORIENTATION_UNDEFINED),
87 layer_(cc::UIResourceLayer::Create()) {
88 g_selection_resources.Get().LoadIfNecessary(context);
89 DCHECK(root_layer);
90 root_layer->AddChild(layer_.get());
93 CompositedTouchHandleDrawable::~CompositedTouchHandleDrawable() {
94 Detach();
97 void CompositedTouchHandleDrawable::SetEnabled(bool enabled) {
98 layer_->SetIsDrawable(enabled);
101 void CompositedTouchHandleDrawable::SetOrientation(
102 TouchHandleOrientation orientation) {
103 DCHECK(layer_->parent());
104 orientation_ = orientation;
106 const SkBitmap& bitmap = g_selection_resources.Get().GetBitmap(orientation);
107 layer_->SetBitmap(bitmap);
108 layer_->SetBounds(gfx::Size(bitmap.width(), bitmap.height()));
110 switch (orientation_) {
111 case TOUCH_HANDLE_LEFT:
112 focal_offset_from_origin_ = gfx::Vector2dF(bitmap.width() * 0.75f, 0);
113 break;
114 case TOUCH_HANDLE_RIGHT:
115 focal_offset_from_origin_ = gfx::Vector2dF(bitmap.width() * 0.25f, 0);
116 break;
117 case TOUCH_HANDLE_CENTER:
118 focal_offset_from_origin_ = gfx::Vector2dF(bitmap.width() * 0.5f, 0);
119 break;
120 case TOUCH_HANDLE_ORIENTATION_UNDEFINED:
121 NOTREACHED() << "Invalid touch handle orientation.";
122 break;
125 layer_->SetPosition(focal_position_ - focal_offset_from_origin_);
128 void CompositedTouchHandleDrawable::SetAlpha(float alpha) {
129 DCHECK(layer_->parent());
130 alpha = std::max(0.f, std::min(1.f, alpha));
131 bool hidden = alpha <= 0;
132 layer_->SetOpacity(alpha);
133 layer_->SetHideLayerAndSubtree(hidden);
136 void CompositedTouchHandleDrawable::SetFocus(const gfx::PointF& position) {
137 DCHECK(layer_->parent());
138 focal_position_ = gfx::ScalePoint(position, dpi_scale_);
139 layer_->SetPosition(focal_position_ - focal_offset_from_origin_);
142 bool CompositedTouchHandleDrawable::IntersectsWith(
143 const gfx::RectF& rect) const {
144 return BoundingRect().Intersects(gfx::ScaleRect(rect, dpi_scale_));
147 void CompositedTouchHandleDrawable::Detach() {
148 layer_->RemoveFromParent();
151 gfx::RectF CompositedTouchHandleDrawable::BoundingRect() const {
152 return gfx::RectF(layer_->position().x(),
153 layer_->position().y(),
154 layer_->bounds().width(),
155 layer_->bounds().height());
158 // static
159 bool CompositedTouchHandleDrawable::RegisterHandleViewResources(JNIEnv* env) {
160 return RegisterNativesImpl(env);
163 } // namespace content