Compare commits
41 Commits
dependabot
...
mateoguzma
Author | SHA1 | Date | |
---|---|---|---|
|
0ea3cc6d2e | ||
|
8bf7a34d02 | ||
|
82671c0132 | ||
|
9f2a9476e5 | ||
|
c7c85621fc | ||
|
73980a3cf8 | ||
|
4b5ca50117 | ||
|
30291398f3 | ||
|
27d632c697 | ||
|
117fa494f7 | ||
|
073c136117 | ||
|
1232761571 | ||
|
c935fd5e10 | ||
|
624325302c | ||
|
37a94a86de | ||
|
4abc1a7d5f | ||
|
51e6095005 | ||
|
79cef614ce | ||
|
6455a848a7 | ||
|
1b7d2c8d48 | ||
|
3aa594c1f9 | ||
|
c2ae39167e | ||
|
49ee855f99 | ||
|
b12e0a2a15 | ||
|
9591210a7a | ||
|
91997d6cd3 | ||
|
909e4bea6e | ||
|
13f4adbbcd | ||
|
ae2d06d0f5 | ||
|
5478812db3 | ||
|
050ac8a413 | ||
|
733ba24064 | ||
|
e177477144 | ||
|
76ffdbc25d | ||
|
f99e657acd | ||
|
a9246bc7db | ||
|
be72b8e8aa | ||
|
b876f596d9 | ||
|
be00354b71 | ||
|
0c995496c8 | ||
|
c12e732fab |
23
.github/actions/clang-format/action.yml
vendored
23
.github/actions/clang-format/action.yml
vendored
@@ -1,23 +0,0 @@
|
||||
name: Clang Format
|
||||
inputs:
|
||||
directory:
|
||||
description: Directory to Lint
|
||||
required: true
|
||||
version:
|
||||
description: LLVM version to use # Should be kept roughly in sync with arcanist
|
||||
required: false
|
||||
default: 12
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Install
|
||||
shell: bash
|
||||
run: sudo apt-get install -y clang-format-${{ inputs.version }}
|
||||
|
||||
- name: clang-format
|
||||
working-directory: ${{ inputs.directory }}
|
||||
shell: bash
|
||||
env:
|
||||
BASHOPTS: extglob:nullglob
|
||||
run: clang-format-${{ inputs.version }} --dry-run --Werror **/*.{h,hh,hpp,c,cpp,cc,m,mm}
|
1
.github/actions/setup-cpp/action.yml
vendored
1
.github/actions/setup-cpp/action.yml
vendored
@@ -16,6 +16,7 @@ runs:
|
||||
if: ${{ inputs.toolchain == 'Clang' }}
|
||||
shell: bash
|
||||
run: |
|
||||
sudo apt-get install -y libc++-dev libc++abi-dev
|
||||
echo "CC=/usr/bin/clang" >> $GITHUB_ENV
|
||||
echo "CXX=/usr/bin/clang++" >> $GITHUB_ENV
|
||||
echo "CXXFLAGS=-stdlib=libc++" >> $GITHUB_ENV
|
||||
|
@@ -24,7 +24,7 @@ jobs:
|
||||
ORG_GRADLE_PROJECT_SIGNING_PWD: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_PWD }}
|
||||
|
||||
- name: Upload Build Artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: 'snapshot-artifacts'
|
||||
path: '~/.m2/repository/'
|
||||
|
@@ -23,7 +23,7 @@ jobs:
|
||||
ORG_GRADLE_PROJECT_USE_SNAPSHOT: true
|
||||
|
||||
- name: Upload Build Artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: 'snapshot-artifacts'
|
||||
path: '~/.m2/repository/'
|
||||
|
10
.github/workflows/validate-cpp.yml
vendored
10
.github/workflows/validate-cpp.yml
vendored
@@ -97,13 +97,3 @@ jobs:
|
||||
cmake -S . -B build -G Ninja -D CMAKE_BUILD_TYPE=Release
|
||||
cmake --build build
|
||||
working-directory: capture
|
||||
|
||||
clang-format:
|
||||
name: Format
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: clang-format
|
||||
uses: ./.github/actions/clang-format
|
||||
|
2
.github/workflows/validate-js.yml
vendored
2
.github/workflows/validate-js.yml
vendored
@@ -110,7 +110,7 @@ jobs:
|
||||
run: yarn pack --filename yoga-layout.tar.gz
|
||||
working-directory: javascript
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: npm-package
|
||||
path: javascript/yoga-layout.tar.gz
|
||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@@ -73,3 +73,6 @@ local.properties
|
||||
|
||||
# Docusarus build
|
||||
.docusaurus
|
||||
|
||||
# Android Studio
|
||||
.idea
|
||||
|
@@ -9,6 +9,7 @@ plugins {
|
||||
id("com.android.library") version "8.7.1" apply false
|
||||
id("com.android.application") version "8.7.1" apply false
|
||||
id("io.github.gradle-nexus.publish-plugin") version "1.3.0"
|
||||
id 'org.jetbrains.kotlin.android' version '2.1.20' apply false
|
||||
}
|
||||
|
||||
allprojects {
|
||||
@@ -34,6 +35,8 @@ nexusPublishing {
|
||||
sonatype {
|
||||
username.set(sonatypeUsername)
|
||||
password.set(sonatypePassword)
|
||||
nexusUrl.set(uri("https://ossrh-staging-api.central.sonatype.com/service/local/"))
|
||||
snapshotRepositoryUrl.set(uri("https://central.sonatype.com/repository/maven-snapshots/"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -225,17 +225,17 @@ static void serializeTreeImpl(
|
||||
appendEdges<&YGNodeStyleGetPosition>(
|
||||
j, "position", node, defaultNode.get());
|
||||
|
||||
appendFloatIfNotDefault(
|
||||
appendYGValueIfNotDefault(
|
||||
j["style"],
|
||||
"gap",
|
||||
YGNodeStyleGetGap(node, YGGutterAll),
|
||||
YGNodeStyleGetGap(defaultNode.get(), YGGutterAll));
|
||||
appendFloatIfNotDefault(
|
||||
appendYGValueIfNotDefault(
|
||||
j["style"],
|
||||
"column-gap",
|
||||
YGNodeStyleGetGap(node, YGGutterColumn),
|
||||
YGNodeStyleGetGap(defaultNode.get(), YGGutterColumn));
|
||||
appendFloatIfNotDefault(
|
||||
appendYGValueIfNotDefault(
|
||||
j["style"],
|
||||
"row-gap",
|
||||
YGNodeStyleGetGap(node, YGGutterRow),
|
||||
|
@@ -19,8 +19,8 @@ add_compile_options(
|
||||
# Enable warnings and warnings as errors
|
||||
/W4
|
||||
/WX
|
||||
# Disable RTTI
|
||||
$<$<COMPILE_LANGUAGE:CXX>:/GR->
|
||||
# Enable RTTI
|
||||
$<$<COMPILE_LANGUAGE:CXX>:/GR>
|
||||
# Use /O2 (Maximize Speed)
|
||||
$<$<CONFIG:RELEASE>:/O2>)
|
||||
|
||||
@@ -34,8 +34,8 @@ add_compile_options(
|
||||
# Enable warnings and warnings as errors
|
||||
-Wall
|
||||
-Werror
|
||||
# Disable RTTI
|
||||
$<$<COMPILE_LANGUAGE:CXX>:-fno-rtti>
|
||||
# Enable RTTI
|
||||
$<$<COMPILE_LANGUAGE:CXX>:-frtti>
|
||||
# Use -O2 (prioritize speed)
|
||||
$<$<CONFIG:RELEASE>:-O2>
|
||||
# Enable separate sections per function/data item
|
||||
|
@@ -240,3 +240,14 @@
|
||||
<div style="position:relative; width:50px; height:50px;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="align_items_non_stretch_s526008"
|
||||
style="flex-direction: column; width: 400px; height: 400px;">
|
||||
<div style="flex-direction: row;">
|
||||
<div style="flex-direction: column; align-items: flex-start;">
|
||||
<div>
|
||||
<div style="width: 0; height: 10px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -157,6 +157,31 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="contains_inner_text_max_width_max_height_column" style="width:2000px; align-items: flex-start;">
|
||||
<div style="max-width: 50px;">
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eleifasd et tortor ac auctor. Integer at
|
||||
volutpat
|
||||
libero, sed elementum dui interdum id. Aliquam consectetur massa vel neque aliquet, quis consequat risus
|
||||
fringilla. Fusce rhoncus ipsum tempor eros aliquam, vel tempus metus ullamcorper. Nam at nulla sed tellus
|
||||
vestibulum fringilla vel sit amet ligula. Proin velit lectus, euismod sit amet quam vel ultricies dolor,
|
||||
vitae
|
||||
finibus lorem ipsum. Pellentesque molestie at mi sit amet dictum. Donec vehicula lacinia felis sit amet
|
||||
consectetur. Praesent sodales enim sapien, sed varius ipsum pellentesque vel. Aenean eu mi eu justo
|
||||
tincidunt
|
||||
finibus vel sit amet ipsum. Sed bibasdum purus vel ipsum sagittis, quis fermentum dolor lobortis. Etiam
|
||||
vulputate eleifasd lectus vel varius.
|
||||
Phasellus imperdiet lectus sit amet ipsum egestas, ut bibasdum ipsum malesuada. Vestibulum ante ipsum primis
|
||||
in
|
||||
faucibus orci luctus et ultrices posuere cubilia Curae; Sed mollis eros sit amet elit porttitor, vel
|
||||
venenatis
|
||||
turpis venenatis. Nulla tempus tortor at eros efficitur, sit amet dapibus ipsum malesuada. Ut at mauris sed
|
||||
nunc
|
||||
malesuada convallis. Duis id sem vel magna varius eleifasd vel at est. Donec eget orci a ipsum tempor
|
||||
lobortis.
|
||||
Sed at consectetur ipsum.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="contains_inner_text_max_width" style="width:2000px;height:2000px;align-items: flex-start;">
|
||||
<div style="flex-direction:row;max-width:100px">
|
||||
@@ -229,7 +254,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="fit_content_width" style="width: 90px; position: relative;">
|
||||
<div data-disabled="true" id="fit_content_width" style="width: 90px;">
|
||||
<div style="flex-direction: row; width: fit-content; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -240,7 +265,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="stretch_width" style="width: 500px; position: relative;">
|
||||
<div id="stretch_width" style="width: 500px;">
|
||||
<div style="flex-direction: row; width: -webkit-fill-available; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -260,7 +285,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="fit_content_height" style="height: 90px; position: relative;">
|
||||
<div data-disabled="true" id="fit_content_height" style="height: 90px; ">
|
||||
<div style="height: fit-content; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -271,7 +296,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="stretch_height" style="height: 500px; position: relative;">
|
||||
<div data-disabled="true" id="stretch_height" style="height: 500px;">
|
||||
<div style="height: -webkit-fill-available; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -291,7 +316,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="fit_content_flex_basis_column" style="height: 90px; position: relative;">
|
||||
<div data-disabled="true" id="fit_content_flex_basis_column" style="height: 90px;">
|
||||
<div style="flex-basis: fit-content; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -302,7 +327,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="stretch_flex_basis_column" style="height: 500px; position: relative;">
|
||||
<div id="stretch_flex_basis_column" style="height: 500px;">
|
||||
<div style="flex-basis: -webkit-fill-available; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -313,7 +338,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="max_content_flex_basis_row" style="flex-direction: row; flex-basis: max-content; flex-wrap: wrap;">
|
||||
<div data-disabled="true" id="max_content_flex_basis_row" style="flex-direction: row; flex-basis: max-content; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
<div style="width: 100px; height: 500px;">
|
||||
@@ -322,7 +347,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="fit_content_flex_basis_row" style="width: 90px; position: relative;">
|
||||
<div data-disabled="true" id="fit_content_flex_basis_row" style="width: 90px;">
|
||||
<div style="flex-direction: row; flex-basis: fit-content; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -333,7 +358,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="stretch_flex_basis_row" style="width: 500px; position: relative;">
|
||||
<div data-disabled="true" id="stretch_flex_basis_row" style="width: 500px;">
|
||||
<div style="flex-direction: row; flex-basis: -webkit-fill-available; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -344,7 +369,8 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="max_content_max_width" style="flex-direction: row; max-width:max-content; width: 200px; flex-wrap: wrap;">
|
||||
<div data-disabled="true" id="max_content_max_width"
|
||||
style="flex-direction: row; max-width:max-content; width: 200px; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
<div style="width: 100px; height: 50px;">
|
||||
@@ -353,7 +379,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="fit_content_max_width" style="width: 90px; position: relative;">
|
||||
<div data-disabled="true" id="fit_content_max_width" style="width: 90px;">
|
||||
<div style="flex-direction: row; max-width: fit-content; width: 110px; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -364,7 +390,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="stretch_max_width" style="width: 500px; position: relative;">
|
||||
<div data-disabled="true" id="stretch_max_width" style="width: 500px;">
|
||||
<div style="flex-direction: row; max-width: -webkit-fill-available; width: 600px; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -375,7 +401,8 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="max_content_min_width" style="flex-direction: row; min-width:max-content; width: 100px; flex-wrap: wrap;">
|
||||
<div data-disabled="true" id="max_content_min_width"
|
||||
style="flex-direction: row; min-width:max-content; width: 100px; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
<div style="width: 100px; height: 50px;">
|
||||
@@ -384,7 +411,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="fit_content_min_width" style="width: 90px; position: relative;">
|
||||
<div data-disabled="true" id="fit_content_min_width" style="width: 90px;">
|
||||
<div style="flex-direction: row; min-width: fit-content; width: 90px; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -395,7 +422,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="stretch_min_width" style="width: 500px; position: relative;">
|
||||
<div data-disabled="true" id="stretch_min_width" style="width: 500px;">
|
||||
<div style="flex-direction: row; min-width: -webkit-fill-available; width: 400px; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -415,7 +442,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="fit_content_max_height" style="height: 90px; position: relative;">
|
||||
<div data-disabled="true" id="fit_content_max_height" style="height: 90px;">
|
||||
<div style="max-height: fit-content; height: 110px; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -426,7 +453,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="stretch_max_height" style="height: 500px; position: relative;">
|
||||
<div data-disabled="true" id="stretch_max_height" style="height: 500px;">
|
||||
<div style="max-height: -webkit-fill-available; flex-wrap: wrap; height: 600px;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -446,7 +473,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="fit_content_min_height" style="height: 90px; position: relative;">
|
||||
<div data-disabled="true" id="fit_content_min_height" style="height: 90px;">
|
||||
<div style="min-height: fit-content; height: 90px; flex-wrap: wrap;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -457,7 +484,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="stretch_min_height" style="height: 500px; position: relative;">
|
||||
<div data-disabled="true" id="stretch_min_height" style="height: 500px;">
|
||||
<div style="min-height: -webkit-fill-available; flex-wrap: wrap; height: 400px;">
|
||||
<div style="width: 50px; height: 50px;">
|
||||
</div>
|
||||
@@ -467,3 +494,75 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="text_max_content_width" style="width: 200px">
|
||||
<div style="width: max-content;">
|
||||
<div style="flex-direction:row;">
|
||||
Lorem ipsum sdafhasdfkjlasdhlkajsfhasldkfhasdlkahsdflkjasdhflaksdfasdlkjhasdlfjahsdfljkasdhalsdfhas dolor sit amet
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="text_stretch_width" style="width: 200px">
|
||||
<div style="width: -webkit-fill-available;">
|
||||
<div style="flex-direction:row;">
|
||||
Lorem ipsum dolor sit amet
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="text_fit_content_width" style="width: 200px">
|
||||
<div style="width: fit-content;">
|
||||
<div style="flex-direction:row;">
|
||||
Lorem ipsum sdafhasdfkjlasdhlkajsfhasldkfhasdlkahsdflkjasdhflaksdfasdlkjhasdlfjahsdfljkasdhalsdfhas dolor sit amet
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="text_max_content_min_width" style="width: 200px">
|
||||
<div style="min-width: max-content; width: 200px;">
|
||||
<div style="flex-direction:row;">
|
||||
Lorem ipsum sdafhasdfkjlasdhlkajsfhasldkfhasdlkahsdflkjasdhflaksdfasdlkjhasdlfjahsdfljkasdhalsdfhas dolor sit amet
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="text_stretch_min_width" style="width: 200px">
|
||||
<div style="min-width: -webkit-fill-available; width: 100px;">
|
||||
<div style="flex-direction:row;">
|
||||
Lorem ipsum dolor sit amet
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" data-disabled="true" id="text_fit_content_min_width" style="width: 200px">
|
||||
<div style="min-width: fit-content; width: 300px">
|
||||
<div style="flex-direction:row;">
|
||||
Lorem ipsum sdafhasdfkjlasdhlkajsfhasldkfhasdlkahsdflkjasdhflaksdfasdlkjhasdlfjahsdfljkasdhalsdfhas dolor sit amet
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="text_max_content_max_width" style="width: 200px">
|
||||
<div style="max-width: max-content; width: 2000px;">
|
||||
<div style="flex-direction:row;">
|
||||
Lorem ipsum sdafhasdfkjlasdhlkajsfhasldkfhasdlkahsdflkjasdhflaksdfasdlkjhasdlfjahsdfljkasdhalsdfhas dolor sit amet
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="text_stretch_max_width" style="width: 200px">
|
||||
<div style="max-width: -webkit-fill-available; width: 300px;">
|
||||
<div style="flex-direction:row;">
|
||||
Lorem ipsum dolor sit amet
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-disabled="true" id="text_fit_content_max_width" style="width: 200px">
|
||||
<div style="max-width: fit-content; width: 1000px">
|
||||
<div style="flex-direction:row;">
|
||||
Lorem ipsum sdafhasdfkjlasdhlkajsfhasldkfhasdlkahsdflkjasdhflaksdfasdlkjhasdlfjahsdfljkasdhalsdfhas dolor sit amet
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -502,7 +502,7 @@ CPPEmitter.prototype = Object.create(Emitter.prototype, {
|
||||
},
|
||||
|
||||
YGNodeSetMeasureFunc: {
|
||||
value: function (nodeName, innerText) {
|
||||
value: function (nodeName, innerText, _) {
|
||||
this.push(`YGNodeSetContext(${nodeName}, (void*)"${innerText}");`);
|
||||
this.push(
|
||||
`YGNodeSetMeasureFunc(${nodeName}, &facebook::yoga::test::IntrinsicSizeMeasure);`,
|
||||
|
@@ -467,7 +467,7 @@ JavaEmitter.prototype = Object.create(Emitter.prototype, {
|
||||
},
|
||||
|
||||
YGNodeSetMeasureFunc: {
|
||||
value: function (nodeName, innerText) {
|
||||
value: function (nodeName, innerText, _) {
|
||||
this.push(`${nodeName}.setData("${innerText}");`);
|
||||
this.push(
|
||||
`${nodeName}.setMeasureFunction(new TestUtils.intrinsicMeasureFunction());`,
|
||||
|
@@ -429,9 +429,11 @@ JavascriptEmitter.prototype = Object.create(Emitter.prototype, {
|
||||
},
|
||||
|
||||
YGNodeSetMeasureFunc: {
|
||||
value: function (nodeName, innerText) {
|
||||
value: function (nodeName, innerText, flexDirection) {
|
||||
this.push(
|
||||
`${nodeName}.setMeasureFunc(instrinsicSizeMeasureFunc.bind("${innerText}"));`,
|
||||
`${nodeName}.setMeasureFunc(instrinsicSizeMeasureFunc.bind({text: "${innerText}", flexDirection: ${toValueJavascript(
|
||||
flexDirection,
|
||||
)}}));`,
|
||||
);
|
||||
},
|
||||
},
|
||||
|
@@ -533,7 +533,11 @@ function setupTestTree(
|
||||
}
|
||||
|
||||
if (node.innerText && node.children.length === 0) {
|
||||
e.YGNodeSetMeasureFunc(nodeName, node.innerText);
|
||||
e.YGNodeSetMeasureFunc(
|
||||
nodeName,
|
||||
node.innerText,
|
||||
flexDirectionValue(e, node.style['flex-direction']),
|
||||
);
|
||||
}
|
||||
|
||||
for (let i = 0; i < node.children.length; i++) {
|
||||
|
@@ -1,17 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
// You can use this script to configure the gradleEnterprise{} block in your build.
|
||||
// You need to rename this file to ./gradle/gradle-enterprise.gradle.kts in order for
|
||||
// this to be processed.
|
||||
extensions.getByName("gradleEnterprise").withGroovyBuilder {
|
||||
setProperty("server", "https://your-gradle-enterprise-instance.example.com")
|
||||
getProperty("buildScan").withGroovyBuilder {
|
||||
"publishAlways"()
|
||||
"tag"(if(System.getenv("CI") != null) "CI" else "Local")
|
||||
}
|
||||
}
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
3
gradle/wrapper/gradle-wrapper.properties
vendored
3
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
26
gradlew
vendored
26
gradlew
vendored
@@ -15,6 +15,8 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
@@ -55,7 +57,7 @@
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
@@ -83,7 +85,8 @@ done
|
||||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
@@ -130,10 +133,13 @@ location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD=java
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
if ! command -v java >/dev/null 2>&1
|
||||
then
|
||||
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
@@ -141,7 +147,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
@@ -149,7 +155,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
@@ -198,11 +204,11 @@ fi
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
# double quotes to make sure that they get re-expanded; and
|
||||
# * put everything else in single quotes, so that it's not re-expanded.
|
||||
# Collect all arguments for the java command:
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||
# and any embedded shellness will be escaped.
|
||||
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||
# treated as '${Hostname}' itself on the command line.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
|
22
gradlew.bat
vendored
22
gradlew.bat
vendored
@@ -13,6 +13,8 @@
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
@rem SPDX-License-Identifier: Apache-2.0
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%"=="" @echo off
|
||||
@rem ##########################################################################
|
||||
@@ -43,11 +45,11 @@ set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if %ERRORLEVEL% equ 0 goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
@@ -57,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
|
@@ -1,4 +1,17 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!--
|
||||
Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
|
||||
This source code is licensed under the MIT license found in the
|
||||
LICENSE file in the root directory of this source tree.
|
||||
-->
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.facebook.yoga"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0"
|
||||
>
|
||||
|
||||
<application/>
|
||||
|
||||
|
@@ -9,6 +9,7 @@ plugins {
|
||||
id("com.android.library")
|
||||
id("maven-publish")
|
||||
id("signing")
|
||||
id("org.jetbrains.kotlin.android")
|
||||
}
|
||||
|
||||
group = "com.facebook.yoga"
|
||||
@@ -30,6 +31,7 @@ android {
|
||||
consumerProguardFiles("proguard-rules.pro")
|
||||
|
||||
ndk { abiFilters.addAll(setOf("x86", "x86_64", "armeabi-v7a", "arm64-v8a")) }
|
||||
externalNativeBuild { cmake { arguments("-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON") } }
|
||||
}
|
||||
|
||||
externalNativeBuild { cmake { path("CMakeLists.txt") } }
|
||||
@@ -47,6 +49,8 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
kotlinOptions { jvmTarget = "1.8" }
|
||||
|
||||
publishing {
|
||||
multipleVariants {
|
||||
withSourcesJar()
|
||||
@@ -59,6 +63,7 @@ android {
|
||||
dependencies {
|
||||
implementation("com.google.code.findbugs:jsr305:3.0.2")
|
||||
implementation("com.facebook.soloader:soloader:0.10.5")
|
||||
implementation("androidx.core:core-ktx:1.16.0")
|
||||
testImplementation("junit:junit:4.12")
|
||||
}
|
||||
|
||||
|
@@ -1,25 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and 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.yoga;
|
||||
|
||||
public class YogaConstants {
|
||||
|
||||
public static final float UNDEFINED = Float.NaN;
|
||||
|
||||
public static boolean isUndefined(float value) {
|
||||
return Float.compare(value, UNDEFINED) == 0;
|
||||
}
|
||||
|
||||
public static boolean isUndefined(YogaValue value) {
|
||||
return value.unit == YogaUnit.UNDEFINED;
|
||||
}
|
||||
|
||||
public static float getUndefined() {
|
||||
return UNDEFINED;
|
||||
}
|
||||
}
|
18
java/com/facebook/yoga/YogaConstants.kt
Normal file
18
java/com/facebook/yoga/YogaConstants.kt
Normal file
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and 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.yoga
|
||||
|
||||
public object YogaConstants {
|
||||
@JvmField public val UNDEFINED: Float = Float.NaN
|
||||
|
||||
@JvmStatic public fun isUndefined(value: Float): Boolean = value.compareTo(UNDEFINED) == 0
|
||||
|
||||
@JvmStatic public fun isUndefined(value: YogaValue): Boolean = value.unit == YogaUnit.UNDEFINED
|
||||
|
||||
@JvmStatic public fun getUndefined(): Float = UNDEFINED
|
||||
}
|
@@ -130,7 +130,7 @@ public class YogaNative {
|
||||
static native void jni_YGNodeStyleSetMaxHeightStretchJNI(long nativePointer);
|
||||
static native float jni_YGNodeStyleGetAspectRatioJNI(long nativePointer);
|
||||
static native void jni_YGNodeStyleSetAspectRatioJNI(long nativePointer, float aspectRatio);
|
||||
static native float jni_YGNodeStyleGetGapJNI(long nativePointer, int gutter);
|
||||
static native long jni_YGNodeStyleGetGapJNI(long nativePointer, int gutter);
|
||||
static native void jni_YGNodeStyleSetGapJNI(long nativePointer, int gutter, float gapLength);
|
||||
static native void jni_YGNodeStyleSetGapPercentJNI(long nativePointer, int gutter, float gapLength);
|
||||
static native void jni_YGNodeSetHasMeasureFuncJNI(long nativePointer, boolean hasMeasureFunc);
|
||||
|
@@ -1,279 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and 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.yoga;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public abstract class YogaNode implements YogaProps {
|
||||
|
||||
/** The interface the {@link #getData()} object can optionally implement. */
|
||||
public interface Inputs {
|
||||
|
||||
/** Requests the data object to disable mutations of its inputs. */
|
||||
void freeze(final YogaNode node, final @Nullable YogaNode parent);
|
||||
}
|
||||
|
||||
public abstract void reset();
|
||||
|
||||
public abstract int getChildCount();
|
||||
|
||||
public abstract YogaNode getChildAt(int i);
|
||||
|
||||
public abstract void addChildAt(YogaNode child, int i);
|
||||
|
||||
public abstract void setIsReferenceBaseline(boolean isReferenceBaseline);
|
||||
|
||||
public abstract boolean isReferenceBaseline();
|
||||
|
||||
public abstract YogaNode removeChildAt(int i);
|
||||
|
||||
/**
|
||||
* @returns the {@link YogaNode} that owns this {@link YogaNode}. The owner is used to identify
|
||||
* the YogaTree that a {@link YogaNode} belongs to. This method will return the parent of the
|
||||
* {@link YogaNode} when the {@link YogaNode} only belongs to one YogaTree or null when the
|
||||
* {@link YogaNode} is shared between two or more YogaTrees.
|
||||
*/
|
||||
@Nullable
|
||||
public abstract YogaNode getOwner();
|
||||
|
||||
/** @deprecated Use #getOwner() instead. This will be removed in the next version. */
|
||||
@Deprecated
|
||||
@Nullable
|
||||
public abstract YogaNode getParent();
|
||||
|
||||
public abstract int indexOf(YogaNode child);
|
||||
|
||||
public abstract void calculateLayout(float width, float height);
|
||||
|
||||
public abstract boolean hasNewLayout();
|
||||
|
||||
public abstract void dirty();
|
||||
|
||||
public abstract boolean isDirty();
|
||||
|
||||
public abstract void copyStyle(YogaNode srcNode);
|
||||
|
||||
public abstract void markLayoutSeen();
|
||||
|
||||
public abstract YogaDirection getStyleDirection();
|
||||
|
||||
public abstract void setDirection(YogaDirection direction);
|
||||
|
||||
public abstract YogaFlexDirection getFlexDirection();
|
||||
|
||||
public abstract void setFlexDirection(YogaFlexDirection flexDirection);
|
||||
|
||||
public abstract YogaJustify getJustifyContent();
|
||||
|
||||
public abstract void setJustifyContent(YogaJustify justifyContent);
|
||||
|
||||
public abstract YogaAlign getAlignItems();
|
||||
|
||||
public abstract void setAlignItems(YogaAlign alignItems);
|
||||
|
||||
public abstract YogaAlign getAlignSelf();
|
||||
|
||||
public abstract void setAlignSelf(YogaAlign alignSelf);
|
||||
|
||||
public abstract YogaAlign getAlignContent();
|
||||
|
||||
public abstract void setAlignContent(YogaAlign alignContent);
|
||||
|
||||
public abstract YogaPositionType getPositionType();
|
||||
|
||||
public abstract void setPositionType(YogaPositionType positionType);
|
||||
|
||||
public abstract YogaBoxSizing getBoxSizing();
|
||||
|
||||
public abstract void setBoxSizing(YogaBoxSizing boxSizing);
|
||||
|
||||
public abstract YogaWrap getWrap();
|
||||
|
||||
public abstract void setWrap(YogaWrap flexWrap);
|
||||
|
||||
public abstract YogaOverflow getOverflow();
|
||||
|
||||
public abstract void setOverflow(YogaOverflow overflow);
|
||||
|
||||
public abstract YogaDisplay getDisplay();
|
||||
|
||||
public abstract void setDisplay(YogaDisplay display);
|
||||
|
||||
public abstract float getFlex();
|
||||
|
||||
public abstract void setFlex(float flex);
|
||||
|
||||
public abstract float getFlexGrow();
|
||||
|
||||
public abstract void setFlexGrow(float flexGrow);
|
||||
|
||||
public abstract float getFlexShrink();
|
||||
|
||||
public abstract void setFlexShrink(float flexShrink);
|
||||
|
||||
public abstract YogaValue getFlexBasis();
|
||||
|
||||
public abstract void setFlexBasis(float flexBasis);
|
||||
|
||||
public abstract void setFlexBasisPercent(float percent);
|
||||
|
||||
public abstract void setFlexBasisAuto();
|
||||
|
||||
public abstract void setFlexBasisMaxContent();
|
||||
|
||||
public abstract void setFlexBasisFitContent();
|
||||
|
||||
public abstract void setFlexBasisStretch();
|
||||
|
||||
public abstract YogaValue getMargin(YogaEdge edge);
|
||||
|
||||
public abstract void setMargin(YogaEdge edge, float margin);
|
||||
|
||||
public abstract void setMarginPercent(YogaEdge edge, float percent);
|
||||
|
||||
public abstract void setMarginAuto(YogaEdge edge);
|
||||
|
||||
public abstract YogaValue getPadding(YogaEdge edge);
|
||||
|
||||
public abstract void setPadding(YogaEdge edge, float padding);
|
||||
|
||||
public abstract void setPaddingPercent(YogaEdge edge, float percent);
|
||||
|
||||
public abstract float getBorder(YogaEdge edge);
|
||||
|
||||
public abstract void setBorder(YogaEdge edge, float border);
|
||||
|
||||
public abstract YogaValue getPosition(YogaEdge edge);
|
||||
|
||||
public abstract void setPosition(YogaEdge edge, float position);
|
||||
|
||||
public abstract void setPositionPercent(YogaEdge edge, float percent);
|
||||
|
||||
public abstract void setPositionAuto(YogaEdge edge);
|
||||
|
||||
public abstract YogaValue getWidth();
|
||||
|
||||
public abstract void setWidth(float width);
|
||||
|
||||
public abstract void setWidthPercent(float percent);
|
||||
|
||||
public abstract void setWidthAuto();
|
||||
|
||||
public abstract void setWidthMaxContent();
|
||||
|
||||
public abstract void setWidthFitContent();
|
||||
|
||||
public abstract void setWidthStretch();
|
||||
|
||||
public abstract YogaValue getHeight();
|
||||
|
||||
public abstract void setHeight(float height);
|
||||
|
||||
public abstract void setHeightPercent(float percent);
|
||||
|
||||
public abstract void setHeightAuto();
|
||||
|
||||
public abstract void setHeightMaxContent();
|
||||
|
||||
public abstract void setHeightFitContent();
|
||||
|
||||
public abstract void setHeightStretch();
|
||||
|
||||
public abstract YogaValue getMinWidth();
|
||||
|
||||
public abstract void setMinWidth(float minWidth);
|
||||
|
||||
public abstract void setMinWidthPercent(float percent);
|
||||
|
||||
public abstract void setMinWidthMaxContent();
|
||||
|
||||
public abstract void setMinWidthFitContent();
|
||||
|
||||
public abstract void setMinWidthStretch();
|
||||
|
||||
public abstract YogaValue getMinHeight();
|
||||
|
||||
public abstract void setMinHeight(float minHeight);
|
||||
|
||||
public abstract void setMinHeightPercent(float percent);
|
||||
|
||||
public abstract void setMinHeightMaxContent();
|
||||
|
||||
public abstract void setMinHeightFitContent();
|
||||
|
||||
public abstract void setMinHeightStretch();
|
||||
|
||||
public abstract YogaValue getMaxWidth();
|
||||
|
||||
public abstract void setMaxWidth(float maxWidth);
|
||||
|
||||
public abstract void setMaxWidthPercent(float percent);
|
||||
|
||||
public abstract void setMaxWidthMaxContent();
|
||||
|
||||
public abstract void setMaxWidthFitContent();
|
||||
|
||||
public abstract void setMaxWidthStretch();
|
||||
|
||||
public abstract YogaValue getMaxHeight();
|
||||
|
||||
public abstract void setMaxHeight(float maxheight);
|
||||
|
||||
public abstract void setMaxHeightPercent(float percent);
|
||||
|
||||
public abstract void setMaxHeightMaxContent();
|
||||
|
||||
public abstract void setMaxHeightFitContent();
|
||||
|
||||
public abstract void setMaxHeightStretch();
|
||||
|
||||
public abstract float getAspectRatio();
|
||||
|
||||
public abstract void setAspectRatio(float aspectRatio);
|
||||
|
||||
public abstract float getGap(YogaGutter gutter);
|
||||
|
||||
public abstract void setGap(YogaGutter gutter, float gapLength);
|
||||
|
||||
public abstract void setGapPercent(YogaGutter gutter, float gapLength);
|
||||
|
||||
public abstract float getLayoutX();
|
||||
|
||||
public abstract float getLayoutY();
|
||||
|
||||
public abstract float getLayoutWidth();
|
||||
|
||||
public abstract float getLayoutHeight();
|
||||
|
||||
public abstract float getLayoutMargin(YogaEdge edge);
|
||||
|
||||
public abstract float getLayoutPadding(YogaEdge edge);
|
||||
|
||||
public abstract float getLayoutBorder(YogaEdge edge);
|
||||
|
||||
public abstract YogaDirection getLayoutDirection();
|
||||
|
||||
public abstract void setMeasureFunction(YogaMeasureFunction measureFunction);
|
||||
|
||||
public abstract void setBaselineFunction(YogaBaselineFunction baselineFunction);
|
||||
|
||||
public abstract boolean isMeasureDefined();
|
||||
|
||||
public abstract boolean isBaselineDefined();
|
||||
|
||||
public abstract void setData(Object data);
|
||||
|
||||
@Nullable
|
||||
public abstract Object getData();
|
||||
|
||||
public abstract YogaNode cloneWithoutChildren();
|
||||
|
||||
public abstract YogaNode cloneWithChildren();
|
||||
|
||||
public abstract void setAlwaysFormsContainingBlock(boolean alwaysFormsContainingBlock);
|
||||
}
|
273
java/com/facebook/yoga/YogaNode.kt
Normal file
273
java/com/facebook/yoga/YogaNode.kt
Normal file
@@ -0,0 +1,273 @@
|
||||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and 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.yoga
|
||||
|
||||
public abstract class YogaNode : YogaProps {
|
||||
/** The interface the [getData] object can optionally implement. */
|
||||
public fun interface Inputs {
|
||||
/** Requests the data object to disable mutations of its inputs. */
|
||||
public fun freeze(node: YogaNode, parent: YogaNode?)
|
||||
}
|
||||
|
||||
public abstract fun reset()
|
||||
|
||||
public abstract fun getChildCount(): Int
|
||||
|
||||
public abstract fun getChildAt(i: Int): YogaNode
|
||||
|
||||
public abstract fun addChildAt(child: YogaNode, i: Int)
|
||||
|
||||
abstract override fun setIsReferenceBaseline(isReferenceBaseline: Boolean)
|
||||
|
||||
public abstract fun isReferenceBaseline(): Boolean
|
||||
|
||||
public abstract fun removeChildAt(i: Int): YogaNode
|
||||
|
||||
/**
|
||||
* @returns the [YogaNode] that owns this [YogaNode]. The owner is used to identify the YogaTree
|
||||
* that a [YogaNode] belongs to. This method will return the parent of the [YogaNode] when the
|
||||
* [YogaNode] only belongs to one YogaTree or null when the [YogaNode] is shared between two or
|
||||
* more YogaTrees.
|
||||
*/
|
||||
public abstract fun getOwner(): YogaNode?
|
||||
|
||||
@Deprecated(
|
||||
"Use getOwner() instead. This will be removed in the next version. ",
|
||||
replaceWith = ReplaceWith("getOwner()"))
|
||||
public abstract fun getParent(): YogaNode?
|
||||
|
||||
public abstract fun indexOf(child: YogaNode): Int
|
||||
|
||||
public abstract fun calculateLayout(width: Float, height: Float)
|
||||
|
||||
public abstract fun hasNewLayout(): Boolean
|
||||
|
||||
public abstract fun dirty()
|
||||
|
||||
public abstract fun isDirty(): Boolean
|
||||
|
||||
public abstract fun copyStyle(srcNode: YogaNode)
|
||||
|
||||
public abstract fun markLayoutSeen()
|
||||
|
||||
abstract override fun getStyleDirection(): YogaDirection
|
||||
|
||||
abstract override fun setDirection(direction: YogaDirection)
|
||||
|
||||
abstract override fun getFlexDirection(): YogaFlexDirection
|
||||
|
||||
abstract override fun setFlexDirection(flexDirection: YogaFlexDirection)
|
||||
|
||||
abstract override fun getJustifyContent(): YogaJustify
|
||||
|
||||
abstract override fun setJustifyContent(justifyContent: YogaJustify)
|
||||
|
||||
abstract override fun getAlignItems(): YogaAlign
|
||||
|
||||
abstract override fun setAlignItems(alignItems: YogaAlign)
|
||||
|
||||
abstract override fun getAlignSelf(): YogaAlign
|
||||
|
||||
abstract override fun setAlignSelf(alignSelf: YogaAlign)
|
||||
|
||||
abstract override fun getAlignContent(): YogaAlign
|
||||
|
||||
abstract override fun setAlignContent(alignContent: YogaAlign)
|
||||
|
||||
abstract override fun getPositionType(): YogaPositionType
|
||||
|
||||
abstract override fun setPositionType(positionType: YogaPositionType)
|
||||
|
||||
abstract override fun getBoxSizing(): YogaBoxSizing
|
||||
|
||||
abstract override fun setBoxSizing(boxSizing: YogaBoxSizing)
|
||||
|
||||
public abstract fun getWrap(): YogaWrap
|
||||
|
||||
abstract override fun setWrap(flexWrap: YogaWrap)
|
||||
|
||||
public abstract fun getOverflow(): YogaOverflow
|
||||
|
||||
public abstract fun setOverflow(overflow: YogaOverflow)
|
||||
|
||||
public abstract fun getDisplay(): YogaDisplay
|
||||
|
||||
public abstract fun setDisplay(display: YogaDisplay)
|
||||
|
||||
public abstract fun getFlex(): Float
|
||||
|
||||
abstract override fun setFlex(flex: Float)
|
||||
|
||||
abstract override fun getFlexGrow(): Float
|
||||
|
||||
abstract override fun setFlexGrow(flexGrow: Float)
|
||||
|
||||
abstract override fun getFlexShrink(): Float
|
||||
|
||||
abstract override fun setFlexShrink(flexShrink: Float)
|
||||
|
||||
abstract override fun getFlexBasis(): YogaValue
|
||||
|
||||
abstract override fun setFlexBasis(flexBasis: Float)
|
||||
|
||||
abstract override fun setFlexBasisPercent(percent: Float)
|
||||
|
||||
abstract override fun setFlexBasisAuto()
|
||||
|
||||
abstract override fun setFlexBasisMaxContent()
|
||||
|
||||
abstract override fun setFlexBasisFitContent()
|
||||
|
||||
abstract override fun setFlexBasisStretch()
|
||||
|
||||
abstract override fun getMargin(edge: YogaEdge): YogaValue
|
||||
|
||||
abstract override fun setMargin(edge: YogaEdge, margin: Float)
|
||||
|
||||
abstract override fun setMarginPercent(edge: YogaEdge, percent: Float)
|
||||
|
||||
abstract override fun setMarginAuto(edge: YogaEdge)
|
||||
|
||||
abstract override fun getPadding(edge: YogaEdge): YogaValue
|
||||
|
||||
abstract override fun setPadding(edge: YogaEdge, padding: Float)
|
||||
|
||||
abstract override fun setPaddingPercent(edge: YogaEdge, percent: Float)
|
||||
|
||||
abstract override fun getBorder(edge: YogaEdge): Float
|
||||
|
||||
abstract override fun setBorder(edge: YogaEdge, border: Float)
|
||||
|
||||
abstract override fun getPosition(edge: YogaEdge): YogaValue
|
||||
|
||||
abstract override fun setPosition(edge: YogaEdge, position: Float)
|
||||
|
||||
abstract override fun setPositionPercent(edge: YogaEdge, percent: Float)
|
||||
|
||||
public abstract fun setPositionAuto(edge: YogaEdge)
|
||||
|
||||
abstract override fun getWidth(): YogaValue
|
||||
|
||||
abstract override fun setWidth(width: Float)
|
||||
|
||||
abstract override fun setWidthPercent(percent: Float)
|
||||
|
||||
abstract override fun setWidthAuto()
|
||||
|
||||
abstract override fun setWidthMaxContent()
|
||||
|
||||
abstract override fun setWidthFitContent()
|
||||
|
||||
abstract override fun setWidthStretch()
|
||||
|
||||
abstract override fun getHeight(): YogaValue
|
||||
|
||||
abstract override fun setHeight(height: Float)
|
||||
|
||||
abstract override fun setHeightPercent(percent: Float)
|
||||
|
||||
abstract override fun setHeightAuto()
|
||||
|
||||
abstract override fun setHeightMaxContent()
|
||||
|
||||
abstract override fun setHeightFitContent()
|
||||
|
||||
abstract override fun setHeightStretch()
|
||||
|
||||
abstract override fun getMinWidth(): YogaValue
|
||||
|
||||
abstract override fun setMinWidth(minWidth: Float)
|
||||
|
||||
abstract override fun setMinWidthPercent(percent: Float)
|
||||
|
||||
abstract override fun setMinWidthMaxContent()
|
||||
|
||||
abstract override fun setMinWidthFitContent()
|
||||
|
||||
abstract override fun setMinWidthStretch()
|
||||
|
||||
abstract override fun getMinHeight(): YogaValue
|
||||
|
||||
abstract override fun setMinHeight(minHeight: Float)
|
||||
|
||||
abstract override fun setMinHeightPercent(percent: Float)
|
||||
|
||||
abstract override fun setMinHeightMaxContent()
|
||||
|
||||
abstract override fun setMinHeightFitContent()
|
||||
|
||||
abstract override fun setMinHeightStretch()
|
||||
|
||||
abstract override fun getMaxWidth(): YogaValue
|
||||
|
||||
abstract override fun setMaxWidth(maxWidth: Float)
|
||||
|
||||
abstract override fun setMaxWidthPercent(percent: Float)
|
||||
|
||||
abstract override fun setMaxWidthMaxContent()
|
||||
|
||||
abstract override fun setMaxWidthFitContent()
|
||||
|
||||
abstract override fun setMaxWidthStretch()
|
||||
|
||||
abstract override fun getMaxHeight(): YogaValue
|
||||
|
||||
abstract override fun setMaxHeight(maxheight: Float)
|
||||
|
||||
abstract override fun setMaxHeightPercent(percent: Float)
|
||||
|
||||
abstract override fun setMaxHeightMaxContent()
|
||||
|
||||
abstract override fun setMaxHeightFitContent()
|
||||
|
||||
abstract override fun setMaxHeightStretch()
|
||||
|
||||
abstract override fun getAspectRatio(): Float
|
||||
|
||||
abstract override fun setAspectRatio(aspectRatio: Float)
|
||||
|
||||
public abstract fun getGap(gutter: YogaGutter): YogaValue
|
||||
|
||||
public abstract fun setGap(gutter: YogaGutter, gapLength: Float)
|
||||
|
||||
public abstract fun setGapPercent(gutter: YogaGutter, gapLength: Float)
|
||||
|
||||
public abstract fun getLayoutX(): Float
|
||||
|
||||
public abstract fun getLayoutY(): Float
|
||||
|
||||
public abstract fun getLayoutWidth(): Float
|
||||
|
||||
public abstract fun getLayoutHeight(): Float
|
||||
|
||||
public abstract fun getLayoutMargin(edge: YogaEdge): Float
|
||||
|
||||
public abstract fun getLayoutPadding(edge: YogaEdge): Float
|
||||
|
||||
public abstract fun getLayoutBorder(edge: YogaEdge): Float
|
||||
|
||||
public abstract fun getLayoutDirection(): YogaDirection
|
||||
|
||||
abstract override fun setMeasureFunction(measureFunction: YogaMeasureFunction)
|
||||
|
||||
abstract override fun setBaselineFunction(baselineFunction: YogaBaselineFunction)
|
||||
|
||||
public abstract fun isMeasureDefined(): Boolean
|
||||
|
||||
public abstract fun isBaselineDefined(): Boolean
|
||||
|
||||
public abstract fun setData(data: Any)
|
||||
|
||||
public abstract fun getData(): Any?
|
||||
|
||||
public abstract fun cloneWithoutChildren(): YogaNode
|
||||
|
||||
public abstract fun cloneWithChildren(): YogaNode
|
||||
|
||||
public abstract fun setAlwaysFormsContainingBlock(alwaysFormsContainingBlock: Boolean)
|
||||
}
|
@@ -811,8 +811,8 @@ public abstract class YogaNodeJNIBase extends YogaNode implements Cloneable {
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getGap(YogaGutter gutter) {
|
||||
return YogaNative.jni_YGNodeStyleGetGapJNI(mNativePointer, gutter.intValue());
|
||||
public YogaValue getGap(YogaGutter gutter) {
|
||||
return valueFromLong(YogaNative.jni_YGNodeStyleGetGapJNI(mNativePointer, gutter.intValue()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -725,13 +725,13 @@ jni_YGNodeCloneJNI(JNIEnv* /*env*/, jobject /*obj*/, jlong nativePointer) {
|
||||
return reinterpret_cast<jlong>(clonedYogaNode);
|
||||
}
|
||||
|
||||
static jfloat jni_YGNodeStyleGetGapJNI(
|
||||
static jlong jni_YGNodeStyleGetGapJNI(
|
||||
JNIEnv* /*env*/,
|
||||
jobject /*obj*/,
|
||||
jlong nativePointer,
|
||||
jint gutter) {
|
||||
return (jfloat)YGNodeStyleGetGap(
|
||||
_jlong2YGNodeRef(nativePointer), static_cast<YGGutter>(gutter));
|
||||
return YogaValue::asJavaLong(YGNodeStyleGetGap(
|
||||
_jlong2YGNodeRef(nativePointer), static_cast<YGGutter>(gutter)));
|
||||
}
|
||||
|
||||
static void jni_YGNodeStyleSetGapJNI(
|
||||
@@ -1057,7 +1057,7 @@ static JNINativeMethod methods[] = {
|
||||
{"jni_YGNodeSetHasMeasureFuncJNI",
|
||||
"(JZ)V",
|
||||
(void*)jni_YGNodeSetHasMeasureFuncJNI},
|
||||
{"jni_YGNodeStyleGetGapJNI", "(JI)F", (void*)jni_YGNodeStyleGetGapJNI},
|
||||
{"jni_YGNodeStyleGetGapJNI", "(JI)J", (void*)jni_YGNodeStyleGetGapJNI},
|
||||
{"jni_YGNodeStyleSetGapJNI", "(JIF)V", (void*)jni_YGNodeStyleSetGapJNI},
|
||||
{"jni_YGNodeStyleSetGapPercentJNI",
|
||||
"(JIF)V",
|
||||
|
@@ -11,6 +11,7 @@ import com.facebook.yoga.YogaMeasureMode;
|
||||
import com.facebook.yoga.YogaMeasureOutput;
|
||||
import com.facebook.yoga.YogaMeasureFunction;
|
||||
import com.facebook.yoga.YogaNode;
|
||||
import com.facebook.yoga.YogaFlexDirection;
|
||||
|
||||
public class TestUtils {
|
||||
|
||||
@@ -43,9 +44,13 @@ public class TestUtils {
|
||||
} else if (heightMode == YogaMeasureMode.AT_MOST) {
|
||||
measuredHeight =
|
||||
Math.min(
|
||||
caclulateHeight(text, Math.max(measuredWidth, getWidestWordWidth(text))), height);
|
||||
caclulateHeight(text, node.getFlexDirection() == YogaFlexDirection.COLUMN
|
||||
? measuredWidth
|
||||
: Math.max(measuredWidth, getWidestWordWidth(text))), height);
|
||||
} else {
|
||||
measuredHeight = caclulateHeight(text, Math.max(measuredWidth, getWidestWordWidth(text)));
|
||||
measuredHeight = caclulateHeight(text, node.getFlexDirection() == YogaFlexDirection.COLUMN
|
||||
? measuredWidth
|
||||
: Math.max(measuredWidth, getWidestWordWidth(text)));
|
||||
}
|
||||
|
||||
return YogaMeasureOutput.make(measuredWidth, measuredHeight);
|
||||
|
@@ -4,7 +4,7 @@
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @generated SignedSource<<e8d11c0e97041bb2f1487f0d87363fdc>>
|
||||
* @generated SignedSource<<84597dd8b2c4f3aac1f21abe68f25308>>
|
||||
* generated by gentest/gentest-driver.ts from gentest/fixtures/YGAlignItemsTest.html
|
||||
*/
|
||||
|
||||
@@ -2293,6 +2293,86 @@ public class YGAlignItemsTest {
|
||||
assertEquals(50f, root_child1.getLayoutHeight(), 0.0f);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test_align_items_non_stretch_s526008() {
|
||||
YogaConfig config = YogaConfigFactory.create();
|
||||
|
||||
final YogaNode root = createNode(config);
|
||||
root.setPositionType(YogaPositionType.ABSOLUTE);
|
||||
root.setWidth(400f);
|
||||
root.setHeight(400f);
|
||||
|
||||
final YogaNode root_child0 = createNode(config);
|
||||
root_child0.setFlexDirection(YogaFlexDirection.ROW);
|
||||
root.addChildAt(root_child0, 0);
|
||||
|
||||
final YogaNode root_child0_child0 = createNode(config);
|
||||
root_child0_child0.setAlignItems(YogaAlign.FLEX_START);
|
||||
root_child0.addChildAt(root_child0_child0, 0);
|
||||
|
||||
final YogaNode root_child0_child0_child0 = createNode(config);
|
||||
root_child0_child0.addChildAt(root_child0_child0_child0, 0);
|
||||
|
||||
final YogaNode root_child0_child0_child0_child0 = createNode(config);
|
||||
root_child0_child0_child0_child0.setHeight(10f);
|
||||
root_child0_child0_child0.addChildAt(root_child0_child0_child0_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(400f, root.getLayoutWidth(), 0.0f);
|
||||
assertEquals(400f, root.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(0f, root_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(400f, root_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(0f, root_child0_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0_child0.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(0f, root_child0_child0_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0_child0_child0.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(0f, root_child0_child0_child0_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0_child0_child0_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(400f, root.getLayoutWidth(), 0.0f);
|
||||
assertEquals(400f, root.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(0f, root_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(400f, root_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(400f, root_child0_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0_child0.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(0f, root_child0_child0_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0_child0_child0.getLayoutHeight(), 0.0f);
|
||||
|
||||
assertEquals(0f, root_child0_child0_child0_child0.getLayoutX(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0_child0.getLayoutY(), 0.0f);
|
||||
assertEquals(0f, root_child0_child0_child0_child0.getLayoutWidth(), 0.0f);
|
||||
assertEquals(10f, root_child0_child0_child0_child0.getLayoutHeight(), 0.0f);
|
||||
}
|
||||
|
||||
private YogaNode createNode(YogaConfig config) {
|
||||
return mNodeFactory.create(config);
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -439,8 +439,9 @@ Value Node::getPadding(int edge) const {
|
||||
YGNodeStyleGetPadding(m_node, static_cast<YGEdge>(edge)));
|
||||
}
|
||||
|
||||
float Node::getGap(int gutter) {
|
||||
return YGNodeStyleGetGap(m_node, static_cast<YGGutter>(gutter));
|
||||
Value Node::getGap(int gutter) const {
|
||||
return Value::fromYGValue(
|
||||
YGNodeStyleGetGap(m_node, static_cast<YGGutter>(gutter)));
|
||||
}
|
||||
|
||||
bool Node::isReferenceBaseline() {
|
||||
|
@@ -186,7 +186,7 @@ class Node {
|
||||
|
||||
Value getPadding(int edge) const;
|
||||
|
||||
float getGap(int gutter);
|
||||
Value getGap(int gutter) const;
|
||||
|
||||
int getBoxSizing(void) const;
|
||||
|
||||
|
@@ -4,7 +4,7 @@
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @generated SignedSource<<075a0b67003e5c4a1f51bd99da71c700>>
|
||||
* @generated SignedSource<<fd80af208d8635435f86ffa8f3810b39>>
|
||||
* generated by gentest/gentest-driver.ts from gentest/fixtures/YGAlignItemsTest.html
|
||||
*/
|
||||
|
||||
@@ -2442,3 +2442,88 @@ test('align_stretch_with_row_reverse', () => {
|
||||
config.free();
|
||||
}
|
||||
});
|
||||
test('align_items_non_stretch_s526008', () => {
|
||||
const config = Yoga.Config.create();
|
||||
let root;
|
||||
|
||||
try {
|
||||
root = Yoga.Node.create(config);
|
||||
root.setPositionType(PositionType.Absolute);
|
||||
root.setWidth(400);
|
||||
root.setHeight(400);
|
||||
|
||||
const root_child0 = Yoga.Node.create(config);
|
||||
root_child0.setFlexDirection(FlexDirection.Row);
|
||||
root.insertChild(root_child0, 0);
|
||||
|
||||
const root_child0_child0 = Yoga.Node.create(config);
|
||||
root_child0_child0.setAlignItems(Align.FlexStart);
|
||||
root_child0.insertChild(root_child0_child0, 0);
|
||||
|
||||
const root_child0_child0_child0 = Yoga.Node.create(config);
|
||||
root_child0_child0.insertChild(root_child0_child0_child0, 0);
|
||||
|
||||
const root_child0_child0_child0_child0 = Yoga.Node.create(config);
|
||||
root_child0_child0_child0_child0.setHeight(10);
|
||||
root_child0_child0_child0.insertChild(root_child0_child0_child0_child0, 0);
|
||||
root.calculateLayout(undefined, undefined, Direction.LTR);
|
||||
|
||||
expect(root.getComputedLeft()).toBe(0);
|
||||
expect(root.getComputedTop()).toBe(0);
|
||||
expect(root.getComputedWidth()).toBe(400);
|
||||
expect(root.getComputedHeight()).toBe(400);
|
||||
|
||||
expect(root_child0.getComputedLeft()).toBe(0);
|
||||
expect(root_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0.getComputedWidth()).toBe(400);
|
||||
expect(root_child0.getComputedHeight()).toBe(10);
|
||||
|
||||
expect(root_child0_child0.getComputedLeft()).toBe(0);
|
||||
expect(root_child0_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0_child0.getComputedWidth()).toBe(0);
|
||||
expect(root_child0_child0.getComputedHeight()).toBe(10);
|
||||
|
||||
expect(root_child0_child0_child0.getComputedLeft()).toBe(0);
|
||||
expect(root_child0_child0_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0_child0_child0.getComputedWidth()).toBe(0);
|
||||
expect(root_child0_child0_child0.getComputedHeight()).toBe(10);
|
||||
|
||||
expect(root_child0_child0_child0_child0.getComputedLeft()).toBe(0);
|
||||
expect(root_child0_child0_child0_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0_child0_child0_child0.getComputedWidth()).toBe(0);
|
||||
expect(root_child0_child0_child0_child0.getComputedHeight()).toBe(10);
|
||||
|
||||
root.calculateLayout(undefined, undefined, Direction.RTL);
|
||||
|
||||
expect(root.getComputedLeft()).toBe(0);
|
||||
expect(root.getComputedTop()).toBe(0);
|
||||
expect(root.getComputedWidth()).toBe(400);
|
||||
expect(root.getComputedHeight()).toBe(400);
|
||||
|
||||
expect(root_child0.getComputedLeft()).toBe(0);
|
||||
expect(root_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0.getComputedWidth()).toBe(400);
|
||||
expect(root_child0.getComputedHeight()).toBe(10);
|
||||
|
||||
expect(root_child0_child0.getComputedLeft()).toBe(400);
|
||||
expect(root_child0_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0_child0.getComputedWidth()).toBe(0);
|
||||
expect(root_child0_child0.getComputedHeight()).toBe(10);
|
||||
|
||||
expect(root_child0_child0_child0.getComputedLeft()).toBe(0);
|
||||
expect(root_child0_child0_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0_child0_child0.getComputedWidth()).toBe(0);
|
||||
expect(root_child0_child0_child0.getComputedHeight()).toBe(10);
|
||||
|
||||
expect(root_child0_child0_child0_child0.getComputedLeft()).toBe(0);
|
||||
expect(root_child0_child0_child0_child0.getComputedTop()).toBe(0);
|
||||
expect(root_child0_child0_child0_child0.getComputedWidth()).toBe(0);
|
||||
expect(root_child0_child0_child0_child0.getComputedHeight()).toBe(10);
|
||||
} finally {
|
||||
if (typeof root !== 'undefined') {
|
||||
root.freeRecursive();
|
||||
}
|
||||
|
||||
config.free();
|
||||
}
|
||||
});
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -5,17 +5,23 @@
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
import {MeasureMode} from 'yoga-layout';
|
||||
import {FlexDirection, MeasureMode} from 'yoga-layout';
|
||||
|
||||
type MeasureContext = {
|
||||
text: string;
|
||||
flexDirection: FlexDirection;
|
||||
};
|
||||
|
||||
export function instrinsicSizeMeasureFunc(
|
||||
this: string,
|
||||
this: MeasureContext,
|
||||
width: number,
|
||||
widthMode: MeasureMode,
|
||||
height: number,
|
||||
heightMode: MeasureMode,
|
||||
): {width: number; height: number} {
|
||||
const textLength = this.length;
|
||||
const words = this.split(' ');
|
||||
const textLength = this.text.length;
|
||||
const words = this.text.split(' ');
|
||||
const flexDirection = this.flexDirection;
|
||||
const widthPerChar = 10;
|
||||
const heightPerChar = 10;
|
||||
|
||||
@@ -53,7 +59,10 @@ export function instrinsicSizeMeasureFunc(
|
||||
return heightPerChar;
|
||||
}
|
||||
|
||||
const maxLineWidth = Math.max(longestWordWidth(), measuredWidth);
|
||||
const maxLineWidth =
|
||||
flexDirection == FlexDirection.Column
|
||||
? measuredWidth
|
||||
: Math.max(longestWordWidth(), measuredWidth);
|
||||
|
||||
//if fixed width < width of widest word, take width of widest word
|
||||
|
||||
|
@@ -19,10 +19,11 @@ include(":yoga")
|
||||
|
||||
project(":yoga").projectDir = file("java")
|
||||
|
||||
rootProject.name = "yoga-github"
|
||||
|
||||
// If you specify a file inside gradle/gradle-enterprise.gradle.kts
|
||||
// you can configure your custom Gradle Enterprise instance
|
||||
if (file("./gradle/gradle-enterprise.gradle.kts").exists()) {
|
||||
apply(from = "./gradle/gradle-enterprise.gradle.kts")
|
||||
gradleEnterprise {
|
||||
buildScan {
|
||||
termsOfServiceUrl = "https://gradle.com/terms-of-service"
|
||||
termsOfServiceAgree = "yes"
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.name = "yoga-github"
|
||||
|
7
tests/.clang-tidy
Normal file
7
tests/.clang-tidy
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
InheritParentConfig: true
|
||||
Checks: '
|
||||
-facebook-hte-CArray,
|
||||
-modernize-avoid-c-arrays,
|
||||
'
|
||||
...
|
214
tests/YGPersistentNodeCloningTest.cpp
Normal file
214
tests/YGPersistentNodeCloningTest.cpp
Normal file
@@ -0,0 +1,214 @@
|
||||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <yoga/Yoga.h>
|
||||
#include <yoga/config/Config.h>
|
||||
#include <yoga/node/Node.h>
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
namespace facebook::yoga {
|
||||
|
||||
struct YGPersistentNodeCloningTest : public ::testing::Test {
|
||||
struct NodeWrapper {
|
||||
explicit NodeWrapper(
|
||||
YGConfigRef config,
|
||||
std::vector<std::shared_ptr<NodeWrapper>> children = {})
|
||||
: node{YGNodeNewWithConfig(config)}, children{std::move(children)} {
|
||||
YGNodeSetContext(node, this);
|
||||
|
||||
auto privateNode = resolveRef(node);
|
||||
for (const auto& child : this->children) {
|
||||
auto privateChild = resolveRef(child->node);
|
||||
// Claim first ownership of not yet owned nodes, to avoid immediately
|
||||
// cloning them
|
||||
if (YGNodeGetOwner(child->node) == nullptr) {
|
||||
privateChild->setOwner(privateNode);
|
||||
}
|
||||
privateNode->insertChild(privateChild, privateNode->getChildCount());
|
||||
}
|
||||
}
|
||||
|
||||
// Clone, with current children, for mutation
|
||||
NodeWrapper(const NodeWrapper& other)
|
||||
: node{YGNodeClone(other.node)}, children{other.children} {
|
||||
YGNodeSetContext(node, this);
|
||||
|
||||
auto privateNode = resolveRef(node);
|
||||
privateNode->setOwner(nullptr);
|
||||
}
|
||||
|
||||
// Clone, with new children
|
||||
NodeWrapper(
|
||||
const NodeWrapper& other,
|
||||
std::vector<std::shared_ptr<NodeWrapper>> children)
|
||||
: node{YGNodeClone(other.node)}, children{std::move(children)} {
|
||||
YGNodeSetContext(node, this);
|
||||
|
||||
auto privateNode = resolveRef(node);
|
||||
privateNode->setOwner(nullptr);
|
||||
privateNode->setChildren({});
|
||||
privateNode->setDirty(true);
|
||||
|
||||
for (const auto& child : this->children) {
|
||||
auto privateChild = resolveRef(child->node);
|
||||
// Claim first ownership of not yet owned nodes, to avoid immediately
|
||||
// cloning them
|
||||
if (YGNodeGetOwner(child->node) == nullptr) {
|
||||
privateChild->setOwner(privateNode);
|
||||
}
|
||||
privateNode->insertChild(privateChild, privateNode->getChildCount());
|
||||
}
|
||||
}
|
||||
|
||||
NodeWrapper(NodeWrapper&&) = delete;
|
||||
|
||||
~NodeWrapper() {
|
||||
YGNodeFree(node);
|
||||
}
|
||||
|
||||
NodeWrapper& operator=(const NodeWrapper& other) = delete;
|
||||
NodeWrapper& operator=(NodeWrapper&& other) = delete;
|
||||
|
||||
YGNodeRef node;
|
||||
std::vector<std::shared_ptr<NodeWrapper>> children;
|
||||
};
|
||||
|
||||
struct ConfigWrapper {
|
||||
ConfigWrapper() {
|
||||
YGConfigSetCloneNodeFunc(
|
||||
config,
|
||||
[](YGNodeConstRef oldNode, YGNodeConstRef owner, size_t childIndex) {
|
||||
onClone(oldNode, owner, childIndex);
|
||||
auto wrapper = static_cast<NodeWrapper*>(YGNodeGetContext(owner));
|
||||
auto old = static_cast<NodeWrapper*>(YGNodeGetContext(oldNode));
|
||||
|
||||
wrapper->children[childIndex] = std::make_shared<NodeWrapper>(*old);
|
||||
return wrapper->children[childIndex]->node;
|
||||
});
|
||||
}
|
||||
|
||||
ConfigWrapper(const ConfigWrapper&) = delete;
|
||||
ConfigWrapper(ConfigWrapper&&) = delete;
|
||||
|
||||
~ConfigWrapper() {
|
||||
YGConfigFree(config);
|
||||
}
|
||||
|
||||
ConfigWrapper& operator=(const ConfigWrapper&) = delete;
|
||||
ConfigWrapper& operator=(ConfigWrapper&&) = delete;
|
||||
|
||||
YGConfigRef config{YGConfigNew()};
|
||||
};
|
||||
|
||||
ConfigWrapper configWrapper;
|
||||
YGConfigRef config{configWrapper.config};
|
||||
|
||||
void SetUp() override {
|
||||
onClone = [](...) {};
|
||||
}
|
||||
|
||||
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
|
||||
static inline std::function<void(YGNodeConstRef, YGNodeConstRef, size_t)>
|
||||
onClone;
|
||||
};
|
||||
|
||||
TEST_F(
|
||||
YGPersistentNodeCloningTest,
|
||||
changing_sibling_height_does_not_clone_neighbors) {
|
||||
// <ScrollView>
|
||||
// <View id="Sibling" style={{ height: 1 }} />
|
||||
// <View id="A" style={{ height: 1 }}>
|
||||
// <View id="B">
|
||||
// <View id="C">
|
||||
// <View id="D"/>
|
||||
// </View>
|
||||
// </View>
|
||||
// </View>
|
||||
// </ScrollView>
|
||||
|
||||
auto sibling = std::make_shared<NodeWrapper>(config);
|
||||
YGNodeStyleSetHeight(sibling->node, 1);
|
||||
|
||||
auto d = std::make_shared<NodeWrapper>(config);
|
||||
auto c = std::make_shared<NodeWrapper>(config, std::vector{d});
|
||||
auto b = std::make_shared<NodeWrapper>(config, std::vector{c});
|
||||
auto a = std::make_shared<NodeWrapper>(config, std::vector{b});
|
||||
YGNodeStyleSetHeight(a->node, 1);
|
||||
|
||||
auto scrollContentView =
|
||||
std::make_shared<NodeWrapper>(config, std::vector{sibling, a});
|
||||
YGNodeStyleSetPositionType(scrollContentView->node, YGPositionTypeAbsolute);
|
||||
|
||||
auto scrollView =
|
||||
std::make_shared<NodeWrapper>(config, std::vector{scrollContentView});
|
||||
YGNodeStyleSetWidth(scrollView->node, 100);
|
||||
YGNodeStyleSetHeight(scrollView->node, 100);
|
||||
|
||||
// We don't expect any cloning during the first layout
|
||||
onClone = [](...) { FAIL(); };
|
||||
|
||||
YGNodeCalculateLayout(
|
||||
scrollView->node, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||
|
||||
auto siblingPrime = std::make_shared<NodeWrapper>(config);
|
||||
YGNodeStyleSetHeight(siblingPrime->node, 2);
|
||||
|
||||
auto scrollContentViewPrime = std::make_shared<NodeWrapper>(
|
||||
*scrollContentView, std::vector{siblingPrime, a});
|
||||
auto scrollViewPrime = std::make_shared<NodeWrapper>(
|
||||
*scrollView, std::vector{scrollContentViewPrime});
|
||||
|
||||
std::vector<NodeWrapper*> nodesCloned;
|
||||
// We should only need to clone "A"
|
||||
onClone = [&](YGNodeConstRef oldNode,
|
||||
YGNodeConstRef /*owner*/,
|
||||
size_t /*childIndex*/) {
|
||||
nodesCloned.push_back(static_cast<NodeWrapper*>(YGNodeGetContext(oldNode)));
|
||||
};
|
||||
|
||||
YGNodeCalculateLayout(
|
||||
scrollViewPrime->node, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||
|
||||
EXPECT_EQ(nodesCloned.size(), 1);
|
||||
EXPECT_EQ(nodesCloned[0], a.get());
|
||||
}
|
||||
|
||||
TEST_F(YGPersistentNodeCloningTest, clone_leaf_display_contents_node) {
|
||||
// <View id="A">
|
||||
// <View id="B" style={{ display: 'contents' }} />
|
||||
// </View>
|
||||
|
||||
auto b = std::make_shared<NodeWrapper>(config);
|
||||
auto a = std::make_shared<NodeWrapper>(config, std::vector{b});
|
||||
YGNodeStyleSetDisplay(b->node, YGDisplayContents);
|
||||
|
||||
// We don't expect any cloning during the first layout
|
||||
onClone = [](...) { FAIL(); };
|
||||
|
||||
YGNodeCalculateLayout(a->node, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||
|
||||
auto aPrime = std::make_shared<NodeWrapper>(config, std::vector{b});
|
||||
|
||||
std::vector<NodeWrapper*> nodesCloned;
|
||||
// We should clone "C"
|
||||
onClone = [&](YGNodeConstRef oldNode,
|
||||
YGNodeConstRef /*owner*/,
|
||||
size_t /*childIndex*/) {
|
||||
nodesCloned.push_back(static_cast<NodeWrapper*>(YGNodeGetContext(oldNode)));
|
||||
};
|
||||
|
||||
YGNodeCalculateLayout(aPrime->node, 100, 100, YGDirectionLTR);
|
||||
|
||||
EXPECT_EQ(nodesCloned.size(), 1);
|
||||
EXPECT_EQ(nodesCloned[0], b.get());
|
||||
}
|
||||
|
||||
} // namespace facebook::yoga
|
@@ -8,6 +8,8 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <yoga/Yoga.h>
|
||||
|
||||
#include <cmath>
|
||||
|
||||
TEST(YogaTest, rounding_value) {
|
||||
// Test that whole numbers are rounded to whole despite ceil/floor flags
|
||||
ASSERT_FLOAT_EQ(6.0, YGRoundValueToPixelGrid(6.000001, 2.0, false, false));
|
||||
@@ -39,6 +41,44 @@ TEST(YogaTest, rounding_value) {
|
||||
ASSERT_FLOAT_EQ(-6.0, YGRoundValueToPixelGrid(-5.99, 2.0, false, false));
|
||||
ASSERT_FLOAT_EQ(-5.5, YGRoundValueToPixelGrid(-5.99, 2.0, true, false));
|
||||
ASSERT_FLOAT_EQ(-6.0, YGRoundValueToPixelGrid(-5.99, 2.0, false, true));
|
||||
|
||||
// Rounding up/down halfway values is as expected for both positive and
|
||||
// negative numbers
|
||||
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.5, 1.0, false, false));
|
||||
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.4, 1.0, false, false));
|
||||
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.6, 1.0, false, false));
|
||||
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.499999, 1.0, false, false));
|
||||
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.500001, 1.0, false, false));
|
||||
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.5001, 1.0, false, false));
|
||||
|
||||
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.5, 1.0, true, false));
|
||||
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.4, 1.0, true, false));
|
||||
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.6, 1.0, true, false));
|
||||
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.499999, 1.0, true, false));
|
||||
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.500001, 1.0, true, false));
|
||||
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.5001, 1.0, true, false));
|
||||
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.00001, 1.0, true, false));
|
||||
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3, 1.0, true, false));
|
||||
|
||||
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.5, 1.0, false, true));
|
||||
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.4, 1.0, false, true));
|
||||
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.6, 1.0, false, true));
|
||||
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.499999, 1.0, false, true));
|
||||
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.500001, 1.0, false, true));
|
||||
ASSERT_FLOAT_EQ(-4, YGRoundValueToPixelGrid(-3.5001, 1.0, false, true));
|
||||
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3.00001, 1.0, false, true));
|
||||
ASSERT_FLOAT_EQ(-3, YGRoundValueToPixelGrid(-3, 1.0, false, true));
|
||||
|
||||
// NAN is treated as expected:
|
||||
ASSERT_TRUE(std::isnan(YGRoundValueToPixelGrid(
|
||||
std::numeric_limits<double>::quiet_NaN(), 1.5, false, false)));
|
||||
ASSERT_TRUE(std::isnan(YGRoundValueToPixelGrid(
|
||||
1.5, std::numeric_limits<double>::quiet_NaN(), false, false)));
|
||||
ASSERT_TRUE(std::isnan(YGRoundValueToPixelGrid(
|
||||
std::numeric_limits<double>::quiet_NaN(),
|
||||
std::numeric_limits<double>::quiet_NaN(),
|
||||
false,
|
||||
false)));
|
||||
}
|
||||
|
||||
static YGSize measureText(
|
||||
@@ -121,3 +161,23 @@ TEST(YogaTest, per_node_point_scale_factor) {
|
||||
YGConfigFree(config2);
|
||||
YGConfigFree(config3);
|
||||
}
|
||||
|
||||
TEST(YogaTest, raw_layout_dimensions) {
|
||||
YGConfigRef config = YGConfigNew();
|
||||
YGConfigSetPointScaleFactor(config, 0.5f);
|
||||
|
||||
YGNodeRef root = YGNodeNewWithConfig(config);
|
||||
YGNodeStyleSetWidth(root, 11.5f);
|
||||
YGNodeStyleSetHeight(root, 9.5f);
|
||||
|
||||
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||
|
||||
ASSERT_EQ(YGNodeLayoutGetWidth(root), 12.0f);
|
||||
ASSERT_EQ(YGNodeLayoutGetHeight(root), 10.0f);
|
||||
ASSERT_EQ(YGNodeLayoutGetRawWidth(root), 11.5f);
|
||||
ASSERT_EQ(YGNodeLayoutGetRawHeight(root), 9.5f);
|
||||
|
||||
YGNodeFreeRecursive(root);
|
||||
|
||||
YGConfigFree(config);
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* clang-format off
|
||||
* @generated SignedSource<<71295a398c89ea424490884a05e2c77c>>
|
||||
* @generated SignedSource<<1db57b05babb408c08efcec7dbdf16fb>>
|
||||
* generated by gentest/gentest-driver.ts from gentest/fixtures/YGAlignItemsTest.html
|
||||
*/
|
||||
|
||||
@@ -2310,3 +2310,84 @@ TEST(YogaTest, align_stretch_with_row_reverse) {
|
||||
|
||||
YGConfigFree(config);
|
||||
}
|
||||
|
||||
TEST(YogaTest, align_items_non_stretch_s526008) {
|
||||
YGConfigRef config = YGConfigNew();
|
||||
|
||||
YGNodeRef root = YGNodeNewWithConfig(config);
|
||||
YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute);
|
||||
YGNodeStyleSetWidth(root, 400);
|
||||
YGNodeStyleSetHeight(root, 400);
|
||||
|
||||
YGNodeRef root_child0 = YGNodeNewWithConfig(config);
|
||||
YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionRow);
|
||||
YGNodeInsertChild(root, root_child0, 0);
|
||||
|
||||
YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
|
||||
YGNodeStyleSetAlignItems(root_child0_child0, YGAlignFlexStart);
|
||||
YGNodeInsertChild(root_child0, root_child0_child0, 0);
|
||||
|
||||
YGNodeRef root_child0_child0_child0 = YGNodeNewWithConfig(config);
|
||||
YGNodeInsertChild(root_child0_child0, root_child0_child0_child0, 0);
|
||||
|
||||
YGNodeRef root_child0_child0_child0_child0 = YGNodeNewWithConfig(config);
|
||||
YGNodeStyleSetHeight(root_child0_child0_child0_child0, 10);
|
||||
YGNodeInsertChild(root_child0_child0_child0, root_child0_child0_child0_child0, 0);
|
||||
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
|
||||
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetWidth(root));
|
||||
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetHeight(root));
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
|
||||
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetWidth(root_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0_child0));
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0_child0_child0));
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0_child0_child0_child0));
|
||||
|
||||
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
|
||||
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetWidth(root));
|
||||
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetHeight(root));
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
|
||||
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetWidth(root_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
|
||||
|
||||
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetLeft(root_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0_child0));
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0_child0_child0));
|
||||
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0_child0_child0_child0));
|
||||
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0_child0_child0_child0));
|
||||
|
||||
YGNodeFreeRecursive(root);
|
||||
|
||||
YGConfigFree(config);
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -90,14 +90,20 @@ YGSize IntrinsicSizeMeasure(
|
||||
measuredHeight = std::min(
|
||||
calculateHeight(
|
||||
innerText,
|
||||
std::max(longestWordWidth(innerText, widthPerChar), measuredWidth),
|
||||
YGNodeStyleGetFlexDirection(node) == YGFlexDirectionColumn
|
||||
? measuredWidth
|
||||
: std::max(
|
||||
longestWordWidth(innerText, widthPerChar), measuredWidth),
|
||||
widthPerChar,
|
||||
heightPerChar),
|
||||
height);
|
||||
} else {
|
||||
measuredHeight = calculateHeight(
|
||||
innerText,
|
||||
std::max(longestWordWidth(innerText, widthPerChar), measuredWidth),
|
||||
YGNodeStyleGetFlexDirection(node) == YGFlexDirectionColumn
|
||||
? measuredWidth
|
||||
: std::max(
|
||||
longestWordWidth(innerText, widthPerChar), measuredWidth),
|
||||
widthPerChar,
|
||||
heightPerChar);
|
||||
}
|
||||
|
83
website/blog/2024-12-02-announcing-yoga-3.2.md
Normal file
83
website/blog/2024-12-02-announcing-yoga-3.2.md
Normal file
@@ -0,0 +1,83 @@
|
||||
---
|
||||
slug: announcing-yoga-3.2
|
||||
title: Announcing Yoga 3.2
|
||||
authors:
|
||||
- NickGerleman
|
||||
---
|
||||
|
||||
import Playground from '@site/src/components/Playground';
|
||||
|
||||
Yoga 3.2 is a new minor version of Yoga, used by React Native 0.77.
|
||||
|
||||
## Highlights
|
||||
|
||||
1. Support for `box-sizing`
|
||||
2. Support for `display: contents`
|
||||
3. Bug fixes and improvements
|
||||
|
||||
## `box-sizing`
|
||||
|
||||
Yoga [now supports](https://github.com/facebook/yoga/commit/671ae61a39d02091d1e73fe773d6a09f2f93cda4) [`box-sizing`](https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing) on styles, allowing sizing values to influence the content box instead of the border box.
|
||||
|
||||
:::warning
|
||||
|
||||
To preserve compatibility, Yoga nodes default to `box-sizing: border-box`, even if `UseWebDefaults` is set. We recommend manually setting node defaults instead of using the `UseWebDefaults` API.
|
||||
|
||||
:::
|
||||
|
||||
<Playground code={`<Layout config={{useWebDefaults: true}}>
|
||||
<Node
|
||||
style={{
|
||||
width: 100,
|
||||
height: 100,
|
||||
padding: 50,
|
||||
boxSizing: "border-box",
|
||||
}}>
|
||||
</Node>
|
||||
</Layout>`} />
|
||||
|
||||
<Playground code={`<Layout config={{useWebDefaults: true}}>
|
||||
<Node
|
||||
style={{
|
||||
width: 100,
|
||||
height: 100,
|
||||
padding: 50,
|
||||
boxSizing: "content-box",
|
||||
}}>
|
||||
</Node>
|
||||
</Layout>`} />
|
||||
|
||||
|
||||
|
||||
## `display: contents`
|
||||
|
||||
Yoga nodes [may now be set to `display: contents`](https://github.com/facebook/yoga/commit/68bb2343d2b470962065789d09016bba8e785340) to remove them from the layout flow, while preserving and hoisting the node's children. This may be used by the higher level UI framework to allow more easily composing wrapper components (such as those which may need to handle events, without influencing child layout). Thanks [@j-piasecki](https://github.com/j-piasecki) for the contribution!
|
||||
|
||||
<Playground code={`<Layout config={{useWebDefaults: false}}>
|
||||
<Node
|
||||
style={{
|
||||
width: 100,
|
||||
height: 100,
|
||||
gap: 10,
|
||||
}}
|
||||
>
|
||||
<Node style={{display: "contents"}}>
|
||||
<Node style={{flexGrow: 1}} />
|
||||
<Node style={{flexGrow: 1}} />
|
||||
<Node style={{flexGrow: 1}} />
|
||||
</Node>
|
||||
</Node>
|
||||
</Layout>`} />
|
||||
|
||||
|
||||
## Removal of legacy absolute positioning
|
||||
|
||||
Yoga 3.0 introduced a new algorithm used for absolute positioning. This algorithm is more correct than the one previously used, but led to observed compatibility issues with existing code, so we left the option to disable it via the `AbsolutePositioningIncorrect` erratum (enabled by default in frameworks like React Native). Yoga 3.2 removes the legacy absolute positioning path, but ports over the main compatibility quirk under a new erratum `AbsolutePositionWithoutInsetsExcludesPadding` (where the previous incorrect behavior would omit padding when a position was not specified on the absolute node). Errata users should see more correct absolute positioning behavior, while preserving compatibility with existing code.
|
||||
|
||||
## Fixed non-global YogaConfig in Java bindings
|
||||
|
||||
Yoga would previously allow garbage collection of a `YogaConfig` if it was not retained outside of the Yoga tree. This could result in confusing errors caused by use-after free. Yoga nodes [now correctly retain the configs they are using](https://github.com/facebook/yoga/commit/22b018c957e930de950338ad87f4ef8d59e8a169). Thanks [@michaeltroger](https://github.com/michaeltroger) for this fix!
|
||||
|
||||
## Fixed behavior when combining `align-items` with `align-content`
|
||||
|
||||
A regression [was fixed](https://github.com/facebook/yoga/commit/77c99870127e9c2d46a07264fa372025334d8fd0) in how Yoga handles some combinations of `align-content` and `align-items`. Thanks [@phuccvx12](https://github.com/phuccvx12) for this fix!
|
@@ -17,15 +17,15 @@ has effect when items are wrapped to multiple lines using [flex wrap](/docs/styl
|
||||
|
||||
**Center**: Align wrapped lines in the center of the container's cross axis.
|
||||
|
||||
**Space between**: Evenly space wrapped lines across the container's main axis, distributing
|
||||
**Space between**: Evenly space wrapped lines across the container's cross axis, distributing
|
||||
remaining space between the lines.
|
||||
|
||||
**Space around**: Evenly space wrapped lines across the container's main axis, distributing
|
||||
**Space around**: Evenly space wrapped lines across the container's cross axis, distributing
|
||||
remaining space around the lines. Compared to space between using
|
||||
space around will result in space being distributed to the beginning of
|
||||
the first lines and end of the last line.
|
||||
|
||||
**Space evenly**: Evenly space wrapped lines across the container's main axis, distributing
|
||||
**Space evenly**: Evenly space wrapped lines across the container's cross axis, distributing
|
||||
remaining space around the lines. Compared to space around, space evenly will not
|
||||
double the gaps between children. The size of gaps between children and between
|
||||
the parent's edges and the first/last child will all be equal.
|
||||
|
@@ -63,7 +63,7 @@ export type FlexStyle = {
|
||||
bottom?: number | `${number}%`;
|
||||
boxSizing?: 'border-box' | 'content-box';
|
||||
direction?: 'ltr' | 'rtl';
|
||||
display?: 'none' | 'flex';
|
||||
display?: 'none' | 'flex' | 'contents';
|
||||
end?: number | `${number}%`;
|
||||
flex?: number;
|
||||
flexBasis?: number | 'auto' | `${number}%`;
|
||||
@@ -360,12 +360,14 @@ function direction(str?: 'ltr' | 'rtl'): Direction {
|
||||
throw new Error(`"${str}" is not a valid value for direction`);
|
||||
}
|
||||
|
||||
function display(str?: 'none' | 'flex'): Display {
|
||||
function display(str?: 'none' | 'flex' | 'contents'): Display {
|
||||
switch (str) {
|
||||
case 'none':
|
||||
return Display.None;
|
||||
case 'flex':
|
||||
return Display.Flex;
|
||||
case 'contents':
|
||||
return Display.Contents;
|
||||
}
|
||||
throw new Error(`"${str}" is not a valid value for display`);
|
||||
}
|
||||
|
@@ -16,6 +16,7 @@ export type LayoutMetrics = {
|
||||
width: number;
|
||||
height: number;
|
||||
overflow?: 'visible' | 'hidden' | 'scroll';
|
||||
display?: 'flex' | 'none' | 'contents';
|
||||
children?: LayoutMetrics[];
|
||||
};
|
||||
|
||||
@@ -49,7 +50,11 @@ export default function LayoutBox({metrics, depth, className}: Props) {
|
||||
position: depth === 0 ? 'relative' : 'absolute',
|
||||
}}>
|
||||
{children?.map((child, i) => (
|
||||
<LayoutBox key={i} metrics={child} depth={depth + 1} />
|
||||
<LayoutBox
|
||||
key={i}
|
||||
metrics={child}
|
||||
depth={style.display === 'contents' ? depth : depth + 1}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
|
@@ -8,7 +8,12 @@
|
||||
*/
|
||||
|
||||
import {useMemo} from 'react';
|
||||
import Yoga, {Direction, Overflow, Node as YogaNode} from 'yoga-layout';
|
||||
import Yoga, {
|
||||
Direction,
|
||||
Display,
|
||||
Overflow,
|
||||
Node as YogaNode,
|
||||
} from 'yoga-layout';
|
||||
import {FlexStyle, applyStyle} from './FlexStyle';
|
||||
import LayoutBox from './LayoutBox';
|
||||
|
||||
@@ -109,6 +114,16 @@ function metricsFromYogaNode(node: YogaNode): LayoutMetrics {
|
||||
return 'visible';
|
||||
}
|
||||
})(),
|
||||
display: (() => {
|
||||
switch (node.getDisplay()) {
|
||||
case Display.Flex:
|
||||
return 'flex';
|
||||
case Display.None:
|
||||
return 'none';
|
||||
case Display.Contents:
|
||||
return 'contents';
|
||||
}
|
||||
})(),
|
||||
children,
|
||||
};
|
||||
}
|
||||
|
37
yarn.lock
37
yarn.lock
@@ -4049,9 +4049,9 @@ cosmiconfig@^8.1.3, cosmiconfig@^8.2.0:
|
||||
path-type "^4.0.0"
|
||||
|
||||
cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
|
||||
version "7.0.6"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
|
||||
integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
|
||||
version "7.0.3"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
|
||||
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
|
||||
dependencies:
|
||||
path-key "^3.1.0"
|
||||
shebang-command "^2.0.0"
|
||||
@@ -10173,16 +10173,7 @@ string-length@^4.0.1:
|
||||
char-regex "^1.0.2"
|
||||
strip-ansi "^6.0.0"
|
||||
|
||||
"string-width-cjs@npm:string-width@^4.2.0":
|
||||
version "4.2.3"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||
dependencies:
|
||||
emoji-regex "^8.0.0"
|
||||
is-fullwidth-code-point "^3.0.0"
|
||||
strip-ansi "^6.0.1"
|
||||
|
||||
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
||||
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
||||
version "4.2.3"
|
||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||
@@ -10273,14 +10264,7 @@ stringify-object@^3.3.0:
|
||||
is-obj "^1.0.1"
|
||||
is-regexp "^1.0.0"
|
||||
|
||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||
dependencies:
|
||||
ansi-regex "^5.0.1"
|
||||
|
||||
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||
@@ -11180,16 +11164,7 @@ word-wrap@^1.2.3:
|
||||
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
|
||||
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
|
||||
|
||||
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||
dependencies:
|
||||
ansi-styles "^4.0.0"
|
||||
string-width "^4.1.0"
|
||||
strip-ansi "^6.0.0"
|
||||
|
||||
wrap-ansi@7.0.0, wrap-ansi@^7.0.0:
|
||||
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@7.0.0, wrap-ansi@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||
|
@@ -90,3 +90,11 @@ float YGNodeLayoutGetPadding(YGNodeConstRef node, YGEdge edge) {
|
||||
return getResolvedLayoutProperty<&LayoutResults::padding>(
|
||||
node, scopedEnum(edge));
|
||||
}
|
||||
|
||||
float YGNodeLayoutGetRawHeight(YGNodeConstRef node) {
|
||||
return resolveRef(node)->getLayout().rawDimension(Dimension::Height);
|
||||
}
|
||||
|
||||
float YGNodeLayoutGetRawWidth(YGNodeConstRef node) {
|
||||
return resolveRef(node)->getLayout().rawDimension(Dimension::Width);
|
||||
}
|
||||
|
@@ -32,4 +32,14 @@ YG_EXPORT float YGNodeLayoutGetMargin(YGNodeConstRef node, YGEdge edge);
|
||||
YG_EXPORT float YGNodeLayoutGetBorder(YGNodeConstRef node, YGEdge edge);
|
||||
YG_EXPORT float YGNodeLayoutGetPadding(YGNodeConstRef node, YGEdge edge);
|
||||
|
||||
/**
|
||||
* Return the measured height of the node, before layout rounding
|
||||
*/
|
||||
YG_EXPORT float YGNodeLayoutGetRawHeight(YGNodeConstRef node);
|
||||
|
||||
/**
|
||||
* Return the measured width of the node, before layout rounding
|
||||
*/
|
||||
YG_EXPORT float YGNodeLayoutGetRawWidth(YGNodeConstRef node);
|
||||
|
||||
YG_EXTERN_C_END
|
||||
|
@@ -293,13 +293,8 @@ void YGNodeStyleSetGapPercent(YGNodeRef node, YGGutter gutter, float percent) {
|
||||
node, scopedEnum(gutter), StyleLength::percent(percent));
|
||||
}
|
||||
|
||||
float YGNodeStyleGetGap(const YGNodeConstRef node, const YGGutter gutter) {
|
||||
auto gapLength = resolveRef(node)->style().gap(scopedEnum(gutter));
|
||||
if (gapLength.isUndefined() || gapLength.isAuto()) {
|
||||
return YGUndefined;
|
||||
}
|
||||
|
||||
return static_cast<YGValue>(gapLength).value;
|
||||
YGValue YGNodeStyleGetGap(const YGNodeConstRef node, const YGGutter gutter) {
|
||||
return (YGValue)resolveRef(node)->style().gap(scopedEnum(gutter));
|
||||
}
|
||||
|
||||
void YGNodeStyleSetAspectRatio(const YGNodeRef node, const float aspectRatio) {
|
||||
|
@@ -96,7 +96,7 @@ YG_EXPORT void
|
||||
YGNodeStyleSetGap(YGNodeRef node, YGGutter gutter, float gapLength);
|
||||
YG_EXPORT void
|
||||
YGNodeStyleSetGapPercent(YGNodeRef node, YGGutter gutter, float gapLength);
|
||||
YG_EXPORT float YGNodeStyleGetGap(YGNodeConstRef node, YGGutter gutter);
|
||||
YG_EXPORT YGValue YGNodeStyleGetGap(YGNodeConstRef node, YGGutter gutter);
|
||||
|
||||
YG_EXPORT void YGNodeStyleSetBoxSizing(YGNodeRef node, YGBoxSizing boxSizing);
|
||||
YG_EXPORT YGBoxSizing YGNodeStyleGetBoxSizing(YGNodeConstRef node);
|
||||
|
@@ -72,9 +72,9 @@ inline bool operator==(const YGValue& lhs, const YGValue& rhs) {
|
||||
case YGUnitPoint:
|
||||
case YGUnitPercent:
|
||||
return lhs.value == rhs.value;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
inline bool operator!=(const YGValue& lhs, const YGValue& rhs) {
|
||||
|
16
yoga/Yoga.h
16
yoga/Yoga.h
@@ -11,11 +11,11 @@
|
||||
* `#include <yoga/Yoga.h>` includes all of Yoga's public headers.
|
||||
*/
|
||||
|
||||
#include <yoga/YGConfig.h>
|
||||
#include <yoga/YGEnums.h>
|
||||
#include <yoga/YGMacros.h>
|
||||
#include <yoga/YGNode.h>
|
||||
#include <yoga/YGNodeLayout.h>
|
||||
#include <yoga/YGNodeStyle.h>
|
||||
#include <yoga/YGPixelGrid.h>
|
||||
#include <yoga/YGValue.h>
|
||||
#include <yoga/YGConfig.h> // IWYU pragma: export
|
||||
#include <yoga/YGEnums.h> // IWYU pragma: export
|
||||
#include <yoga/YGMacros.h> // IWYU pragma: export
|
||||
#include <yoga/YGNode.h> // IWYU pragma: export
|
||||
#include <yoga/YGNodeLayout.h> // IWYU pragma: export
|
||||
#include <yoga/YGNodeStyle.h> // IWYU pragma: export
|
||||
#include <yoga/YGPixelGrid.h> // IWYU pragma: export
|
||||
#include <yoga/YGValue.h> // IWYU pragma: export
|
||||
|
@@ -415,6 +415,12 @@ static void measureNodeWithoutChildren(
|
||||
Dimension::Height);
|
||||
}
|
||||
|
||||
inline bool isFixedSize(float dim, SizingMode sizingMode) {
|
||||
return sizingMode == SizingMode::StretchFit ||
|
||||
(yoga::isDefined(dim) && sizingMode == SizingMode::FitContent &&
|
||||
dim <= 0.0);
|
||||
}
|
||||
|
||||
static bool measureNodeWithFixedSize(
|
||||
yoga::Node* const node,
|
||||
const Direction direction,
|
||||
@@ -424,12 +430,8 @@ static bool measureNodeWithFixedSize(
|
||||
const SizingMode heightSizingMode,
|
||||
const float ownerWidth,
|
||||
const float ownerHeight) {
|
||||
if ((yoga::isDefined(availableWidth) &&
|
||||
widthSizingMode == SizingMode::FitContent && availableWidth <= 0.0f) ||
|
||||
(yoga::isDefined(availableHeight) &&
|
||||
heightSizingMode == SizingMode::FitContent && availableHeight <= 0.0f) ||
|
||||
(widthSizingMode == SizingMode::StretchFit &&
|
||||
heightSizingMode == SizingMode::StretchFit)) {
|
||||
if (isFixedSize(availableWidth, widthSizingMode) &&
|
||||
isFixedSize(availableHeight, heightSizingMode)) {
|
||||
node->setLayoutMeasuredDimension(
|
||||
boundAxis(
|
||||
node,
|
||||
@@ -476,16 +478,19 @@ static void zeroOutLayoutRecursively(yoga::Node* const node) {
|
||||
}
|
||||
|
||||
static void cleanupContentsNodesRecursively(yoga::Node* const node) {
|
||||
for (auto child : node->getChildren()) {
|
||||
if (child->style().display() == Display::Contents) {
|
||||
child->getLayout() = {};
|
||||
child->setLayoutDimension(0, Dimension::Width);
|
||||
child->setLayoutDimension(0, Dimension::Height);
|
||||
child->setHasNewLayout(true);
|
||||
child->setDirty(false);
|
||||
child->cloneChildrenIfNeeded();
|
||||
if (node->hasContentsChildren()) [[unlikely]] {
|
||||
node->cloneContentsChildrenIfNeeded();
|
||||
for (auto child : node->getChildren()) {
|
||||
if (child->style().display() == Display::Contents) {
|
||||
child->getLayout() = {};
|
||||
child->setLayoutDimension(0, Dimension::Width);
|
||||
child->setLayoutDimension(0, Dimension::Height);
|
||||
child->setHasNewLayout(true);
|
||||
child->setDirty(false);
|
||||
child->cloneChildrenIfNeeded();
|
||||
|
||||
cleanupContentsNodesRecursively(child);
|
||||
cleanupContentsNodesRecursively(child);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1213,10 +1218,10 @@ static void calculateLayoutImpl(
|
||||
const float ownerWidth,
|
||||
const float ownerHeight,
|
||||
const bool performLayout,
|
||||
const LayoutPassReason reason,
|
||||
LayoutData& layoutMarkerData,
|
||||
const uint32_t depth,
|
||||
const uint32_t generationCount,
|
||||
const LayoutPassReason reason) {
|
||||
const uint32_t generationCount) {
|
||||
yoga::assertFatalWithNode(
|
||||
node,
|
||||
yoga::isUndefined(availableWidth)
|
||||
@@ -1780,7 +1785,7 @@ static void calculateLayoutImpl(
|
||||
crossAxis,
|
||||
direction,
|
||||
unclampedCrossDim,
|
||||
ownerHeight,
|
||||
crossAxisOwnerSize,
|
||||
ownerWidth) -
|
||||
paddingAndBorderAxisCross;
|
||||
|
||||
@@ -2268,10 +2273,10 @@ bool calculateLayoutInternal(
|
||||
ownerWidth,
|
||||
ownerHeight,
|
||||
performLayout,
|
||||
reason,
|
||||
layoutMarkerData,
|
||||
depth,
|
||||
generationCount,
|
||||
reason);
|
||||
generationCount);
|
||||
|
||||
layout->lastOwnerDirection = ownerDirection;
|
||||
layout->configVersion = node->getConfig()->getVersion();
|
||||
|
@@ -17,7 +17,7 @@ FlexLine calculateFlexLine(
|
||||
yoga::Node* const node,
|
||||
const Direction ownerDirection,
|
||||
const float ownerWidth,
|
||||
const float mainAxisownerSize,
|
||||
const float mainAxisOwnerSize,
|
||||
const float availableInnerWidth,
|
||||
const float availableInnerMainDim,
|
||||
Node::LayoutableChildren::Iterator& iterator,
|
||||
@@ -70,7 +70,7 @@ FlexLine calculateFlexLine(
|
||||
direction,
|
||||
mainAxis,
|
||||
child->getLayout().computedFlexBasis,
|
||||
mainAxisownerSize,
|
||||
mainAxisOwnerSize,
|
||||
ownerWidth)
|
||||
.unwrap();
|
||||
|
||||
|
@@ -66,7 +66,7 @@ FlexLine calculateFlexLine(
|
||||
yoga::Node* node,
|
||||
Direction ownerDirection,
|
||||
float ownerWidth,
|
||||
float mainAxisownerSize,
|
||||
float mainAxisOwnerSize,
|
||||
float availableInnerWidth,
|
||||
float availableInnerMainDim,
|
||||
Node::LayoutableChildren::Iterator& iterator,
|
||||
|
@@ -66,7 +66,8 @@ void roundLayoutResultsToPixelGrid(
|
||||
yoga::Node* const node,
|
||||
const double absoluteLeft,
|
||||
const double absoluteTop) {
|
||||
const auto pointScaleFactor = node->getConfig()->getPointScaleFactor();
|
||||
const auto pointScaleFactor =
|
||||
static_cast<double>(node->getConfig()->getPointScaleFactor());
|
||||
|
||||
const double nodeLeft = node->getLayout().position(PhysicalEdge::Left);
|
||||
const double nodeTop = node->getLayout().position(PhysicalEdge::Top);
|
||||
@@ -80,7 +81,7 @@ void roundLayoutResultsToPixelGrid(
|
||||
const double absoluteNodeRight = absoluteNodeLeft + nodeWidth;
|
||||
const double absoluteNodeBottom = absoluteNodeTop + nodeHeight;
|
||||
|
||||
if (pointScaleFactor != 0.0f) {
|
||||
if (pointScaleFactor != 0.0) {
|
||||
// If a node has a custom measure function we never want to round down its
|
||||
// size as this could lead to unwanted text truncation.
|
||||
const bool textRounding = node->getNodeType() == NodeType::Text;
|
||||
@@ -96,32 +97,34 @@ void roundLayoutResultsToPixelGrid(
|
||||
// We multiply dimension by scale factor and if the result is close to the
|
||||
// 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
|
||||
const bool hasFractionalWidth =
|
||||
!yoga::inexactEquals(fmod(nodeWidth * pointScaleFactor, 1.0), 0) &&
|
||||
!yoga::inexactEquals(fmod(nodeWidth * pointScaleFactor, 1.0), 1.0);
|
||||
const bool hasFractionalHeight =
|
||||
!yoga::inexactEquals(fmod(nodeHeight * pointScaleFactor, 1.0), 0) &&
|
||||
!yoga::inexactEquals(fmod(nodeHeight * pointScaleFactor, 1.0), 1.0);
|
||||
|
||||
node->setLayoutDimension(
|
||||
const double scaledNodeWith = nodeWidth * pointScaleFactor;
|
||||
const bool hasFractionalWidth =
|
||||
!yoga::inexactEquals(round(scaledNodeWith), scaledNodeWith);
|
||||
|
||||
const double scaledNodeHeight = nodeHeight * pointScaleFactor;
|
||||
const bool hasFractionalHeight =
|
||||
!yoga::inexactEquals(round(scaledNodeHeight), scaledNodeHeight);
|
||||
|
||||
node->getLayout().setDimension(
|
||||
Dimension::Width,
|
||||
roundValueToPixelGrid(
|
||||
absoluteNodeRight,
|
||||
pointScaleFactor,
|
||||
(textRounding && hasFractionalWidth),
|
||||
(textRounding && !hasFractionalWidth)) -
|
||||
roundValueToPixelGrid(
|
||||
absoluteNodeLeft, pointScaleFactor, false, textRounding),
|
||||
Dimension::Width);
|
||||
absoluteNodeLeft, pointScaleFactor, false, textRounding));
|
||||
|
||||
node->setLayoutDimension(
|
||||
node->getLayout().setDimension(
|
||||
Dimension::Height,
|
||||
roundValueToPixelGrid(
|
||||
absoluteNodeBottom,
|
||||
pointScaleFactor,
|
||||
(textRounding && hasFractionalHeight),
|
||||
(textRounding && !hasFractionalHeight)) -
|
||||
roundValueToPixelGrid(
|
||||
absoluteNodeTop, pointScaleFactor, false, textRounding),
|
||||
Dimension::Height);
|
||||
absoluteNodeTop, pointScaleFactor, false, textRounding));
|
||||
}
|
||||
|
||||
for (yoga::Node* child : node->getChildren()) {
|
||||
|
@@ -19,6 +19,7 @@ namespace facebook::yoga {
|
||||
#if defined(__cpp_exceptions)
|
||||
throw std::logic_error(message);
|
||||
#else
|
||||
static_cast<void>(message); // Unused
|
||||
std::terminate();
|
||||
#endif
|
||||
}
|
||||
|
@@ -36,12 +36,12 @@ enum struct LayoutPassReason : int {
|
||||
};
|
||||
|
||||
struct LayoutData {
|
||||
int layouts;
|
||||
int measures;
|
||||
uint32_t maxMeasureCache;
|
||||
int cachedLayouts;
|
||||
int cachedMeasures;
|
||||
int measureCallbacks;
|
||||
int layouts = 0;
|
||||
int measures = 0;
|
||||
uint32_t maxMeasureCache = 0;
|
||||
int cachedLayouts = 0;
|
||||
int cachedMeasures = 0;
|
||||
int measureCallbacks = 0;
|
||||
std::array<int, static_cast<uint8_t>(LayoutPassReason::COUNT)>
|
||||
measureCallbackReasonsCount;
|
||||
};
|
||||
|
@@ -66,10 +66,18 @@ struct LayoutResults {
|
||||
return measuredDimensions_[yoga::to_underlying(axis)];
|
||||
}
|
||||
|
||||
float rawDimension(Dimension axis) const {
|
||||
return rawDimensions_[yoga::to_underlying(axis)];
|
||||
}
|
||||
|
||||
void setMeasuredDimension(Dimension axis, float dimension) {
|
||||
measuredDimensions_[yoga::to_underlying(axis)] = dimension;
|
||||
}
|
||||
|
||||
void setRawDimension(Dimension axis, float dimension) {
|
||||
rawDimensions_[yoga::to_underlying(axis)] = dimension;
|
||||
}
|
||||
|
||||
float position(PhysicalEdge physicalEdge) const {
|
||||
return position_[yoga::to_underlying(physicalEdge)];
|
||||
}
|
||||
@@ -113,6 +121,7 @@ struct LayoutResults {
|
||||
|
||||
std::array<float, 2> dimensions_ = {{YGUndefined, YGUndefined}};
|
||||
std::array<float, 2> measuredDimensions_ = {{YGUndefined, YGUndefined}};
|
||||
std::array<float, 2> rawDimensions_ = {{YGUndefined, YGUndefined}};
|
||||
std::array<float, 4> position_ = {};
|
||||
std::array<float, 4> margin_ = {};
|
||||
std::array<float, 4> border_ = {};
|
||||
|
@@ -181,6 +181,17 @@ void Node::setDirty(bool isDirty) {
|
||||
}
|
||||
}
|
||||
|
||||
void Node::setChildren(const std::vector<Node*>& children) {
|
||||
children_ = children;
|
||||
|
||||
contentsChildrenCount_ = 0;
|
||||
for (const auto& child : children) {
|
||||
if (child->style().display() == Display::Contents) {
|
||||
contentsChildrenCount_++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool Node::removeChild(Node* child) {
|
||||
auto p = std::find(children_.begin(), children_.end(), child);
|
||||
if (p != children_.end()) {
|
||||
@@ -245,8 +256,9 @@ void Node::setLayoutHadOverflow(bool hadOverflow) {
|
||||
layout_.setHadOverflow(hadOverflow);
|
||||
}
|
||||
|
||||
void Node::setLayoutDimension(float LengthValue, Dimension dimension) {
|
||||
layout_.setDimension(dimension, LengthValue);
|
||||
void Node::setLayoutDimension(float lengthValue, Dimension dimension) {
|
||||
layout_.setDimension(dimension, lengthValue);
|
||||
layout_.setRawDimension(dimension, lengthValue);
|
||||
}
|
||||
|
||||
// If both left and right are defined, then use left. Otherwise return +left or
|
||||
@@ -379,6 +391,23 @@ void Node::cloneChildrenIfNeeded() {
|
||||
if (child->getOwner() != this) {
|
||||
child = resolveRef(config_->cloneNode(child, this, i));
|
||||
child->setOwner(this);
|
||||
|
||||
if (child->hasContentsChildren()) [[unlikely]] {
|
||||
child->cloneContentsChildrenIfNeeded();
|
||||
}
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
|
||||
void Node::cloneContentsChildrenIfNeeded() {
|
||||
size_t i = 0;
|
||||
for (Node*& child : children_) {
|
||||
if (child->style().display() == Display::Contents &&
|
||||
child->getOwner() != this) {
|
||||
child = resolveRef(config_->cloneNode(child, this, i));
|
||||
child->setOwner(this);
|
||||
child->cloneChildrenIfNeeded();
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
|
@@ -96,6 +96,10 @@ class YG_EXPORT Node : public ::YGNode {
|
||||
return config_->hasErrata(errata);
|
||||
}
|
||||
|
||||
bool hasContentsChildren() const {
|
||||
return contentsChildrenCount_ != 0;
|
||||
}
|
||||
|
||||
YGDirtiedFunc getDirtiedFunc() const {
|
||||
return dirtiedFunc_;
|
||||
}
|
||||
@@ -244,22 +248,19 @@ class YG_EXPORT Node : public ::YGNode {
|
||||
owner_ = owner;
|
||||
}
|
||||
|
||||
void setChildren(const std::vector<Node*>& children) {
|
||||
children_ = children;
|
||||
}
|
||||
|
||||
// TODO: rvalue override for setChildren
|
||||
|
||||
void setConfig(Config* config);
|
||||
|
||||
void setDirty(bool isDirty);
|
||||
void setChildren(const std::vector<Node*>& children);
|
||||
void setLayoutLastOwnerDirection(Direction direction);
|
||||
void setLayoutComputedFlexBasis(FloatOptional computedFlexBasis);
|
||||
void setLayoutComputedFlexBasisGeneration(
|
||||
uint32_t computedFlexBasisGeneration);
|
||||
void setLayoutMeasuredDimension(float measuredDimension, Dimension dimension);
|
||||
void setLayoutHadOverflow(bool hadOverflow);
|
||||
void setLayoutDimension(float LengthValue, Dimension dimension);
|
||||
void setLayoutDimension(float lengthValue, Dimension dimension);
|
||||
void setLayoutDirection(Direction direction);
|
||||
void setLayoutMargin(float margin, PhysicalEdge edge);
|
||||
void setLayoutBorder(float border, PhysicalEdge edge);
|
||||
@@ -286,6 +287,7 @@ class YG_EXPORT Node : public ::YGNode {
|
||||
void removeChild(size_t index);
|
||||
|
||||
void cloneChildrenIfNeeded();
|
||||
void cloneContentsChildrenIfNeeded();
|
||||
void markDirtyAndPropagate();
|
||||
float resolveFlexGrow() const;
|
||||
float resolveFlexShrink() const;
|
||||
|
Reference in New Issue
Block a user