Avoid transfering cached layout information to java
Summary: Don't transfer layout outputs to java if the layout was cached as this means that it has already been transfered Reviewed By: astreet Differential Revision: D4716024 fbshipit-source-id: c30763a6fc7426d653c7a6ca129615cddb4140e9
This commit is contained in:
committed by
Facebook Github Bot
parent
249d010dad
commit
a14aeb27bb
@@ -24,6 +24,12 @@ static void YGTransferLayoutDirection(YGNodeRef node, alias_ref<jobject> javaNod
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void YGTransferLayoutOutputsRecursive(YGNodeRef root) {
|
static void YGTransferLayoutOutputsRecursive(YGNodeRef root) {
|
||||||
|
// If the node is using a cached layout it means we have already
|
||||||
|
// transfered it to java.
|
||||||
|
if (YGNodeIsUsingCachedLayout(root)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (auto obj = YGNodeJobject(root)->lockLocal()) {
|
if (auto obj = YGNodeJobject(root)->lockLocal()) {
|
||||||
static auto widthField = obj->getClass()->getField<jfloat>("mWidth");
|
static auto widthField = obj->getClass()->getField<jfloat>("mWidth");
|
||||||
static auto heightField = obj->getClass()->getField<jfloat>("mHeight");
|
static auto heightField = obj->getClass()->getField<jfloat>("mHeight");
|
||||||
|
13
yoga/Yoga.c
13
yoga/Yoga.c
@@ -459,6 +459,18 @@ void YGNodeCopyStyle(const YGNodeRef dstNode, const YGNodeRef srcNode) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int YGNodeRootGenerationCount(const YGNodeRef node) {
|
||||||
|
if (node->parent) {
|
||||||
|
return YGNodeRootGenerationCount(node->parent);
|
||||||
|
} else {
|
||||||
|
return node->layout.generationCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool YGNodeIsUsingCachedLayout(const YGNodeRef node) {
|
||||||
|
return node->layout.generationCount != YGNodeRootGenerationCount(node);
|
||||||
|
}
|
||||||
|
|
||||||
static inline float YGResolveFlexGrow(const YGNodeRef node) {
|
static inline float YGResolveFlexGrow(const YGNodeRef node) {
|
||||||
if (!YGFloatIsUndefined(node->style.flexGrow)) {
|
if (!YGFloatIsUndefined(node->style.flexGrow)) {
|
||||||
return node->style.flexGrow;
|
return node->style.flexGrow;
|
||||||
@@ -1811,6 +1823,7 @@ static void YGZeroOutLayoutRecursivly(const YGNodeRef node) {
|
|||||||
node->layout.cachedLayout.widthMeasureMode = YGMeasureModeExactly;
|
node->layout.cachedLayout.widthMeasureMode = YGMeasureModeExactly;
|
||||||
node->layout.cachedLayout.computedWidth = 0;
|
node->layout.cachedLayout.computedWidth = 0;
|
||||||
node->layout.cachedLayout.computedHeight = 0;
|
node->layout.cachedLayout.computedHeight = 0;
|
||||||
|
node->layout.generationCount = gCurrentGenerationCount;
|
||||||
const uint32_t childCount = YGNodeGetChildCount(node);
|
const uint32_t childCount = YGNodeGetChildCount(node);
|
||||||
for (uint32_t i = 0; i < childCount; i++) {
|
for (uint32_t i = 0; i < childCount; i++) {
|
||||||
const YGNodeRef child = YGNodeListGet(node->children, i);
|
const YGNodeRef child = YGNodeListGet(node->children, i);
|
||||||
|
@@ -218,6 +218,8 @@ YG_NODE_LAYOUT_EDGE_PROPERTY(float, Margin);
|
|||||||
YG_NODE_LAYOUT_EDGE_PROPERTY(float, Border);
|
YG_NODE_LAYOUT_EDGE_PROPERTY(float, Border);
|
||||||
YG_NODE_LAYOUT_EDGE_PROPERTY(float, Padding);
|
YG_NODE_LAYOUT_EDGE_PROPERTY(float, Padding);
|
||||||
|
|
||||||
|
bool YGNodeIsUsingCachedLayout(const YGNodeRef node);
|
||||||
|
|
||||||
WIN_EXPORT void YGSetLogger(YGLogger logger);
|
WIN_EXPORT void YGSetLogger(YGLogger logger);
|
||||||
WIN_EXPORT void YGLog(YGLogLevel level, const char *message, ...);
|
WIN_EXPORT void YGLog(YGLogLevel level, const char *message, ...);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user