Home | History | Annotate | Download | only in graphics
      1 /*
      2  * Copyright (C) 2003, 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 IntSize_h
     27 #define IntSize_h
     28 
     29 #if USE(CG) || USE(SKIA_ON_MAC_CHROME)
     30 typedef struct CGSize CGSize;
     31 #endif
     32 
     33 #if PLATFORM(MAC)
     34 #ifdef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES
     35 typedef struct CGSize NSSize;
     36 #else
     37 typedef struct _NSSize NSSize;
     38 #endif
     39 #endif
     40 
     41 #if PLATFORM(WIN)
     42 typedef struct tagSIZE SIZE;
     43 #elif PLATFORM(QT)
     44 #include <qglobal.h>
     45 QT_BEGIN_NAMESPACE
     46 class QSize;
     47 QT_END_NAMESPACE
     48 #elif PLATFORM(HAIKU)
     49 class BSize;
     50 #endif
     51 
     52 #if PLATFORM(WX)
     53 class wxSize;
     54 #endif
     55 
     56 #if PLATFORM(BREWMP)
     57 typedef struct AEESize AEESize;
     58 #endif
     59 
     60 namespace WebCore {
     61 
     62 class IntSize {
     63 public:
     64     IntSize() : m_width(0), m_height(0) { }
     65     IntSize(int width, int height) : m_width(width), m_height(height) { }
     66 
     67     int width() const { return m_width; }
     68     int height() const { return m_height; }
     69 
     70     void setWidth(int width) { m_width = width; }
     71     void setHeight(int height) { m_height = height; }
     72 
     73     bool isEmpty() const { return m_width <= 0 || m_height <= 0; }
     74     bool isZero() const { return !m_width && !m_height; }
     75 
     76     float aspectRatio() const { return static_cast<float>(m_width) / static_cast<float>(m_height); }
     77 
     78     void expand(int width, int height)
     79     {
     80         m_width += width;
     81         m_height += height;
     82     }
     83 
     84     void scale(float scale)
     85     {
     86         m_width = static_cast<int>(static_cast<float>(m_width) * scale);
     87         m_height = static_cast<int>(static_cast<float>(m_height) * scale);
     88     }
     89 
     90     IntSize expandedTo(const IntSize& other) const
     91     {
     92         return IntSize(m_width > other.m_width ? m_width : other.m_width,
     93             m_height > other.m_height ? m_height : other.m_height);
     94     }
     95 
     96     IntSize shrunkTo(const IntSize& other) const
     97     {
     98         return IntSize(m_width < other.m_width ? m_width : other.m_width,
     99             m_height < other.m_height ? m_height : other.m_height);
    100     }
    101 
    102     void clampNegativeToZero()
    103     {
    104         *this = expandedTo(IntSize());
    105     }
    106 
    107     IntSize transposedSize() const
    108     {
    109         return IntSize(m_height, m_width);
    110     }
    111 
    112 #if USE(CG) || USE(SKIA_ON_MAC_CHROME)
    113     explicit IntSize(const CGSize&); // don't do this implicitly since it's lossy
    114     operator CGSize() const;
    115 #endif
    116 
    117 #if PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)
    118     explicit IntSize(const NSSize &); // don't do this implicitly since it's lossy
    119     operator NSSize() const;
    120 #endif
    121 
    122 #if PLATFORM(WIN)
    123     IntSize(const SIZE&);
    124     operator SIZE() const;
    125 #endif
    126 
    127 #if PLATFORM(QT)
    128     IntSize(const QSize&);
    129     operator QSize() const;
    130 #endif
    131 
    132 #if PLATFORM(HAIKU)
    133     explicit IntSize(const BSize&);
    134     operator BSize() const;
    135 #endif
    136 
    137 #if PLATFORM(WX)
    138     IntSize(const wxSize&);
    139     operator wxSize() const;
    140 #endif
    141 
    142 #if PLATFORM(BREWMP)
    143     IntSize(const AEESize&);
    144     operator AEESize() const;
    145 #endif
    146 
    147 private:
    148     int m_width, m_height;
    149 };
    150 
    151 inline IntSize& operator+=(IntSize& a, const IntSize& b)
    152 {
    153     a.setWidth(a.width() + b.width());
    154     a.setHeight(a.height() + b.height());
    155     return a;
    156 }
    157 
    158 inline IntSize& operator-=(IntSize& a, const IntSize& b)
    159 {
    160     a.setWidth(a.width() - b.width());
    161     a.setHeight(a.height() - b.height());
    162     return a;
    163 }
    164 
    165 inline IntSize operator+(const IntSize& a, const IntSize& b)
    166 {
    167     return IntSize(a.width() + b.width(), a.height() + b.height());
    168 }
    169 
    170 inline IntSize operator-(const IntSize& a, const IntSize& b)
    171 {
    172     return IntSize(a.width() - b.width(), a.height() - b.height());
    173 }
    174 
    175 inline IntSize operator-(const IntSize& size)
    176 {
    177     return IntSize(-size.width(), -size.height());
    178 }
    179 
    180 inline bool operator==(const IntSize& a, const IntSize& b)
    181 {
    182     return a.width() == b.width() && a.height() == b.height();
    183 }
    184 
    185 inline bool operator!=(const IntSize& a, const IntSize& b)
    186 {
    187     return a.width() != b.width() || a.height() != b.height();
    188 }
    189 
    190 } // namespace WebCore
    191 
    192 #endif // IntSize_h
    193