Chromium Code Reviews| Index: src/core/SkBlitter.cpp |
| diff --git a/src/core/SkBlitter.cpp b/src/core/SkBlitter.cpp |
| index 1bc9963eeb0db1a1d5007d812c77affe0f61807c..a02ac699e52ccf384991adf90f668705fb199b7e 100644 |
| --- a/src/core/SkBlitter.cpp |
| +++ b/src/core/SkBlitter.cpp |
| @@ -126,12 +126,16 @@ void SkBlitter::blitMask(const SkMask& mask, const SkIRect& clip) { |
| int maskLeft = mask.fBounds.fLeft; |
| int mask_rowBytes = mask.fRowBytes; |
| int height = clip.height(); |
| + SkDEBUGCODE(const uint8_t* endOfImage = |
| + mask.fImage + (mask.fBounds.fBottom - mask.fBounds.fTop) * mask_rowBytes;) |
| const uint8_t* bits = mask.getAddr1(cx, cy); |
| if (cx == maskLeft && clip.fRight == mask.fBounds.fRight) { |
| while (--height >= 0) { |
| - bits_to_runs(this, cx, cy, bits, 0xFF, mask_rowBytes, 0xFF); |
| + SkASSERT(bits + mask_rowBytes <= endOfImage); |
| + U8CPU rightMask = 0xFF << (8 - (clip.width() & 7)); |
|
reed1
2015/11/17 16:24:32
note: this will be bigger than a byte, something y
herb_g
2015/11/17 20:14:03
This ends up working because the bits_to_run code
|
| + bits_to_runs(this, cx, cy, bits, 0xFF, mask_rowBytes, rightMask); |
| bits += mask_rowBytes; |
| cy += 1; |
| } |
| @@ -142,7 +146,7 @@ void SkBlitter::blitMask(const SkMask& mask, const SkIRect& clip) { |
| SkASSERT(rite_edge > left_edge); |
| int left_mask = 0xFF >> (left_edge & 7); |
| - int rite_mask = 0xFF << (8 - (rite_edge & 7)); |
| + int rite_mask = (0xFF << (8 - (rite_edge & 7))) & 0xFF; |
| int full_runs = (rite_edge >> 3) - ((left_edge + 7) >> 3); |
| // check for empty right mask, so we don't read off the end (or go slower than we need to) |
| @@ -162,12 +166,14 @@ void SkBlitter::blitMask(const SkMask& mask, const SkIRect& clip) { |
| if (full_runs < 0) { |
| SkASSERT((left_mask & rite_mask) != 0); |
| while (--height >= 0) { |
| + SkASSERT(bits + 1 <= endOfImage); |
| bits_to_runs(this, cx, cy, bits, left_mask, 1, rite_mask); |
| bits += mask_rowBytes; |
| cy += 1; |
| } |
| } else { |
| while (--height >= 0) { |
| + SkASSERT(bits + full_runs + 2 <= endOfImage); |
| bits_to_runs(this, cx, cy, bits, left_mask, full_runs + 2, rite_mask); |
| bits += mask_rowBytes; |
| cy += 1; |