Fix int overflow issues with clip and path bounds, take 2.

* Change IsInsideClip test to be more int overflow friendly
* Check to make sure path bounds can have representable width and height

Bug: skia:7239
Bug: skia:7240
Change-Id: If8468e46bc74a428c25d466ff3756d0cad385c09
Reviewed-on: https://skia-review.googlesource.com/66154
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Jim Van Verth <jvanverth@google.com>
This commit is contained in:
Jim Van Verth 2017-11-02 12:09:55 -04:00 committed by Skia Commit-Bot
parent d7af1dbb64
commit 430ad1f206
2 changed files with 7 additions and 2 deletions

View File

@ -74,8 +74,8 @@ public:
*/
template <typename TRect>
constexpr static bool IsInsideClip(const TRect& innerClipBounds, const SkRect& queryBounds) {
return innerClipBounds.fRight - innerClipBounds.fLeft > kBoundsTolerance &&
innerClipBounds.fBottom - innerClipBounds.fTop > kBoundsTolerance &&
return innerClipBounds.fRight > innerClipBounds.fLeft + kBoundsTolerance &&
innerClipBounds.fBottom > innerClipBounds.fTop + kBoundsTolerance &&
innerClipBounds.fLeft < queryBounds.fLeft + kBoundsTolerance &&
innerClipBounds.fTop < queryBounds.fTop + kBoundsTolerance &&
innerClipBounds.fRight > queryBounds.fRight - kBoundsTolerance &&

View File

@ -52,6 +52,11 @@ static bool get_unclipped_shape_dev_bounds(const GrShape& shape, const SkMatrix&
if (!shapeDevBounds.intersect(SkRect::MakeLTRB(INT32_MIN, INT32_MIN, kMaxInt, kMaxInt))) {
return false;
}
// Make sure that the resulting SkIRect can have representable width and height
if (SkScalarRoundToInt(shapeDevBounds.width()) > kMaxInt ||
SkScalarRoundToInt(shapeDevBounds.height()) > kMaxInt) {
return false;
}
shapeDevBounds.roundOut(devBounds);
return true;
}