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