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 #include "ui/gfx/geometry/size.h"
6
7 #if defined(OS_WIN)
8 #include <windows.h>
9 #elif defined(OS_IOS)
10 #include <CoreGraphics/CoreGraphics.h>
11 #elif defined(OS_MACOSX)
12 #include <ApplicationServices/ApplicationServices.h>
13 #endif
14
15 #include "base/numerics/clamped_math.h"
16 #include "base/numerics/safe_math.h"
17 #include "base/strings/stringprintf.h"
18 #include "build/build_config.h"
19 #include "ui/gfx/geometry/safe_integer_conversions.h"
20 #include "ui/gfx/geometry/size_conversions.h"
21
22 namespace gfx {
23
24 #if defined(OS_MACOSX)
Size(const CGSize & s)25 Size::Size(const CGSize& s)
26 : width_(s.width < 0 ? 0 : s.width),
27 height_(s.height < 0 ? 0 : s.height) {
28 }
29
operator =(const CGSize & s)30 Size& Size::operator=(const CGSize& s) {
31 set_width(s.width);
32 set_height(s.height);
33 return *this;
34 }
35 #endif
36
37 #if defined(OS_WIN)
ToSIZE() const38 SIZE Size::ToSIZE() const {
39 SIZE s;
40 s.cx = width();
41 s.cy = height();
42 return s;
43 }
44 #elif defined(OS_MACOSX)
ToCGSize() const45 CGSize Size::ToCGSize() const {
46 return CGSizeMake(width(), height());
47 }
48 #endif
49
GetArea() const50 int Size::GetArea() const {
51 return GetCheckedArea().ValueOrDie();
52 }
53
GetCheckedArea() const54 base::CheckedNumeric<int> Size::GetCheckedArea() const {
55 base::CheckedNumeric<int> checked_area = width();
56 checked_area *= height();
57 return checked_area;
58 }
59
Enlarge(int grow_width,int grow_height)60 void Size::Enlarge(int grow_width, int grow_height) {
61 SetSize(base::ClampAdd(width(), grow_width),
62 base::ClampAdd(height(), grow_height));
63 }
64
SetToMin(const Size & other)65 void Size::SetToMin(const Size& other) {
66 width_ = width() <= other.width() ? width() : other.width();
67 height_ = height() <= other.height() ? height() : other.height();
68 }
69
SetToMax(const Size & other)70 void Size::SetToMax(const Size& other) {
71 width_ = width() >= other.width() ? width() : other.width();
72 height_ = height() >= other.height() ? height() : other.height();
73 }
74
ToString() const75 std::string Size::ToString() const {
76 return base::StringPrintf("%dx%d", width(), height());
77 }
78
ScaleToCeiledSize(const Size & size,float x_scale,float y_scale)79 Size ScaleToCeiledSize(const Size& size, float x_scale, float y_scale) {
80 if (x_scale == 1.f && y_scale == 1.f)
81 return size;
82 return ToCeiledSize(ScaleSize(gfx::SizeF(size), x_scale, y_scale));
83 }
84
ScaleToCeiledSize(const Size & size,float scale)85 Size ScaleToCeiledSize(const Size& size, float scale) {
86 if (scale == 1.f)
87 return size;
88 return ToCeiledSize(ScaleSize(gfx::SizeF(size), scale, scale));
89 }
90
ScaleToFlooredSize(const Size & size,float x_scale,float y_scale)91 Size ScaleToFlooredSize(const Size& size, float x_scale, float y_scale) {
92 if (x_scale == 1.f && y_scale == 1.f)
93 return size;
94 return ToFlooredSize(ScaleSize(gfx::SizeF(size), x_scale, y_scale));
95 }
96
ScaleToFlooredSize(const Size & size,float scale)97 Size ScaleToFlooredSize(const Size& size, float scale) {
98 if (scale == 1.f)
99 return size;
100 return ToFlooredSize(ScaleSize(gfx::SizeF(size), scale, scale));
101 }
102
ScaleToRoundedSize(const Size & size,float x_scale,float y_scale)103 Size ScaleToRoundedSize(const Size& size, float x_scale, float y_scale) {
104 if (x_scale == 1.f && y_scale == 1.f)
105 return size;
106 return ToRoundedSize(ScaleSize(gfx::SizeF(size), x_scale, y_scale));
107 }
108
ScaleToRoundedSize(const Size & size,float scale)109 Size ScaleToRoundedSize(const Size& size, float scale) {
110 if (scale == 1.f)
111 return size;
112 return ToRoundedSize(ScaleSize(gfx::SizeF(size), scale, scale));
113 }
114
115 } // namespace gfx
116