Skip to content

Commit

Permalink
Fix text node rounding with fractional dimensions matching the roundi…
Browse files Browse the repository at this point in the history
…ng factor

Summary:
If we have a fractional measure output which matches the subpixel rounding factor, we still should round both dimension into the same direction.

Fixes #580.
Closes #583

Reviewed By: marco-cova

Differential Revision: D5274212

Pulled By: emilsjolander

fbshipit-source-id: 1febf9194210437ab77f91319d10d4da9b284b79
  • Loading branch information
woehrl01 authored and facebook-github-bot committed Jul 4, 2017
1 parent ce3f999 commit 24e2fc9
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 3 deletions.
34 changes: 33 additions & 1 deletion tests/YGRoundingMeasureFuncTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,17 @@ static YGSize _measureCeil(YGNodeRef node,
float height,
YGMeasureMode heightMode) {
return YGSize{
width = 10.5, height = 10.5,
width = 10.5f, height = 10.5f,
};
}

static YGSize _measureFractial(YGNodeRef node,
float width,
YGMeasureMode widthMode,
float height,
YGMeasureMode heightMode) {
return YGSize{
width = 0.5f, height = 0.5f,
};
}

Expand Down Expand Up @@ -97,3 +107,25 @@ TEST(YogaTest, rounding_feature_with_custom_measure_func_ceil) {

YGConfigFree(config);
}

TEST(YogaTest, rounding_feature_with_custom_measure_and_fractial_matching_scale) {
const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNewWithConfig(config);

const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetPosition(root_child0, YGEdgeLeft, 73.625);
YGNodeSetMeasureFunc(root_child0, _measureFractial);
YGNodeInsertChild(root, root_child0, 0);

YGConfigSetPointScaleFactor(config, 2.0f);

YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);

ASSERT_FLOAT_EQ(0.5, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(0.5, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(73.5, YGNodeLayoutGetLeft(root_child0));

YGNodeFreeRecursive(root);

YGConfigFree(config);
}
4 changes: 2 additions & 2 deletions yoga/Yoga.c
Original file line number Diff line number Diff line change
Expand Up @@ -3471,8 +3471,8 @@ static void YGRoundToPixelGrid(const YGNodeRef node,
node->layout.position[YGEdgeTop] =
YGRoundValueToPixelGrid(nodeTop, pointScaleFactor, false, textRounding);

const bool hasFractionalWidth = !YGFloatsEqual(fmodf(nodeWidth, 1.0), 0);
const bool hasFractionalHeight = !YGFloatsEqual(fmodf(nodeHeight, 1.0), 0);
const bool hasFractionalWidth = !YGFloatsEqual(fmodf(nodeWidth, 1 / pointScaleFactor), 0);
const bool hasFractionalHeight = !YGFloatsEqual(fmodf(nodeHeight, 1 / pointScaleFactor), 0);

node->layout.dimensions[YGDimensionWidth] =
YGRoundValueToPixelGrid(
Expand Down

0 comments on commit 24e2fc9

Please sign in to comment.