1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2012 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci#include "src/pathops/SkLineParameters.h"
8cb93a386Sopenharmony_ci#include "tests/PathOpsTestCommon.h"
9cb93a386Sopenharmony_ci#include "tests/Test.h"
10cb93a386Sopenharmony_ci
11cb93a386Sopenharmony_ci// tests to verify that distance calculations are coded correctly
12cb93a386Sopenharmony_cistatic const CubicPts tests[] = {
13cb93a386Sopenharmony_ci    {{{0, 0}, {1, 1}, {2, 2}, {0, 3}}},
14cb93a386Sopenharmony_ci    {{{0, 0}, {1, 1}, {2, 2}, {3, 0}}},
15cb93a386Sopenharmony_ci    {{{0, 0}, {5, 0}, {-2, 4}, {3, 4}}},
16cb93a386Sopenharmony_ci    {{{0, 2}, {1, 0}, {2, 0}, {3, 0}}},
17cb93a386Sopenharmony_ci    {{{0, .2}, {1, 0}, {2, 0}, {3, 0}}},
18cb93a386Sopenharmony_ci    {{{0, .02}, {1, 0}, {2, 0}, {3, 0}}},
19cb93a386Sopenharmony_ci    {{{0, .002}, {1, 0}, {2, 0}, {3, 0}}},
20cb93a386Sopenharmony_ci    {{{0, .0002}, {1, 0}, {2, 0}, {3, 0}}},
21cb93a386Sopenharmony_ci    {{{0, .00002}, {1, 0}, {2, 0}, {3, 0}}},
22cb93a386Sopenharmony_ci    {{{0, FLT_EPSILON * 2}, {1, 0}, {2, 0}, {3, 0}}},
23cb93a386Sopenharmony_ci};
24cb93a386Sopenharmony_ci
25cb93a386Sopenharmony_cistatic const double answers[][2] = {
26cb93a386Sopenharmony_ci    {1, 2},
27cb93a386Sopenharmony_ci    {1, 2},
28cb93a386Sopenharmony_ci    {4, 4},
29cb93a386Sopenharmony_ci    {1.1094003924, 0.5547001962},
30cb93a386Sopenharmony_ci    {0.133038021, 0.06651901052},
31cb93a386Sopenharmony_ci    {0.0133330370, 0.006666518523},
32cb93a386Sopenharmony_ci    {0.001333333037, 0.0006666665185},
33cb93a386Sopenharmony_ci    {0.000133333333, 6.666666652e-05},
34cb93a386Sopenharmony_ci    {1.333333333e-05, 6.666666667e-06},
35cb93a386Sopenharmony_ci    {1.5894571940104115e-07, 7.9472859700520577e-08},
36cb93a386Sopenharmony_ci};
37cb93a386Sopenharmony_ci
38cb93a386Sopenharmony_cistatic const size_t tests_count = SK_ARRAY_COUNT(tests);
39cb93a386Sopenharmony_ci
40cb93a386Sopenharmony_ciDEF_TEST(PathOpsLineParameters, reporter) {
41cb93a386Sopenharmony_ci    for (size_t index = 0; index < tests_count; ++index) {
42cb93a386Sopenharmony_ci        SkLineParameters lineParameters;
43cb93a386Sopenharmony_ci        const CubicPts& c = tests[index];
44cb93a386Sopenharmony_ci        SkDCubic cubic;
45cb93a386Sopenharmony_ci        cubic.debugSet(c.fPts);
46cb93a386Sopenharmony_ci        SkASSERT(ValidCubic(cubic));
47cb93a386Sopenharmony_ci        lineParameters.cubicEndPoints(cubic, 0, 3);
48cb93a386Sopenharmony_ci        double denormalizedDistance[2];
49cb93a386Sopenharmony_ci        denormalizedDistance[0] = lineParameters.controlPtDistance(cubic, 1);
50cb93a386Sopenharmony_ci        denormalizedDistance[1] = lineParameters.controlPtDistance(cubic, 2);
51cb93a386Sopenharmony_ci        double normalSquared = lineParameters.normalSquared();
52cb93a386Sopenharmony_ci        size_t inner;
53cb93a386Sopenharmony_ci        for (inner = 0; inner < 2; ++inner) {
54cb93a386Sopenharmony_ci            double distSq = denormalizedDistance[inner];
55cb93a386Sopenharmony_ci            distSq *= distSq;
56cb93a386Sopenharmony_ci            double answersSq = answers[index][inner];
57cb93a386Sopenharmony_ci            answersSq *= answersSq;
58cb93a386Sopenharmony_ci            if (AlmostEqualUlps(distSq, normalSquared * answersSq)) {
59cb93a386Sopenharmony_ci                continue;
60cb93a386Sopenharmony_ci            }
61cb93a386Sopenharmony_ci            SkDebugf("%s [%d,%d] denormalizedDistance:%g != answer:%g"
62cb93a386Sopenharmony_ci                    " distSq:%g answerSq:%g normalSquared:%g\n",
63cb93a386Sopenharmony_ci                    __FUNCTION__, static_cast<int>(index), (int)inner,
64cb93a386Sopenharmony_ci                    denormalizedDistance[inner], answers[index][inner],
65cb93a386Sopenharmony_ci                    distSq, answersSq, normalSquared);
66cb93a386Sopenharmony_ci        }
67cb93a386Sopenharmony_ci        lineParameters.normalize();
68cb93a386Sopenharmony_ci        double normalizedDistance[2];
69cb93a386Sopenharmony_ci        normalizedDistance[0] = lineParameters.controlPtDistance(cubic, 1);
70cb93a386Sopenharmony_ci        normalizedDistance[1] = lineParameters.controlPtDistance(cubic, 2);
71cb93a386Sopenharmony_ci        for (inner = 0; inner < 2; ++inner) {
72cb93a386Sopenharmony_ci            if (AlmostEqualUlps(fabs(normalizedDistance[inner]), answers[index][inner])) {
73cb93a386Sopenharmony_ci                continue;
74cb93a386Sopenharmony_ci            }
75cb93a386Sopenharmony_ci            SkDebugf("%s [%d,%d] normalizedDistance:%1.9g != answer:%g\n",
76cb93a386Sopenharmony_ci                    __FUNCTION__, static_cast<int>(index), (int)inner,
77cb93a386Sopenharmony_ci                    normalizedDistance[inner], answers[index][inner]);
78cb93a386Sopenharmony_ci            REPORTER_ASSERT(reporter, 0);
79cb93a386Sopenharmony_ci        }
80cb93a386Sopenharmony_ci    }
81cb93a386Sopenharmony_ci}
82