1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef PPAPI_CPP_RECT_H_ 6 #define PPAPI_CPP_RECT_H_ 7 8 #include "ppapi/c/pp_rect.h" 9 #include "ppapi/cpp/point.h" 10 #include "ppapi/cpp/size.h" 11 12 /// @file 13 /// This file defines the APIs for creating a 2 dimensional rectangle. 14 15 namespace pp { 16 17 /// A 2 dimensional rectangle. A rectangle is represented by x and y (which 18 /// identifies the upper-left corner of the rectangle), width, and height. 19 class Rect { 20 public: 21 22 /// The default constructor. Creates a <code>Rect</code> in the upper-left 23 /// at 0,0 with height and width of 0. Rect()24 Rect() { 25 rect_.point.x = 0; 26 rect_.point.y = 0; 27 rect_.size.width = 0; 28 rect_.size.height = 0; 29 } 30 31 /// A constructor accepting a reference to a <code>PP_Rect and</code> 32 /// converting the <code>PP_Rect</code> to a <code>Rect</code>. This is an 33 /// implicit conversion constructor. 34 /// 35 /// @param[in] rect A <code>PP_Rect</code>. Rect(const PP_Rect & rect)36 Rect(const PP_Rect& rect) { // Implicit. 37 set_x(rect.point.x); 38 set_y(rect.point.y); 39 set_width(rect.size.width); 40 set_height(rect.size.height); 41 } 42 43 /// A constructor accepting two int32_t values for width and height and 44 /// converting them to a <code>Rect</code> in the upper-left starting 45 /// coordinate of 0,0. 46 /// 47 /// @param[in] w An int32_t value representing a width. 48 /// @param[in] h An int32_t value representing a height. Rect(int32_t w,int32_t h)49 Rect(int32_t w, int32_t h) { 50 set_x(0); 51 set_y(0); 52 set_width(w); 53 set_height(h); 54 } 55 56 /// A constructor accepting four int32_t values for width, height, x, and y. 57 /// 58 /// @param[in] x An int32_t value representing a horizontal coordinate 59 /// of a point, starting with 0 as the left-most coordinate. 60 /// @param[in] y An int32_t value representing a vertical coordinate 61 /// of a point, starting with 0 as the top-most coordinate. 62 /// @param[in] w An int32_t value representing a width. 63 /// @param[in] h An int32_t value representing a height. Rect(int32_t x,int32_t y,int32_t w,int32_t h)64 Rect(int32_t x, int32_t y, int32_t w, int32_t h) { 65 set_x(x); 66 set_y(y); 67 set_width(w); 68 set_height(h); 69 } 70 71 /// A constructor accepting a pointer to a Size and converting the 72 /// <code>Size</code> to a <code>Rect</code> in the upper-left starting 73 /// coordinate of 0,0. 74 /// 75 /// @param[in] s A pointer to a <code>Size</code>. Rect(const Size & s)76 explicit Rect(const Size& s) { 77 set_x(0); 78 set_y(0); 79 set_size(s); 80 } 81 82 /// A constructor accepting a pointer to a <code>Point</code> representing 83 /// the origin of the rectangle and a pointer to a <code>Size</code> 84 /// representing the height and width. 85 /// 86 /// @param[in] origin A pointer to a <code>Point</code> representing the 87 /// upper-left starting coordinate. 88 /// @param[in] size A pointer to a <code>Size</code> representing the height 89 /// and width. Rect(const Point & origin,const Size & size)90 Rect(const Point& origin, const Size& size) { 91 set_point(origin); 92 set_size(size); 93 } 94 95 /// Destructor. ~Rect()96 ~Rect() { 97 } 98 99 /// PP_Rect() allows implicit conversion of a <code>Rect</code> to a 100 /// <code>PP_Rect</code>. 101 /// 102 /// @return A <code>Point</code>. PP_Rect()103 operator PP_Rect() const { 104 return rect_; 105 } 106 107 /// Getter function for returning the internal <code>PP_Rect</code> struct. 108 /// 109 /// @return A const reference to the internal <code>PP_Rect</code> struct. pp_rect()110 const PP_Rect& pp_rect() const { 111 return rect_; 112 } 113 114 /// Getter function for returning the internal <code>PP_Rect</code> struct. 115 /// 116 /// @return A mutable reference to the <code>PP_Rect</code> struct. pp_rect()117 PP_Rect& pp_rect() { 118 return rect_; 119 } 120 121 122 /// Getter function for returning the value of x. 123 /// 124 /// @return The value of x for this <code>Point</code>. x()125 int32_t x() const { 126 return rect_.point.x; 127 } 128 129 /// Setter function for setting the value of x. 130 /// 131 /// @param[in] in_x A new x value. set_x(int32_t in_x)132 void set_x(int32_t in_x) { 133 rect_.point.x = in_x; 134 } 135 136 /// Getter function for returning the value of y. 137 /// 138 /// @return The value of y for this <code>Point</code>. y()139 int32_t y() const { 140 return rect_.point.y; 141 } 142 143 /// Setter function for setting the value of y. 144 /// 145 /// @param[in] in_y A new y value. set_y(int32_t in_y)146 void set_y(int32_t in_y) { 147 rect_.point.y = in_y; 148 } 149 150 /// Getter function for returning the value of width. 151 /// 152 /// @return The value of width for this <code>Rect</code>. width()153 int32_t width() const { 154 return rect_.size.width; 155 } 156 157 /// Setter function for setting the value of width. 158 /// 159 /// @param[in] w A new width value. set_width(int32_t w)160 void set_width(int32_t w) { 161 if (w < 0) { 162 PP_DCHECK(w >= 0); 163 w = 0; 164 } 165 rect_.size.width = w; 166 } 167 168 /// Getter function for returning the value of height. 169 /// 170 /// @return The value of height for this <code>Rect</code>. height()171 int32_t height() const { 172 return rect_.size.height; 173 } 174 175 /// Setter function for setting the value of height. 176 /// 177 /// @param[in] h A new width height. set_height(int32_t h)178 void set_height(int32_t h) { 179 if (h < 0) { 180 PP_DCHECK(h >= 0); 181 h = 0; 182 } 183 rect_.size.height = h; 184 } 185 186 /// Getter function for returning the <code>Point</code>. 187 /// 188 /// @return A <code>Point</code>. point()189 Point point() const { 190 return Point(rect_.point); 191 } 192 193 /// Setter function for setting the value of the <code>Point</code>. 194 /// 195 /// @param[in] origin A <code>Point</code> representing the upper-left 196 /// starting coordinate. set_point(const Point & origin)197 void set_point(const Point& origin) { 198 rect_.point = origin; 199 } 200 201 /// Getter function for returning the <code>Size</code>. 202 /// 203 /// @return The size of the rectangle. size()204 Size size() const { 205 return Size(rect_.size); 206 } 207 208 /// Setter function for setting the <code>Size</code>. 209 /// 210 /// @param[in] s A pointer to a <code>Size</code> representing the height 211 /// and width. set_size(const Size & s)212 void set_size(const Size& s) { 213 rect_.size.width = s.width(); 214 rect_.size.height = s.height(); 215 } 216 217 /// Getter function to get the upper-bound for the x-coordinates of the 218 /// rectangle. Note that this coordinate value is one past the highest x 219 /// value of pixels in the rectangle. This loop will access all the pixels 220 /// in a horizontal line in the rectangle: 221 /// <code>for (int32_t x = rect.x(); x < rect.right(); ++x) {}</code> 222 /// 223 /// @return The value of x + width for this point. right()224 int32_t right() const { 225 return x() + width(); 226 } 227 228 /// Getter function to get the upper-bound for the y-coordinates of the 229 /// rectangle. Note that this coordinate value is one past the highest xy 230 /// value of pixels in the rectangle. This loop will access all the pixels 231 /// in a horizontal line in the rectangle: 232 /// <code>for (int32_t y = rect.y(); y < rect.bottom(); ++y) {}</code> 233 /// 234 /// @return The value of y + height for this point. bottom()235 int32_t bottom() const { 236 return y() + height(); 237 } 238 239 /// Setter function for setting the value of the <code>Rect</code>. 240 /// 241 /// @param[in] x A new x value. 242 /// @param[in] y A new y value. 243 /// @param[in] w A new width value. 244 /// @param[in] h A new height value. SetRect(int32_t x,int32_t y,int32_t w,int32_t h)245 void SetRect(int32_t x, int32_t y, int32_t w, int32_t h) { 246 set_x(x); 247 set_y(y); 248 set_width(w); 249 set_height(h); 250 } 251 252 /// Setter function for setting the value of the <code>Rect</code>. 253 /// 254 /// @param[in] rect A pointer to a <code>PP_Rect</code>. SetRect(const PP_Rect & rect)255 void SetRect(const PP_Rect& rect) { 256 rect_ = rect; 257 } 258 259 /// Inset() shrinks the rectangle by a horizontal and vertical 260 /// distance on all sides. 261 /// 262 /// @param[in] horizontal An int32_t value representing a horizontal 263 /// shrinking distance. 264 /// @param[in] vertical An int32_t value representing a vertical 265 /// shrinking distance. Inset(int32_t horizontal,int32_t vertical)266 void Inset(int32_t horizontal, int32_t vertical) { 267 Inset(horizontal, vertical, horizontal, vertical); 268 } 269 270 /// Inset() shrinks the rectangle by the specified amount on each 271 /// side. 272 /// 273 /// @param[in] left An int32_t value representing a left 274 /// shrinking distance. 275 /// @param[in] top An int32_t value representing a top 276 /// shrinking distance. 277 /// @param[in] right An int32_t value representing a right 278 /// shrinking distance. 279 /// @param[in] bottom An int32_t value representing a bottom 280 /// shrinking distance. 281 void Inset(int32_t left, int32_t top, int32_t right, int32_t bottom); 282 283 /// Offset() moves the rectangle by a horizontal and vertical distance. 284 /// 285 /// @param[in] horizontal An int32_t value representing a horizontal 286 /// move distance. 287 /// @param[in] vertical An int32_t value representing a vertical 288 /// move distance. 289 void Offset(int32_t horizontal, int32_t vertical); 290 291 /// Offset() moves the rectangle by a horizontal and vertical distance. 292 /// 293 /// @param[in] point A pointer to a <code>Point</code> representing the 294 /// horizontal and vertical move distances. Offset(const Point & point)295 void Offset(const Point& point) { 296 Offset(point.x(), point.y()); 297 } 298 299 /// IsEmpty() determines if the area of a rectangle is zero. Returns true if 300 /// the area of the rectangle is zero. 301 /// 302 /// @return true if the area of the rectangle is zero. IsEmpty()303 bool IsEmpty() const { 304 return rect_.size.width == 0 || rect_.size.height == 0; 305 } 306 307 /// Contains() determines if the point identified by point_x and point_y 308 /// falls inside this rectangle. The point (x, y) is inside the rectangle, 309 /// but the point (x + width, y + height) is not. 310 /// 311 /// @param[in] point_x An int32_t value representing a x value. 312 /// @param[in] point_y An int32_t value representing a y value. 313 /// 314 /// @return true if the point_x and point_y fall inside the rectangle. 315 bool Contains(int32_t point_x, int32_t point_y) const; 316 317 /// Contains() determines if the specified point is contained by this 318 /// rectangle. 319 /// 320 /// @param[in] point A pointer to a Point representing a 2D coordinate. 321 /// 322 /// @return true if the point_x and point_y fall inside the rectangle. Contains(const Point & point)323 bool Contains(const Point& point) const { 324 return Contains(point.x(), point.y()); 325 } 326 327 /// Contains() determines if this rectangle contains the specified rectangle. 328 /// 329 /// @param[in] rect A pointer to a <code>Rect</code>. 330 /// 331 /// @return true if the rectangle fall inside this rectangle. 332 bool Contains(const Rect& rect) const; 333 334 /// Intersects() determines if this rectangle intersects the specified 335 /// rectangle. 336 /// 337 /// @param[in] rect A pointer to a <code>Rect</code>. 338 /// 339 /// @return true if the rectangle intersects this rectangle. 340 bool Intersects(const Rect& rect) const; 341 342 /// Intersect() computes the intersection of this rectangle with the given 343 /// rectangle. 344 /// 345 /// @param[in] rect A pointer to a <code>Rect</code>. 346 /// 347 /// @return A <code>Rect</code> representing the intersection. 348 Rect Intersect(const Rect& rect) const; 349 350 /// Union() computes the union of this rectangle with the given rectangle. 351 /// The union is the smallest rectangle containing both rectangles. 352 /// 353 /// @param[in] rect A pointer to a <code>Rect</code>. 354 /// 355 /// @return A <code>Rect</code> representing the union. 356 Rect Union(const Rect& rect) const; 357 358 /// Subtract() computes the rectangle resulting from subtracting 359 /// <code>rect</code> from this Rect. If <code>rect</code>does not intersect 360 /// completely in either the x or y direction, then <code>*this</code> is 361 /// returned. If <code>rect</code> contains <code>this</code>, then an empty 362 /// <code>Rect</code> is returned. 363 /// 364 /// @param[in] rect A pointer to a <code>Rect</code>. 365 /// 366 /// @return A <code>Rect</code> representing the subtraction. 367 Rect Subtract(const Rect& rect) const; 368 369 /// AdjustToFit() fits as much of the receiving rectangle within 370 /// the supplied rectangle as possible, returning the result. For example, 371 /// if the receiver had a x-location of 2 and a width of 4, and the supplied 372 /// rectangle had an x-location of 0 with a width of 5, the returned 373 /// rectangle would have an x-location of 1 with a width of 4. 374 /// 375 /// @param[in] rect A pointer to a <code>Rect</code>. 376 /// 377 /// @return A <code>Rect</code> representing the difference between this 378 /// rectangle and the receiving rectangle. 379 Rect AdjustToFit(const Rect& rect) const; 380 381 /// CenterPoint() determines the center of this rectangle. 382 /// 383 /// @return A <code>Point</code> representing the center of this rectangle. 384 Point CenterPoint() const; 385 386 /// SharesEdgeWith() determines if this rectangle shares an entire edge 387 /// (same width or same height) with the given rectangle, and the 388 /// rectangles do not overlap. 389 /// 390 /// @param[in] rect A pointer to a <code>Rect</code>. 391 /// 392 /// @return true if this rectangle and supplied rectangle share an edge. 393 bool SharesEdgeWith(const Rect& rect) const; 394 395 private: 396 PP_Rect rect_; 397 }; 398 399 /// A 2 dimensional rectangle. A rectangle is represented by x and y (which 400 /// identifies the upper-left corner of the rectangle), width, and height. 401 class FloatRect { 402 public: 403 404 /// The default constructor. Creates a <code>Rect</code> in the upper-left 405 /// at 0.0f,0.0f with height and width of 0.0f. FloatRect()406 FloatRect() { 407 rect_.point.x = 0.0f; 408 rect_.point.y = 0.0f; 409 rect_.size.width = 0.0f; 410 rect_.size.height = 0.0f; 411 } 412 413 /// A constructor accepting a reference to a <code>PP_FloatRect and</code> 414 /// converting the <code>PP_FloatRect</code> to a <code>FloatRect</code>. This 415 /// is an implicit conversion constructor. 416 /// 417 /// @param[in] rect A <code>PP_FloatRect</code>. FloatRect(const PP_FloatRect & rect)418 FloatRect(const PP_FloatRect& rect) { // Implicit. 419 set_x(rect.point.x); 420 set_y(rect.point.y); 421 set_width(rect.size.width); 422 set_height(rect.size.height); 423 } 424 425 /// A constructor accepting two float values for width and height and 426 /// converting them to a <code>FloatRect</code> in the upper-left starting 427 /// coordinate of 0.0f, 0.0f. 428 /// 429 /// @param[in] w An float value representing a width. 430 /// @param[in] h An float value representing a height. FloatRect(float w,float h)431 FloatRect(float w, float h) { 432 set_x(0); 433 set_y(0); 434 set_width(w); 435 set_height(h); 436 } 437 438 /// A constructor accepting four float values for width, height, x, and y. 439 /// 440 /// @param[in] x An float value representing a horizontal coordinate 441 /// of a point, starting with 0.0f as the left-most coordinate. 442 /// @param[in] y An float value representing a vertical coordinate 443 /// of a point, starting with 0.0f as the top-most coordinate. 444 /// @param[in] w An float value representing a width. 445 /// @param[in] h An float value representing a height. FloatRect(float x,float y,float w,float h)446 FloatRect(float x, float y, float w, float h) { 447 set_x(x); 448 set_y(y); 449 set_width(w); 450 set_height(h); 451 } 452 453 /// A constructor accepting a pointer to a FloatSize and converting the 454 /// <code>FloatSize</code> to a <code>FloatRect</code> in the upper-left 455 /// starting coordinate of 0.0f,0.0f. 456 /// 457 /// @param[in] s A pointer to a <code>FloatSize</code>. FloatRect(const FloatSize & s)458 explicit FloatRect(const FloatSize& s) { 459 set_x(0); 460 set_y(0); 461 set_size(s); 462 } 463 464 /// A constructor accepting a pointer to a <code>FloatPoint</code> 465 /// representing the origin of the rectangle and a pointer to a 466 /// <code>FloatSize</code> representing the height and width. 467 /// 468 /// @param[in] origin A pointer to a <code>FloatPoint</code> representing the 469 /// upper-left starting coordinate. 470 /// @param[in] size A pointer to a <code>FloatSize</code> representing the 471 /// height and width. FloatRect(const FloatPoint & origin,const FloatSize & size)472 FloatRect(const FloatPoint& origin, const FloatSize& size) { 473 set_point(origin); 474 set_size(size); 475 } 476 477 /// Destructor. ~FloatRect()478 ~FloatRect() { 479 } 480 481 /// PP_FloatRect() allows implicit conversion of a <code>FloatRect</code> to a 482 /// <code>PP_FloatRect</code>. 483 /// 484 /// @return A <code>Point</code>. PP_FloatRect()485 operator PP_FloatRect() const { 486 return rect_; 487 } 488 489 /// Getter function for returning the internal <code>PP_FloatRect</code> 490 /// struct. 491 /// 492 /// @return A const reference to the internal <code>PP_FloatRect</code> 493 /// struct. pp_float_rect()494 const PP_FloatRect& pp_float_rect() const { 495 return rect_; 496 } 497 498 /// Getter function for returning the internal <code>PP_FloatRect</code> 499 /// struct. 500 /// 501 /// @return A mutable reference to the <code>PP_FloatRect</code> struct. pp_float_rect()502 PP_FloatRect& pp_float_rect() { 503 return rect_; 504 } 505 506 507 /// Getter function for returning the value of x. 508 /// 509 /// @return The value of x for this <code>FloatPoint</code>. x()510 float x() const { 511 return rect_.point.x; 512 } 513 514 /// Setter function for setting the value of x. 515 /// 516 /// @param[in] in_x A new x value. set_x(float in_x)517 void set_x(float in_x) { 518 rect_.point.x = in_x; 519 } 520 521 /// Getter function for returning the value of y. 522 /// 523 /// @return The value of y for this <code>FloatPoint</code>. y()524 float y() const { 525 return rect_.point.y; 526 } 527 528 /// Setter function for setting the value of y. 529 /// 530 /// @param[in] in_y A new y value. set_y(float in_y)531 void set_y(float in_y) { 532 rect_.point.y = in_y; 533 } 534 535 /// Getter function for returning the value of width. 536 /// 537 /// @return The value of width for this <code>FloatRect</code>. width()538 float width() const { 539 return rect_.size.width; 540 } 541 542 /// Setter function for setting the value of width. 543 /// 544 /// @param[in] w A new width value. set_width(float w)545 void set_width(float w) { 546 if (w < 0.0f) { 547 PP_DCHECK(w >= 0.0f); 548 w = 0.0f; 549 } 550 rect_.size.width = w; 551 } 552 553 /// Getter function for returning the value of height. 554 /// 555 /// @return The value of height for this <code>FloatRect</code>. height()556 float height() const { 557 return rect_.size.height; 558 } 559 560 /// Setter function for setting the value of height. 561 /// 562 /// @param[in] h A new width height. set_height(float h)563 void set_height(float h) { 564 if (h < 0.0f) { 565 PP_DCHECK(h >= 0.0f); 566 h = 0.0f; 567 } 568 rect_.size.height = h; 569 } 570 571 /// Getter function for returning the <code>FloatPoint</code>. 572 /// 573 /// @return A <code>FloatPoint</code>. point()574 FloatPoint point() const { 575 return FloatPoint(rect_.point); 576 } 577 578 /// Setter function for setting the value of the <code>FloatPoint</code>. 579 /// 580 /// @param[in] origin A <code>FloatPoint</code> representing the upper-left 581 /// starting coordinate. set_point(const FloatPoint & origin)582 void set_point(const FloatPoint& origin) { 583 rect_.point = origin; 584 } 585 586 /// Getter function for returning the <code>FloatSize</code>. 587 /// 588 /// @return The size of the rectangle. Floatsize()589 FloatSize Floatsize() const { 590 return FloatSize(rect_.size); 591 } 592 593 /// Setter function for setting the <code>FloatSize</code>. 594 /// 595 /// @param[in] s A pointer to a <code>FloatSize</code> representing the height 596 /// and width. set_size(const FloatSize & s)597 void set_size(const FloatSize& s) { 598 rect_.size.width = s.width(); 599 rect_.size.height = s.height(); 600 } 601 602 /// Getter function to get the upper-bound for the x-coordinates of the 603 /// rectangle. Note that this coordinate value is one past the highest x 604 /// value of pixels in the rectangle. This loop will access all the pixels 605 /// in a horizontal line in the rectangle: 606 /// <code>for (float x = rect.x(); x < rect.right(); ++x) {}</code> 607 /// 608 /// @return The value of x + width for this point. right()609 float right() const { 610 return x() + width(); 611 } 612 613 /// Getter function to get the upper-bound for the y-coordinates of the 614 /// rectangle. Note that this coordinate value is one past the highest xy 615 /// value of pixels in the rectangle. This loop will access all the pixels 616 /// in a horizontal line in the rectangle: 617 /// <code>for (float y = rect.y(); y < rect.bottom(); ++y) {}</code> 618 /// 619 /// @return The value of y + height for this point. bottom()620 float bottom() const { 621 return y() + height(); 622 } 623 624 /// Setter function for setting the value of the <code>FloatRect</code>. 625 /// 626 /// @param[in] x A new x value. 627 /// @param[in] y A new y value. 628 /// @param[in] w A new width value. 629 /// @param[in] h A new height value. SetRect(float x,float y,float w,float h)630 void SetRect(float x, float y, float w, float h) { 631 set_x(x); 632 set_y(y); 633 set_width(w); 634 set_height(h); 635 } 636 637 /// Setter function for setting the value of the <code>FloatRect</code>. 638 /// 639 /// @param[in] rect A pointer to a <code>PP_FloatRect</code>. SetRect(const PP_FloatRect & rect)640 void SetRect(const PP_FloatRect& rect) { 641 rect_ = rect; 642 } 643 644 /// Inset() shrinks the rectangle by a horizontal and vertical 645 /// distance on all sides. 646 /// 647 /// @param[in] horizontal An float value representing a horizontal 648 /// shrinking distance. 649 /// @param[in] vertical An float value representing a vertical 650 /// shrinking distance. Inset(float horizontal,float vertical)651 void Inset(float horizontal, float vertical) { 652 Inset(horizontal, vertical, horizontal, vertical); 653 } 654 655 /// Inset() shrinks the rectangle by the specified amount on each 656 /// side. 657 /// 658 /// @param[in] left An float value representing a left 659 /// shrinking distance. 660 /// @param[in] top An float value representing a top 661 /// shrinking distance. 662 /// @param[in] right An float value representing a right 663 /// shrinking distance. 664 /// @param[in] bottom An float value representing a bottom 665 /// shrinking distance. 666 void Inset(float left, float top, float right, float bottom); 667 668 /// Offset() moves the rectangle by a horizontal and vertical distance. 669 /// 670 /// @param[in] horizontal An float value representing a horizontal 671 /// move distance. 672 /// @param[in] vertical An float value representing a vertical 673 /// move distance. 674 void Offset(float horizontal, float vertical); 675 676 /// Offset() moves the rectangle by a horizontal and vertical distance. 677 /// 678 /// @param[in] point A pointer to a <code>FloatPoint</code> representing the 679 /// horizontal and vertical move distances. Offset(const FloatPoint & point)680 void Offset(const FloatPoint& point) { 681 Offset(point.x(), point.y()); 682 } 683 684 /// IsEmpty() determines if the area of a rectangle is zero. Returns true if 685 /// the area of the rectangle is zero. 686 /// 687 /// @return true if the area of the rectangle is zero. IsEmpty()688 bool IsEmpty() const { 689 return rect_.size.width == 0.0f || rect_.size.height == 0.0f; 690 } 691 692 /// Contains() determines if the point identified by point_x and point_y 693 /// falls inside this rectangle. The point (x, y) is inside the rectangle, 694 /// but the point (x + width, y + height) is not. 695 /// 696 /// @param[in] point_x An float value representing a x value. 697 /// @param[in] point_y An float value representing a y value. 698 /// 699 /// @return true if the point_x and point_y fall inside the rectangle. 700 bool Contains(float point_x, float point_y) const; 701 702 /// Contains() determines if the specified point is contained by this 703 /// rectangle. 704 /// 705 /// @param[in] point A pointer to a Point representing a 2D coordinate. 706 /// 707 /// @return true if the point_x and point_y fall inside the rectangle. Contains(const FloatPoint & point)708 bool Contains(const FloatPoint& point) const { 709 return Contains(point.x(), point.y()); 710 } 711 712 /// Contains() determines if this rectangle contains the specified rectangle. 713 /// 714 /// @param[in] rect A pointer to a <code>FloatRect</code>. 715 /// 716 /// @return true if the rectangle fall inside this rectangle. 717 bool Contains(const FloatRect& rect) const; 718 719 /// Intersects() determines if this rectangle intersects the specified 720 /// rectangle. 721 /// 722 /// @param[in] rect A pointer to a <code>FloatRect</code>. 723 /// 724 /// @return true if the rectangle intersects this rectangle. 725 bool Intersects(const FloatRect& rect) const; 726 727 /// Intersect() computes the intersection of this rectangle with the given 728 /// rectangle. 729 /// 730 /// @param[in] rect A pointer to a <code>FloatRect</code>. 731 /// 732 /// @return A <code>FloatRect</code> representing the intersection. 733 FloatRect Intersect(const FloatRect& rect) const; 734 735 /// Union() computes the union of this rectangle with the given rectangle. 736 /// The union is the smallest rectangle containing both rectangles. 737 /// 738 /// @param[in] rect A pointer to a <code>FloatRect</code>. 739 /// 740 /// @return A <code>FloatRect</code> representing the union. 741 FloatRect Union(const FloatRect& rect) const; 742 743 /// Subtract() computes the rectangle resulting from subtracting 744 /// <code>rect</code> from this Rect. If <code>rect</code>does not intersect 745 /// completely in either the x or y direction, then <code>*this</code> is 746 /// returned. If <code>rect</code> contains <code>this</code>, then an empty 747 /// <code>Rect</code> is returned. 748 /// 749 /// @param[in] rect A pointer to a <code>FloatRect</code>. 750 /// 751 /// @return A <code>FloatRect</code> representing the subtraction. 752 FloatRect Subtract(const FloatRect& rect) const; 753 754 /// AdjustToFit() fits as much of the receiving rectangle within 755 /// the supplied rectangle as possible, returning the result. For example, 756 /// if the receiver had a x-location of 2 and a width of 4, and the supplied 757 /// rectangle had an x-location of 0 with a width of 5, the returned 758 /// rectangle would have an x-location of 1 with a width of 4. 759 /// 760 /// @param[in] rect A pointer to a <code>FloatRect</code>. 761 /// 762 /// @return A <code>FloatRect</code> representing the difference between this 763 /// rectangle and the receiving rectangle. 764 FloatRect AdjustToFit(const FloatRect& rect) const; 765 766 /// CenterPoint() determines the center of this rectangle. 767 /// 768 /// @return A <code>FloatPoint</code> representing the center of this 769 /// rectangle. 770 FloatPoint CenterPoint() const; 771 772 /// SharesEdgeWith() determines if this rectangle shares an entire edge 773 /// (same width or same height) with the given rectangle, and the 774 /// rectangles do not overlap. 775 /// 776 /// @param[in] rect A pointer to a <code>FloatRect</code>. 777 /// 778 /// @return true if this rectangle and supplied rectangle share an edge. 779 bool SharesEdgeWith(const FloatRect& rect) const; 780 781 private: 782 PP_FloatRect rect_; 783 }; 784 785 } // namespace pp 786 787 /// This function determines whether the x, y, width, and height values of two 788 /// rectangles and are equal. 789 /// 790 /// @param[in] lhs The <code>Rect</code> on the left-hand side of the equation. 791 /// @param[in] rhs The <code>Rect</code> on the right-hand side of the equation. 792 /// 793 /// @return true if they are equal, false if unequal. 794 inline bool operator==(const pp::Rect& lhs, const pp::Rect& rhs) { 795 return lhs.x() == rhs.x() && 796 lhs.y() == rhs.y() && 797 lhs.width() == rhs.width() && 798 lhs.height() == rhs.height(); 799 } 800 801 /// This function determines whether two Rects are not equal. 802 /// 803 /// @param[in] lhs The <code>Rect</code> on the left-hand side of the equation. 804 /// @param[in] rhs The <code>Rect</code> on the right-hand side of the 805 /// equation. 806 /// 807 /// @return true if the given Rects are equal, otherwise false. 808 inline bool operator!=(const pp::Rect& lhs, const pp::Rect& rhs) { 809 return !(lhs == rhs); 810 } 811 812 /// This function determines whether the x, y, width, and height values of two 813 /// rectangles and are equal. 814 /// 815 /// @param[in] lhs The <code>FloatRect</code> on the left-hand side of the 816 /// equation. 817 /// @param[in] rhs The <code>FloatRect</code> on the right-hand side of the 818 /// equation. 819 /// 820 /// @return true if they are equal, false if unequal. 821 inline bool operator==(const pp::FloatRect& lhs, const pp::FloatRect& rhs) { 822 return lhs.x() == rhs.x() && 823 lhs.y() == rhs.y() && 824 lhs.width() == rhs.width() && 825 lhs.height() == rhs.height(); 826 } 827 828 /// This function determines whether two Rects are not equal. 829 /// 830 /// @param[in] lhs The <code>FloatRect</code> on the left-hand side of the 831 /// equation. 832 /// @param[in] rhs The <code>FloatRect</code> on the right-hand side of the 833 /// equation. 834 /// 835 /// @return true if the given Rects are equal, otherwise false. 836 inline bool operator!=(const pp::FloatRect& lhs, const pp::FloatRect& rhs) { 837 return !(lhs == rhs); 838 } 839 840 #endif 841 842