@@ -19,12 +19,15 @@ static inline void setFlexStartLayoutPosition(
19
19
const Direction direction,
20
20
const FlexDirection axis,
21
21
const float containingBlockWidth) {
22
- child->setLayoutPosition (
23
- child->style ().computeFlexStartMargin (
24
- axis, direction, containingBlockWidth) +
25
- parent->getLayout ().border (flexStartEdge (axis)) +
26
- parent->getLayout ().padding (flexStartEdge (axis)),
27
- flexStartEdge (axis));
22
+ float position = child->style ().computeFlexStartMargin (
23
+ axis, direction, containingBlockWidth) +
24
+ parent->getLayout ().border (flexStartEdge (axis));
25
+
26
+ if (!child->hasErrata (Errata::AbsolutePositionWithoutInsetsExcludesPadding)) {
27
+ position += parent->getLayout ().padding (flexStartEdge (axis));
28
+ }
29
+
30
+ child->setLayoutPosition (position, flexStartEdge (axis));
28
31
}
29
32
30
33
static inline void setFlexEndLayoutPosition (
@@ -33,15 +36,16 @@ static inline void setFlexEndLayoutPosition(
33
36
const Direction direction,
34
37
const FlexDirection axis,
35
38
const float containingBlockWidth) {
39
+ float flexEndPosition = parent->getLayout ().border (flexEndEdge (axis)) +
40
+ child->style ().computeFlexEndMargin (
41
+ axis, direction, containingBlockWidth);
42
+
43
+ if (!child->hasErrata (Errata::AbsolutePositionWithoutInsetsExcludesPadding)) {
44
+ flexEndPosition += parent->getLayout ().padding (flexEndEdge (axis));
45
+ }
46
+
36
47
child->setLayoutPosition (
37
- getPositionOfOppositeEdge (
38
- parent->getLayout ().border (flexEndEdge (axis)) +
39
- parent->getLayout ().padding (flexEndEdge (axis)) +
40
- child->style ().computeFlexEndMargin (
41
- axis, direction, containingBlockWidth),
42
- axis,
43
- parent,
44
- child),
48
+ getPositionOfOppositeEdge (flexEndPosition, axis, parent, child),
45
49
flexStartEdge (axis));
46
50
}
47
51
@@ -51,22 +55,30 @@ static inline void setCenterLayoutPosition(
51
55
const Direction direction,
52
56
const FlexDirection axis,
53
57
const float containingBlockWidth) {
54
- const float parentContentBoxSize =
58
+ float parentContentBoxSize =
55
59
parent->getLayout ().measuredDimension (dimension (axis)) -
56
60
parent->getLayout ().border (flexStartEdge (axis)) -
57
- parent->getLayout ().border (flexEndEdge (axis)) -
58
- parent->getLayout ().padding (flexStartEdge (axis)) -
59
- parent->getLayout ().padding (flexEndEdge (axis));
61
+ parent->getLayout ().border (flexEndEdge (axis));
62
+
63
+ if (!child->hasErrata (Errata::AbsolutePositionWithoutInsetsExcludesPadding)) {
64
+ parentContentBoxSize -= parent->getLayout ().padding (flexStartEdge (axis));
65
+ parentContentBoxSize -= parent->getLayout ().padding (flexEndEdge (axis));
66
+ }
67
+
60
68
const float childOuterSize =
61
69
child->getLayout ().measuredDimension (dimension (axis)) +
62
70
child->style ().computeMarginForAxis (axis, containingBlockWidth);
63
- child->setLayoutPosition (
64
- (parentContentBoxSize - childOuterSize) / 2 .0f +
65
- parent->getLayout ().border (flexStartEdge (axis)) +
66
- parent->getLayout ().padding (flexStartEdge (axis)) +
67
- child->style ().computeFlexStartMargin (
68
- axis, direction, containingBlockWidth),
69
- flexStartEdge (axis));
71
+
72
+ float position = (parentContentBoxSize - childOuterSize) / 2 .0f +
73
+ parent->getLayout ().border (flexStartEdge (axis)) +
74
+ child->style ().computeFlexStartMargin (
75
+ axis, direction, containingBlockWidth);
76
+
77
+ if (!child->hasErrata (Errata::AbsolutePositionWithoutInsetsExcludesPadding)) {
78
+ position += parent->getLayout ().padding (flexStartEdge (axis));
79
+ }
80
+
81
+ child->setLayoutPosition (position, flexStartEdge (axis));
70
82
}
71
83
72
84
static void justifyAbsoluteChild (
@@ -133,62 +145,6 @@ static void alignAbsoluteChild(
133
145
}
134
146
}
135
147
136
- // To ensure no breaking changes, we preserve the legacy way of positioning
137
- // absolute children and determine if we should use it using an errata.
138
- static void positionAbsoluteChildLegacy (
139
- const yoga::Node* const containingNode,
140
- const yoga::Node* const parent,
141
- yoga::Node* child,
142
- const Direction direction,
143
- const FlexDirection axis,
144
- const bool isMainAxis,
145
- const float containingBlockWidth,
146
- const float containingBlockHeight) {
147
- const bool isAxisRow = isRow (axis);
148
- const bool shouldCenter = isMainAxis
149
- ? parent->style ().justifyContent () == Justify::Center
150
- : resolveChildAlignment (parent, child) == Align::Center;
151
- const bool shouldFlexEnd = isMainAxis
152
- ? parent->style ().justifyContent () == Justify::FlexEnd
153
- : ((resolveChildAlignment (parent, child) == Align::FlexEnd) ^
154
- (parent->style ().flexWrap () == Wrap::WrapReverse));
155
-
156
- if (child->style ().isFlexEndPositionDefined (axis, direction) &&
157
- (!child->style ().isFlexStartPositionDefined (axis, direction) ||
158
- child->style ().isFlexStartPositionAuto (axis, direction))) {
159
- child->setLayoutPosition (
160
- containingNode->getLayout ().measuredDimension (dimension (axis)) -
161
- child->getLayout ().measuredDimension (dimension (axis)) -
162
- containingNode->style ().computeFlexEndBorder (axis, direction) -
163
- child->style ().computeFlexEndMargin (
164
- axis,
165
- direction,
166
- isAxisRow ? containingBlockWidth : containingBlockHeight) -
167
- child->style ().computeFlexEndPosition (
168
- axis,
169
- direction,
170
- isAxisRow ? containingBlockWidth : containingBlockHeight),
171
- flexStartEdge (axis));
172
- } else if (
173
- (!child->style ().isFlexStartPositionDefined (axis, direction) ||
174
- child->style ().isFlexStartPositionAuto (axis, direction)) &&
175
- shouldCenter) {
176
- child->setLayoutPosition (
177
- (parent->getLayout ().measuredDimension (dimension (axis)) -
178
- child->getLayout ().measuredDimension (dimension (axis))) /
179
- 2 .0f ,
180
- flexStartEdge (axis));
181
- } else if (
182
- (!child->style ().isFlexStartPositionDefined (axis, direction) ||
183
- child->style ().isFlexStartPositionAuto (axis, direction)) &&
184
- shouldFlexEnd) {
185
- child->setLayoutPosition (
186
- (parent->getLayout ().measuredDimension (dimension (axis)) -
187
- child->getLayout ().measuredDimension (dimension (axis))),
188
- flexStartEdge (axis));
189
- }
190
- }
191
-
192
148
/*
193
149
* Absolutely positioned nodes do not participate in flex layout and thus their
194
150
* positions can be determined independently from the rest of their siblings.
@@ -205,7 +161,7 @@ static void positionAbsoluteChildLegacy(
205
161
* This function does that positioning for the given axis. The spec has more
206
162
* information on this topic: https://www.w3.org/TR/css-flexbox-1/#abspos-items
207
163
*/
208
- static void positionAbsoluteChildImpl (
164
+ static void positionAbsoluteChild (
209
165
const yoga::Node* const containingNode,
210
166
const yoga::Node* const parent,
211
167
yoga::Node* child,
@@ -267,36 +223,6 @@ static void positionAbsoluteChildImpl(
267
223
}
268
224
}
269
225
270
- static void positionAbsoluteChild (
271
- const yoga::Node* const containingNode,
272
- const yoga::Node* const parent,
273
- yoga::Node* child,
274
- const Direction direction,
275
- const FlexDirection axis,
276
- const bool isMainAxis,
277
- const float containingBlockWidth,
278
- const float containingBlockHeight) {
279
- child->hasErrata (Errata::AbsolutePositioningIncorrect)
280
- ? positionAbsoluteChildLegacy (
281
- containingNode,
282
- parent,
283
- child,
284
- direction,
285
- axis,
286
- isMainAxis,
287
- containingBlockWidth,
288
- containingBlockHeight)
289
- : positionAbsoluteChildImpl (
290
- containingNode,
291
- parent,
292
- child,
293
- direction,
294
- axis,
295
- isMainAxis,
296
- containingBlockWidth,
297
- containingBlockHeight);
298
- }
299
-
300
226
void layoutAbsoluteChild (
301
227
const yoga::Node* const containingNode,
302
228
const yoga::Node* const node,
0 commit comments