Fix for out-of-bounds intersection (found by fuzzer).
Sometimes, the intersection returned by check_intersection() is
out-of-bounds for both edges (above both tops or below both bottoms)
due to floating-point inaccuracy. This causes split_edge() to create a
tiny negative-length edge on one side (which would then assert).
Although we could safely remove this assert and allow the negative
length edge to be removed, it's faster/safer to simply avoid its
creation in the first place by adjusting one edge to the other edge's
endpoint.
Added a new unit test to exercise this case.
Review URL: https://codereview.chromium.org/968993002
diff --git a/tests/TessellatingPathRendererTests.cpp b/tests/TessellatingPathRendererTests.cpp
index 1625bf2..0635e7f 100644
--- a/tests/TessellatingPathRendererTests.cpp
+++ b/tests/TessellatingPathRendererTests.cpp
@@ -220,6 +220,16 @@
return path;
}
+static SkPath create_path_15() {
+ SkPath path;
+ path.moveTo( 0.0f, 0.0f);
+ path.lineTo(10000.0f, 0.0f);
+ path.lineTo( 0.0f, -1.0f);
+ path.lineTo(10000.0f, 0.000001f);
+ path.lineTo( 0.0f, -30.0f);
+ return path;
+}
+
static void test_path(GrDrawTarget* dt, GrRenderTarget* rt, const SkPath& path) {
GrTessellatingPathRenderer tess;
GrPipelineBuilder pipelineBuilder;
@@ -259,5 +269,6 @@
test_path(dt, rt, create_path_12());
test_path(dt, rt, create_path_13());
test_path(dt, rt, create_path_14());
+ test_path(dt, rt, create_path_15());
}
#endif