1 /* 2 * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #ifndef IntPoint_h 27 #define IntPoint_h 28 29 #include "IntSize.h" 30 31 #if PLATFORM(QT) 32 #include <QDataStream> 33 #endif 34 35 #if USE(CG) || USE(SKIA_ON_MAC_CHROME) 36 typedef struct CGPoint CGPoint; 37 #endif 38 39 40 #if PLATFORM(MAC) 41 #ifdef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES 42 typedef struct CGPoint NSPoint; 43 #else 44 typedef struct _NSPoint NSPoint; 45 #endif 46 #endif 47 48 #if PLATFORM(WIN) 49 typedef struct tagPOINT POINT; 50 typedef struct tagPOINTS POINTS; 51 #elif PLATFORM(QT) 52 QT_BEGIN_NAMESPACE 53 class QPoint; 54 QT_END_NAMESPACE 55 #elif PLATFORM(GTK) 56 typedef struct _GdkPoint GdkPoint; 57 #elif PLATFORM(HAIKU) 58 class BPoint; 59 #elif PLATFORM(EFL) 60 typedef struct _Evas_Point Evas_Point; 61 #endif 62 63 #if PLATFORM(WX) 64 class wxPoint; 65 #endif 66 67 #if PLATFORM(BREWMP) 68 typedef struct _point AEEPoint; 69 #endif 70 71 #if USE(SKIA) 72 struct SkPoint; 73 struct SkIPoint; 74 #endif 75 76 namespace WebCore { 77 78 class IntPoint { 79 public: 80 IntPoint() : m_x(0), m_y(0) { } 81 IntPoint(int x, int y) : m_x(x), m_y(y) { } 82 explicit IntPoint(const IntSize& size) : m_x(size.width()), m_y(size.height()) { } 83 84 static IntPoint zero() { return IntPoint(); } 85 86 int x() const { return m_x; } 87 int y() const { return m_y; } 88 89 void setX(int x) { m_x = x; } 90 void setY(int y) { m_y = y; } 91 92 void move(const IntSize& s) { move(s.width(), s.height()); } 93 void move(int dx, int dy) { m_x += dx; m_y += dy; } 94 95 IntPoint expandedTo(const IntPoint& other) const 96 { 97 return IntPoint(m_x > other.m_x ? m_x : other.m_x, 98 m_y > other.m_y ? m_y : other.m_y); 99 } 100 101 IntPoint shrunkTo(const IntPoint& other) const 102 { 103 return IntPoint(m_x < other.m_x ? m_x : other.m_x, 104 m_y < other.m_y ? m_y : other.m_y); 105 } 106 107 void clampNegativeToZero() 108 { 109 *this = expandedTo(zero()); 110 } 111 112 IntPoint transposedPoint() const 113 { 114 return IntPoint(m_y, m_x); 115 } 116 117 #if USE(CG) || USE(SKIA_ON_MAC_CHROME) 118 explicit IntPoint(const CGPoint&); // don't do this implicitly since it's lossy 119 operator CGPoint() const; 120 #endif 121 122 #if PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES) 123 explicit IntPoint(const NSPoint&); // don't do this implicitly since it's lossy 124 operator NSPoint() const; 125 #endif 126 127 #if PLATFORM(WIN) 128 IntPoint(const POINT&); 129 operator POINT() const; 130 IntPoint(const POINTS&); 131 operator POINTS() const; 132 #elif PLATFORM(QT) 133 IntPoint(const QPoint&); 134 operator QPoint() const; 135 #elif PLATFORM(GTK) 136 IntPoint(const GdkPoint&); 137 operator GdkPoint() const; 138 #elif PLATFORM(HAIKU) 139 explicit IntPoint(const BPoint&); 140 operator BPoint() const; 141 #elif PLATFORM(EFL) 142 explicit IntPoint(const Evas_Point&); 143 operator Evas_Point() const; 144 #endif 145 146 #if PLATFORM(WX) 147 IntPoint(const wxPoint&); 148 operator wxPoint() const; 149 #endif 150 151 #if PLATFORM(BREWMP) 152 IntPoint(const AEEPoint&); 153 operator AEEPoint() const; 154 #endif 155 156 #if USE(SKIA) 157 IntPoint(const SkIPoint&); 158 operator SkIPoint() const; 159 operator SkPoint() const; 160 #endif 161 162 private: 163 int m_x, m_y; 164 }; 165 166 inline IntPoint& operator+=(IntPoint& a, const IntSize& b) 167 { 168 a.move(b.width(), b.height()); 169 return a; 170 } 171 172 inline IntPoint& operator-=(IntPoint& a, const IntSize& b) 173 { 174 a.move(-b.width(), -b.height()); 175 return a; 176 } 177 178 inline IntPoint operator+(const IntPoint& a, const IntSize& b) 179 { 180 return IntPoint(a.x() + b.width(), a.y() + b.height()); 181 } 182 183 inline IntSize operator-(const IntPoint& a, const IntPoint& b) 184 { 185 return IntSize(a.x() - b.x(), a.y() - b.y()); 186 } 187 188 inline IntPoint operator-(const IntPoint& a, const IntSize& b) 189 { 190 return IntPoint(a.x() - b.width(), a.y() - b.height()); 191 } 192 193 inline bool operator==(const IntPoint& a, const IntPoint& b) 194 { 195 return a.x() == b.x() && a.y() == b.y(); 196 } 197 198 inline bool operator!=(const IntPoint& a, const IntPoint& b) 199 { 200 return a.x() != b.x() || a.y() != b.y(); 201 } 202 203 inline IntPoint toPoint(const IntSize& size) 204 { 205 return IntPoint(size.width(), size.height()); 206 } 207 208 #if PLATFORM(QT) 209 inline QDataStream& operator<<(QDataStream& stream, const IntPoint& point) 210 { 211 stream << point.x() << point.y(); 212 return stream; 213 } 214 215 inline QDataStream& operator>>(QDataStream& stream, IntPoint& point) 216 { 217 int x, y; 218 stream >> x >> y; 219 point.setX(x); 220 point.setY(y); 221 return stream; 222 } 223 #endif 224 225 } // namespace WebCore 226 227 #endif // IntPoint_h 228