From 5121fef5d8da8b68f0da6e18d5149f32ed8215d0 Mon Sep 17 00:00:00 2001 From: David Aurelio Date: Fri, 1 Feb 2019 03:31:12 -0800 Subject: [PATCH] Marker for baseline callbacks Summary: @public Wraps baseline callbacks with a marker. Reviewed By: SidharthGuglani Differential Revision: D13896861 fbshipit-source-id: 848ec697977a0a68b9943f1159f6562d54724f89 --- tests/InstrumentationTest.cpp | 18 ++++++++++++++++++ yoga/YGMarker.h | 10 ++++++++-- yoga/Yoga.cpp | 4 +++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/tests/InstrumentationTest.cpp b/tests/InstrumentationTest.cpp index 07053bff..435aabc7 100644 --- a/tests/InstrumentationTest.cpp +++ b/tests/InstrumentationTest.cpp @@ -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(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"; } } diff --git a/yoga/YGMarker.h b/yoga/YGMarker.h index 385ee9cf..25362ff5 100644 --- a/yoga/YGMarker.h +++ b/yoga/YGMarker.h @@ -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 { } }; -template <> -struct MarkerData { +struct NoMarkerData { using type = YGMarkerNoData; static type*& get(YGMarkerData& d) { return d.noData; } }; +template <> +struct MarkerData : NoMarkerData {}; + +template <> +struct MarkerData : NoMarkerData {}; + } // namespace detail template diff --git a/yoga/Yoga.cpp b/yoga/Yoga.cpp index eac63d9c..3f65092b 100644 --- a/yoga/Yoga.cpp +++ b/yoga/Yoga.cpp @@ -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::wrap( + node, + node->getBaseline(), node, node->getLayout().measuredDimensions[YGDimensionWidth], node->getLayout().measuredDimensions[YGDimensionHeight]);