It is dangerous to ignore SkRect::intersect's return value
authorrobertphillips <robertphillips@google.com>
Wed, 7 Jan 2015 20:16:10 +0000 (12:16 -0800)
committerCommit bot <commit-bot@chromium.org>
Wed, 7 Jan 2015 20:16:10 +0000 (12:16 -0800)
Committed: https://skia.googlesource.com/skia/+/152f524fd325b7776b01f84afbfe2fa071648a05

Review URL: https://codereview.chromium.org/833943002

gm/gmmain.cpp
gm/offsetimagefilter.cpp
include/core/SkRect.h
src/core/SkScan_AntiPath.cpp
src/effects/SkBlurMaskFilter.cpp
src/gpu/GrReducedClip.cpp
src/utils/SkGatherPixelRefsAndRects.h

index ece8ff3..1652e61 100644 (file)
@@ -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()));
index 7fcbe0a..3dafed8 100644 (file)
@@ -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) {
index cafc59a..06f8abe 100644 (file)
@@ -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:
index 158f34d..545a701 100644 (file)
@@ -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[].
index aa57669..97ae436 100644 (file)
@@ -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;
 }
index 3040b46..ca97098 100644 (file)
@@ -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 {
index 6e11fbe..9589c3e 100644 (file)
@@ -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,