1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef GridResolvedPosition_h 6 #define GridResolvedPosition_h 7 8 #include "core/rendering/style/GridPosition.h" 9 10 namespace blink { 11 12 struct GridSpan; 13 class RenderBox; 14 class RenderStyle; 15 16 enum GridPositionSide { 17 ColumnStartSide, 18 ColumnEndSide, 19 RowStartSide, 20 RowEndSide 21 }; 22 23 enum GridTrackSizingDirection { 24 ForColumns, 25 ForRows 26 }; 27 28 // This class represents an index into one of the dimensions of the grid array. 29 // Wraps a size_t integer just for the purpose of knowing what we manipulate in the grid code. 30 class GridResolvedPosition { 31 public: adjustGridPositionForAfterEndSide(size_t resolvedPosition)32 static GridResolvedPosition adjustGridPositionForAfterEndSide(size_t resolvedPosition) 33 { 34 return resolvedPosition ? GridResolvedPosition(resolvedPosition - 1) : GridResolvedPosition(0); 35 } 36 adjustGridPositionForSide(size_t resolvedPosition,GridPositionSide side)37 static GridResolvedPosition adjustGridPositionForSide(size_t resolvedPosition, GridPositionSide side) 38 { 39 // An item finishing on the N-th line belongs to the N-1-th cell. 40 if (side == ColumnEndSide || side == RowEndSide) 41 return adjustGridPositionForAfterEndSide(resolvedPosition); 42 43 return GridResolvedPosition(resolvedPosition); 44 } 45 46 static void initialAndFinalPositionsFromStyle(const RenderStyle&, const RenderBox&, GridTrackSizingDirection, GridPosition &initialPosition, GridPosition &finalPosition); 47 static GridSpan resolveGridPositionsFromAutoPlacementPosition(const RenderStyle&, const RenderBox&, GridTrackSizingDirection, const GridResolvedPosition&); 48 static PassOwnPtr<GridSpan> resolveGridPositionsFromStyle(const RenderStyle&, const RenderBox&, GridTrackSizingDirection); 49 static GridResolvedPosition resolveNamedGridLinePositionFromStyle(const RenderStyle&, const GridPosition&, GridPositionSide); 50 static GridResolvedPosition resolveGridPositionFromStyle(const RenderStyle&, const GridPosition&, GridPositionSide); 51 static PassOwnPtr<GridSpan> resolveGridPositionAgainstOppositePosition(const RenderStyle&, const GridResolvedPosition& resolvedOppositePosition, const GridPosition&, GridPositionSide); 52 static PassOwnPtr<GridSpan> resolveNamedGridLinePositionAgainstOppositePosition(const RenderStyle&, const GridResolvedPosition& resolvedOppositePosition, const GridPosition&, GridPositionSide); 53 GridResolvedPosition(size_t position)54 GridResolvedPosition(size_t position) 55 : m_integerPosition(position) 56 { 57 } 58 GridResolvedPosition(const GridPosition & position,GridPositionSide side)59 GridResolvedPosition(const GridPosition& position, GridPositionSide side) 60 { 61 ASSERT(position.integerPosition()); 62 size_t integerPosition = position.integerPosition() - 1; 63 64 m_integerPosition = adjustGridPositionForSide(integerPosition, side).toInt(); 65 } 66 67 GridResolvedPosition& operator++() 68 { 69 m_integerPosition++; 70 return *this; 71 } 72 73 bool operator==(const GridResolvedPosition& other) const 74 { 75 return m_integerPosition == other.m_integerPosition; 76 } 77 78 bool operator!=(const GridResolvedPosition& other) const 79 { 80 return m_integerPosition != other.m_integerPosition; 81 } 82 83 bool operator<(const GridResolvedPosition& other) const 84 { 85 return m_integerPosition < other.m_integerPosition; 86 } 87 88 bool operator>(const GridResolvedPosition& other) const 89 { 90 return m_integerPosition > other.m_integerPosition; 91 } 92 93 bool operator<=(const GridResolvedPosition& other) const 94 { 95 return m_integerPosition <= other.m_integerPosition; 96 } 97 98 bool operator>=(const GridResolvedPosition& other) const 99 { 100 return m_integerPosition >= other.m_integerPosition; 101 } 102 toInt()103 size_t toInt() const 104 { 105 return m_integerPosition; 106 } 107 next()108 GridResolvedPosition next() const 109 { 110 return GridResolvedPosition(m_integerPosition + 1); 111 } 112 113 static size_t explicitGridColumnCount(const RenderStyle&); 114 static size_t explicitGridRowCount(const RenderStyle&); 115 116 private: 117 118 static size_t explicitGridSizeForSide(const RenderStyle&, GridPositionSide); 119 120 size_t m_integerPosition; 121 }; 122 123 } // namespace blink 124 125 #endif // GridResolvedPosition_h 126