15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef UI_GFX_GEOMETRY_SIZE_BASE_H_
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define UI_GFX_GEOMETRY_SIZE_BASE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/gfx_export.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A size has width and height values.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, typename Type>
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class GFX_EXPORT SizeBase {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Type width() const { return width_; }
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Type height() const { return height_; }
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Type GetArea() const { return width_ * height_; }
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetSize(Type width, Type height) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_width(width);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_height(height);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Enlarge(Type width, Type height) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_width(width_ + width);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_height(height_ + height);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_width(Type width) {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    width_ = width < 0 ? 0 : width;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_height(Type height) {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    height_ = height < 0 ? 0 : height;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void SetToMin(const Class& other) {
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    width_ = width_ <= other.width_ ? width_ : other.width_;
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    height_ = height_ <= other.height_ ? height_ : other.height_;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void SetToMax(const Class& other) {
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    width_ = width_ >= other.width_ ? width_ : other.width_;
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    height_ = height_ >= other.height_ ? height_ : other.height_;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsEmpty() const {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return (width_ == 0) || (height_ == 0);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SizeBase(Type width, Type height)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : width_(width < 0 ? 0 : width),
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      height_(height < 0 ? 0 : height) {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Destructor is intentionally made non virtual and protected.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not make this public.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SizeBase() {}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Type width_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Type height_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // UI_GFX_GEOMETRY_SIZE_BASE_H_
70