diff --git a/benchmark/Benchmark.cpp b/benchmark/Benchmark.cpp index c0ae3690..787d3486 100644 --- a/benchmark/Benchmark.cpp +++ b/benchmark/Benchmark.cpp @@ -229,9 +229,14 @@ BenchmarkResult generateBenchmark(const std::filesystem::path& capturePath) { YogaNodeAndConfig root = buildTreeFromJson(capture, nullptr, 0 /*index*/); auto treeCreationEnd = steady_clock::now(); + json layoutInputs = capture["layout-inputs"]; + float availableWidth = layoutInputs["available-width"]; + float availableHeight = layoutInputs["available-height"]; + YGDirection direction = directionFromString(layoutInputs["owner-direction"]); + auto layoutBegin = steady_clock::now(); YGNodeCalculateLayout( - root.node_.get(), YGUndefined, YGUndefined, YGDirectionLTR); + root.node_.get(), availableWidth, availableHeight, direction); auto layoutEnd = steady_clock::now(); return BenchmarkResult{ diff --git a/benchmark/TreeDeserialization.h b/benchmark/TreeDeserialization.h index 1c6f3951..842d4bb5 100644 --- a/benchmark/TreeDeserialization.h +++ b/benchmark/TreeDeserialization.h @@ -191,4 +191,16 @@ inline std::string edgeStringFromPropertyName( std::string propertyName) { return it.key().substr(propertyName.length() + 1); } + +inline YGDirection directionFromString(std::string str) { + if (str == "ltr") { + return YGDirectionLTR; + } else if (str == "rtl") { + return YGDirectionRTL; + } else if (str == "inherit") { + return YGDirectionInherit; + } else { + throw std::invalid_argument(invalidArgumentMessage(str, "YGDirection")); + } +} } // namespace facebook::yoga diff --git a/capture/CaptureTree.cpp b/capture/CaptureTree.cpp index 67e3993f..a1a1a29f 100644 --- a/capture/CaptureTree.cpp +++ b/capture/CaptureTree.cpp @@ -9,18 +9,34 @@ #include #include +#include namespace facebook::yoga { -void captureTree(YGNodeRef node, const std::filesystem::path& path) { - std::string str; - nodeToString( - str, +using namespace nlohmann; + +static void captureTree( + std::string_view serializedTree, + const std::filesystem::path& path) { + std::ofstream file(path); + file << serializedTree; +} + +void YGNodeCalculateLayoutWithCapture( + YGNodeRef node, + float availableWidth, + float availableHeight, + YGDirection ownerDirection, + const std::filesystem::path& path) { + json j; + serializeLayoutInputs(j, availableWidth, availableHeight, ownerDirection); + serializeTree( + j, node, PrintOptions::Style | PrintOptions::Children | PrintOptions::Config | PrintOptions::Node); - std::ofstream file(path); - file << str; + captureTree(j.dump(2), path); + YGNodeCalculateLayout(node, availableWidth, availableHeight, ownerDirection); } } // namespace facebook::yoga diff --git a/capture/CaptureTree.h b/capture/CaptureTree.h index 5d809859..c12d3c78 100644 --- a/capture/CaptureTree.h +++ b/capture/CaptureTree.h @@ -13,6 +13,11 @@ namespace facebook::yoga { -void captureTree(YGNodeRef node, const std::filesystem::path& path); +void YGNodeCalculateLayoutWithCapture( + YGNodeRef node, + float availableWidth, + float availableHeight, + YGDirection ownerDirection, + const std::filesystem::path& path); } // namespace facebook::yoga diff --git a/capture/NodeToString.cpp b/capture/NodeToString.cpp index a44c8383..675b7e37 100644 --- a/capture/NodeToString.cpp +++ b/capture/NodeToString.cpp @@ -8,7 +8,6 @@ #include #include -#include namespace facebook::yoga { @@ -121,7 +120,7 @@ YGValue borderFloatToYGValue(YGNodeRef node, YGEdge edge) { return YGValue{val, unit}; } -static void nodeToStringImpl(json& j, YGNodeRef node, PrintOptions options) { +void serializeTree(json& j, YGNodeRef node, PrintOptions options) { if ((options & PrintOptions::Layout) == PrintOptions::Layout) { j["layout"]["width"] = YGNodeStyleGetWidth(node).value; j["layout"]["height"] = YGNodeStyleGetHeight(node).value; @@ -303,15 +302,21 @@ static void nodeToStringImpl(json& j, YGNodeRef node, PrintOptions options) { childCount > 0) { for (size_t i = 0; i < childCount; i++) { j["children"].push_back({}); - nodeToStringImpl(j["children"][i], YGNodeGetChild(node, i), options); + serializeTree(j["children"][i], YGNodeGetChild(node, i), options); } } } -void nodeToString(std::string& str, YGNodeRef node, PrintOptions options) { - json j; - nodeToStringImpl(j, node, options); - str = j.dump(2); +void serializeLayoutInputs( + json& j, + float availableWidth, + float availableHeight, + YGDirection ownerDirection) { + j["layout-inputs"] = { + {"available-width", availableWidth}, + {"available-height", availableHeight}, + {"owner-direction", YGDirectionToString(ownerDirection)}, + }; } } // namespace facebook::yoga diff --git a/capture/NodeToString.h b/capture/NodeToString.h index 95afd18b..b1ceb62b 100644 --- a/capture/NodeToString.h +++ b/capture/NodeToString.h @@ -9,6 +9,7 @@ #include +#include #include namespace facebook::yoga { @@ -22,6 +23,12 @@ enum class PrintOptions : uint8_t { }; YG_DEFINE_ENUM_FLAG_OPERATORS(PrintOptions); -void nodeToString(std::string& str, YGNodeRef node, PrintOptions options); +void serializeTree(nlohmann::json& j, YGNodeRef root, PrintOptions options); + +void serializeLayoutInputs( + nlohmann::json& j, + float availableWidth, + float availableHeight, + YGDirection ownerDirection); } // namespace facebook::yoga