diff --git a/csharp/Facebook.CSSLayout/CSSNode.cs b/csharp/Facebook.CSSLayout/CSSNode.cs index f2ba1810..6d44995d 100644 --- a/csharp/Facebook.CSSLayout/CSSNode.cs +++ b/csharp/Facebook.CSSLayout/CSSNode.cs @@ -90,6 +90,11 @@ namespace Facebook.CSSLayout } } + public void CopyStyle(CSSNode srcNode) + { + Native.CSSNodeCopyStyle(_cssNode, srcNode._cssNode); + } + public CSSDirection StyleDirection { get diff --git a/csharp/Facebook.CSSLayout/Native.cs b/csharp/Facebook.CSSLayout/Native.cs index fa3a8654..d7c36449 100644 --- a/csharp/Facebook.CSSLayout/Native.cs +++ b/csharp/Facebook.CSSLayout/Native.cs @@ -80,6 +80,9 @@ namespace Facebook.CSSLayout [return: MarshalAs(UnmanagedType.I1)] public static extern bool CSSValueIsUndefined(float value); + [DllImport(DllName)] + public static extern void CSSNodeCopyStyle(IntPtr dstNode, IntPtr srcNode); + #region CSS_NODE_PROPERTY [DllImport(DllName)] diff --git a/csharp/tests/Facebook.CSSLayout/CSSNodeTest.cs b/csharp/tests/Facebook.CSSLayout/CSSNodeTest.cs index 5677da91..2e40f5e9 100644 --- a/csharp/tests/Facebook.CSSLayout/CSSNodeTest.cs +++ b/csharp/tests/Facebook.CSSLayout/CSSNodeTest.cs @@ -215,13 +215,26 @@ namespace Facebook.CSSLayout Assert.AreEqual(parent.Print(), "{layout: {width: 100, height: 120, top: 0, left: 0}, flexDirection: 'column', alignItems: 'stretch', flexGrow: 0, flexShrink: 0, overflow: 'visible', width: 100, height: 120, children: [\n {layout: {width: 35, height: 45, top: 0, left: 0}, flexDirection: 'column', alignItems: 'stretch', flexGrow: 0, flexShrink: 0, overflow: 'visible', width: 35, height: 45, },\n {layout: {width: 30, height: 40, top: 45, left: 0}, flexDirection: 'column', alignItems: 'stretch', flexGrow: 0, flexShrink: 0, overflow: 'visible', width: 30, height: 40, },\n]},\n"); } + [Test] + public void TestCopyStyle() + { + CSSNode node0 = new CSSNode(); + Assert.IsTrue(CSSConstants.IsUndefined(node0.StyleMaxHeight)); + + CSSNode node1 = new CSSNode(); + node1.StyleMaxHeight = 100; + + node0.CopyStyle(node1); + Assert.AreEqual(100, node0.StyleMaxHeight); + } + +#if !UNITY_EDITOR private void ForceGC() { GC.Collect(GC.MaxGeneration); GC.WaitForPendingFinalizers(); } -#if !UNITY_EDITOR [Test] public void TestDestructor() { diff --git a/java/com/facebook/csslayout/CSSNode.java b/java/com/facebook/csslayout/CSSNode.java index e92f9267..95a5319e 100644 --- a/java/com/facebook/csslayout/CSSNode.java +++ b/java/com/facebook/csslayout/CSSNode.java @@ -190,6 +190,12 @@ public class CSSNode implements CSSNodeAPI { jni_CSSNodeMarkLayoutSeen(mNativePointer); } + private native void jni_CSSNodeCopyStyle(long dstNativePointer, long srcNativePointer); + @Override + public void copyStyle(CSSNode srcNode) { + jni_CSSNodeCopyStyle(mNativePointer, srcNode.mNativePointer); + } + private native int jni_CSSNodeStyleGetDirection(long nativePointer); @Override public CSSDirection getStyleDirection() { diff --git a/java/com/facebook/csslayout/CSSNodeAPI.java b/java/com/facebook/csslayout/CSSNodeAPI.java index dd18a54b..d35d8b48 100644 --- a/java/com/facebook/csslayout/CSSNodeAPI.java +++ b/java/com/facebook/csslayout/CSSNodeAPI.java @@ -37,6 +37,7 @@ public interface CSSNodeAPI { void dirty(); void markLayoutSeen(); boolean valuesEqual(float f1, float f2); + void copyStyle(CSSNodeType srcNode); CSSDirection getStyleDirection(); void setDirection(CSSDirection direction); CSSFlexDirection getFlexDirection(); diff --git a/java/com/facebook/csslayout/CSSNodeDEPRECATED.java b/java/com/facebook/csslayout/CSSNodeDEPRECATED.java index dc31cc04..0031ee69 100644 --- a/java/com/facebook/csslayout/CSSNodeDEPRECATED.java +++ b/java/com/facebook/csslayout/CSSNodeDEPRECATED.java @@ -222,6 +222,11 @@ public class CSSNodeDEPRECATED implements CSSNodeAPI { return FloatUtil.floatsEqual(f1, f2); } + @Override + public void copyStyle(CSSNodeDEPRECATED srcNode) { + throw new UnsupportedOperationException("copyStyle is not implemented"); + } + /** * Get this node's direction, as defined in the style. */ diff --git a/java/jni/CSSJNI.cpp b/java/jni/CSSJNI.cpp index f3bad806..9c3e3959 100644 --- a/java/jni/CSSJNI.cpp +++ b/java/jni/CSSJNI.cpp @@ -187,6 +187,10 @@ void jni_CSSNodeMarkLayoutSeen(alias_ref, jlong nativePointer) { CSSNodeSetHasNewLayout(_jlong2CSSNodeRef(nativePointer), false); } +void jni_CSSNodeCopyStyle(alias_ref, jlong dstNativePointer, jlong srcNativePointer) { + CSSNodeCopyStyle(_jlong2CSSNodeRef(dstNativePointer), _jlong2CSSNodeRef(srcNativePointer)); +} + #define CSS_NODE_JNI_STYLE_PROP(javatype, type, name) \ javatype jni_CSSNodeStyleGet##name(alias_ref, jlong nativePointer) { \ return (javatype) CSSNodeStyleGet##name(_jlong2CSSNodeRef(nativePointer)); \ @@ -257,6 +261,7 @@ jint JNI_OnLoad(JavaVM *vm, void *) { CSSMakeNativeMethod(jni_CSSNodeIsDirty), CSSMakeNativeMethod(jni_CSSNodeMarkLayoutSeen), CSSMakeNativeMethod(jni_CSSNodeSetHasMeasureFunc), + CSSMakeNativeMethod(jni_CSSNodeCopyStyle), CSSMakeNativeMethod(jni_CSSNodeStyleGetDirection), CSSMakeNativeMethod(jni_CSSNodeStyleSetDirection), diff --git a/java/tests/com/facebook/csslayout/CSSNodeTest.java b/java/tests/com/facebook/csslayout/CSSNodeTest.java index 3b857279..f269a91c 100644 --- a/java/tests/com/facebook/csslayout/CSSNodeTest.java +++ b/java/tests/com/facebook/csslayout/CSSNodeTest.java @@ -12,6 +12,7 @@ package com.facebook.csslayout; import org.junit.Test; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; public class CSSNodeTest { @@ -71,4 +72,16 @@ public class CSSNodeTest { assertEquals(CSSLogLevel.VERBOSE, mLogLevel); assertEquals("Flexbox", mLogMessage); } + + @Test + public void testCopyStyle() { + final CSSNode node0 = new CSSNode(); + assertTrue(CSSConstants.isUndefined(node0.getStyleMaxHeight())); + + final CSSNode node1 = new CSSNode(); + node1.setStyleMaxHeight(100); + + node0.copyStyle(node1); + assertEquals(100, (int) node0.getStyleMaxHeight()); + } }