15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PPAPI_CPP_SIZE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_CPP_SIZE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_size.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/logging.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// @file
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// This file defines the API to create a size based on width
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// and height.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// A size of an object based on width and height.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Size {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// The default constructor. Initializes the width and height to 0.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Size() {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_.width = 0;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_.height = 0;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// A constructor accepting a pointer to a <code>PP_Size</code> and
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// converting the <code>PP_Size</code> to a <code>Size</code>. This is an
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// implicit conversion constructor.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param[in] s A pointer to a <code>PP_Size</code>.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Size(const PP_Size& s) {  // Implicit.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Want the >= 0 checking of the setter.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_width(s.width);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_height(s.height);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// A constructor accepting two int values for width and height and
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// converting them to a <code>Size</code>.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param[in] w An int value representing a width.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param[in] h An int value representing a height.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Size(int w, int h) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Want the >= 0 checking of the setter.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_width(w);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_height(h);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Destructor.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Size() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// PP_Size() allows implicit conversion of a <code>Size</code> to a
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// <code>PP_Size</code>.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @return A Size.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  operator PP_Size() {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return size_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Getter function for returning the internal <code>PP_Size</code> struct.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @return A const reference to the internal <code>PP_Size</code> struct.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PP_Size& pp_size() const {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return size_;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Getter function for returning the internal <code>PP_Size</code> struct.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @return A mutable reference to the <code>PP_Size</code> struct.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Size& pp_size() {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return size_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Getter function for returning the value of width.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @return The value of width for this <code>Size</code>.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int width() const {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return size_.width;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Setter function for setting the value of width.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param[in] w A new width value.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_width(int w) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (w < 0) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_DCHECK(w >= 0);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      w = 0;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_.width = w;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Getter function for returning the value of height.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @return The value of height for this <code>Size</code>.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int height() const {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return size_.height;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Setter function for setting the value of height.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param[in] h A new height value.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_height(int h) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (h < 0) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_DCHECK(h >= 0);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      h = 0;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_.height = h;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// GetArea() determines the area (width * height).
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @return The area.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetArea() const {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return width() * height();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// SetSize() sets the value of width and height.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param[in] w A new width value.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param[in] h A new height value.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetSize(int w, int h) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_width(w);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_height(h);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Enlarge() enlarges the size of an object.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param[in] w A width to add the current width.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param[in] h A height to add to the current height.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Enlarge(int w, int h) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_width(width() + w);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_height(height() + h);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// IsEmpty() determines if the size is zero.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @return true if the size is zero.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsEmpty() const {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Size doesn't allow negative dimensions, so testing for 0 is enough.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (width() == 0) || (height() == 0);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Size size_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace pp
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// This function determines whether the width and height values of two sizes
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// are equal.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// @param[in] lhs The <code>Size</code> on the left-hand side of the equation.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// @param[in] rhs The <code>Size</code> on the right-hand side of the
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// equation.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// @return true if they are equal, false if unequal.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool operator==(const pp::Size& lhs, const pp::Size& rhs) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return lhs.width() == rhs.width() && lhs.height() == rhs.height();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// This function determines whether two <code>Sizes</code> are not equal.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// @param[in] lhs The <code>Size</code> on the left-hand side of the equation.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// @param[in] rhs The <code>Size</code> on the right-hand side of the equation.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// @return true if the <code>Size</code> of lhs are equal to the
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// <code>Size</code> of rhs, otherwise false.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool operator!=(const pp::Size& lhs, const pp::Size& rhs) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !(lhs == rhs);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // PPAPI_CPP_SIZE_H_
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175