Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(282)

Side by Side Diff: content/browser/android/composited_touch_handle_drawable.cc

Issue 335943002: [Android] Composited selection handle rendering (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@input_native_handles_final
Patch Set: Clean up paste popup interaction Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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.
4
5 #include "content/browser/android/composited_touch_handle_drawable.h"
6
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"
13
14 namespace content {
15
16 namespace {
17
18 static SkBitmap CreateSkBitmapFromAndroidResource(int resource_id) {
19 base::android::ScopedJavaLocalRef<jobject> jobj =
20 gfx::CreateJavaBitmapFromAndroidResource(resource_id);
21 if (jobj.is_null())
22 return SkBitmap();
23
24 return CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(jobj.obj()));
25 }
26
27 class HandleResources {
28 public:
29 HandleResources() {
30 TRACE_EVENT0("browser", "HandleResources::Create");
31 JNIEnv* env = base::android::AttachCurrentThread();
32 jobject context = base::android::GetApplicationContext();
33
34 left_bitmap_ = CreateSkBitmapFromAndroidResource(
35 Java_HandleViewResources_getLeftHandleResourceId(env, context));
36 right_bitmap_ = CreateSkBitmapFromAndroidResource(
37 Java_HandleViewResources_getRightHandleResourceId(env, context));
38 center_bitmap_ = CreateSkBitmapFromAndroidResource(
39 Java_HandleViewResources_getCenterHandleResourceId(env, context));
40
41 left_bitmap_.setImmutable();
42 right_bitmap_.setImmutable();
43 center_bitmap_.setImmutable();
44 }
45
46 const SkBitmap& GetBitmap(TouchHandleOrientation orientation) {
47 switch (orientation) {
48 case TOUCH_HANDLE_LEFT:
49 return left_bitmap_;
50 case TOUCH_HANDLE_RIGHT:
51 return right_bitmap_;
52 case TOUCH_HANDLE_CENTER:
53 return center_bitmap_;
54 case TOUCH_HANDLE_ORIENTATION_UNDEFINED:
55 NOTREACHED() << "Invalid touch handle orientation.";
56 return center_bitmap_;
57 };
58 }
59
60 private:
61 SkBitmap left_bitmap_;
62 SkBitmap right_bitmap_;
63 SkBitmap center_bitmap_;
64
65 DISALLOW_COPY_AND_ASSIGN(HandleResources);
66 };
67
68 base::LazyInstance<HandleResources>::Leaky g_selection_resources;
69
70 } // namespace
71
72 CompositedTouchHandleDrawable::CompositedTouchHandleDrawable(
73 cc::Layer* root_layer,
74 float dpi_scale)
75 : dpi_scale_(dpi_scale),
76 orientation_(TOUCH_HANDLE_ORIENTATION_UNDEFINED),
77 layer_(cc::UIResourceLayer::Create()) {
78 DCHECK(root_layer);
79 root_layer->AddChild(layer_.get());
80 }
81
82 CompositedTouchHandleDrawable::~CompositedTouchHandleDrawable() {
83 Detach();
84 }
85
86 void CompositedTouchHandleDrawable::SetOrientation(
87 TouchHandleOrientation orientation) {
88 DCHECK(layer_->parent());
89 orientation_ = orientation;
90
91 const SkBitmap& bitmap = g_selection_resources.Get().GetBitmap(orientation);
92 layer_->SetBitmap(bitmap);
93 layer_->SetBounds(gfx::Size(bitmap.width(), bitmap.height()));
94
95 switch (orientation_) {
96 case TOUCH_HANDLE_LEFT:
97 focal_offset_from_origin_ = gfx::Vector2dF(bitmap.width() * 0.75f, 0);
98 break;
99 case TOUCH_HANDLE_RIGHT:
100 focal_offset_from_origin_ = gfx::Vector2dF(bitmap.width() * 0.25f, 0);
101 break;
102 case TOUCH_HANDLE_CENTER:
103 focal_offset_from_origin_ = gfx::Vector2dF(bitmap.width() * 0.5f, 0);
104 break;
105 case TOUCH_HANDLE_ORIENTATION_UNDEFINED:
106 NOTREACHED() << "Invalid touch handle orientation.";
107 break;
108 };
109
110 layer_->SetPosition(focal_position_ - focal_offset_from_origin_);
111 }
112
113 void CompositedTouchHandleDrawable::SetAlpha(float alpha) {
114 DCHECK(layer_->parent());
115 layer_->SetOpacity(std::max(0.f, std::min(1.f, alpha)));
116 }
117
118 void CompositedTouchHandleDrawable::SetFocus(const gfx::PointF& position) {
119 DCHECK(layer_->parent());
120 focal_position_ = gfx::ScalePoint(position, dpi_scale_);
121 layer_->SetPosition(focal_position_ - focal_offset_from_origin_);
122 }
123
124 void CompositedTouchHandleDrawable::SetVisible(bool visible) {
125 DCHECK(layer_->parent());
126 layer_->SetIsDrawable(visible);
127 }
128
129 bool CompositedTouchHandleDrawable::ContainsPoint(
130 const gfx::PointF& point) const {
131 return BoundingRect().Contains(gfx::ScalePoint(point, dpi_scale_));
132 }
133
134 void CompositedTouchHandleDrawable::Detach() {
135 layer_->RemoveFromParent();
136 }
137
138 gfx::RectF CompositedTouchHandleDrawable::BoundingRect() const {
139 return gfx::RectF(layer_->position().x(),
140 layer_->position().y(),
141 layer_->bounds().width(),
142 layer_->bounds().height());
143 }
144
145 // static
146 bool CompositedTouchHandleDrawable::RegisterHandleViewResources(JNIEnv* env) {
147 return RegisterNativesImpl(env);
148 }
149
150 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698