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:
Emil Sjolander
2017-03-17 09:07:24 -07:00
committed by Facebook Github Bot
parent 249d010dad
commit a14aeb27bb
3 changed files with 21 additions and 0 deletions

View File

@@ -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");

View File

@@ -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);

View File

@@ -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, ...);