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.
5 #ifndef PPAPI_CPP_RECT_H_
6 #define PPAPI_CPP_RECT_H_
8 #include "ppapi/c/pp_rect.h"
9 #include "ppapi/cpp/point.h"
10 #include "ppapi/cpp/size.h"
13 /// This file defines the APIs for creating a 2 dimensional rectangle.
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.
22 /// The default constructor. Creates a <code>Rect</code> in the upper-left
23 /// at 0,0 with height and width of 0.
28 rect_
.size
.height
= 0;
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.
35 /// @param[in] rect A <code>PP_Rect</code>.
36 Rect(const PP_Rect
& rect
) { // Implicit.
39 set_width(rect
.size
.width
);
40 set_height(rect
.size
.height
);
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.
47 /// @param[in] w An int32_t value representing a width.
48 /// @param[in] h An int32_t value representing a height.
49 Rect(int32_t w
, int32_t h
) {
56 /// A constructor accepting four int32_t values for width, height, x, and y.
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.
64 Rect(int32_t x
, int32_t y
, int32_t w
, int32_t h
) {
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.
75 /// @param[in] s A pointer to a <code>Size</code>.
76 explicit Rect(const Size
& s
) {
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.
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
90 Rect(const Point
& origin
, const Size
& size
) {
99 /// PP_Rect() allows implicit conversion of a <code>Rect</code> to a
100 /// <code>PP_Rect</code>.
102 /// @return A <code>Point</code>.
103 operator PP_Rect() const {
107 /// Getter function for returning the internal <code>PP_Rect</code> struct.
109 /// @return A const reference to the internal <code>PP_Rect</code> struct.
110 const PP_Rect
& pp_rect() const {
114 /// Getter function for returning the internal <code>PP_Rect</code> struct.
116 /// @return A mutable reference to the <code>PP_Rect</code> struct.
122 /// Getter function for returning the value of x.
124 /// @return The value of x for this <code>Point</code>.
126 return rect_
.point
.x
;
129 /// Setter function for setting the value of x.
131 /// @param[in] in_x A new x value.
132 void set_x(int32_t in_x
) {
133 rect_
.point
.x
= in_x
;
136 /// Getter function for returning the value of y.
138 /// @return The value of y for this <code>Point</code>.
140 return rect_
.point
.y
;
143 /// Setter function for setting the value of y.
145 /// @param[in] in_y A new y value.
146 void set_y(int32_t in_y
) {
147 rect_
.point
.y
= in_y
;
150 /// Getter function for returning the value of width.
152 /// @return The value of width for this <code>Rect</code>.
153 int32_t width() const {
154 return rect_
.size
.width
;
157 /// Setter function for setting the value of width.
159 /// @param[in] w A new width value.
160 void set_width(int32_t w
) {
165 rect_
.size
.width
= w
;
168 /// Getter function for returning the value of height.
170 /// @return The value of height for this <code>Rect</code>.
171 int32_t height() const {
172 return rect_
.size
.height
;
175 /// Setter function for setting the value of height.
177 /// @param[in] h A new width height.
178 void set_height(int32_t h
) {
183 rect_
.size
.height
= h
;
186 /// Getter function for returning the <code>Point</code>.
188 /// @return A <code>Point</code>.
189 Point
point() const {
190 return Point(rect_
.point
);
193 /// Setter function for setting the value of the <code>Point</code>.
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
;
201 /// Getter function for returning the <code>Size</code>.
203 /// @return The size of the rectangle.
205 return Size(rect_
.size
);
208 /// Setter function for setting the <code>Size</code>.
210 /// @param[in] s A pointer to a <code>Size</code> representing the height
212 void set_size(const Size
& s
) {
213 rect_
.size
.width
= s
.width();
214 rect_
.size
.height
= s
.height();
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>
223 /// @return The value of x + width for this point.
224 int32_t right() const {
225 return x() + width();
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>
234 /// @return The value of y + height for this point.
235 int32_t bottom() const {
236 return y() + height();
239 /// Setter function for setting the value of the <code>Rect</code>.
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.
245 void SetRect(int32_t x
, int32_t y
, int32_t w
, int32_t h
) {
252 /// Setter function for setting the value of the <code>Rect</code>.
254 /// @param[in] rect A pointer to a <code>PP_Rect</code>.
255 void SetRect(const PP_Rect
& rect
) {
259 /// Inset() shrinks the rectangle by a horizontal and vertical
260 /// distance on all sides.
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
);
270 /// Inset() shrinks the rectangle by the specified amount on each
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
);
283 /// Offset() moves the rectangle by a horizontal and vertical distance.
285 /// @param[in] horizontal An int32_t value representing a horizontal
287 /// @param[in] vertical An int32_t value representing a vertical
289 void Offset(int32_t horizontal
, int32_t vertical
);
291 /// Offset() moves the rectangle by a horizontal and vertical distance.
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());
299 /// IsEmpty() determines if the area of a rectangle is zero. Returns true if
300 /// the area of the rectangle is zero.
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;
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.
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.
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;
317 /// Contains() determines if the specified point is contained by this
320 /// @param[in] point A pointer to a Point representing a 2D coordinate.
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());
327 /// Contains() determines if this rectangle contains the specified rectangle.
329 /// @param[in] rect A pointer to a <code>Rect</code>.
331 /// @return true if the rectangle fall inside this rectangle.
332 bool Contains(const Rect
& rect
) const;
334 /// Intersects() determines if this rectangle intersects the specified
337 /// @param[in] rect A pointer to a <code>Rect</code>.
339 /// @return true if the rectangle intersects this rectangle.
340 bool Intersects(const Rect
& rect
) const;
342 /// Intersect() computes the intersection of this rectangle with the given
345 /// @param[in] rect A pointer to a <code>Rect</code>.
347 /// @return A <code>Rect</code> representing the intersection.
348 Rect
Intersect(const Rect
& rect
) const;
350 /// Union() computes the union of this rectangle with the given rectangle.
351 /// The union is the smallest rectangle containing both rectangles.
353 /// @param[in] rect A pointer to a <code>Rect</code>.
355 /// @return A <code>Rect</code> representing the union.
356 Rect
Union(const Rect
& rect
) const;
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.
364 /// @param[in] rect A pointer to a <code>Rect</code>.
366 /// @return A <code>Rect</code> representing the subtraction.
367 Rect
Subtract(const Rect
& rect
) const;
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.
375 /// @param[in] rect A pointer to a <code>Rect</code>.
377 /// @return A <code>Rect</code> representing the difference between this
378 /// rectangle and the receiving rectangle.
379 Rect
AdjustToFit(const Rect
& rect
) const;
381 /// CenterPoint() determines the center of this rectangle.
383 /// @return A <code>Point</code> representing the center of this rectangle.
384 Point
CenterPoint() const;
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.
390 /// @param[in] rect A pointer to a <code>Rect</code>.
392 /// @return true if this rectangle and supplied rectangle share an edge.
393 bool SharesEdgeWith(const Rect
& rect
) const;
401 /// This function determines whether the x, y, width, and height values of two
402 /// rectangles and are equal.
404 /// @param[in] lhs The <code>Rect</code> on the left-hand side of the equation.
405 /// @param[in] rhs The <code>Rect</code> on the right-hand side of the equation.
407 /// @return true if they are equal, false if unequal.
408 inline bool operator==(const pp::Rect
& lhs
, const pp::Rect
& rhs
) {
409 return lhs
.x() == rhs
.x() &&
410 lhs
.y() == rhs
.y() &&
411 lhs
.width() == rhs
.width() &&
412 lhs
.height() == rhs
.height();
415 /// This function determines whether two Rects are not equal.
417 /// @param[in] lhs The <code>Rect</code> on the left-hand side of the equation.
418 /// @param[in] rhs The <code>Rect</code> on the right-hand side of the
421 /// @return true if the given Rects are equal, otherwise false.
422 inline bool operator!=(const pp::Rect
& lhs
, const pp::Rect
& rhs
) {
423 return !(lhs
== rhs
);