0683f1c2ce44fb14a6b2fdfd36a23ddd30edaf0f
[WebKit-https.git] / Source / WebCore / layout / inlineformatting / InlineFormattingContext.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 "FormattingContext.h"
31 #include "InlineLineBreaker.h"
32 #include <wtf/IsoMalloc.h>
33
34 namespace WebCore {
35 namespace Layout {
36
37 class InlineFormattingState;
38 class InlineRunProvider;
39
40 // This class implements the layout logic for inline formatting contexts.
41 // https://www.w3.org/TR/CSS22/visuren.html#inline-formatting
42 class InlineFormattingContext : public FormattingContext {
43     WTF_MAKE_ISO_ALLOCATED(InlineFormattingContext);
44 public:
45     InlineFormattingContext(const Box& formattingContextRoot);
46
47     void layout(LayoutContext&, FormattingState&) const override;
48
49 private:
50     class Line {
51     public:
52         Line(InlineFormattingState&, const Box& formattingRoot);
53
54         void init(LayoutUnit lineLogicalLeft, LayoutUnit availableWidth);
55         void appendContent(const InlineLineBreaker::Run&);
56         enum class LastLine { No, Yes };
57         void close(LastLine = LastLine::No);
58
59         bool hasContent() const { return m_firstRunIndex.has_value(); }
60         LayoutUnit contentLogicalRight();
61         LayoutUnit availableWidth() const { return m_availableWidth; }
62
63     private:
64         void justifyRuns();
65         void computeExpansionOpportunities(const InlineLineBreaker::Run&);
66
67         struct TrailingTrimmableContent {
68             LayoutUnit width;
69             unsigned length;
70         };
71         std::optional<TrailingTrimmableContent> m_trailingTrimmableContent;
72         bool m_lastRunIsWhitespace { false };
73         bool m_lastRunCanExpand { false };
74
75         InlineFormattingState& m_formattingState;
76         const Box& m_formattingRoot;
77
78         LayoutUnit m_lineLogicalLeft;
79         LayoutUnit m_availableWidth;
80         LayoutUnit m_lineWidth;
81
82         std::optional<unsigned> m_firstRunIndex;
83         bool m_alignmentIsJustify { false };
84     };
85
86     void layoutInlineContent(const LayoutContext&, InlineFormattingState&, const InlineRunProvider&) const;
87
88     void computeWidthAndHeight(const LayoutContext&, const Box&) const;
89     void computeStaticPosition(const LayoutContext&, const Box&) const override;
90     void computeInFlowPositionedPosition(const LayoutContext&, const Box&) const override;
91
92     InstrinsicWidthConstraints instrinsicWidthConstraints(LayoutContext&, const Box&) const override;
93 };
94
95 }
96 }
97 #endif