b178bd4818b3b06c5c96dfc66125ad46a8381367
[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 "RenderStyleConstants.h"
34 #include <wtf/IsoMalloc.h>
35
36 namespace WebCore {
37
38 class RenderStyle;
39
40 namespace Layout {
41 class BlockFormattingContext;
42 class FormattingContext;
43 class LayoutContext;
44 }
45
46 namespace Display {
47
48 class Box {
49     WTF_MAKE_ISO_ALLOCATED(Box);
50 public:
51     friend class Layout::LayoutContext;
52     friend class Layout::FormattingContext;
53     friend class Layout::BlockFormattingContext;
54
55     ~Box();
56
57     LayoutRect rect() const;
58
59     LayoutUnit top() const;
60     LayoutUnit left() const;
61     LayoutUnit bottom() const;
62     LayoutUnit right() const;
63
64     LayoutPoint topLeft() const;
65     LayoutPoint bottomRight() const;
66
67     LayoutSize size() const;
68     LayoutUnit width() const;
69     LayoutUnit height() const;
70
71     LayoutUnit marginTop() const;
72     LayoutUnit marginLeft() const;
73     LayoutUnit marginBottom() const;
74     LayoutUnit marginRight() const;
75
76     LayoutUnit borderTop() const;
77     LayoutUnit borderLeft() const;
78     LayoutUnit borderBottom() const;
79     LayoutUnit borderRight() const;
80
81     LayoutUnit paddingTop() const;
82     LayoutUnit paddingLeft() const;
83     LayoutUnit paddingBottom() const;
84     LayoutUnit paddingRight() const;
85
86     LayoutRect marginBox() const;
87     LayoutRect borderBox() const;
88     LayoutRect paddingBox() const;
89     LayoutRect contentBox() const;
90
91 private:
92     Box(const RenderStyle&);
93
94     struct Style {
95         Style(const RenderStyle&);
96
97         BoxSizing boxSizing { BoxSizing::ContentBox };
98     };
99
100     void setRect(const LayoutRect&);
101     void setTopLeft(const LayoutPoint&);
102     void setTop(LayoutUnit);
103     void setLeft(LayoutUnit);
104     void setSize(const LayoutSize&);
105     void setWidth(LayoutUnit);
106     void setHeight(LayoutUnit);
107
108     void setMargin(LayoutUnit marginTop, LayoutUnit marginLeft, LayoutUnit marginRight, LayoutUnit marginBottom);
109     void setBorder(LayoutUnit borderTop, LayoutUnit borderLeft, LayoutUnit borderRight, LayoutUnit borderBottom);
110     void setPadding(LayoutUnit paddingTop, LayoutUnit paddingLeft, LayoutUnit paddingRight, LayoutUnit paddingBottom);
111
112 #if !ASSERT_DISABLED
113     void invalidateTop() { m_hasValidTop = false; }
114     void invalidateLeft() { m_hasValidLeft = false; }
115     void invalidateWidth() { m_hasValidWidth = false; }
116     void invalidateHeight() { m_hasValidHeight = false; }
117     void invalidatePosition();
118     void invalidateSize();
119     void invalidateMargin() { m_hasValidMargin = false; }
120     void invalidateBorder() { m_hasValidBorder = false; }
121     void invalidatePadding() { m_hasValidPadding = false; }
122
123     bool hasValidPosition() const { return m_hasValidTop && m_hasValidLeft; }
124     bool hasValidSize() const { return m_hasValidWidth && m_hasValidHeight; }
125     bool hasValidGeometry() const { return hasValidPosition() && hasValidSize(); }
126     
127     void setHasValidPosition();
128     void setHasValidSize();
129     void setHasValidGeometry();
130     
131     void setHasValidMargin();
132     void setHasValidBorder();
133     void setHasValidPadding();
134 #endif
135
136     const Style m_style;
137
138     LayoutRect m_rect;
139
140     LayoutUnit m_marginTop;
141     LayoutUnit m_marginLeft;
142     LayoutUnit m_marginBottom;
143     LayoutUnit m_marginRight;
144
145     LayoutUnit m_borderTop;
146     LayoutUnit m_borderLeft;
147     LayoutUnit m_borderBottom;
148     LayoutUnit m_borderRight;
149
150     LayoutUnit m_paddingTop;
151     LayoutUnit m_paddingLeft;
152     LayoutUnit m_paddingBottom;
153     LayoutUnit m_paddingRight;
154
155 #if !ASSERT_DISABLED
156     bool m_hasValidTop { false };
157     bool m_hasValidLeft { false };
158     bool m_hasValidWidth { false };
159     bool m_hasValidHeight { false };
160     bool m_hasValidMargin { false };
161     bool m_hasValidBorder { false };
162     bool m_hasValidPadding { false };
163 #endif
164 };
165
166 #if !ASSERT_DISABLED
167 inline void Box::invalidatePosition()
168 {
169     invalidateTop();
170     invalidateLeft();
171 }
172
173 inline void Box::invalidateSize()
174 {
175     invalidateWidth();
176     invalidateHeight();
177 }
178
179 inline void Box::setHasValidPosition()
180 {
181     m_hasValidTop = true;
182     m_hasValidLeft = true;
183 }
184
185 inline void Box::setHasValidSize()
186 {
187     m_hasValidWidth = true;
188     m_hasValidHeight = true;
189 }
190
191 inline void Box::setHasValidGeometry()
192 {
193     setHasValidPosition();
194     setHasValidSize();
195 }
196 #endif
197
198 inline LayoutRect Box::rect() const
199 {
200     ASSERT(hasValidGeometry());
201     return m_rect;
202 }
203
204 inline LayoutUnit Box::top() const
205 {
206     ASSERT(m_hasValidTop);
207     return m_rect.y();
208 }
209
210 inline LayoutUnit Box::left() const
211 {
212     ASSERT(m_hasValidLeft);
213     return m_rect.x();
214 }
215
216 inline LayoutUnit Box::bottom() const
217 {
218     ASSERT(m_hasValidTop && m_hasValidHeight);
219     return m_rect.maxY();
220 }
221
222 inline LayoutUnit Box::right() const
223 {
224     ASSERT(m_hasValidLeft && m_hasValidWidth);
225     return m_rect.maxX();
226 }
227
228 inline LayoutPoint Box::topLeft() const
229 {
230     ASSERT(hasValidPosition());
231     return m_rect.location();
232 }
233
234 inline LayoutPoint Box::bottomRight() const
235 {
236     ASSERT(hasValidGeometry());
237     return m_rect.maxXMaxYCorner();
238 }
239
240 inline LayoutSize Box::size() const
241 {
242     ASSERT(hasValidSize());
243     return m_rect.size();
244 }
245
246 inline LayoutUnit Box::width() const
247 {
248     ASSERT(m_hasValidWidth);
249     return m_rect.width();
250 }
251
252 inline LayoutUnit Box::height() const
253 {
254     ASSERT(m_hasValidHeight);
255     return m_rect.height();
256 }
257
258 inline void Box::setRect(const LayoutRect& rect)
259 {
260 #if !ASSERT_DISABLED
261     setHasValidGeometry();
262 #endif
263     m_rect = rect;
264 }
265
266 inline void Box::setTopLeft(const LayoutPoint& topLeft)
267 {
268 #if !ASSERT_DISABLED
269     setHasValidPosition();
270 #endif
271     m_rect.setLocation(topLeft);
272 }
273
274 inline void Box::setTop(LayoutUnit top)
275 {
276 #if !ASSERT_DISABLED
277     m_hasValidTop = true;
278 #endif
279     m_rect.setY(top);
280 }
281
282 inline void Box::setLeft(LayoutUnit left)
283 {
284 #if !ASSERT_DISABLED
285     m_hasValidLeft = true;
286 #endif
287     m_rect.setX(left);
288 }
289
290 inline void Box::setSize(const LayoutSize& size)
291 {
292 #if !ASSERT_DISABLED
293     setHasValidSize();
294 #endif
295     m_rect.setSize(size);
296 }
297
298 inline void Box::setWidth(LayoutUnit width)
299 {
300 #if !ASSERT_DISABLED
301     m_hasValidWidth = true;
302 #endif
303     m_rect.setWidth(width);
304 }
305
306 inline void Box::setHeight(LayoutUnit height)
307 {
308 #if !ASSERT_DISABLED
309     m_hasValidHeight = true;
310 #endif
311     m_rect.setHeight(height);
312 }
313
314 inline void Box::setMargin(LayoutUnit marginTop, LayoutUnit marginLeft, LayoutUnit marginRight, LayoutUnit marginBottom)
315 {
316 #if !ASSERT_DISABLED
317     void setHasValidMargin();
318 #endif
319     m_marginTop = marginTop;
320     m_marginLeft = marginLeft;
321     m_marginBottom = marginBottom;
322     m_marginRight = marginRight;
323 }
324
325 inline void Box::setBorder(LayoutUnit borderTop, LayoutUnit borderLeft, LayoutUnit borderRight, LayoutUnit borderBottom)
326 {
327 #if !ASSERT_DISABLED
328     void setHasValidBorder();
329 #endif
330     m_borderTop = borderTop;
331     m_borderLeft = borderLeft;
332     m_borderBottom = borderBottom;
333     m_borderRight = borderRight;
334 }
335
336 inline void Box::setPadding(LayoutUnit paddingTop, LayoutUnit paddingLeft, LayoutUnit paddingRight, LayoutUnit paddingBottom)
337 {
338 #if !ASSERT_DISABLED
339     void setHasValidPadding();
340 #endif
341     m_paddingTop = paddingTop;
342     m_paddingLeft = paddingLeft;
343     m_paddingBottom = paddingBottom;
344     m_paddingRight = paddingRight;
345 }
346
347 inline LayoutUnit Box::marginTop() const
348 {
349     ASSERT(m_hasValidMargin);
350     return m_marginTop;
351 }
352
353 inline LayoutUnit Box::marginLeft() const
354 {
355     ASSERT(m_hasValidMargin);
356     return m_marginLeft;
357 }
358
359 inline LayoutUnit Box::marginBottom() const
360 {
361     ASSERT(m_hasValidMargin);
362     return m_marginBottom;
363 }
364
365 inline LayoutUnit Box::marginRight() const
366 {
367     ASSERT(m_hasValidMargin);
368     return m_marginRight;
369 }
370
371 inline LayoutUnit Box::paddingTop() const
372 {
373     ASSERT(m_hasValidPadding);
374     return m_paddingTop;
375 }
376
377 inline LayoutUnit Box::paddingLeft() const
378 {
379     ASSERT(m_hasValidPadding);
380     return m_paddingLeft;
381 }
382
383 inline LayoutUnit Box::paddingBottom() const
384 {
385     ASSERT(m_hasValidPadding);
386     return m_paddingBottom;
387 }
388
389 inline LayoutUnit Box::paddingRight() const
390 {
391     ASSERT(m_hasValidPadding);
392     return m_paddingRight;
393 }
394
395 inline LayoutUnit Box::borderTop() const
396 {
397     ASSERT(m_hasValidBorder);
398     return m_borderTop;
399 }
400
401 inline LayoutUnit Box::borderLeft() const
402 {
403     ASSERT(m_hasValidBorder);
404     return m_borderLeft;
405 }
406
407 inline LayoutUnit Box::borderBottom() const
408 {
409     ASSERT(m_hasValidBorder);
410     return m_borderBottom;
411 }
412
413 inline LayoutUnit Box::borderRight() const
414 {
415     ASSERT(m_hasValidBorder);
416     return m_borderRight;
417 }
418
419 }
420 }
421 #endif