[iOS] Add WebKitSystemInterface for iOS 8.2
[WebKit-https.git] / Source / WebCore / rendering / SimpleLineLayoutFunctions.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 SimpleLineLayoutFunctions_h
27 #define SimpleLineLayoutFunctions_h
28
29 #include "LayoutRect.h"
30 #include "RenderBlockFlow.h"
31 #include "RenderText.h"
32 #include <wtf/text/WTFString.h>
33
34 namespace WebCore {
35
36 class HitTestLocation;
37 class HitTestRequest;
38 class HitTestResult;
39 class RenderBlockFlow;
40 class RenderText;
41 struct PaintInfo;
42
43 namespace SimpleLineLayout {
44
45 LayoutUnit computeFlowHeight(const RenderBlockFlow&, const Layout&);
46 LayoutUnit computeFlowFirstLineBaseline(const RenderBlockFlow&, const Layout&);
47 LayoutUnit computeFlowLastLineBaseline(const RenderBlockFlow&, const Layout&);
48
49 void paintFlow(const RenderBlockFlow&, const Layout&, PaintInfo&, const LayoutPoint& paintOffset);
50 bool hitTestFlow(const RenderBlockFlow&, const Layout&, const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction);
51 void collectFlowOverflow(RenderBlockFlow&, const Layout&);
52
53 bool isTextRendered(const RenderText&, const Layout&);
54 bool containsTextCaretOffset(const RenderText&, const Layout&, unsigned);
55 unsigned findTextCaretMinimumOffset(const RenderText&, const Layout&);
56 unsigned findTextCaretMaximumOffset(const RenderText&, const Layout&);
57 IntRect computeTextBoundingBox(const RenderText&, const Layout&);
58 IntPoint computeTextFirstRunLocation(const RenderText&, const Layout&);
59
60 Vector<IntRect> collectTextAbsoluteRects(const RenderText&, const Layout&, const LayoutPoint& accumulatedOffset);
61 Vector<FloatQuad> collectTextAbsoluteQuads(const RenderText&, const Layout&, bool* wasFixed);
62
63 LayoutUnit lineHeightFromFlow(const RenderBlockFlow&);
64 LayoutUnit baselineFromFlow(const RenderBlockFlow&);
65
66 #if ENABLE(TREE_DEBUGGING)
67 void showLineLayoutForFlow(const RenderBlockFlow&, const Layout&, int depth);
68 #endif
69
70 }
71
72 namespace SimpleLineLayout {
73
74 inline LayoutUnit computeFlowHeight(const RenderBlockFlow& flow, const Layout& layout)
75 {
76     return lineHeightFromFlow(flow) * layout.lineCount();
77 }
78
79 inline LayoutUnit computeFlowFirstLineBaseline(const RenderBlockFlow& flow, const Layout& layout)
80 {
81     ASSERT_UNUSED(layout, layout.lineCount());
82     return flow.borderAndPaddingBefore() + baselineFromFlow(flow);
83 }
84
85 inline LayoutUnit computeFlowLastLineBaseline(const RenderBlockFlow& flow, const Layout& layout)
86 {
87     ASSERT(layout.lineCount());
88     return flow.borderAndPaddingBefore() + lineHeightFromFlow(flow) * (layout.lineCount() - 1) + baselineFromFlow(flow);
89 }
90
91 inline unsigned findTextCaretMinimumOffset(const RenderText&, const Layout& layout)
92 {
93     if (!layout.runCount())
94         return 0;
95     return layout.runAt(0).start;
96 }
97
98 inline unsigned findTextCaretMaximumOffset(const RenderText& renderer, const Layout& layout)
99 {
100     if (!layout.runCount())
101         return renderer.textLength();
102     auto& last = layout.runAt(layout.runCount() - 1);
103     return last.end;
104 }
105
106 inline bool containsTextCaretOffset(const RenderText&, const Layout& layout, unsigned offset)
107 {
108     for (unsigned i = 0; i < layout.runCount(); ++i) {
109         auto& run = layout.runAt(i);
110         if (offset < run.start)
111             return false;
112         if (offset <= run.end)
113             return true;
114     }
115     return false;
116 }
117
118 inline bool isTextRendered(const RenderText&, const Layout& layout)
119 {
120     for (unsigned i = 0; i < layout.runCount(); ++i) {
121         auto& run = layout.runAt(i);
122         if (run.end > run.start)
123             return true;
124     }
125     return false;
126 }
127
128 inline LayoutUnit lineHeightFromFlow(const RenderBlockFlow& flow)
129 {
130     return flow.lineHeight(false, HorizontalLine, PositionOfInteriorLineBoxes);
131 }
132
133 inline LayoutUnit baselineFromFlow(const RenderBlockFlow& flow)
134 {
135     return flow.baselinePosition(AlphabeticBaseline, false, HorizontalLine, PositionOfInteriorLineBoxes);
136 }
137
138 }
139 }
140
141 #endif