[iOS] Add WebKitSystemInterface for iOS 8.2
[WebKit-https.git] / Source / WebCore / rendering / SimpleLineLayoutResolver.h
1 /*
2  * Copyright (C) 2013 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 #ifndef SimpleLineLayoutResolver_h
27 #define SimpleLineLayoutResolver_h
28
29 #include "LayoutRect.h"
30 #include "RenderBlockFlow.h"
31 #include "RenderText.h"
32 #include "SimpleLineLayoutFlowContents.h"
33 #include "SimpleLineLayoutFunctions.h"
34 #include <wtf/Vector.h>
35 #include <wtf/text/WTFString.h>
36
37 namespace WebCore {
38 namespace SimpleLineLayout {
39
40 template <class IteratorType>
41 class Range {
42 public:
43     Range(IteratorType begin, IteratorType end) : m_begin(begin), m_end(end) { }
44
45     IteratorType begin() const { return m_begin; }
46     IteratorType end() const { return m_end; }
47
48 private:
49     IteratorType m_begin;
50     IteratorType m_end;
51 };
52
53 class RunResolver {
54 public:
55     class Iterator;
56
57     class Run {
58     public:
59         explicit Run(const Iterator&);
60
61         unsigned start() const;
62         unsigned end() const;
63
64         LayoutRect rect() const;
65         FloatPoint baseline() const;
66         StringView text() const;
67
68         unsigned lineIndex() const;
69
70     private:
71         const Iterator& m_iterator;
72     };
73
74     class Iterator {
75     public:
76         Iterator(const RunResolver&, unsigned runIndex, unsigned lineIndex);
77
78         Iterator& operator++();
79
80         bool operator==(const Iterator&) const;
81         bool operator!=(const Iterator&) const;
82
83         Run operator*() const;
84
85         Iterator& advance();
86         Iterator& advanceLines(unsigned);
87
88         const RunResolver& resolver() const { return m_resolver; }
89         const SimpleLineLayout::Run& simpleRun() const;
90         unsigned lineIndex() const { return m_lineIndex; }
91
92     private:
93         const RunResolver& m_resolver;
94         unsigned m_runIndex;
95         unsigned m_lineIndex;
96     };
97
98     RunResolver(const RenderBlockFlow&, const Layout&);
99
100     Iterator begin() const;
101     Iterator end() const;
102
103     Range<Iterator> rangeForRect(const LayoutRect&) const;
104     Range<Iterator> rangeForRenderer(const RenderText&) const;
105
106 private:
107     enum class IndexType { First, Last };
108     unsigned lineIndexForHeight(LayoutUnit, IndexType) const;
109
110     const Layout& m_layout;
111     const FlowContents m_flowContents;
112     const LayoutUnit m_lineHeight;
113     const LayoutUnit m_baseline;
114     const LayoutUnit m_borderAndPaddingBefore;
115     const float m_ascent;
116     const float m_descent;
117 };
118
119 class LineResolver {
120 public:
121     class Iterator;
122
123     class Iterator {
124     public:
125         explicit Iterator(RunResolver::Iterator);
126
127         Iterator& operator++();
128         bool operator==(const Iterator&) const;
129         bool operator!=(const Iterator&) const;
130
131         const LayoutRect operator*() const;
132
133     private:
134         RunResolver::Iterator m_runIterator;
135         LayoutRect m_rect;
136     };
137
138     LineResolver(const RenderBlockFlow&, const Layout&);
139
140     Iterator begin() const;
141     Iterator end() const;
142
143     Range<Iterator> rangeForRect(const LayoutRect&) const;
144
145 private:
146     RunResolver m_runResolver;
147 };
148
149 RunResolver runResolver(const RenderBlockFlow&, const Layout&);
150 LineResolver lineResolver(const RenderBlockFlow&, const Layout&);
151
152 inline unsigned RunResolver::Run::start() const
153 {
154     return m_iterator.simpleRun().start;
155 }
156
157 inline unsigned RunResolver::Run::end() const
158 {
159     return m_iterator.simpleRun().end;
160 }
161
162 inline unsigned RunResolver::Run::lineIndex() const
163 {
164     return m_iterator.lineIndex();
165 }
166
167 inline RunResolver::Iterator& RunResolver::Iterator::operator++()
168 {
169     return advance();
170 }
171
172 inline bool RunResolver::Iterator::operator==(const Iterator& other) const
173 {
174     ASSERT(&m_resolver == &other.m_resolver);
175     return m_runIndex == other.m_runIndex;
176 }
177
178 inline bool RunResolver::Iterator::operator!=(const Iterator& other) const
179 {
180     return !(*this == other);
181 }
182
183 inline RunResolver::Run RunResolver::Iterator::operator*() const
184 {
185     return Run(*this);
186 }
187
188 inline const SimpleLineLayout::Run& RunResolver::Iterator::simpleRun() const
189 {
190     return m_resolver.m_layout.runAt(m_runIndex);
191 }
192
193 inline RunResolver::Iterator RunResolver::begin() const
194 {
195     return Iterator(*this, 0, 0);
196 }
197
198 inline RunResolver::Iterator RunResolver::end() const
199 {
200     return Iterator(*this, m_layout.runCount(), m_layout.lineCount());
201 }
202
203 inline LineResolver::Iterator& LineResolver::Iterator::operator++()
204 {
205     m_runIterator.advanceLines(1);
206     return *this;
207 }
208
209 inline bool LineResolver::Iterator::operator==(const Iterator& other) const
210 {
211     return m_runIterator == other.m_runIterator;
212 }
213
214 inline bool LineResolver::Iterator::operator!=(const Iterator& other) const
215 {
216     return m_runIterator != other.m_runIterator;
217 }
218
219 inline LineResolver::Iterator LineResolver::begin() const
220 {
221     return Iterator(m_runResolver.begin());
222 }
223
224 inline LineResolver::Iterator LineResolver::end() const
225 {
226     return Iterator(m_runResolver.end());
227 }
228
229 inline Range<LineResolver::Iterator> LineResolver::rangeForRect(const LayoutRect& rect) const
230 {
231     auto runRange = m_runResolver.rangeForRect(rect);
232     return Range<Iterator>(Iterator(runRange.begin()), Iterator(runRange.end()));
233 }
234
235 inline RunResolver runResolver(const RenderBlockFlow& flow, const Layout& layout)
236 {
237     return RunResolver(flow, layout);
238 }
239
240 inline LineResolver lineResolver(const RenderBlockFlow& flow, const Layout& layout)
241 {
242     return LineResolver(flow, layout);
243 }
244
245 }
246 }
247
248 #endif