aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/TessellatingPathRendererTests.cpp
diff options
context:
space:
mode:
authorGravatar senorblanco <senorblanco@chromium.org>2016-08-17 14:56:22 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-08-17 14:56:22 -0700
commit70f5251cc59191040a14cd0f1567aa2129e1f7c6 (patch)
treee0843dcb556d1ad159f064b02e64dc38780347d1 /tests/TessellatingPathRendererTests.cpp
parent280e282d2a89ba3b9ff05dd2475d7452b7dccdbe (diff)
Fix assert caused by floating point error in tessellating path renderer.
In rare cases, floating point error causes the tesselator to add the same Vertex to more than one Poly on the same side. This was not a big problem when we were allocating new vertices when constructing Polys, but after https://codereview.chromium.org/2029243002 it causes more serious issues, since each Edge can only belong to two Polys, and violating this condition messes up the linked list of Edges used for left & right Polys and the associated estimated vertex count. The fix is to simply let the first Poly win, and skip that vertex for subsequent Polys. Since this only occurs in cases where vertices are very close to each other, it should have little visual effect. This is also exercised by Nebraska-StateSeal.svg. BUG=skia:5636 GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2259493002 Review-Url: https://codereview.chromium.org/2259493002
Diffstat (limited to 'tests/TessellatingPathRendererTests.cpp')
-rw-r--r--tests/TessellatingPathRendererTests.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/tests/TessellatingPathRendererTests.cpp b/tests/TessellatingPathRendererTests.cpp
index d9afcc4d3d..232ea36db6 100644
--- a/tests/TessellatingPathRendererTests.cpp
+++ b/tests/TessellatingPathRendererTests.cpp
@@ -232,6 +232,23 @@ static SkPath create_path_15() {
return path;
}
+// Reduction of Nebraska-StateSeal.svg. Floating point error causes the
+// same edge to be added to more than one poly on the same side.
+static SkPath create_path_16() {
+ SkPath path;
+ path.moveTo(170.8199920654296875, 491.86700439453125);
+ path.lineTo(173.7649993896484375, 489.7340087890625);
+ path.lineTo(174.1450958251953125, 498.545989990234375);
+ path.lineTo( 171.998992919921875, 500.88201904296875);
+ path.moveTo(168.2922515869140625, 498.66265869140625);
+ path.lineTo(169.8589935302734375, 497.94500732421875);
+ path.lineTo( 172, 500.88299560546875);
+ path.moveTo( 169.555267333984375, 490.70111083984375);
+ path.lineTo(173.7649993896484375, 489.7340087890625);
+ path.lineTo( 170.82000732421875, 491.86700439453125);
+ return path;
+}
+
static void test_path(GrDrawContext* drawContext, GrResourceProvider* rp, const SkPath& path) {
GrTessellatingPathRenderer tess;
@@ -284,5 +301,6 @@ DEF_GPUTEST_FOR_ALL_CONTEXTS(TessellatingPathRendererTests, reporter, ctxInfo) {
test_path(dc.get(), rp, create_path_13());
test_path(dc.get(), rp, create_path_14());
test_path(dc.get(), rp, create_path_15());
+ test_path(dc.get(), rp, create_path_16());
}
#endif