Home | History | Annotate | Download | only in geometry
      1 /*
      2  * Copyright (C) 2013 Adobe Systems Incorporated. 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  *
      8  * 1. Redistributions of source code must retain the above
      9  *    copyright notice, this list of conditions and the following
     10  *    disclaimer.
     11  * 2. Redistributions in binary form must reproduce the above
     12  *    copyright notice, this list of conditions and the following
     13  *    disclaimer in the documentation and/or other materials
     14  *    provided with the distribution.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     19  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     20  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     21  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     23  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     25  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     27  * OF THE POSSIBILITY OF SUCH DAMAGE.
     28  */
     29 
     30 #ifndef FloatRoundedRect_h
     31 #define FloatRoundedRect_h
     32 
     33 #include "platform/geometry/FloatRect.h"
     34 #include "platform/geometry/FloatSize.h"
     35 #include "platform/geometry/RoundedRect.h"
     36 
     37 namespace WebCore {
     38 
     39 class PLATFORM_EXPORT FloatRoundedRect {
     40 public:
     41     class PLATFORM_EXPORT Radii {
     42     public:
     43         Radii() { }
     44         Radii(const FloatSize& topLeft, const FloatSize& topRight, const FloatSize& bottomLeft, const FloatSize& bottomRight)
     45             : m_topLeft(topLeft)
     46             , m_topRight(topRight)
     47             , m_bottomLeft(bottomLeft)
     48             , m_bottomRight(bottomRight)
     49         {
     50         }
     51 
     52         Radii(const RoundedRect::Radii& intRadii)
     53             : m_topLeft(intRadii.topLeft())
     54             , m_topRight(intRadii.topRight())
     55             , m_bottomLeft(intRadii.bottomLeft())
     56             , m_bottomRight(intRadii.bottomRight())
     57         {
     58         }
     59 
     60         void setTopLeft(const FloatSize& size) { m_topLeft = size; }
     61         void setTopRight(const FloatSize& size) { m_topRight = size; }
     62         void setBottomLeft(const FloatSize& size) { m_bottomLeft = size; }
     63         void setBottomRight(const FloatSize& size) { m_bottomRight = size; }
     64         const FloatSize& topLeft() const { return m_topLeft; }
     65         const FloatSize& topRight() const { return m_topRight; }
     66         const FloatSize& bottomLeft() const { return m_bottomLeft; }
     67         const FloatSize& bottomRight() const { return m_bottomRight; }
     68 
     69         bool isZero() const;
     70 
     71         void scale(float factor);
     72         void expand(float topWidth, float bottomWidth, float leftWidth, float rightWidth);
     73         void expand(float size) { expand(size, size, size, size); }
     74         void shrink(float topWidth, float bottomWidth, float leftWidth, float rightWidth) { expand(-topWidth, -bottomWidth, -leftWidth, -rightWidth); }
     75         void shrink(float size) { shrink(size, size, size, size); }
     76 
     77     private:
     78         FloatSize m_topLeft;
     79         FloatSize m_topRight;
     80         FloatSize m_bottomLeft;
     81         FloatSize m_bottomRight;
     82     };
     83 
     84     explicit FloatRoundedRect(const FloatRect&, const Radii& = Radii());
     85     FloatRoundedRect(float x, float y, float width, float height);
     86     FloatRoundedRect(const FloatRect&, const FloatSize& topLeft, const FloatSize& topRight, const FloatSize& bottomLeft, const FloatSize& bottomRight);
     87 
     88     const FloatRect& rect() const { return m_rect; }
     89     const Radii& radii() const { return m_radii; }
     90     bool isRounded() const { return !m_radii.isZero(); }
     91     bool isEmpty() const { return m_rect.isEmpty(); }
     92 
     93     void setRect(const FloatRect& rect) { m_rect = rect; }
     94     void setRadii(const Radii& radii) { m_radii = radii; }
     95 
     96     void move(const FloatSize& size) { m_rect.move(size); }
     97     void inflate(float size) { m_rect.inflate(size);  }
     98     void expandRadii(float size) { m_radii.expand(size); }
     99     void shrinkRadii(float size) { m_radii.shrink(size); }
    100 
    101     FloatRect topLeftCorner() const
    102     {
    103         return FloatRect(m_rect.x(), m_rect.y(), m_radii.topLeft().width(), m_radii.topLeft().height());
    104     }
    105     FloatRect topRightCorner() const
    106     {
    107         return FloatRect(m_rect.maxX() - m_radii.topRight().width(), m_rect.y(), m_radii.topRight().width(), m_radii.topRight().height());
    108     }
    109     FloatRect bottomLeftCorner() const
    110     {
    111         return FloatRect(m_rect.x(), m_rect.maxY() - m_radii.bottomLeft().height(), m_radii.bottomLeft().width(), m_radii.bottomLeft().height());
    112     }
    113     FloatRect bottomRightCorner() const
    114     {
    115         return FloatRect(m_rect.maxX() - m_radii.bottomRight().width(), m_rect.maxY() - m_radii.bottomRight().height(), m_radii.bottomRight().width(), m_radii.bottomRight().height());
    116     }
    117 
    118     bool xInterceptsAtY(float y, float& minXIntercept, float& maxXIntercept) const;
    119 
    120 private:
    121     FloatRect m_rect;
    122     Radii m_radii;
    123 };
    124 
    125 inline bool operator==(const FloatRoundedRect::Radii& a, const FloatRoundedRect::Radii& b)
    126 {
    127     return a.topLeft() == b.topLeft() && a.topRight() == b.topRight() && a.bottomLeft() == b.bottomLeft() && a.bottomRight() == b.bottomRight();
    128 }
    129 
    130 inline bool operator==(const FloatRoundedRect& a, const FloatRoundedRect& b)
    131 {
    132     return a.rect() == b.rect() && a.radii() == b.radii();
    133 }
    134 
    135 } // namespace WebCore
    136 
    137 #endif // FloatRoundedRect_h
    138