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/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