static void TestQuadLineIntersection(skiatest::Reporter* reporter) { testOneOffs(reporter); for (size_t index = 0; index < lineQuadTests_count; ++index) { int iIndex = static_cast<int>(index); const SkDQuad& quad = lineQuadTests[index].quad; const SkDLine& line = lineQuadTests[index].line; SkReduceOrder reducer1, reducer2; int order1 = reducer1.reduce(quad, SkReduceOrder::kFill_Style); int order2 = reducer2.reduce(line); if (order1 < 3) { SkDebugf("%s [%d] quad order=%d\n", __FUNCTION__, iIndex, order1); REPORTER_ASSERT(reporter, 0); } if (order2 < 2) { SkDebugf("%s [%d] line order=%d\n", __FUNCTION__, iIndex, order2); REPORTER_ASSERT(reporter, 0); } SkIntersections intersections; bool flipped = false; int result = doIntersect(intersections, quad, line, flipped); REPORTER_ASSERT(reporter, result == lineQuadTests[index].result); if (intersections.used() <= 0) { continue; } for (int pt = 0; pt < result; ++pt) { double tt1 = intersections[0][pt]; REPORTER_ASSERT(reporter, tt1 >= 0 && tt1 <= 1); SkDPoint t1 = quad.xyAtT(tt1); double tt2 = intersections[1][pt]; REPORTER_ASSERT(reporter, tt2 >= 0 && tt2 <= 1); SkDPoint t2 = line.xyAtT(tt2); if (!t1.approximatelyEqual(t2)) { SkDebugf("%s [%d,%d] x!= t1=%1.9g (%1.9g,%1.9g) t2=%1.9g (%1.9g,%1.9g)\n", __FUNCTION__, iIndex, pt, tt1, t1.fX, t1.fY, tt2, t2.fX, t2.fY); REPORTER_ASSERT(reporter, 0); } if (!t1.approximatelyEqual(lineQuadTests[index].expected[0]) && (lineQuadTests[index].result == 1 || !t1.approximatelyEqual(lineQuadTests[index].expected[1]))) { SkDebugf("%s t1=(%1.9g,%1.9g)\n", __FUNCTION__, t1.fX, t1.fY); REPORTER_ASSERT(reporter, 0); } } } }
DEF_TEST(PathOpsConicLineIntersectionOneOff, reporter) { testOneOffs(reporter); }