Index: tests/GeometryTest.cpp |
diff --git a/tests/GeometryTest.cpp b/tests/GeometryTest.cpp |
index 00fc7797dc08d8b0ae0ff9f925ba4c88221ff32e..5aa80d0b1fb732d77506e28a625d3e827865de88 100644 |
--- a/tests/GeometryTest.cpp |
+++ b/tests/GeometryTest.cpp |
@@ -105,6 +105,67 @@ static void test_conic(skiatest::Reporter* reporter) { |
} |
} |
+static void test_quad_tangents(skiatest::Reporter* reporter) { |
+ SkPoint pts[] = { |
+ {10, 20}, {10, 20}, {20, 30}, |
+ {10, 20}, {15, 25}, {20, 30}, |
+ {10, 20}, {20, 30}, {20, 30}, |
+ }; |
+ int count = (int) SK_ARRAY_COUNT(pts) / 3; |
+ for (int index = 0; index < count; ++index) { |
+ SkConic conic(&pts[index * 3], 0.707f); |
+ SkVector start = SkEvalQuadTangentAt(&pts[index * 3], 0); |
+ SkVector mid = SkEvalQuadTangentAt(&pts[index * 3], .5f); |
+ SkVector end = SkEvalQuadTangentAt(&pts[index * 3], 1); |
+ REPORTER_ASSERT(reporter, start.fX && start.fY); |
+ REPORTER_ASSERT(reporter, mid.fX && mid.fY); |
+ REPORTER_ASSERT(reporter, end.fX && end.fY); |
+ REPORTER_ASSERT(reporter, SkScalarNearlyZero(start.cross(mid))); |
+ REPORTER_ASSERT(reporter, SkScalarNearlyZero(mid.cross(end))); |
+ } |
+} |
+ |
+static void test_conic_tangents(skiatest::Reporter* reporter) { |
+ SkPoint pts[] = { |
+ { 10, 20}, {10, 20}, {20, 30}, |
+ { 10, 20}, {15, 25}, {20, 30}, |
+ { 10, 20}, {20, 30}, {20, 30} |
+ }; |
+ int count = (int) SK_ARRAY_COUNT(pts) / 3; |
+ for (int index = 0; index < count; ++index) { |
+ SkConic conic(&pts[index * 3], 0.707f); |
+ SkVector start = conic.evalTangentAt(0); |
+ SkVector mid = conic.evalTangentAt(.5f); |
+ SkVector end = conic.evalTangentAt(1); |
+ REPORTER_ASSERT(reporter, start.fX && start.fY); |
+ REPORTER_ASSERT(reporter, mid.fX && mid.fY); |
+ REPORTER_ASSERT(reporter, end.fX && end.fY); |
+ REPORTER_ASSERT(reporter, SkScalarNearlyZero(start.cross(mid))); |
+ REPORTER_ASSERT(reporter, SkScalarNearlyZero(mid.cross(end))); |
+ } |
+} |
+ |
+static void test_cubic_tangents(skiatest::Reporter* reporter) { |
+ SkPoint pts[] = { |
+ { 10, 20}, {10, 20}, {20, 30}, {30, 40}, |
+ { 10, 20}, {15, 25}, {20, 30}, {30, 40}, |
+ { 10, 20}, {20, 30}, {30, 40}, {30, 40}, |
+ }; |
+ int count = (int) SK_ARRAY_COUNT(pts) / 4; |
+ for (int index = 0; index < count; ++index) { |
+ SkConic conic(&pts[index * 3], 0.707f); |
+ SkVector start, mid, end; |
+ SkEvalCubicAt(&pts[index * 4], 0, NULL, &start, NULL); |
+ SkEvalCubicAt(&pts[index * 4], .5f, NULL, &mid, NULL); |
+ SkEvalCubicAt(&pts[index * 4], 1, NULL, &end, NULL); |
+ REPORTER_ASSERT(reporter, start.fX && start.fY); |
+ REPORTER_ASSERT(reporter, mid.fX && mid.fY); |
+ REPORTER_ASSERT(reporter, end.fX && end.fY); |
+ REPORTER_ASSERT(reporter, SkScalarNearlyZero(start.cross(mid))); |
+ REPORTER_ASSERT(reporter, SkScalarNearlyZero(mid.cross(end))); |
+ } |
+} |
+ |
DEF_TEST(Geometry, reporter) { |
SkPoint pts[3], dst[5]; |
@@ -129,4 +190,7 @@ DEF_TEST(Geometry, reporter) { |
testChopCubic(reporter); |
test_evalquadat(reporter); |
test_conic(reporter); |
+ test_cubic_tangents(reporter); |
+ test_quad_tangents(reporter); |
+ test_conic_tangents(reporter); |
} |