• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #ifndef LayoutState_h
27 #define LayoutState_h
28 
29 #include "core/rendering/ColumnInfo.h"
30 #include "platform/geometry/LayoutRect.h"
31 #include "wtf/HashMap.h"
32 #include "wtf/Noncopyable.h"
33 
34 namespace WebCore {
35 
36 class RenderBlockFlow;
37 class RenderBox;
38 class RenderObject;
39 class RenderFlowThread;
40 class ShapeInsideInfo;
41 
42 class LayoutState {
43     WTF_MAKE_NONCOPYABLE(LayoutState);
44 public:
LayoutState()45     LayoutState()
46         : m_clipped(false)
47         , m_isPaginated(false)
48         , m_pageLogicalHeightChanged(false)
49 #if !ASSERT_DISABLED
50         , m_layoutDeltaXSaturated(false)
51         , m_layoutDeltaYSaturated(false)
52 #endif
53         , m_columnInfo(0)
54         , m_lineGrid(0)
55         , m_next(0)
56         , m_shapeInsideInfo(0)
57         , m_pageLogicalHeight(0)
58 #ifndef NDEBUG
59         , m_renderer(0)
60 #endif
61     {
62     }
63 
64     LayoutState(LayoutState*, RenderBox*, const LayoutSize& offset, LayoutUnit pageHeight, bool pageHeightChanged, ColumnInfo*);
65     LayoutState(RenderObject*);
66 
67     // LayoutState is allocated out of the rendering partition.
68     void* operator new(size_t);
69     void operator delete(void*);
70 
71     void clearPaginationInformation();
isPaginatingColumns()72     bool isPaginatingColumns() const { return m_columnInfo && m_columnInfo->paginationUnit() == ColumnInfo::Column; }
isPaginated()73     bool isPaginated() const { return m_isPaginated; }
74 
75     // The page logical offset is the object's offset from the top of the page in the page progression
76     // direction (so an x-offset in vertical text and a y-offset for horizontal text).
77     LayoutUnit pageLogicalOffset(RenderBox*, LayoutUnit childLogicalOffset) const;
78 
79     void addForcedColumnBreak(RenderBox*, LayoutUnit childLogicalOffset);
80 
pageLogicalHeight()81     LayoutUnit pageLogicalHeight() const { return m_pageLogicalHeight; }
pageLogicalHeightChanged()82     bool pageLogicalHeightChanged() const { return m_pageLogicalHeightChanged; }
83 
lineGrid()84     RenderBlockFlow* lineGrid() const { return m_lineGrid; }
lineGridOffset()85     LayoutSize lineGridOffset() const { return m_lineGridOffset; }
lineGridPaginationOrigin()86     LayoutSize lineGridPaginationOrigin() const { return m_lineGridPaginationOrigin; }
87 
layoutOffset()88     LayoutSize layoutOffset() const { return m_layoutOffset; }
89 
needsBlockDirectionLocationSetBeforeLayout()90     bool needsBlockDirectionLocationSetBeforeLayout() const { return m_lineGrid || (m_isPaginated && m_pageLogicalHeight); }
91 
shapeInsideInfo()92     ShapeInsideInfo* shapeInsideInfo() const { return m_shapeInsideInfo; }
93 
94 #ifndef NDEBUG
renderer()95     RenderObject* renderer() const { return m_renderer; }
96 #endif
97 private:
98     void propagateLineGridInfo(RenderBox*);
99     void establishLineGrid(RenderBlockFlow*);
100 
101     void computeLineGridPaginationOrigin(RenderBox*);
102 
103 public:
104     // Do not add anything apart from bitfields until after m_columnInfo. See https://bugs.webkit.org/show_bug.cgi?id=100173
105     bool m_clipped:1;
106     bool m_isPaginated:1;
107     // If our page height has changed, this will force all blocks to relayout.
108     bool m_pageLogicalHeightChanged:1;
109 #if !ASSERT_DISABLED
110     bool m_layoutDeltaXSaturated:1;
111     bool m_layoutDeltaYSaturated:1;
112 #endif
113     // If the enclosing pagination model is a column model, then this will store column information for easy retrieval/manipulation.
114     ColumnInfo* m_columnInfo;
115     // The current line grid that we're snapping to and the offset of the start of the grid.
116     RenderBlockFlow* m_lineGrid;
117     LayoutState* m_next;
118     ShapeInsideInfo* m_shapeInsideInfo;
119 
120     // FIXME: Distinguish between the layout clip rect and the paint clip rect which may be larger,
121     // e.g., because of composited scrolling.
122     LayoutRect m_clipRect;
123 
124     // x/y offset from container. Includes relative positioning and scroll offsets.
125     LayoutSize m_paintOffset;
126     // x/y offset from container. Does not include relative positioning or scroll offsets.
127     LayoutSize m_layoutOffset;
128     // Transient offset from the final position of the object
129     // used to ensure that repaints happen in the correct place.
130     // This is a total delta accumulated from the root.
131     LayoutSize m_layoutDelta;
132 
133     // The current page height for the pagination model that encloses us.
134     LayoutUnit m_pageLogicalHeight;
135     // The offset of the start of the first page in the nearest enclosing pagination model.
136     LayoutSize m_pageOffset;
137     LayoutSize m_lineGridOffset;
138     LayoutSize m_lineGridPaginationOrigin;
139 
140 #ifndef NDEBUG
141     RenderObject* m_renderer;
142 #endif
143 };
144 
145 } // namespace WebCore
146 
147 #endif // LayoutState_h
148