| // Copyright 2020 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 "cc/input/scroll_utils.h" |
| |
| #include <algorithm> |
| |
| #include "base/numerics/ranges.h" |
| #include "ui/gfx/geometry/size_f.h" |
| #include "ui/gfx/geometry/vector2d_f.h" |
| |
| namespace cc { |
| |
| // static |
| gfx::Vector2dF ScrollUtils::ResolveScrollPercentageToPixels( |
| const gfx::Vector2dF& delta, |
| const gfx::SizeF& scroller, |
| const gfx::SizeF& viewport) { |
| // Work with unsigned values and keep sign information in sign_x / sign_y. |
| float sign_x = std::signbit(delta.x()) ? -1 : 1; |
| float sign_y = std::signbit(delta.y()) ? -1 : 1; |
| float delta_x = std::abs(delta.x()); |
| float delta_y = std::abs(delta.y()); |
| |
| // Resolve and clamp horizontal scroll |
| if (delta_x > 0) |
| delta_x = delta_x * std::min(scroller.width(), viewport.width()); |
| |
| // Resolve and clamps vertical scroll. |
| if (delta_y > 0) |
| delta_y = delta_y * std::min(scroller.height(), viewport.height()); |
| |
| return gfx::Vector2dF(std::copysign(delta_x, sign_x), |
| std::copysign(delta_y, sign_y)); |
| } |
| |
| } // namespace cc |