Pepper_47_C++_interfaces
rect.h
Go to the documentation of this file.
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.
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>.
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.
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.
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>.
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.
90  Rect(const Point& origin, const Size& size) {
91  set_point(origin);
92  set_size(size);
93  }
94 
95  /// Destructor.
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>.
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.
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.
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>.
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.
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>.
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.
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>.
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.
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>.
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.
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>.
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.
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.
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.
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.
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.
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.
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>.
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.
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.
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.
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.
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.
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>.
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.
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.
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>.
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.
472  FloatRect(const FloatPoint& origin, const FloatSize& size) {
473  set_point(origin);
474  set_size(size);
475  }
476 
477  /// Destructor.
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>.
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.
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.
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>.
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.
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>.
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.
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>.
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.
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>.
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.
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>.
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.
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.
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.
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.
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.
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.
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>.
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.
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.
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.
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.
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 
float height() const
Definition: rect.h:556
bool Intersects(const FloatRect &rect) const
Definition: rect.cc:152
float x() const
Definition: rect.h:510
Rect(int32_t x, int32_t y, int32_t w, int32_t h)
Definition: rect.h:64
PP_Rect & pp_rect()
Definition: rect.h:117
Point CenterPoint() const
Definition: rect.cc:120
int32_t x() const
Definition: rect.h:125
float bottom() const
Definition: rect.h:620
float right() const
Definition: rect.h:609
void Inset(float horizontal, float vertical)
Definition: rect.h:651
float y() const
Definition: rect.h:524
Rect Union(const Rect &rect) const
Definition: rect.cc:65
void set_height(float h)
Definition: rect.h:563
Rect()
Definition: rect.h:24
Rect Subtract(const Rect &rect) const
Definition: rect.cc:80
void SetRect(int32_t x, int32_t y, int32_t w, int32_t h)
Definition: rect.h:245
FloatPoint CenterPoint() const
Definition: rect.cc:224
A size of an object based on width and height.
Definition: size.h:149
#define PP_DCHECK(a)
Definition: logging.h:16
A 2 dimensional point with 0,0 being the upper-left starting coordinate.
Definition: point.h:16
int32_t y() const
Definition: rect.h:139
Definition: rect.h:19
void SetRect(float x, float y, float w, float h)
Definition: rect.h:630
Rect(const Size &s)
Definition: rect.h:76
bool Intersects(const Rect &rect) const
Definition: rect.cc:48
int32_t y() const
Definition: point.h:84
bool IsEmpty() const
Definition: rect.h:303
FloatPoint point() const
Definition: rect.h:574
void Offset(const FloatPoint &point)
Definition: rect.h:680
Rect(const PP_Rect &rect)
Definition: rect.h:36
Rect AdjustToFit(const Rect &rect) const
Definition: rect.cc:110
FloatRect(const PP_FloatRect &rect)
Definition: rect.h:418
void set_y(float in_y)
Definition: rect.h:531
void set_size(const Size &s)
Definition: rect.h:212
void set_x(float in_x)
Definition: rect.h:517
void SetRect(const PP_FloatRect &rect)
Definition: rect.h:640
PP_FloatRect & pp_float_rect()
Definition: rect.h:502
void set_y(int32_t in_y)
Definition: rect.h:146
int height() const
Definition: size.h:96
void Offset(float horizontal, float vertical)
Definition: rect.cc:137
float width() const
Definition: rect.h:538
~Rect()
Destructor.
Definition: rect.h:96
float y() const
Definition: point.h:223
A size of an object based on width and height.
Definition: size.h:18
int32_t right() const
Definition: rect.h:224
Rect Intersect(const Rect &rect) const
Definition: rect.cc:53
int32_t height() const
Definition: rect.h:171
Point point() const
Definition: rect.h:189
FloatSize Floatsize() const
Definition: rect.h:589
Rect(const Point &origin, const Size &size)
Definition: rect.h:90
int32_t x() const
Definition: point.h:72
FloatRect(float x, float y, float w, float h)
Definition: rect.h:446
void set_x(int32_t in_x)
Definition: rect.h:132
FloatRect Intersect(const FloatRect &rect) const
Definition: rect.cc:157
void Offset(const Point &point)
Definition: rect.h:295
bool Contains(const Point &point) const
Definition: rect.h:323
float x() const
Definition: point.h:211
bool operator!=(const pp::Rect &lhs, const pp::Rect &rhs)
Definition: rect.h:808
Size size() const
Definition: rect.h:204
bool IsEmpty() const
Definition: rect.h:688
FloatRect(float w, float h)
Definition: rect.h:431
Rect(int32_t w, int32_t h)
Definition: rect.h:49
~FloatRect()
Destructor.
Definition: rect.h:478
int width() const
Definition: size.h:78
FloatRect()
Definition: rect.h:406
void Inset(int32_t horizontal, int32_t vertical)
Definition: rect.h:266
bool Contains(const FloatPoint &point) const
Definition: rect.h:708
void SetRect(const PP_Rect &rect)
Definition: rect.h:255
bool Contains(int32_t point_x, int32_t point_y) const
Definition: rect.cc:38
void set_point(const Point &origin)
Definition: rect.h:197
FloatRect AdjustToFit(const FloatRect &rect) const
Definition: rect.cc:214
bool operator==(const pp::Rect &lhs, const pp::Rect &rhs)
Definition: rect.h:794
float width() const
Definition: size.h:212
FloatRect Subtract(const FloatRect &rect) const
Definition: rect.cc:184
float height() const
Definition: size.h:230
FloatRect(const FloatSize &s)
Definition: rect.h:458
FloatRect(const FloatPoint &origin, const FloatSize &size)
Definition: rect.h:472
void set_point(const FloatPoint &origin)
Definition: rect.h:582
bool SharesEdgeWith(const FloatRect &rect) const
Definition: rect.cc:229
void set_width(int32_t w)
Definition: rect.h:160
bool SharesEdgeWith(const Rect &rect) const
Definition: rect.cc:124
const PP_Rect & pp_rect() const
Definition: rect.h:110
bool Contains(float point_x, float point_y) const
Definition: rect.cc:142
void set_width(float w)
Definition: rect.h:545
void set_size(const FloatSize &s)
Definition: rect.h:597
void Offset(int32_t horizontal, int32_t vertical)
Definition: rect.cc:33
int32_t width() const
Definition: rect.h:153
const PP_FloatRect & pp_float_rect() const
Definition: rect.h:494
FloatRect Union(const FloatRect &rect) const
Definition: rect.cc:169
int32_t bottom() const
Definition: rect.h:235
void set_height(int32_t h)
Definition: rect.h:178