Simple line layout should not be limited to RenderText.
[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 struct PaintInfo;
41
42 namespace SimpleLineLayout {
43
44 LayoutUnit computeFlowHeight(const RenderBlockFlow&, const Layout&);
45 LayoutUnit computeFlowFirstLineBaseline(const RenderBlockFlow&, const Layout&);
46 LayoutUnit computeFlowLastLineBaseline(const RenderBlockFlow&, const Layout&);
47
48 void paintFlow(const RenderBlockFlow&, const Layout&, PaintInfo&, const LayoutPoint& paintOffset);
49 bool hitTestFlow(const RenderBlockFlow&, const Layout&, const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction);
50 void collectFlowOverflow(RenderBlockFlow&, const Layout&);
51
52 bool isTextRendered(const RenderText&, const Layout&);
53 bool containsCaretOffset(const RenderObject&, const Layout&, unsigned);
54 unsigned findCaretMinimumOffset(const RenderObject&, const Layout&);
55 unsigned findCaretMaximumOffset(const RenderObject&, const Layout&);
56 IntRect computeBoundingBox(const RenderObject&, const Layout&);
57 IntPoint computeFirstRunLocation(const RenderObject&, const Layout&);
58
59 Vector<IntRect> collectAbsoluteRects(const RenderObject&, const Layout&, const LayoutPoint& accumulatedOffset);
60 Vector<FloatQuad> collectAbsoluteQuads(const RenderObject&, const Layout&, bool* wasFixed);
61
62 LayoutUnit lineHeightFromFlow(const RenderBlockFlow&);
63 LayoutUnit baselineFromFlow(const RenderBlockFlow&);
64
65 #if ENABLE(TREE_DEBUGGING)
66 void showLineLayoutForFlow(const RenderBlockFlow&, const Layout&, int depth);
67 #endif
68
69 }
70
71 namespace SimpleLineLayout {
72
73 inline LayoutUnit computeFlowHeight(const RenderBlockFlow& flow, const Layout& layout)
74 {
75     return lineHeightFromFlow(flow) * layout.lineCount();
76 }
77
78 inline LayoutUnit computeFlowFirstLineBaseline(const RenderBlockFlow& flow, const Layout& layout)
79 {
80     ASSERT_UNUSED(layout, layout.lineCount());
81     return flow.borderAndPaddingBefore() + baselineFromFlow(flow);
82 }
83
84 inline LayoutUnit computeFlowLastLineBaseline(const RenderBlockFlow& flow, const Layout& layout)
85 {
86     ASSERT(layout.lineCount());
87     return flow.borderAndPaddingBefore() + lineHeightFromFlow(flow) * (layout.lineCount() - 1) + baselineFromFlow(flow);
88 }
89
90 inline unsigned findCaretMinimumOffset(const RenderText&, const Layout& layout)
91 {
92     if (!layout.runCount())
93         return 0;
94     return layout.runAt(0).start;
95 }
96
97 inline unsigned findCaretMaximumOffset(const RenderText& renderer, const Layout& layout)
98 {
99     if (!layout.runCount())
100         return renderer.textLength();
101     auto& last = layout.runAt(layout.runCount() - 1);
102     return last.end;
103 }
104
105 inline bool containsCaretOffset(const RenderText&, const Layout& layout, unsigned offset)
106 {
107     for (unsigned i = 0; i < layout.runCount(); ++i) {
108         auto& run = layout.runAt(i);
109         if (offset < run.start)
110             return false;
111         if (offset <= run.end)
112             return true;
113     }
114     return false;
115 }
116
117 inline bool isTextRendered(const RenderText&, const Layout& layout)
118 {
119     for (unsigned i = 0; i < layout.runCount(); ++i) {
120         auto& run = layout.runAt(i);
121         if (run.end > run.start)
122             return true;
123     }
124     return false;
125 }
126
127 inline LayoutUnit lineHeightFromFlow(const RenderBlockFlow& flow)
128 {
129     return flow.lineHeight(false, HorizontalLine, PositionOfInteriorLineBoxes);
130 }
131
132 inline LayoutUnit baselineFromFlow(const RenderBlockFlow& flow)
133 {
134     return flow.baselinePosition(AlphabeticBaseline, false, HorizontalLine, PositionOfInteriorLineBoxes);
135 }
136
137 }
138 }
139
140 #endif