Use LineLayoutTraversal for RenderText functions
[WebKit-https.git] / Source / WebCore / rendering / line / LineLayoutTraversal.h
1 /*
2  * Copyright (C) 2019 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 #include "FloatRect.h"
29 #include "SimpleLineLayoutResolver.h"
30 #include <wtf/HashMap.h>
31 #include <wtf/IteratorRange.h>
32 #include <wtf/Variant.h>
33 #include <wtf/text/StringView.h>
34
35 namespace WebCore {
36
37 class InlineTextBox;
38 class RenderText;
39
40 namespace LineLayoutTraversal {
41
42 class TextBoxContext;
43 class TextBoxIterator;
44
45 struct EndIterator { };
46
47 class TextBox {
48 public:
49     FloatRect rect() const;
50     FloatRect logicalRect() const;
51
52     bool hasHyphen() const;
53     bool isLeftToRightDirection() const;
54     bool dirOverride() const;
55
56     StringView text() const;
57     bool isLineBreak() const;
58
59     // These offsets are relative to the text renderer (not flow).
60     unsigned localStartOffset() const;
61     unsigned localEndOffset() const;
62     unsigned length() const;
63
64     bool isLastOnLine() const;
65     bool isLast() const;
66
67 protected:
68     TextBox() = default;
69     TextBox(const TextBox&) = default;
70     TextBox(TextBox&&) = default;
71     ~TextBox() = default;
72     TextBox& operator=(const TextBox&) = default;
73     TextBox& operator=(TextBox&&) = default;
74
75 private:
76     const TextBoxIterator& iterator() const;
77 };
78
79 class TextBoxIterator : private TextBox {
80 public:
81     TextBoxIterator() : m_pathVariant(ComplexPath { nullptr, { } }) { };
82     explicit TextBoxIterator(const InlineTextBox*);
83     TextBoxIterator(Vector<const InlineTextBox*>&& sorted, size_t index);
84     
85     TextBoxIterator(SimpleLineLayout::RunResolver::Iterator, SimpleLineLayout::RunResolver::Iterator end);
86
87     TextBoxIterator& operator++() { return traverseNextInVisualOrder(); }
88     TextBoxIterator& traverseNextInVisualOrder();
89     TextBoxIterator& traverseNextInTextOrder();
90
91     explicit operator bool() const { return !atEnd(); }
92
93     bool operator==(const TextBoxIterator&) const;
94     bool operator!=(const TextBoxIterator& other) const { return !(*this == other); }
95
96     bool operator==(EndIterator) const { return atEnd(); }
97     bool operator!=(EndIterator) const { return !atEnd(); }
98
99     const TextBox& operator*() const { return *this; }
100     const TextBox* operator->() const { return this; }
101
102     bool atEnd() const;
103
104 private:
105     friend class TextBox;
106
107     struct SimplePath {
108         SimpleLineLayout::RunResolver::Iterator iterator;
109         SimpleLineLayout::RunResolver::Iterator end;
110     };
111     struct ComplexPath {
112         const InlineTextBox* inlineTextBox;
113         Vector<const InlineTextBox*> sortedInlineTextBoxes;
114         size_t sortedInlineTextBoxIndex { 0 };
115
116         const InlineTextBox* nextInlineTextBoxInTextOrder() const;
117     };
118     Variant<SimplePath, ComplexPath> m_pathVariant;
119 };
120
121 class TextBoxRange {
122 public:
123     TextBoxRange(TextBoxIterator begin)
124         : m_begin(begin)
125     {
126     }
127
128     TextBoxIterator begin() const { return m_begin; }
129     EndIterator end() const { return { }; }
130
131 private:
132     TextBoxIterator m_begin;
133 };
134
135 TextBoxIterator firstTextBoxFor(const RenderText&);
136 TextBoxIterator firstTextBoxInTextOrderFor(const RenderText&);
137 TextBoxRange textBoxesFor(const RenderText&);
138
139 inline bool hasTextBoxes(const RenderText& text) { return !firstTextBoxFor(text).atEnd(); }
140
141 }
142 }