[CSS Grid Layout] Simplify the interface of GridResolvedPosition
[WebKit-https.git] / Source / WebCore / rendering / style / GridResolvedPosition.h
1 /*
2  * Copyright (C) 2014 Igalia S.L.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google Inc. nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #ifndef GridResolvedPosition_h
32 #define GridResolvedPosition_h
33
34 #if ENABLE(CSS_GRID_LAYOUT)
35
36 #include "GridPosition.h"
37
38 namespace WebCore {
39
40 class GridSpan;
41 class RenderBox;
42 class RenderStyle;
43
44 enum GridTrackSizingDirection {
45     ForColumns,
46     ForRows
47 };
48
49 class GridUnresolvedSpan {
50 public:
51     GridUnresolvedSpan(GridPosition initialPosition, GridPositionSide initialPositionSide, GridPosition finalPosition, GridPositionSide finalPositionSide)
52         : m_initialPosition(initialPosition)
53         , m_finalPosition(finalPosition)
54         , m_initialPositionSide(initialPositionSide)
55         , m_finalPositionSide(finalPositionSide)
56     {
57     }
58
59     const GridPosition& initialPosition() const { return m_initialPosition; }
60     const GridPosition& finalPosition() const { return m_finalPosition; }
61     GridPositionSide initialPositionSide() const { return m_initialPositionSide; }
62     GridPositionSide finalPositionSide() const { return m_finalPositionSide; }
63
64     bool requiresAutoPlacement() const;
65     void adjustGridPositionsFromStyle(const RenderStyle& gridContainerStyle);
66
67 private:
68     GridPosition m_initialPosition;
69     GridPosition m_finalPosition;
70     GridPositionSide m_initialPositionSide;
71     GridPositionSide m_finalPositionSide;
72 };
73
74 // This class represents an index into one of the dimensions of the grid array.
75 // Wraps an unsigned integer just for the purpose of knowing what we manipulate in the grid code.
76 class GridResolvedPosition {
77 public:
78     GridResolvedPosition(unsigned position)
79         : m_integerPosition(position)
80     {
81     }
82
83     GridResolvedPosition(const GridPosition&, GridPositionSide);
84
85     GridResolvedPosition& operator*()
86     {
87         return *this;
88     }
89
90     GridResolvedPosition& operator++()
91     {
92         m_integerPosition++;
93         return *this;
94     }
95
96     bool operator==(const GridResolvedPosition& other) const
97     {
98         return m_integerPosition == other.m_integerPosition;
99     }
100
101     bool operator!=(const GridResolvedPosition& other) const
102     {
103         return m_integerPosition != other.m_integerPosition;
104     }
105
106     bool operator<(const GridResolvedPosition& other) const
107     {
108         return m_integerPosition < other.m_integerPosition;
109     }
110
111     bool operator>(const GridResolvedPosition& other) const
112     {
113         return m_integerPosition > other.m_integerPosition;
114     }
115
116     bool operator<=(const GridResolvedPosition& other) const
117     {
118         return m_integerPosition <= other.m_integerPosition;
119     }
120
121     bool operator>=(const GridResolvedPosition& other) const
122     {
123         return m_integerPosition >= other.m_integerPosition;
124     }
125
126     unsigned toInt() const
127     {
128         return m_integerPosition;
129     }
130
131     GridResolvedPosition next() const
132     {
133         return GridResolvedPosition(m_integerPosition + 1);
134     }
135
136     static GridSpan resolveGridPositionsFromAutoPlacementPosition(const RenderStyle&, const RenderBox&, GridTrackSizingDirection, const GridResolvedPosition&);
137     static GridSpan resolveGridPositionsFromStyle(const GridUnresolvedSpan&, const RenderStyle&);
138     static GridUnresolvedSpan unresolvedSpanFromStyle(const RenderStyle&, const RenderBox&, GridTrackSizingDirection);
139     static unsigned explicitGridColumnCount(const RenderStyle&);
140     static unsigned explicitGridRowCount(const RenderStyle&);
141
142 private:
143     unsigned m_integerPosition;
144 };
145
146 } // namespace WebCore
147
148 #endif // ENABLE(CSS_GRID_LAYOUT)
149
150 #endif // GridResolvedPosition_h