Use #pragma once in WebCore
[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 #pragma once
27
28 #include "Color.h"
29 #include "LayoutUnit.h"
30 #include "RenderObjectEnums.h"
31 #include "RenderStyleConstants.h"
32
33 namespace WebCore {
34
35 typedef unsigned BorderEdgeFlags;
36
37 class RenderStyle;
38
39 class BorderEdge {
40 public:
41     enum BorderEdgeFlag {
42         TopBorderEdge = 1 << BSTop,
43         RightBorderEdge = 1 << BSRight,
44         BottomBorderEdge = 1 << BSBottom,
45         LeftBorderEdge = 1 << BSLeft,
46         AllBorderEdges = TopBorderEdge | BottomBorderEdge | LeftBorderEdge | RightBorderEdge
47     };
48
49     BorderEdge() = default;
50     BorderEdge(float edgeWidth, Color edgeColor, EBorderStyle edgeStyle, bool edgeIsTransparent, bool edgeIsPresent, float devicePixelRatio);
51
52     static void getBorderEdgeInfo(BorderEdge edges[], const RenderStyle&, float deviceScaleFactor, bool includeLogicalLeftEdge = true, bool includeLogicalRightEdge = true);
53
54     EBorderStyle style() const { return m_style; }
55     const Color& color() const { return m_color; }
56     bool isTransparent() const { return m_isTransparent; }
57     bool isPresent() const { return m_isPresent; }
58
59     inline bool hasVisibleColorAndStyle() const { return m_style > BHIDDEN && !m_isTransparent; }
60     inline bool shouldRender() const { return m_isPresent && widthForPainting() && hasVisibleColorAndStyle(); }
61     inline bool presentButInvisible() const { return widthForPainting() && !hasVisibleColorAndStyle(); }
62     inline float widthForPainting() const { return m_isPresent ?  m_flooredToDevicePixelWidth : 0; }
63     void getDoubleBorderStripeWidths(LayoutUnit& outerWidth, LayoutUnit& innerWidth) const;
64     bool obscuresBackgroundEdge(float scale) const;
65     bool obscuresBackground() const;
66
67 private:
68     inline float borderWidthInDevicePixel(int logicalPixels) const { return LayoutUnit(logicalPixels / m_devicePixelRatio).toFloat(); }
69
70     LayoutUnit m_width;
71     Color m_color;
72     EBorderStyle m_style { BHIDDEN };
73     bool m_isTransparent { false };
74     bool m_isPresent { false };
75     float m_flooredToDevicePixelWidth { 0 };
76     float m_devicePixelRatio { 1 };
77 };
78
79 inline bool edgesShareColor(const BorderEdge& firstEdge, const BorderEdge& secondEdge) { return firstEdge.color() == secondEdge.color(); }
80 inline BorderEdge::BorderEdgeFlag edgeFlagForSide(BoxSide side) { return static_cast<BorderEdge::BorderEdgeFlag>(1 << side); }
81 inline bool includesEdge(BorderEdgeFlags flags, BoxSide side) { return flags & edgeFlagForSide(side); }
82 inline bool includesAdjacentEdges(BorderEdgeFlags flags)
83 {
84     return (flags & (BorderEdge::TopBorderEdge | BorderEdge::RightBorderEdge)) == (BorderEdge::TopBorderEdge | BorderEdge::RightBorderEdge)
85         || (flags & (BorderEdge::RightBorderEdge | BorderEdge::BottomBorderEdge)) == (BorderEdge::RightBorderEdge | BorderEdge::BottomBorderEdge)
86         || (flags & (BorderEdge::BottomBorderEdge | BorderEdge::LeftBorderEdge)) == (BorderEdge::BottomBorderEdge | BorderEdge::LeftBorderEdge)
87         || (flags & (BorderEdge::LeftBorderEdge | BorderEdge::TopBorderEdge)) == (BorderEdge::LeftBorderEdge | BorderEdge::TopBorderEdge);
88 }
89
90 } // namespace WebCore