Home | History | Annotate | Download | only in geometry
      1 /*
      2  * Copyright (c) 2012, Google 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 are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #ifndef LayoutSize_h
     32 #define LayoutSize_h
     33 
     34 #include "platform/LayoutUnit.h"
     35 #include "platform/geometry/FloatSize.h"
     36 #include "platform/geometry/IntSize.h"
     37 
     38 namespace blink {
     39 
     40 enum AspectRatioFit {
     41     AspectRatioFitShrink,
     42     AspectRatioFitGrow
     43 };
     44 
     45 class LayoutSize {
     46 public:
     47     LayoutSize() { }
     48     LayoutSize(const IntSize& size) : m_width(size.width()), m_height(size.height()) { }
     49     LayoutSize(LayoutUnit width, LayoutUnit height) : m_width(width), m_height(height) { }
     50 
     51     explicit LayoutSize(const FloatSize& size) : m_width(size.width()), m_height(size.height()) { }
     52 
     53     LayoutUnit width() const { return m_width; }
     54     LayoutUnit height() const { return m_height; }
     55 
     56     void setWidth(LayoutUnit width) { m_width = width; }
     57     void setHeight(LayoutUnit height) { m_height = height; }
     58 
     59     bool isEmpty() const { return m_width.rawValue() <= 0 || m_height.rawValue() <= 0; }
     60     bool isZero() const { return !m_width && !m_height; }
     61 
     62     float aspectRatio() const { return m_width.toFloat() / m_height.toFloat(); }
     63 
     64     void expand(LayoutUnit width, LayoutUnit height)
     65     {
     66         m_width += width;
     67         m_height += height;
     68     }
     69 
     70     void shrink(LayoutUnit width, LayoutUnit height)
     71     {
     72         m_width -= width;
     73         m_height -= height;
     74     }
     75 
     76     void scale(float scale)
     77     {
     78         m_width *= scale;
     79         m_height *= scale;
     80     }
     81 
     82     void scale(float widthScale, float heightScale)
     83     {
     84         m_width *= widthScale;
     85         m_height *= heightScale;
     86     }
     87 
     88     LayoutSize expandedTo(const LayoutSize& other) const
     89     {
     90         return LayoutSize(m_width > other.m_width ? m_width : other.m_width,
     91             m_height > other.m_height ? m_height : other.m_height);
     92     }
     93 
     94     LayoutSize shrunkTo(const LayoutSize& other) const
     95     {
     96         return LayoutSize(m_width < other.m_width ? m_width : other.m_width,
     97             m_height < other.m_height ? m_height : other.m_height);
     98     }
     99 
    100     void clampNegativeToZero()
    101     {
    102         *this = expandedTo(LayoutSize());
    103     }
    104 
    105     void clampToMinimumSize(const LayoutSize& minimumSize)
    106     {
    107         if (m_width < minimumSize.width())
    108             m_width = minimumSize.width();
    109         if (m_height < minimumSize.height())
    110             m_height = minimumSize.height();
    111     }
    112 
    113     LayoutSize transposedSize() const
    114     {
    115         return LayoutSize(m_height, m_width);
    116     }
    117 
    118     LayoutSize fitToAspectRatio(const LayoutSize& aspectRatio, AspectRatioFit fit) const
    119     {
    120         float heightScale = height().toFloat() / aspectRatio.height().toFloat();
    121         float widthScale = width().toFloat() / aspectRatio.width().toFloat();
    122         if ((widthScale > heightScale) != (fit == AspectRatioFitGrow))
    123             return LayoutSize(height() * aspectRatio.width() / aspectRatio.height(), height());
    124         return LayoutSize(width(), width() * aspectRatio.height() / aspectRatio.width());
    125     }
    126 
    127     LayoutSize fraction() const
    128     {
    129         return LayoutSize(m_width.fraction(), m_height.fraction());
    130     }
    131 
    132 private:
    133     LayoutUnit m_width, m_height;
    134 };
    135 
    136 inline LayoutSize& operator+=(LayoutSize& a, const LayoutSize& b)
    137 {
    138     a.setWidth(a.width() + b.width());
    139     a.setHeight(a.height() + b.height());
    140     return a;
    141 }
    142 
    143 inline LayoutSize& operator-=(LayoutSize& a, const LayoutSize& b)
    144 {
    145     a.setWidth(a.width() - b.width());
    146     a.setHeight(a.height() - b.height());
    147     return a;
    148 }
    149 
    150 inline LayoutSize operator+(const LayoutSize& a, const LayoutSize& b)
    151 {
    152     return LayoutSize(a.width() + b.width(), a.height() + b.height());
    153 }
    154 
    155 inline LayoutSize operator-(const LayoutSize& a, const LayoutSize& b)
    156 {
    157     return LayoutSize(a.width() - b.width(), a.height() - b.height());
    158 }
    159 
    160 inline LayoutSize operator-(const LayoutSize& size)
    161 {
    162     return LayoutSize(-size.width(), -size.height());
    163 }
    164 
    165 inline bool operator==(const LayoutSize& a, const LayoutSize& b)
    166 {
    167     return a.width() == b.width() && a.height() == b.height();
    168 }
    169 
    170 inline bool operator!=(const LayoutSize& a, const LayoutSize& b)
    171 {
    172     return a.width() != b.width() || a.height() != b.height();
    173 }
    174 
    175 inline IntSize flooredIntSize(const LayoutSize& s)
    176 {
    177     return IntSize(s.width().floor(), s.height().floor());
    178 }
    179 
    180 inline IntSize roundedIntSize(const LayoutSize& s)
    181 {
    182     return IntSize(s.width().round(), s.height().round());
    183 }
    184 
    185 inline LayoutSize roundedLayoutSize(const FloatSize& s)
    186 {
    187     return LayoutSize(s);
    188 }
    189 
    190 } // namespace blink
    191 
    192 #endif // LayoutSize_h
    193