15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc. All rights reserved. 353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef IntSize_h 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define IntSize_h 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformExport.h" 316f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include "public/platform/WebCommon.h" 321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 338abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX) 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef struct CGSize CGSize; 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#ifdef __OBJC__ 3707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#import <Foundation/Foundation.h> 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)class PLATFORM_EXPORT IntSize { 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntSize() : m_width(0), m_height(0) { } 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntSize(int width, int height) : m_width(width), m_height(height) { } 4702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int width() const { return m_width; } 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int height() const { return m_height; } 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setWidth(int width) { m_width = width; } 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setHeight(int height) { m_height = height; } 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isEmpty() const { return m_width <= 0 || m_height <= 0; } 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isZero() const { return !m_width && !m_height; } 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float aspectRatio() const { return static_cast<float>(m_width) / static_cast<float>(m_height); } 5802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void expand(int width, int height) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_width += width; 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_height += height; 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void scale(float widthScale, float heightScale) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_width = static_cast<int>(static_cast<float>(m_width) * widthScale); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_height = static_cast<int>(static_cast<float>(m_height) * heightScale); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void scale(float scale) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this->scale(scale, scale); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntSize expandedTo(const IntSize& other) const 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntSize(m_width > other.m_width ? m_width : other.m_width, 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_height > other.m_height ? m_height : other.m_height); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntSize shrunkTo(const IntSize& other) const 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntSize(m_width < other.m_width ? m_width : other.m_width, 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_height < other.m_height ? m_height : other.m_height); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void clampNegativeToZero() 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *this = expandedTo(IntSize()); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void clampToMinimumSize(const IntSize& minimumSize) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_width < minimumSize.width()) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_width = minimumSize.width(); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_height < minimumSize.height()) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_height = minimumSize.height(); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1016f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch // Return area in a uint64_t to avoid overflow. 1026f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch uint64_t area() const 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1046f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return static_cast<uint64_t>(width()) * height(); 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int diagonalLengthSquared() const 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_width * m_width + m_height * m_height; 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntSize transposedSize() const 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntSize(m_height, m_width); 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1178abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit IntSize(const CGSize&); // don't do this implicitly since it's lossy 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) operator CGSize() const; 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#if defined(__OBJC__) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit IntSize(const NSSize &); // don't do this implicitly since it's lossy 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) operator NSSize() const; 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int m_width, m_height; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntSize& operator+=(IntSize& a, const IntSize& b) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a.setWidth(a.width() + b.width()); 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a.setHeight(a.height() + b.height()); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a; 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntSize& operator-=(IntSize& a, const IntSize& b) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a.setWidth(a.width() - b.width()); 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a.setHeight(a.height() - b.height()); 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a; 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntSize operator+(const IntSize& a, const IntSize& b) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntSize(a.width() + b.width(), a.height() + b.height()); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntSize operator-(const IntSize& a, const IntSize& b) 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntSize(a.width() - b.width(), a.height() - b.height()); 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntSize operator-(const IntSize& size) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntSize(-size.width(), -size.height()); 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator==(const IntSize& a, const IntSize& b) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a.width() == b.width() && a.height() == b.height(); 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator!=(const IntSize& a, const IntSize& b) 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a.width() != b.width() || a.height() != b.height(); 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 170c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // IntSize_h 173