49a1d10541fe73d2200d302fd2a08d2e4f2a5326
[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     LayoutRect marginBox() const;
74     LayoutRect borderBox() const;
75     LayoutRect paddingBox() const;
76     LayoutRect contentBox() const;
77
78 private:
79     Box();
80
81     void setRect(const LayoutRect&);
82     void setTopLeft(const LayoutPoint&);
83     void setTop(LayoutUnit);
84     void setLeft(LayoutUnit);
85     void setSize(const LayoutSize&);
86     void setWidth(LayoutUnit);
87     void setHeight(LayoutUnit);
88
89     void setMargin(LayoutUnit marginTop, LayoutUnit marginLeft, LayoutUnit marginRight, LayoutUnit marginBottom);
90     void setBorder(LayoutUnit borderTop, LayoutUnit borderLeft, LayoutUnit borderRight, LayoutUnit borderBottom);
91     void setPadding(LayoutUnit paddingTop, LayoutUnit paddingLeft, LayoutUnit paddingRight, LayoutUnit paddingBottom);
92
93 #if !ASSERT_DISABLED
94     void invalidateTop() { m_hasValidTop = false; }
95     void invalidateLeft() { m_hasValidLeft = false; }
96     void invalidateWidth() { m_hasValidWidth = false; }
97     void invalidateHeight() { m_hasValidHeight = false; }
98     void invalidatePosition();
99     void invalidateSize();
100     void invalidateMargin() { m_hasValidMargin = false; }
101     void invalidateBorder() { m_hasValidBorder = false; }
102     void invalidatePadding() { m_hasValidPadding = false; }
103
104     bool hasValidPosition() const { return m_hasValidTop && m_hasValidLeft; }
105     bool hasValidSize() const { return m_hasValidWidth && m_hasValidHeight; }
106     bool hasValidGeometry() const { return hasValidPosition() && hasValidSize(); }
107     
108     void setHasValidPosition();
109     void setHasValidSize();
110     void setHasValidGeometry();
111     
112     void setHasValidMargin();
113     void setHasValidBorder();
114     void setHasValidPadding();
115 #endif
116
117     LayoutRect m_rect;
118
119     LayoutUnit m_marginTop;
120     LayoutUnit m_marginLeft;
121     LayoutUnit m_marginBottom;
122     LayoutUnit m_marginRight;
123
124     LayoutUnit m_borderTop;
125     LayoutUnit m_borderLeft;
126     LayoutUnit m_borderBottom;
127     LayoutUnit m_borderRight;
128
129     LayoutUnit m_paddingTop;
130     LayoutUnit m_paddingLeft;
131     LayoutUnit m_paddingBottom;
132     LayoutUnit m_paddingRight;
133
134 #if !ASSERT_DISABLED
135     bool m_hasValidTop { false };
136     bool m_hasValidLeft { false };
137     bool m_hasValidWidth { false };
138     bool m_hasValidHeight { false };
139     bool m_hasValidMargin { false };
140     bool m_hasValidBorder { false };
141     bool m_hasValidPadding { false };
142 #endif
143 };
144
145 #if !ASSERT_DISABLED
146 inline void Box::invalidatePosition()
147 {
148     invalidateTop();
149     invalidateLeft();
150 }
151
152 inline void Box::invalidateSize()
153 {
154     invalidateWidth();
155     invalidateHeight();
156 }
157
158 inline void Box::setHasValidPosition()
159 {
160     m_hasValidTop = true;
161     m_hasValidLeft = true;
162 }
163
164 inline void Box::setHasValidSize()
165 {
166     m_hasValidWidth = true;
167     m_hasValidHeight = true;
168 }
169
170 inline void Box::setHasValidGeometry()
171 {
172     setHasValidPosition();
173     setHasValidSize();
174 }
175 #endif
176
177 inline LayoutRect Box::rect() const
178 {
179     ASSERT(hasValidGeometry());
180     return m_rect;
181 }
182
183 inline LayoutUnit Box::top() const
184 {
185     ASSERT(m_hasValidTop);
186     return m_rect.y();
187 }
188
189 inline LayoutUnit Box::left() const
190 {
191     ASSERT(m_hasValidLeft);
192     return m_rect.x();
193 }
194
195 inline LayoutUnit Box::bottom() const
196 {
197     ASSERT(m_hasValidTop && m_hasValidHeight);
198     return m_rect.maxY();
199 }
200
201 inline LayoutUnit Box::right() const
202 {
203     ASSERT(m_hasValidLeft && m_hasValidWidth);
204     return m_rect.maxX();
205 }
206
207 inline LayoutPoint Box::topLeft() const
208 {
209     ASSERT(hasValidPosition());
210     return m_rect.location();
211 }
212
213 inline LayoutPoint Box::bottomRight() const
214 {
215     ASSERT(hasValidGeometry());
216     return m_rect.maxXMaxYCorner();
217 }
218
219 inline LayoutSize Box::size() const
220 {
221     ASSERT(hasValidSize());
222     return m_rect.size();
223 }
224
225 inline LayoutUnit Box::width() const
226 {
227     ASSERT(m_hasValidWidth);
228     return m_rect.width();
229 }
230
231 inline LayoutUnit Box::height() const
232 {
233     ASSERT(m_hasValidHeight);
234     return m_rect.height();
235 }
236
237 inline void Box::setRect(const LayoutRect& rect)
238 {
239 #if !ASSERT_DISABLED
240     setHasValidGeometry();
241 #endif
242     m_rect = rect;
243 }
244
245 inline void Box::setTopLeft(const LayoutPoint& topLeft)
246 {
247 #if !ASSERT_DISABLED
248     setHasValidPosition();
249 #endif
250     m_rect.setLocation(topLeft);
251 }
252
253 inline void Box::setTop(LayoutUnit top)
254 {
255 #if !ASSERT_DISABLED
256     m_hasValidTop = true;
257 #endif
258     m_rect.setY(top);
259 }
260
261 inline void Box::setLeft(LayoutUnit left)
262 {
263 #if !ASSERT_DISABLED
264     m_hasValidLeft = true;
265 #endif
266     m_rect.setX(left);
267 }
268
269 inline void Box::setSize(const LayoutSize& size)
270 {
271 #if !ASSERT_DISABLED
272     setHasValidSize();
273 #endif
274     m_rect.setSize(size);
275 }
276
277 inline void Box::setWidth(LayoutUnit width)
278 {
279 #if !ASSERT_DISABLED
280     m_hasValidWidth = true;
281 #endif
282     m_rect.setWidth(width);
283 }
284
285 inline void Box::setHeight(LayoutUnit height)
286 {
287 #if !ASSERT_DISABLED
288     m_hasValidHeight = true;
289 #endif
290     m_rect.setHeight(height);
291 }
292
293 inline void Box::setMargin(LayoutUnit marginTop, LayoutUnit marginLeft, LayoutUnit marginRight, LayoutUnit marginBottom)
294 {
295 #if !ASSERT_DISABLED
296     void setHasValidMargin();
297 #endif
298     m_marginTop = marginTop;
299     m_marginLeft = marginLeft;
300     m_marginBottom = marginBottom;
301     m_marginRight = marginRight;
302 }
303
304 inline void Box::setBorder(LayoutUnit borderTop, LayoutUnit borderLeft, LayoutUnit borderRight, LayoutUnit borderBottom)
305 {
306 #if !ASSERT_DISABLED
307     void setHasValidBorder();
308 #endif
309     m_borderTop = borderTop;
310     m_borderLeft = borderLeft;
311     m_borderBottom = borderBottom;
312     m_borderRight = borderRight;
313 }
314
315 inline void Box::setPadding(LayoutUnit paddingTop, LayoutUnit paddingLeft, LayoutUnit paddingRight, LayoutUnit paddingBottom)
316 {
317 #if !ASSERT_DISABLED
318     void setHasValidPadding();
319 #endif
320     m_paddingTop = paddingTop;
321     m_paddingLeft = paddingLeft;
322     m_paddingBottom = paddingBottom;
323     m_paddingRight = paddingRight;
324 }
325
326 inline LayoutUnit Box::marginTop() const
327 {
328     ASSERT(m_hasValidMargin);
329     return m_marginTop;
330 }
331
332 inline LayoutUnit Box::marginLeft() const
333 {
334     ASSERT(m_hasValidMargin);
335     return m_marginLeft;
336 }
337
338 inline LayoutUnit Box::marginBottom() const
339 {
340     ASSERT(m_hasValidMargin);
341     return m_marginBottom;
342 }
343
344 inline LayoutUnit Box::marginRight() const
345 {
346     ASSERT(m_hasValidMargin);
347     return m_marginRight;
348 }
349
350 }
351 }
352 #endif