|  | // 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_SIZE_H_ | 
|  | #define PPAPI_CPP_SIZE_H_ | 
|  |  | 
|  | #include "ppapi/c/pp_size.h" | 
|  | #include "ppapi/cpp/logging.h" | 
|  |  | 
|  | /// @file | 
|  | /// This file defines the API to create a size based on width | 
|  | /// and height. | 
|  |  | 
|  | namespace pp { | 
|  |  | 
|  | /// A size of an object based on width and height. | 
|  | class Size { | 
|  | public: | 
|  |  | 
|  | /// The default constructor. Initializes the width and height to 0. | 
|  | Size() { | 
|  | size_.width = 0; | 
|  | size_.height = 0; | 
|  | } | 
|  |  | 
|  | /// A constructor accepting a pointer to a <code>PP_Size</code> and | 
|  | /// converting the <code>PP_Size</code> to a <code>Size</code>. This is an | 
|  | /// implicit conversion constructor. | 
|  | /// | 
|  | /// @param[in] s A pointer to a <code>PP_Size</code>. | 
|  | Size(const PP_Size& s) {  // Implicit. | 
|  | // Want the >= 0 checking of the setter. | 
|  | set_width(s.width); | 
|  | set_height(s.height); | 
|  | } | 
|  |  | 
|  | /// A constructor accepting two int values for width and height and | 
|  | /// converting them to a <code>Size</code>. | 
|  | /// | 
|  | /// @param[in] w An int value representing a width. | 
|  | /// @param[in] h An int value representing a height. | 
|  | Size(int w, int h) { | 
|  | // Want the >= 0 checking of the setter. | 
|  | set_width(w); | 
|  | set_height(h); | 
|  | } | 
|  |  | 
|  | /// Destructor. | 
|  | ~Size() { | 
|  | } | 
|  |  | 
|  | /// PP_Size() allows implicit conversion of a <code>Size</code> to a | 
|  | /// <code>PP_Size</code>. | 
|  | /// | 
|  | /// @return A Size. | 
|  | operator PP_Size() { | 
|  | return size_; | 
|  | } | 
|  |  | 
|  | /// Getter function for returning the internal <code>PP_Size</code> struct. | 
|  | /// | 
|  | /// @return A const reference to the internal <code>PP_Size</code> struct. | 
|  | const PP_Size& pp_size() const { | 
|  | return size_; | 
|  | } | 
|  |  | 
|  | /// Getter function for returning the internal <code>PP_Size</code> struct. | 
|  | /// | 
|  | /// @return A mutable reference to the <code>PP_Size</code> struct. | 
|  | PP_Size& pp_size() { | 
|  | return size_; | 
|  | } | 
|  |  | 
|  | /// Getter function for returning the value of width. | 
|  | /// | 
|  | /// @return The value of width for this <code>Size</code>. | 
|  | int width() const { | 
|  | return size_.width; | 
|  | } | 
|  |  | 
|  | /// Setter function for setting the value of width. | 
|  | /// | 
|  | /// @param[in] w A new width value. | 
|  | void set_width(int w) { | 
|  | if (w < 0) { | 
|  | PP_DCHECK(w >= 0); | 
|  | w = 0; | 
|  | } | 
|  | size_.width = w; | 
|  | } | 
|  |  | 
|  | /// Getter function for returning the value of height. | 
|  | /// | 
|  | /// @return The value of height for this <code>Size</code>. | 
|  | int height() const { | 
|  | return size_.height; | 
|  | } | 
|  |  | 
|  | /// Setter function for setting the value of height. | 
|  | /// | 
|  | /// @param[in] h A new height value. | 
|  | void set_height(int h) { | 
|  | if (h < 0) { | 
|  | PP_DCHECK(h >= 0); | 
|  | h = 0; | 
|  | } | 
|  | size_.height = h; | 
|  | } | 
|  |  | 
|  | /// GetArea() determines the area (width * height). | 
|  | /// | 
|  | /// @return The area. | 
|  | int GetArea() const { | 
|  | return width() * height(); | 
|  | } | 
|  |  | 
|  | /// SetSize() sets the value of width and height. | 
|  | /// | 
|  | /// @param[in] w A new width value. | 
|  | /// @param[in] h A new height value. | 
|  | void SetSize(int w, int h) { | 
|  | set_width(w); | 
|  | set_height(h); | 
|  | } | 
|  |  | 
|  | /// Enlarge() enlarges the size of an object. | 
|  | /// | 
|  | /// @param[in] w A width to add the current width. | 
|  | /// @param[in] h A height to add to the current height. | 
|  | void Enlarge(int w, int h) { | 
|  | set_width(width() + w); | 
|  | set_height(height() + h); | 
|  | } | 
|  |  | 
|  | /// IsEmpty() determines if the size is zero. | 
|  | /// | 
|  | /// @return true if the size is zero. | 
|  | bool IsEmpty() const { | 
|  | // Size doesn't allow negative dimensions, so testing for 0 is enough. | 
|  | return (width() == 0) || (height() == 0); | 
|  | } | 
|  |  | 
|  | private: | 
|  | PP_Size size_; | 
|  | }; | 
|  |  | 
|  | /// A size of an object based on width and height. | 
|  | class FloatSize { | 
|  | public: | 
|  |  | 
|  | /// The default constructor. Initializes the width and height to 0.0f. | 
|  | FloatSize() { | 
|  | size_.width = 0.0f; | 
|  | size_.height = 0.0f; | 
|  | } | 
|  |  | 
|  | /// A constructor accepting a pointer to a <code>PP_FloatSize</code> and | 
|  | /// converting the <code>PP_FloatSize</code> to a <code>FloatSize</code>. | 
|  | /// This is an implicit conversion constructor. | 
|  | /// | 
|  | /// @param[in] s A pointer to a <code>PP_FloatSize</code>. | 
|  | FloatSize(const PP_FloatSize& s) {  // Implicit. | 
|  | // Want the >= 0 checking of the setter. | 
|  | set_width(s.width); | 
|  | set_height(s.height); | 
|  | } | 
|  |  | 
|  | /// A constructor accepting two float values for width and height and | 
|  | /// converting them to a <code>FloatSize</code>. | 
|  | /// | 
|  | /// @param[in] w An float value representing a width. | 
|  | /// @param[in] h An float value representing a height. | 
|  | FloatSize(float w, float h) { | 
|  | // Want the >= 0.0f checking of the setter. | 
|  | set_width(w); | 
|  | set_height(h); | 
|  | } | 
|  |  | 
|  | /// Destructor. | 
|  | ~FloatSize() { | 
|  | } | 
|  |  | 
|  | /// PP_FloatSize() allows implicit conversion of a <code>FloatSize</code> to a | 
|  | /// <code>PP_FloatSize</code>. | 
|  | /// | 
|  | /// @return A Size. | 
|  | operator PP_FloatSize() { | 
|  | return size_; | 
|  | } | 
|  |  | 
|  | /// Getter function for returning the internal <code>PP_FloatSize</code> | 
|  | /// struct. | 
|  | /// | 
|  | /// @return A const reference to the internal <code>PP_FloatSize</code> | 
|  | /// struct. | 
|  | const PP_FloatSize& pp_float_size() const { | 
|  | return size_; | 
|  | } | 
|  |  | 
|  | /// Getter function for returning the internal <code>PP_FloatSize</code> | 
|  | /// struct. | 
|  | /// | 
|  | /// @return A mutable reference to the <code>PP_FloatSize</code> struct. | 
|  | PP_FloatSize& pp_float_size() { | 
|  | return size_; | 
|  | } | 
|  |  | 
|  | /// Getter function for returning the value of width. | 
|  | /// | 
|  | /// @return The value of width for this <code>FloatSize</code>. | 
|  | float width() const { | 
|  | return size_.width; | 
|  | } | 
|  |  | 
|  | /// Setter function for setting the value of width. | 
|  | /// | 
|  | /// @param[in] w A new width value. | 
|  | void set_width(float w) { | 
|  | if (w < 0.0f) { | 
|  | PP_DCHECK(w >= 0.0f); | 
|  | w = 0.0f; | 
|  | } | 
|  | size_.width = w; | 
|  | } | 
|  |  | 
|  | /// Getter function for returning the value of height. | 
|  | /// | 
|  | /// @return The value of height for this <code>FloatSize</code>. | 
|  | float height() const { | 
|  | return size_.height; | 
|  | } | 
|  |  | 
|  | /// Setter function for setting the value of height. | 
|  | /// | 
|  | /// @param[in] h A new height value. | 
|  | void set_height(float h) { | 
|  | if (h < 0.0f) { | 
|  | PP_DCHECK(h >= 0.0f); | 
|  | h = 0.0f; | 
|  | } | 
|  | size_.height = h; | 
|  | } | 
|  |  | 
|  | /// GetArea() determines the area (width * height). | 
|  | /// | 
|  | /// @return The area. | 
|  | float GetArea() const { | 
|  | return width() * height(); | 
|  | } | 
|  |  | 
|  | /// SetSize() sets the value of width and height. | 
|  | /// | 
|  | /// @param[in] w A new width value. | 
|  | /// @param[in] h A new height value. | 
|  | void SetSize(float w, float h) { | 
|  | set_width(w); | 
|  | set_height(h); | 
|  | } | 
|  |  | 
|  | /// Enlarge() enlarges the size of an object. | 
|  | /// | 
|  | /// @param[in] w A width to add the current width. | 
|  | /// @param[in] h A height to add to the current height. | 
|  | void Enlarge(float w, float h) { | 
|  | set_width(width() + w); | 
|  | set_height(height() + h); | 
|  | } | 
|  |  | 
|  | /// IsEmpty() determines if the size is zero. | 
|  | /// | 
|  | /// @return true if the size is zero. | 
|  | bool IsEmpty() const { | 
|  | // Size doesn't allow negative dimensions, so testing for 0.0f is enough. | 
|  | return (width() == 0.0f) || (height() == 0.0f); | 
|  | } | 
|  |  | 
|  | private: | 
|  | PP_FloatSize size_; | 
|  | }; | 
|  |  | 
|  | }  // namespace pp | 
|  |  | 
|  | /// This function determines whether the width and height values of two sizes | 
|  | /// are equal. | 
|  | /// | 
|  | /// @param[in] lhs The <code>Size</code> on the left-hand side of the equation. | 
|  | /// @param[in] rhs The <code>Size</code> on the right-hand side of the | 
|  | /// equation. | 
|  | /// | 
|  | /// @return true if they are equal, false if unequal. | 
|  | inline bool operator==(const pp::Size& lhs, const pp::Size& rhs) { | 
|  | return lhs.width() == rhs.width() && lhs.height() == rhs.height(); | 
|  | } | 
|  |  | 
|  | /// This function determines whether two <code>Sizes</code> are not equal. | 
|  | /// | 
|  | /// @param[in] lhs The <code>Size</code> on the left-hand side of the equation. | 
|  | /// @param[in] rhs The <code>Size</code> on the right-hand side of the equation. | 
|  | /// | 
|  | /// @return true if the <code>Size</code> of lhs are equal to the | 
|  | /// <code>Size</code> of rhs, otherwise false. | 
|  | inline bool operator!=(const pp::Size& lhs, const pp::Size& rhs) { | 
|  | return !(lhs == rhs); | 
|  | } | 
|  |  | 
|  | /// This function determines whether the width and height values of two sizes | 
|  | /// are equal. | 
|  | /// | 
|  | /// @param[in] lhs The <code>FloatSize</code> on the left-hand side of the | 
|  | /// equation. | 
|  | /// @param[in] rhs The <code>FloatSize</code> on the right-hand side of the | 
|  | /// equation. | 
|  | /// | 
|  | /// @return true if they are equal, false if unequal. | 
|  | inline bool operator==(const pp::FloatSize& lhs, const pp::FloatSize& rhs) { | 
|  | return lhs.width() == rhs.width() && lhs.height() == rhs.height(); | 
|  | } | 
|  |  | 
|  | /// This function determines whether two <code>FloatSizes</code> are not equal. | 
|  | /// | 
|  | /// @param[in] lhs The <code>FloatSize</code> on the left-hand side of the | 
|  | /// equation. | 
|  | /// @param[in] rhs The <code>FloatSize</code> on the right-hand side of the | 
|  | /// equation. | 
|  | /// | 
|  | /// @return true if the <code>FloatSize</code> of lhs are equal to the | 
|  | /// <code>FloatSize</code> of rhs, otherwise false. | 
|  | inline bool operator!=(const pp::FloatSize& lhs, const pp::FloatSize& rhs) { | 
|  | return !(lhs == rhs); | 
|  | } | 
|  |  | 
|  | #endif  // PPAPI_CPP_SIZE_H_ | 
|  |  |