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 "IntRect.h" 30 #include "IntSize.h" 31 #include <wtf/Noncopyable.h> 32 33 namespace WebCore { 34 35 class ColumnInfo; 36 class RenderArena; 37 class RenderBox; 38 class RenderObject; 39 40 class LayoutState { 41 WTF_MAKE_NONCOPYABLE(LayoutState); 42 public: LayoutState()43 LayoutState() 44 : m_clipped(false) 45 , m_pageLogicalHeight(0) 46 , m_pageLogicalHeightChanged(false) 47 , m_columnInfo(0) 48 , m_next(0) 49 #ifndef NDEBUG 50 , m_renderer(0) 51 #endif 52 { 53 } 54 55 LayoutState(LayoutState*, RenderBox*, const IntSize& offset, int pageHeight, bool pageHeightChanged, ColumnInfo*); 56 LayoutState(RenderObject*); 57 58 void destroy(RenderArena*); 59 60 // Overloaded new operator. 61 void* operator new(size_t, RenderArena*) throw(); 62 63 // Overridden to prevent the normal delete from being called. 64 void operator delete(void*, size_t); 65 66 void clearPaginationInformation(); isPaginatingColumns()67 bool isPaginatingColumns() const { return m_columnInfo; } isPaginated()68 bool isPaginated() const { return m_pageLogicalHeight || m_columnInfo; } 69 70 // The page logical offset is the object's offset from the top of the page in the page progression 71 // direction (so an x-offset in vertical text and a y-offset for horizontal text). 72 int pageLogicalOffset(int childLogicalOffset) const; 73 74 void addForcedColumnBreak(int childLogicalOffset); 75 pageLogicalHeight()76 bool pageLogicalHeight() const { return m_pageLogicalHeight; } pageLogicalHeightChanged()77 bool pageLogicalHeightChanged() const { return m_pageLogicalHeightChanged; } 78 79 private: 80 // The normal operator new is disallowed. 81 void* operator new(size_t) throw(); 82 83 public: 84 bool m_clipped; 85 IntRect m_clipRect; 86 IntSize m_paintOffset; // x/y offset from container. Includes relative positioning and scroll offsets. 87 IntSize m_layoutOffset; // x/y offset from container. Does not include relative positioning or scroll offsets. 88 IntSize m_layoutDelta; // Transient offset from the final position of the object 89 // used to ensure that repaints happen in the correct place. 90 // This is a total delta accumulated from the root. 91 92 int m_pageLogicalHeight; // The current page height for the pagination model that encloses us. 93 bool m_pageLogicalHeightChanged; // If our page height has changed, this will force all blocks to relayout. 94 IntSize m_pageOffset; // The offset of the start of the first page in the nearest enclosing pagination model. 95 ColumnInfo* m_columnInfo; // If the enclosing pagination model is a column model, then this will store column information for easy retrieval/manipulation. 96 97 LayoutState* m_next; 98 #ifndef NDEBUG 99 RenderObject* m_renderer; 100 #endif 101 }; 102 103 } // namespace WebCore 104 105 #endif // LayoutState_h 106