Assertion failure in WebCore::BidiRun::BidiRun()
[WebKit-https.git] / Source / WebCore / rendering / line / LineLayoutState.h
1 /*
2  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All right reserved.
4  * Copyright (C) 2010 Google Inc. All rights reserved.
5  * Copyright (C) 2013 ChangSeok Oh <shivamidow@gmail.com>
6  * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above
13  *    copyright notice, this list of conditions and the following
14  *    disclaimer.
15  * 2. Redistributions in binary form must reproduce the above
16  *    copyright notice, this list of conditions and the following
17  *    disclaimer in the documentation and/or other materials
18  *    provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
25  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
31  * OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33
34 #ifndef LineLayoutState_h
35 #define LineLayoutState_h
36
37 #include "LayoutRect.h"
38 #include "RenderBox.h"
39
40 namespace WebCore {
41
42 struct FloatWithRect {
43     FloatWithRect(RenderBox& f)
44         : object(f)
45         , rect(LayoutRect(f.x() - f.marginLeft(), f.y() - f.marginTop(), f.width() + f.horizontalMarginExtent(), f.height() + f.verticalMarginExtent()))
46         , everHadLayout(f.everHadLayout())
47     {
48     }
49
50     RenderBox& object;
51     LayoutRect rect;
52     bool everHadLayout;
53 };
54
55 // Like LayoutState for layout(), LineLayoutState keeps track of global information
56 // during an entire linebox tree layout pass (aka layoutInlineChildren).
57 class LineLayoutState {
58 public:
59     LineLayoutState(bool fullLayout, LayoutUnit& repaintLogicalTop, LayoutUnit& repaintLogicalBottom, RenderFlowThread* flowThread)
60         : m_endLineLogicalTop(0)
61         , m_endLine(0)
62         , m_lastFloat(0)
63         , m_floatIndex(0)
64         , m_adjustedLogicalLineTop(0)
65         , m_flowThread(flowThread)
66         , m_repaintLogicalTop(repaintLogicalTop)
67         , m_repaintLogicalBottom(repaintLogicalBottom)
68         , m_endLineMatched(false)
69         , m_checkForFloatsFromLastLine(false)
70         , m_isFullLayout(fullLayout)
71         , m_usesRepaintBounds(false)
72     {
73     }
74
75     LineInfo& lineInfo() { return m_lineInfo; }
76     const LineInfo& lineInfo() const { return m_lineInfo; }
77
78     LayoutUnit endLineLogicalTop() const { return m_endLineLogicalTop; }
79     void setEndLineLogicalTop(LayoutUnit logicalTop) { m_endLineLogicalTop = logicalTop; }
80
81     RootInlineBox* endLine() const { return m_endLine; }
82     void setEndLine(RootInlineBox* line) { m_endLine = line; }
83
84     FloatingObject* lastFloat() const { return m_lastFloat; }
85     void setLastFloat(FloatingObject* lastFloat) { m_lastFloat = lastFloat; }
86
87     Vector<FloatWithRect>& floats() { return m_floats; }
88
89     unsigned floatIndex() const { return m_floatIndex; }
90     void setFloatIndex(unsigned floatIndex) { m_floatIndex = floatIndex; }
91
92     LayoutUnit adjustedLogicalLineTop() const { return m_adjustedLogicalLineTop; }
93     void setAdjustedLogicalLineTop(LayoutUnit value) { m_adjustedLogicalLineTop = value; }
94
95     RenderFlowThread* flowThread() const { return m_flowThread; }
96     void setFlowThread(RenderFlowThread* thread) { m_flowThread = thread; }
97
98     bool endLineMatched() const { return m_endLineMatched; }
99     void setEndLineMatched(bool endLineMatched) { m_endLineMatched = endLineMatched; }
100
101     bool checkForFloatsFromLastLine() const { return m_checkForFloatsFromLastLine; }
102     void setCheckForFloatsFromLastLine(bool check) { m_checkForFloatsFromLastLine = check; }
103
104     void markForFullLayout() { m_isFullLayout = true; }
105     bool isFullLayout() const { return m_isFullLayout; }
106
107     bool usesRepaintBounds() const { return m_usesRepaintBounds; }
108
109     void setRepaintRange(LayoutUnit logicalHeight)
110     {
111         m_usesRepaintBounds = true;
112         m_repaintLogicalTop = m_repaintLogicalBottom = logicalHeight;
113     }
114
115     void updateRepaintRangeFromBox(RootInlineBox* box, LayoutUnit paginationDelta = 0)
116     {
117         m_usesRepaintBounds = true;
118         m_repaintLogicalTop = std::min(m_repaintLogicalTop, box->logicalTopVisualOverflow() + std::min<LayoutUnit>(paginationDelta, 0));
119         m_repaintLogicalBottom = std::max(m_repaintLogicalBottom, box->logicalBottomVisualOverflow() + std::max<LayoutUnit>(paginationDelta, 0));
120     }
121
122 private:
123     LineInfo m_lineInfo;
124     LayoutUnit m_endLineLogicalTop;
125     RootInlineBox* m_endLine;
126
127     FloatingObject* m_lastFloat;
128     Vector<FloatWithRect> m_floats;
129     unsigned m_floatIndex;
130
131     LayoutUnit m_adjustedLogicalLineTop;
132
133     RenderFlowThread* m_flowThread;
134
135     // FIXME: Should this be a range object instead of two ints?
136     LayoutUnit& m_repaintLogicalTop;
137     LayoutUnit& m_repaintLogicalBottom;
138
139     bool m_endLineMatched : 1;
140     bool m_checkForFloatsFromLastLine : 1;
141     bool m_isFullLayout : 1;
142     bool m_usesRepaintBounds : 1;
143 };
144
145 }
146
147 #endif // LineLayoutState_h