Home | History | Annotate | Download | only in graphics
      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