1424ff763b810b115333bf9e57e04de4736d8d1a
[WebKit-https.git] / Source / WebCore / rendering / BorderEdge.h
1 /*
2  * Copyright (C) 2014 Apple 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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef BorderEdge_h
27 #define BorderEdge_h
28
29 #include "Color.h"
30 #include "LayoutUnit.h"
31 #include "RenderObjectEnums.h"
32 #include "RenderStyleConstants.h"
33
34 namespace WebCore {
35
36 typedef unsigned BorderEdgeFlags;
37
38 class RenderStyle;
39
40 class BorderEdge {
41 public:
42     enum BorderEdgeFlag {
43         TopBorderEdge = 1 << BSTop,
44         RightBorderEdge = 1 << BSRight,
45         BottomBorderEdge = 1 << BSBottom,
46         LeftBorderEdge = 1 << BSLeft,
47         AllBorderEdges = TopBorderEdge | BottomBorderEdge | LeftBorderEdge | RightBorderEdge
48     };
49
50     BorderEdge() = default;
51     BorderEdge(float edgeWidth, Color edgeColor, EBorderStyle edgeStyle, bool edgeIsTransparent, bool edgeIsPresent, float devicePixelRatio);
52
53     static void getBorderEdgeInfo(BorderEdge edges[], const RenderStyle&, float deviceScaleFactor, bool includeLogicalLeftEdge = true, bool includeLogicalRightEdge = true);
54
55     EBorderStyle style() const { return m_style; }
56     const Color& color() const { return m_color; }
57     bool isTransparent() const { return m_isTransparent; }
58     bool isPresent() const { return m_isPresent; }
59
60     inline bool hasVisibleColorAndStyle() const { return m_style > BHIDDEN && !m_isTransparent; }
61     inline bool shouldRender() const { return m_isPresent && widthForPainting() && hasVisibleColorAndStyle(); }
62     inline bool presentButInvisible() const { return widthForPainting() && !hasVisibleColorAndStyle(); }
63     inline float widthForPainting() const { return m_isPresent ?  m_flooredToDevicePixelWidth : 0; }
64     void getDoubleBorderStripeWidths(LayoutUnit& outerWidth, LayoutUnit& innerWidth) const;
65     bool obscuresBackgroundEdge(float scale) const;
66     bool obscuresBackground() const;
67
68 private:
69     inline float borderWidthInDevicePixel(int logicalPixels) const { return LayoutUnit(logicalPixels / m_devicePixelRatio).toFloat(); }
70
71     LayoutUnit m_width;
72     Color m_color;
73     EBorderStyle m_style { BHIDDEN };
74     bool m_isTransparent { false };
75     bool m_isPresent { false };
76     float m_flooredToDevicePixelWidth { 0 };
77     float m_devicePixelRatio { 1 };
78 };
79
80 inline bool edgesShareColor(const BorderEdge& firstEdge, const BorderEdge& secondEdge) { return firstEdge.color() == secondEdge.color(); }
81 inline BorderEdge::BorderEdgeFlag edgeFlagForSide(BoxSide side) { return static_cast<BorderEdge::BorderEdgeFlag>(1 << side); }
82 inline bool includesEdge(BorderEdgeFlags flags, BoxSide side) { return flags & edgeFlagForSide(side); }
83 inline bool includesAdjacentEdges(BorderEdgeFlags flags)
84 {
85     return (flags & (BorderEdge::TopBorderEdge | BorderEdge::RightBorderEdge)) == (BorderEdge::TopBorderEdge | BorderEdge::RightBorderEdge)
86         || (flags & (BorderEdge::RightBorderEdge | BorderEdge::BottomBorderEdge)) == (BorderEdge::RightBorderEdge | BorderEdge::BottomBorderEdge)
87         || (flags & (BorderEdge::BottomBorderEdge | BorderEdge::LeftBorderEdge)) == (BorderEdge::BottomBorderEdge | BorderEdge::LeftBorderEdge)
88         || (flags & (BorderEdge::LeftBorderEdge | BorderEdge::TopBorderEdge)) == (BorderEdge::LeftBorderEdge | BorderEdge::TopBorderEdge);
89 }
90
91 } // namespace WebCore
92
93 #endif // BorderEdge_h