Marker for baseline callbacks

Summary:
@public

Wraps baseline callbacks with a marker.

Reviewed By: SidharthGuglani

Differential Revision: D13896861

fbshipit-source-id: 848ec697977a0a68b9943f1159f6562d54724f89
This commit is contained in:
David Aurelio
2019-02-01 03:31:12 -08:00
committed by Facebook Github Bot
parent 0d026bd1a0
commit 5121fef5d8
3 changed files with 29 additions and 3 deletions

View File

@@ -211,6 +211,21 @@ TEST_F(MarkerTest, measure_functions_get_wrapped) {
<< "have " << markerCookies.size() << " recorded markers";
}
TEST_F(MarkerTest, baseline_functions_get_wrapped) {
auto root = makeNode();
auto child = addChild(root);
YGNodeSetBaselineFunc(
child.get(), [](YGNodeRef, float, float) { return 0.0f; });
YGNodeStyleSetFlexDirection(root.get(), YGFlexDirectionRow);
YGNodeStyleSetAlignItems(root.get(), YGAlignBaseline);
calculateLayout(root);
auto& markerCookie = findLastMarker(YGMarkerBaselineFn);
ASSERT_EQ(markerCookie.start.marker, YGMarkerBaselineFn)
<< "have " << markerCookies.size() << " recorded markers";
}
void* MarkerTest::startMarker(
YGMarker marker,
YGNodeRef node,
@@ -233,6 +248,7 @@ void MarkerTest::endMarker(
cookie->end.markerData.layout = *marker::data<YGMarkerLayout>(data);
break;
case YGMarkerMeasure:
case YGMarkerBaselineFn:
break;
};
}
@@ -263,6 +279,8 @@ const char* markerTypeName(YGMarker type) {
return "YGMarkerLayout";
case YGMarkerMeasure:
return "YGMarkerMeasure";
case YGMarkerBaselineFn:
return "YGMarkerBaselineFn";
}
}

View File

@@ -16,6 +16,7 @@ typedef struct YGConfig* YGConfigRef;
typedef YG_ENUM_BEGIN(YGMarker){
YGMarkerLayout,
YGMarkerMeasure,
YGMarkerBaselineFn,
} YG_ENUM_END(YGMarker);
typedef struct {
@@ -66,14 +67,19 @@ struct MarkerData<YGMarkerLayout> {
}
};
template <>
struct MarkerData<YGMarkerMeasure> {
struct NoMarkerData {
using type = YGMarkerNoData;
static type*& get(YGMarkerData& d) {
return d.noData;
}
};
template <>
struct MarkerData<YGMarkerMeasure> : NoMarkerData {};
template <>
struct MarkerData<YGMarkerBaselineFn> : NoMarkerData {};
} // namespace detail
template <YGMarker M>

View File

@@ -1074,7 +1074,9 @@ static inline YGAlign YGNodeAlignItem(
static float YGBaseline(const YGNodeRef node) {
if (node->getBaseline() != nullptr) {
const float baseline = node->getBaseline()(
const float baseline = marker::MarkerSection<YGMarkerBaselineFn>::wrap(
node,
node->getBaseline(),
node,
node->getLayout().measuredDimensions[YGDimensionWidth],
node->getLayout().measuredDimensions[YGDimensionHeight]);