12256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez// Use of this source code is governed by a BSD-style license that can be 32256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez// found in the LICENSE file. 42256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 52256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#include "ui/gfx/geometry/size.h" 62256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 72256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#if defined(OS_WIN) 82256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#include <windows.h> 92256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#elif defined(OS_IOS) 102256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#include <CoreGraphics/CoreGraphics.h> 112256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#elif defined(OS_MACOSX) 122256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#include <ApplicationServices/ApplicationServices.h> 132256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#endif 142256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 152256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#include "base/numerics/safe_math.h" 162256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#include "base/numerics/saturated_arithmetic.h" 172256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#include "base/strings/stringprintf.h" 182256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#include "build/build_config.h" 192256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#include "ui/gfx/geometry/safe_integer_conversions.h" 202256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#include "ui/gfx/geometry/size_conversions.h" 212256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 222256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chaveznamespace gfx { 232256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 242256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#if defined(OS_MACOSX) 252256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector ChavezSize::Size(const CGSize& s) 262256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez : width_(s.width < 0 ? 0 : s.width), 272256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez height_(s.height < 0 ? 0 : s.height) { 282256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 292256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 302256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector ChavezSize& Size::operator=(const CGSize& s) { 312256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez set_width(s.width); 322256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez set_height(s.height); 332256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return *this; 342256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 352256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#endif 362256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 372256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#if defined(OS_WIN) 382256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector ChavezSIZE Size::ToSIZE() const { 392256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez SIZE s; 402256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez s.cx = width(); 412256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez s.cy = height(); 422256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return s; 432256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 442256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#elif defined(OS_MACOSX) 452256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector ChavezCGSize Size::ToCGSize() const { 462256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return CGSizeMake(width(), height()); 472256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 482256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez#endif 492256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 502256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavezint Size::GetArea() const { 512256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return GetCheckedArea().ValueOrDie(); 522256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 532256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 542256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavezbase::CheckedNumeric<int> Size::GetCheckedArea() const { 552256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez base::CheckedNumeric<int> checked_area = width(); 562256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez checked_area *= height(); 572256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return checked_area; 582256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 592256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 602256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavezvoid Size::Enlarge(int grow_width, int grow_height) { 612256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez SetSize(base::SaturatedAddition(width(), grow_width), 622256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez base::SaturatedAddition(height(), grow_height)); 632256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 642256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 652256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavezvoid Size::SetToMin(const Size& other) { 662256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez width_ = width() <= other.width() ? width() : other.width(); 672256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez height_ = height() <= other.height() ? height() : other.height(); 682256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 692256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 702256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavezvoid Size::SetToMax(const Size& other) { 712256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez width_ = width() >= other.width() ? width() : other.width(); 722256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez height_ = height() >= other.height() ? height() : other.height(); 732256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 742256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 752256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavezstd::string Size::ToString() const { 762256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return base::StringPrintf("%dx%d", width(), height()); 772256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 782256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 792256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector ChavezSize ScaleToCeiledSize(const Size& size, float x_scale, float y_scale) { 802256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez if (x_scale == 1.f && y_scale == 1.f) 812256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return size; 822256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return ToCeiledSize(ScaleSize(gfx::SizeF(size), x_scale, y_scale)); 832256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 842256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 852256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector ChavezSize ScaleToCeiledSize(const Size& size, float scale) { 862256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez if (scale == 1.f) 872256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return size; 882256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return ToCeiledSize(ScaleSize(gfx::SizeF(size), scale, scale)); 892256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 902256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 912256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector ChavezSize ScaleToFlooredSize(const Size& size, float x_scale, float y_scale) { 922256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez if (x_scale == 1.f && y_scale == 1.f) 932256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return size; 942256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return ToFlooredSize(ScaleSize(gfx::SizeF(size), x_scale, y_scale)); 952256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 962256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 972256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector ChavezSize ScaleToFlooredSize(const Size& size, float scale) { 982256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez if (scale == 1.f) 992256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return size; 1002256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return ToFlooredSize(ScaleSize(gfx::SizeF(size), scale, scale)); 1012256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 1022256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 1032256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector ChavezSize ScaleToRoundedSize(const Size& size, float x_scale, float y_scale) { 1042256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez if (x_scale == 1.f && y_scale == 1.f) 1052256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return size; 1062256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return ToRoundedSize(ScaleSize(gfx::SizeF(size), x_scale, y_scale)); 1072256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 1082256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 1092256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector ChavezSize ScaleToRoundedSize(const Size& size, float scale) { 1102256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez if (scale == 1.f) 1112256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return size; 1122256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez return ToRoundedSize(ScaleSize(gfx::SizeF(size), scale, scale)); 1132256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} 1142256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez 1152256d987b3a5bffb7da4a7212a2e482d45785957Luis Hector Chavez} // namespace gfx 116