aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar robertphillips <robertphillips@google.com>2015-01-07 09:01:12 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-01-07 09:01:13 -0800
commit152f524fd325b7776b01f84afbfe2fa071648a05 (patch)
tree52255f53268067cf9e66272b67ca15711d8c4813
parentbd0d9da981289504c9dcd8547eaad52b1f4a52cb (diff)
It is dangerous to ignore SkRect::intersect's return value
-rw-r--r--gm/gmmain.cpp6
-rw-r--r--gm/offsetimagefilter.cpp5
-rw-r--r--include/core/SkRect.h20
-rw-r--r--src/core/SkScan_AntiPath.cpp5
-rw-r--r--src/effects/SkBlurMaskFilter.cpp4
-rw-r--r--src/gpu/GrReducedClip.cpp5
-rw-r--r--src/utils/SkGatherPixelRefsAndRects.h5
7 files changed, 32 insertions, 18 deletions
diff --git a/gm/gmmain.cpp b/gm/gmmain.cpp
index ece8ff32d4..1652e61f7c 100644
--- a/gm/gmmain.cpp
+++ b/gm/gmmain.cpp
@@ -704,8 +704,10 @@ public:
SkRect content = SkRect::MakeWH(SkIntToScalar(pageSize.width()),
SkIntToScalar(pageSize.height()));
initialTransform.mapRect(&content);
- content.intersect(0, 0, SkIntToScalar(pageSize.width()),
- SkIntToScalar(pageSize.height()));
+ if (!content.intersect(0, 0, SkIntToScalar(pageSize.width()),
+ SkIntToScalar(pageSize.height()))) {
+ content.setEmpty();
+ }
SkISize contentSize =
SkISize::Make(SkScalarRoundToInt(content.width()),
SkScalarRoundToInt(content.height()));
diff --git a/gm/offsetimagefilter.cpp b/gm/offsetimagefilter.cpp
index 7fcbe0a04d..3dafed8823 100644
--- a/gm/offsetimagefilter.cpp
+++ b/gm/offsetimagefilter.cpp
@@ -82,8 +82,9 @@ protected:
scaleMatrix.setScale(scale, scale);
SkRect cropRectFloat;
scaleMatrix.mapRect(&cropRectFloat, SkRect::Make(cropRect));
- clipRect.intersect(cropRectFloat);
- canvas->drawRect(clipRect, strokePaint);
+ if (clipRect.intersect(cropRectFloat)) {
+ canvas->drawRect(clipRect, strokePaint);
+ }
}
virtual void onDraw(SkCanvas* canvas) {
diff --git a/include/core/SkRect.h b/include/core/SkRect.h
index cafc59afa7..06f8abe0e4 100644
--- a/include/core/SkRect.h
+++ b/include/core/SkRect.h
@@ -267,7 +267,7 @@ struct SK_API SkIRect {
intersection, otherwise return false and do not change this rectangle.
If either rectangle is empty, do nothing and return false.
*/
- bool intersect(const SkIRect& r) {
+ bool SK_WARN_UNUSED_RESULT intersect(const SkIRect& r) {
SkASSERT(&r);
return this->intersect(r.fLeft, r.fTop, r.fRight, r.fBottom);
}
@@ -276,7 +276,7 @@ struct SK_API SkIRect {
that intersection, otherwise return false and do not change this
rectangle. If either rectangle is empty, do nothing and return false.
*/
- bool intersect(const SkIRect& a, const SkIRect& b) {
+ bool SK_WARN_UNUSED_RESULT intersect(const SkIRect& a, const SkIRect& b) {
if (!a.isEmpty() && !b.isEmpty() &&
a.fLeft < b.fRight && b.fLeft < a.fRight &&
@@ -296,7 +296,7 @@ struct SK_API SkIRect {
If either is, then the return result is undefined. In the debug build,
we assert that both rectangles are non-empty.
*/
- bool intersectNoEmptyCheck(const SkIRect& a, const SkIRect& b) {
+ bool SK_WARN_UNUSED_RESULT intersectNoEmptyCheck(const SkIRect& a, const SkIRect& b) {
SkASSERT(!a.isEmpty() && !b.isEmpty());
if (a.fLeft < b.fRight && b.fLeft < a.fRight &&
@@ -315,7 +315,8 @@ struct SK_API SkIRect {
otherwise return false and do not change this rectangle.
If either rectangle is empty, do nothing and return false.
*/
- bool intersect(int32_t left, int32_t top, int32_t right, int32_t bottom) {
+ bool SK_WARN_UNUSED_RESULT intersect(int32_t left, int32_t top,
+ int32_t right, int32_t bottom) {
if (left < right && top < bottom && !this->isEmpty() &&
fLeft < right && left < fRight && fTop < bottom && top < fBottom) {
if (fLeft < left) fLeft = left;
@@ -331,8 +332,8 @@ struct SK_API SkIRect {
*/
static bool Intersects(const SkIRect& a, const SkIRect& b) {
return !a.isEmpty() && !b.isEmpty() && // check for empties
- a.fLeft < b.fRight && b.fLeft < a.fRight &&
- a.fTop < b.fBottom && b.fTop < a.fBottom;
+ a.fLeft < b.fRight && b.fLeft < a.fRight &&
+ a.fTop < b.fBottom && b.fTop < a.fBottom;
}
/**
@@ -656,21 +657,22 @@ struct SK_API SkRect {
intersection, otherwise return false and do not change this rectangle.
If either rectangle is empty, do nothing and return false.
*/
- bool intersect(const SkRect& r);
+ bool SK_WARN_UNUSED_RESULT intersect(const SkRect& r);
/** If this rectangle intersects the rectangle specified by left, top, right, bottom,
return true and set this rectangle to that intersection, otherwise return false
and do not change this rectangle.
If either rectangle is empty, do nothing and return false.
*/
- bool intersect(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom);
+ bool SK_WARN_UNUSED_RESULT intersect(SkScalar left, SkScalar top,
+ SkScalar right, SkScalar bottom);
/**
* If rectangles a and b intersect, return true and set this rectangle to
* that intersection, otherwise return false and do not change this
* rectangle. If either rectangle is empty, do nothing and return false.
*/
- bool intersect(const SkRect& a, const SkRect& b);
+ bool SK_WARN_UNUSED_RESULT intersect(const SkRect& a, const SkRect& b);
private:
diff --git a/src/core/SkScan_AntiPath.cpp b/src/core/SkScan_AntiPath.cpp
index 158f34d265..545a70129e 100644
--- a/src/core/SkScan_AntiPath.cpp
+++ b/src/core/SkScan_AntiPath.cpp
@@ -454,7 +454,10 @@ MaskSuperBlitter::MaskSuperBlitter(SkBlitter* realBlitter, const SkIRect& ir, co
fMask.fFormat = SkMask::kA8_Format;
fClipRect = ir;
- fClipRect.intersect(clip.getBounds());
+ if (!fClipRect.intersect(clip.getBounds())) {
+ SkASSERT(0);
+ fClipRect.setEmpty();
+ }
// For valgrind, write 1 extra byte at the end so we don't read
// uninitialized memory. See comment in add_aa_span and fStorage[].
diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp
index aa576697e3..97ae436367 100644
--- a/src/effects/SkBlurMaskFilter.cpp
+++ b/src/effects/SkBlurMaskFilter.cpp
@@ -1184,7 +1184,9 @@ bool SkBlurMaskFilterImpl::canFilterMaskGPU(const SkRect& srcBounds,
// Outset srcRect and clipRect by 3 * sigma, to compute affected blur area.
srcRect.outset(sigma3, sigma3);
clipRect.outset(sigma3, sigma3);
- srcRect.intersect(clipRect);
+ if (!srcRect.intersect(clipRect)) {
+ srcRect.setEmpty();
+ }
*maskRect = srcRect;
return true;
}
diff --git a/src/gpu/GrReducedClip.cpp b/src/gpu/GrReducedClip.cpp
index 3040b46313..ca97098794 100644
--- a/src/gpu/GrReducedClip.cpp
+++ b/src/gpu/GrReducedClip.cpp
@@ -409,7 +409,10 @@ void GrReducedClip::ReduceClipStack(const SkClipStack& stack,
if (tighterBounds) {
SkIRect stackIBounds;
stackBounds.roundOut(&stackIBounds);
- tighterBounds->intersect(queryBounds, stackIBounds);
+ if (!tighterBounds->intersect(queryBounds, stackIBounds)) {
+ SkASSERT(0);
+ tighterBounds->setEmpty();
+ }
bounds = tighterBounds;
}
} else {
diff --git a/src/utils/SkGatherPixelRefsAndRects.h b/src/utils/SkGatherPixelRefsAndRects.h
index 6e11fbe6d5..9589c3ea38 100644
--- a/src/utils/SkGatherPixelRefsAndRects.h
+++ b/src/utils/SkGatherPixelRefsAndRects.h
@@ -79,8 +79,9 @@ protected:
SkRect mappedRect;
draw.fMatrix->mapRect(&mappedRect, rect);
SkRect clipRect = SkRect::Make(draw.fRC->getBounds());
- mappedRect.intersect(clipRect);
- fPRCont->add(bm.pixelRef(), mappedRect);
+ if (mappedRect.intersect(clipRect)) {
+ fPRCont->add(bm.pixelRef(), mappedRect);
+ }
}
}
virtual void drawOval(const SkDraw& draw, const SkRect& rect,