15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 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 IntPoint_h 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define IntPoint_h 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/IntSize.h" 31521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/MathExtras.h" 32521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/Platform.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if OS(DARWIN) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef struct CGPoint CGPoint; 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef struct CGPoint NSPoint; 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef struct _NSPoint NSPoint; 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class IntPoint { 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint() : m_x(0), m_y(0) { } 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint(int x, int y) : m_x(x), m_y(y) { } 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit IntPoint(const IntSize& size) : m_x(size.width()), m_y(size.height()) { } 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static IntPoint zero() { return IntPoint(); } 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int x() const { return m_x; } 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int y() const { return m_y; } 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setX(int x) { m_x = x; } 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setY(int y) { m_y = y; } 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch void move(const IntSize& s) { move(s.width(), s.height()); } 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void moveBy(const IntPoint& offset) { move(offset.x(), offset.y()); } 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void move(int dx, int dy) { m_x += dx; m_y += dy; } 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void scale(float sx, float sy) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_x = lroundf(static_cast<float>(m_x * sx)); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_y = lroundf(static_cast<float>(m_y * sy)); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint expandedTo(const IntPoint& other) const 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntPoint(m_x > other.m_x ? m_x : other.m_x, 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_y > other.m_y ? m_y : other.m_y); 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint shrunkTo(const IntPoint& other) const 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntPoint(m_x < other.m_x ? m_x : other.m_x, 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_y < other.m_y ? m_y : other.m_y); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int distanceSquaredToPoint(const IntPoint&) const; 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void clampNegativeToZero() 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *this = expandedTo(zero()); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint transposedPoint() const 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntPoint(m_y, m_x); 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if OS(DARWIN) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit IntPoint(const CGPoint&); // don't do this implicitly since it's lossy 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) operator CGPoint() const; 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit IntPoint(const NSPoint&); // don't do this implicitly since it's lossy 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) operator NSPoint() const; 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int m_x, m_y; 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntPoint& operator+=(IntPoint& a, const IntSize& b) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a.move(b.width(), b.height()); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a; 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntPoint& operator-=(IntPoint& a, const IntSize& b) 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a.move(-b.width(), -b.height()); 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntPoint operator+(const IntPoint& a, const IntSize& b) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntPoint(a.x() + b.width(), a.y() + b.height()); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntPoint operator+(const IntPoint& a, const IntPoint& b) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntPoint(a.x() + b.x(), a.y() + b.y()); 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntSize operator-(const IntPoint& a, const IntPoint& b) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntSize(a.x() - b.x(), a.y() - b.y()); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntPoint operator-(const IntPoint& a, const IntSize& b) 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntPoint(a.x() - b.width(), a.y() - b.height()); 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntPoint operator-(const IntPoint& point) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntPoint(-point.x(), -point.y()); 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator==(const IntPoint& a, const IntPoint& b) 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a.x() == b.x() && a.y() == b.y(); 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator!=(const IntPoint& a, const IntPoint& b) 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a.x() != b.x() || a.y() != b.y(); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline IntSize toIntSize(const IntPoint& a) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntSize(a.x(), a.y()); 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline int IntPoint::distanceSquaredToPoint(const IntPoint& point) const 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ((*this) - point).diagonalLengthSquared(); 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // IntPoint_h 166