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: 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 RenderBlockFlow* 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 94 #ifndef NDEBUG 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