1f61965ecc57c8e207752621c9c6346b76d48265
[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
58     // These offsets are relative to the text renderer (not flow).
59     unsigned localStartOffset() const;
60     unsigned localEndOffset() const;
61     unsigned length() const;
62
63     bool isLastOnLine() const;
64     bool isLast() const;
65
66 protected:
67     TextBox() = default;
68     TextBox(const TextBox&) = default;
69     TextBox(TextBox&&) = default;
70     TextBox& operator=(const TextBox&) = default;
71     TextBox& operator=(TextBox&&) = default;
72
73 private:
74     const TextBoxIterator& iterator() const;
75 };
76
77 class TextBoxIterator : private TextBox {
78 public:
79     TextBoxIterator() : m_pathVariant(ComplexPath { nullptr, { } }) { };
80     explicit TextBoxIterator(const InlineTextBox*);
81     TextBoxIterator(Vector<const InlineTextBox*>&& sorted, size_t index);
82     
83     TextBoxIterator(SimpleLineLayout::RunResolver::Iterator, SimpleLineLayout::RunResolver::Iterator end);
84
85     TextBoxIterator& operator++() { return traverseNextInVisualOrder(); }
86     TextBoxIterator& traverseNextInVisualOrder();
87     TextBoxIterator& traverseNextInTextOrder();
88
89     explicit operator bool() const { return !atEnd(); }
90
91     bool operator==(const TextBoxIterator&) const;
92     bool operator!=(const TextBoxIterator& other) const { return !(*this == other); }
93
94     bool operator==(EndIterator) const { return atEnd(); }
95     bool operator!=(EndIterator) const { return !atEnd(); }
96
97     const TextBox& operator*() const { return *this; }
98     const TextBox* operator->() const { return this; }
99
100     bool atEnd() const;
101
102 private:
103     friend class TextBox;
104
105     struct SimplePath {
106         SimpleLineLayout::RunResolver::Iterator iterator;
107         SimpleLineLayout::RunResolver::Iterator end;
108     };
109     struct ComplexPath {
110         const InlineTextBox* inlineTextBox;
111         Vector<const InlineTextBox*> sortedInlineTextBoxes;
112         size_t sortedInlineTextBoxIndex { 0 };
113
114         const InlineTextBox* nextInlineTextBoxInTextOrder() const;
115     };
116     Variant<SimplePath, ComplexPath> m_pathVariant;
117 };
118
119 class TextBoxRange {
120 public:
121     TextBoxRange(TextBoxIterator begin)
122         : m_begin(begin)
123     {
124     }
125
126     TextBoxIterator begin() const { return m_begin; }
127     EndIterator end() const { return { }; }
128
129 private:
130     TextBoxIterator m_begin;
131 };
132
133 TextBoxIterator firstTextBoxInVisualOrderFor(const RenderText&);
134 TextBoxIterator firstTextBoxInTextOrderFor(const RenderText&);
135 TextBoxRange textBoxRangeFor(const RenderText&);
136 inline bool hasTextBoxes(const RenderText& text) { return !firstTextBoxInVisualOrderFor(text).atEnd(); }
137
138 }
139 }