Home | History | Annotate | Download | only in rendering
      1 /*
      2  * Copyright (C) 2011 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 COMPUTER, 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 RenderGrid_h
     27 #define RenderGrid_h
     28 
     29 #include "core/rendering/OrderIterator.h"
     30 #include "core/rendering/RenderBlock.h"
     31 
     32 namespace WebCore {
     33 
     34 class GridCoordinate;
     35 class GridSpan;
     36 class GridTrack;
     37 
     38 enum GridPositionSide {
     39     ColumnStartSide,
     40     ColumnEndSide,
     41     RowStartSide,
     42     RowEndSide
     43 };
     44 
     45 class RenderGrid FINAL : public RenderBlock {
     46 public:
     47     RenderGrid(Element*);
     48     virtual ~RenderGrid();
     49 
     50     virtual const char* renderName() const OVERRIDE;
     51 
     52     virtual void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) OVERRIDE;
     53 
     54     virtual bool avoidsFloats() const OVERRIDE { return true; }
     55     virtual bool canCollapseAnonymousBlockChild() const OVERRIDE { return false; }
     56 
     57     void dirtyGrid();
     58 
     59 private:
     60     virtual bool isRenderGrid() const OVERRIDE { return true; }
     61     virtual void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const OVERRIDE;
     62     virtual void computePreferredLogicalWidths() OVERRIDE;
     63 
     64     virtual void addChild(RenderObject* newChild, RenderObject* beforeChild = 0) OVERRIDE;
     65     virtual void removeChild(RenderObject*) OVERRIDE;
     66 
     67     virtual void styleDidChange(StyleDifference, const RenderStyle*) OVERRIDE;
     68 
     69     bool explicitGridDidResize(const RenderStyle*) const;
     70     bool namedGridLinesDefinitionDidChange(const RenderStyle*) const;
     71 
     72     LayoutUnit computePreferredTrackWidth(const GridLength&, size_t) const;
     73 
     74     class GridIterator;
     75     enum TrackSizingDirection { ForColumns, ForRows };
     76     void computedUsedBreadthOfGridTracks(TrackSizingDirection, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks);
     77     LayoutUnit computeUsedBreadthOfMinLength(TrackSizingDirection, const GridLength&) const;
     78     LayoutUnit computeUsedBreadthOfMaxLength(TrackSizingDirection, const GridLength&, LayoutUnit usedBreadth) const;
     79     LayoutUnit computeUsedBreadthOfSpecifiedLength(TrackSizingDirection, const Length&) const;
     80     void resolveContentBasedTrackSizingFunctions(TrackSizingDirection, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, LayoutUnit& availableLogicalSpace);
     81 
     82     void growGrid(TrackSizingDirection);
     83     void insertItemIntoGrid(RenderBox*, size_t rowTrack, size_t columnTrack);
     84     void insertItemIntoGrid(RenderBox*, const GridCoordinate&);
     85     void placeItemsOnGrid();
     86     void populateExplicitGridAndOrderIterator();
     87     void placeSpecifiedMajorAxisItemsOnGrid(Vector<RenderBox*>);
     88     void placeAutoMajorAxisItemsOnGrid(Vector<RenderBox*>);
     89     void placeAutoMajorAxisItemOnGrid(RenderBox*);
     90     TrackSizingDirection autoPlacementMajorAxisDirection() const;
     91     TrackSizingDirection autoPlacementMinorAxisDirection() const;
     92 
     93     void layoutGridItems();
     94 
     95     typedef LayoutUnit (RenderGrid::* SizingFunction)(RenderBox*, TrackSizingDirection, Vector<GridTrack>&);
     96     typedef LayoutUnit (GridTrack::* AccumulatorGetter)() const;
     97     typedef void (GridTrack::* AccumulatorGrowFunction)(LayoutUnit);
     98     typedef bool (GridTrackSize::* FilterFunction)() const;
     99     void resolveContentBasedTrackSizingFunctionsForItems(TrackSizingDirection, Vector<GridTrack>& columnTracks, Vector<GridTrack>& rowTracks, RenderBox*, FilterFunction, SizingFunction, AccumulatorGetter, AccumulatorGrowFunction);
    100     void distributeSpaceToTracks(Vector<GridTrack*>&, Vector<GridTrack*>* tracksForGrowthAboveMaxBreadth, AccumulatorGetter, AccumulatorGrowFunction, LayoutUnit& availableLogicalSpace);
    101 
    102     double computeNormalizedFractionBreadth(Vector<GridTrack>&, TrackSizingDirection, LayoutUnit availableLogicalSpace) const;
    103 
    104     const GridTrackSize& gridTrackSize(TrackSizingDirection, size_t) const;
    105     size_t explicitGridColumnCount() const;
    106     size_t explicitGridRowCount() const;
    107     size_t explicitGridSizeForSide(GridPositionSide) const;
    108 
    109     LayoutUnit logicalContentHeightForChild(RenderBox*, Vector<GridTrack>&);
    110     LayoutUnit minContentForChild(RenderBox*, TrackSizingDirection, Vector<GridTrack>& columnTracks);
    111     LayoutUnit maxContentForChild(RenderBox*, TrackSizingDirection, Vector<GridTrack>& columnTracks);
    112     LayoutPoint findChildLogicalPosition(RenderBox*, const Vector<GridTrack>& columnTracks, const Vector<GridTrack>& rowTracks);
    113     GridCoordinate cachedGridCoordinate(const RenderBox*) const;
    114 
    115     GridSpan resolveGridPositionsFromAutoPlacementPosition(const RenderBox*, TrackSizingDirection, size_t) const;
    116     PassOwnPtr<GridSpan> resolveGridPositionsFromStyle(const RenderBox*, TrackSizingDirection) const;
    117     size_t resolveNamedGridLinePositionFromStyle(const GridPosition&, GridPositionSide) const;
    118     size_t resolveGridPositionFromStyle(const GridPosition&, GridPositionSide) const;
    119     PassOwnPtr<GridSpan> resolveGridPositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&, GridPositionSide) const;
    120     PassOwnPtr<GridSpan> resolveNamedGridLinePositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&, GridPositionSide) const;
    121     PassOwnPtr<GridSpan> resolveBeforeStartNamedGridLinePositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&, const Vector<size_t>&) const;
    122     PassOwnPtr<GridSpan> resolveAfterEndNamedGridLinePositionAgainstOppositePosition(size_t resolvedOppositePosition, const GridPosition&, const Vector<size_t>&) const;
    123 
    124     LayoutUnit gridAreaBreadthForChild(const RenderBox* child, TrackSizingDirection, const Vector<GridTrack>&) const;
    125 
    126     virtual void paintChildren(PaintInfo&, const LayoutPoint&) OVERRIDE FINAL;
    127 
    128     bool gridIsDirty() const { return m_gridIsDirty; }
    129 
    130 #ifndef NDEBUG
    131     bool tracksAreWiderThanMinTrackBreadth(TrackSizingDirection, const Vector<GridTrack>&);
    132 #endif
    133 
    134     size_t gridColumnCount() const
    135     {
    136         ASSERT(!gridIsDirty());
    137         return m_grid[0].size();
    138     }
    139     size_t gridRowCount() const
    140     {
    141         ASSERT(!gridIsDirty());
    142         return m_grid.size();
    143     }
    144 
    145     Vector<Vector<Vector<RenderBox*, 1> > > m_grid;
    146     bool m_gridIsDirty;
    147     HashMap<const RenderBox*, GridCoordinate> m_gridItemCoordinate;
    148     OrderIterator m_orderIterator;
    149 };
    150 
    151 inline RenderGrid* toRenderGrid(RenderObject* object)
    152 {
    153     ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isRenderGrid());
    154     return static_cast<RenderGrid*>(object);
    155 }
    156 
    157 inline const RenderGrid* toRenderGrid(const RenderObject* object)
    158 {
    159     ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isRenderGrid());
    160     return static_cast<const RenderGrid*>(object);
    161 }
    162 
    163 // Catch unneeded cast.
    164 void toRenderGrid(const RenderGrid*);
    165 
    166 } // namespace WebCore
    167 
    168 #endif // RenderGrid_h
    169