| /* | 
 |  * Copyright 2012 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 | #include "include/core/SkSpan.h" | 
 | #include "include/private/base/SkFloatingPoint.h" | 
 | #include "src/pathops/SkPathOpsCubic.h" | 
 | #include "src/pathops/SkPathOpsPoint.h" | 
 | #include "tests/PathOpsTestCommon.h" | 
 | #include "tests/Test.h" | 
 |  | 
 | #include <string> | 
 | #include <cstddef> | 
 |  | 
 | static const CubicPts hullTests[] = { | 
 | {{{2.6250000819563866, 2.3750000223517418}, {2.833333432674408, 2.3333333432674408}, {3.1111112236976624, 2.3333333134651184}, {3.4074075222015381, 2.3333332538604736}}}, | 
 | }; | 
 |  | 
 | static const size_t hullTests_count = std::size(hullTests); | 
 |  | 
 | DEF_TEST(PathOpsCubicHull, reporter) { | 
 |     for (size_t index = 0; index < hullTests_count; ++index) { | 
 |         const CubicPts& c = hullTests[index]; | 
 |         SkDCubic cubic; | 
 |         cubic.debugSet(c.fPts); | 
 |         char order[4]; | 
 |         cubic.convexHull(order); | 
 |     } | 
 | } | 
 |  | 
 | static bool nearly_equal(double expected, double actual) { | 
 |     if (sk_double_nearly_zero(expected)) { | 
 |         return sk_double_nearly_zero(actual); | 
 |     } | 
 |     return sk_doubles_nearly_equal_ulps(expected, actual, 64); | 
 | } | 
 |  | 
 | static void testConvertToPolynomial(skiatest::Reporter* reporter, const std::string& name, | 
 |                                     SkSpan<const SkDPoint> curveInputs, bool yValues, | 
 |                                     double expectedA, double expectedB, | 
 |                                     double expectedC, double expectedD) { | 
 |     skiatest::ReporterContext subtest(reporter, name); | 
 |     REPORTER_ASSERT(reporter, curveInputs.size() == 4, | 
 |                     "Invalid test case. Need 4 points (start, control, control, end)"); | 
 |  | 
 |     const double* input = &curveInputs[0].fX; | 
 |     if (yValues) { | 
 |         input = &curveInputs[0].fY; | 
 |     } | 
 |     double A, B, C, D; | 
 |     SkDCubic::Coefficients(input, &A, &B, &C, &D); | 
 |  | 
 |     REPORTER_ASSERT(reporter, nearly_equal(expectedA, A), "%f != %f", expectedA, A); | 
 |     REPORTER_ASSERT(reporter, nearly_equal(expectedB, B), "%f != %f", expectedB, B); | 
 |     REPORTER_ASSERT(reporter, nearly_equal(expectedC, C), "%f != %f", expectedC, C); | 
 |     REPORTER_ASSERT(reporter, nearly_equal(expectedD, D), "%f != %f", expectedD, D); | 
 | } | 
 |  | 
 | DEF_TEST(SkDCubicPolynomialCoefficients, reporter) { | 
 |     testConvertToPolynomial(reporter, "Arbitrary control points X direction", | 
 |         {{1, 2}, {-3, 4}, {5, -6}, {7, 8}}, false, /*=yValues*/ | 
 |         -18, 36, -12, 1 | 
 |     ); | 
 |     testConvertToPolynomial(reporter, "Arbitrary control points Y direction", | 
 |         {{1, 2}, {-3, 4}, {5, -6}, {7, 8}}, true, /*=yValues*/ | 
 |         36, -36, 6, 2 | 
 |     ); | 
 | } |