Simplify mask/clip intersection, making sure to explicitly check for an empty mask.
Previously we were only asserting the mask wasn't empty, which isn't necessarily true when we're given pathological float coordinates like +Inf or NaN. A local run of nanobench --match text_ was not able to show this is faster or slower. This patch fixed this first Chrome bug on my desktop, and the second is probably a dupe. BUG=chromium:619378,chromium:613912 GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2073873002 Review-Url: https://codereview.chromium.org/2073873002
This commit is contained in:
parent
cc3a22b369
commit
875e13ca09
@ -1457,10 +1457,13 @@ public:
|
|||||||
void operator()(const SkGlyph& glyph, SkPoint position, SkPoint rounding) {
|
void operator()(const SkGlyph& glyph, SkPoint position, SkPoint rounding) {
|
||||||
position += rounding;
|
position += rounding;
|
||||||
// Prevent glyphs from being drawn outside of or straddling the edge of device space.
|
// Prevent glyphs from being drawn outside of or straddling the edge of device space.
|
||||||
if (position.fX > INT_MAX - (INT16_MAX + UINT16_MAX) ||
|
// Comparisons written a little weirdly so that NaN coordinates are treated safely.
|
||||||
position.fX < INT_MIN - (INT16_MIN + 0 /*UINT16_MIN*/) ||
|
auto gt = [](float a, int b) { return !(a <= (float)b); };
|
||||||
position.fY > INT_MAX - (INT16_MAX + UINT16_MAX) ||
|
auto lt = [](float a, int b) { return !(a >= (float)b); };
|
||||||
position.fY < INT_MIN - (INT16_MIN + 0 /*UINT16_MIN*/)) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1476,6 +1479,7 @@ public:
|
|||||||
|
|
||||||
SkMask mask;
|
SkMask mask;
|
||||||
mask.fBounds.set(left, top, right, bottom);
|
mask.fBounds.set(left, top, right, bottom);
|
||||||
|
SkASSERT(!mask.fBounds.isEmpty());
|
||||||
|
|
||||||
if (fUseRegionToDraw) {
|
if (fUseRegionToDraw) {
|
||||||
SkRegion::Cliperator clipper(*fClip, mask.fBounds);
|
SkRegion::Cliperator clipper(*fClip, mask.fBounds);
|
||||||
|
@ -11,8 +11,10 @@
|
|||||||
#include "SkPaint.h"
|
#include "SkPaint.h"
|
||||||
#include "SkPoint.h"
|
#include "SkPoint.h"
|
||||||
#include "SkRect.h"
|
#include "SkRect.h"
|
||||||
|
#include "SkSurface.h"
|
||||||
#include "SkTypes.h"
|
#include "SkTypes.h"
|
||||||
#include "Test.h"
|
#include "Test.h"
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
static const SkColor bgColor = SK_ColorWHITE;
|
static const SkColor bgColor = SK_ColorWHITE;
|
||||||
|
|
||||||
@ -111,3 +113,21 @@ DEF_TEST(DrawText, reporter) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test drawing text at some unusual coordinates.
|
||||||
|
// We measure success by not crashing or asserting.
|
||||||
|
DEF_TEST(DrawText_weirdCoordinates, r) {
|
||||||
|
auto surface = SkSurface::MakeRasterN32Premul(10,10);
|
||||||
|
auto canvas = surface->getCanvas();
|
||||||
|
|
||||||
|
SkScalar oddballs[] = { 0.0f, (float)INFINITY, (float)NAN, 34359738368.0f };
|
||||||
|
|
||||||
|
for (auto x : oddballs) {
|
||||||
|
canvas->drawText("a", 1, +x, 0.0f, SkPaint());
|
||||||
|
canvas->drawText("a", 1, -x, 0.0f, SkPaint());
|
||||||
|
}
|
||||||
|
for (auto y : oddballs) {
|
||||||
|
canvas->drawText("a", 1, 0.0f, +y, SkPaint());
|
||||||
|
canvas->drawText("a", 1, 0.0f, -y, SkPaint());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user