Merge branch 'master' into fix-child-percent
This commit is contained in:
@@ -191,7 +191,6 @@
|
|||||||
27595AD71E575C7800CCE2B1 /* SampleCxxModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0D41E03699D0018521A /* SampleCxxModule.h */; };
|
27595AD71E575C7800CCE2B1 /* SampleCxxModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0D41E03699D0018521A /* SampleCxxModule.h */; };
|
||||||
27595AD81E575C7800CCE2B1 /* SystraceSection.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0D51E03699D0018521A /* SystraceSection.h */; };
|
27595AD81E575C7800CCE2B1 /* SystraceSection.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0D51E03699D0018521A /* SystraceSection.h */; };
|
||||||
2D0EB9F32021067800CAF88A /* RCTUIUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = F1EFDA4E201F660F00EE6E4C /* RCTUIUtils.m */; };
|
2D0EB9F32021067800CAF88A /* RCTUIUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = F1EFDA4E201F660F00EE6E4C /* RCTUIUtils.m */; };
|
||||||
2D16E68E1FA4FD3900B85C8A /* RCTTVNavigationEventEmitter.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D0B842D1EC0B51200B2BD8E /* RCTTVNavigationEventEmitter.h */; };
|
|
||||||
2D1D83CE1F74E2DA00615550 /* libdouble-conversion.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D383D621EBD27B9005632C8 /* libdouble-conversion.a */; };
|
2D1D83CE1F74E2DA00615550 /* libdouble-conversion.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D383D621EBD27B9005632C8 /* libdouble-conversion.a */; };
|
||||||
2D3B5E931D9B087300451313 /* RCTErrorInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EDCA8A41D3591E700450C31 /* RCTErrorInfo.m */; };
|
2D3B5E931D9B087300451313 /* RCTErrorInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EDCA8A41D3591E700450C31 /* RCTErrorInfo.m */; };
|
||||||
2D3B5E941D9B087900451313 /* RCTBundleURLProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 68EFE4ED1CF6EB3900A1DE13 /* RCTBundleURLProvider.m */; };
|
2D3B5E941D9B087900451313 /* RCTBundleURLProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 68EFE4ED1CF6EB3900A1DE13 /* RCTBundleURLProvider.m */; };
|
||||||
@@ -269,8 +268,6 @@
|
|||||||
3D0B842A1EC0B49400B2BD8E /* RCTTVRemoteHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D0B84281EC0B49400B2BD8E /* RCTTVRemoteHandler.h */; };
|
3D0B842A1EC0B49400B2BD8E /* RCTTVRemoteHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D0B84281EC0B49400B2BD8E /* RCTTVRemoteHandler.h */; };
|
||||||
3D0B842B1EC0B49400B2BD8E /* RCTTVRemoteHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D0B84291EC0B49400B2BD8E /* RCTTVRemoteHandler.m */; };
|
3D0B842B1EC0B49400B2BD8E /* RCTTVRemoteHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D0B84291EC0B49400B2BD8E /* RCTTVRemoteHandler.m */; };
|
||||||
3D0B842C1EC0B4EA00B2BD8E /* RCTTVView.m in Sources */ = {isa = PBXBuildFile; fileRef = 130443D71E401AD800D93A67 /* RCTTVView.m */; };
|
3D0B842C1EC0B4EA00B2BD8E /* RCTTVView.m in Sources */ = {isa = PBXBuildFile; fileRef = 130443D71E401AD800D93A67 /* RCTTVView.m */; };
|
||||||
3D0B842F1EC0B51200B2BD8E /* RCTTVNavigationEventEmitter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D0B842D1EC0B51200B2BD8E /* RCTTVNavigationEventEmitter.h */; };
|
|
||||||
3D0B84301EC0B51200B2BD8E /* RCTTVNavigationEventEmitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D0B842E1EC0B51200B2BD8E /* RCTTVNavigationEventEmitter.m */; };
|
|
||||||
3D0E378A1F1CC40000DCAC9F /* RCTWebSocketModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D0E37891F1CC40000DCAC9F /* RCTWebSocketModule.h */; };
|
3D0E378A1F1CC40000DCAC9F /* RCTWebSocketModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D0E37891F1CC40000DCAC9F /* RCTWebSocketModule.h */; };
|
||||||
3D0E378E1F1CC59100DCAC9F /* RCTWebSocketModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D0E37891F1CC40000DCAC9F /* RCTWebSocketModule.h */; };
|
3D0E378E1F1CC59100DCAC9F /* RCTWebSocketModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D0E37891F1CC40000DCAC9F /* RCTWebSocketModule.h */; };
|
||||||
3D0E378F1F1CC5CF00DCAC9F /* RCTWebSocketModule.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D0E37891F1CC40000DCAC9F /* RCTWebSocketModule.h */; };
|
3D0E378F1F1CC5CF00DCAC9F /* RCTWebSocketModule.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D0E37891F1CC40000DCAC9F /* RCTWebSocketModule.h */; };
|
||||||
@@ -1275,7 +1272,6 @@
|
|||||||
594F0A471FD233BD007FBE96 /* RCTSurfaceView.h in Copy Headers */,
|
594F0A471FD233BD007FBE96 /* RCTSurfaceView.h in Copy Headers */,
|
||||||
594F0A481FD233BD007FBE96 /* RCTSurfaceHostingView.h in Copy Headers */,
|
594F0A481FD233BD007FBE96 /* RCTSurfaceHostingView.h in Copy Headers */,
|
||||||
594F0A491FD233BD007FBE96 /* RCTSurfaceSizeMeasureMode.h in Copy Headers */,
|
594F0A491FD233BD007FBE96 /* RCTSurfaceSizeMeasureMode.h in Copy Headers */,
|
||||||
2D16E68E1FA4FD3900B85C8A /* RCTTVNavigationEventEmitter.h in Copy Headers */,
|
|
||||||
59500D481F71C67600B122B7 /* RCTUIManagerUtils.h in Copy Headers */,
|
59500D481F71C67600B122B7 /* RCTUIManagerUtils.h in Copy Headers */,
|
||||||
3D0E37901F1CC5E100DCAC9F /* RCTWebSocketModule.h in Copy Headers */,
|
3D0E37901F1CC5E100DCAC9F /* RCTWebSocketModule.h in Copy Headers */,
|
||||||
5960C1BF1F0804F50066FD5B /* RCTLayoutAnimation.h in Copy Headers */,
|
5960C1BF1F0804F50066FD5B /* RCTLayoutAnimation.h in Copy Headers */,
|
||||||
@@ -1876,8 +1872,6 @@
|
|||||||
39C50FFA2046EE3500CEE534 /* RCTVersion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTVersion.m; sourceTree = "<group>"; };
|
39C50FFA2046EE3500CEE534 /* RCTVersion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTVersion.m; sourceTree = "<group>"; };
|
||||||
3D0B84281EC0B49400B2BD8E /* RCTTVRemoteHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTTVRemoteHandler.h; sourceTree = "<group>"; };
|
3D0B84281EC0B49400B2BD8E /* RCTTVRemoteHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTTVRemoteHandler.h; sourceTree = "<group>"; };
|
||||||
3D0B84291EC0B49400B2BD8E /* RCTTVRemoteHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTTVRemoteHandler.m; sourceTree = "<group>"; };
|
3D0B84291EC0B49400B2BD8E /* RCTTVRemoteHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTTVRemoteHandler.m; sourceTree = "<group>"; };
|
||||||
3D0B842D1EC0B51200B2BD8E /* RCTTVNavigationEventEmitter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTTVNavigationEventEmitter.h; sourceTree = "<group>"; };
|
|
||||||
3D0B842E1EC0B51200B2BD8E /* RCTTVNavigationEventEmitter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTTVNavigationEventEmitter.m; sourceTree = "<group>"; };
|
|
||||||
3D0E37891F1CC40000DCAC9F /* RCTWebSocketModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RCTWebSocketModule.h; path = WebSocket/RCTWebSocketModule.h; sourceTree = "<group>"; };
|
3D0E37891F1CC40000DCAC9F /* RCTWebSocketModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RCTWebSocketModule.h; path = WebSocket/RCTWebSocketModule.h; sourceTree = "<group>"; };
|
||||||
3D1E68D81CABD13900DD7465 /* RCTDisplayLink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTDisplayLink.h; sourceTree = "<group>"; };
|
3D1E68D81CABD13900DD7465 /* RCTDisplayLink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTDisplayLink.h; sourceTree = "<group>"; };
|
||||||
3D1E68D91CABD13900DD7465 /* RCTDisplayLink.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTDisplayLink.m; sourceTree = "<group>"; };
|
3D1E68D91CABD13900DD7465 /* RCTDisplayLink.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTDisplayLink.m; sourceTree = "<group>"; };
|
||||||
@@ -2346,8 +2340,6 @@
|
|||||||
0EEEA8DE2239002200A8C82D /* RCTSurfacePresenterStub.m */,
|
0EEEA8DE2239002200A8C82D /* RCTSurfacePresenterStub.m */,
|
||||||
13B07FED1A69327A00A75B9A /* RCTTiming.h */,
|
13B07FED1A69327A00A75B9A /* RCTTiming.h */,
|
||||||
13B07FEE1A69327A00A75B9A /* RCTTiming.m */,
|
13B07FEE1A69327A00A75B9A /* RCTTiming.m */,
|
||||||
3D0B842D1EC0B51200B2BD8E /* RCTTVNavigationEventEmitter.h */,
|
|
||||||
3D0B842E1EC0B51200B2BD8E /* RCTTVNavigationEventEmitter.m */,
|
|
||||||
13E067481A70F434002CDEE1 /* RCTUIManager.h */,
|
13E067481A70F434002CDEE1 /* RCTUIManager.h */,
|
||||||
13E067491A70F434002CDEE1 /* RCTUIManager.m */,
|
13E067491A70F434002CDEE1 /* RCTUIManager.m */,
|
||||||
59EB6DB91EBD6FC90072A5E7 /* RCTUIManagerObserverCoordinator.h */,
|
59EB6DB91EBD6FC90072A5E7 /* RCTUIManagerObserverCoordinator.h */,
|
||||||
@@ -2945,7 +2937,6 @@
|
|||||||
3D302F311DF828F800D6DDAE /* RCTBundleURLProvider.h in Headers */,
|
3D302F311DF828F800D6DDAE /* RCTBundleURLProvider.h in Headers */,
|
||||||
3D302F321DF828F800D6DDAE /* RCTConvert.h in Headers */,
|
3D302F321DF828F800D6DDAE /* RCTConvert.h in Headers */,
|
||||||
3D302F331DF828F800D6DDAE /* RCTDefines.h in Headers */,
|
3D302F331DF828F800D6DDAE /* RCTDefines.h in Headers */,
|
||||||
3D0B842F1EC0B51200B2BD8E /* RCTTVNavigationEventEmitter.h in Headers */,
|
|
||||||
3D302F341DF828F800D6DDAE /* RCTDisplayLink.h in Headers */,
|
3D302F341DF828F800D6DDAE /* RCTDisplayLink.h in Headers */,
|
||||||
3D302F351DF828F800D6DDAE /* RCTErrorCustomizer.h in Headers */,
|
3D302F351DF828F800D6DDAE /* RCTErrorCustomizer.h in Headers */,
|
||||||
3D302F361DF828F800D6DDAE /* RCTErrorInfo.h in Headers */,
|
3D302F361DF828F800D6DDAE /* RCTErrorInfo.h in Headers */,
|
||||||
@@ -3994,7 +3985,6 @@
|
|||||||
2D3B5EC81D9B095800451313 /* RCTActivityIndicatorViewManager.m in Sources */,
|
2D3B5EC81D9B095800451313 /* RCTActivityIndicatorViewManager.m in Sources */,
|
||||||
3DCD185D1DF978E7007FE5A1 /* RCTReloadCommand.m in Sources */,
|
3DCD185D1DF978E7007FE5A1 /* RCTReloadCommand.m in Sources */,
|
||||||
130443DB1E401ADD00D93A67 /* RCTConvert+Transform.m in Sources */,
|
130443DB1E401ADD00D93A67 /* RCTConvert+Transform.m in Sources */,
|
||||||
3D0B84301EC0B51200B2BD8E /* RCTTVNavigationEventEmitter.m in Sources */,
|
|
||||||
2D3B5EC61D9B095000451313 /* RCTProfileTrampoline-x86_64.S in Sources */,
|
2D3B5EC61D9B095000451313 /* RCTProfileTrampoline-x86_64.S in Sources */,
|
||||||
2D3B5EA61D9B08CA00451313 /* RCTTouchEvent.m in Sources */,
|
2D3B5EA61D9B08CA00451313 /* RCTTouchEvent.m in Sources */,
|
||||||
2D8C2E331DA40441000EE098 /* RCTMultipartStreamReader.m in Sources */,
|
2D8C2E331DA40441000EE098 /* RCTMultipartStreamReader.m in Sources */,
|
||||||
|
@@ -28,17 +28,19 @@
|
|||||||
|
|
||||||
UIView* child2 = [UIView new];
|
UIView* child2 = [UIView new];
|
||||||
child2.backgroundColor = [UIColor greenColor];
|
child2.backgroundColor = [UIColor greenColor];
|
||||||
child2.frame = (CGRect){.size = {
|
child2.frame = (CGRect){
|
||||||
.width = 200,
|
.size = {
|
||||||
.height = 100,
|
.width = 200,
|
||||||
}};
|
.height = 100,
|
||||||
|
}};
|
||||||
|
|
||||||
UIView* child3 = [UIView new];
|
UIView* child3 = [UIView new];
|
||||||
child3.backgroundColor = [UIColor yellowColor];
|
child3.backgroundColor = [UIColor yellowColor];
|
||||||
child3.frame = (CGRect){.size = {
|
child3.frame = (CGRect){
|
||||||
.width = 100,
|
.size = {
|
||||||
.height = 100,
|
.width = 100,
|
||||||
}};
|
.height = 100,
|
||||||
|
}};
|
||||||
|
|
||||||
[child2 addSubview:child3];
|
[child2 addSubview:child3];
|
||||||
[root addSubview:child1];
|
[root addSubview:child1];
|
||||||
|
@@ -8,6 +8,7 @@ load("//tools/build_defs/oss:yoga_defs.bzl", "ANDROID_JAVA_TARGET", "ANDROID_SAM
|
|||||||
yoga_android_library(
|
yoga_android_library(
|
||||||
name = "yoga",
|
name = "yoga",
|
||||||
srcs = glob(["**/*.java"]),
|
srcs = glob(["**/*.java"]),
|
||||||
|
autoglob = False,
|
||||||
visibility = [
|
visibility = [
|
||||||
"PUBLIC",
|
"PUBLIC",
|
||||||
],
|
],
|
||||||
|
@@ -8,6 +8,7 @@ load("//tools/build_defs/oss:yoga_defs.bzl", "ANDROID_RES_TARGET", "INFER_ANNOTA
|
|||||||
yoga_android_library(
|
yoga_android_library(
|
||||||
name = "android",
|
name = "android",
|
||||||
srcs = glob(["**/*.java"]),
|
srcs = glob(["**/*.java"]),
|
||||||
|
autoglob = False,
|
||||||
visibility = [
|
visibility = [
|
||||||
"PUBLIC",
|
"PUBLIC",
|
||||||
],
|
],
|
||||||
|
@@ -36,7 +36,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v141</PlatformToolset>
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v141</PlatformToolset>
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
@@ -62,13 +62,13 @@
|
|||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v141</PlatformToolset>
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<PlatformToolset>v141</PlatformToolset>
|
<PlatformToolset>v141</PlatformToolset>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
@@ -227,6 +227,8 @@
|
|||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\yoga\event\event.h" />
|
||||||
|
<ClInclude Include="..\..\yoga\log.h" />
|
||||||
<ClInclude Include="..\..\yoga\Utils.h" />
|
<ClInclude Include="..\..\yoga\Utils.h" />
|
||||||
<ClInclude Include="..\..\yoga\YGConfig.h" />
|
<ClInclude Include="..\..\yoga\YGConfig.h" />
|
||||||
<ClInclude Include="..\..\yoga\YGEnums.h" />
|
<ClInclude Include="..\..\yoga\YGEnums.h" />
|
||||||
@@ -236,6 +238,7 @@
|
|||||||
<ClInclude Include="..\..\yoga\YGNode.h" />
|
<ClInclude Include="..\..\yoga\YGNode.h" />
|
||||||
<ClInclude Include="..\..\yoga\YGNodePrint.h" />
|
<ClInclude Include="..\..\yoga\YGNodePrint.h" />
|
||||||
<ClInclude Include="..\..\yoga\YGStyle.h" />
|
<ClInclude Include="..\..\yoga\YGStyle.h" />
|
||||||
|
<ClInclude Include="..\..\yoga\YGValue.h" />
|
||||||
<ClInclude Include="..\..\yoga\Yoga-internal.h" />
|
<ClInclude Include="..\..\yoga\Yoga-internal.h" />
|
||||||
<ClInclude Include="..\..\yoga\Yoga.h" />
|
<ClInclude Include="..\..\yoga\Yoga.h" />
|
||||||
<ClInclude Include="resource.h" />
|
<ClInclude Include="resource.h" />
|
||||||
@@ -243,14 +246,16 @@
|
|||||||
<ClInclude Include="targetver.h" />
|
<ClInclude Include="targetver.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\yoga\event\event.cpp" />
|
||||||
|
<ClCompile Include="..\..\yoga\log.cpp" />
|
||||||
<ClCompile Include="..\..\yoga\Utils.cpp" />
|
<ClCompile Include="..\..\yoga\Utils.cpp" />
|
||||||
<ClCompile Include="..\..\yoga\YGConfig.cpp" />
|
<ClCompile Include="..\..\yoga\YGConfig.cpp" />
|
||||||
<ClCompile Include="..\..\yoga\YGEnums.cpp" />
|
<ClCompile Include="..\..\yoga\YGEnums.cpp" />
|
||||||
<ClCompile Include="..\..\yoga\YGFloatOptional.cpp" />
|
|
||||||
<ClCompile Include="..\..\yoga\YGLayout.cpp" />
|
<ClCompile Include="..\..\yoga\YGLayout.cpp" />
|
||||||
<ClCompile Include="..\..\yoga\YGNode.cpp" />
|
<ClCompile Include="..\..\yoga\YGNode.cpp" />
|
||||||
<ClCompile Include="..\..\yoga\YGNodePrint.cpp" />
|
<ClCompile Include="..\..\yoga\YGNodePrint.cpp" />
|
||||||
<ClCompile Include="..\..\yoga\YGStyle.cpp" />
|
<ClCompile Include="..\..\yoga\YGStyle.cpp" />
|
||||||
|
<ClCompile Include="..\..\yoga\YGValue.cpp" />
|
||||||
<ClCompile Include="..\..\yoga\Yoga.cpp" />
|
<ClCompile Include="..\..\yoga\Yoga.cpp" />
|
||||||
<ClCompile Include="YGInterop.cpp" />
|
<ClCompile Include="YGInterop.cpp" />
|
||||||
<ClCompile Include="dllmain.cpp">
|
<ClCompile Include="dllmain.cpp">
|
||||||
|
@@ -1,104 +1,119 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Filter Include="Source Files">
|
<Filter Include="Source Files">
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="Header Files">
|
<Filter Include="Header Files">
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="Resource Files">
|
<Filter Include="Resource Files">
|
||||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
</Filter>
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="stdafx.h">
|
<ClInclude Include="stdafx.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="targetver.h">
|
<ClInclude Include="targetver.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="resource.h">
|
<ClInclude Include="resource.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\yoga\Utils.h">
|
<ClInclude Include="..\..\yoga\Utils.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\yoga\YGEnums.h">
|
<ClInclude Include="..\..\yoga\YGEnums.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\yoga\YGFloatOptional.h">
|
<ClInclude Include="..\..\yoga\YGFloatOptional.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\yoga\YGLayout.h">
|
<ClInclude Include="..\..\yoga\YGLayout.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\yoga\YGMacros.h">
|
<ClInclude Include="..\..\yoga\YGMacros.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\yoga\YGNode.h">
|
<ClInclude Include="..\..\yoga\YGNode.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\yoga\YGNodePrint.h">
|
<ClInclude Include="..\..\yoga\YGNodePrint.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\yoga\YGStyle.h">
|
<ClInclude Include="..\..\yoga\YGStyle.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\yoga\Yoga.h">
|
<ClInclude Include="..\..\yoga\Yoga.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\yoga\Yoga-internal.h">
|
<ClInclude Include="..\..\yoga\Yoga-internal.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\yoga\YGConfig.h">
|
<ClInclude Include="..\..\yoga\YGConfig.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
</ItemGroup>
|
<ClInclude Include="..\..\yoga\YGValue.h">
|
||||||
<ItemGroup>
|
<Filter>Header Files</Filter>
|
||||||
<ClCompile Include="stdafx.cpp">
|
</ClInclude>
|
||||||
<Filter>Source Files</Filter>
|
<ClInclude Include="..\..\yoga\log.h">
|
||||||
</ClCompile>
|
<Filter>Header Files</Filter>
|
||||||
<ClCompile Include="dllmain.cpp">
|
</ClInclude>
|
||||||
<Filter>Source Files</Filter>
|
<ClInclude Include="..\..\yoga\event\event.h">
|
||||||
</ClCompile>
|
<Filter>Header Files</Filter>
|
||||||
<ClCompile Include="YGInterop.cpp">
|
</ClInclude>
|
||||||
<Filter>Source Files</Filter>
|
</ItemGroup>
|
||||||
</ClCompile>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\yoga\Utils.cpp">
|
<ClCompile Include="stdafx.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\yoga\YGEnums.cpp">
|
<ClCompile Include="dllmain.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\yoga\YGFloatOptional.cpp">
|
<ClCompile Include="YGInterop.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\yoga\YGLayout.cpp">
|
<ClCompile Include="..\..\yoga\Utils.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\yoga\YGNode.cpp">
|
<ClCompile Include="..\..\yoga\YGEnums.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\yoga\YGNodePrint.cpp">
|
<ClCompile Include="..\..\yoga\YGLayout.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\yoga\YGStyle.cpp">
|
<ClCompile Include="..\..\yoga\YGNode.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\yoga\Yoga.cpp">
|
<ClCompile Include="..\..\yoga\YGNodePrint.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\yoga\YGConfig.cpp">
|
<ClCompile Include="..\..\yoga\YGStyle.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemGroup>
|
<ClCompile Include="..\..\yoga\Yoga.cpp">
|
||||||
<ItemGroup>
|
<Filter>Source Files</Filter>
|
||||||
<ResourceCompile Include="Yoga.rc">
|
</ClCompile>
|
||||||
<Filter>Resource Files</Filter>
|
<ClCompile Include="..\..\yoga\YGConfig.cpp">
|
||||||
</ResourceCompile>
|
<Filter>Source Files</Filter>
|
||||||
</ItemGroup>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\yoga\YGValue.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\yoga\event\event.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\yoga\log.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ResourceCompile Include="Yoga.rc">
|
||||||
|
<Filter>Resource Files</Filter>
|
||||||
|
</ResourceCompile>
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
@@ -1,9 +1,10 @@
|
|||||||
/**
|
/*
|
||||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
*
|
*
|
||||||
* This source code is licensed under the MIT license found in the LICENSE
|
* This source code is licensed under the MIT license found in the
|
||||||
* file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// @Generated by gentest/gentest.rb from gentest/fixtures/YGDisplayTest.html
|
// @Generated by gentest/gentest.rb from gentest/fixtures/YGDisplayTest.html
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
@@ -333,5 +334,47 @@ namespace Facebook.Yoga
|
|||||||
Assert.AreEqual(0f, root_child1.LayoutHeight);
|
Assert.AreEqual(0f, root_child1.LayoutHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Test_display_none_with_position_absolute()
|
||||||
|
{
|
||||||
|
YogaConfig config = new YogaConfig();
|
||||||
|
|
||||||
|
YogaNode root = new YogaNode(config);
|
||||||
|
root.Width = 100;
|
||||||
|
root.Height = 100;
|
||||||
|
|
||||||
|
YogaNode root_child0 = new YogaNode(config);
|
||||||
|
root_child0.PositionType = YogaPositionType.Absolute;
|
||||||
|
root_child0.Width = 100;
|
||||||
|
root_child0.Height = 100;
|
||||||
|
root_child0.Display = YogaDisplay.None;
|
||||||
|
root.Insert(0, root_child0);
|
||||||
|
root.StyleDirection = YogaDirection.LTR;
|
||||||
|
root.CalculateLayout();
|
||||||
|
|
||||||
|
Assert.AreEqual(0f, root.LayoutX);
|
||||||
|
Assert.AreEqual(0f, root.LayoutY);
|
||||||
|
Assert.AreEqual(100f, root.LayoutWidth);
|
||||||
|
Assert.AreEqual(100f, root.LayoutHeight);
|
||||||
|
|
||||||
|
Assert.AreEqual(0f, root_child0.LayoutX);
|
||||||
|
Assert.AreEqual(0f, root_child0.LayoutY);
|
||||||
|
Assert.AreEqual(0f, root_child0.LayoutWidth);
|
||||||
|
Assert.AreEqual(0f, root_child0.LayoutHeight);
|
||||||
|
|
||||||
|
root.StyleDirection = YogaDirection.RTL;
|
||||||
|
root.CalculateLayout();
|
||||||
|
|
||||||
|
Assert.AreEqual(0f, root.LayoutX);
|
||||||
|
Assert.AreEqual(0f, root.LayoutY);
|
||||||
|
Assert.AreEqual(100f, root.LayoutWidth);
|
||||||
|
Assert.AreEqual(100f, root.LayoutHeight);
|
||||||
|
|
||||||
|
Assert.AreEqual(0f, root_child0.LayoutX);
|
||||||
|
Assert.AreEqual(0f, root_child0.LayoutY);
|
||||||
|
Assert.AreEqual(0f, root_child0.LayoutWidth);
|
||||||
|
Assert.AreEqual(0f, root_child0.LayoutHeight);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -25,3 +25,7 @@
|
|||||||
<div style="flex-grow: 1;"></div>
|
<div style="flex-grow: 1;"></div>
|
||||||
<div style="flex-grow: 1; display:none; top: 10px;"></div>
|
<div style="flex-grow: 1; display:none; top: 10px;"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="display_none_with_position_absolute" style="width: 100px; height: 100px;">
|
||||||
|
<div style="display:none; position: absolute; width: 100px; height: 100px"></div>
|
||||||
|
</div>
|
||||||
|
@@ -120,8 +120,9 @@ CSEmitter.prototype = Object.create(Emitter.prototype, {
|
|||||||
YGOverflowHidden:{value:'YogaOverflow.Hidden'},
|
YGOverflowHidden:{value:'YogaOverflow.Hidden'},
|
||||||
YGOverflowVisible:{value:'YogaOverflow.Visible'},
|
YGOverflowVisible:{value:'YogaOverflow.Visible'},
|
||||||
|
|
||||||
YGPositionTypeAbsolute:{value:'YogaPositionType.Absolute'},
|
YGPositionTypeAbsolute:{value:'YogaPositionType.Static'},
|
||||||
YGPositionTypeRelative:{value:'YogaPositionType.Relative'},
|
YGPositionTypeRelative:{value:'YogaPositionType.Relative'},
|
||||||
|
YGPositionTypeAbsolute:{value:'YogaPositionType.Absolute'},
|
||||||
|
|
||||||
YGUndefined:{value:'YogaConstants.Undefined'},
|
YGUndefined:{value:'YogaConstants.Undefined'},
|
||||||
|
|
||||||
|
@@ -41,11 +41,11 @@ function assert(condition, message) {
|
|||||||
|
|
||||||
function printTest(e, LTRContainer, RTLContainer, genericContainer) {
|
function printTest(e, LTRContainer, RTLContainer, genericContainer) {
|
||||||
e.push([
|
e.push([
|
||||||
'/**',
|
'/*',
|
||||||
' * Copyright (c) Facebook, Inc. and its affiliates.',
|
' * Copyright (c) Facebook, Inc. and its affiliates.',
|
||||||
' *',
|
' *',
|
||||||
' * This source code is licensed under the MIT license found in the LICENSE',
|
' * This source code is licensed under the MIT license found in the',
|
||||||
' * file in the root directory of this source tree.',
|
' * LICENSE file in the root directory of this source tree.',
|
||||||
' */',
|
' */',
|
||||||
'// @Generated by gentest/gentest.rb from gentest/fixtures/' + document.title + '.html',
|
'// @Generated by gentest/gentest.rb from gentest/fixtures/' + document.title + '.html',
|
||||||
'',
|
'',
|
||||||
|
@@ -7,13 +7,14 @@
|
|||||||
require 'watir'
|
require 'watir'
|
||||||
require 'fileutils'
|
require 'fileutils'
|
||||||
|
|
||||||
caps = Selenium::WebDriver::Remote::Capabilities.chrome(
|
browser = Watir::Browser.new(:chrome, "goog:loggingPrefs" => {
|
||||||
"loggingPrefs"=>{
|
"browser" => "ALL",
|
||||||
"browser"=>"ALL",
|
"performance" => "ALL"
|
||||||
"performance"=>"ALL"
|
},
|
||||||
}
|
"chromeOptions" => {
|
||||||
)
|
"w3c" => "false"
|
||||||
browser = Watir::Browser.new(:chrome, :desired_capabilities => caps, :switches => ['--force-device-scale-factor=1', '--window-position=0,0'])
|
},
|
||||||
|
:switches => ['--force-device-scale-factor=1', '--window-position=0,0'])
|
||||||
|
|
||||||
Dir.chdir(File.dirname($0))
|
Dir.chdir(File.dirname($0))
|
||||||
|
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
org.gradle.jvmargs=-Xmx1536M
|
org.gradle.jvmargs=-Xmx1536M
|
||||||
|
|
||||||
VERSION_NAME=1.16.0-SNAPSHOT
|
VERSION_NAME=1.17.0-SNAPSHOT
|
||||||
POM_URL=https://github.com/facebook/yoga
|
POM_URL=https://github.com/facebook/yoga
|
||||||
POM_SCM_URL=https://github.com/facebook/yoga.git
|
POM_SCM_URL=https://github.com/facebook/yoga.git
|
||||||
POM_SCM_CONNECTION=scm:git:https://github.com/facebook/yoga.git
|
POM_SCM_CONNECTION=scm:git:https://github.com/facebook/yoga.git
|
||||||
|
@@ -108,6 +108,7 @@ yoga_java_library(
|
|||||||
yoga_java_test(
|
yoga_java_test(
|
||||||
name = "tests",
|
name = "tests",
|
||||||
srcs = glob(["tests/**/*.java"]),
|
srcs = glob(["tests/**/*.java"]),
|
||||||
|
contacts = ["oncall+yoga@xmail.facebook.com"],
|
||||||
cxx_library_whitelist = CXX_LIBRARY_WHITELIST_FOR_TESTS,
|
cxx_library_whitelist = CXX_LIBRARY_WHITELIST_FOR_TESTS,
|
||||||
use_cxx_libraries = True,
|
use_cxx_libraries = True,
|
||||||
visibility = ["PUBLIC"],
|
visibility = ["PUBLIC"],
|
||||||
|
@@ -10,6 +10,14 @@ package com.facebook.yoga;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public abstract class YogaNode {
|
public abstract class YogaNode {
|
||||||
|
|
||||||
|
/** The interface the {@link #getData()} object can optionally implement. */
|
||||||
|
public interface Inputs {
|
||||||
|
|
||||||
|
/** Requests the data object to disable mutations of its inputs. */
|
||||||
|
void freeze();
|
||||||
|
}
|
||||||
|
|
||||||
public abstract void reset();
|
public abstract void reset();
|
||||||
|
|
||||||
public abstract int getChildCount();
|
public abstract int getChildCount();
|
||||||
@@ -25,12 +33,10 @@ public abstract class YogaNode {
|
|||||||
public abstract YogaNode removeChildAt(int i);
|
public abstract YogaNode removeChildAt(int i);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns the {@link YogaNode} that owns this {@link YogaNode}.
|
* @returns the {@link YogaNode} that owns this {@link YogaNode}. The owner is used to identify
|
||||||
* The owner is used to identify the YogaTree that a {@link YogaNode} belongs
|
* the YogaTree that a {@link YogaNode} belongs to. This method will return the parent of the
|
||||||
* to.
|
* {@link YogaNode} when the {@link YogaNode} only belongs to one YogaTree or null when the
|
||||||
* This method will return the parent of the {@link YogaNode} when the
|
* {@link YogaNode} is shared between two or more YogaTrees.
|
||||||
* {@link YogaNode} only belongs to one YogaTree or null when the
|
|
||||||
* {@link YogaNode} is shared between two or more YogaTrees.
|
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public abstract YogaNode getOwner();
|
public abstract YogaNode getOwner();
|
||||||
|
@@ -83,6 +83,9 @@ public abstract class YogaNodeJNIBase extends YogaNode implements Cloneable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void addChildAt(YogaNode c, int i) {
|
public void addChildAt(YogaNode c, int i) {
|
||||||
|
if (!(c instanceof YogaNodeJNIBase)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
YogaNodeJNIBase child = (YogaNodeJNIBase) c;
|
YogaNodeJNIBase child = (YogaNodeJNIBase) c;
|
||||||
if (child.mOwner != null) {
|
if (child.mOwner != null) {
|
||||||
throw new IllegalStateException("Child already has a parent, it must be removed first.");
|
throw new IllegalStateException("Child already has a parent, it must be removed first.");
|
||||||
@@ -105,6 +108,9 @@ public abstract class YogaNodeJNIBase extends YogaNode implements Cloneable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void swapChildAt(YogaNode newChild, int position) {
|
public void swapChildAt(YogaNode newChild, int position) {
|
||||||
|
if (!(newChild instanceof YogaNodeJNIBase)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
YogaNodeJNIBase child = (YogaNodeJNIBase) newChild;
|
YogaNodeJNIBase child = (YogaNodeJNIBase) newChild;
|
||||||
mChildren.remove(position);
|
mChildren.remove(position);
|
||||||
mChildren.add(position, child);
|
mChildren.add(position, child);
|
||||||
@@ -116,6 +122,9 @@ public abstract class YogaNodeJNIBase extends YogaNode implements Cloneable {
|
|||||||
public YogaNodeJNIBase cloneWithChildren() {
|
public YogaNodeJNIBase cloneWithChildren() {
|
||||||
try {
|
try {
|
||||||
YogaNodeJNIBase clonedYogaNode = (YogaNodeJNIBase) super.clone();
|
YogaNodeJNIBase clonedYogaNode = (YogaNodeJNIBase) super.clone();
|
||||||
|
if (clonedYogaNode.mChildren != null) {
|
||||||
|
clonedYogaNode.mChildren = new ArrayList<>(clonedYogaNode.mChildren);
|
||||||
|
}
|
||||||
long clonedNativePointer = YogaNative.jni_YGNodeCloneJNI(mNativePointer);
|
long clonedNativePointer = YogaNative.jni_YGNodeCloneJNI(mNativePointer);
|
||||||
clonedYogaNode.mOwner = null;
|
clonedYogaNode.mOwner = null;
|
||||||
clonedYogaNode.mNativePointer = clonedNativePointer;
|
clonedYogaNode.mNativePointer = clonedNativePointer;
|
||||||
@@ -188,12 +197,17 @@ public abstract class YogaNodeJNIBase extends YogaNode implements Cloneable {
|
|||||||
long[] nativePointers = null;
|
long[] nativePointers = null;
|
||||||
YogaNodeJNIBase[] nodes = null;
|
YogaNodeJNIBase[] nodes = null;
|
||||||
|
|
||||||
|
freeze();
|
||||||
|
|
||||||
ArrayList<YogaNodeJNIBase> n = new ArrayList<>();
|
ArrayList<YogaNodeJNIBase> n = new ArrayList<>();
|
||||||
n.add(this);
|
n.add(this);
|
||||||
for (int i = 0; i < n.size(); ++i) {
|
for (int i = 0; i < n.size(); ++i) {
|
||||||
List<YogaNodeJNIBase> children = n.get(i).mChildren;
|
List<YogaNodeJNIBase> children = n.get(i).mChildren;
|
||||||
if (children != null) {
|
if (children != null) {
|
||||||
n.addAll(children);
|
for (YogaNodeJNIBase child : children) {
|
||||||
|
child.freeze();
|
||||||
|
n.add(child);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,6 +220,13 @@ public abstract class YogaNodeJNIBase extends YogaNode implements Cloneable {
|
|||||||
YogaNative.jni_YGNodeCalculateLayoutJNI(mNativePointer, width, height, nativePointers, nodes);
|
YogaNative.jni_YGNodeCalculateLayoutJNI(mNativePointer, width, height, nativePointers, nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void freeze() {
|
||||||
|
Object data = getData();
|
||||||
|
if (data instanceof Inputs) {
|
||||||
|
((Inputs) data).freeze();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void dirty() {
|
public void dirty() {
|
||||||
YogaNative.jni_YGNodeMarkDirtyJNI(mNativePointer);
|
YogaNative.jni_YGNodeMarkDirtyJNI(mNativePointer);
|
||||||
}
|
}
|
||||||
@@ -220,6 +241,9 @@ public abstract class YogaNodeJNIBase extends YogaNode implements Cloneable {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void copyStyle(YogaNode srcNode) {
|
public void copyStyle(YogaNode srcNode) {
|
||||||
|
if (!(srcNode instanceof YogaNodeJNIBase)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
YogaNative.jni_YGNodeCopyStyleJNI(mNativePointer, ((YogaNodeJNIBase) srcNode).mNativePointer);
|
YogaNative.jni_YGNodeCopyStyleJNI(mNativePointer, ((YogaNodeJNIBase) srcNode).mNativePointer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -8,8 +8,9 @@
|
|||||||
package com.facebook.yoga;
|
package com.facebook.yoga;
|
||||||
|
|
||||||
public enum YogaPositionType {
|
public enum YogaPositionType {
|
||||||
RELATIVE(0),
|
STATIC(0),
|
||||||
ABSOLUTE(1);
|
RELATIVE(1),
|
||||||
|
ABSOLUTE(2);
|
||||||
|
|
||||||
private final int mIntValue;
|
private final int mIntValue;
|
||||||
|
|
||||||
@@ -23,8 +24,9 @@ public enum YogaPositionType {
|
|||||||
|
|
||||||
public static YogaPositionType fromInt(int value) {
|
public static YogaPositionType fromInt(int value) {
|
||||||
switch (value) {
|
switch (value) {
|
||||||
case 0: return RELATIVE;
|
case 0: return STATIC;
|
||||||
case 1: return ABSOLUTE;
|
case 1: return RELATIVE;
|
||||||
|
case 2: return ABSOLUTE;
|
||||||
default: throw new IllegalArgumentException("Unknown enum value: " + value);
|
default: throw new IllegalArgumentException("Unknown enum value: " + value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -196,7 +196,7 @@ static void jni_YGConfigSetLoggerJNI(
|
|||||||
delete context;
|
delete context;
|
||||||
YGConfigSetContext(config, nullptr);
|
YGConfigSetContext(config, nullptr);
|
||||||
}
|
}
|
||||||
config->setLogger(nullptr);
|
YGConfigSetLogger(config, nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* 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.proguard.annotations;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
import static java.lang.annotation.RetentionPolicy.CLASS;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add this annotation to a class to instruct Proguard to not strip it or any of its fields or
|
||||||
|
* methods out.
|
||||||
|
*
|
||||||
|
* <p>This is useful for methods called via reflection that could appear as unused to Proguard.
|
||||||
|
*/
|
||||||
|
@Target({ElementType.TYPE})
|
||||||
|
@Retention(CLASS)
|
||||||
|
public @interface DoNotStripAny {}
|
@@ -1,9 +1,10 @@
|
|||||||
/**
|
/*
|
||||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
*
|
*
|
||||||
* This source code is licensed under the MIT license found in the LICENSE
|
* This source code is licensed under the MIT license found in the
|
||||||
* file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// @Generated by gentest/gentest.rb from gentest/fixtures/YGDisplayTest.html
|
// @Generated by gentest/gentest.rb from gentest/fixtures/YGDisplayTest.html
|
||||||
|
|
||||||
package com.facebook.yoga;
|
package com.facebook.yoga;
|
||||||
@@ -337,6 +338,47 @@ public class YGDisplayTest {
|
|||||||
assertEquals(0f, root_child1.getLayoutHeight(), 0.0f);
|
assertEquals(0f, root_child1.getLayoutHeight(), 0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_display_none_with_position_absolute() {
|
||||||
|
YogaConfig config = YogaConfigFactory.create();
|
||||||
|
|
||||||
|
final YogaNode root = createNode(config);
|
||||||
|
root.setWidth(100f);
|
||||||
|
root.setHeight(100f);
|
||||||
|
|
||||||
|
final YogaNode root_child0 = createNode(config);
|
||||||
|
root_child0.setPositionType(YogaPositionType.ABSOLUTE);
|
||||||
|
root_child0.setWidth(100f);
|
||||||
|
root_child0.setHeight(100f);
|
||||||
|
root_child0.setDisplay(YogaDisplay.NONE);
|
||||||
|
root.addChildAt(root_child0, 0);
|
||||||
|
root.setDirection(YogaDirection.LTR);
|
||||||
|
root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED);
|
||||||
|
|
||||||
|
assertEquals(0f, root.getLayoutX(), 0.0f);
|
||||||
|
assertEquals(0f, root.getLayoutY(), 0.0f);
|
||||||
|
assertEquals(100f, root.getLayoutWidth(), 0.0f);
|
||||||
|
assertEquals(100f, root.getLayoutHeight(), 0.0f);
|
||||||
|
|
||||||
|
assertEquals(0f, root_child0.getLayoutX(), 0.0f);
|
||||||
|
assertEquals(0f, root_child0.getLayoutY(), 0.0f);
|
||||||
|
assertEquals(0f, root_child0.getLayoutWidth(), 0.0f);
|
||||||
|
assertEquals(0f, root_child0.getLayoutHeight(), 0.0f);
|
||||||
|
|
||||||
|
root.setDirection(YogaDirection.RTL);
|
||||||
|
root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED);
|
||||||
|
|
||||||
|
assertEquals(0f, root.getLayoutX(), 0.0f);
|
||||||
|
assertEquals(0f, root.getLayoutY(), 0.0f);
|
||||||
|
assertEquals(100f, root.getLayoutWidth(), 0.0f);
|
||||||
|
assertEquals(100f, root.getLayoutHeight(), 0.0f);
|
||||||
|
|
||||||
|
assertEquals(0f, root_child0.getLayoutX(), 0.0f);
|
||||||
|
assertEquals(0f, root_child0.getLayoutY(), 0.0f);
|
||||||
|
assertEquals(0f, root_child0.getLayoutWidth(), 0.0f);
|
||||||
|
assertEquals(0f, root_child0.getLayoutHeight(), 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
private YogaNode createNode(YogaConfig config) {
|
private YogaNode createNode(YogaConfig config) {
|
||||||
return mNodeFactory.create(config);
|
return mNodeFactory.create(config);
|
||||||
}
|
}
|
||||||
|
@@ -9,10 +9,62 @@ package com.facebook.yoga;
|
|||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
public class YogaLoggerTest {
|
public class YogaLoggerTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRemovingLoggerFromConfig() throws Exception {
|
||||||
|
final List<String> logs = new ArrayList<>();
|
||||||
|
|
||||||
|
final YogaConfig config = YogaConfigFactory.create();
|
||||||
|
YogaLogger logger = new YogaLogger() {
|
||||||
|
@Override
|
||||||
|
public void log(YogaLogLevel level, String message) {
|
||||||
|
logs.add(message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
config.setLogger(logger);
|
||||||
|
|
||||||
|
final YogaNode root = YogaNodeFactory.create(config);
|
||||||
|
root.setFlexDirection(YogaFlexDirection.ROW);
|
||||||
|
root.setAlignItems(YogaAlign.BASELINE);
|
||||||
|
|
||||||
|
final YogaNode child1 = YogaNodeFactory.create(config);
|
||||||
|
root.addChildAt(child1, 0);
|
||||||
|
|
||||||
|
final YogaNode child2 = YogaNodeFactory.create(config);
|
||||||
|
child2.setBaselineFunction(new YogaBaselineFunction() {
|
||||||
|
public float baseline(YogaNode node, float width, float height) {
|
||||||
|
return Float.NaN;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
root.addChildAt(child2, 1);
|
||||||
|
|
||||||
|
assertEquals(logs.size(), 0);
|
||||||
|
try {
|
||||||
|
root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED);
|
||||||
|
fail("Expected calculateLayout to throw");
|
||||||
|
} catch (IllegalStateException e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(logs.size(), 1);
|
||||||
|
|
||||||
|
config.setLogger(null);
|
||||||
|
|
||||||
|
try {
|
||||||
|
root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED);
|
||||||
|
fail("Expected calculateLayout to throw again");
|
||||||
|
} catch (IllegalStateException e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(logs.size(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLoggerLeak() throws Exception {
|
public void testLoggerLeak() throws Exception {
|
||||||
final YogaConfig config = YogaConfigFactory.create();
|
final YogaConfig config = YogaConfigFactory.create();
|
||||||
|
@@ -191,7 +191,7 @@ public class YogaNodeStylePropertiesTest {
|
|||||||
public void testPositionTypeDefault() {
|
public void testPositionTypeDefault() {
|
||||||
final YogaNode node = createNode();
|
final YogaNode node = createNode();
|
||||||
|
|
||||||
assertEquals(YogaPositionType.RELATIVE, node.getPositionType());
|
assertEquals(YogaPositionType.STATIC, node.getPositionType());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@@ -7,5 +7,9 @@
|
|||||||
[lints]
|
[lints]
|
||||||
|
|
||||||
[options]
|
[options]
|
||||||
|
types_first=false
|
||||||
|
|
||||||
[strict]
|
[strict]
|
||||||
|
|
||||||
|
[version]
|
||||||
|
^0.140.0
|
||||||
|
@@ -23,8 +23,8 @@ static YGSize globalMeasureFunc(
|
|||||||
Node const& node = *reinterpret_cast<Node const*>(YGNodeGetContext(nodeRef));
|
Node const& node = *reinterpret_cast<Node const*>(YGNodeGetContext(nodeRef));
|
||||||
|
|
||||||
Size size = node.callMeasureFunc(width, widthMode, height, heightMode);
|
Size size = node.callMeasureFunc(width, widthMode, height, heightMode);
|
||||||
YGSize ygSize = {static_cast<float>(size.width),
|
YGSize ygSize = {
|
||||||
static_cast<float>(size.height)};
|
static_cast<float>(size.width), static_cast<float>(size.height)};
|
||||||
|
|
||||||
return ygSize;
|
return ygSize;
|
||||||
}
|
}
|
||||||
|
@@ -1,9 +1,10 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
*
|
*
|
||||||
* This source code is licensed under the MIT license found in the LICENSE
|
* This source code is licensed under the MIT license found in the
|
||||||
* file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// @Generated by gentest/gentest.rb from gentest/fixtures/YGDisplayTest.html
|
// @Generated by gentest/gentest.rb from gentest/fixtures/YGDisplayTest.html
|
||||||
|
|
||||||
var Yoga = Yoga || require("../../sources/entry-" + process.env.TEST_ENTRY);
|
var Yoga = Yoga || require("../../sources/entry-" + process.env.TEST_ENTRY);
|
||||||
@@ -342,3 +343,48 @@ it("display_none_with_position", function () {
|
|||||||
config.free();
|
config.free();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
it("display_none_with_position_absolute", function () {
|
||||||
|
var config = Yoga.Config.create();
|
||||||
|
|
||||||
|
try {
|
||||||
|
var root = Yoga.Node.create(config);
|
||||||
|
root.setWidth(100);
|
||||||
|
root.setHeight(100);
|
||||||
|
|
||||||
|
var root_child0 = Yoga.Node.create(config);
|
||||||
|
root_child0.setPositionType(Yoga.POSITION_TYPE_ABSOLUTE);
|
||||||
|
root_child0.setWidth(100);
|
||||||
|
root_child0.setHeight(100);
|
||||||
|
root_child0.setDisplay(Yoga.DISPLAY_NONE);
|
||||||
|
root.insertChild(root_child0, 0);
|
||||||
|
root.calculateLayout(Yoga.UNDEFINED, Yoga.UNDEFINED, Yoga.DIRECTION_LTR);
|
||||||
|
|
||||||
|
console.assert(0 === root.getComputedLeft(), "0 === root.getComputedLeft() (" + root.getComputedLeft() + ")");
|
||||||
|
console.assert(0 === root.getComputedTop(), "0 === root.getComputedTop() (" + root.getComputedTop() + ")");
|
||||||
|
console.assert(100 === root.getComputedWidth(), "100 === root.getComputedWidth() (" + root.getComputedWidth() + ")");
|
||||||
|
console.assert(100 === root.getComputedHeight(), "100 === root.getComputedHeight() (" + root.getComputedHeight() + ")");
|
||||||
|
|
||||||
|
console.assert(0 === root_child0.getComputedLeft(), "0 === root_child0.getComputedLeft() (" + root_child0.getComputedLeft() + ")");
|
||||||
|
console.assert(0 === root_child0.getComputedTop(), "0 === root_child0.getComputedTop() (" + root_child0.getComputedTop() + ")");
|
||||||
|
console.assert(0 === root_child0.getComputedWidth(), "0 === root_child0.getComputedWidth() (" + root_child0.getComputedWidth() + ")");
|
||||||
|
console.assert(0 === root_child0.getComputedHeight(), "0 === root_child0.getComputedHeight() (" + root_child0.getComputedHeight() + ")");
|
||||||
|
|
||||||
|
root.calculateLayout(Yoga.UNDEFINED, Yoga.UNDEFINED, Yoga.DIRECTION_RTL);
|
||||||
|
|
||||||
|
console.assert(0 === root.getComputedLeft(), "0 === root.getComputedLeft() (" + root.getComputedLeft() + ")");
|
||||||
|
console.assert(0 === root.getComputedTop(), "0 === root.getComputedTop() (" + root.getComputedTop() + ")");
|
||||||
|
console.assert(100 === root.getComputedWidth(), "100 === root.getComputedWidth() (" + root.getComputedWidth() + ")");
|
||||||
|
console.assert(100 === root.getComputedHeight(), "100 === root.getComputedHeight() (" + root.getComputedHeight() + ")");
|
||||||
|
|
||||||
|
console.assert(0 === root_child0.getComputedLeft(), "0 === root_child0.getComputedLeft() (" + root_child0.getComputedLeft() + ")");
|
||||||
|
console.assert(0 === root_child0.getComputedTop(), "0 === root_child0.getComputedTop() (" + root_child0.getComputedTop() + ")");
|
||||||
|
console.assert(0 === root_child0.getComputedWidth(), "0 === root_child0.getComputedWidth() (" + root_child0.getComputedWidth() + ")");
|
||||||
|
console.assert(0 === root_child0.getComputedHeight(), "0 === root_child0.getComputedHeight() (" + root_child0.getComputedHeight() + ")");
|
||||||
|
} finally {
|
||||||
|
if (typeof root !== "undefined") {
|
||||||
|
root.freeRecursive();
|
||||||
|
}
|
||||||
|
|
||||||
|
config.free();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
@@ -303,8 +303,8 @@ EventArgs createArgs(
|
|||||||
};
|
};
|
||||||
|
|
||||||
EventArgs args = createArgs<E>(node, data);
|
EventArgs args = createArgs<E>(node, data);
|
||||||
args.eventTestDataPtr = {new EventTestData{eventTestData},
|
args.eventTestDataPtr = {
|
||||||
deleteEventTestData};
|
new EventTestData{eventTestData}, deleteEventTestData};
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -29,12 +29,13 @@ TEST(YogaTest, computed_layout_margin) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST(YogaTest, margin_side_overrides_horizontal_and_vertical) {
|
TEST(YogaTest, margin_side_overrides_horizontal_and_vertical) {
|
||||||
const std::array<YGEdge, 6> edges = {{YGEdgeTop,
|
const std::array<YGEdge, 6> edges = {
|
||||||
YGEdgeBottom,
|
{YGEdgeTop,
|
||||||
YGEdgeStart,
|
YGEdgeBottom,
|
||||||
YGEdgeEnd,
|
YGEdgeStart,
|
||||||
YGEdgeLeft,
|
YGEdgeEnd,
|
||||||
YGEdgeRight}};
|
YGEdgeLeft,
|
||||||
|
YGEdgeRight}};
|
||||||
|
|
||||||
for (float edgeValue = 0; edgeValue < 2; ++edgeValue) {
|
for (float edgeValue = 0; edgeValue < 2; ++edgeValue) {
|
||||||
for (const auto& edge : edges) {
|
for (const auto& edge : edges) {
|
||||||
@@ -58,12 +59,13 @@ TEST(YogaTest, margin_side_overrides_horizontal_and_vertical) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST(YogaTest, margin_side_overrides_all) {
|
TEST(YogaTest, margin_side_overrides_all) {
|
||||||
const std::array<YGEdge, 6> edges = {{YGEdgeTop,
|
const std::array<YGEdge, 6> edges = {
|
||||||
YGEdgeBottom,
|
{YGEdgeTop,
|
||||||
YGEdgeStart,
|
YGEdgeBottom,
|
||||||
YGEdgeEnd,
|
YGEdgeStart,
|
||||||
YGEdgeLeft,
|
YGEdgeEnd,
|
||||||
YGEdgeRight}};
|
YGEdgeLeft,
|
||||||
|
YGEdgeRight}};
|
||||||
|
|
||||||
for (float edgeValue = 0; edgeValue < 2; ++edgeValue) {
|
for (float edgeValue = 0; edgeValue < 2; ++edgeValue) {
|
||||||
for (const auto& edge : edges) {
|
for (const auto& edge : edges) {
|
||||||
|
@@ -29,12 +29,13 @@ TEST(YogaTest, computed_layout_padding) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST(YogaTest, padding_side_overrides_horizontal_and_vertical) {
|
TEST(YogaTest, padding_side_overrides_horizontal_and_vertical) {
|
||||||
const std::array<YGEdge, 6> edges = {{YGEdgeTop,
|
const std::array<YGEdge, 6> edges = {
|
||||||
YGEdgeBottom,
|
{YGEdgeTop,
|
||||||
YGEdgeStart,
|
YGEdgeBottom,
|
||||||
YGEdgeEnd,
|
YGEdgeStart,
|
||||||
YGEdgeLeft,
|
YGEdgeEnd,
|
||||||
YGEdgeRight}};
|
YGEdgeLeft,
|
||||||
|
YGEdgeRight}};
|
||||||
|
|
||||||
for (float edgeValue = 0; edgeValue < 2; ++edgeValue) {
|
for (float edgeValue = 0; edgeValue < 2; ++edgeValue) {
|
||||||
for (const auto& edge : edges) {
|
for (const auto& edge : edges) {
|
||||||
@@ -58,12 +59,13 @@ TEST(YogaTest, padding_side_overrides_horizontal_and_vertical) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST(YogaTest, padding_side_overrides_all) {
|
TEST(YogaTest, padding_side_overrides_all) {
|
||||||
const std::array<YGEdge, 6> edges = {{YGEdgeTop,
|
const std::array<YGEdge, 6> edges = {
|
||||||
YGEdgeBottom,
|
{YGEdgeTop,
|
||||||
YGEdgeStart,
|
YGEdgeBottom,
|
||||||
YGEdgeEnd,
|
YGEdgeStart,
|
||||||
YGEdgeLeft,
|
YGEdgeEnd,
|
||||||
YGEdgeRight}};
|
YGEdgeLeft,
|
||||||
|
YGEdgeRight}};
|
||||||
|
|
||||||
for (float edgeValue = 0; edgeValue < 2; ++edgeValue) {
|
for (float edgeValue = 0; edgeValue < 2; ++edgeValue) {
|
||||||
for (const auto& edge : edges) {
|
for (const auto& edge : edges) {
|
||||||
|
@@ -20,7 +20,7 @@ TEST(YogaTest, assert_default_values) {
|
|||||||
ASSERT_EQ(YGAlignFlexStart, YGNodeStyleGetAlignContent(root));
|
ASSERT_EQ(YGAlignFlexStart, YGNodeStyleGetAlignContent(root));
|
||||||
ASSERT_EQ(YGAlignStretch, YGNodeStyleGetAlignItems(root));
|
ASSERT_EQ(YGAlignStretch, YGNodeStyleGetAlignItems(root));
|
||||||
ASSERT_EQ(YGAlignAuto, YGNodeStyleGetAlignSelf(root));
|
ASSERT_EQ(YGAlignAuto, YGNodeStyleGetAlignSelf(root));
|
||||||
ASSERT_EQ(YGPositionTypeRelative, YGNodeStyleGetPositionType(root));
|
ASSERT_EQ(YGPositionTypeStatic, YGNodeStyleGetPositionType(root));
|
||||||
ASSERT_EQ(YGWrapNoWrap, YGNodeStyleGetFlexWrap(root));
|
ASSERT_EQ(YGWrapNoWrap, YGNodeStyleGetFlexWrap(root));
|
||||||
ASSERT_EQ(YGOverflowVisible, YGNodeStyleGetOverflow(root));
|
ASSERT_EQ(YGOverflowVisible, YGNodeStyleGetOverflow(root));
|
||||||
ASSERT_FLOAT_EQ(0, YGNodeStyleGetFlexGrow(root));
|
ASSERT_FLOAT_EQ(0, YGNodeStyleGetFlexGrow(root));
|
||||||
|
@@ -1,9 +1,10 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
*
|
*
|
||||||
* This source code is licensed under the MIT license found in the LICENSE
|
* This source code is licensed under the MIT license found in the
|
||||||
* file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// @Generated by gentest/gentest.rb from gentest/fixtures/YGDisplayTest.html
|
// @Generated by gentest/gentest.rb from gentest/fixtures/YGDisplayTest.html
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
@@ -327,3 +328,45 @@ TEST(YogaTest, display_none_with_position) {
|
|||||||
|
|
||||||
YGConfigFree(config);
|
YGConfigFree(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(YogaTest, display_none_with_position_absolute) {
|
||||||
|
const YGConfigRef config = YGConfigNew();
|
||||||
|
|
||||||
|
const YGNodeRef root = YGNodeNewWithConfig(config);
|
||||||
|
YGNodeStyleSetWidth(root, 100);
|
||||||
|
YGNodeStyleSetHeight(root, 100);
|
||||||
|
|
||||||
|
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
|
||||||
|
YGNodeStyleSetPositionType(root_child0, YGPositionTypeAbsolute);
|
||||||
|
YGNodeStyleSetWidth(root_child0, 100);
|
||||||
|
YGNodeStyleSetHeight(root_child0, 100);
|
||||||
|
YGNodeStyleSetDisplay(root_child0, YGDisplayNone);
|
||||||
|
YGNodeInsertChild(root, root_child0, 0);
|
||||||
|
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child0));
|
||||||
|
|
||||||
|
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child0));
|
||||||
|
|
||||||
|
YGNodeFreeRecursive(root);
|
||||||
|
|
||||||
|
YGConfigFree(config);
|
||||||
|
}
|
||||||
|
@@ -132,9 +132,10 @@ ACCESSOR_TEST(
|
|||||||
|
|
||||||
ACCESSOR_TEST(
|
ACCESSOR_TEST(
|
||||||
positionType,
|
positionType,
|
||||||
YGPositionTypeRelative,
|
YGPositionTypeStatic,
|
||||||
YGPositionTypeAbsolute,
|
YGPositionTypeAbsolute,
|
||||||
YGPositionTypeRelative)
|
YGPositionTypeRelative,
|
||||||
|
YGPositionTypeStatic)
|
||||||
|
|
||||||
ACCESSOR_TEST(
|
ACCESSOR_TEST(
|
||||||
flexWrap,
|
flexWrap,
|
||||||
|
@@ -29,8 +29,8 @@ TEST(YogaTest, set_children_adds_children_to_parent) {
|
|||||||
const std::vector<YGNodeRef> expectedChildren = {root_child0, root_child1};
|
const std::vector<YGNodeRef> expectedChildren = {root_child0, root_child1};
|
||||||
ASSERT_EQ(children, expectedChildren);
|
ASSERT_EQ(children, expectedChildren);
|
||||||
|
|
||||||
const std::vector<YGNodeRef> owners = {YGNodeGetOwner(root_child0),
|
const std::vector<YGNodeRef> owners = {
|
||||||
YGNodeGetOwner(root_child1)};
|
YGNodeGetOwner(root_child0), YGNodeGetOwner(root_child1)};
|
||||||
const std::vector<YGNodeRef> expectedOwners = {root, root};
|
const std::vector<YGNodeRef> expectedOwners = {root, root};
|
||||||
ASSERT_EQ(owners, expectedOwners);
|
ASSERT_EQ(owners, expectedOwners);
|
||||||
|
|
||||||
@@ -49,8 +49,8 @@ TEST(YogaTest, set_children_to_empty_removes_old_children) {
|
|||||||
const std::vector<YGNodeRef> expectedChildren = {};
|
const std::vector<YGNodeRef> expectedChildren = {};
|
||||||
ASSERT_EQ(children, expectedChildren);
|
ASSERT_EQ(children, expectedChildren);
|
||||||
|
|
||||||
const std::vector<YGNodeRef> owners = {YGNodeGetOwner(root_child0),
|
const std::vector<YGNodeRef> owners = {
|
||||||
YGNodeGetOwner(root_child1)};
|
YGNodeGetOwner(root_child0), YGNodeGetOwner(root_child1)};
|
||||||
const std::vector<YGNodeRef> expectedOwners = {nullptr, nullptr};
|
const std::vector<YGNodeRef> expectedOwners = {nullptr, nullptr};
|
||||||
ASSERT_EQ(owners, expectedOwners);
|
ASSERT_EQ(owners, expectedOwners);
|
||||||
|
|
||||||
@@ -73,8 +73,8 @@ TEST(YogaTest, set_children_replaces_non_common_children) {
|
|||||||
const std::vector<YGNodeRef> expectedChildren = {root_child2, root_child3};
|
const std::vector<YGNodeRef> expectedChildren = {root_child2, root_child3};
|
||||||
ASSERT_EQ(children, expectedChildren);
|
ASSERT_EQ(children, expectedChildren);
|
||||||
|
|
||||||
const std::vector<YGNodeRef> owners = {YGNodeGetOwner(root_child0),
|
const std::vector<YGNodeRef> owners = {
|
||||||
YGNodeGetOwner(root_child1)};
|
YGNodeGetOwner(root_child0), YGNodeGetOwner(root_child1)};
|
||||||
const std::vector<YGNodeRef> expectedOwners = {nullptr, nullptr};
|
const std::vector<YGNodeRef> expectedOwners = {nullptr, nullptr};
|
||||||
ASSERT_EQ(owners, expectedOwners);
|
ASSERT_EQ(owners, expectedOwners);
|
||||||
|
|
||||||
@@ -100,10 +100,11 @@ TEST(YogaTest, set_children_keeps_and_reorders_common_children) {
|
|||||||
root_child2, root_child1, root_child3};
|
root_child2, root_child1, root_child3};
|
||||||
ASSERT_EQ(children, expectedChildren);
|
ASSERT_EQ(children, expectedChildren);
|
||||||
|
|
||||||
const std::vector<YGNodeRef> owners = {YGNodeGetOwner(root_child0),
|
const std::vector<YGNodeRef> owners = {
|
||||||
YGNodeGetOwner(root_child1),
|
YGNodeGetOwner(root_child0),
|
||||||
YGNodeGetOwner(root_child2),
|
YGNodeGetOwner(root_child1),
|
||||||
YGNodeGetOwner(root_child3)};
|
YGNodeGetOwner(root_child2),
|
||||||
|
YGNodeGetOwner(root_child3)};
|
||||||
const std::vector<YGNodeRef> expectedOwners = {nullptr, root, root, root};
|
const std::vector<YGNodeRef> expectedOwners = {nullptr, root, root, root};
|
||||||
ASSERT_EQ(owners, expectedOwners);
|
ASSERT_EQ(owners, expectedOwners);
|
||||||
|
|
||||||
|
@@ -7,5 +7,9 @@
|
|||||||
[lints]
|
[lints]
|
||||||
|
|
||||||
[options]
|
[options]
|
||||||
|
types_first=false
|
||||||
|
|
||||||
[strict]
|
[strict]
|
||||||
|
|
||||||
|
[version]
|
||||||
|
^0.140.0
|
||||||
|
@@ -73,9 +73,9 @@ function keyLookup(key: string): string {
|
|||||||
|
|
||||||
function getValue(value) {
|
function getValue(value) {
|
||||||
if (typeof value === 'string' && /%$/.test(value)) {
|
if (typeof value === 'string' && /%$/.test(value)) {
|
||||||
return `CKRelativeDimension::Percent(${parseFloat(value)})`;
|
return `RCRelativeDimension::Percent(${parseFloat(value)})`;
|
||||||
} else if (value === 'auto') {
|
} else if (value === 'auto') {
|
||||||
return 'CKRelativeDimension::Auto()';
|
return 'RCRelativeDimension::Auto()';
|
||||||
} else {
|
} else {
|
||||||
return String(parseFloat(value));
|
return String(parseFloat(value));
|
||||||
}
|
}
|
||||||
|
@@ -24,7 +24,7 @@ function getEnum(yogaEnum: string, value: string | number): string {
|
|||||||
position: 'Position',
|
position: 'Position',
|
||||||
flexWrap: 'Wrap',
|
flexWrap: 'Wrap',
|
||||||
positionType: 'PositionType',
|
positionType: 'PositionType',
|
||||||
direction: 'Driection',
|
direction: 'Direction',
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!enumLookup[yogaEnum]) {
|
if (!enumLookup[yogaEnum]) {
|
||||||
|
@@ -45,8 +45,9 @@ void setEnumData(uint32_t& flags, size_t index, int newValue) {
|
|||||||
|
|
||||||
template <typename Enum>
|
template <typename Enum>
|
||||||
void setEnumData(uint8_t& flags, size_t index, int newValue) {
|
void setEnumData(uint8_t& flags, size_t index, int newValue) {
|
||||||
flags = (flags & ~mask(bitWidthFn<Enum>(), index)) |
|
flags = (flags & ~static_cast<uint8_t>(mask(bitWidthFn<Enum>(), index))) |
|
||||||
((newValue << index) & (mask(bitWidthFn<Enum>(), index)));
|
((newValue << index) &
|
||||||
|
(static_cast<uint8_t>(mask(bitWidthFn<Enum>(), index))));
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr bool getBooleanData(int flags, size_t index) {
|
constexpr bool getBooleanData(int flags, size_t index) {
|
||||||
|
@@ -125,8 +125,8 @@ public:
|
|||||||
data.repr &= ~PERCENT_BIT;
|
data.repr &= ~PERCENT_BIT;
|
||||||
data.repr += BIAS;
|
data.repr += BIAS;
|
||||||
|
|
||||||
return YGValue{data.value,
|
return YGValue{
|
||||||
payload_.repr & 0x40000000 ? YGUnitPercent : YGUnitPoint};
|
data.value, payload_.repr & 0x40000000 ? YGUnitPercent : YGUnitPoint};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isUndefined() const noexcept {
|
bool isUndefined() const noexcept {
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
using namespace facebook;
|
using namespace facebook;
|
||||||
|
|
||||||
@@ -52,6 +53,13 @@ bool YGFloatsEqual(const float a, const float b) {
|
|||||||
return yoga::isUndefined(a) && yoga::isUndefined(b);
|
return yoga::isUndefined(a) && yoga::isUndefined(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool YGDoubleEqual(const double a, const double b) {
|
||||||
|
if (!yoga::isUndefined(a) && !yoga::isUndefined(b)) {
|
||||||
|
return fabs(a - b) < 0.0001;
|
||||||
|
}
|
||||||
|
return yoga::isUndefined(a) && yoga::isUndefined(b);
|
||||||
|
}
|
||||||
|
|
||||||
float YGFloatSanitize(const float val) {
|
float YGFloatSanitize(const float val) {
|
||||||
return yoga::isUndefined(val) ? 0 : val;
|
return yoga::isUndefined(val) ? 0 : val;
|
||||||
}
|
}
|
||||||
|
@@ -64,6 +64,8 @@ inline bool YGValueEqual(
|
|||||||
// difference between two floats is less than 0.0001f or both are undefined.
|
// difference between two floats is less than 0.0001f or both are undefined.
|
||||||
bool YGFloatsEqual(const float a, const float b);
|
bool YGFloatsEqual(const float a, const float b);
|
||||||
|
|
||||||
|
bool YGDoubleEqual(const double a, const double b);
|
||||||
|
|
||||||
float YGFloatMax(const float a, const float b);
|
float YGFloatMax(const float a, const float b);
|
||||||
|
|
||||||
YGFloatOptional YGFloatOptionalMax(
|
YGFloatOptional YGFloatOptionalMax(
|
||||||
|
@@ -179,6 +179,8 @@ const char* YGOverflowToString(const YGOverflow value) {
|
|||||||
|
|
||||||
const char* YGPositionTypeToString(const YGPositionType value) {
|
const char* YGPositionTypeToString(const YGPositionType value) {
|
||||||
switch (value) {
|
switch (value) {
|
||||||
|
case YGPositionTypeStatic:
|
||||||
|
return "static";
|
||||||
case YGPositionTypeRelative:
|
case YGPositionTypeRelative:
|
||||||
return "relative";
|
return "relative";
|
||||||
case YGPositionTypeAbsolute:
|
case YGPositionTypeAbsolute:
|
||||||
|
@@ -128,7 +128,11 @@ YG_ENUM_SEQ_DECL(
|
|||||||
YGOverflowHidden,
|
YGOverflowHidden,
|
||||||
YGOverflowScroll)
|
YGOverflowScroll)
|
||||||
|
|
||||||
YG_ENUM_SEQ_DECL(YGPositionType, YGPositionTypeRelative, YGPositionTypeAbsolute)
|
YG_ENUM_SEQ_DECL(
|
||||||
|
YGPositionType,
|
||||||
|
YGPositionTypeStatic,
|
||||||
|
YGPositionTypeRelative,
|
||||||
|
YGPositionTypeAbsolute)
|
||||||
|
|
||||||
YG_ENUM_DECL(
|
YG_ENUM_DECL(
|
||||||
YGPrintOptions,
|
YGPrintOptions,
|
||||||
|
226
yoga/YGNode.cpp
226
yoga/YGNode.cpp
@@ -50,89 +50,111 @@ void YGNode::print(void* printContext) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CompactValue YGNode::computeEdgeValueForRow(
|
||||||
|
const YGStyle::Edges& edges,
|
||||||
|
YGEdge rowEdge,
|
||||||
|
YGEdge edge,
|
||||||
|
CompactValue defaultValue) {
|
||||||
|
if (!edges[rowEdge].isUndefined()) {
|
||||||
|
return edges[rowEdge];
|
||||||
|
} else if (!edges[edge].isUndefined()) {
|
||||||
|
return edges[edge];
|
||||||
|
} else if (!edges[YGEdgeHorizontal].isUndefined()) {
|
||||||
|
return edges[YGEdgeHorizontal];
|
||||||
|
} else if (!edges[YGEdgeAll].isUndefined()) {
|
||||||
|
return edges[YGEdgeAll];
|
||||||
|
} else {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CompactValue YGNode::computeEdgeValueForColumn(
|
||||||
|
const YGStyle::Edges& edges,
|
||||||
|
YGEdge edge,
|
||||||
|
CompactValue defaultValue) {
|
||||||
|
if (!edges[edge].isUndefined()) {
|
||||||
|
return edges[edge];
|
||||||
|
} else if (!edges[YGEdgeVertical].isUndefined()) {
|
||||||
|
return edges[YGEdgeVertical];
|
||||||
|
} else if (!edges[YGEdgeAll].isUndefined()) {
|
||||||
|
return edges[YGEdgeAll];
|
||||||
|
} else {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
YGFloatOptional YGNode::getLeadingPosition(
|
YGFloatOptional YGNode::getLeadingPosition(
|
||||||
const YGFlexDirection axis,
|
const YGFlexDirection axis,
|
||||||
const float axisSize) const {
|
const float axisSize) const {
|
||||||
if (YGFlexDirectionIsRow(axis)) {
|
auto leadingPosition = YGFlexDirectionIsRow(axis)
|
||||||
auto leadingPosition = YGComputedEdgeValue(
|
? computeEdgeValueForRow(
|
||||||
style_.position(), YGEdgeStart, CompactValue::ofUndefined());
|
style_.position(),
|
||||||
if (!leadingPosition.isUndefined()) {
|
YGEdgeStart,
|
||||||
return YGResolveValue(leadingPosition, axisSize);
|
leading[axis],
|
||||||
}
|
CompactValue::ofZero())
|
||||||
}
|
: computeEdgeValueForColumn(
|
||||||
|
style_.position(), leading[axis], CompactValue::ofZero());
|
||||||
auto leadingPosition = YGComputedEdgeValue(
|
return YGResolveValue(leadingPosition, axisSize);
|
||||||
style_.position(), leading[axis], CompactValue::ofUndefined());
|
|
||||||
|
|
||||||
return leadingPosition.isUndefined()
|
|
||||||
? YGFloatOptional{0}
|
|
||||||
: YGResolveValue(leadingPosition, axisSize);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
YGFloatOptional YGNode::getTrailingPosition(
|
YGFloatOptional YGNode::getTrailingPosition(
|
||||||
const YGFlexDirection axis,
|
const YGFlexDirection axis,
|
||||||
const float axisSize) const {
|
const float axisSize) const {
|
||||||
if (YGFlexDirectionIsRow(axis)) {
|
auto trailingPosition = YGFlexDirectionIsRow(axis)
|
||||||
auto trailingPosition = YGComputedEdgeValue(
|
? computeEdgeValueForRow(
|
||||||
style_.position(), YGEdgeEnd, CompactValue::ofUndefined());
|
style_.position(),
|
||||||
if (!trailingPosition.isUndefined()) {
|
YGEdgeEnd,
|
||||||
return YGResolveValue(trailingPosition, axisSize);
|
trailing[axis],
|
||||||
}
|
CompactValue::ofZero())
|
||||||
}
|
: computeEdgeValueForColumn(
|
||||||
|
style_.position(), trailing[axis], CompactValue::ofZero());
|
||||||
auto trailingPosition = YGComputedEdgeValue(
|
return YGResolveValue(trailingPosition, axisSize);
|
||||||
style_.position(), trailing[axis], CompactValue::ofUndefined());
|
|
||||||
|
|
||||||
return trailingPosition.isUndefined()
|
|
||||||
? YGFloatOptional{0}
|
|
||||||
: YGResolveValue(trailingPosition, axisSize);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool YGNode::isLeadingPositionDefined(const YGFlexDirection axis) const {
|
bool YGNode::isLeadingPositionDefined(const YGFlexDirection axis) const {
|
||||||
return (YGFlexDirectionIsRow(axis) &&
|
auto leadingPosition = YGFlexDirectionIsRow(axis)
|
||||||
!YGComputedEdgeValue(
|
? computeEdgeValueForRow(
|
||||||
style_.position(), YGEdgeStart, CompactValue::ofUndefined())
|
style_.position(),
|
||||||
.isUndefined()) ||
|
YGEdgeStart,
|
||||||
!YGComputedEdgeValue(
|
leading[axis],
|
||||||
style_.position(), leading[axis], CompactValue::ofUndefined())
|
CompactValue::ofUndefined())
|
||||||
.isUndefined();
|
: computeEdgeValueForColumn(
|
||||||
|
style_.position(), leading[axis], CompactValue::ofUndefined());
|
||||||
|
return !leadingPosition.isUndefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool YGNode::isTrailingPosDefined(const YGFlexDirection axis) const {
|
bool YGNode::isTrailingPosDefined(const YGFlexDirection axis) const {
|
||||||
return (YGFlexDirectionIsRow(axis) &&
|
auto trailingPosition = YGFlexDirectionIsRow(axis)
|
||||||
!YGComputedEdgeValue(
|
? computeEdgeValueForRow(
|
||||||
style_.position(), YGEdgeEnd, CompactValue::ofUndefined())
|
style_.position(),
|
||||||
.isUndefined()) ||
|
YGEdgeEnd,
|
||||||
!YGComputedEdgeValue(
|
trailing[axis],
|
||||||
style_.position(), trailing[axis], CompactValue::ofUndefined())
|
CompactValue::ofUndefined())
|
||||||
.isUndefined();
|
: computeEdgeValueForColumn(
|
||||||
|
style_.position(), trailing[axis], CompactValue::ofUndefined());
|
||||||
|
return !trailingPosition.isUndefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
YGFloatOptional YGNode::getLeadingMargin(
|
YGFloatOptional YGNode::getLeadingMargin(
|
||||||
const YGFlexDirection axis,
|
const YGFlexDirection axis,
|
||||||
const float widthSize) const {
|
const float widthSize) const {
|
||||||
if (YGFlexDirectionIsRow(axis) &&
|
auto leadingMargin = YGFlexDirectionIsRow(axis)
|
||||||
!style_.margin()[YGEdgeStart].isUndefined()) {
|
? computeEdgeValueForRow(
|
||||||
return YGResolveValueMargin(style_.margin()[YGEdgeStart], widthSize);
|
style_.margin(), YGEdgeStart, leading[axis], CompactValue::ofZero())
|
||||||
}
|
: computeEdgeValueForColumn(
|
||||||
|
style_.margin(), leading[axis], CompactValue::ofZero());
|
||||||
return YGResolveValueMargin(
|
return YGResolveValueMargin(leadingMargin, widthSize);
|
||||||
YGComputedEdgeValue(
|
|
||||||
style_.margin(), leading[axis], CompactValue::ofZero()),
|
|
||||||
widthSize);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
YGFloatOptional YGNode::getTrailingMargin(
|
YGFloatOptional YGNode::getTrailingMargin(
|
||||||
const YGFlexDirection axis,
|
const YGFlexDirection axis,
|
||||||
const float widthSize) const {
|
const float widthSize) const {
|
||||||
if (YGFlexDirectionIsRow(axis) && !style_.margin()[YGEdgeEnd].isUndefined()) {
|
auto trailingMargin = YGFlexDirectionIsRow(axis)
|
||||||
return YGResolveValueMargin(style_.margin()[YGEdgeEnd], widthSize);
|
? computeEdgeValueForRow(
|
||||||
}
|
style_.margin(), YGEdgeEnd, trailing[axis], CompactValue::ofZero())
|
||||||
|
: computeEdgeValueForColumn(
|
||||||
return YGResolveValueMargin(
|
style_.margin(), trailing[axis], CompactValue::ofZero());
|
||||||
YGComputedEdgeValue(
|
return YGResolveValueMargin(trailingMargin, widthSize);
|
||||||
style_.margin(), trailing[axis], CompactValue::ofZero()),
|
|
||||||
widthSize);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
YGFloatOptional YGNode::getMarginForAxis(
|
YGFloatOptional YGNode::getMarginForAxis(
|
||||||
@@ -147,7 +169,6 @@ YGSize YGNode::measure(
|
|||||||
float height,
|
float height,
|
||||||
YGMeasureMode heightMode,
|
YGMeasureMode heightMode,
|
||||||
void* layoutContext) {
|
void* layoutContext) {
|
||||||
|
|
||||||
return facebook::yoga::detail::getBooleanData(flags, measureUsesContext_)
|
return facebook::yoga::detail::getBooleanData(flags, measureUsesContext_)
|
||||||
? measure_.withContext(
|
? measure_.withContext(
|
||||||
this, width, widthMode, height, heightMode, layoutContext)
|
this, width, widthMode, height, heightMode, layoutContext)
|
||||||
@@ -307,6 +328,9 @@ void YGNode::setPosition(
|
|||||||
const YGFlexDirection crossAxis =
|
const YGFlexDirection crossAxis =
|
||||||
YGFlexDirectionCross(mainAxis, directionRespectingRoot);
|
YGFlexDirectionCross(mainAxis, directionRespectingRoot);
|
||||||
|
|
||||||
|
// Here we should check for `YGPositionTypeStatic` and in this case zero inset
|
||||||
|
// properties (left, right, top, bottom, begin, end).
|
||||||
|
// https://www.w3.org/TR/css-position-3/#valdef-position-static
|
||||||
const YGFloatOptional relativePositionMain =
|
const YGFloatOptional relativePositionMain =
|
||||||
relativePosition(mainAxis, mainSize);
|
relativePosition(mainAxis, mainSize);
|
||||||
const YGFloatOptional relativePositionCross =
|
const YGFloatOptional relativePositionCross =
|
||||||
@@ -440,73 +464,53 @@ float YGNode::resolveFlexShrink() const {
|
|||||||
|
|
||||||
bool YGNode::isNodeFlexible() {
|
bool YGNode::isNodeFlexible() {
|
||||||
return (
|
return (
|
||||||
(style_.positionType() == YGPositionTypeRelative) &&
|
(style_.positionType() != YGPositionTypeAbsolute) &&
|
||||||
(resolveFlexGrow() != 0 || resolveFlexShrink() != 0));
|
(resolveFlexGrow() != 0 || resolveFlexShrink() != 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
float YGNode::getLeadingBorder(const YGFlexDirection axis) const {
|
float YGNode::getLeadingBorder(const YGFlexDirection axis) const {
|
||||||
YGValue leadingBorder;
|
YGValue leadingBorder = YGFlexDirectionIsRow(axis)
|
||||||
if (YGFlexDirectionIsRow(axis) &&
|
? computeEdgeValueForRow(
|
||||||
!style_.border()[YGEdgeStart].isUndefined()) {
|
style_.border(), YGEdgeStart, leading[axis], CompactValue::ofZero())
|
||||||
leadingBorder = style_.border()[YGEdgeStart];
|
: computeEdgeValueForColumn(
|
||||||
if (leadingBorder.value >= 0) {
|
style_.border(), leading[axis], CompactValue::ofZero());
|
||||||
return leadingBorder.value;
|
return fmaxf(leadingBorder.value, 0.0f);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
leadingBorder = YGComputedEdgeValue(
|
|
||||||
style_.border(), leading[axis], CompactValue::ofZero());
|
|
||||||
return YGFloatMax(leadingBorder.value, 0.0f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float YGNode::getTrailingBorder(const YGFlexDirection flexDirection) const {
|
float YGNode::getTrailingBorder(const YGFlexDirection axis) const {
|
||||||
YGValue trailingBorder;
|
YGValue trailingBorder = YGFlexDirectionIsRow(axis)
|
||||||
if (YGFlexDirectionIsRow(flexDirection) &&
|
? computeEdgeValueForRow(
|
||||||
!style_.border()[YGEdgeEnd].isUndefined()) {
|
style_.border(), YGEdgeEnd, trailing[axis], CompactValue::ofZero())
|
||||||
trailingBorder = style_.border()[YGEdgeEnd];
|
: computeEdgeValueForColumn(
|
||||||
if (trailingBorder.value >= 0.0f) {
|
style_.border(), trailing[axis], CompactValue::ofZero());
|
||||||
return trailingBorder.value;
|
return fmaxf(trailingBorder.value, 0.0f);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
trailingBorder = YGComputedEdgeValue(
|
|
||||||
style_.border(), trailing[flexDirection], CompactValue::ofZero());
|
|
||||||
return YGFloatMax(trailingBorder.value, 0.0f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
YGFloatOptional YGNode::getLeadingPadding(
|
YGFloatOptional YGNode::getLeadingPadding(
|
||||||
const YGFlexDirection axis,
|
const YGFlexDirection axis,
|
||||||
const float widthSize) const {
|
const float widthSize) const {
|
||||||
const YGFloatOptional paddingEdgeStart =
|
auto leadingPadding = YGFlexDirectionIsRow(axis)
|
||||||
YGResolveValue(style_.padding()[YGEdgeStart], widthSize);
|
? computeEdgeValueForRow(
|
||||||
if (YGFlexDirectionIsRow(axis) &&
|
style_.padding(),
|
||||||
!style_.padding()[YGEdgeStart].isUndefined() &&
|
YGEdgeStart,
|
||||||
!paddingEdgeStart.isUndefined() && paddingEdgeStart.unwrap() >= 0.0f) {
|
leading[axis],
|
||||||
return paddingEdgeStart;
|
CompactValue::ofZero())
|
||||||
}
|
: computeEdgeValueForColumn(
|
||||||
|
style_.padding(), leading[axis], CompactValue::ofZero());
|
||||||
YGFloatOptional resolvedValue = YGResolveValue(
|
return YGFloatOptionalMax(
|
||||||
YGComputedEdgeValue(
|
YGResolveValue(leadingPadding, widthSize), YGFloatOptional(0.0f));
|
||||||
style_.padding(), leading[axis], CompactValue::ofZero()),
|
|
||||||
widthSize);
|
|
||||||
return YGFloatOptionalMax(resolvedValue, YGFloatOptional(0.0f));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
YGFloatOptional YGNode::getTrailingPadding(
|
YGFloatOptional YGNode::getTrailingPadding(
|
||||||
const YGFlexDirection axis,
|
const YGFlexDirection axis,
|
||||||
const float widthSize) const {
|
const float widthSize) const {
|
||||||
const YGFloatOptional paddingEdgeEnd =
|
auto trailingPadding = YGFlexDirectionIsRow(axis)
|
||||||
YGResolveValue(style_.padding()[YGEdgeEnd], widthSize);
|
? computeEdgeValueForRow(
|
||||||
if (YGFlexDirectionIsRow(axis) && paddingEdgeEnd >= YGFloatOptional{0.0f}) {
|
style_.padding(), YGEdgeEnd, trailing[axis], CompactValue::ofZero())
|
||||||
return paddingEdgeEnd;
|
: computeEdgeValueForColumn(
|
||||||
}
|
style_.padding(), trailing[axis], CompactValue::ofZero());
|
||||||
|
return YGFloatOptionalMax(
|
||||||
YGFloatOptional resolvedValue = YGResolveValue(
|
YGResolveValue(trailingPadding, widthSize), YGFloatOptional(0.0f));
|
||||||
YGComputedEdgeValue(
|
|
||||||
style_.padding(), trailing[axis], CompactValue::ofZero()),
|
|
||||||
widthSize);
|
|
||||||
|
|
||||||
return YGFloatOptionalMax(resolvedValue, YGFloatOptional(0.0f));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
YGFloatOptional YGNode::getLeadingPaddingAndBorder(
|
YGFloatOptional YGNode::getLeadingPaddingAndBorder(
|
||||||
|
@@ -193,6 +193,17 @@ public:
|
|||||||
return resolvedDimensions_[index];
|
return resolvedDimensions_[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static CompactValue computeEdgeValueForColumn(
|
||||||
|
const YGStyle::Edges& edges,
|
||||||
|
YGEdge edge,
|
||||||
|
CompactValue defaultValue);
|
||||||
|
|
||||||
|
static CompactValue computeEdgeValueForRow(
|
||||||
|
const YGStyle::Edges& edges,
|
||||||
|
YGEdge rowEdge,
|
||||||
|
YGEdge edge,
|
||||||
|
CompactValue defaultValue);
|
||||||
|
|
||||||
// Methods related to positions, margin, padding and border
|
// Methods related to positions, margin, padding and border
|
||||||
YGFloatOptional getLeadingPosition(
|
YGFloatOptional getLeadingPosition(
|
||||||
const YGFlexDirection axis,
|
const YGFlexDirection axis,
|
||||||
|
@@ -104,10 +104,13 @@ static void appendEdgeIfNotUndefined(
|
|||||||
const string& str,
|
const string& str,
|
||||||
const YGStyle::Edges& edges,
|
const YGStyle::Edges& edges,
|
||||||
const YGEdge edge) {
|
const YGEdge edge) {
|
||||||
appendNumberIfNotUndefined(
|
// TODO: this doesn't take RTL / YGEdgeStart / YGEdgeEnd into account
|
||||||
base,
|
auto value = (edge == YGEdgeLeft || edge == YGEdgeRight)
|
||||||
str,
|
? YGNode::computeEdgeValueForRow(
|
||||||
YGComputedEdgeValue(edges, edge, detail::CompactValue::ofUndefined()));
|
edges, edge, edge, detail::CompactValue::ofUndefined())
|
||||||
|
: YGNode::computeEdgeValueForColumn(
|
||||||
|
edges, edge, detail::CompactValue::ofUndefined());
|
||||||
|
appendNumberIfNotUndefined(base, str, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void YGNodeToString(
|
void YGNodeToString(
|
||||||
|
@@ -33,6 +33,10 @@ inline bool isUndefined(float value) {
|
|||||||
return std::isnan(value);
|
return std::isnan(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool isUndefined(double value) {
|
||||||
|
return std::isnan(value);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace yoga
|
} // namespace yoga
|
||||||
} // namespace facebook
|
} // namespace facebook
|
||||||
|
|
||||||
@@ -144,8 +148,3 @@ static const float kDefaultFlexShrink = 0.0f;
|
|||||||
static const float kWebDefaultFlexShrink = 1.0f;
|
static const float kWebDefaultFlexShrink = 1.0f;
|
||||||
|
|
||||||
extern bool YGFloatsEqual(const float a, const float b);
|
extern bool YGFloatsEqual(const float a, const float b);
|
||||||
extern facebook::yoga::detail::CompactValue YGComputedEdgeValue(
|
|
||||||
const facebook::yoga::detail::Values<
|
|
||||||
facebook::yoga::enums::count<YGEdge>()>& edges,
|
|
||||||
YGEdge edge,
|
|
||||||
facebook::yoga::detail::CompactValue defaultValue);
|
|
||||||
|
289
yoga/Yoga.cpp
289
yoga/Yoga.cpp
@@ -106,38 +106,12 @@ static int YGDefaultLog(
|
|||||||
#undef YG_UNUSED
|
#undef YG_UNUSED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
YOGA_EXPORT bool YGFloatIsUndefined(const float value) {
|
static inline bool YGDoubleIsUndefined(const double value) {
|
||||||
return facebook::yoga::isUndefined(value);
|
return facebook::yoga::isUndefined(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
detail::CompactValue YGComputedEdgeValue(
|
YOGA_EXPORT bool YGFloatIsUndefined(const float value) {
|
||||||
const YGStyle::Edges& edges,
|
return facebook::yoga::isUndefined(value);
|
||||||
YGEdge edge,
|
|
||||||
detail::CompactValue defaultValue) {
|
|
||||||
if (!edges[edge].isUndefined()) {
|
|
||||||
return edges[edge];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((edge == YGEdgeTop || edge == YGEdgeBottom) &&
|
|
||||||
!edges[YGEdgeVertical].isUndefined()) {
|
|
||||||
return edges[YGEdgeVertical];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((edge == YGEdgeLeft || edge == YGEdgeRight || edge == YGEdgeStart ||
|
|
||||||
edge == YGEdgeEnd) &&
|
|
||||||
!edges[YGEdgeHorizontal].isUndefined()) {
|
|
||||||
return edges[YGEdgeHorizontal];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!edges[YGEdgeAll].isUndefined()) {
|
|
||||||
return edges[YGEdgeAll];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (edge == YGEdgeStart || edge == YGEdgeEnd) {
|
|
||||||
return detail::CompactValue::ofUndefined();
|
|
||||||
}
|
|
||||||
|
|
||||||
return defaultValue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
YOGA_EXPORT void* YGNodeGetContext(YGNodeRef node) {
|
YOGA_EXPORT void* YGNodeGetContext(YGNodeRef node) {
|
||||||
@@ -1131,7 +1105,7 @@ static bool YGIsBaselineLayout(const YGNodeRef node) {
|
|||||||
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 = YGNodeGetChild(node, i);
|
const YGNodeRef child = YGNodeGetChild(node, i);
|
||||||
if (child->getStyle().positionType() == YGPositionTypeRelative &&
|
if (child->getStyle().positionType() != YGPositionTypeAbsolute &&
|
||||||
child->getStyle().alignSelf() == YGAlignBaseline) {
|
child->getStyle().alignSelf() == YGAlignBaseline) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1681,40 +1655,33 @@ static void YGNodeWithMeasureFuncSetMeasuredDimensions(
|
|||||||
availableHeight = YGUndefined;
|
availableHeight = YGUndefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
const float paddingAndBorderAxisRow =
|
const auto& padding = node->getLayout().padding;
|
||||||
YGNodePaddingAndBorderForAxis(node, YGFlexDirectionRow, ownerWidth);
|
const auto& border = node->getLayout().border;
|
||||||
const float paddingAndBorderAxisColumn =
|
const float paddingAndBorderAxisRow = padding[YGEdgeLeft] +
|
||||||
YGNodePaddingAndBorderForAxis(node, YGFlexDirectionColumn, ownerWidth);
|
padding[YGEdgeRight] + border[YGEdgeLeft] + border[YGEdgeRight];
|
||||||
const float marginAxisRow =
|
const float paddingAndBorderAxisColumn = padding[YGEdgeTop] +
|
||||||
node->getMarginForAxis(YGFlexDirectionRow, ownerWidth).unwrap();
|
padding[YGEdgeBottom] + border[YGEdgeTop] + border[YGEdgeBottom];
|
||||||
const float marginAxisColumn =
|
|
||||||
node->getMarginForAxis(YGFlexDirectionColumn, ownerWidth).unwrap();
|
|
||||||
|
|
||||||
// We want to make sure we don't call measure with negative size
|
// We want to make sure we don't call measure with negative size
|
||||||
const float innerWidth = YGFloatIsUndefined(availableWidth)
|
const float innerWidth = YGFloatIsUndefined(availableWidth)
|
||||||
? availableWidth
|
? availableWidth
|
||||||
: YGFloatMax(0, availableWidth - marginAxisRow - paddingAndBorderAxisRow);
|
: YGFloatMax(0, availableWidth - paddingAndBorderAxisRow);
|
||||||
const float innerHeight = YGFloatIsUndefined(availableHeight)
|
const float innerHeight = YGFloatIsUndefined(availableHeight)
|
||||||
? availableHeight
|
? availableHeight
|
||||||
: YGFloatMax(
|
: YGFloatMax(0, availableHeight - paddingAndBorderAxisColumn);
|
||||||
0, availableHeight - marginAxisColumn - paddingAndBorderAxisColumn);
|
|
||||||
|
|
||||||
if (widthMeasureMode == YGMeasureModeExactly &&
|
if (widthMeasureMode == YGMeasureModeExactly &&
|
||||||
heightMeasureMode == YGMeasureModeExactly) {
|
heightMeasureMode == YGMeasureModeExactly) {
|
||||||
// Don't bother sizing the text if both dimensions are already defined.
|
// Don't bother sizing the text if both dimensions are already defined.
|
||||||
node->setLayoutMeasuredDimension(
|
node->setLayoutMeasuredDimension(
|
||||||
YGNodeBoundAxis(
|
YGNodeBoundAxis(
|
||||||
node,
|
node, YGFlexDirectionRow, availableWidth, ownerWidth, ownerWidth),
|
||||||
YGFlexDirectionRow,
|
|
||||||
availableWidth - marginAxisRow,
|
|
||||||
ownerWidth,
|
|
||||||
ownerWidth),
|
|
||||||
YGDimensionWidth);
|
YGDimensionWidth);
|
||||||
node->setLayoutMeasuredDimension(
|
node->setLayoutMeasuredDimension(
|
||||||
YGNodeBoundAxis(
|
YGNodeBoundAxis(
|
||||||
node,
|
node,
|
||||||
YGFlexDirectionColumn,
|
YGFlexDirectionColumn,
|
||||||
availableHeight - marginAxisColumn,
|
availableHeight,
|
||||||
ownerHeight,
|
ownerHeight,
|
||||||
ownerWidth),
|
ownerWidth),
|
||||||
YGDimensionHeight);
|
YGDimensionHeight);
|
||||||
@@ -1751,7 +1718,7 @@ static void YGNodeWithMeasureFuncSetMeasuredDimensions(
|
|||||||
(widthMeasureMode == YGMeasureModeUndefined ||
|
(widthMeasureMode == YGMeasureModeUndefined ||
|
||||||
widthMeasureMode == YGMeasureModeAtMost)
|
widthMeasureMode == YGMeasureModeAtMost)
|
||||||
? measuredSize.width + paddingAndBorderAxisRow
|
? measuredSize.width + paddingAndBorderAxisRow
|
||||||
: availableWidth - marginAxisRow,
|
: availableWidth,
|
||||||
ownerWidth,
|
ownerWidth,
|
||||||
ownerWidth),
|
ownerWidth),
|
||||||
YGDimensionWidth);
|
YGDimensionWidth);
|
||||||
@@ -1763,7 +1730,7 @@ static void YGNodeWithMeasureFuncSetMeasuredDimensions(
|
|||||||
(heightMeasureMode == YGMeasureModeUndefined ||
|
(heightMeasureMode == YGMeasureModeUndefined ||
|
||||||
heightMeasureMode == YGMeasureModeAtMost)
|
heightMeasureMode == YGMeasureModeAtMost)
|
||||||
? measuredSize.height + paddingAndBorderAxisColumn
|
? measuredSize.height + paddingAndBorderAxisColumn
|
||||||
: availableHeight - marginAxisColumn,
|
: availableHeight,
|
||||||
ownerHeight,
|
ownerHeight,
|
||||||
ownerWidth),
|
ownerWidth),
|
||||||
YGDimensionHeight);
|
YGDimensionHeight);
|
||||||
@@ -1780,37 +1747,28 @@ static void YGNodeEmptyContainerSetMeasuredDimensions(
|
|||||||
const YGMeasureMode heightMeasureMode,
|
const YGMeasureMode heightMeasureMode,
|
||||||
const float ownerWidth,
|
const float ownerWidth,
|
||||||
const float ownerHeight) {
|
const float ownerHeight) {
|
||||||
const float paddingAndBorderAxisRow =
|
const auto& padding = node->getLayout().padding;
|
||||||
YGNodePaddingAndBorderForAxis(node, YGFlexDirectionRow, ownerWidth);
|
const auto& border = node->getLayout().border;
|
||||||
const float paddingAndBorderAxisColumn =
|
|
||||||
YGNodePaddingAndBorderForAxis(node, YGFlexDirectionColumn, ownerWidth);
|
|
||||||
const float marginAxisRow =
|
|
||||||
node->getMarginForAxis(YGFlexDirectionRow, ownerWidth).unwrap();
|
|
||||||
const float marginAxisColumn =
|
|
||||||
node->getMarginForAxis(YGFlexDirectionColumn, ownerWidth).unwrap();
|
|
||||||
|
|
||||||
|
float width = availableWidth;
|
||||||
|
if (widthMeasureMode == YGMeasureModeUndefined ||
|
||||||
|
widthMeasureMode == YGMeasureModeAtMost) {
|
||||||
|
width = padding[YGEdgeLeft] + padding[YGEdgeRight] + border[YGEdgeLeft] +
|
||||||
|
border[YGEdgeRight];
|
||||||
|
}
|
||||||
node->setLayoutMeasuredDimension(
|
node->setLayoutMeasuredDimension(
|
||||||
YGNodeBoundAxis(
|
YGNodeBoundAxis(node, YGFlexDirectionRow, width, ownerWidth, ownerWidth),
|
||||||
node,
|
|
||||||
YGFlexDirectionRow,
|
|
||||||
(widthMeasureMode == YGMeasureModeUndefined ||
|
|
||||||
widthMeasureMode == YGMeasureModeAtMost)
|
|
||||||
? paddingAndBorderAxisRow
|
|
||||||
: availableWidth - marginAxisRow,
|
|
||||||
ownerWidth,
|
|
||||||
ownerWidth),
|
|
||||||
YGDimensionWidth);
|
YGDimensionWidth);
|
||||||
|
|
||||||
|
float height = availableHeight;
|
||||||
|
if (heightMeasureMode == YGMeasureModeUndefined ||
|
||||||
|
heightMeasureMode == YGMeasureModeAtMost) {
|
||||||
|
height = padding[YGEdgeTop] + padding[YGEdgeBottom] + border[YGEdgeTop] +
|
||||||
|
border[YGEdgeBottom];
|
||||||
|
}
|
||||||
node->setLayoutMeasuredDimension(
|
node->setLayoutMeasuredDimension(
|
||||||
YGNodeBoundAxis(
|
YGNodeBoundAxis(
|
||||||
node,
|
node, YGFlexDirectionColumn, height, ownerHeight, ownerWidth),
|
||||||
YGFlexDirectionColumn,
|
|
||||||
(heightMeasureMode == YGMeasureModeUndefined ||
|
|
||||||
heightMeasureMode == YGMeasureModeAtMost)
|
|
||||||
? paddingAndBorderAxisColumn
|
|
||||||
: availableHeight - marginAxisColumn,
|
|
||||||
ownerHeight,
|
|
||||||
ownerWidth),
|
|
||||||
YGDimensionHeight);
|
YGDimensionHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1828,11 +1786,6 @@ static bool YGNodeFixedSizeSetMeasuredDimensions(
|
|||||||
heightMeasureMode == YGMeasureModeAtMost && availableHeight <= 0.0f) ||
|
heightMeasureMode == YGMeasureModeAtMost && availableHeight <= 0.0f) ||
|
||||||
(widthMeasureMode == YGMeasureModeExactly &&
|
(widthMeasureMode == YGMeasureModeExactly &&
|
||||||
heightMeasureMode == YGMeasureModeExactly)) {
|
heightMeasureMode == YGMeasureModeExactly)) {
|
||||||
auto marginAxisColumn =
|
|
||||||
node->getMarginForAxis(YGFlexDirectionColumn, ownerWidth).unwrap();
|
|
||||||
auto marginAxisRow =
|
|
||||||
node->getMarginForAxis(YGFlexDirectionRow, ownerWidth).unwrap();
|
|
||||||
|
|
||||||
node->setLayoutMeasuredDimension(
|
node->setLayoutMeasuredDimension(
|
||||||
YGNodeBoundAxis(
|
YGNodeBoundAxis(
|
||||||
node,
|
node,
|
||||||
@@ -1841,7 +1794,7 @@ static bool YGNodeFixedSizeSetMeasuredDimensions(
|
|||||||
(widthMeasureMode == YGMeasureModeAtMost &&
|
(widthMeasureMode == YGMeasureModeAtMost &&
|
||||||
availableWidth < 0.0f)
|
availableWidth < 0.0f)
|
||||||
? 0.0f
|
? 0.0f
|
||||||
: availableWidth - marginAxisRow,
|
: availableWidth,
|
||||||
ownerWidth,
|
ownerWidth,
|
||||||
ownerWidth),
|
ownerWidth),
|
||||||
YGDimensionWidth);
|
YGDimensionWidth);
|
||||||
@@ -1854,7 +1807,7 @@ static bool YGNodeFixedSizeSetMeasuredDimensions(
|
|||||||
(heightMeasureMode == YGMeasureModeAtMost &&
|
(heightMeasureMode == YGMeasureModeAtMost &&
|
||||||
availableHeight < 0.0f)
|
availableHeight < 0.0f)
|
||||||
? 0.0f
|
? 0.0f
|
||||||
: availableHeight - marginAxisColumn,
|
: availableHeight,
|
||||||
ownerHeight,
|
ownerHeight,
|
||||||
ownerWidth),
|
ownerWidth),
|
||||||
YGDimensionHeight);
|
YGDimensionHeight);
|
||||||
@@ -1878,21 +1831,11 @@ static void YGZeroOutLayoutRecursivly(
|
|||||||
|
|
||||||
static float YGNodeCalculateAvailableInnerDim(
|
static float YGNodeCalculateAvailableInnerDim(
|
||||||
const YGNodeConstRef node,
|
const YGNodeConstRef node,
|
||||||
YGFlexDirection axis,
|
const YGDimension dimension,
|
||||||
float availableDim,
|
const float availableDim,
|
||||||
float ownerDim,
|
const float paddingAndBorder,
|
||||||
float ownerDimForMarginPadding) {
|
const float ownerDim) {
|
||||||
YGFlexDirection direction =
|
float availableInnerDim = availableDim - paddingAndBorder;
|
||||||
YGFlexDirectionIsRow(axis) ? YGFlexDirectionRow : YGFlexDirectionColumn;
|
|
||||||
YGDimension dimension =
|
|
||||||
YGFlexDirectionIsRow(axis) ? YGDimensionWidth : YGDimensionHeight;
|
|
||||||
|
|
||||||
const float margin =
|
|
||||||
node->getMarginForAxis(direction, ownerDimForMarginPadding).unwrap();
|
|
||||||
const float paddingAndBorder =
|
|
||||||
YGNodePaddingAndBorderForAxis(node, direction, ownerDimForMarginPadding);
|
|
||||||
|
|
||||||
float availableInnerDim = availableDim - margin - paddingAndBorder;
|
|
||||||
// Max dimension overrides predefined dimension value; Min dimension in turn
|
// Max dimension overrides predefined dimension value; Min dimension in turn
|
||||||
// overrides both of the above
|
// overrides both of the above
|
||||||
if (!YGFloatIsUndefined(availableInnerDim)) {
|
if (!YGFloatIsUndefined(availableInnerDim)) {
|
||||||
@@ -2505,7 +2448,7 @@ static void YGJustifyMainAxis(
|
|||||||
i < collectedFlexItemsValues.endOfLineIndex;
|
i < collectedFlexItemsValues.endOfLineIndex;
|
||||||
i++) {
|
i++) {
|
||||||
const YGNodeRef child = node->getChild(i);
|
const YGNodeRef child = node->getChild(i);
|
||||||
if (child->getStyle().positionType() == YGPositionTypeRelative) {
|
if (child->getStyle().positionType() != YGPositionTypeAbsolute) {
|
||||||
if (child->marginLeadingValue(mainAxis).unit == YGUnitAuto) {
|
if (child->marginLeadingValue(mainAxis).unit == YGUnitAuto) {
|
||||||
numberOfAutoMarginsOnCurrentLine++;
|
numberOfAutoMarginsOnCurrentLine++;
|
||||||
}
|
}
|
||||||
@@ -2589,7 +2532,7 @@ static void YGJustifyMainAxis(
|
|||||||
// Now that we placed the element, we need to update the variables.
|
// Now that we placed the element, we need to update the variables.
|
||||||
// We need to do that only for relative elements. Absolute elements do not
|
// We need to do that only for relative elements. Absolute elements do not
|
||||||
// take part in that phase.
|
// take part in that phase.
|
||||||
if (childStyle.positionType() == YGPositionTypeRelative) {
|
if (childStyle.positionType() != YGPositionTypeAbsolute) {
|
||||||
if (child->marginLeadingValue(mainAxis).unit == YGUnitAuto) {
|
if (child->marginLeadingValue(mainAxis).unit == YGUnitAuto) {
|
||||||
collectedFlexItemsValues.mainDim +=
|
collectedFlexItemsValues.mainDim +=
|
||||||
collectedFlexItemsValues.remainingFreeSpace /
|
collectedFlexItemsValues.remainingFreeSpace /
|
||||||
@@ -2779,16 +2722,22 @@ static void YGNodelayoutImpl(
|
|||||||
const YGEdge startEdge =
|
const YGEdge startEdge =
|
||||||
direction == YGDirectionLTR ? YGEdgeLeft : YGEdgeRight;
|
direction == YGDirectionLTR ? YGEdgeLeft : YGEdgeRight;
|
||||||
const YGEdge endEdge = direction == YGDirectionLTR ? YGEdgeRight : YGEdgeLeft;
|
const YGEdge endEdge = direction == YGDirectionLTR ? YGEdgeRight : YGEdgeLeft;
|
||||||
node->setLayoutMargin(
|
|
||||||
node->getLeadingMargin(flexRowDirection, ownerWidth).unwrap(), startEdge);
|
const float marginRowLeading =
|
||||||
node->setLayoutMargin(
|
node->getLeadingMargin(flexRowDirection, ownerWidth).unwrap();
|
||||||
node->getTrailingMargin(flexRowDirection, ownerWidth).unwrap(), endEdge);
|
node->setLayoutMargin(marginRowLeading, startEdge);
|
||||||
node->setLayoutMargin(
|
const float marginRowTrailing =
|
||||||
node->getLeadingMargin(flexColumnDirection, ownerWidth).unwrap(),
|
node->getTrailingMargin(flexRowDirection, ownerWidth).unwrap();
|
||||||
YGEdgeTop);
|
node->setLayoutMargin(marginRowTrailing, endEdge);
|
||||||
node->setLayoutMargin(
|
const float marginColumnLeading =
|
||||||
node->getTrailingMargin(flexColumnDirection, ownerWidth).unwrap(),
|
node->getLeadingMargin(flexColumnDirection, ownerWidth).unwrap();
|
||||||
YGEdgeBottom);
|
node->setLayoutMargin(marginColumnLeading, YGEdgeTop);
|
||||||
|
const float marginColumnTrailing =
|
||||||
|
node->getTrailingMargin(flexColumnDirection, ownerWidth).unwrap();
|
||||||
|
node->setLayoutMargin(marginColumnTrailing, YGEdgeBottom);
|
||||||
|
|
||||||
|
const float marginAxisRow = marginRowLeading + marginRowTrailing;
|
||||||
|
const float marginAxisColumn = marginColumnLeading + marginColumnTrailing;
|
||||||
|
|
||||||
node->setLayoutBorder(node->getLeadingBorder(flexRowDirection), startEdge);
|
node->setLayoutBorder(node->getLeadingBorder(flexRowDirection), startEdge);
|
||||||
node->setLayoutBorder(node->getTrailingBorder(flexRowDirection), endEdge);
|
node->setLayoutBorder(node->getTrailingBorder(flexRowDirection), endEdge);
|
||||||
@@ -2811,8 +2760,8 @@ static void YGNodelayoutImpl(
|
|||||||
if (node->hasMeasureFunc()) {
|
if (node->hasMeasureFunc()) {
|
||||||
YGNodeWithMeasureFuncSetMeasuredDimensions(
|
YGNodeWithMeasureFuncSetMeasuredDimensions(
|
||||||
node,
|
node,
|
||||||
availableWidth,
|
availableWidth - marginAxisRow,
|
||||||
availableHeight,
|
availableHeight - marginAxisColumn,
|
||||||
widthMeasureMode,
|
widthMeasureMode,
|
||||||
heightMeasureMode,
|
heightMeasureMode,
|
||||||
ownerWidth,
|
ownerWidth,
|
||||||
@@ -2827,8 +2776,8 @@ static void YGNodelayoutImpl(
|
|||||||
if (childCount == 0) {
|
if (childCount == 0) {
|
||||||
YGNodeEmptyContainerSetMeasuredDimensions(
|
YGNodeEmptyContainerSetMeasuredDimensions(
|
||||||
node,
|
node,
|
||||||
availableWidth,
|
availableWidth - marginAxisRow,
|
||||||
availableHeight,
|
availableHeight - marginAxisColumn,
|
||||||
widthMeasureMode,
|
widthMeasureMode,
|
||||||
heightMeasureMode,
|
heightMeasureMode,
|
||||||
ownerWidth,
|
ownerWidth,
|
||||||
@@ -2841,8 +2790,8 @@ static void YGNodelayoutImpl(
|
|||||||
if (!performLayout &&
|
if (!performLayout &&
|
||||||
YGNodeFixedSizeSetMeasuredDimensions(
|
YGNodeFixedSizeSetMeasuredDimensions(
|
||||||
node,
|
node,
|
||||||
availableWidth,
|
availableWidth - marginAxisRow,
|
||||||
availableHeight,
|
availableHeight - marginAxisColumn,
|
||||||
widthMeasureMode,
|
widthMeasureMode,
|
||||||
heightMeasureMode,
|
heightMeasureMode,
|
||||||
ownerWidth,
|
ownerWidth,
|
||||||
@@ -2866,12 +2815,14 @@ static void YGNodelayoutImpl(
|
|||||||
const float mainAxisownerSize = isMainAxisRow ? ownerWidth : ownerHeight;
|
const float mainAxisownerSize = isMainAxisRow ? ownerWidth : ownerHeight;
|
||||||
const float crossAxisownerSize = isMainAxisRow ? ownerHeight : ownerWidth;
|
const float crossAxisownerSize = isMainAxisRow ? ownerHeight : ownerWidth;
|
||||||
|
|
||||||
const float leadingPaddingAndBorderCross =
|
|
||||||
node->getLeadingPaddingAndBorder(crossAxis, ownerWidth).unwrap();
|
|
||||||
const float paddingAndBorderAxisMain =
|
const float paddingAndBorderAxisMain =
|
||||||
YGNodePaddingAndBorderForAxis(node, mainAxis, ownerWidth);
|
YGNodePaddingAndBorderForAxis(node, mainAxis, ownerWidth);
|
||||||
|
const float leadingPaddingAndBorderCross =
|
||||||
|
node->getLeadingPaddingAndBorder(crossAxis, ownerWidth).unwrap();
|
||||||
|
const float trailingPaddingAndBorderCross =
|
||||||
|
node->getTrailingPaddingAndBorder(crossAxis, ownerWidth).unwrap();
|
||||||
const float paddingAndBorderAxisCross =
|
const float paddingAndBorderAxisCross =
|
||||||
YGNodePaddingAndBorderForAxis(node, crossAxis, ownerWidth);
|
leadingPaddingAndBorderCross + trailingPaddingAndBorderCross;
|
||||||
|
|
||||||
YGMeasureMode measureModeMainDim =
|
YGMeasureMode measureModeMainDim =
|
||||||
isMainAxisRow ? widthMeasureMode : heightMeasureMode;
|
isMainAxisRow ? widthMeasureMode : heightMeasureMode;
|
||||||
@@ -2883,35 +2834,20 @@ static void YGNodelayoutImpl(
|
|||||||
const float paddingAndBorderAxisColumn =
|
const float paddingAndBorderAxisColumn =
|
||||||
isMainAxisRow ? paddingAndBorderAxisCross : paddingAndBorderAxisMain;
|
isMainAxisRow ? paddingAndBorderAxisCross : paddingAndBorderAxisMain;
|
||||||
|
|
||||||
const float marginAxisRow =
|
|
||||||
node->getMarginForAxis(YGFlexDirectionRow, ownerWidth).unwrap();
|
|
||||||
const float marginAxisColumn =
|
|
||||||
node->getMarginForAxis(YGFlexDirectionColumn, ownerWidth).unwrap();
|
|
||||||
|
|
||||||
const auto& minDimensions = node->getStyle().minDimensions();
|
|
||||||
const auto& maxDimensions = node->getStyle().maxDimensions();
|
|
||||||
const float minInnerWidth =
|
|
||||||
YGResolveValue(minDimensions[YGDimensionWidth], ownerWidth).unwrap() -
|
|
||||||
paddingAndBorderAxisRow;
|
|
||||||
const float maxInnerWidth =
|
|
||||||
YGResolveValue(maxDimensions[YGDimensionWidth], ownerWidth).unwrap() -
|
|
||||||
paddingAndBorderAxisRow;
|
|
||||||
const float minInnerHeight =
|
|
||||||
YGResolveValue(minDimensions[YGDimensionHeight], ownerHeight).unwrap() -
|
|
||||||
paddingAndBorderAxisColumn;
|
|
||||||
const float maxInnerHeight =
|
|
||||||
YGResolveValue(maxDimensions[YGDimensionHeight], ownerHeight).unwrap() -
|
|
||||||
paddingAndBorderAxisColumn;
|
|
||||||
|
|
||||||
const float minInnerMainDim = isMainAxisRow ? minInnerWidth : minInnerHeight;
|
|
||||||
const float maxInnerMainDim = isMainAxisRow ? maxInnerWidth : maxInnerHeight;
|
|
||||||
|
|
||||||
// STEP 2: DETERMINE AVAILABLE SIZE IN MAIN AND CROSS DIRECTIONS
|
// STEP 2: DETERMINE AVAILABLE SIZE IN MAIN AND CROSS DIRECTIONS
|
||||||
|
|
||||||
float availableInnerWidth = YGNodeCalculateAvailableInnerDim(
|
float availableInnerWidth = YGNodeCalculateAvailableInnerDim(
|
||||||
node, YGFlexDirectionRow, availableWidth, ownerWidth, ownerWidth);
|
node,
|
||||||
|
YGDimensionWidth,
|
||||||
|
availableWidth - marginAxisRow,
|
||||||
|
paddingAndBorderAxisRow,
|
||||||
|
ownerWidth);
|
||||||
float availableInnerHeight = YGNodeCalculateAvailableInnerDim(
|
float availableInnerHeight = YGNodeCalculateAvailableInnerDim(
|
||||||
node, YGFlexDirectionColumn, availableHeight, ownerHeight, ownerWidth);
|
node,
|
||||||
|
YGDimensionHeight,
|
||||||
|
availableHeight - marginAxisColumn,
|
||||||
|
paddingAndBorderAxisColumn,
|
||||||
|
ownerHeight);
|
||||||
|
|
||||||
float availableInnerMainDim =
|
float availableInnerMainDim =
|
||||||
isMainAxisRow ? availableInnerWidth : availableInnerHeight;
|
isMainAxisRow ? availableInnerWidth : availableInnerHeight;
|
||||||
@@ -2983,6 +2919,28 @@ static void YGNodelayoutImpl(
|
|||||||
// If we don't measure with exact main dimension we want to ensure we don't
|
// If we don't measure with exact main dimension we want to ensure we don't
|
||||||
// violate min and max
|
// violate min and max
|
||||||
if (measureModeMainDim != YGMeasureModeExactly) {
|
if (measureModeMainDim != YGMeasureModeExactly) {
|
||||||
|
const auto& minDimensions = node->getStyle().minDimensions();
|
||||||
|
const auto& maxDimensions = node->getStyle().maxDimensions();
|
||||||
|
const float minInnerWidth =
|
||||||
|
YGResolveValue(minDimensions[YGDimensionWidth], ownerWidth).unwrap() -
|
||||||
|
paddingAndBorderAxisRow;
|
||||||
|
const float maxInnerWidth =
|
||||||
|
YGResolveValue(maxDimensions[YGDimensionWidth], ownerWidth).unwrap() -
|
||||||
|
paddingAndBorderAxisRow;
|
||||||
|
const float minInnerHeight =
|
||||||
|
YGResolveValue(minDimensions[YGDimensionHeight], ownerHeight)
|
||||||
|
.unwrap() -
|
||||||
|
paddingAndBorderAxisColumn;
|
||||||
|
const float maxInnerHeight =
|
||||||
|
YGResolveValue(maxDimensions[YGDimensionHeight], ownerHeight)
|
||||||
|
.unwrap() -
|
||||||
|
paddingAndBorderAxisColumn;
|
||||||
|
|
||||||
|
const float minInnerMainDim =
|
||||||
|
isMainAxisRow ? minInnerWidth : minInnerHeight;
|
||||||
|
const float maxInnerMainDim =
|
||||||
|
isMainAxisRow ? maxInnerWidth : maxInnerHeight;
|
||||||
|
|
||||||
if (!YGFloatIsUndefined(minInnerMainDim) &&
|
if (!YGFloatIsUndefined(minInnerMainDim) &&
|
||||||
collectedFlexItemsValues.sizeConsumedOnCurrentLine <
|
collectedFlexItemsValues.sizeConsumedOnCurrentLine <
|
||||||
minInnerMainDim) {
|
minInnerMainDim) {
|
||||||
@@ -3311,7 +3269,7 @@ static void YGNodelayoutImpl(
|
|||||||
if (child->getStyle().display() == YGDisplayNone) {
|
if (child->getStyle().display() == YGDisplayNone) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (child->getStyle().positionType() == YGPositionTypeRelative) {
|
if (child->getStyle().positionType() != YGPositionTypeAbsolute) {
|
||||||
if (child->getLineIndex() != i) {
|
if (child->getLineIndex() != i) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -3353,7 +3311,7 @@ static void YGNodelayoutImpl(
|
|||||||
if (child->getStyle().display() == YGDisplayNone) {
|
if (child->getStyle().display() == YGDisplayNone) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (child->getStyle().positionType() == YGPositionTypeRelative) {
|
if (child->getStyle().positionType() != YGPositionTypeAbsolute) {
|
||||||
switch (YGNodeAlignItem(node, child)) {
|
switch (YGNodeAlignItem(node, child)) {
|
||||||
case YGAlignFlexStart: {
|
case YGAlignFlexStart: {
|
||||||
child->setLayoutPosition(
|
child->setLayoutPosition(
|
||||||
@@ -3531,8 +3489,8 @@ static void YGNodelayoutImpl(
|
|||||||
YGNodeBoundAxisWithinMinAndMax(
|
YGNodeBoundAxisWithinMinAndMax(
|
||||||
node,
|
node,
|
||||||
crossAxis,
|
crossAxis,
|
||||||
YGFloatOptional{totalLineCrossDim +
|
YGFloatOptional{
|
||||||
paddingAndBorderAxisCross},
|
totalLineCrossDim + paddingAndBorderAxisCross},
|
||||||
crossAxisownerSize)
|
crossAxisownerSize)
|
||||||
.unwrap()),
|
.unwrap()),
|
||||||
paddingAndBorderAxisCross),
|
paddingAndBorderAxisCross),
|
||||||
@@ -3544,7 +3502,7 @@ static void YGNodelayoutImpl(
|
|||||||
if (performLayout && node->getStyle().flexWrap() == YGWrapWrapReverse) {
|
if (performLayout && node->getStyle().flexWrap() == YGWrapWrapReverse) {
|
||||||
for (uint32_t i = 0; i < childCount; i++) {
|
for (uint32_t i = 0; i < childCount; i++) {
|
||||||
const YGNodeRef child = YGNodeGetChild(node, i);
|
const YGNodeRef child = YGNodeGetChild(node, i);
|
||||||
if (child->getStyle().positionType() == YGPositionTypeRelative) {
|
if (child->getStyle().positionType() != YGPositionTypeAbsolute) {
|
||||||
child->setLayoutPosition(
|
child->setLayoutPosition(
|
||||||
node->getLayout().measuredDimensions[dim[crossAxis]] -
|
node->getLayout().measuredDimensions[dim[crossAxis]] -
|
||||||
child->getLayout().position[pos[crossAxis]] -
|
child->getLayout().position[pos[crossAxis]] -
|
||||||
@@ -3557,7 +3515,8 @@ static void YGNodelayoutImpl(
|
|||||||
if (performLayout) {
|
if (performLayout) {
|
||||||
// STEP 10: SIZING AND POSITIONING ABSOLUTE CHILDREN
|
// STEP 10: SIZING AND POSITIONING ABSOLUTE CHILDREN
|
||||||
for (auto child : node->getChildren()) {
|
for (auto child : node->getChildren()) {
|
||||||
if (child->getStyle().positionType() != YGPositionTypeAbsolute) {
|
if (child->getStyle().display() == YGDisplayNone ||
|
||||||
|
child->getStyle().positionType() != YGPositionTypeAbsolute) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
YGNodeAbsoluteLayoutChild(
|
YGNodeAbsoluteLayoutChild(
|
||||||
@@ -3665,10 +3624,10 @@ YOGA_EXPORT float YGRoundValueToPixelGrid(
|
|||||||
const double pointScaleFactor,
|
const double pointScaleFactor,
|
||||||
const bool forceCeil,
|
const bool forceCeil,
|
||||||
const bool forceFloor) {
|
const bool forceFloor) {
|
||||||
double scaledValue = ((double) value) * pointScaleFactor;
|
double scaledValue = value * pointScaleFactor;
|
||||||
// We want to calculate `fractial` such that `floor(scaledValue) = scaledValue
|
// We want to calculate `fractial` such that `floor(scaledValue) = scaledValue
|
||||||
// - fractial`.
|
// - fractial`.
|
||||||
float fractial = fmodf(scaledValue, 1.0f);
|
double fractial = fmod(scaledValue, 1.0);
|
||||||
if (fractial < 0) {
|
if (fractial < 0) {
|
||||||
// This branch is for handling negative numbers for `value`.
|
// This branch is for handling negative numbers for `value`.
|
||||||
//
|
//
|
||||||
@@ -3687,28 +3646,28 @@ YOGA_EXPORT float YGRoundValueToPixelGrid(
|
|||||||
// - Finding the `floor`: -2.2 - fractial2 = -2.2 - 0.8 = -3
|
// - Finding the `floor`: -2.2 - fractial2 = -2.2 - 0.8 = -3
|
||||||
++fractial;
|
++fractial;
|
||||||
}
|
}
|
||||||
if (YGFloatsEqual(fractial, 0)) {
|
if (YGDoubleEqual(fractial, 0)) {
|
||||||
// First we check if the value is already rounded
|
// First we check if the value is already rounded
|
||||||
scaledValue = scaledValue - fractial;
|
scaledValue = scaledValue - fractial;
|
||||||
} else if (YGFloatsEqual(fractial, 1.0f)) {
|
} else if (YGDoubleEqual(fractial, 1.0)) {
|
||||||
scaledValue = scaledValue - fractial + 1.0f;
|
scaledValue = scaledValue - fractial + 1.0;
|
||||||
} else if (forceCeil) {
|
} else if (forceCeil) {
|
||||||
// Next we check if we need to use forced rounding
|
// Next we check if we need to use forced rounding
|
||||||
scaledValue = scaledValue - fractial + 1.0f;
|
scaledValue = scaledValue - fractial + 1.0;
|
||||||
} else if (forceFloor) {
|
} else if (forceFloor) {
|
||||||
scaledValue = scaledValue - fractial;
|
scaledValue = scaledValue - fractial;
|
||||||
} else {
|
} else {
|
||||||
// Finally we just round the value
|
// Finally we just round the value
|
||||||
scaledValue = scaledValue - fractial +
|
scaledValue = scaledValue - fractial +
|
||||||
(!YGFloatIsUndefined(fractial) &&
|
(!YGDoubleIsUndefined(fractial) &&
|
||||||
(fractial > 0.5f || YGFloatsEqual(fractial, 0.5f))
|
(fractial > 0.5 || YGDoubleEqual(fractial, 0.5))
|
||||||
? 1.0f
|
? 1.0
|
||||||
: 0.0f);
|
: 0.0);
|
||||||
}
|
}
|
||||||
return (YGFloatIsUndefined(scaledValue) ||
|
return (YGDoubleIsUndefined(scaledValue) ||
|
||||||
YGFloatIsUndefined(pointScaleFactor))
|
YGDoubleIsUndefined(pointScaleFactor))
|
||||||
? YGUndefined
|
? YGUndefined
|
||||||
: scaledValue / pointScaleFactor;
|
: (float) (scaledValue / pointScaleFactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
YOGA_EXPORT bool YGNodeCanUseCachedMeasurement(
|
YOGA_EXPORT bool YGNodeCanUseCachedMeasurement(
|
||||||
@@ -4113,11 +4072,11 @@ static void YGRoundToPixelGrid(
|
|||||||
// whole number, we don't have any fraction To verify if the result is close
|
// whole number, we don't have any fraction To verify if the result is close
|
||||||
// to whole number we want to check both floor and ceil numbers
|
// to whole number we want to check both floor and ceil numbers
|
||||||
const bool hasFractionalWidth =
|
const bool hasFractionalWidth =
|
||||||
!YGFloatsEqual(fmodf(nodeWidth * pointScaleFactor, 1.0), 0) &&
|
!YGDoubleEqual(fmod(nodeWidth * pointScaleFactor, 1.0), 0) &&
|
||||||
!YGFloatsEqual(fmodf(nodeWidth * pointScaleFactor, 1.0), 1.0);
|
!YGDoubleEqual(fmod(nodeWidth * pointScaleFactor, 1.0), 1.0);
|
||||||
const bool hasFractionalHeight =
|
const bool hasFractionalHeight =
|
||||||
!YGFloatsEqual(fmodf(nodeHeight * pointScaleFactor, 1.0), 0) &&
|
!YGDoubleEqual(fmod(nodeHeight * pointScaleFactor, 1.0), 0) &&
|
||||||
!YGFloatsEqual(fmodf(nodeHeight * pointScaleFactor, 1.0), 1.0);
|
!YGDoubleEqual(fmod(nodeHeight * pointScaleFactor, 1.0), 1.0);
|
||||||
|
|
||||||
node->setLayoutDimension(
|
node->setLayoutDimension(
|
||||||
YGRoundValueToPixelGrid(
|
YGRoundValueToPixelGrid(
|
||||||
|
@@ -107,7 +107,7 @@ WIN_EXPORT void YGNodeMarkDirty(YGNodeRef node);
|
|||||||
|
|
||||||
// Marks the current node and all its descendants as dirty.
|
// Marks the current node and all its descendants as dirty.
|
||||||
//
|
//
|
||||||
// Intended to be used for Uoga benchmarks. Don't use in production, as calling
|
// Intended to be used for Yoga benchmarks. Don't use in production, as calling
|
||||||
// `YGCalculateLayout` will cause the recalculation of each and every node.
|
// `YGCalculateLayout` will cause the recalculation of each and every node.
|
||||||
WIN_EXPORT void YGNodeMarkDirtyAndPropogateToDescendants(YGNodeRef node);
|
WIN_EXPORT void YGNodeMarkDirtyAndPropogateToDescendants(YGNodeRef node);
|
||||||
|
|
||||||
|
@@ -8,7 +8,6 @@
|
|||||||
#include "event.h"
|
#include "event.h"
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
namespace facebook {
|
namespace facebook {
|
||||||
namespace yoga {
|
namespace yoga {
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <yoga/YGEnums.h>
|
#include <yoga/YGEnums.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
struct YGConfig;
|
struct YGConfig;
|
||||||
struct YGNode;
|
struct YGNode;
|
||||||
|
Reference in New Issue
Block a user