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