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