From a1f36b53f5464c8ee7abc311765dc3ecb1b879c6 Mon Sep 17 00:00:00 2001 From: Emil Sjolander Date: Sat, 2 Jul 2016 11:22:57 +0100 Subject: [PATCH] Use AT_MOST measurespec when onyl max dimension is defined --- dist/css-layout.h | 29 ++++++++++----- dist/css-layout.jar | Bin 16324 -> 16324 bytes src/Layout.c | 29 ++++++++++----- src/csharp/Facebook.CSSLayout/LayoutEngine.cs | 35 +++++++++++------- .../com/facebook/csslayout/LayoutEngine.java | 29 ++++++++++----- 5 files changed, 82 insertions(+), 40 deletions(-) diff --git a/dist/css-layout.h b/dist/css-layout.h index 316648b3..44160d61 100644 --- a/dist/css-layout.h +++ b/dist/css-layout.h @@ -1989,17 +1989,28 @@ void layoutNode(css_node_t* node, float availableWidth, float availableHeight, c // parameters don't change. gCurrentGenerationCount++; - // If the caller didn't specify a height/width, use the dimensions - // specified in the style. - if (isUndefined(availableWidth) && isStyleDimDefined(node, CSS_FLEX_DIRECTION_ROW)) { - availableWidth = node->style.dimensions[CSS_WIDTH] + getMarginAxis(node, CSS_FLEX_DIRECTION_ROW); - } - if (isUndefined(availableHeight) && isStyleDimDefined(node, CSS_FLEX_DIRECTION_COLUMN)) { - availableHeight = node->style.dimensions[CSS_HEIGHT] + getMarginAxis(node, CSS_FLEX_DIRECTION_COLUMN); + css_measure_mode_t widthMeasureMode = CSS_MEASURE_MODE_UNDEFINED; + css_measure_mode_t heightMeasureMode = CSS_MEASURE_MODE_UNDEFINED; + + if (!isUndefined(availableWidth)) { + widthMeasureMode = CSS_MEASURE_MODE_EXACTLY; + } else if (isStyleDimDefined(node, CSS_FLEX_DIRECTION_ROW)) { + availableWidth = node->style.dimensions[dim[CSS_FLEX_DIRECTION_ROW]] + getMarginAxis(node, CSS_FLEX_DIRECTION_ROW); + widthMeasureMode = CSS_MEASURE_MODE_EXACTLY; + } else if (node->style.maxDimensions[CSS_WIDTH] >= 0.0) { + availableWidth = node->style.maxDimensions[CSS_WIDTH]; + widthMeasureMode = CSS_MEASURE_MODE_AT_MOST; } - css_measure_mode_t widthMeasureMode = isUndefined(availableWidth) ? CSS_MEASURE_MODE_UNDEFINED : CSS_MEASURE_MODE_EXACTLY; - css_measure_mode_t heightMeasureMode = isUndefined(availableHeight) ? CSS_MEASURE_MODE_UNDEFINED : CSS_MEASURE_MODE_EXACTLY; + if (!isUndefined(availableHeight)) { + heightMeasureMode = CSS_MEASURE_MODE_EXACTLY; + } else if (isStyleDimDefined(node, CSS_FLEX_DIRECTION_COLUMN)) { + availableHeight = node->style.dimensions[dim[CSS_FLEX_DIRECTION_COLUMN]] + getMarginAxis(node, CSS_FLEX_DIRECTION_COLUMN); + heightMeasureMode = CSS_MEASURE_MODE_EXACTLY; + } else if (node->style.maxDimensions[CSS_HEIGHT] >= 0.0) { + availableHeight = node->style.maxDimensions[CSS_HEIGHT]; + heightMeasureMode = CSS_MEASURE_MODE_AT_MOST; + } if (layoutNodeInternal(node, availableWidth, availableHeight, parentDirection, widthMeasureMode, heightMeasureMode, true, "initial")) { diff --git a/dist/css-layout.jar b/dist/css-layout.jar index 4868ab090c087550e862c8ac9dba5f129d3c4501..f7f4613105deb6976ff935d31759c30af725e764 100644 GIT binary patch delta 145 zcmX?7f25u_z?+#xgn@&DgW*inqlvs$%pl6kgDv8P&(Ew-~z-5 z)qgf_JQv2q+_mZOW_9L%7Uq*tk2ddQUuO(vWLcXrfef0w*w%srNPB?HnEcq*nsMV~ YdAlT#uE{NS=^(X}-`S;s>2Uj80Mqk19RL6T delta 145 zcmX?7f25u_z?+#xgn@&DgMlmLOY+u&xJ8DvxOhqtj^re!pt6Wa`R61b;e*umbDoZ$e_uKZ7n!}vVJE2dSO>&Mpm1huh}@0IYp4T>t<8 diff --git a/src/Layout.c b/src/Layout.c index 6b581a1d..a8e12f85 100644 --- a/src/Layout.c +++ b/src/Layout.c @@ -1783,17 +1783,28 @@ void layoutNode(css_node_t* node, float availableWidth, float availableHeight, c // parameters don't change. gCurrentGenerationCount++; - // If the caller didn't specify a height/width, use the dimensions - // specified in the style. - if (isUndefined(availableWidth) && isStyleDimDefined(node, CSS_FLEX_DIRECTION_ROW)) { - availableWidth = node->style.dimensions[CSS_WIDTH] + getMarginAxis(node, CSS_FLEX_DIRECTION_ROW); - } - if (isUndefined(availableHeight) && isStyleDimDefined(node, CSS_FLEX_DIRECTION_COLUMN)) { - availableHeight = node->style.dimensions[CSS_HEIGHT] + getMarginAxis(node, CSS_FLEX_DIRECTION_COLUMN); + css_measure_mode_t widthMeasureMode = CSS_MEASURE_MODE_UNDEFINED; + css_measure_mode_t heightMeasureMode = CSS_MEASURE_MODE_UNDEFINED; + + if (!isUndefined(availableWidth)) { + widthMeasureMode = CSS_MEASURE_MODE_EXACTLY; + } else if (isStyleDimDefined(node, CSS_FLEX_DIRECTION_ROW)) { + availableWidth = node->style.dimensions[dim[CSS_FLEX_DIRECTION_ROW]] + getMarginAxis(node, CSS_FLEX_DIRECTION_ROW); + widthMeasureMode = CSS_MEASURE_MODE_EXACTLY; + } else if (node->style.maxDimensions[CSS_WIDTH] >= 0.0) { + availableWidth = node->style.maxDimensions[CSS_WIDTH]; + widthMeasureMode = CSS_MEASURE_MODE_AT_MOST; } - css_measure_mode_t widthMeasureMode = isUndefined(availableWidth) ? CSS_MEASURE_MODE_UNDEFINED : CSS_MEASURE_MODE_EXACTLY; - css_measure_mode_t heightMeasureMode = isUndefined(availableHeight) ? CSS_MEASURE_MODE_UNDEFINED : CSS_MEASURE_MODE_EXACTLY; + if (!isUndefined(availableHeight)) { + heightMeasureMode = CSS_MEASURE_MODE_EXACTLY; + } else if (isStyleDimDefined(node, CSS_FLEX_DIRECTION_COLUMN)) { + availableHeight = node->style.dimensions[dim[CSS_FLEX_DIRECTION_COLUMN]] + getMarginAxis(node, CSS_FLEX_DIRECTION_COLUMN); + heightMeasureMode = CSS_MEASURE_MODE_EXACTLY; + } else if (node->style.maxDimensions[CSS_HEIGHT] >= 0.0) { + availableHeight = node->style.maxDimensions[CSS_HEIGHT]; + heightMeasureMode = CSS_MEASURE_MODE_AT_MOST; + } if (layoutNodeInternal(node, availableWidth, availableHeight, parentDirection, widthMeasureMode, heightMeasureMode, true, "initial")) { diff --git a/src/csharp/Facebook.CSSLayout/LayoutEngine.cs b/src/csharp/Facebook.CSSLayout/LayoutEngine.cs index 3760df66..d50b20f1 100644 --- a/src/csharp/Facebook.CSSLayout/LayoutEngine.cs +++ b/src/csharp/Facebook.CSSLayout/LayoutEngine.cs @@ -260,21 +260,30 @@ namespace Facebook.CSSLayout // parameters don't change. layoutContext.currentGenerationCount++; - // If the caller didn't specify a height/width, use the dimensions - // specified in the style. - if (float.IsNaN(availableWidth) && node.style.dimensions[DIMENSION_WIDTH] >= 0.0) - { - float marginAxisRow = (node.style.margin.getWithFallback(leadingSpacing[CSS_FLEX_DIRECTION_ROW], leading[CSS_FLEX_DIRECTION_ROW]) + node.style.margin.getWithFallback(trailingSpacing[CSS_FLEX_DIRECTION_ROW], trailing[CSS_FLEX_DIRECTION_ROW])); - availableWidth = node.style.dimensions[DIMENSION_WIDTH] + marginAxisRow; - } - if (float.IsNaN(availableHeight) && node.style.dimensions[DIMENSION_HEIGHT] >= 0.0) - { - float marginAxisColumn = (node.style.margin.getWithFallback(leadingSpacing[CSS_FLEX_DIRECTION_COLUMN], leading[CSS_FLEX_DIRECTION_COLUMN]) + node.style.margin.getWithFallback(trailingSpacing[CSS_FLEX_DIRECTION_COLUMN], trailing[CSS_FLEX_DIRECTION_COLUMN])); - availableHeight = node.style.dimensions[DIMENSION_HEIGHT] + marginAxisColumn; + CSSMeasureMode widthMeasureMode = CSSMeasureMode.Undefined; + CSSMeasureMode heightMeasureMode = CSSMeasureMode.Undefined; + + if (!float.IsNaN(availableWidth)) { + widthMeasureMode = CSSMeasureMode.Exactly; + } else if (node.style.dimensions[DIMENSION_WIDTH] >= 0.0) { + float marginAxisRow = (node.style.margin.getWithFallback(leadingSpacing[CSS_FLEX_DIRECTION_ROW], leading[CSS_FLEX_DIRECTION_ROW]) + node.style.margin.getWithFallback(trailingSpacing[CSS_FLEX_DIRECTION_ROW], trailing[CSS_FLEX_DIRECTION_ROW])); + availableWidth = node.style.dimensions[DIMENSION_WIDTH] + marginAxisRow; + widthMeasureMode = CSSMeasureMode.Exactly; + } else if (node.style.maxWidth >= 0.0) { + availableWidth = node.style.maxWidth; + widthMeasureMode = CSSMeasureMode.AtMost; } - CSSMeasureMode widthMeasureMode = float.IsNaN(availableWidth) ? CSSMeasureMode.Undefined : CSSMeasureMode.Exactly; - CSSMeasureMode heightMeasureMode = float.IsNaN(availableHeight) ? CSSMeasureMode.Undefined : CSSMeasureMode.Exactly; + if (!float.IsNaN(availableHeight)) { + heightMeasureMode = CSSMeasureMode.Exactly; + } else if (node.style.dimensions[DIMENSION_HEIGHT] >= 0.0) { + float marginAxisColumn = (node.style.margin.getWithFallback(leadingSpacing[CSS_FLEX_DIRECTION_COLUMN], leading[CSS_FLEX_DIRECTION_COLUMN]) + node.style.margin.getWithFallback(trailingSpacing[CSS_FLEX_DIRECTION_COLUMN], trailing[CSS_FLEX_DIRECTION_COLUMN])); + availableHeight = node.style.dimensions[DIMENSION_HEIGHT] + marginAxisColumn; + heightMeasureMode = CSSMeasureMode.Exactly; + } else if (node.style.maxHeight >= 0.0) { + availableHeight = node.style.maxHeight; + heightMeasureMode = CSSMeasureMode.AtMost; + } if (layoutNodeInternal(layoutContext, node, availableWidth, availableHeight, parentDirection, widthMeasureMode, heightMeasureMode, true, "initial")) { diff --git a/src/java/src/com/facebook/csslayout/LayoutEngine.java b/src/java/src/com/facebook/csslayout/LayoutEngine.java index 7168f67a..7649f0b2 100644 --- a/src/java/src/com/facebook/csslayout/LayoutEngine.java +++ b/src/java/src/com/facebook/csslayout/LayoutEngine.java @@ -231,19 +231,30 @@ public class LayoutEngine { // parameters don't change. layoutContext.currentGenerationCount++; - // If the caller didn't specify a height/width, use the dimensions - // specified in the style. - if (Float.isNaN(availableWidth) && node.style.dimensions[DIMENSION_WIDTH] >= 0.0) { + CSSMeasureMode widthMeasureMode = CSSMeasureMode.UNDEFINED; + CSSMeasureMode heightMeasureMode = CSSMeasureMode.UNDEFINED; + + if (!Float.isNaN(availableWidth)) { + widthMeasureMode = CSSMeasureMode.EXACTLY; + } else if (node.style.dimensions[DIMENSION_WIDTH] >= 0.0) { float marginAxisRow = (node.style.margin.getWithFallback(leadingSpacing[CSS_FLEX_DIRECTION_ROW], leading[CSS_FLEX_DIRECTION_ROW]) + node.style.margin.getWithFallback(trailingSpacing[CSS_FLEX_DIRECTION_ROW], trailing[CSS_FLEX_DIRECTION_ROW])); availableWidth = node.style.dimensions[DIMENSION_WIDTH] + marginAxisRow; - } - if (Float.isNaN(availableHeight) && node.style.dimensions[DIMENSION_HEIGHT] >= 0.0) { - float marginAxisColumn = (node.style.margin.getWithFallback(leadingSpacing[CSS_FLEX_DIRECTION_COLUMN], leading[CSS_FLEX_DIRECTION_COLUMN]) + node.style.margin.getWithFallback(trailingSpacing[CSS_FLEX_DIRECTION_COLUMN], trailing[CSS_FLEX_DIRECTION_COLUMN])); - availableHeight = node.style.dimensions[DIMENSION_HEIGHT] + marginAxisColumn; + widthMeasureMode = CSSMeasureMode.EXACTLY; + } else if (node.style.maxWidth >= 0.0) { + availableWidth = node.style.maxWidth; + widthMeasureMode = CSSMeasureMode.AT_MOST; } - CSSMeasureMode widthMeasureMode = Float.isNaN(availableWidth) ? CSSMeasureMode.UNDEFINED : CSSMeasureMode.EXACTLY; - CSSMeasureMode heightMeasureMode = Float.isNaN(availableHeight) ? CSSMeasureMode.UNDEFINED : CSSMeasureMode.EXACTLY; + if (!Float.isNaN(availableHeight)) { + heightMeasureMode = CSSMeasureMode.EXACTLY; + } else if (node.style.dimensions[DIMENSION_HEIGHT] >= 0.0) { + float marginAxisColumn = (node.style.margin.getWithFallback(leadingSpacing[CSS_FLEX_DIRECTION_COLUMN], leading[CSS_FLEX_DIRECTION_COLUMN]) + node.style.margin.getWithFallback(trailingSpacing[CSS_FLEX_DIRECTION_COLUMN], trailing[CSS_FLEX_DIRECTION_COLUMN])); + availableHeight = node.style.dimensions[DIMENSION_HEIGHT] + marginAxisColumn; + heightMeasureMode = CSSMeasureMode.EXACTLY; + } else if (node.style.maxHeight >= 0.0) { + availableHeight = node.style.maxHeight; + heightMeasureMode = CSSMeasureMode.AT_MOST; + } if (layoutNodeInternal(layoutContext, node, availableWidth, availableHeight, parentDirection, widthMeasureMode, heightMeasureMode, true, "initial")) { setPosition(node, node.layout.direction);