float YGFloatMin(const float a, const float b) { if (!YGFloatIsUndefined(a) && !YGFloatIsUndefined(b)) { return fminf(a, b); } return YGFloatIsUndefined(a) ? b : a; }
bool YGValueEqual(const YGValue a, const YGValue b) { if (a.unit != b.unit) { return false; } if (a.unit == YGUnitUndefined || (YGFloatIsUndefined(a.value) && YGFloatIsUndefined(b.value))) { return true; } return fabs(a.value - b.value) < 0.0001f; }
float YGNode::resolveFlexShrink() { if (parent_ == nullptr) { return 0.0; } if (!YGFloatIsUndefined(style_.flexShrink)) { return style_.flexShrink; } if (!config_->useWebDefaults && !YGFloatIsUndefined(style_.flex) && style_.flex < 0.0f) { return -style_.flex; } return config_->useWebDefaults ? kWebDefaultFlexShrink : kDefaultFlexShrink; }
float YGNode::resolveFlexGrow() { // Root nodes flexGrow should always be 0 if (parent_ == nullptr) { return 0.0; } if (!YGFloatIsUndefined(style_.flexGrow)) { return style_.flexGrow; } if (!YGFloatIsUndefined(style_.flex) && style_.flex > 0.0f) { return style_.flex; } return kDefaultFlexGrow; }
YGValue YGNode::resolveFlexBasisPtr() const { YGValue flexBasis = style_.flexBasis; if (flexBasis.unit != YGUnitAuto && flexBasis.unit != YGUnitUndefined) { return flexBasis; } if (!YGFloatIsUndefined(style_.flex) && style_.flex > 0.0f) { return config_->useWebDefaults ? YGValueAuto : YGValueZero; } return YGValueAuto; }
bool YGLayout::operator==(YGLayout layout) const { bool isEqual = YGFloatArrayEqual(position, layout.position) && YGFloatArrayEqual(dimensions, layout.dimensions) && YGFloatArrayEqual(margin, layout.margin) && YGFloatArrayEqual(border, layout.border) && YGFloatArrayEqual(padding, layout.padding) && direction == layout.direction && hadOverflow == layout.hadOverflow && lastParentDirection == layout.lastParentDirection && nextCachedMeasurementsIndex == layout.nextCachedMeasurementsIndex && cachedLayout == layout.cachedLayout; for (uint32_t i = 0; i < YG_MAX_CACHED_RESULT_COUNT && isEqual; ++i) { isEqual = isEqual && cachedMeasurements[i] == layout.cachedMeasurements[i]; } if (!YGFloatIsUndefined(computedFlexBasis) || !YGFloatIsUndefined(layout.computedFlexBasis)) { isEqual = isEqual && (computedFlexBasis == layout.computedFlexBasis); } if (!YGFloatIsUndefined(measuredDimensions[0]) || !YGFloatIsUndefined(layout.measuredDimensions[0])) { isEqual = isEqual && (measuredDimensions[0] == layout.measuredDimensions[0]); } if (!YGFloatIsUndefined(measuredDimensions[1]) || !YGFloatIsUndefined(layout.measuredDimensions[1])) { isEqual = isEqual && (measuredDimensions[1] == layout.measuredDimensions[1]); } return isEqual; }
TEST(YogaTest, reset_layout_when_child_removed) { const YGNodeRef root = YGNodeNew(); const YGNodeRef root_child0 = YGNodeNew(); YGNodeStyleSetWidth(root_child0, 100); YGNodeStyleSetHeight(root_child0, 100); YGNodeInsertChild(root, root_child0, 0); YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); ASSERT_EQ(0, YGNodeLayoutGetLeft(root_child0)); ASSERT_EQ(0, YGNodeLayoutGetTop(root_child0)); ASSERT_EQ(100, YGNodeLayoutGetWidth(root_child0)); ASSERT_EQ(100, YGNodeLayoutGetHeight(root_child0)); YGNodeRemoveChild(root, root_child0); ASSERT_EQ(0, YGNodeLayoutGetLeft(root_child0)); ASSERT_EQ(0, YGNodeLayoutGetTop(root_child0)); ASSERT_TRUE(YGFloatIsUndefined(YGNodeLayoutGetWidth(root_child0))); ASSERT_TRUE(YGFloatIsUndefined(YGNodeLayoutGetHeight(root_child0))); YGNodeFreeRecursive(root); }
float YGFloatSanitize(const float& val) { return YGFloatIsUndefined(val) ? 0 : val; }
bool YGFloatsEqual(const float a, const float b) { if (!YGFloatIsUndefined(a) && !YGFloatIsUndefined(b)) { return fabs(a - b) < 0.0001f; } return YGFloatIsUndefined(a) && YGFloatIsUndefined(b); }
TEST(YogaTest, assert_default_values) { const YGNodeRef root = YGNodeNew(); ASSERT_EQ(0, YGNodeGetChildCount(root)); ASSERT_EQ(NULL, YGNodeGetChild(root, 1)); ASSERT_EQ(YGDirectionInherit, YGNodeStyleGetDirection(root)); ASSERT_EQ(YGFlexDirectionColumn, YGNodeStyleGetFlexDirection(root)); ASSERT_EQ(YGJustifyFlexStart, YGNodeStyleGetJustifyContent(root)); ASSERT_EQ(YGAlignFlexStart, YGNodeStyleGetAlignContent(root)); ASSERT_EQ(YGAlignStretch, YGNodeStyleGetAlignItems(root)); ASSERT_EQ(YGAlignAuto, YGNodeStyleGetAlignSelf(root)); ASSERT_EQ(YGPositionTypeRelative, YGNodeStyleGetPositionType(root)); ASSERT_EQ(YGWrapNoWrap, YGNodeStyleGetFlexWrap(root)); ASSERT_EQ(YGOverflowVisible, YGNodeStyleGetOverflow(root)); ASSERT_FLOAT_EQ(0, YGNodeStyleGetFlexGrow(root)); ASSERT_FLOAT_EQ(0, YGNodeStyleGetFlexShrink(root)); ASSERT_EQ(YGNodeStyleGetFlexBasis(root).unit, YGUnitAuto); ASSERT_EQ(YGNodeStyleGetPosition(root, YGEdgeLeft).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetPosition(root, YGEdgeTop).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetPosition(root, YGEdgeRight).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetPosition(root, YGEdgeBottom).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetPosition(root, YGEdgeStart).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetPosition(root, YGEdgeEnd).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetMargin(root, YGEdgeLeft).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetMargin(root, YGEdgeTop).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetMargin(root, YGEdgeRight).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetMargin(root, YGEdgeBottom).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetMargin(root, YGEdgeStart).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetMargin(root, YGEdgeEnd).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetPadding(root, YGEdgeLeft).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetPadding(root, YGEdgeTop).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetPadding(root, YGEdgeRight).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetPadding(root, YGEdgeBottom).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetPadding(root, YGEdgeStart).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetPadding(root, YGEdgeEnd).unit, YGUnitUndefined); ASSERT_TRUE(YGFloatIsUndefined(YGNodeStyleGetBorder(root, YGEdgeLeft))); ASSERT_TRUE(YGFloatIsUndefined(YGNodeStyleGetBorder(root, YGEdgeTop))); ASSERT_TRUE(YGFloatIsUndefined(YGNodeStyleGetBorder(root, YGEdgeRight))); ASSERT_TRUE(YGFloatIsUndefined(YGNodeStyleGetBorder(root, YGEdgeBottom))); ASSERT_TRUE(YGFloatIsUndefined(YGNodeStyleGetBorder(root, YGEdgeStart))); ASSERT_TRUE(YGFloatIsUndefined(YGNodeStyleGetBorder(root, YGEdgeEnd))); ASSERT_EQ(YGNodeStyleGetWidth(root).unit, YGUnitAuto); ASSERT_EQ(YGNodeStyleGetHeight(root).unit, YGUnitAuto); ASSERT_EQ(YGNodeStyleGetMinWidth(root).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetMinHeight(root).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetMaxWidth(root).unit, YGUnitUndefined); ASSERT_EQ(YGNodeStyleGetMaxHeight(root).unit, YGUnitUndefined); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root)); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root)); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetRight(root)); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetBottom(root)); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetMargin(root, YGEdgeLeft)); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetMargin(root, YGEdgeTop)); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetMargin(root, YGEdgeRight)); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetMargin(root, YGEdgeBottom)); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetPadding(root, YGEdgeLeft)); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetPadding(root, YGEdgeTop)); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetPadding(root, YGEdgeRight)); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetPadding(root, YGEdgeBottom)); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetBorder(root, YGEdgeLeft)); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetBorder(root, YGEdgeTop)); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetBorder(root, YGEdgeRight)); ASSERT_FLOAT_EQ(0, YGNodeLayoutGetBorder(root, YGEdgeBottom)); ASSERT_TRUE(YGFloatIsUndefined(YGNodeLayoutGetWidth(root))); ASSERT_TRUE(YGFloatIsUndefined(YGNodeLayoutGetHeight(root))); ASSERT_EQ(YGDirectionInherit, YGNodeLayoutGetDirection(root)); YGNodeFreeRecursive(root); }