| Index: src/core/SkDraw.cpp
|
| diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp
|
| index 24fc9064a6dd092a91301d3608834fb9256f9b87..9a0509c488b357a4b04ba1fd7e1d33a289c51006 100644
|
| --- a/src/core/SkDraw.cpp
|
| +++ b/src/core/SkDraw.cpp
|
| @@ -1457,10 +1457,13 @@ public:
|
| void operator()(const SkGlyph& glyph, SkPoint position, SkPoint rounding) {
|
| position += rounding;
|
| // Prevent glyphs from being drawn outside of or straddling the edge of device space.
|
| - if (position.fX > INT_MAX - (INT16_MAX + UINT16_MAX) ||
|
| - position.fX < INT_MIN - (INT16_MIN + 0 /*UINT16_MIN*/) ||
|
| - position.fY > INT_MAX - (INT16_MAX + UINT16_MAX) ||
|
| - position.fY < INT_MIN - (INT16_MIN + 0 /*UINT16_MIN*/)) {
|
| + // Comparisons written a little weirdly so that NaN coordinates are treated safely.
|
| + auto gt = [](float a, int b) { return !(a <= (float)b); };
|
| + auto lt = [](float a, int b) { return !(a >= (float)b); };
|
| + if (gt(position.fX, INT_MAX - (INT16_MAX + UINT16_MAX)) ||
|
| + lt(position.fX, INT_MIN - (INT16_MIN + 0 /*UINT16_MIN*/)) ||
|
| + gt(position.fY, INT_MAX - (INT16_MAX + UINT16_MAX)) ||
|
| + lt(position.fY, INT_MIN - (INT16_MIN + 0 /*UINT16_MIN*/))) {
|
| return;
|
| }
|
|
|
| @@ -1476,6 +1479,7 @@ public:
|
|
|
| SkMask mask;
|
| mask.fBounds.set(left, top, right, bottom);
|
| + SkASSERT(!mask.fBounds.isEmpty());
|
|
|
| if (fUseRegionToDraw) {
|
| SkRegion::Cliperator clipper(*fClip, mask.fBounds);
|
|
|