Home | History | Annotate | Download | only in rendering
      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