Home | History | Annotate | Download | only in graphics
      1 /*
      2  * Copyright (C) 2003, 2006 Apple Computer, Inc.  All rights reserved.
      3  * Copyright (C) 2005 Nokia.  All rights reserved.
      4  *               2008 Eric Seidel <eric (at) webkit.org>
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  * 2. Redistributions in binary form must reproduce the above copyright
     12  *    notice, this list of conditions and the following disclaimer in the
     13  *    documentation and/or other materials provided with the distribution.
     14  *
     15  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     16  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     18  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     19  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     22  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     23  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 #ifndef FloatSize_h
     29 #define FloatSize_h
     30 
     31 #include "IntSize.h"
     32 #include <wtf/MathExtras.h>
     33 
     34 #if USE(CG) || (PLATFORM(WX) && OS(DARWIN)) || USE(SKIA_ON_MAC_CHROME)
     35 typedef struct CGSize CGSize;
     36 #endif
     37 
     38 #if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN))
     39 #ifdef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES
     40 typedef struct CGSize NSSize;
     41 #else
     42 typedef struct _NSSize NSSize;
     43 #endif
     44 #endif
     45 
     46 namespace WebCore {
     47 
     48 class IntSize;
     49 
     50 class FloatSize {
     51 public:
     52     FloatSize() : m_width(0), m_height(0) { }
     53     FloatSize(float width, float height) : m_width(width), m_height(height) { }
     54     FloatSize(const IntSize&);
     55 
     56     static FloatSize narrowPrecision(double width, double height);
     57 
     58     float width() const { return m_width; }
     59     float height() const { return m_height; }
     60 
     61     void setWidth(float width) { m_width = width; }
     62     void setHeight(float height) { m_height = height; }
     63 
     64     bool isEmpty() const { return m_width <= 0 || m_height <= 0; }
     65 
     66     float aspectRatio() const { return m_width / m_height; }
     67 
     68     void scale(float scale)
     69     {
     70         m_width *= scale;
     71         m_height *= scale;
     72     }
     73 
     74     FloatSize expandedTo(const FloatSize& other) const
     75     {
     76         return FloatSize(m_width > other.m_width ? m_width : other.m_width,
     77             m_height > other.m_height ? m_height : other.m_height);
     78     }
     79 
     80     FloatSize shrunkTo(const FloatSize& other) const
     81     {
     82        return FloatSize(m_width < other.m_width ? m_width : other.m_width,
     83            m_height < other.m_height ? m_height : other.m_height);
     84     }
     85 
     86     float diagonalLength() const;
     87     float diagonalLengthSquared() const
     88     {
     89         return m_width * m_width + m_height * m_height;
     90     }
     91 
     92 #if USE(CG) || (PLATFORM(WX) && OS(DARWIN)) || USE(SKIA_ON_MAC_CHROME)
     93     explicit FloatSize(const CGSize&); // don't do this implicitly since it's lossy
     94     operator CGSize() const;
     95 #endif
     96 
     97 #if (PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)) \
     98         || (PLATFORM(CHROMIUM) && OS(DARWIN))
     99     explicit FloatSize(const NSSize &); // don't do this implicitly since it's lossy
    100     operator NSSize() const;
    101 #endif
    102 
    103 private:
    104     float m_width, m_height;
    105 };
    106 
    107 inline FloatSize& operator+=(FloatSize& a, const FloatSize& b)
    108 {
    109     a.setWidth(a.width() + b.width());
    110     a.setHeight(a.height() + b.height());
    111     return a;
    112 }
    113 
    114 inline FloatSize& operator-=(FloatSize& a, const FloatSize& b)
    115 {
    116     a.setWidth(a.width() - b.width());
    117     a.setHeight(a.height() - b.height());
    118     return a;
    119 }
    120 
    121 inline FloatSize operator+(const FloatSize& a, const FloatSize& b)
    122 {
    123     return FloatSize(a.width() + b.width(), a.height() + b.height());
    124 }
    125 
    126 inline FloatSize operator-(const FloatSize& a, const FloatSize& b)
    127 {
    128     return FloatSize(a.width() - b.width(), a.height() - b.height());
    129 }
    130 
    131 inline FloatSize operator-(const FloatSize& size)
    132 {
    133     return FloatSize(-size.width(), -size.height());
    134 }
    135 
    136 inline bool operator==(const FloatSize& a, const FloatSize& b)
    137 {
    138     return a.width() == b.width() && a.height() == b.height();
    139 }
    140 
    141 inline bool operator!=(const FloatSize& a, const FloatSize& b)
    142 {
    143     return a.width() != b.width() || a.height() != b.height();
    144 }
    145 
    146 inline IntSize roundedIntSize(const FloatSize& p)
    147 {
    148     return IntSize(static_cast<int>(roundf(p.width())), static_cast<int>(roundf(p.height())));
    149 }
    150 
    151 inline IntSize expandedIntSize(const FloatSize& p)
    152 {
    153     return IntSize(clampToInteger(ceilf(p.width())), clampToInteger(ceilf(p.height())));
    154 }
    155 
    156 } // namespace WebCore
    157 
    158 #endif // FloatSize_h
    159