| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ui/gfx/geometry/three_point_cubic_bezier.h" |
| |
| #include <algorithm> |
| #include <cmath> |
| #include <limits> |
| |
| #include "base/check_op.h" |
| |
| namespace gfx { |
| |
| ThreePointCubicBezier::ThreePointCubicBezier(double p1x, |
| double p1y, |
| double p2x, |
| double p2y, |
| double midpointx, |
| double midpointy, |
| double p3x, |
| double p3y, |
| double p4x, |
| double p4y) |
| : first_curve_(p1x / midpointx, |
| p1y / midpointy, |
| p2x / midpointx, |
| p2y / midpointy), |
| second_curve_((p3x - midpointx) / (1 - midpointx), |
| (p3y - midpointy) / (1 - midpointy), |
| (p4x - midpointx) / (1 - midpointx), |
| (p4y - midpointy) / (1 - midpointy)), |
| midpointx_(midpointx), |
| midpointy_(midpointy) {} |
| |
| ThreePointCubicBezier::ThreePointCubicBezier( |
| const ThreePointCubicBezier& other) = default; |
| |
| double ThreePointCubicBezier::Solve(double x) const { |
| const bool in_first_curve = x < midpointx_; |
| const double scaled_x = (x - (in_first_curve ? 0.0 : midpointx_)) / |
| (in_first_curve ? midpointx_ : (1 - midpointx_)); |
| if (in_first_curve) { |
| return first_curve_.Solve(scaled_x) * midpointy_; |
| } |
| return second_curve_.Solve(scaled_x) * (1 - midpointy_) + midpointy_; |
| } |
| |
| } // namespace gfx |