[LFC][IFC] Add (right, center)text-align support.
[WebKit-https.git] / Source / WebCore / layout / inlineformatting / InlineRun.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 "InlineRunProvider.h"
31 #include "LayoutUnit.h"
32
33 namespace WebCore {
34 namespace Layout {
35
36 struct InlineRun {
37     static InlineRun createRun(LayoutUnit logcialLeft, LayoutUnit width, const InlineItem&);
38     static InlineRun createTextRun(LayoutUnit logcialLeft, LayoutUnit width, ItemPosition, unsigned length, const InlineItem&);
39
40     LayoutUnit logicalLeft() const { return m_logicalLeft; }
41     LayoutUnit logicalRight() const { return logicalLeft() + width(); }
42     LayoutUnit width() const { return m_width; }
43
44     void setWidth(LayoutUnit width) { m_width = width; }
45     void setLogicalLeft(LayoutUnit logicalLeft) { m_logicalLeft = logicalLeft; }
46     void setLogicalRight(LayoutUnit logicalRight) { m_width -= (this->logicalRight() - logicalRight); }
47
48     struct TextContext {
49     public:
50         TextContext(ItemPosition, unsigned length);
51
52         ItemPosition start() const { return m_start; }
53         unsigned length() const { return m_length; }
54
55         void setLength(unsigned length) { m_length = length; }
56
57     private:
58         ItemPosition m_start;
59         unsigned m_length;
60     };
61     std::optional<TextContext>& textContext() { return m_textContext; }
62     const InlineItem& inlineItem() const { return m_inlineItem; }
63
64 private:
65     InlineRun(LayoutUnit logcialLeft, LayoutUnit width, const InlineItem&);
66     InlineRun(LayoutUnit logcialLeft, LayoutUnit width, ItemPosition, unsigned length, const InlineItem&);
67
68     LayoutUnit m_logicalLeft;
69     LayoutUnit m_width;
70
71     const InlineItem& m_inlineItem;
72     std::optional<TextContext> m_textContext;
73 };
74
75 using InlineRuns = Vector<InlineRun>;
76
77 inline InlineRun InlineRun::createRun(LayoutUnit logicalLeft, LayoutUnit width, const InlineItem& inlineItem)
78 {
79     return { logicalLeft, width, inlineItem };
80 }
81
82 inline InlineRun InlineRun::createTextRun(LayoutUnit logicalLeft, LayoutUnit width, ItemPosition start, unsigned length, const InlineItem& inlineItem)
83 {
84     return { logicalLeft, width, start, length, inlineItem };
85 }
86
87 inline InlineRun::InlineRun(LayoutUnit logicalLeft, LayoutUnit width, const InlineItem& inlineItem)
88     : m_logicalLeft(logicalLeft)
89     , m_width(width)
90     , m_inlineItem(inlineItem)
91 {
92 }
93
94 inline InlineRun::InlineRun(LayoutUnit logicalLeft, LayoutUnit width, ItemPosition start, unsigned length, const InlineItem& inlineItem)
95     : m_logicalLeft(logicalLeft)
96     , m_width(width)
97     , m_inlineItem(inlineItem)
98     , m_textContext(TextContext { start, length })
99 {
100 }
101
102 inline InlineRun::TextContext::TextContext(ItemPosition start, unsigned length)
103     : m_start(start)
104     , m_length(length)
105 {
106 }
107
108 }
109 }
110 #endif