Chromium Code Reviews| Index: ui/views/animation/square_ink_drop_ripple.cc |
| diff --git a/ui/views/animation/square_ink_drop_ripple.cc b/ui/views/animation/square_ink_drop_ripple.cc |
| index ea1e6a0c420981bf56a280cdf768594dff675a0e..3e253b0f5d1a45961ea70398d0bbce313decf04f 100644 |
| --- a/ui/views/animation/square_ink_drop_ripple.cc |
| +++ b/ui/views/animation/square_ink_drop_ripple.cc |
| @@ -18,6 +18,8 @@ |
| #include "ui/views/animation/ink_drop_painted_layer_delegates.h" |
| #include "ui/views/view.h" |
| +namespace views { |
| + |
| namespace { |
| // The minimum scale factor to use when scaling rectangle layers. Smaller values |
| @@ -127,42 +129,14 @@ int kAnimationDurationInMs[] = { |
| // Returns the InkDropState sub animation duration for the given |state|. |
| base::TimeDelta GetAnimationDuration(InkDropSubAnimations state) { |
| return base::TimeDelta::FromMilliseconds( |
| - (views::InkDropRipple::UseFastAnimations() |
| + (InkDropRipple::UseFastAnimations() |
| ? 1 |
| - : views::InkDropRipple::kSlowAnimationDurationFactor) * |
| + : InkDropRipple::kSlowAnimationDurationFactor) * |
| kAnimationDurationInMs[state]); |
| } |
| -// Calculates a Transform for a circle layer. The transform will be set up to |
| -// translate by -|center_offset|, scale, and then translate to the target point |
| -// defined by |target_center_x| and |target_center_y|. |
| -gfx::Transform CalculateCircleTransform(const gfx::Vector2dF& center_offset, |
| - float scale, |
| - float target_center_x, |
| - float target_center_y) { |
| - gfx::Transform transform; |
| - transform.Translate(target_center_x, target_center_y); |
| - transform.Scale(scale, scale); |
| - transform.Translate(-center_offset.x(), -center_offset.y()); |
| - return transform; |
| -} |
| - |
| -// Calculates a Transform for a rectangle layer. The transform will be set up to |
| -// translate by -|center_offset| and then scale by the |x_scale| and |y_scale| |
| -// factors. |
| -gfx::Transform CalculateRectTransform(const gfx::Vector2dF& center_offset, |
| - float x_scale, |
| - float y_scale) { |
| - gfx::Transform transform; |
| - transform.Scale(x_scale, y_scale); |
| - transform.Translate(-center_offset.x(), -center_offset.y()); |
| - return transform; |
| -} |
| - |
| } // namespace |
| -namespace views { |
| - |
| SquareInkDropRipple::SquareInkDropRipple(const gfx::Size& large_size, |
| int large_corner_radius, |
| const gfx::Size& small_size, |
| @@ -176,6 +150,7 @@ SquareInkDropRipple::SquareInkDropRipple(const gfx::Size& large_size, |
| large_corner_radius_(large_corner_radius), |
| small_size_(small_size), |
| small_corner_radius_(small_corner_radius), |
| + center_point_(center_point), |
| circle_layer_delegate_(new CircleLayerDelegate( |
| color, |
| std::min(large_size_.width(), large_size_.height()) / 2)), |
| @@ -190,10 +165,6 @@ SquareInkDropRipple::SquareInkDropRipple(const gfx::Size& large_size, |
| root_layer_.SetMasksToBounds(false); |
| root_layer_.SetBounds(gfx::Rect(large_size_)); |
| - gfx::Transform transform; |
| - transform.Translate(center_point.x(), center_point.y()); |
| - root_layer_.SetTransform(transform); |
| - |
| SetStateToHidden(); |
| } |
| @@ -265,7 +236,6 @@ void SquareInkDropRipple::AnimateStateChange( |
| case InkDropState::ACTION_PENDING: |
| DCHECK_EQ(InkDropState::HIDDEN, old_ink_drop_state) |
| << " old_ink_drop_state=" << ToString(old_ink_drop_state); |
| - ; |
| AnimateToOpacity(visible_opacity_, |
| GetAnimationDuration(ACTION_PENDING_FADE_IN), |
| ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET, |
| @@ -460,14 +430,29 @@ void SquareInkDropRipple::CalculateCircleTransforms( |
| } |
| void SquareInkDropRipple::CalculateRectTransforms( |
| - const gfx::Size& size, |
| + const gfx::Size& desired_size, |
| float corner_radius, |
| InkDropTransforms* transforms_out) const { |
| - DCHECK_GE(size.width() / 2.0f, corner_radius) |
| + DCHECK_GE(desired_size.width() / 2.0f, corner_radius) |
| << "The circle's diameter should not be greater than the total width."; |
| - DCHECK_GE(size.height() / 2.0f, corner_radius) |
| + DCHECK_GE(desired_size.height() / 2.0f, corner_radius) |
| << "The circle's diameter should not be greater than the total height."; |
| + gfx::SizeF size(desired_size); |
|
bruthig
2017/04/12 17:57:39
nit: Consider renaming as |effective_size|.
Evan Stade
2017/04/12 23:48:28
it's used so often below I wanted to keep it short
|
| + // This function can be called before the layer's been added to a view, |
| + // either at construction time or in tests. |
| + if (root_layer_.GetCompositor()) { |
| + // Modify |desired_size| so that the ripple aligns to pixel bounds. |
| + const float dsf = root_layer_.GetCompositor()->device_scale_factor(); |
| + gfx::RectF ripple_bounds((gfx::PointF(center_point_)), gfx::SizeF()); |
|
bruthig
2017/04/12 17:57:39
I'm assuming the 'extra' parenthesis are required.
Evan Stade
2017/04/12 23:48:28
yes. disambiguates a function call or some such.
|
| + ripple_bounds.Inset(-gfx::InsetsF(desired_size.height() / 2.0f, |
| + desired_size.width() / 2.0f)); |
| + ripple_bounds.Scale(dsf); |
| + ripple_bounds = gfx::RectF(gfx::ToEnclosingRect(ripple_bounds)); |
| + ripple_bounds.Scale(1.0f / dsf); |
| + size = ripple_bounds.size(); |
| + } |
| + |
| // The shapes are drawn such that their center points are not at the origin. |
| // Thus we use the CalculateCircleTransform() and CalculateRectTransform() |
| // methods to calculate the complex Transforms. |
| @@ -479,44 +464,58 @@ void SquareInkDropRipple::CalculateRectTransforms( |
| const float circle_target_x_offset = size.width() / 2.0f - corner_radius; |
| const float circle_target_y_offset = size.height() / 2.0f - corner_radius; |
| - const gfx::Vector2dF circle_center_offset = |
| - circle_layer_delegate_->GetCenteringOffset(); |
| (*transforms_out)[TOP_LEFT_CIRCLE] = CalculateCircleTransform( |
| - circle_center_offset, circle_scale, -circle_target_x_offset, |
| - -circle_target_y_offset); |
| - |
| - (*transforms_out)[TOP_RIGHT_CIRCLE] = |
| - CalculateCircleTransform(circle_center_offset, circle_scale, |
| - circle_target_x_offset, -circle_target_y_offset); |
| - |
| - (*transforms_out)[BOTTOM_RIGHT_CIRCLE] = |
| - CalculateCircleTransform(circle_center_offset, circle_scale, |
| - circle_target_x_offset, circle_target_y_offset); |
| + circle_scale, -circle_target_x_offset, -circle_target_y_offset); |
| + (*transforms_out)[TOP_RIGHT_CIRCLE] = CalculateCircleTransform( |
| + circle_scale, circle_target_x_offset, -circle_target_y_offset); |
| + (*transforms_out)[BOTTOM_RIGHT_CIRCLE] = CalculateCircleTransform( |
| + circle_scale, circle_target_x_offset, circle_target_y_offset); |
| + (*transforms_out)[BOTTOM_LEFT_CIRCLE] = CalculateCircleTransform( |
| + circle_scale, -circle_target_x_offset, circle_target_y_offset); |
| - (*transforms_out)[BOTTOM_LEFT_CIRCLE] = |
| - CalculateCircleTransform(circle_center_offset, circle_scale, |
| - -circle_target_x_offset, circle_target_y_offset); |
| + const float rect_delegate_width = rect_layer_delegate_->size().width(); |
| + const float rect_delegate_height = rect_layer_delegate_->size().height(); |
| - const float rect_delegate_width = |
| - static_cast<float>(rect_layer_delegate_->size().width()); |
| - const float rect_delegate_height = |
| - static_cast<float>(rect_layer_delegate_->size().height()); |
| - |
| - const gfx::Vector2dF rect_center_offset = |
| - rect_layer_delegate_->GetCenteringOffset(); |
| (*transforms_out)[HORIZONTAL_RECT] = CalculateRectTransform( |
| - rect_center_offset, |
| std::max(kMinimumRectScale, size.width() / rect_delegate_width), |
| std::max(kMinimumRectScale, |
| (size.height() - 2.0f * corner_radius) / rect_delegate_height)); |
| (*transforms_out)[VERTICAL_RECT] = CalculateRectTransform( |
| - rect_center_offset, |
| std::max(kMinimumRectScale, |
| (size.width() - 2.0f * corner_radius) / rect_delegate_width), |
| std::max(kMinimumRectScale, size.height() / rect_delegate_height)); |
| } |
| +gfx::Transform SquareInkDropRipple::CalculateCircleTransform( |
| + float scale, |
| + float target_center_x, |
| + float target_center_y) const { |
| + gfx::Transform transform; |
| + // Offset for the center point of the ripple. |
| + transform.Translate(center_point_.x(), center_point_.y()); |
| + // Move circle to target. |
| + transform.Translate(target_center_x, target_center_y); |
| + transform.Scale(scale, scale); |
| + // Align center point of the painted circle. |
| + const gfx::Vector2dF circle_center_offset = |
| + circle_layer_delegate_->GetCenteringOffset(); |
| + transform.Translate(-circle_center_offset.x(), -circle_center_offset.y()); |
| + return transform; |
| +} |
| + |
| +gfx::Transform SquareInkDropRipple::CalculateRectTransform( |
| + float x_scale, |
| + float y_scale) const { |
| + gfx::Transform transform; |
| + transform.Translate(center_point_.x(), center_point_.y()); |
| + transform.Scale(x_scale, y_scale); |
| + const gfx::Vector2dF rect_center_offset = |
| + rect_layer_delegate_->GetCenteringOffset(); |
| + transform.Translate(-rect_center_offset.x(), -rect_center_offset.y()); |
| + return transform; |
| +} |
| + |
| void SquareInkDropRipple::GetCurrentTransforms( |
| InkDropTransforms* transforms_out) const { |
| for (int i = 0; i < PAINTED_SHAPE_COUNT; ++i) |