diff --git a/java/com/facebook/yoga/YogaLayoutType.java b/java/com/facebook/yoga/YogaLayoutType.java new file mode 100644 index 00000000..b747439f --- /dev/null +++ b/java/com/facebook/yoga/YogaLayoutType.java @@ -0,0 +1,34 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the LICENSE + * file in the root directory of this source tree. + */ +package com.facebook.yoga; + +public enum YogaLayoutType { + LAYOUT(0), + MEASURE(1), + CACHED_LAYOUT(2), + CACHED_MEASURE(3); + + private final int mIntValue; + + YogaLayoutType(int intValue) { + mIntValue = intValue; + } + + public int intValue() { + return mIntValue; + } + + public static YogaLayoutType fromInt(int value) { + switch (value) { + case 0: return LAYOUT; + case 1: return MEASURE; + case 2: return CACHED_LAYOUT; + case 3: return CACHED_MEASURE; + default: throw new IllegalArgumentException("Unknown enum value: " + value); + } + } +} diff --git a/yoga/Yoga.cpp b/yoga/Yoga.cpp index cfcadf57..375668b7 100644 --- a/yoga/Yoga.cpp +++ b/yoga/Yoga.cpp @@ -3928,7 +3928,16 @@ bool YGLayoutNodeInternal( layout->generationCount = gCurrentGenerationCount; #ifdef YG_ENABLE_EVENTS - Event::publish(node, {performLayout, layoutContext}); + LayoutType layoutType; + if (performLayout) { + layoutType = !needToVisitNode && cachedResults == &layout->cachedLayout + ? LayoutType::kCachedLayout + : LayoutType::kLayout; + } else { + layoutType = cachedResults != nullptr ? LayoutType::kCachedMeasure + : LayoutType::kMeasure; + } + Event::publish(node, {layoutType, layoutContext}); #endif return (needToVisitNode || cachedResults == nullptr); diff --git a/yoga/event/event.h b/yoga/event/event.h index 58e5e541..4179e9be 100644 --- a/yoga/event/event.h +++ b/yoga/event/event.h @@ -17,6 +17,13 @@ struct YGNode; namespace facebook { namespace yoga { +enum LayoutType : int { + kLayout = 0, + kMeasure = 1, + kCachedLayout = 2, + kCachedMeasure = 3 +}; + struct Event { enum Type { NodeAllocation, @@ -99,7 +106,7 @@ struct Event::TypedData { template <> struct Event::TypedData { - bool performLayout; + LayoutType layoutType; void* layoutContext; };