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/safe_math.h" 16#include "base/numerics/saturated_arithmetic.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 22namespace gfx { 23 24#if defined(OS_MACOSX) 25Size::Size(const CGSize& s) 26 : width_(s.width < 0 ? 0 : s.width), 27 height_(s.height < 0 ? 0 : s.height) { 28} 29 30Size& 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) 38SIZE Size::ToSIZE() const { 39 SIZE s; 40 s.cx = width(); 41 s.cy = height(); 42 return s; 43} 44#elif defined(OS_MACOSX) 45CGSize Size::ToCGSize() const { 46 return CGSizeMake(width(), height()); 47} 48#endif 49 50int Size::GetArea() const { 51 return GetCheckedArea().ValueOrDie(); 52} 53 54base::CheckedNumeric<int> Size::GetCheckedArea() const { 55 base::CheckedNumeric<int> checked_area = width(); 56 checked_area *= height(); 57 return checked_area; 58} 59 60void Size::Enlarge(int grow_width, int grow_height) { 61 SetSize(base::SaturatedAddition(width(), grow_width), 62 base::SaturatedAddition(height(), grow_height)); 63} 64 65void Size::SetToMin(const Size& other) { 66 width_ = width() <= other.width() ? width() : other.width(); 67 height_ = height() <= other.height() ? height() : other.height(); 68} 69 70void Size::SetToMax(const Size& other) { 71 width_ = width() >= other.width() ? width() : other.width(); 72 height_ = height() >= other.height() ? height() : other.height(); 73} 74 75std::string Size::ToString() const { 76 return base::StringPrintf("%dx%d", width(), height()); 77} 78 79Size 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 85Size 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 91Size 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 97Size 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 103Size 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 109Size 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