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_SIZE_H_ 6 #define PPAPI_CPP_SIZE_H_ 7 8 #include "ppapi/c/pp_size.h" 9 #include "ppapi/cpp/logging.h" 10 11 /// @file 12 /// This file defines the API to create a size based on width 13 /// and height. 14 15 namespace pp { 16 17 /// A size of an object based on width and height. 18 class Size { 19 public: 20 21 /// The default constructor. Initializes the width and height to 0. Size()22 Size() { 23 size_.width = 0; 24 size_.height = 0; 25 } 26 27 /// A constructor accepting a pointer to a <code>PP_Size</code> and 28 /// converting the <code>PP_Size</code> to a <code>Size</code>. This is an 29 /// implicit conversion constructor. 30 /// 31 /// @param[in] s A pointer to a <code>PP_Size</code>. Size(const PP_Size & s)32 Size(const PP_Size& s) { // Implicit. 33 // Want the >= 0 checking of the setter. 34 set_width(s.width); 35 set_height(s.height); 36 } 37 38 /// A constructor accepting two int values for width and height and 39 /// converting them to a <code>Size</code>. 40 /// 41 /// @param[in] w An int value representing a width. 42 /// @param[in] h An int value representing a height. Size(int w,int h)43 Size(int w, int h) { 44 // Want the >= 0 checking of the setter. 45 set_width(w); 46 set_height(h); 47 } 48 49 /// Destructor. ~Size()50 ~Size() { 51 } 52 53 /// PP_Size() allows implicit conversion of a <code>Size</code> to a 54 /// <code>PP_Size</code>. 55 /// 56 /// @return A Size. PP_Size()57 operator PP_Size() { 58 return size_; 59 } 60 61 /// Getter function for returning the internal <code>PP_Size</code> struct. 62 /// 63 /// @return A const reference to the internal <code>PP_Size</code> struct. pp_size()64 const PP_Size& pp_size() const { 65 return size_; 66 } 67 68 /// Getter function for returning the internal <code>PP_Size</code> struct. 69 /// 70 /// @return A mutable reference to the <code>PP_Size</code> struct. pp_size()71 PP_Size& pp_size() { 72 return size_; 73 } 74 75 /// Getter function for returning the value of width. 76 /// 77 /// @return The value of width for this <code>Size</code>. width()78 int width() const { 79 return size_.width; 80 } 81 82 /// Setter function for setting the value of width. 83 /// 84 /// @param[in] w A new width value. set_width(int w)85 void set_width(int w) { 86 if (w < 0) { 87 PP_DCHECK(w >= 0); 88 w = 0; 89 } 90 size_.width = w; 91 } 92 93 /// Getter function for returning the value of height. 94 /// 95 /// @return The value of height for this <code>Size</code>. height()96 int height() const { 97 return size_.height; 98 } 99 100 /// Setter function for setting the value of height. 101 /// 102 /// @param[in] h A new height value. set_height(int h)103 void set_height(int h) { 104 if (h < 0) { 105 PP_DCHECK(h >= 0); 106 h = 0; 107 } 108 size_.height = h; 109 } 110 111 /// GetArea() determines the area (width * height). 112 /// 113 /// @return The area. GetArea()114 int GetArea() const { 115 return width() * height(); 116 } 117 118 /// SetSize() sets the value of width and height. 119 /// 120 /// @param[in] w A new width value. 121 /// @param[in] h A new height value. SetSize(int w,int h)122 void SetSize(int w, int h) { 123 set_width(w); 124 set_height(h); 125 } 126 127 /// Enlarge() enlarges the size of an object. 128 /// 129 /// @param[in] w A width to add the current width. 130 /// @param[in] h A height to add to the current height. Enlarge(int w,int h)131 void Enlarge(int w, int h) { 132 set_width(width() + w); 133 set_height(height() + h); 134 } 135 136 /// IsEmpty() determines if the size is zero. 137 /// 138 /// @return true if the size is zero. IsEmpty()139 bool IsEmpty() const { 140 // Size doesn't allow negative dimensions, so testing for 0 is enough. 141 return (width() == 0) || (height() == 0); 142 } 143 144 private: 145 PP_Size size_; 146 }; 147 148 /// A size of an object based on width and height. 149 class FloatSize { 150 public: 151 152 /// The default constructor. Initializes the width and height to 0.0f. FloatSize()153 FloatSize() { 154 size_.width = 0.0f; 155 size_.height = 0.0f; 156 } 157 158 /// A constructor accepting a pointer to a <code>PP_FloatSize</code> and 159 /// converting the <code>PP_FloatSize</code> to a <code>FloatSize</code>. 160 /// This is an implicit conversion constructor. 161 /// 162 /// @param[in] s A pointer to a <code>PP_FloatSize</code>. FloatSize(const PP_FloatSize & s)163 FloatSize(const PP_FloatSize& s) { // Implicit. 164 // Want the >= 0 checking of the setter. 165 set_width(s.width); 166 set_height(s.height); 167 } 168 169 /// A constructor accepting two float values for width and height and 170 /// converting them to a <code>FloatSize</code>. 171 /// 172 /// @param[in] w An float value representing a width. 173 /// @param[in] h An float value representing a height. FloatSize(float w,float h)174 FloatSize(float w, float h) { 175 // Want the >= 0.0f checking of the setter. 176 set_width(w); 177 set_height(h); 178 } 179 180 /// Destructor. ~FloatSize()181 ~FloatSize() { 182 } 183 184 /// PP_FloatSize() allows implicit conversion of a <code>FloatSize</code> to a 185 /// <code>PP_FloatSize</code>. 186 /// 187 /// @return A Size. PP_FloatSize()188 operator PP_FloatSize() { 189 return size_; 190 } 191 192 /// Getter function for returning the internal <code>PP_FloatSize</code> 193 /// struct. 194 /// 195 /// @return A const reference to the internal <code>PP_FloatSize</code> 196 /// struct. pp_float_size()197 const PP_FloatSize& pp_float_size() const { 198 return size_; 199 } 200 201 /// Getter function for returning the internal <code>PP_FloatSize</code> 202 /// struct. 203 /// 204 /// @return A mutable reference to the <code>PP_FloatSize</code> struct. pp_float_size()205 PP_FloatSize& pp_float_size() { 206 return size_; 207 } 208 209 /// Getter function for returning the value of width. 210 /// 211 /// @return The value of width for this <code>FloatSize</code>. width()212 float width() const { 213 return size_.width; 214 } 215 216 /// Setter function for setting the value of width. 217 /// 218 /// @param[in] w A new width value. set_width(float w)219 void set_width(float w) { 220 if (w < 0.0f) { 221 PP_DCHECK(w >= 0.0f); 222 w = 0.0f; 223 } 224 size_.width = w; 225 } 226 227 /// Getter function for returning the value of height. 228 /// 229 /// @return The value of height for this <code>FloatSize</code>. height()230 float height() const { 231 return size_.height; 232 } 233 234 /// Setter function for setting the value of height. 235 /// 236 /// @param[in] h A new height value. set_height(float h)237 void set_height(float h) { 238 if (h < 0.0f) { 239 PP_DCHECK(h >= 0.0f); 240 h = 0.0f; 241 } 242 size_.height = h; 243 } 244 245 /// GetArea() determines the area (width * height). 246 /// 247 /// @return The area. GetArea()248 float GetArea() const { 249 return width() * height(); 250 } 251 252 /// SetSize() sets the value of width and height. 253 /// 254 /// @param[in] w A new width value. 255 /// @param[in] h A new height value. SetSize(float w,float h)256 void SetSize(float w, float h) { 257 set_width(w); 258 set_height(h); 259 } 260 261 /// Enlarge() enlarges the size of an object. 262 /// 263 /// @param[in] w A width to add the current width. 264 /// @param[in] h A height to add to the current height. Enlarge(float w,float h)265 void Enlarge(float w, float h) { 266 set_width(width() + w); 267 set_height(height() + h); 268 } 269 270 /// IsEmpty() determines if the size is zero. 271 /// 272 /// @return true if the size is zero. IsEmpty()273 bool IsEmpty() const { 274 // Size doesn't allow negative dimensions, so testing for 0.0f is enough. 275 return (width() == 0.0f) || (height() == 0.0f); 276 } 277 278 private: 279 PP_FloatSize size_; 280 }; 281 282 } // namespace pp 283 284 /// This function determines whether the width and height values of two sizes 285 /// are equal. 286 /// 287 /// @param[in] lhs The <code>Size</code> on the left-hand side of the equation. 288 /// @param[in] rhs The <code>Size</code> on the right-hand side of the 289 /// equation. 290 /// 291 /// @return true if they are equal, false if unequal. 292 inline bool operator==(const pp::Size& lhs, const pp::Size& rhs) { 293 return lhs.width() == rhs.width() && lhs.height() == rhs.height(); 294 } 295 296 /// This function determines whether two <code>Sizes</code> are not equal. 297 /// 298 /// @param[in] lhs The <code>Size</code> on the left-hand side of the equation. 299 /// @param[in] rhs The <code>Size</code> on the right-hand side of the equation. 300 /// 301 /// @return true if the <code>Size</code> of lhs are equal to the 302 /// <code>Size</code> of rhs, otherwise false. 303 inline bool operator!=(const pp::Size& lhs, const pp::Size& rhs) { 304 return !(lhs == rhs); 305 } 306 307 /// This function determines whether the width and height values of two sizes 308 /// are equal. 309 /// 310 /// @param[in] lhs The <code>FloatSize</code> on the left-hand side of the 311 /// equation. 312 /// @param[in] rhs The <code>FloatSize</code> on the right-hand side of the 313 /// equation. 314 /// 315 /// @return true if they are equal, false if unequal. 316 inline bool operator==(const pp::FloatSize& lhs, const pp::FloatSize& rhs) { 317 return lhs.width() == rhs.width() && lhs.height() == rhs.height(); 318 } 319 320 /// This function determines whether two <code>FloatSizes</code> are not equal. 321 /// 322 /// @param[in] lhs The <code>FloatSize</code> on the left-hand side of the 323 /// equation. 324 /// @param[in] rhs The <code>FloatSize</code> on the right-hand side of the 325 /// equation. 326 /// 327 /// @return true if the <code>FloatSize</code> of lhs are equal to the 328 /// <code>FloatSize</code> of rhs, otherwise false. 329 inline bool operator!=(const pp::FloatSize& lhs, const pp::FloatSize& rhs) { 330 return !(lhs == rhs); 331 } 332 333 #endif // PPAPI_CPP_SIZE_H_ 334 335