| 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..c5735fe48773eb55dc48aee16ea2ec323f7ee20c
 | 
| --- /dev/null
 | 
| +++ b/content/browser/android/composited_touch_handle_drawable.cc
 | 
| @@ -0,0 +1,154 @@
 | 
| +// 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::SetEnabled(bool enabled) {
 | 
| +  layer_->SetIsDrawable(enabled);
 | 
| +}
 | 
| +
 | 
| +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_->SetHideLayerAndSubtree(!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
 | 
| 
 |