aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Yuqian Li <liyuqian@google.com>2017-09-18 14:38:43 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-09-18 19:44:24 +0000
commitc5e4e7437af95ead91e5dc33e0bf1642cd2787df (patch)
treef7e9ba91ae41011a03aa6a3f12db3edda4ef319e
parentad04a4b08e82558d3fca62611028677770a47f10 (diff)
skipRect should only work for lines (not quads or cubics)
The added unit test shows that we'll trigger SkASSERT failure if we forgot to check that the edges are lines (instead of quads or cubics). Similar to skia:7015, this bug is not triggered in our production because we don't use DAA for convex paths by default. The skipRect is an optimization just for convex paths. Bug: skia:7051 Change-Id: Id87ce2d452ede0db9a48425541f473af19ee0572 Reviewed-on: https://skia-review.googlesource.com/48045 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Yuqian Li <liyuqian@google.com>
-rw-r--r--src/core/SkScan_DAAPath.cpp5
-rw-r--r--tests/PathTest.cpp11
2 files changed, 14 insertions, 2 deletions
diff --git a/src/core/SkScan_DAAPath.cpp b/src/core/SkScan_DAAPath.cpp
index a12b6da9b0..9250d02f07 100644
--- a/src/core/SkScan_DAAPath.cpp
+++ b/src/core/SkScan_DAAPath.cpp
@@ -173,8 +173,9 @@ void gen_alpha_deltas(const SkPath& path, const SkRegion& clipRgn, Deltas& resul
SkBezier* lb = list[i];
SkBezier* rb = list[i + 1];
- bool lDX0 = lb->fP0.fX == lb->fP1.fX;
- bool rDX0 = rb->fP0.fX == rb->fP1.fX;
+ // fCount == 2 ensures that lb and rb are lines instead of quads or cubics.
+ bool lDX0 = lb->fP0.fX == lb->fP1.fX && lb->fCount == 2;
+ bool rDX0 = rb->fP0.fX == rb->fP1.fX && rb->fCount == 2;
if (!lDX0 || !rDX0) { // make sure that the edges are vertical
continue;
}
diff --git a/tests/PathTest.cpp b/tests/PathTest.cpp
index 8c629d9485..4fb559b323 100644
--- a/tests/PathTest.cpp
+++ b/tests/PathTest.cpp
@@ -4482,6 +4482,16 @@ static void test_skbug_7015() {
test_draw_AA_path(500, 500, path);
}
+static void test_skbug_7051() {
+ SkPath path;
+ path.moveTo(10, 10);
+ path.cubicTo(10, 20, 10, 30, 30, 30);
+ path.lineTo(50, 20);
+ path.lineTo(50, 10);
+ path.close();
+ test_draw_AA_path(100, 100, path);
+}
+
#endif
static void test_interp(skiatest::Reporter* reporter) {
@@ -4559,6 +4569,7 @@ DEF_TEST(Paths, reporter) {
#if !defined(SK_SUPPORT_LEGACY_DELTA_AA)
test_skbug_6947();
test_skbug_7015();
+ test_skbug_7051();
#endif
SkSize::Make(3, 4);