Chromium Code Reviews| 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 |
| index 91a019eba89157780bd68ed5d82c979b050d0c88..380ee10c230e3466e04f2d2144fce37bfcc00bc6 100644 |
| --- a/content/browser/android/composited_touch_handle_drawable.cc |
| +++ b/content/browser/android/composited_touch_handle_drawable.cc |
| @@ -48,6 +48,11 @@ class HandleResources { |
| left_bitmap_.setImmutable(); |
| right_bitmap_.setImmutable(); |
| center_bitmap_.setImmutable(); |
| + |
| + drawable_padding_.set_height( |
| + Java_HandleViewResources_getHandleVerticalPadding(env)); |
| + drawable_padding_.set_width( |
| + Java_HandleViewResources_getHandleHorizontalPadding(env)); |
| } |
| const SkBitmap& GetBitmap(ui::TouchHandleOrientation orientation) { |
| @@ -65,10 +70,16 @@ class HandleResources { |
| return center_bitmap_; |
| } |
| + gfx::SizeF GetDrawablePadding() const { |
| + DCHECK(loaded_); |
| + return drawable_padding_; |
| + } |
| + |
| private: |
| SkBitmap left_bitmap_; |
| SkBitmap right_bitmap_; |
| SkBitmap center_bitmap_; |
| + gfx::SizeF drawable_padding_; |
| bool loaded_; |
| DISALLOW_COPY_AND_ASSIGN(HandleResources); |
| @@ -86,6 +97,7 @@ CompositedTouchHandleDrawable::CompositedTouchHandleDrawable( |
| orientation_(ui::TouchHandleOrientation::UNDEFINED), |
| layer_(cc::UIResourceLayer::Create()) { |
| g_selection_resources.Get().LoadIfNecessary(context); |
| + drawable_padding_ = g_selection_resources.Get().GetDrawablePadding(); |
| DCHECK(root_layer); |
| root_layer->AddChild(layer_.get()); |
| } |
| @@ -101,30 +113,60 @@ void CompositedTouchHandleDrawable::SetEnabled(bool enabled) { |
| UpdateLayerPosition(); |
| } |
| -void CompositedTouchHandleDrawable::SetOrientation( |
| - ui::TouchHandleOrientation orientation) { |
| +void CompositedTouchHandleDrawable::SetLayout( |
| + const gfx::PointF& position, |
| + ui::TouchHandleOrientation orientation, |
| + bool mirror_vertical, |
| + bool mirror_horizontal) { |
| DCHECK(layer_->parent()); |
| + bool orientation_changed = orientation_ != orientation; |
| + focal_position_ = gfx::ScalePoint(position, dpi_scale_); |
| + |
| orientation_ = orientation; |
| - const SkBitmap& bitmap = g_selection_resources.Get().GetBitmap(orientation); |
| - layer_->SetBitmap(bitmap); |
| - layer_->SetBounds(gfx::Size(bitmap.width(), bitmap.height())); |
| + if (orientation_changed) { |
| + const SkBitmap& bitmap = g_selection_resources.Get().GetBitmap(orientation); |
| + const int bitmap_height = bitmap.height(); |
| + const int bitmap_width = bitmap.width(); |
| + layer_->SetBitmap(bitmap); |
| + layer_->SetBounds(gfx::Size(bitmap_width, bitmap_height)); |
| + } |
| + |
| + const int layer_height = layer_->bounds().height(); |
| + const int layer_width = layer_->bounds().width(); |
| + |
| + // Invert about X and Y axis based on the mirror values |
| + gfx::Transform transform; |
| + float scale_x = mirror_horizontal ? -1.f : 1.f; |
| + float scale_y = mirror_vertical ? -1.f : 1.f; |
| + layer_->SetTransformOrigin( |
| + gfx::Point3F(layer_width * 0.5f, layer_height * 0.5f, 0)); |
| + transform.Scale(scale_x, scale_y); |
| + layer_->SetTransform(transform); |
| + |
| + // Set the Focal offsets for the composited handle layer |
| + // based on the orientation |
| + int focal_offset_x = 0; |
| + int focal_offset_y = mirror_vertical ? layer_height : 0; |
| switch (orientation_) { |
| case ui::TouchHandleOrientation::LEFT: |
| - focal_offset_from_origin_ = gfx::Vector2dF(bitmap.width() * 0.75f, 0); |
| + focal_offset_x = |
| + mirror_horizontal ? layer_width * 0.25f : layer_width * 0.75f; |
|
mfomitchev
2015/06/18 16:16:31
.25/.75 shouldn't be hard coded, but should be bas
AviD
2015/07/30 15:09:55
Done.
This logic is moved to TouchHandle
|
| break; |
| case ui::TouchHandleOrientation::RIGHT: |
| - focal_offset_from_origin_ = gfx::Vector2dF(bitmap.width() * 0.25f, 0); |
| + focal_offset_x = |
| + mirror_horizontal ? layer_width * 0.75f : layer_width * 0.25f; |
| break; |
| case ui::TouchHandleOrientation::CENTER: |
| - focal_offset_from_origin_ = gfx::Vector2dF(bitmap.width() * 0.5f, 0); |
| + focal_offset_x = layer_width * 0.5f; |
| break; |
| case ui::TouchHandleOrientation::UNDEFINED: |
| NOTREACHED() << "Invalid touch handle orientation."; |
| break; |
| }; |
| + focal_offset_from_origin_ = gfx::Vector2dF(focal_offset_x, focal_offset_y); |
| UpdateLayerPosition(); |
| } |
| @@ -136,12 +178,6 @@ void CompositedTouchHandleDrawable::SetAlpha(float alpha) { |
| layer_->SetHideLayerAndSubtree(hidden); |
| } |
| -void CompositedTouchHandleDrawable::SetFocus(const gfx::PointF& position) { |
| - DCHECK(layer_->parent()); |
| - focal_position_ = gfx::ScalePoint(position, dpi_scale_); |
| - UpdateLayerPosition(); |
| -} |
| - |
| gfx::RectF CompositedTouchHandleDrawable::GetVisibleBounds() const { |
| return gfx::ScaleRect(gfx::RectF(layer_->position().x(), |
| layer_->position().y(), |
| @@ -150,6 +186,10 @@ gfx::RectF CompositedTouchHandleDrawable::GetVisibleBounds() const { |
| 1.f / dpi_scale_); |
| } |
| +gfx::SizeF CompositedTouchHandleDrawable::GetDrawablePadding() const { |
| + return drawable_padding_; |
| +} |
| + |
| void CompositedTouchHandleDrawable::DetachLayer() { |
| layer_->RemoveFromParent(); |
| } |