Skip to content

Commit 528bbac

Browse files
Expose a function which marks all descendants dirty
Reviewed By: emilsjolander Differential Revision: D6911869 fbshipit-source-id: e0a3abcf5653f921297edfdca473d83b947cc627
1 parent af0c863 commit 528bbac

File tree

4 files changed

+104
-84
lines changed

4 files changed

+104
-84
lines changed

ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java

+9-5
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,11 @@
99

1010
package com.facebook.yoga;
1111

12-
import javax.annotation.Nullable;
13-
14-
import java.util.List;
15-
import java.util.ArrayList;
16-
1712
import com.facebook.proguard.annotations.DoNotStrip;
1813
import com.facebook.soloader.SoLoader;
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
import javax.annotation.Nullable;
1917

2018
@DoNotStrip
2119
public class YogaNode {
@@ -195,6 +193,12 @@ public void dirty() {
195193
jni_YGNodeMarkDirty(mNativePointer);
196194
}
197195

196+
private native void jni_YGNodeMarkDirtyAndPropogateToDescendants(long nativePointer);
197+
198+
public void dirtyAllDescendants() {
199+
jni_YGNodeMarkDirtyAndPropogateToDescendants(mNativePointer);
200+
}
201+
198202
private native boolean jni_YGNodeIsDirty(long nativePointer);
199203
public boolean isDirty() {
200204
return jni_YGNodeIsDirty(mNativePointer);

ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNI.cpp

+87-79
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,12 @@ void jni_YGNodeMarkDirty(alias_ref<jobject>, jlong nativePointer) {
251251
YGNodeMarkDirty(_jlong2YGNodeRef(nativePointer));
252252
}
253253

254+
void jni_YGNodeMarkDirtyAndPropogateToDescendants(
255+
alias_ref<jobject>,
256+
jlong nativePointer) {
257+
YGNodeMarkDirtyAndPropogateToDescendants(_jlong2YGNodeRef(nativePointer));
258+
}
259+
254260
jboolean jni_YGNodeIsDirty(alias_ref<jobject>, jlong nativePointer) {
255261
return (jboolean)_jlong2YGNodeRef(nativePointer)->isDirty();
256262
}
@@ -449,85 +455,87 @@ jint jni_YGNodeGetInstanceCount(alias_ref<jclass> clazz) {
449455

450456
jint JNI_OnLoad(JavaVM *vm, void *) {
451457
return initialize(vm, [] {
452-
registerNatives("com/facebook/yoga/YogaNode",
453-
{
454-
YGMakeNativeMethod(jni_YGNodeNew),
455-
YGMakeNativeMethod(jni_YGNodeNewWithConfig),
456-
YGMakeNativeMethod(jni_YGNodeFree),
457-
YGMakeNativeMethod(jni_YGNodeReset),
458-
YGMakeNativeMethod(jni_YGNodeInsertChild),
459-
YGMakeNativeMethod(jni_YGNodeRemoveChild),
460-
YGMakeNativeMethod(jni_YGNodeCalculateLayout),
461-
YGMakeNativeMethod(jni_YGNodeMarkDirty),
462-
YGMakeNativeMethod(jni_YGNodeIsDirty),
463-
YGMakeNativeMethod(jni_YGNodeSetHasMeasureFunc),
464-
YGMakeNativeMethod(jni_YGNodeSetHasBaselineFunc),
465-
YGMakeNativeMethod(jni_YGNodeCopyStyle),
466-
YGMakeNativeMethod(jni_YGNodeStyleGetDirection),
467-
YGMakeNativeMethod(jni_YGNodeStyleSetDirection),
468-
YGMakeNativeMethod(jni_YGNodeStyleGetFlexDirection),
469-
YGMakeNativeMethod(jni_YGNodeStyleSetFlexDirection),
470-
YGMakeNativeMethod(jni_YGNodeStyleGetJustifyContent),
471-
YGMakeNativeMethod(jni_YGNodeStyleSetJustifyContent),
472-
YGMakeNativeMethod(jni_YGNodeStyleGetAlignItems),
473-
YGMakeNativeMethod(jni_YGNodeStyleSetAlignItems),
474-
YGMakeNativeMethod(jni_YGNodeStyleGetAlignSelf),
475-
YGMakeNativeMethod(jni_YGNodeStyleSetAlignSelf),
476-
YGMakeNativeMethod(jni_YGNodeStyleGetAlignContent),
477-
YGMakeNativeMethod(jni_YGNodeStyleSetAlignContent),
478-
YGMakeNativeMethod(jni_YGNodeStyleGetPositionType),
479-
YGMakeNativeMethod(jni_YGNodeStyleSetPositionType),
480-
YGMakeNativeMethod(jni_YGNodeStyleSetFlexWrap),
481-
YGMakeNativeMethod(jni_YGNodeStyleGetOverflow),
482-
YGMakeNativeMethod(jni_YGNodeStyleSetOverflow),
483-
YGMakeNativeMethod(jni_YGNodeStyleGetDisplay),
484-
YGMakeNativeMethod(jni_YGNodeStyleSetDisplay),
485-
YGMakeNativeMethod(jni_YGNodeStyleSetFlex),
486-
YGMakeNativeMethod(jni_YGNodeStyleGetFlexGrow),
487-
YGMakeNativeMethod(jni_YGNodeStyleSetFlexGrow),
488-
YGMakeNativeMethod(jni_YGNodeStyleGetFlexShrink),
489-
YGMakeNativeMethod(jni_YGNodeStyleSetFlexShrink),
490-
YGMakeNativeMethod(jni_YGNodeStyleGetFlexBasis),
491-
YGMakeNativeMethod(jni_YGNodeStyleSetFlexBasis),
492-
YGMakeNativeMethod(jni_YGNodeStyleSetFlexBasisPercent),
493-
YGMakeNativeMethod(jni_YGNodeStyleSetFlexBasisAuto),
494-
YGMakeNativeMethod(jni_YGNodeStyleGetMargin),
495-
YGMakeNativeMethod(jni_YGNodeStyleSetMargin),
496-
YGMakeNativeMethod(jni_YGNodeStyleSetMarginPercent),
497-
YGMakeNativeMethod(jni_YGNodeStyleSetMarginAuto),
498-
YGMakeNativeMethod(jni_YGNodeStyleGetPadding),
499-
YGMakeNativeMethod(jni_YGNodeStyleSetPadding),
500-
YGMakeNativeMethod(jni_YGNodeStyleSetPaddingPercent),
501-
YGMakeNativeMethod(jni_YGNodeStyleGetBorder),
502-
YGMakeNativeMethod(jni_YGNodeStyleSetBorder),
503-
YGMakeNativeMethod(jni_YGNodeStyleGetPosition),
504-
YGMakeNativeMethod(jni_YGNodeStyleSetPosition),
505-
YGMakeNativeMethod(jni_YGNodeStyleSetPositionPercent),
506-
YGMakeNativeMethod(jni_YGNodeStyleGetWidth),
507-
YGMakeNativeMethod(jni_YGNodeStyleSetWidth),
508-
YGMakeNativeMethod(jni_YGNodeStyleSetWidthPercent),
509-
YGMakeNativeMethod(jni_YGNodeStyleSetWidthAuto),
510-
YGMakeNativeMethod(jni_YGNodeStyleGetHeight),
511-
YGMakeNativeMethod(jni_YGNodeStyleSetHeight),
512-
YGMakeNativeMethod(jni_YGNodeStyleSetHeightPercent),
513-
YGMakeNativeMethod(jni_YGNodeStyleSetHeightAuto),
514-
YGMakeNativeMethod(jni_YGNodeStyleGetMinWidth),
515-
YGMakeNativeMethod(jni_YGNodeStyleSetMinWidth),
516-
YGMakeNativeMethod(jni_YGNodeStyleSetMinWidthPercent),
517-
YGMakeNativeMethod(jni_YGNodeStyleGetMinHeight),
518-
YGMakeNativeMethod(jni_YGNodeStyleSetMinHeight),
519-
YGMakeNativeMethod(jni_YGNodeStyleSetMinHeightPercent),
520-
YGMakeNativeMethod(jni_YGNodeStyleGetMaxWidth),
521-
YGMakeNativeMethod(jni_YGNodeStyleSetMaxWidth),
522-
YGMakeNativeMethod(jni_YGNodeStyleSetMaxWidthPercent),
523-
YGMakeNativeMethod(jni_YGNodeStyleGetMaxHeight),
524-
YGMakeNativeMethod(jni_YGNodeStyleSetMaxHeight),
525-
YGMakeNativeMethod(jni_YGNodeStyleSetMaxHeightPercent),
526-
YGMakeNativeMethod(jni_YGNodeStyleGetAspectRatio),
527-
YGMakeNativeMethod(jni_YGNodeStyleSetAspectRatio),
528-
YGMakeNativeMethod(jni_YGNodeGetInstanceCount),
529-
YGMakeNativeMethod(jni_YGNodePrint),
530-
});
458+
registerNatives(
459+
"com/facebook/yoga/YogaNode",
460+
{
461+
YGMakeNativeMethod(jni_YGNodeNew),
462+
YGMakeNativeMethod(jni_YGNodeNewWithConfig),
463+
YGMakeNativeMethod(jni_YGNodeFree),
464+
YGMakeNativeMethod(jni_YGNodeReset),
465+
YGMakeNativeMethod(jni_YGNodeInsertChild),
466+
YGMakeNativeMethod(jni_YGNodeRemoveChild),
467+
YGMakeNativeMethod(jni_YGNodeCalculateLayout),
468+
YGMakeNativeMethod(jni_YGNodeMarkDirty),
469+
YGMakeNativeMethod(jni_YGNodeMarkDirtyAndPropogateToDescendants),
470+
YGMakeNativeMethod(jni_YGNodeIsDirty),
471+
YGMakeNativeMethod(jni_YGNodeSetHasMeasureFunc),
472+
YGMakeNativeMethod(jni_YGNodeSetHasBaselineFunc),
473+
YGMakeNativeMethod(jni_YGNodeCopyStyle),
474+
YGMakeNativeMethod(jni_YGNodeStyleGetDirection),
475+
YGMakeNativeMethod(jni_YGNodeStyleSetDirection),
476+
YGMakeNativeMethod(jni_YGNodeStyleGetFlexDirection),
477+
YGMakeNativeMethod(jni_YGNodeStyleSetFlexDirection),
478+
YGMakeNativeMethod(jni_YGNodeStyleGetJustifyContent),
479+
YGMakeNativeMethod(jni_YGNodeStyleSetJustifyContent),
480+
YGMakeNativeMethod(jni_YGNodeStyleGetAlignItems),
481+
YGMakeNativeMethod(jni_YGNodeStyleSetAlignItems),
482+
YGMakeNativeMethod(jni_YGNodeStyleGetAlignSelf),
483+
YGMakeNativeMethod(jni_YGNodeStyleSetAlignSelf),
484+
YGMakeNativeMethod(jni_YGNodeStyleGetAlignContent),
485+
YGMakeNativeMethod(jni_YGNodeStyleSetAlignContent),
486+
YGMakeNativeMethod(jni_YGNodeStyleGetPositionType),
487+
YGMakeNativeMethod(jni_YGNodeStyleSetPositionType),
488+
YGMakeNativeMethod(jni_YGNodeStyleSetFlexWrap),
489+
YGMakeNativeMethod(jni_YGNodeStyleGetOverflow),
490+
YGMakeNativeMethod(jni_YGNodeStyleSetOverflow),
491+
YGMakeNativeMethod(jni_YGNodeStyleGetDisplay),
492+
YGMakeNativeMethod(jni_YGNodeStyleSetDisplay),
493+
YGMakeNativeMethod(jni_YGNodeStyleSetFlex),
494+
YGMakeNativeMethod(jni_YGNodeStyleGetFlexGrow),
495+
YGMakeNativeMethod(jni_YGNodeStyleSetFlexGrow),
496+
YGMakeNativeMethod(jni_YGNodeStyleGetFlexShrink),
497+
YGMakeNativeMethod(jni_YGNodeStyleSetFlexShrink),
498+
YGMakeNativeMethod(jni_YGNodeStyleGetFlexBasis),
499+
YGMakeNativeMethod(jni_YGNodeStyleSetFlexBasis),
500+
YGMakeNativeMethod(jni_YGNodeStyleSetFlexBasisPercent),
501+
YGMakeNativeMethod(jni_YGNodeStyleSetFlexBasisAuto),
502+
YGMakeNativeMethod(jni_YGNodeStyleGetMargin),
503+
YGMakeNativeMethod(jni_YGNodeStyleSetMargin),
504+
YGMakeNativeMethod(jni_YGNodeStyleSetMarginPercent),
505+
YGMakeNativeMethod(jni_YGNodeStyleSetMarginAuto),
506+
YGMakeNativeMethod(jni_YGNodeStyleGetPadding),
507+
YGMakeNativeMethod(jni_YGNodeStyleSetPadding),
508+
YGMakeNativeMethod(jni_YGNodeStyleSetPaddingPercent),
509+
YGMakeNativeMethod(jni_YGNodeStyleGetBorder),
510+
YGMakeNativeMethod(jni_YGNodeStyleSetBorder),
511+
YGMakeNativeMethod(jni_YGNodeStyleGetPosition),
512+
YGMakeNativeMethod(jni_YGNodeStyleSetPosition),
513+
YGMakeNativeMethod(jni_YGNodeStyleSetPositionPercent),
514+
YGMakeNativeMethod(jni_YGNodeStyleGetWidth),
515+
YGMakeNativeMethod(jni_YGNodeStyleSetWidth),
516+
YGMakeNativeMethod(jni_YGNodeStyleSetWidthPercent),
517+
YGMakeNativeMethod(jni_YGNodeStyleSetWidthAuto),
518+
YGMakeNativeMethod(jni_YGNodeStyleGetHeight),
519+
YGMakeNativeMethod(jni_YGNodeStyleSetHeight),
520+
YGMakeNativeMethod(jni_YGNodeStyleSetHeightPercent),
521+
YGMakeNativeMethod(jni_YGNodeStyleSetHeightAuto),
522+
YGMakeNativeMethod(jni_YGNodeStyleGetMinWidth),
523+
YGMakeNativeMethod(jni_YGNodeStyleSetMinWidth),
524+
YGMakeNativeMethod(jni_YGNodeStyleSetMinWidthPercent),
525+
YGMakeNativeMethod(jni_YGNodeStyleGetMinHeight),
526+
YGMakeNativeMethod(jni_YGNodeStyleSetMinHeight),
527+
YGMakeNativeMethod(jni_YGNodeStyleSetMinHeightPercent),
528+
YGMakeNativeMethod(jni_YGNodeStyleGetMaxWidth),
529+
YGMakeNativeMethod(jni_YGNodeStyleSetMaxWidth),
530+
YGMakeNativeMethod(jni_YGNodeStyleSetMaxWidthPercent),
531+
YGMakeNativeMethod(jni_YGNodeStyleGetMaxHeight),
532+
YGMakeNativeMethod(jni_YGNodeStyleSetMaxHeight),
533+
YGMakeNativeMethod(jni_YGNodeStyleSetMaxHeightPercent),
534+
YGMakeNativeMethod(jni_YGNodeStyleGetAspectRatio),
535+
YGMakeNativeMethod(jni_YGNodeStyleSetAspectRatio),
536+
YGMakeNativeMethod(jni_YGNodeGetInstanceCount),
537+
YGMakeNativeMethod(jni_YGNodePrint),
538+
});
531539
registerNatives("com/facebook/yoga/YogaConfig",
532540
{
533541
YGMakeNativeMethod(jni_YGConfigNew),

ReactCommon/yoga/yoga/Yoga.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,10 @@ bool YGNodeLayoutGetDidUseLegacyFlag(const YGNodeRef node) {
215215
return node->didUseLegacyFlag();
216216
}
217217

218+
void YGNodeMarkDirtyAndPropogateToDescendants(const YGNodeRef node) {
219+
return node->markDirtyAndPropogateDownwards();
220+
}
221+
218222
int32_t gNodeInstanceCount = 0;
219223
int32_t gConfigInstanceCount = 0;
220224

ReactCommon/yoga/yoga/Yoga.h

+4
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ WIN_EXPORT void YGNodeCalculateLayout(const YGNodeRef node,
9999
// marking manually.
100100
WIN_EXPORT void YGNodeMarkDirty(const YGNodeRef node);
101101

102+
// This function marks the current node and all its descendants as dirty. This function is added to test yoga benchmarks.
103+
// This function is not expected to be used in production as calling `YGCalculateLayout` will cause the recalculation of each and every node.
104+
WIN_EXPORT void YGNodeMarkDirtyAndPropogateToDescendants(const YGNodeRef node);
105+
102106
WIN_EXPORT void YGNodePrint(const YGNodeRef node, const YGPrintOptions options);
103107

104108
WIN_EXPORT bool YGFloatIsUndefined(const float value);

0 commit comments

Comments
 (0)