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