diff --git a/tests/YGRoundingFunctionTest.cpp b/tests/YGRoundingFunctionTest.cpp index 55b5e86d..47efcbc4 100644 --- a/tests/YGRoundingFunctionTest.cpp +++ b/tests/YGRoundingFunctionTest.cpp @@ -161,3 +161,23 @@ TEST(YogaTest, per_node_point_scale_factor) { YGConfigFree(config2); YGConfigFree(config3); } + +TEST(YogaTest, raw_layout_dimensions) { + YGConfigRef config = YGConfigNew(); + YGConfigSetPointScaleFactor(config, 0.5f); + + YGNodeRef root = YGNodeNewWithConfig(config); + YGNodeStyleSetWidth(root, 11.5f); + YGNodeStyleSetHeight(root, 9.5f); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_EQ(YGNodeLayoutGetWidth(root), 12.0f); + ASSERT_EQ(YGNodeLayoutGetHeight(root), 10.0f); + ASSERT_EQ(YGNodeLayoutGetRawWidth(root), 11.5f); + ASSERT_EQ(YGNodeLayoutGetRawHeight(root), 9.5f); + + YGNodeFreeRecursive(root); + + YGConfigFree(config); +} diff --git a/yoga/YGNodeLayout.cpp b/yoga/YGNodeLayout.cpp index 93fcf0ad..50c8766e 100644 --- a/yoga/YGNodeLayout.cpp +++ b/yoga/YGNodeLayout.cpp @@ -90,3 +90,11 @@ float YGNodeLayoutGetPadding(YGNodeConstRef node, YGEdge edge) { return getResolvedLayoutProperty<&LayoutResults::padding>( node, scopedEnum(edge)); } + +float YGNodeLayoutGetRawHeight(YGNodeConstRef node) { + return resolveRef(node)->getLayout().rawDimension(Dimension::Height); +} + +float YGNodeLayoutGetRawWidth(YGNodeConstRef node) { + return resolveRef(node)->getLayout().rawDimension(Dimension::Width); +} diff --git a/yoga/YGNodeLayout.h b/yoga/YGNodeLayout.h index 02ead588..4f25af21 100644 --- a/yoga/YGNodeLayout.h +++ b/yoga/YGNodeLayout.h @@ -32,4 +32,14 @@ YG_EXPORT float YGNodeLayoutGetMargin(YGNodeConstRef node, YGEdge edge); YG_EXPORT float YGNodeLayoutGetBorder(YGNodeConstRef node, YGEdge edge); YG_EXPORT float YGNodeLayoutGetPadding(YGNodeConstRef node, YGEdge edge); +/** + * Return the measured height of the node, before layout rounding + */ +YG_EXPORT float YGNodeLayoutGetRawHeight(YGNodeConstRef node); + +/** + * Return the measured width of the node, before layout rounding + */ +YG_EXPORT float YGNodeLayoutGetRawWidth(YGNodeConstRef node); + YG_EXTERN_C_END diff --git a/yoga/algorithm/PixelGrid.cpp b/yoga/algorithm/PixelGrid.cpp index 6083f0f2..61de2be2 100644 --- a/yoga/algorithm/PixelGrid.cpp +++ b/yoga/algorithm/PixelGrid.cpp @@ -106,25 +106,25 @@ void roundLayoutResultsToPixelGrid( const bool hasFractionalHeight = !yoga::inexactEquals(round(scaledNodeHeight), scaledNodeHeight); - node->setLayoutDimension( + node->getLayout().setDimension( + Dimension::Width, roundValueToPixelGrid( absoluteNodeRight, pointScaleFactor, (textRounding && hasFractionalWidth), (textRounding && !hasFractionalWidth)) - roundValueToPixelGrid( - absoluteNodeLeft, pointScaleFactor, false, textRounding), - Dimension::Width); + absoluteNodeLeft, pointScaleFactor, false, textRounding)); - node->setLayoutDimension( + node->getLayout().setDimension( + Dimension::Height, roundValueToPixelGrid( absoluteNodeBottom, pointScaleFactor, (textRounding && hasFractionalHeight), (textRounding && !hasFractionalHeight)) - roundValueToPixelGrid( - absoluteNodeTop, pointScaleFactor, false, textRounding), - Dimension::Height); + absoluteNodeTop, pointScaleFactor, false, textRounding)); } for (yoga::Node* child : node->getChildren()) { diff --git a/yoga/node/LayoutResults.h b/yoga/node/LayoutResults.h index 9f0aeaf7..6776a423 100644 --- a/yoga/node/LayoutResults.h +++ b/yoga/node/LayoutResults.h @@ -66,10 +66,18 @@ struct LayoutResults { return measuredDimensions_[yoga::to_underlying(axis)]; } + float rawDimension(Dimension axis) const { + return rawDimensions_[yoga::to_underlying(axis)]; + } + void setMeasuredDimension(Dimension axis, float dimension) { measuredDimensions_[yoga::to_underlying(axis)] = dimension; } + void setRawDimension(Dimension axis, float dimension) { + rawDimensions_[yoga::to_underlying(axis)] = dimension; + } + float position(PhysicalEdge physicalEdge) const { return position_[yoga::to_underlying(physicalEdge)]; } @@ -113,6 +121,7 @@ struct LayoutResults { std::array dimensions_ = {{YGUndefined, YGUndefined}}; std::array measuredDimensions_ = {{YGUndefined, YGUndefined}}; + std::array rawDimensions_ = {{YGUndefined, YGUndefined}}; std::array position_ = {}; std::array margin_ = {}; std::array border_ = {}; diff --git a/yoga/node/Node.cpp b/yoga/node/Node.cpp index dce42fb1..fbdf5c1b 100644 --- a/yoga/node/Node.cpp +++ b/yoga/node/Node.cpp @@ -247,6 +247,7 @@ void Node::setLayoutHadOverflow(bool hadOverflow) { void Node::setLayoutDimension(float lengthValue, Dimension dimension) { layout_.setDimension(dimension, lengthValue); + layout_.setRawDimension(dimension, lengthValue); } // If both left and right are defined, then use left. Otherwise return +left or