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>
This commit is contained in:
Yuqian Li 2017-09-18 14:38:43 -04:00 committed by Skia Commit-Bot
parent ad04a4b08e
commit c5e4e7437a
2 changed files with 14 additions and 2 deletions

View File

@ -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;
}

View File

@ -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);