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

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: Partial fix for L 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 CreateSkBitmapFromJavaBitmap(
19 base::android::ScopedJavaLocalRef<jobject> jbitmap) {
20 return jbitmap.is_null()
21 ? SkBitmap()
22 : CreateSkBitmapFromJavaBitmap(gfx::JavaBitmap(jbitmap.obj()));
23 }
24
25 class HandleResources {
26 public:
27 HandleResources() {
28 TRACE_EVENT0("browser", "HandleResources::Create");
29 JNIEnv* env = base::android::AttachCurrentThread();
30 jobject context = base::android::GetApplicationContext();
31
32 left_bitmap_ = CreateSkBitmapFromJavaBitmap(
33 Java_HandleViewResources_getLeftHandleBitmap(env, context));
34 right_bitmap_ = CreateSkBitmapFromJavaBitmap(
35 Java_HandleViewResources_getRightHandleBitmap(env, context));
36 center_bitmap_ = CreateSkBitmapFromJavaBitmap(
37 Java_HandleViewResources_getCenterHandleBitmap(env, context));
38
39 left_bitmap_.setImmutable();
40 right_bitmap_.setImmutable();
41 center_bitmap_.setImmutable();
42 }
43
44 const SkBitmap& GetBitmap(TouchHandleOrientation orientation) {
45 switch (orientation) {
46 case TOUCH_HANDLE_LEFT:
47 return left_bitmap_;
48 case TOUCH_HANDLE_RIGHT:
49 return right_bitmap_;
50 case TOUCH_HANDLE_CENTER:
51 return center_bitmap_;
52 case TOUCH_HANDLE_ORIENTATION_UNDEFINED:
53 NOTREACHED() << "Invalid touch handle orientation.";
54 return center_bitmap_;
55 };
56 }
57
58 private:
59 SkBitmap left_bitmap_;
60 SkBitmap right_bitmap_;
61 SkBitmap center_bitmap_;
62
63 DISALLOW_COPY_AND_ASSIGN(HandleResources);
64 };
65
66 base::LazyInstance<HandleResources>::Leaky g_selection_resources;
67
68 } // namespace
69
70 CompositedTouchHandleDrawable::CompositedTouchHandleDrawable(
71 cc::Layer* root_layer,
72 float dpi_scale)
73 : dpi_scale_(dpi_scale),
74 orientation_(TOUCH_HANDLE_ORIENTATION_UNDEFINED),
75 layer_(cc::UIResourceLayer::Create()) {
76 DCHECK(root_layer);
77 root_layer->AddChild(layer_.get());
78 }
79
80 CompositedTouchHandleDrawable::~CompositedTouchHandleDrawable() {
81 Detach();
82 }
83
84 void CompositedTouchHandleDrawable::SetEnabled(bool enabled) {
85 layer_->SetIsDrawable(enabled);
86 }
87
88 void CompositedTouchHandleDrawable::SetOrientation(
89 TouchHandleOrientation orientation) {
90 DCHECK(layer_->parent());
91 orientation_ = orientation;
92
93 const SkBitmap& bitmap = g_selection_resources.Get().GetBitmap(orientation);
94 layer_->SetBitmap(bitmap);
95 layer_->SetBounds(gfx::Size(bitmap.width(), bitmap.height()));
96
97 switch (orientation_) {
98 case TOUCH_HANDLE_LEFT:
99 focal_offset_from_origin_ = gfx::Vector2dF(bitmap.width() * 0.75f, 0);
100 break;
101 case TOUCH_HANDLE_RIGHT:
102 focal_offset_from_origin_ = gfx::Vector2dF(bitmap.width() * 0.25f, 0);
103 break;
104 case TOUCH_HANDLE_CENTER:
105 focal_offset_from_origin_ = gfx::Vector2dF(bitmap.width() * 0.5f, 0);
106 break;
107 case TOUCH_HANDLE_ORIENTATION_UNDEFINED:
108 NOTREACHED() << "Invalid touch handle orientation.";
109 break;
110 };
111
112 layer_->SetPosition(focal_position_ - focal_offset_from_origin_);
113 }
114
115 void CompositedTouchHandleDrawable::SetAlpha(float alpha) {
116 DCHECK(layer_->parent());
117 layer_->SetOpacity(std::max(0.f, std::min(1.f, alpha)));
118 }
119
120 void CompositedTouchHandleDrawable::SetFocus(const gfx::PointF& position) {
121 DCHECK(layer_->parent());
122 focal_position_ = gfx::ScalePoint(position, dpi_scale_);
123 layer_->SetPosition(focal_position_ - focal_offset_from_origin_);
124 }
125
126 void CompositedTouchHandleDrawable::SetVisible(bool visible) {
127 DCHECK(layer_->parent());
128 layer_->SetHideLayerAndSubtree(!visible);
129 }
130
131 bool CompositedTouchHandleDrawable::ContainsPoint(
132 const gfx::PointF& point) const {
133 return BoundingRect().Contains(gfx::ScalePoint(point, dpi_scale_));
134 }
135
136 void CompositedTouchHandleDrawable::Detach() {
137 layer_->RemoveFromParent();
138 }
139
140 gfx::RectF CompositedTouchHandleDrawable::BoundingRect() const {
141 return gfx::RectF(layer_->position().x(),
142 layer_->position().y(),
143 layer_->bounds().width(),
144 layer_->bounds().height());
145 }
146
147 // static
148 bool CompositedTouchHandleDrawable::RegisterHandleViewResources(JNIEnv* env) {
149 return RegisterNativesImpl(env);
150 }
151
152 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698