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/platform/graphics/LayoutRect.h" 30 #include "core/rendering/ColumnInfo.h" 31 #include "wtf/HashMap.h" 32 #include "wtf/Noncopyable.h" 33 34 namespace WebCore { 35 36 class RenderBlock; 37 class RenderBox; 38 class RenderObject; 39 class RenderFlowThread; 40 class ShapeInsideInfo; 41 42 class LayoutState { 43 WTF_MAKE_NONCOPYABLE(LayoutState); 44 public: 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(); 72 bool isPaginatingColumns() const { return m_columnInfo && m_columnInfo->paginationUnit() == ColumnInfo::Column; } 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 81 LayoutUnit pageLogicalHeight() const { return m_pageLogicalHeight; } 82 bool pageLogicalHeightChanged() const { return m_pageLogicalHeightChanged; } 83 84 RenderBlock* lineGrid() const { return m_lineGrid; } 85 LayoutSize lineGridOffset() const { return m_lineGridOffset; } 86 LayoutSize lineGridPaginationOrigin() const { return m_lineGridPaginationOrigin; } 87 88 LayoutSize layoutOffset() const { return m_layoutOffset; } 89 90 bool needsBlockDirectionLocationSetBeforeLayout() const { return m_lineGrid || (m_isPaginated && m_pageLogicalHeight); } 91 92 ShapeInsideInfo* shapeInsideInfo() const { return m_shapeInsideInfo; } 93 private: 94 void propagateLineGridInfo(RenderBox*); 95 void establishLineGrid(RenderBlock*); 96 97 void computeLineGridPaginationOrigin(RenderBox*); 98 99 public: 100 // Do not add anything apart from bitfields until after m_columnInfo. See https://bugs.webkit.org/show_bug.cgi?id=100173 101 bool m_clipped:1; 102 bool m_isPaginated:1; 103 // If our page height has changed, this will force all blocks to relayout. 104 bool m_pageLogicalHeightChanged:1; 105 #if !ASSERT_DISABLED 106 bool m_layoutDeltaXSaturated:1; 107 bool m_layoutDeltaYSaturated:1; 108 #endif 109 // If the enclosing pagination model is a column model, then this will store column information for easy retrieval/manipulation. 110 ColumnInfo* m_columnInfo; 111 // The current line grid that we're snapping to and the offset of the start of the grid. 112 RenderBlock* m_lineGrid; 113 LayoutState* m_next; 114 ShapeInsideInfo* m_shapeInsideInfo; 115 116 // FIXME: Distinguish between the layout clip rect and the paint clip rect which may be larger, 117 // e.g., because of composited scrolling. 118 LayoutRect m_clipRect; 119 120 // x/y offset from container. Includes relative positioning and scroll offsets. 121 LayoutSize m_paintOffset; 122 // x/y offset from container. Does not include relative positioning or scroll offsets. 123 LayoutSize m_layoutOffset; 124 // Transient offset from the final position of the object 125 // used to ensure that repaints happen in the correct place. 126 // This is a total delta accumulated from the root. 127 LayoutSize m_layoutDelta; 128 129 // The current page height for the pagination model that encloses us. 130 LayoutUnit m_pageLogicalHeight; 131 // The offset of the start of the first page in the nearest enclosing pagination model. 132 LayoutSize m_pageOffset; 133 LayoutSize m_lineGridOffset; 134 LayoutSize m_lineGridPaginationOrigin; 135 136 #ifndef NDEBUG 137 RenderObject* m_renderer; 138 #endif 139 }; 140 141 } // namespace WebCore 142 143 #endif // LayoutState_h 144