6c07ea41fc3b7ac26b51c118157691c832ba7523
[WebKit-https.git] / Source / WebCore / rendering / style / GridArea.h
1 /*
2  * Copyright (C) 2013 Google Inc. All rights reserved.
3  * Copyright (C) 2013, 2014, 2016 Igalia S.L.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  *     * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *     * Redistributions in binary form must reproduce the above
12  * copyright notice, this list of conditions and the following disclaimer
13  * in the documentation and/or other materials provided with the
14  * distribution.
15  *     * Neither the name of Google Inc. nor the names of its
16  * contributors may be used to endorse or promote products derived from
17  * this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #pragma once
33
34 #if ENABLE(CSS_GRID_LAYOUT)
35
36 #include "GridPositionsResolver.h"
37 #include <wtf/HashMap.h>
38 #include <wtf/text/WTFString.h>
39
40 namespace WebCore {
41
42 // A span in a single direction (either rows or columns). Note that |startLine|
43 // and |endLine| are grid lines' indexes.
44 // Despite line numbers in the spec start in "1", the indexes here start in "0".
45 class GridSpan {
46 public:
47
48     static GridSpan untranslatedDefiniteGridSpan(int startLine, int endLine)
49     {
50         return GridSpan(startLine, endLine, UntranslatedDefinite);
51     }
52
53     static GridSpan translatedDefiniteGridSpan(unsigned startLine, unsigned endLine)
54     {
55         return GridSpan(startLine, endLine, TranslatedDefinite);
56     }
57
58     static GridSpan indefiniteGridSpan()
59     {
60         return GridSpan(0, 1, Indefinite);
61     }
62
63     bool operator==(const GridSpan& o) const
64     {
65         return m_type == o.m_type && m_startLine == o.m_startLine && m_endLine == o.m_endLine;
66     }
67
68     unsigned integerSpan() const
69     {
70         ASSERT(isTranslatedDefinite());
71         return m_endLine - m_startLine;
72     }
73
74     int untranslatedStartLine() const
75     {
76         ASSERT(m_type == UntranslatedDefinite);
77         return m_startLine;
78     }
79
80     int untranslatedEndLine() const
81     {
82         ASSERT(m_type == UntranslatedDefinite);
83         return m_endLine;
84     }
85
86     unsigned startLine() const
87     {
88         ASSERT(isTranslatedDefinite());
89         ASSERT(m_endLine >= 0);
90         return m_startLine;
91     }
92
93     unsigned endLine() const
94     {
95         ASSERT(isTranslatedDefinite());
96         ASSERT(m_endLine > 0);
97         return m_endLine;
98     }
99
100     struct GridSpanIterator {
101         GridSpanIterator(unsigned value)
102             : value(value)
103         {
104         }
105
106         operator unsigned&() { return value; }
107         unsigned operator*() const { return value; }
108
109         unsigned value;
110     };
111
112     GridSpanIterator begin() const
113     {
114         ASSERT(isTranslatedDefinite());
115         return m_startLine;
116     }
117
118     GridSpanIterator end() const
119     {
120         ASSERT(isTranslatedDefinite());
121         return m_endLine;
122     }
123
124     bool isTranslatedDefinite() const
125     {
126         return m_type == TranslatedDefinite;
127     }
128
129     bool isIndefinite() const
130     {
131         return m_type == Indefinite;
132     }
133
134     void translate(unsigned offset)
135     {
136         ASSERT(m_type == UntranslatedDefinite);
137
138         m_type = TranslatedDefinite;
139         m_startLine += offset;
140         m_endLine += offset;
141
142         ASSERT(m_startLine >= 0);
143         ASSERT(m_endLine > 0);
144     }
145
146 private:
147
148     enum GridSpanType {UntranslatedDefinite, TranslatedDefinite, Indefinite};
149
150     GridSpan(int startLine, int endLine, GridSpanType type)
151         : m_type(type)
152     {
153 #if ENABLE(ASSERT)
154         ASSERT(startLine < endLine);
155         if (type == TranslatedDefinite) {
156             ASSERT(startLine >= 0);
157             ASSERT(endLine > 0);
158         }
159 #endif
160
161         m_startLine = std::max(-kGridMaxTracks, std::min(startLine, kGridMaxTracks - 1));
162         m_endLine = std::max(-kGridMaxTracks + 1, std::min(endLine, kGridMaxTracks));
163     }
164
165     int m_startLine;
166     int m_endLine;
167     GridSpanType m_type;
168
169
170 };
171
172 // This represents a grid area that spans in both rows' and columns' direction.
173 class GridArea {
174 public:
175     // HashMap requires a default constuctor.
176     GridArea()
177         : columns(GridSpan::indefiniteGridSpan())
178         , rows(GridSpan::indefiniteGridSpan())
179     {
180     }
181
182     GridArea(const GridSpan& r, const GridSpan& c)
183         : columns(c)
184         , rows(r)
185     {
186     }
187
188     bool operator==(const GridArea& o) const
189     {
190         return columns == o.columns && rows == o.rows;
191     }
192
193     bool operator!=(const GridArea& o) const
194     {
195         return !(*this == o);
196     }
197
198     GridSpan columns;
199     GridSpan rows;
200 };
201
202 typedef HashMap<String, GridArea> NamedGridAreaMap;
203
204 } // namespace WebCore
205
206 #endif // ENABLE(CSS_GRID_LAYOUT)