1 /* 2 * Copyright 2001-2012, Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 #ifndef _RECT_H 6 #define _RECT_H 7 8 9 #include <math.h> 10 11 #include <Point.h> 12 #include <Size.h> 13 14 15 class BRect { 16 public: 17 float left; 18 float top; 19 float right; 20 float bottom; 21 22 BRect(); 23 BRect(const BRect& other); 24 BRect(float left, float top, float right, 25 float bottom); 26 BRect(BPoint leftTop, BPoint rightBottom); 27 BRect(BPoint leftTop, BSize size); 28 BRect(float side); 29 30 BRect& operator=(const BRect& other); 31 void Set(float left, float top, float right, 32 float bottom); 33 34 void PrintToStream() const; 35 36 BPoint LeftTop() const; 37 BPoint RightBottom() const; 38 BPoint LeftBottom() const; 39 BPoint RightTop() const; 40 41 void SetLeftTop(const BPoint point); 42 void SetRightBottom(const BPoint point); 43 void SetLeftBottom(const BPoint point); 44 void SetRightTop(const BPoint point); 45 46 // Transformation 47 void InsetBy(BPoint inset); 48 void InsetBy(float dx, float dy); 49 void OffsetBy(BPoint delta); 50 void OffsetBy(float dx, float dy); 51 void OffsetTo(BPoint offset); 52 void OffsetTo(float x, float y); 53 54 // Expression transformations 55 BRect& InsetBySelf(BPoint inset); 56 BRect& InsetBySelf(float dx, float dy); 57 BRect InsetByCopy(BPoint inset) const; 58 BRect InsetByCopy(float dx, float dy) const; 59 BRect& OffsetBySelf(BPoint offset); 60 BRect& OffsetBySelf(float dx, float dy); 61 BRect OffsetByCopy(BPoint offset) const; 62 BRect OffsetByCopy(float dx, float dy) const; 63 BRect& OffsetToSelf(BPoint offset); 64 BRect& OffsetToSelf(float x, float y); 65 BRect OffsetToCopy(BPoint offset) const; 66 BRect OffsetToCopy(float x, float y) const; 67 68 // Comparison 69 bool operator==(BRect other) const; 70 bool operator!=(BRect other) const; 71 72 // Intersection and union 73 BRect operator&(BRect other) const; 74 BRect operator|(BRect other) const; 75 76 bool IsValid() const; 77 float Width() const; 78 int32 IntegerWidth() const; 79 float Height() const; 80 int32 IntegerHeight() const; 81 BSize Size() const; 82 83 bool Intersects(BRect rect) const; 84 bool Contains(BPoint point) const; 85 bool Contains(BRect rect) const; 86 }; 87 88 89 // #pragma mark - inline definitions 90 91 inline BPoint 92 BRect::LeftTop() const 93 { 94 return *(const BPoint*)&left; 95 } 96 97 98 inline BPoint 99 BRect::RightBottom() const 100 { 101 return *(const BPoint*)&right; 102 } 103 104 105 inline BPoint 106 BRect::LeftBottom() const 107 { 108 return BPoint(left, bottom); 109 } 110 111 112 inline BPoint 113 BRect::RightTop() const 114 { 115 return BPoint(right, top); 116 } 117 118 119 inline 120 BRect::BRect() 121 : 122 left(0), 123 top(0), 124 right(-1), 125 bottom(-1) 126 { 127 } 128 129 130 inline 131 BRect::BRect(float left, float top, float right, float bottom) 132 : 133 left(left), 134 top(top), 135 right(right), 136 bottom(bottom) 137 { 138 } 139 140 141 inline 142 BRect::BRect(const BRect& other) 143 : 144 left(other.left), 145 top(other.top), 146 right(other.right), 147 bottom(other.bottom) 148 { 149 } 150 151 152 inline 153 BRect::BRect(BPoint leftTop, BPoint rightBottom) 154 : 155 left(leftTop.x), 156 top(leftTop.y), 157 right(rightBottom.x), 158 bottom(rightBottom.y) 159 { 160 } 161 162 163 inline 164 BRect::BRect(BPoint leftTop, BSize size) 165 : 166 left(leftTop.x), 167 top(leftTop.y), 168 right(leftTop.x + size.width), 169 bottom(leftTop.y + size.height) 170 { 171 } 172 173 174 inline 175 BRect::BRect(float side) 176 : 177 left(0), 178 top(0), 179 right(side - 1), 180 bottom(side - 1) 181 { 182 } 183 184 185 inline BRect& 186 BRect::operator=(const BRect& other) 187 { 188 left = other.left; 189 top = other.top; 190 right = other.right; 191 bottom = other.bottom; 192 return *this; 193 } 194 195 196 inline void 197 BRect::Set(float left, float top, float right, float bottom) 198 { 199 this->left = left; 200 this->top = top; 201 this->right = right; 202 this->bottom = bottom; 203 } 204 205 206 inline bool 207 BRect::IsValid() const 208 { 209 return left <= right && top <= bottom; 210 } 211 212 213 inline int32 214 BRect::IntegerWidth() const 215 { 216 return (int32)ceil(right - left); 217 } 218 219 220 inline float 221 BRect::Width() const 222 { 223 return right - left; 224 } 225 226 227 inline int32 228 BRect::IntegerHeight() const 229 { 230 return (int32)ceil(bottom - top); 231 } 232 233 234 inline float 235 BRect::Height() const 236 { 237 return bottom - top; 238 } 239 240 241 inline BSize 242 BRect::Size() const 243 { 244 return BSize(right - left, bottom - top); 245 } 246 247 248 #endif // _RECT_H 249