SkScan_Antihair: assert in debug and potentialy lost last pixels

alpha: (uint8_t) 256 is clamped to 255 before static cast to
uint8_t in SkToU8.

BUG=4406

Review URL: https://codereview.chromium.org/1424253002
This commit is contained in:
aleksandar.stojiljkovic 2015-11-02 13:28:51 -08:00 committed by Commit bot
parent 29a440d2d6
commit 7600183ba7
2 changed files with 44 additions and 1 deletions

View File

@ -847,7 +847,11 @@ static void inner_scanline(FDot8 L, int top, FDot8 R, U8CPU alpha,
SkASSERT(L < R);
if ((L >> 8) == ((R - 1) >> 8)) { // 1x1 pixel
blitter->blitV(L >> 8, top, 1, InvAlphaMul(alpha, R - L));
FDot8 widClamp = R - L;
// border case clamp 256 to 255 instead of going through call_hline_blitter
// see skbug/4406
widClamp = widClamp - (widClamp >> 8);
blitter->blitV(L >> 8, top, 1, InvAlphaMul(alpha, widClamp));
return;
}

View File

@ -46,6 +46,45 @@ static void test_stroke_width_clipping(skiatest::Reporter* reporter) {
REPORTER_ASSERT(reporter, has_green_pixels(bm));
}
static void test_skbug4406(skiatest::Reporter* reporter) {
SkBitmap bm;
bm.allocN32Pixels(10, 10);
bm.eraseColor(SK_ColorTRANSPARENT);
SkCanvas canvas(bm);
const SkRect r = { 1.5f, 1, 3.5f, 3 };
// draw filled green rect first
SkPaint paint;
paint.setStyle(SkPaint::kFill_Style);
paint.setColor(0xff00ff00);
paint.setStrokeWidth(1);
paint.setAntiAlias(true);
canvas.drawRect(r, paint);
// paint black with stroke rect (that asserts in bug 4406)
// over the filled rect, it should cover it
paint.setStyle(SkPaint::kStroke_Style);
paint.setColor(0xff000000);
paint.setStrokeWidth(1);
canvas.drawRect(r, paint);
REPORTER_ASSERT(reporter, !has_green_pixels(bm));
// do it again with thinner stroke
paint.setStyle(SkPaint::kFill_Style);
paint.setColor(0xff00ff00);
paint.setStrokeWidth(1);
paint.setAntiAlias(true);
canvas.drawRect(r, paint);
// paint black with stroke rect (that asserts in bug 4406)
// over the filled rect, it doesnt cover it completelly with thinner stroke
paint.setStyle(SkPaint::kStroke_Style);
paint.setColor(0xff000000);
paint.setStrokeWidth(0.99f);
canvas.drawRect(r, paint);
REPORTER_ASSERT(reporter, has_green_pixels(bm));
}
DEF_TEST(Rect, reporter) {
test_stroke_width_clipping(reporter);
test_skbug4406(reporter);
}