1 // Copyright (c) 2012 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 UI_GFX_GEOMETRY_SIZE_H_ 6 #define UI_GFX_GEOMETRY_SIZE_H_ 7 8 #include <iosfwd> 9 #include <string> 10 11 #include "base/compiler_specific.h" 12 #include "base/numerics/safe_math.h" 13 #include "build/build_config.h" 14 #include "ui/gfx/gfx_export.h" 15 16 #if defined(OS_WIN) 17 typedef struct tagSIZE SIZE; 18 #elif defined(OS_MACOSX) 19 typedef struct CGSize CGSize; 20 #endif 21 22 namespace gfx { 23 24 // A size has width and height values. 25 class GFX_EXPORT Size { 26 public: Size()27 constexpr Size() : width_(0), height_(0) {} Size(int width,int height)28 constexpr Size(int width, int height) 29 : width_(width < 0 ? 0 : width), height_(height < 0 ? 0 : height) {} 30 #if defined(OS_MACOSX) 31 explicit Size(const CGSize& s); 32 #endif 33 34 #if defined(OS_MACOSX) 35 Size& operator=(const CGSize& s); 36 #endif 37 38 #if defined(OS_WIN) 39 SIZE ToSIZE() const; 40 #elif defined(OS_MACOSX) 41 CGSize ToCGSize() const; 42 #endif 43 width()44 constexpr int width() const { return width_; } height()45 constexpr int height() const { return height_; } 46 set_width(int width)47 void set_width(int width) { width_ = width < 0 ? 0 : width; } set_height(int height)48 void set_height(int height) { height_ = height < 0 ? 0 : height; } 49 50 // This call will CHECK if the area of this size would overflow int. 51 int GetArea() const; 52 // Returns a checked numeric representation of the area. 53 base::CheckedNumeric<int> GetCheckedArea() const; 54 SetSize(int width,int height)55 void SetSize(int width, int height) { 56 set_width(width); 57 set_height(height); 58 } 59 60 void Enlarge(int grow_width, int grow_height); 61 62 void SetToMin(const Size& other); 63 void SetToMax(const Size& other); 64 IsEmpty()65 bool IsEmpty() const { return !width() || !height(); } 66 67 std::string ToString() const; 68 69 private: 70 int width_; 71 int height_; 72 }; 73 74 inline bool operator==(const Size& lhs, const Size& rhs) { 75 return lhs.width() == rhs.width() && lhs.height() == rhs.height(); 76 } 77 78 inline bool operator!=(const Size& lhs, const Size& rhs) { 79 return !(lhs == rhs); 80 } 81 82 // This is declared here for use in gtest-based unit tests but is defined in 83 // the //ui/gfx:test_support target. Depend on that to use this in your unit 84 // test. This should not be used in production code - call ToString() instead. 85 void PrintTo(const Size& size, ::std::ostream* os); 86 87 // Helper methods to scale a gfx::Size to a new gfx::Size. 88 GFX_EXPORT Size ScaleToCeiledSize(const Size& size, 89 float x_scale, 90 float y_scale); 91 GFX_EXPORT Size ScaleToCeiledSize(const Size& size, float scale); 92 GFX_EXPORT Size ScaleToFlooredSize(const Size& size, 93 float x_scale, 94 float y_scale); 95 GFX_EXPORT Size ScaleToFlooredSize(const Size& size, float scale); 96 GFX_EXPORT Size ScaleToRoundedSize(const Size& size, 97 float x_scale, 98 float y_scale); 99 GFX_EXPORT Size ScaleToRoundedSize(const Size& size, float scale); 100 101 } // namespace gfx 102 103 #endif // UI_GFX_GEOMETRY_SIZE_H_ 104