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