| Index: src/core/SkRect.cpp | 
| diff --git a/src/core/SkRect.cpp b/src/core/SkRect.cpp | 
| index 0b2723ab0a555f36703825f3c059a4d2c3e16f70..011d38a86a192a59fa64f62d49c958e91d1bab39 100644 | 
| --- a/src/core/SkRect.cpp | 
| +++ b/src/core/SkRect.cpp | 
| @@ -7,6 +7,18 @@ | 
|  | 
| #include "SkRect.h" | 
|  | 
| +bool SkIRect::contains(const SkRect& r) const { | 
| +    if (r.isEmpty() || this->isEmpty()) { | 
| +        return false; | 
| +    } | 
| +    // If r's coords are greater than the max int32_t, then they must be outside this SkIRect. | 
| +    if (!r.canRound()) { | 
| +        return false; | 
| +    } | 
| +    // At this point, we can convert the SkRect to SkIRect and compare directly. | 
| +    return this->contains(r.roundOut()); | 
| +} | 
| + | 
| void SkIRect::join(int32_t left, int32_t top, int32_t right, int32_t bottom) { | 
| // do nothing if the params are empty | 
| if (left >= right || top >= bottom) { | 
| @@ -142,6 +154,19 @@ void SkRect::join(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom) | 
| } | 
| } | 
|  | 
| +bool SkRect::canRound() const { | 
| +    if (fLeft < -SK_MaxS32Scalar || fTop < -SK_MaxS32Scalar || | 
| +        fRight > SK_MaxS32Scalar || fBottom > SK_MaxS32Scalar) { | 
| +        return false; | 
| +    } | 
| +    if (this->isEmpty()) { | 
| +        return fLeft < SK_MaxS32Scalar && fTop < SK_MaxS32Scalar && | 
| +               fRight > -SK_MaxS32Scalar && fBottom > -SK_MaxS32Scalar; | 
| +    } else { | 
| +        return true; | 
| +    } | 
| +} | 
| + | 
| //////////////////////////////////////////////////////////////////////////////////////////////// | 
|  | 
| #include "SkString.h" | 
|  |