diff options
Diffstat (limited to 'tests/PathOpsLineParametetersTest.cpp')
-rw-r--r-- | tests/PathOpsLineParametetersTest.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/tests/PathOpsLineParametetersTest.cpp b/tests/PathOpsLineParametetersTest.cpp new file mode 100644 index 0000000000..2dad1b2e2c --- /dev/null +++ b/tests/PathOpsLineParametetersTest.cpp @@ -0,0 +1,80 @@ +/* + * 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 "SkLineParameters.h" +#include "Test.h" + +// tests to verify that distance calculations are coded correctly +static const SkDCubic tests[] = { + {{{0, 0}, {1, 1}, {2, 2}, {0, 3}}}, + {{{0, 0}, {1, 1}, {2, 2}, {3, 0}}}, + {{{0, 0}, {5, 0}, {-2, 4}, {3, 4}}}, + {{{0, 2}, {1, 0}, {2, 0}, {3, 0}}}, + {{{0, .2}, {1, 0}, {2, 0}, {3, 0}}}, + {{{0, .02}, {1, 0}, {2, 0}, {3, 0}}}, + {{{0, .002}, {1, 0}, {2, 0}, {3, 0}}}, + {{{0, .0002}, {1, 0}, {2, 0}, {3, 0}}}, + {{{0, .00002}, {1, 0}, {2, 0}, {3, 0}}}, + {{{0, FLT_EPSILON * 2}, {1, 0}, {2, 0}, {3, 0}}}, +}; + +static const double answers[][2] = { + {1, 2}, + {1, 2}, + {4, 4}, + {1.1094003924, 0.5547001962}, + {0.133038021, 0.06651901052}, + {0.0133330370, 0.006666518523}, + {0.001333333037, 0.0006666665185}, + {0.000133333333, 6.666666652e-05}, + {1.333333333e-05, 6.666666667e-06}, + {1.5894571940104115e-07, 7.9472859700520577e-08}, +}; + +static const size_t tests_count = sizeof(tests) / sizeof(tests[0]); + +static void LineParameterTest(skiatest::Reporter* reporter) { + for (size_t index = 0; index < tests_count; ++index) { + SkLineParameters lineParameters; + const SkDCubic& cubic = tests[index]; + lineParameters.cubicEndPoints(cubic); + double denormalizedDistance[2]; + denormalizedDistance[0] = lineParameters.controlPtDistance(cubic, 1); + denormalizedDistance[1] = lineParameters.controlPtDistance(cubic, 2); + double normalSquared = lineParameters.normalSquared(); + size_t inner; + for (inner = 0; inner < 2; ++inner) { + double distSq = denormalizedDistance[inner]; + distSq *= distSq; + double answersSq = answers[index][inner]; + answersSq *= answersSq; + if (AlmostEqualUlps(distSq, normalSquared * answersSq)) { + continue; + } + SkDebugf("%s [%d,%d] denormalizedDistance:%g != answer:%g" + " distSq:%g answerSq:%g normalSquared:%g\n", + __FUNCTION__, static_cast<int>(index), (int)inner, + denormalizedDistance[inner], answers[index][inner], + distSq, answersSq, normalSquared); + } + lineParameters.normalize(); + double normalizedDistance[2]; + normalizedDistance[0] = lineParameters.controlPtDistance(cubic, 1); + normalizedDistance[1] = lineParameters.controlPtDistance(cubic, 2); + for (inner = 0; inner < 2; ++inner) { + if (AlmostEqualUlps(fabs(normalizedDistance[inner]), answers[index][inner])) { + continue; + } + SkDebugf("%s [%d,%d] normalizedDistance:%1.10g != answer:%g\n", + __FUNCTION__, static_cast<int>(index), (int)inner, + normalizedDistance[inner], answers[index][inner]); + REPORTER_ASSERT(reporter, 0); + } + } +} + +#include "TestClassDef.h" +DEFINE_TESTCLASS("PathOpsLineParameters", PathOpsLineParametersClass, LineParameterTest) |