1/*
2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * Copyright (C) 2013-2017 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#include "GridPosition.h"
35#include <wtf/HashMap.h>
36#include <wtf/text/WTFString.h>
37
38namespace WebCore {
39
40// A span in a single direction (either rows or columns). Note that |startLine|
41// and |endLine| are grid lines' indexes.
42// Despite line numbers in the spec start in "1", the indexes here start in "0".
43class GridSpan {
44public:
45
46 static GridSpan untranslatedDefiniteGridSpan(int startLine, int endLine)
47 {
48 return GridSpan(startLine, endLine, UntranslatedDefinite);
49 }
50
51 static GridSpan translatedDefiniteGridSpan(unsigned startLine, unsigned endLine)
52 {
53 return GridSpan(startLine, endLine, TranslatedDefinite);
54 }
55
56 static GridSpan indefiniteGridSpan()
57 {
58 return GridSpan(0, 1, Indefinite);
59 }
60
61 bool operator==(const GridSpan& o) const
62 {
63 return m_type == o.m_type && m_startLine == o.m_startLine && m_endLine == o.m_endLine;
64 }
65
66 unsigned integerSpan() const
67 {
68 ASSERT(isTranslatedDefinite());
69 return m_endLine - m_startLine;
70 }
71
72 int untranslatedStartLine() const
73 {
74 ASSERT(m_type == UntranslatedDefinite);
75 return m_startLine;
76 }
77
78 int untranslatedEndLine() const
79 {
80 ASSERT(m_type == UntranslatedDefinite);
81 return m_endLine;
82 }
83
84 unsigned startLine() const
85 {
86 ASSERT(isTranslatedDefinite());
87 ASSERT(m_endLine >= 0);
88 return m_startLine;
89 }
90
91 unsigned endLine() const
92 {
93 ASSERT(isTranslatedDefinite());
94 ASSERT(m_endLine > 0);
95 return m_endLine;
96 }
97
98 struct GridSpanIterator {
99 GridSpanIterator(unsigned value)
100 : value(value)
101 {
102 }
103
104 operator unsigned&() { return value; }
105 unsigned operator*() const { return value; }
106
107 unsigned value;
108 };
109
110 GridSpanIterator begin() const
111 {
112 ASSERT(isTranslatedDefinite());
113 return m_startLine;
114 }
115
116 GridSpanIterator end() const
117 {
118 ASSERT(isTranslatedDefinite());
119 return m_endLine;
120 }
121
122 bool isTranslatedDefinite() const
123 {
124 return m_type == TranslatedDefinite;
125 }
126
127 bool isIndefinite() const
128 {
129 return m_type == Indefinite;
130 }
131
132 void translate(unsigned offset)
133 {
134 ASSERT(m_type == UntranslatedDefinite);
135
136 m_type = TranslatedDefinite;
137 m_startLine += offset;
138 m_endLine += offset;
139
140 ASSERT(m_startLine >= 0);
141 ASSERT(m_endLine > 0);
142 }
143
144private:
145
146 enum GridSpanType {UntranslatedDefinite, TranslatedDefinite, Indefinite};
147
148 GridSpan(int startLine, int endLine, GridSpanType type)
149 : m_type(type)
150 {
151#if !ASSERT_DISABLED
152 ASSERT(startLine < endLine);
153 if (type == TranslatedDefinite) {
154 ASSERT(startLine >= 0);
155 ASSERT(endLine > 0);
156 }
157#endif
158
159 m_startLine = std::max(GridPosition::min(), std::min(startLine, GridPosition::max() - 1));
160 m_endLine = std::max(GridPosition::min() + 1, std::min(endLine, GridPosition::max()));
161 }
162
163 int m_startLine;
164 int m_endLine;
165 GridSpanType m_type;
166
167
168};
169
170// This represents a grid area that spans in both rows' and columns' direction.
171class GridArea {
172 WTF_MAKE_FAST_ALLOCATED;
173public:
174 // HashMap requires a default constuctor.
175 GridArea()
176 : columns(GridSpan::indefiniteGridSpan())
177 , rows(GridSpan::indefiniteGridSpan())
178 {
179 }
180
181 GridArea(const GridSpan& r, const GridSpan& c)
182 : columns(c)
183 , rows(r)
184 {
185 }
186
187 bool operator==(const GridArea& o) const
188 {
189 return columns == o.columns && rows == o.rows;
190 }
191
192 bool operator!=(const GridArea& o) const
193 {
194 return !(*this == o);
195 }
196
197 GridSpan columns;
198 GridSpan rows;
199};
200
201typedef HashMap<String, GridArea> NamedGridAreaMap;
202
203} // namespace WebCore
204