fix multiline baseline layout

This commit is contained in:
Lukas Woehrl
2017-01-05 11:47:38 +01:00
parent 5803ba4e5b
commit eaa2501c76
5 changed files with 369 additions and 15 deletions

View File

@@ -337,12 +337,7 @@ YGMeasureFunc YGNodeGetMeasureFunc(const YGNodeRef node) {
void YGNodeSetBaselineFunc(const YGNodeRef node, YGBaselineFunc baselineFunc) {
if (baselineFunc == NULL) {
node->baseline = NULL;
}
else {
node->baseline = baselineFunc;
}
node->baseline = baselineFunc;
}
YGBaselineFunc YGNodeGetBaselineFunc(const YGNodeRef node) {
@@ -965,7 +960,7 @@ static float YGBaselineOfFirstLine(const YGNodeRef node, const YGFlexDirection m
}
YGNodeRef baselineChild = NULL;
for(unsigned int i = 0; i < YGNodeGetChildCount(node); ++i)
for(uint32_t i = 0; i < YGNodeGetChildCount(node); i++)
{
const YGNodeRef child = YGNodeGetChild(node, i);
if(child->style.positionType == YGPositionTypeAbsolute || child->lineIndex > 0)
@@ -2524,6 +2519,7 @@ static void YGNodelayoutImpl(const YGNodeRef node,
// compute the line's height and find the endIndex
float lineHeight = 0;
float maxAscentForCurrentLine = 0;
float maxDescentForCurrentLine = 0;
for (ii = startIndex; ii < childCount; ii++) {
const YGNodeRef child = YGNodeListGet(node->children, ii);
@@ -2531,19 +2527,21 @@ static void YGNodelayoutImpl(const YGNodeRef node,
if (child->lineIndex != i) {
break;
}
if (performLayout && YGNodeAlignItem(node, child) == YGAlignBaseline)
{
maxAscentForCurrentLine = fmaxf(maxAscentForCurrentLine,
YGBaselineForNode(child, crossAxis, availableInnerWidth))
+ YGNodeLeadingMargin(child, crossAxis, availableInnerWidth);
}
if (YGNodeIsLayoutDimDefined(child, crossAxis)) {
lineHeight = fmaxf(lineHeight,
child->layout.measuredDimensions[dim[crossAxis]] +
YGNodeMarginForAxis(child, crossAxis, availableInnerWidth));
}
if (performLayout && YGNodeAlignItem(node, child) == YGAlignBaseline)
{
const float ascent = YGBaselineForNode(child, crossAxis, availableInnerWidth) +
YGNodeLeadingMargin(child, crossAxis, availableInnerWidth);
const float descent = child->layout.measuredDimensions[dim[crossAxis]] +
YGNodeMarginForAxis(child, crossAxis, availableInnerWidth) - ascent;
maxAscentForCurrentLine = fmaxf(maxAscentForCurrentLine, ascent);
maxDescentForCurrentLine = fmaxf(maxDescentForCurrentLine, descent);
lineHeight = fmaxf(lineHeight, maxAscentForCurrentLine + maxDescentForCurrentLine);
}
}
}
endIndex = ii;