Use AT_MOST measurespec when onyl max dimension is defined

This commit is contained in:
Emil Sjolander
2016-07-02 11:22:57 +01:00
parent 383d8a6b3d
commit a1f36b53f5
5 changed files with 82 additions and 40 deletions

29
dist/css-layout.h vendored
View File

@@ -1989,17 +1989,28 @@ void layoutNode(css_node_t* node, float availableWidth, float availableHeight, c
// parameters don't change. // parameters don't change.
gCurrentGenerationCount++; gCurrentGenerationCount++;
// If the caller didn't specify a height/width, use the dimensions css_measure_mode_t widthMeasureMode = CSS_MEASURE_MODE_UNDEFINED;
// specified in the style. css_measure_mode_t heightMeasureMode = CSS_MEASURE_MODE_UNDEFINED;
if (isUndefined(availableWidth) && isStyleDimDefined(node, CSS_FLEX_DIRECTION_ROW)) {
availableWidth = node->style.dimensions[CSS_WIDTH] + getMarginAxis(node, CSS_FLEX_DIRECTION_ROW); if (!isUndefined(availableWidth)) {
} widthMeasureMode = CSS_MEASURE_MODE_EXACTLY;
if (isUndefined(availableHeight) && isStyleDimDefined(node, CSS_FLEX_DIRECTION_COLUMN)) { } else if (isStyleDimDefined(node, CSS_FLEX_DIRECTION_ROW)) {
availableHeight = node->style.dimensions[CSS_HEIGHT] + getMarginAxis(node, CSS_FLEX_DIRECTION_COLUMN); 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; if (!isUndefined(availableHeight)) {
css_measure_mode_t heightMeasureMode = isUndefined(availableHeight) ? CSS_MEASURE_MODE_UNDEFINED : CSS_MEASURE_MODE_EXACTLY; 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")) { if (layoutNodeInternal(node, availableWidth, availableHeight, parentDirection, widthMeasureMode, heightMeasureMode, true, "initial")) {

BIN
dist/css-layout.jar vendored

Binary file not shown.

View File

@@ -1783,17 +1783,28 @@ void layoutNode(css_node_t* node, float availableWidth, float availableHeight, c
// parameters don't change. // parameters don't change.
gCurrentGenerationCount++; gCurrentGenerationCount++;
// If the caller didn't specify a height/width, use the dimensions css_measure_mode_t widthMeasureMode = CSS_MEASURE_MODE_UNDEFINED;
// specified in the style. css_measure_mode_t heightMeasureMode = CSS_MEASURE_MODE_UNDEFINED;
if (isUndefined(availableWidth) && isStyleDimDefined(node, CSS_FLEX_DIRECTION_ROW)) {
availableWidth = node->style.dimensions[CSS_WIDTH] + getMarginAxis(node, CSS_FLEX_DIRECTION_ROW); if (!isUndefined(availableWidth)) {
} widthMeasureMode = CSS_MEASURE_MODE_EXACTLY;
if (isUndefined(availableHeight) && isStyleDimDefined(node, CSS_FLEX_DIRECTION_COLUMN)) { } else if (isStyleDimDefined(node, CSS_FLEX_DIRECTION_ROW)) {
availableHeight = node->style.dimensions[CSS_HEIGHT] + getMarginAxis(node, CSS_FLEX_DIRECTION_COLUMN); 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; if (!isUndefined(availableHeight)) {
css_measure_mode_t heightMeasureMode = isUndefined(availableHeight) ? CSS_MEASURE_MODE_UNDEFINED : CSS_MEASURE_MODE_EXACTLY; 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")) { if (layoutNodeInternal(node, availableWidth, availableHeight, parentDirection, widthMeasureMode, heightMeasureMode, true, "initial")) {

View File

@@ -260,21 +260,30 @@ namespace Facebook.CSSLayout
// parameters don't change. // parameters don't change.
layoutContext.currentGenerationCount++; layoutContext.currentGenerationCount++;
// If the caller didn't specify a height/width, use the dimensions CSSMeasureMode widthMeasureMode = CSSMeasureMode.Undefined;
// specified in the style. CSSMeasureMode heightMeasureMode = CSSMeasureMode.Undefined;
if (float.IsNaN(availableWidth) && node.style.dimensions[DIMENSION_WIDTH] >= 0.0)
{ if (!float.IsNaN(availableWidth)) {
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])); widthMeasureMode = CSSMeasureMode.Exactly;
availableWidth = node.style.dimensions[DIMENSION_WIDTH] + marginAxisRow; } 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]));
if (float.IsNaN(availableHeight) && node.style.dimensions[DIMENSION_HEIGHT] >= 0.0) availableWidth = node.style.dimensions[DIMENSION_WIDTH] + marginAxisRow;
{ widthMeasureMode = CSSMeasureMode.Exactly;
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])); } else if (node.style.maxWidth >= 0.0) {
availableHeight = node.style.dimensions[DIMENSION_HEIGHT] + marginAxisColumn; availableWidth = node.style.maxWidth;
widthMeasureMode = CSSMeasureMode.AtMost;
} }
CSSMeasureMode widthMeasureMode = float.IsNaN(availableWidth) ? CSSMeasureMode.Undefined : CSSMeasureMode.Exactly; if (!float.IsNaN(availableHeight)) {
CSSMeasureMode heightMeasureMode = float.IsNaN(availableHeight) ? CSSMeasureMode.Undefined : CSSMeasureMode.Exactly; 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")) if (layoutNodeInternal(layoutContext, node, availableWidth, availableHeight, parentDirection, widthMeasureMode, heightMeasureMode, true, "initial"))
{ {

View File

@@ -231,19 +231,30 @@ public class LayoutEngine {
// parameters don't change. // parameters don't change.
layoutContext.currentGenerationCount++; layoutContext.currentGenerationCount++;
// If the caller didn't specify a height/width, use the dimensions CSSMeasureMode widthMeasureMode = CSSMeasureMode.UNDEFINED;
// specified in the style. CSSMeasureMode heightMeasureMode = CSSMeasureMode.UNDEFINED;
if (Float.isNaN(availableWidth) && node.style.dimensions[DIMENSION_WIDTH] >= 0.0) {
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])); 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; availableWidth = node.style.dimensions[DIMENSION_WIDTH] + marginAxisRow;
} widthMeasureMode = CSSMeasureMode.EXACTLY;
if (Float.isNaN(availableHeight) && node.style.dimensions[DIMENSION_HEIGHT] >= 0.0) { } else if (node.style.maxWidth >= 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])); availableWidth = node.style.maxWidth;
availableHeight = node.style.dimensions[DIMENSION_HEIGHT] + marginAxisColumn; widthMeasureMode = CSSMeasureMode.AT_MOST;
} }
CSSMeasureMode widthMeasureMode = Float.isNaN(availableWidth) ? CSSMeasureMode.UNDEFINED : CSSMeasureMode.EXACTLY; if (!Float.isNaN(availableHeight)) {
CSSMeasureMode heightMeasureMode = Float.isNaN(availableHeight) ? CSSMeasureMode.UNDEFINED : CSSMeasureMode.EXACTLY; 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")) { if (layoutNodeInternal(layoutContext, node, availableWidth, availableHeight, parentDirection, widthMeasureMode, heightMeasureMode, true, "initial")) {
setPosition(node, node.layout.direction); setPosition(node, node.layout.direction);