diff options
Diffstat (limited to 'chromium/ppapi/cpp/rect.h')
-rw-r--r-- | chromium/ppapi/cpp/rect.h | 427 |
1 files changed, 427 insertions, 0 deletions
diff --git a/chromium/ppapi/cpp/rect.h b/chromium/ppapi/cpp/rect.h new file mode 100644 index 00000000000..b47226bd707 --- /dev/null +++ b/chromium/ppapi/cpp/rect.h @@ -0,0 +1,427 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PPAPI_CPP_RECT_H_ +#define PPAPI_CPP_RECT_H_ + +#include "ppapi/c/pp_rect.h" +#include "ppapi/cpp/point.h" +#include "ppapi/cpp/size.h" + +/// @file +/// This file defines the APIs for creating a 2 dimensional rectangle. + +namespace pp { + +/// A 2 dimensional rectangle. A rectangle is represented by x and y (which +/// identifies the upper-left corner of the rectangle), width, and height. +class Rect { + public: + + /// The default constructor. Creates a <code>Rect</code> in the upper-left + /// at 0,0 with height and width of 0. + Rect() { + rect_.point.x = 0; + rect_.point.y = 0; + rect_.size.width = 0; + rect_.size.height = 0; + } + + /// A constructor accepting a reference to a <code>PP_Rect and</code> + /// converting the <code>PP_Rect</code> to a <code>Rect</code>. This is an + /// implicit conversion constructor. + /// + /// @param[in] rect A <code>PP_Rect</code>. + Rect(const PP_Rect& rect) { // Implicit. + set_x(rect.point.x); + set_y(rect.point.y); + set_width(rect.size.width); + set_height(rect.size.height); + } + + /// A constructor accepting two int32_t values for width and height and + /// converting them to a <code>Rect</code> in the upper-left starting + /// coordinate of 0,0. + /// + /// @param[in] w An int32_t value representing a width. + /// @param[in] h An int32_t value representing a height. + Rect(int32_t w, int32_t h) { + set_x(0); + set_y(0); + set_width(w); + set_height(h); + } + + /// A constructor accepting four int32_t values for width, height, x, and y. + /// + /// @param[in] x An int32_t value representing a horizontal coordinate + /// of a point, starting with 0 as the left-most coordinate. + /// @param[in] y An int32_t value representing a vertical coordinate + /// of a point, starting with 0 as the top-most coordinate. + /// @param[in] w An int32_t value representing a width. + /// @param[in] h An int32_t value representing a height. + Rect(int32_t x, int32_t y, int32_t w, int32_t h) { + set_x(x); + set_y(y); + set_width(w); + set_height(h); + } + + /// A constructor accepting a pointer to a Size and converting the + /// <code>Size</code> to a <code>Rect</code> in the upper-left starting + /// coordinate of 0,0. + /// + /// @param[in] s A pointer to a <code>Size</code>. + explicit Rect(const Size& s) { + set_x(0); + set_y(0); + set_size(s); + } + + /// A constructor accepting a pointer to a <code>Point</code> representing + /// the origin of the rectangle and a pointer to a <code>Size</code> + /// representing the height and width. + /// + /// @param[in] origin A pointer to a <code>Point</code> representing the + /// upper-left starting coordinate. + /// @param[in] size A pointer to a <code>Size</code> representing the height + /// and width. + Rect(const Point& origin, const Size& size) { + set_point(origin); + set_size(size); + } + + /// Destructor. + ~Rect() { + } + + /// PP_Rect() allows implicit conversion of a <code>Rect</code> to a + /// <code>PP_Rect</code>. + /// + /// @return A <code>Point</code>. + operator PP_Rect() const { + return rect_; + } + + /// Getter function for returning the internal <code>PP_Rect</code> struct. + /// + /// @return A const reference to the internal <code>PP_Rect</code> struct. + const PP_Rect& pp_rect() const { + return rect_; + } + + /// Getter function for returning the internal <code>PP_Rect</code> struct. + /// + /// @return A mutable reference to the <code>PP_Rect</code> struct. + PP_Rect& pp_rect() { + return rect_; + } + + + /// Getter function for returning the value of x. + /// + /// @return The value of x for this <code>Point</code>. + int32_t x() const { + return rect_.point.x; + } + + /// Setter function for setting the value of x. + /// + /// @param[in] in_x A new x value. + void set_x(int32_t in_x) { + rect_.point.x = in_x; + } + + /// Getter function for returning the value of y. + /// + /// @return The value of y for this <code>Point</code>. + int32_t y() const { + return rect_.point.y; + } + + /// Setter function for setting the value of y. + /// + /// @param[in] in_y A new y value. + void set_y(int32_t in_y) { + rect_.point.y = in_y; + } + + /// Getter function for returning the value of width. + /// + /// @return The value of width for this <code>Rect</code>. + int32_t width() const { + return rect_.size.width; + } + + /// Setter function for setting the value of width. + /// + /// @param[in] w A new width value. + void set_width(int32_t w) { + if (w < 0) { + PP_DCHECK(w >= 0); + w = 0; + } + rect_.size.width = w; + } + + /// Getter function for returning the value of height. + /// + /// @return The value of height for this <code>Rect</code>. + int32_t height() const { + return rect_.size.height; + } + + /// Setter function for setting the value of height. + /// + /// @param[in] h A new width height. + void set_height(int32_t h) { + if (h < 0) { + PP_DCHECK(h >= 0); + h = 0; + } + rect_.size.height = h; + } + + /// Getter function for returning the <code>Point</code>. + /// + /// @return A <code>Point</code>. + Point point() const { + return Point(rect_.point); + } + + /// Setter function for setting the value of the <code>Point</code>. + /// + /// @param[in] origin A <code>Point</code> representing the upper-left + /// starting coordinate. + void set_point(const Point& origin) { + rect_.point = origin; + } + + /// Getter function for returning the <code>Size</code>. + /// + /// @return The size of the rectangle. + Size size() const { + return Size(rect_.size); + } + + /// Setter function for setting the <code>Size</code>. + /// + /// @param[in] s A pointer to a <code>Size</code> representing the height + /// and width. + void set_size(const Size& s) { + rect_.size.width = s.width(); + rect_.size.height = s.height(); + } + + /// Getter function to get the upper-bound for the x-coordinates of the + /// rectangle. Note that this coordinate value is one past the highest x + /// value of pixels in the rectangle. This loop will access all the pixels + /// in a horizontal line in the rectangle: + /// <code>for (int32_t x = rect.x(); x < rect.right(); ++x) {}</code> + /// + /// @return The value of x + width for this point. + int32_t right() const { + return x() + width(); + } + + /// Getter function to get the upper-bound for the y-coordinates of the + /// rectangle. Note that this coordinate value is one past the highest xy + /// value of pixels in the rectangle. This loop will access all the pixels + /// in a horizontal line in the rectangle: + /// <code>for (int32_t y = rect.y(); y < rect.bottom(); ++y) {}</code> + /// + /// @return The value of y + height for this point. + int32_t bottom() const { + return y() + height(); + } + + /// Setter function for setting the value of the <code>Rect</code>. + /// + /// @param[in] x A new x value. + /// @param[in] y A new y value. + /// @param[in] w A new width value. + /// @param[in] h A new height value. + void SetRect(int32_t x, int32_t y, int32_t w, int32_t h) { + set_x(x); + set_y(y); + set_width(w); + set_height(h); + } + + /// Setter function for setting the value of the <code>Rect</code>. + /// + /// @param[in] rect A pointer to a <code>PP_Rect</code>. + void SetRect(const PP_Rect& rect) { + rect_ = rect; + } + + /// Inset() shrinks the rectangle by a horizontal and vertical + /// distance on all sides. + /// + /// @param[in] horizontal An int32_t value representing a horizontal + /// shrinking distance. + /// @param[in] vertical An int32_t value representing a vertical + /// shrinking distance. + void Inset(int32_t horizontal, int32_t vertical) { + Inset(horizontal, vertical, horizontal, vertical); + } + + /// Inset() shrinks the rectangle by the specified amount on each + /// side. + /// + /// @param[in] left An int32_t value representing a left + /// shrinking distance. + /// @param[in] top An int32_t value representing a top + /// shrinking distance. + /// @param[in] right An int32_t value representing a right + /// shrinking distance. + /// @param[in] bottom An int32_t value representing a bottom + /// shrinking distance. + void Inset(int32_t left, int32_t top, int32_t right, int32_t bottom); + + /// Offset() moves the rectangle by a horizontal and vertical distance. + /// + /// @param[in] horizontal An int32_t value representing a horizontal + /// move distance. + /// @param[in] vertical An int32_t value representing a vertical + /// move distance. + void Offset(int32_t horizontal, int32_t vertical); + + /// Offset() moves the rectangle by a horizontal and vertical distance. + /// + /// @param[in] point A pointer to a <code>Point</code> representing the + /// horizontal and vertical move distances. + void Offset(const Point& point) { + Offset(point.x(), point.y()); + } + + /// IsEmpty() determines if the area of a rectangle is zero. Returns true if + /// the area of the rectangle is zero. + /// + /// @return true if the area of the rectangle is zero. + bool IsEmpty() const { + return rect_.size.width == 0 && rect_.size.height == 0; + } + + /// Contains() determines if the point identified by point_x and point_y + /// falls inside this rectangle. The point (x, y) is inside the rectangle, + /// but the point (x + width, y + height) is not. + /// + /// @param[in] point_x An int32_t value representing a x value. + /// @param[in] point_y An int32_t value representing a y value. + /// + /// @return true if the point_x and point_y fall inside the rectangle. + bool Contains(int32_t point_x, int32_t point_y) const; + + /// Contains() determines if the specified point is contained by this + /// rectangle. + /// + /// @param[in] point A pointer to a Point representing a 2D coordinate. + /// + /// @return true if the point_x and point_y fall inside the rectangle. + bool Contains(const Point& point) const { + return Contains(point.x(), point.y()); + } + + /// Contains() determines if this rectangle contains the specified rectangle. + /// + /// @param[in] rect A pointer to a <code>Rect</code>. + /// + /// @return true if the rectangle fall inside this rectangle. + bool Contains(const Rect& rect) const; + + /// Intersects() determines if this rectangle intersects the specified + /// rectangle. + /// + /// @param[in] rect A pointer to a <code>Rect</code>. + /// + /// @return true if the rectangle intersects this rectangle. + bool Intersects(const Rect& rect) const; + + /// Intersect() computes the intersection of this rectangle with the given + /// rectangle. + /// + /// @param[in] rect A pointer to a <code>Rect</code>. + /// + /// @return A <code>Rect</code> representing the intersection. + Rect Intersect(const Rect& rect) const; + + /// Union() computes the union of this rectangle with the given rectangle. + /// The union is the smallest rectangle containing both rectangles. + /// + /// @param[in] rect A pointer to a <code>Rect</code>. + /// + /// @return A <code>Rect</code> representing the union. + Rect Union(const Rect& rect) const; + + /// Subtract() computes the rectangle resulting from subtracting + /// <code>rect</code> from this Rect. If <code>rect</code>does not intersect + /// completely in either the x or y direction, then <code>*this</code> is + /// returned. If <code>rect</code> contains <code>this</code>, then an empty + /// <code>Rect</code> is returned. + /// + /// @param[in] rect A pointer to a <code>Rect</code>. + /// + /// @return A <code>Rect</code> representing the subtraction. + Rect Subtract(const Rect& rect) const; + + /// AdjustToFit() fits as much of the receiving rectangle within + /// the supplied rectangle as possible, returning the result. For example, + /// if the receiver had a x-location of 2 and a width of 4, and the supplied + /// rectangle had an x-location of 0 with a width of 5, the returned + /// rectangle would have an x-location of 1 with a width of 4. + /// + /// @param[in] rect A pointer to a <code>Rect</code>. + /// + /// @return A <code>Rect</code> representing the difference between this + /// rectangle and the receiving rectangle. + Rect AdjustToFit(const Rect& rect) const; + + /// CenterPoint() determines the center of this rectangle. + /// + /// @return A <code>Point</code> representing the center of this rectangle. + Point CenterPoint() const; + + /// SharesEdgeWith() determines if this rectangle shares an entire edge + /// (same width or same height) with the given rectangle, and the + /// rectangles do not overlap. + /// + /// @param[in] rect A pointer to a <code>Rect</code>. + /// + /// @return true if this rectangle and supplied rectangle share an edge. + bool SharesEdgeWith(const Rect& rect) const; + + private: + PP_Rect rect_; +}; + +} // namespace pp + +/// This function determines whether the x, y, width, and height values of two +/// rectangles and are equal. +/// +/// @param[in] lhs The <code>Rect</code> on the left-hand side of the equation. +/// @param[in] rhs The <code>Rect</code> on the right-hand side of the equation. +/// +/// @return true if they are equal, false if unequal. +inline bool operator==(const pp::Rect& lhs, const pp::Rect& rhs) { + return lhs.x() == rhs.x() && + lhs.y() == rhs.y() && + lhs.width() == rhs.width() && + lhs.height() == rhs.height(); +} + +/// This function determines whether two Rects are not equal. +/// +/// @param[in] lhs The <code>Rect</code> on the left-hand side of the equation. +/// @param[in] rhs The <code>Rect</code> on the right-hand side of the +/// equation. +/// +/// @return true if the given Rects are equal, otherwise false. +inline bool operator!=(const pp::Rect& lhs, const pp::Rect& rhs) { + return !(lhs == rhs); +} + +#endif + |