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