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:
parent
29a440d2d6
commit
7600183ba7
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user