1 /* 2 * Copyright 2010 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrRect_DEFINED 9 #define GrRect_DEFINED 10 11 #include "SkTo.h" 12 #include "SkTypes.h" 13 #include "SkRect.h" 14 15 struct GrIRect16 { 16 int16_t fLeft, fTop, fRight, fBottom; 17 18 static GrIRect16 SK_WARN_UNUSED_RESULT MakeEmpty() { 19 GrIRect16 r; 20 r.setEmpty(); 21 return r; 22 } 23 24 static GrIRect16 SK_WARN_UNUSED_RESULT MakeWH(int16_t w, int16_t h) { 25 GrIRect16 r; 26 r.set(0, 0, w, h); 27 return r; 28 } 29 30 static GrIRect16 SK_WARN_UNUSED_RESULT MakeXYWH(int16_t x, int16_t y, int16_t w, int16_t h) { 31 GrIRect16 r; 32 r.set(x, y, x + w, y + h); 33 return r; 34 } 35 36 int width() const { return fRight - fLeft; } 37 int height() const { return fBottom - fTop; } 38 int area() const { return this->width() * this->height(); } 39 bool isEmpty() const { return fLeft >= fRight || fTop >= fBottom; } 40 41 void setEmpty() { memset(this, 0, sizeof(*this)); } 42 43 void set(int16_t left, int16_t top, int16_t right, int16_t bottom) { 44 fLeft = left; 45 fTop = top; 46 fRight = right; 47 fBottom = bottom; 48 } 49 50 void set(const SkIRect& r) { 51 fLeft = SkToS16(r.fLeft); 52 fTop = SkToS16(r.fTop); 53 fRight = SkToS16(r.fRight); 54 fBottom = SkToS16(r.fBottom); 55 } 56 }; 57 58 /** Returns true if the rectangles have a nonzero area of overlap. It assumed that rects can be 59 infinitely small but not "inverted". */ 60 static inline bool GrRectsOverlap(const SkRect& a, const SkRect& b) { 61 // See skbug.com/6607 about the isFinite() checks. 62 SkASSERT(!a.isFinite() || (a.fLeft <= a.fRight && a.fTop <= a.fBottom)); 63 SkASSERT(!b.isFinite() || (b.fLeft <= b.fRight && b.fTop <= b.fBottom)); 64 return a.fRight > b.fLeft && a.fBottom > b.fTop && b.fRight > a.fLeft && b.fBottom > a.fTop; 65 } 66 67 /** Returns true if the rectangles overlap or share an edge or corner. It assumed that rects can be 68 infinitely small but not "inverted". */ 69 static inline bool GrRectsTouchOrOverlap(const SkRect& a, const SkRect& b) { 70 // See skbug.com/6607 about the isFinite() checks. 71 SkASSERT(!a.isFinite() || (a.fLeft <= a.fRight && a.fTop <= a.fBottom)); 72 SkASSERT(!b.isFinite() || (b.fLeft <= b.fRight && b.fTop <= b.fBottom)); 73 return a.fRight >= b.fLeft && a.fBottom >= b.fTop && b.fRight >= a.fLeft && b.fBottom >= a.fTop; 74 } 75 #endif 76