368fdaf0eb85b4d2acaf684f24128ed2068b5e8d
[WebKit-https.git] / Source / WebCore / layout / displaytree / DisplayBox.h
1 /*
2  * Copyright (C) 2018 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if ENABLE(LAYOUT_FORMATTING_CONTEXT)
29
30 #include "LayoutPoint.h"
31 #include "LayoutRect.h"
32 #include "LayoutUnit.h"
33 #include <wtf/IsoMalloc.h>
34
35 namespace WebCore {
36
37 namespace Layout {
38 class BlockFormattingContext;
39 class FormattingContext;
40 class LayoutContext;
41 }
42
43 namespace Display {
44
45 class Box {
46     WTF_MAKE_ISO_ALLOCATED(Box);
47 public:
48     friend class Layout::LayoutContext;
49     friend class Layout::FormattingContext;
50     friend class Layout::BlockFormattingContext;
51
52     ~Box();
53
54     LayoutRect rect() const;
55
56     LayoutUnit top() const;
57     LayoutUnit left() const;
58     LayoutUnit bottom() const;
59     LayoutUnit right() const;
60
61     LayoutPoint topLeft() const;
62     LayoutPoint bottomRight() const;
63
64     LayoutSize size() const;
65     LayoutUnit width() const;
66     LayoutUnit height() const;
67
68     LayoutUnit marginTop() const;
69     LayoutUnit marginLeft() const;
70     LayoutUnit marginBottom() const;
71     LayoutUnit marginRight() const;
72
73     LayoutUnit borderTop() const;
74     LayoutUnit borderLeft() const;
75     LayoutUnit borderBottom() const;
76     LayoutUnit borderRight() const;
77
78     LayoutUnit paddingTop() const;
79     LayoutUnit paddingLeft() const;
80     LayoutUnit paddingBottom() const;
81     LayoutUnit paddingRight() const;
82
83     LayoutRect marginBox() const;
84     LayoutRect borderBox() const;
85     LayoutRect paddingBox() const;
86     LayoutRect contentBox() const;
87
88 private:
89     Box();
90
91     void setRect(const LayoutRect&);
92     void setTopLeft(const LayoutPoint&);
93     void setTop(LayoutUnit);
94     void setLeft(LayoutUnit);
95     void setSize(const LayoutSize&);
96     void setWidth(LayoutUnit);
97     void setHeight(LayoutUnit);
98
99     void setMargin(LayoutUnit marginTop, LayoutUnit marginLeft, LayoutUnit marginRight, LayoutUnit marginBottom);
100     void setBorder(LayoutUnit borderTop, LayoutUnit borderLeft, LayoutUnit borderRight, LayoutUnit borderBottom);
101     void setPadding(LayoutUnit paddingTop, LayoutUnit paddingLeft, LayoutUnit paddingRight, LayoutUnit paddingBottom);
102
103 #if !ASSERT_DISABLED
104     void invalidateTop() { m_hasValidTop = false; }
105     void invalidateLeft() { m_hasValidLeft = false; }
106     void invalidateWidth() { m_hasValidWidth = false; }
107     void invalidateHeight() { m_hasValidHeight = false; }
108     void invalidatePosition();
109     void invalidateSize();
110     void invalidateMargin() { m_hasValidMargin = false; }
111     void invalidateBorder() { m_hasValidBorder = false; }
112     void invalidatePadding() { m_hasValidPadding = false; }
113
114     bool hasValidPosition() const { return m_hasValidTop && m_hasValidLeft; }
115     bool hasValidSize() const { return m_hasValidWidth && m_hasValidHeight; }
116     bool hasValidGeometry() const { return hasValidPosition() && hasValidSize(); }
117     
118     void setHasValidPosition();
119     void setHasValidSize();
120     void setHasValidGeometry();
121     
122     void setHasValidMargin();
123     void setHasValidBorder();
124     void setHasValidPadding();
125 #endif
126
127     LayoutRect m_rect;
128
129     LayoutUnit m_marginTop;
130     LayoutUnit m_marginLeft;
131     LayoutUnit m_marginBottom;
132     LayoutUnit m_marginRight;
133
134     LayoutUnit m_borderTop;
135     LayoutUnit m_borderLeft;
136     LayoutUnit m_borderBottom;
137     LayoutUnit m_borderRight;
138
139     LayoutUnit m_paddingTop;
140     LayoutUnit m_paddingLeft;
141     LayoutUnit m_paddingBottom;
142     LayoutUnit m_paddingRight;
143
144 #if !ASSERT_DISABLED
145     bool m_hasValidTop { false };
146     bool m_hasValidLeft { false };
147     bool m_hasValidWidth { false };
148     bool m_hasValidHeight { false };
149     bool m_hasValidMargin { false };
150     bool m_hasValidBorder { false };
151     bool m_hasValidPadding { false };
152 #endif
153 };
154
155 #if !ASSERT_DISABLED
156 inline void Box::invalidatePosition()
157 {
158     invalidateTop();
159     invalidateLeft();
160 }
161
162 inline void Box::invalidateSize()
163 {
164     invalidateWidth();
165     invalidateHeight();
166 }
167
168 inline void Box::setHasValidPosition()
169 {
170     m_hasValidTop = true;
171     m_hasValidLeft = true;
172 }
173
174 inline void Box::setHasValidSize()
175 {
176     m_hasValidWidth = true;
177     m_hasValidHeight = true;
178 }
179
180 inline void Box::setHasValidGeometry()
181 {
182     setHasValidPosition();
183     setHasValidSize();
184 }
185 #endif
186
187 inline LayoutRect Box::rect() const
188 {
189     ASSERT(hasValidGeometry());
190     return m_rect;
191 }
192
193 inline LayoutUnit Box::top() const
194 {
195     ASSERT(m_hasValidTop);
196     return m_rect.y();
197 }
198
199 inline LayoutUnit Box::left() const
200 {
201     ASSERT(m_hasValidLeft);
202     return m_rect.x();
203 }
204
205 inline LayoutUnit Box::bottom() const
206 {
207     ASSERT(m_hasValidTop && m_hasValidHeight);
208     return m_rect.maxY();
209 }
210
211 inline LayoutUnit Box::right() const
212 {
213     ASSERT(m_hasValidLeft && m_hasValidWidth);
214     return m_rect.maxX();
215 }
216
217 inline LayoutPoint Box::topLeft() const
218 {
219     ASSERT(hasValidPosition());
220     return m_rect.location();
221 }
222
223 inline LayoutPoint Box::bottomRight() const
224 {
225     ASSERT(hasValidGeometry());
226     return m_rect.maxXMaxYCorner();
227 }
228
229 inline LayoutSize Box::size() const
230 {
231     ASSERT(hasValidSize());
232     return m_rect.size();
233 }
234
235 inline LayoutUnit Box::width() const
236 {
237     ASSERT(m_hasValidWidth);
238     return m_rect.width();
239 }
240
241 inline LayoutUnit Box::height() const
242 {
243     ASSERT(m_hasValidHeight);
244     return m_rect.height();
245 }
246
247 inline void Box::setRect(const LayoutRect& rect)
248 {
249 #if !ASSERT_DISABLED
250     setHasValidGeometry();
251 #endif
252     m_rect = rect;
253 }
254
255 inline void Box::setTopLeft(const LayoutPoint& topLeft)
256 {
257 #if !ASSERT_DISABLED
258     setHasValidPosition();
259 #endif
260     m_rect.setLocation(topLeft);
261 }
262
263 inline void Box::setTop(LayoutUnit top)
264 {
265 #if !ASSERT_DISABLED
266     m_hasValidTop = true;
267 #endif
268     m_rect.setY(top);
269 }
270
271 inline void Box::setLeft(LayoutUnit left)
272 {
273 #if !ASSERT_DISABLED
274     m_hasValidLeft = true;
275 #endif
276     m_rect.setX(left);
277 }
278
279 inline void Box::setSize(const LayoutSize& size)
280 {
281 #if !ASSERT_DISABLED
282     setHasValidSize();
283 #endif
284     m_rect.setSize(size);
285 }
286
287 inline void Box::setWidth(LayoutUnit width)
288 {
289 #if !ASSERT_DISABLED
290     m_hasValidWidth = true;
291 #endif
292     m_rect.setWidth(width);
293 }
294
295 inline void Box::setHeight(LayoutUnit height)
296 {
297 #if !ASSERT_DISABLED
298     m_hasValidHeight = true;
299 #endif
300     m_rect.setHeight(height);
301 }
302
303 inline void Box::setMargin(LayoutUnit marginTop, LayoutUnit marginLeft, LayoutUnit marginRight, LayoutUnit marginBottom)
304 {
305 #if !ASSERT_DISABLED
306     void setHasValidMargin();
307 #endif
308     m_marginTop = marginTop;
309     m_marginLeft = marginLeft;
310     m_marginBottom = marginBottom;
311     m_marginRight = marginRight;
312 }
313
314 inline void Box::setBorder(LayoutUnit borderTop, LayoutUnit borderLeft, LayoutUnit borderRight, LayoutUnit borderBottom)
315 {
316 #if !ASSERT_DISABLED
317     void setHasValidBorder();
318 #endif
319     m_borderTop = borderTop;
320     m_borderLeft = borderLeft;
321     m_borderBottom = borderBottom;
322     m_borderRight = borderRight;
323 }
324
325 inline void Box::setPadding(LayoutUnit paddingTop, LayoutUnit paddingLeft, LayoutUnit paddingRight, LayoutUnit paddingBottom)
326 {
327 #if !ASSERT_DISABLED
328     void setHasValidPadding();
329 #endif
330     m_paddingTop = paddingTop;
331     m_paddingLeft = paddingLeft;
332     m_paddingBottom = paddingBottom;
333     m_paddingRight = paddingRight;
334 }
335
336 inline LayoutUnit Box::marginTop() const
337 {
338     ASSERT(m_hasValidMargin);
339     return m_marginTop;
340 }
341
342 inline LayoutUnit Box::marginLeft() const
343 {
344     ASSERT(m_hasValidMargin);
345     return m_marginLeft;
346 }
347
348 inline LayoutUnit Box::marginBottom() const
349 {
350     ASSERT(m_hasValidMargin);
351     return m_marginBottom;
352 }
353
354 inline LayoutUnit Box::marginRight() const
355 {
356     ASSERT(m_hasValidMargin);
357     return m_marginRight;
358 }
359
360 inline LayoutUnit Box::paddingTop() const
361 {
362     ASSERT(m_hasValidPadding);
363     return m_paddingTop;
364 }
365
366 inline LayoutUnit Box::paddingLeft() const
367 {
368     ASSERT(m_hasValidPadding);
369     return m_paddingLeft;
370 }
371
372 inline LayoutUnit Box::paddingBottom() const
373 {
374     ASSERT(m_hasValidPadding);
375     return m_paddingBottom;
376 }
377
378 inline LayoutUnit Box::paddingRight() const
379 {
380     ASSERT(m_hasValidPadding);
381     return m_paddingRight;
382 }
383
384 inline LayoutUnit Box::borderTop() const
385 {
386     ASSERT(m_hasValidBorder);
387     return m_borderTop;
388 }
389
390 inline LayoutUnit Box::borderLeft() const
391 {
392     ASSERT(m_hasValidBorder);
393     return m_borderLeft;
394 }
395
396 inline LayoutUnit Box::borderBottom() const
397 {
398     ASSERT(m_hasValidBorder);
399     return m_borderBottom;
400 }
401
402 inline LayoutUnit Box::borderRight() const
403 {
404     ASSERT(m_hasValidBorder);
405     return m_borderRight;
406 }
407
408 }
409 }
410 #endif