77d7130c30abcf7d35378a1f5b1795d2ebe72dd7
[WebKit-https.git] / Source / WebCore / layout / floats / FloatingState.h
1 /*
2  * Copyright (C) 2018 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if ENABLE(LAYOUT_FORMATTING_CONTEXT)
29
30 #include "DisplayBox.h"
31 #include <wtf/IsoMalloc.h>
32 #include <wtf/Ref.h>
33 #include <wtf/WeakPtr.h>
34
35 namespace WebCore {
36
37 namespace Layout {
38
39 class Box;
40 class Container;
41 class FormattingState;
42 class LayoutContext;
43
44 // FloatingState holds the floating boxes per formatting context.
45 class FloatingState : public RefCounted<FloatingState> {
46     WTF_MAKE_ISO_ALLOCATED(FloatingState);
47 public:
48     static Ref<FloatingState> create(LayoutContext& layoutContext, const Box& formattingContextRoot) { return adoptRef(*new FloatingState(layoutContext, formattingContextRoot)); }
49
50     void append(const Box& layoutBox);
51     void remove(const Box& layoutBox);
52
53     bool isEmpty() const { return m_floats.isEmpty(); }
54
55     const Box& root() const { return *m_formattingContextRoot; }
56
57     std::optional<LayoutUnit> leftBottom(const Box& formattingContextRoot) const;
58     std::optional<LayoutUnit> rightBottom(const Box& formattingContextRoot) const;
59     std::optional<LayoutUnit> bottom(const Box& formattingContextRoot) const;
60
61     class FloatItem {
62     public:
63         FloatItem(const Box&, const FloatingState&);
64
65         const Box& layoutBox() const { return *m_layoutBox; }
66         const Container& containingBlock() const { return *m_containingBlock; }
67
68         const Display::Box& displayBox() const { return m_absoluteDisplayBox; }
69         const Display::Box& containingBlockDisplayBox() const { return m_containingBlockAbsoluteDisplayBox; }
70
71     private:
72         WeakPtr<Box> m_layoutBox;
73         WeakPtr<Container> m_containingBlock;
74
75         Display::Box m_absoluteDisplayBox;
76         Display::Box m_containingBlockAbsoluteDisplayBox;
77     };
78     using FloatList = Vector<FloatItem>;
79     const FloatList& floats() const { return m_floats; }
80     const FloatItem* last() const { return isEmpty() ? nullptr : &m_floats.last(); }
81
82 private:
83     friend class FloatingContext;
84     FloatingState(LayoutContext&, const Box& formattingContextRoot);
85
86     LayoutContext& layoutContext() const { return m_layoutContext; }
87
88     std::optional<LayoutUnit> bottom(const Box& formattingContextRoot, Clear) const;
89
90     LayoutContext& m_layoutContext;
91     WeakPtr<Box> m_formattingContextRoot;
92     FloatList m_floats;
93 };
94
95 inline std::optional<LayoutUnit> FloatingState::leftBottom(const Box& formattingContextRoot) const
96
97     return bottom(formattingContextRoot, Clear::Left);
98 }
99
100 inline std::optional<LayoutUnit> FloatingState::rightBottom(const Box& formattingContextRoot) const
101 {
102     return bottom(formattingContextRoot, Clear::Right);
103 }
104
105 inline std::optional<LayoutUnit> FloatingState::bottom(const Box& formattingContextRoot) const
106 {
107     return bottom(formattingContextRoot, Clear::Both);
108 }
109
110 }
111 }
112 #endif