OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 1233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1244 totalFlexShrink += child->style()->flexShrink(); | 1244 totalFlexShrink += child->style()->flexShrink(); |
1245 totalWeightedFlexShrink += child->style()->flexShrink() * childInnerFlex
BaseSize; | 1245 totalWeightedFlexShrink += child->style()->flexShrink() * childInnerFlex
BaseSize; |
1246 sumHypotheticalMainSize += childHypotheticalMainSize; | 1246 sumHypotheticalMainSize += childHypotheticalMainSize; |
1247 } | 1247 } |
1248 return true; | 1248 return true; |
1249 } | 1249 } |
1250 | 1250 |
1251 void LayoutFlexibleBox::freezeViolations(Vector<FlexItem*>& violations, LayoutUn
it& availableFreeSpace, double& totalFlexGrow, double& totalFlexShrink, double&
totalWeightedFlexShrink) | 1251 void LayoutFlexibleBox::freezeViolations(Vector<FlexItem*>& violations, LayoutUn
it& availableFreeSpace, double& totalFlexGrow, double& totalFlexShrink, double&
totalWeightedFlexShrink) |
1252 { | 1252 { |
1253 for (size_t i = 0; i < violations.size(); ++i) { | 1253 for (size_t i = 0; i < violations.size(); ++i) { |
| 1254 DCHECK(!violations[i]->frozen) << i; |
1254 LayoutBox* child = violations[i]->box; | 1255 LayoutBox* child = violations[i]->box; |
1255 LayoutUnit childSize = violations[i]->flexedContentSize; | 1256 LayoutUnit childSize = violations[i]->flexedContentSize; |
1256 availableFreeSpace -= childSize - violations[i]->innerFlexBaseSize; | 1257 availableFreeSpace -= childSize - violations[i]->innerFlexBaseSize; |
1257 totalFlexGrow -= child->style()->flexGrow(); | 1258 totalFlexGrow -= child->style()->flexGrow(); |
1258 totalFlexShrink -= child->style()->flexShrink(); | 1259 totalFlexShrink -= child->style()->flexShrink(); |
1259 totalWeightedFlexShrink -= child->style()->flexShrink() * violations[i]-
>innerFlexBaseSize; | 1260 totalWeightedFlexShrink -= child->style()->flexShrink() * violations[i]-
>innerFlexBaseSize; |
1260 // totalWeightedFlexShrink can be negative when we exceed the precision
of a double when we initially | 1261 // totalWeightedFlexShrink can be negative when we exceed the precision
of a double when we initially |
1261 // calcuate totalWeightedFlexShrink. We then subtract each child's weigh
ted flex shrink with full precision, | 1262 // calcuate totalWeightedFlexShrink. We then subtract each child's weigh
ted flex shrink with full precision, |
1262 // now leading to a negative result. See css3/flexbox/large-flex-shrink-
assert.html | 1263 // now leading to a negative result. See css3/flexbox/large-flex-shrink-
assert.html |
1263 totalWeightedFlexShrink = std::max(totalWeightedFlexShrink, 0.0); | 1264 totalWeightedFlexShrink = std::max(totalWeightedFlexShrink, 0.0); |
1264 violations[i]->frozen = true; | 1265 violations[i]->frozen = true; |
1265 } | 1266 } |
1266 } | 1267 } |
1267 | 1268 |
1268 void LayoutFlexibleBox::freezeInflexibleItems(FlexSign flexSign, OrderedFlexItem
List& children, LayoutUnit& remainingFreeSpace, double& totalFlexGrow, double& t
otalFlexShrink, double& totalWeightedFlexShrink) | 1269 void LayoutFlexibleBox::freezeInflexibleItems(FlexSign flexSign, OrderedFlexItem
List& children, LayoutUnit& remainingFreeSpace, double& totalFlexGrow, double& t
otalFlexShrink, double& totalWeightedFlexShrink) |
1269 { | 1270 { |
1270 // Per https://drafts.csswg.org/css-flexbox/#resolve-flexible-lengths step 2
, | 1271 // Per https://drafts.csswg.org/css-flexbox/#resolve-flexible-lengths step 2
, |
1271 // we freeze all items with a flex factor of 0 as well as this with a min/ma
x size violation. | 1272 // we freeze all items with a flex factor of 0 as well as this with a min/ma
x size violation. |
1272 Vector<FlexItem*> newInflexibleItems; | 1273 Vector<FlexItem*> newInflexibleItems; |
1273 for (size_t i = 0; i < children.size(); ++i) { | 1274 for (size_t i = 0; i < children.size(); ++i) { |
1274 FlexItem& flexItem = children[i]; | 1275 FlexItem& flexItem = children[i]; |
1275 LayoutBox* child = flexItem.box; | 1276 LayoutBox* child = flexItem.box; |
| 1277 if (child->isOutOfFlowPositioned()) |
| 1278 continue; |
| 1279 DCHECK(!flexItem.frozen) << i; |
1276 float flexFactor = (flexSign == PositiveFlexibility) ? child->style()->f
lexGrow() : child->style()->flexShrink(); | 1280 float flexFactor = (flexSign == PositiveFlexibility) ? child->style()->f
lexGrow() : child->style()->flexShrink(); |
1277 if (flexFactor == 0 | 1281 if (flexFactor == 0 |
1278 || (flexSign == PositiveFlexibility && flexItem.innerFlexBaseSize >
flexItem.hypotheticalMainSize) | 1282 || (flexSign == PositiveFlexibility && flexItem.innerFlexBaseSize >
flexItem.hypotheticalMainSize) |
1279 || (flexSign == NegativeFlexibility && flexItem.innerFlexBaseSize <
flexItem.hypotheticalMainSize)) { | 1283 || (flexSign == NegativeFlexibility && flexItem.innerFlexBaseSize <
flexItem.hypotheticalMainSize)) { |
1280 flexItem.flexedContentSize = flexItem.hypotheticalMainSize; | 1284 flexItem.flexedContentSize = flexItem.hypotheticalMainSize; |
1281 newInflexibleItems.append(&flexItem); | 1285 newInflexibleItems.append(&flexItem); |
1282 } | 1286 } |
1283 } | 1287 } |
1284 freezeViolations(newInflexibleItems, remainingFreeSpace, totalFlexGrow, tota
lFlexShrink, totalWeightedFlexShrink); | 1288 freezeViolations(newInflexibleItems, remainingFreeSpace, totalFlexGrow, tota
lFlexShrink, totalWeightedFlexShrink); |
1285 } | 1289 } |
1286 | 1290 |
1287 // Returns true if we successfully ran the algorithm and sized the flex items. | 1291 // Returns true if we successfully ran the algorithm and sized the flex items. |
1288 bool LayoutFlexibleBox::resolveFlexibleLengths(FlexSign flexSign, OrderedFlexIte
mList& children, LayoutUnit initialFreeSpace, LayoutUnit& remainingFreeSpace, do
uble& totalFlexGrow, double& totalFlexShrink, double& totalWeightedFlexShrink) | 1292 bool LayoutFlexibleBox::resolveFlexibleLengths(FlexSign flexSign, OrderedFlexIte
mList& children, LayoutUnit initialFreeSpace, LayoutUnit& remainingFreeSpace, do
uble& totalFlexGrow, double& totalFlexShrink, double& totalWeightedFlexShrink) |
1289 { | 1293 { |
1290 LayoutUnit totalViolation; | 1294 LayoutUnit totalViolation; |
1291 LayoutUnit usedFreeSpace; | 1295 LayoutUnit usedFreeSpace; |
1292 Vector<FlexItem*> minViolations; | 1296 Vector<FlexItem*> minViolations; |
1293 Vector<FlexItem*> maxViolations; | 1297 Vector<FlexItem*> maxViolations; |
1294 | 1298 |
1295 double sumFlexFactors = (flexSign == PositiveFlexibility) ? totalFlexGrow :
totalFlexShrink; | 1299 double sumFlexFactors = (flexSign == PositiveFlexibility) ? totalFlexGrow :
totalFlexShrink; |
1296 if (sumFlexFactors > 0 && sumFlexFactors < 1) { | 1300 if (sumFlexFactors > 0 && sumFlexFactors < 1) { |
1297 LayoutUnit fractional(initialFreeSpace * sumFlexFactors); | 1301 LayoutUnit fractional(initialFreeSpace * sumFlexFactors); |
1298 if (fractional.abs() < remainingFreeSpace.abs()) | 1302 if (fractional.abs() < remainingFreeSpace.abs()) |
1299 remainingFreeSpace = fractional; | 1303 remainingFreeSpace = fractional; |
1300 } | 1304 } |
1301 | 1305 |
1302 for (size_t i = 0; i < children.size(); ++i) { | 1306 for (size_t i = 0; i < children.size(); ++i) { |
1303 FlexItem& flexItem = children[i]; | 1307 FlexItem& flexItem = children[i]; |
1304 LayoutBox* child = flexItem.box; | 1308 LayoutBox* child = flexItem.box; |
1305 if (child->isOutOfFlowPositioned()) { | 1309 if (child->isOutOfFlowPositioned()) |
1306 continue; | 1310 continue; |
1307 } | |
1308 | 1311 |
1309 if (flexItem.frozen) | 1312 if (flexItem.frozen) |
1310 continue; | 1313 continue; |
| 1314 |
1311 LayoutUnit childSize = flexItem.innerFlexBaseSize; | 1315 LayoutUnit childSize = flexItem.innerFlexBaseSize; |
1312 double extraSpace = 0; | 1316 double extraSpace = 0; |
1313 if (remainingFreeSpace > 0 && totalFlexGrow > 0 && flexSign == PositiveF
lexibility && std::isfinite(totalFlexGrow)) { | 1317 if (remainingFreeSpace > 0 && totalFlexGrow > 0 && flexSign == PositiveF
lexibility && std::isfinite(totalFlexGrow)) { |
1314 extraSpace = remainingFreeSpace * child->style()->flexGrow() / total
FlexGrow; | 1318 extraSpace = remainingFreeSpace * child->style()->flexGrow() / total
FlexGrow; |
1315 } else if (remainingFreeSpace < 0 && totalWeightedFlexShrink > 0 && flex
Sign == NegativeFlexibility && std::isfinite(totalWeightedFlexShrink) && child->
style()->flexShrink()) { | 1319 } else if (remainingFreeSpace < 0 && totalWeightedFlexShrink > 0 && flex
Sign == NegativeFlexibility && std::isfinite(totalWeightedFlexShrink) && child->
style()->flexShrink()) { |
1316 extraSpace = remainingFreeSpace * child->style()->flexShrink() * fle
xItem.innerFlexBaseSize / totalWeightedFlexShrink; | 1320 extraSpace = remainingFreeSpace * child->style()->flexShrink() * fle
xItem.innerFlexBaseSize / totalWeightedFlexShrink; |
1317 } | 1321 } |
1318 if (std::isfinite(extraSpace)) | 1322 if (std::isfinite(extraSpace)) |
1319 childSize += LayoutUnit::fromFloatRound(extraSpace); | 1323 childSize += LayoutUnit::fromFloatRound(extraSpace); |
1320 | 1324 |
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1898 ASSERT(child); | 1902 ASSERT(child); |
1899 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE
xtent; | 1903 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE
xtent; |
1900 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset
- crossAxisStartEdge; | 1904 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset
- crossAxisStartEdge; |
1901 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi
sExtent; | 1905 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi
sExtent; |
1902 adjustAlignmentForChild(*child, newOffset - originalOffset); | 1906 adjustAlignmentForChild(*child, newOffset - originalOffset); |
1903 } | 1907 } |
1904 } | 1908 } |
1905 } | 1909 } |
1906 | 1910 |
1907 } // namespace blink | 1911 } // namespace blink |
OLD | NEW |