Compare commits

...

34 Commits
1.4.1 ... 1.5.0

Author SHA1 Message Date
Pieter De Baets
2c91e1e7d2 Mark ByteBuffer methods as const
Summary: So I can use them from JSBigString whose methods are marked const.

Reviewed By: emilsjolander

Differential Revision: D5020648

fbshipit-source-id: 6e60b80cb3d4718bab25dd6ca9627aee862117db
2017-05-10 04:26:22 -07:00
Pascal Hartig
c3982b6c1e Set up for automatic snapshot publishing
Summary:
Gets all the pieces in place to automatically publish snapshot artifacts after
successful travis build.

I'll test the actual publishing in a separate branch and then flip the switch in
a separate diff when it's ready.

Reviewed By: emilsjolander

Differential Revision: D5028239

fbshipit-source-id: c57d02a1dee41c84001bd17821b050c8c9aa4134
2017-05-09 08:52:36 -07:00
Pascal Hartig
ae33c6c19c Update Maven release scripts
Summary:
Reuse the gradle setup we've built for Litho which allows for parallel publishing to Bintray and Maven Central in addition to Sonatype Snapshots.

This appears not to break the existing jcenter deploy script which is pretty great.

Reviewed By: emilsjolander

Differential Revision: D5020576

fbshipit-source-id: 3ef163ccbfe91c6858b051d39dcf237ca388e18d
2017-05-09 03:41:51 -07:00
Pascal Hartig
bcd68b997f Add missing fbjni deps
Summary:
fbjni was previously dependency-free but now requires some annotations and
soloader. This unbreaks the gradle build.

Reviewed By: emilsjolander

Differential Revision: D5020069

fbshipit-source-id: b8bde83ce6a70b06e04491f1d70c2a6b568bc99c
2017-05-09 01:56:44 -07:00
Emil Sjolander
fcfa1b9f01 Update pod lock
Summary: run pod install

Reviewed By: gkassabli

Differential Revision: D5019525

fbshipit-source-id: 9cf5d22d8542560e377ab5c3be80ba3ea7ec3de2
2017-05-08 04:48:49 -07:00
Emil Sjolander
d9a0822517 Update formula location for android-sdk
Summary: follow brews instructions on changed location of android sdk

Reviewed By: passy

Differential Revision: D5010781

fbshipit-source-id: 8c39116c821befadb8a153870f365cd0d3a1140d
2017-05-05 10:16:08 -07:00
Emil Sjolander
097e99b699 Always use latest buck
Summary: Always use latest buck

Reviewed By: aiked

Differential Revision: D5010762

fbshipit-source-id: d0c7d36665fab0c58ea5e05d9880b849b3ccf745
2017-05-05 09:19:22 -07:00
Kazuki Sakamoto
ff7bec703b Fix build and test
Summary: Closes https://github.com/facebook/yoga/pull/543

Reviewed By: emilsjolander

Differential Revision: D4997389

Pulled By: splhack

fbshipit-source-id: b4b3aa4cba29063df93fd2a57f96031a8fa393de
2017-05-04 09:19:40 -07:00
Maël Nison
c7ab004922 Fixes Travis error reporting
Summary:
Just cherry-picked my commit from #508
Closes https://github.com/facebook/yoga/pull/542

Differential Revision: D5002335

Pulled By: emilsjolander

fbshipit-source-id: 3f61a235c41627e9cfb90dce150323f11892e65f
2017-05-04 07:45:28 -07:00
Lukas Wöhrl
91230ae177 Move YGLogger into YGConfig and associate YGNodeRef with log events
Summary:
Moves the `YGLogger` into `YGConfig` and pass the `YGNodeRef` into the logger to be able to associate the log messages and assertions with the specific node.

Tackles facebook/yoga#530 and facebook/yoga#446
Closes https://github.com/facebook/yoga/pull/531

Reviewed By: astreet

Differential Revision: D4970149

Pulled By: emilsjolander

fbshipit-source-id: b7fcdaa273143ea2fa35861620b2e4d79f04f0af
2017-05-03 09:30:25 -07:00
Aurimas
40eba60cf5 Move from ActionBarActivity to AppCompatActivity
Summary:
ActionBarActivity has been deprecated for 2+ years now.
Closes https://github.com/facebook/yoga/pull/538

Differential Revision: D4985973

Pulled By: emilsjolander

fbshipit-source-id: 09f2a8a12943c9b3ccdaee9cac684276b42ff843
2017-05-02 09:27:18 -07:00
Aurimas
fb4cfed20d Move from ActionBarActivity to AppCompatActivity
Summary:
ActionBarActivity has been deprecated for 2+ years now.
Closes https://github.com/facebook/yoga/pull/539

Differential Revision: D4985970

Pulled By: emilsjolander

fbshipit-source-id: 2e2fcc5188c08ef1cd78f7e1be71917f0395ff2c
2017-05-02 09:27:18 -07:00
Emil Sjolander
d3a9a84ac4 use java_library instead of android_library
Summary: fbjni doesn't have android deps anyways.

Reviewed By: passy

Differential Revision: D4985285

fbshipit-source-id: 95a5942d89210568b74caa9f3c976a8ae6e9601c
2017-05-02 04:17:14 -07:00
cregnier
accad5366f fixes #535 - changes unneeded js require expression to a static strin…
Summary:
fixes #535 - changes unneeded js require expression to a static string to clean up webpack warnings
Closes https://github.com/facebook/yoga/pull/536

Differential Revision: D4977993

Pulled By: emilsjolander

fbshipit-source-id: 92fe3a278391f37e44ac816d662885df6b4ea11f
2017-05-01 05:21:32 -07:00
Emil Sjolander
8eca67e257 Fix useLegacyStretchBehaviour flag by simplifying its usage
Summary: See blame revision. we are still passing all the added tests from that pull request but with much simpler logic.

Reviewed By: gkassabli

Differential Revision: D4977923

fbshipit-source-id: cb488e63c7c2e15e4c0f0133a16df36580c646fd
2017-05-01 04:32:40 -07:00
Emil Sjolander
40e1bf6ce3 Treat measured nodes size as a minimun contraint when rounding
Summary: We need to treat measurements from nodes with measure functions as minimum values as to not truncate text.

Reviewed By: shergin

Differential Revision: D4972290

fbshipit-source-id: 0a7bcc7f47b3e5acb8745da5286abcb9c4e44a38
2017-04-30 03:11:58 -07:00
David Hart
7b89a1dd48 Implemented percentage values in YogaKit
Summary:
We still need to wait for the `YGUnitPoint` PR to be merged :) But please let me know what you think. One caveat: because of a limitation of Swift, a literal value can be automatically understood as a point-based `YGValue`, but variables have to be explicitly cast. I haven't found a way around it yet:

```
view.yoga.width = 10 // value == 10, unit == YGUnitPixel

let a: CGFloat = 100
view.yoga.height = a // Compiler error
view.yoga.height = YGValue(a) // works, not great
```
Closes https://github.com/facebook/yoga/pull/390

Reviewed By: emilsjolander

Differential Revision: D4954021

Pulled By: maxoll

fbshipit-source-id: 5eff6aeb6dd969d0d5dc557b149bb5819b0e31de
2017-04-28 10:51:31 -07:00
Lukas Wöhrl
203577724e Fix sizing of non strech items
Summary:
Fixes the sizing of items so that under most scenarios it calcultes its height by it's content for non exact measurings. This introduces a new useLegacyStretchBehaviour flag on the config to opt out of this change as it is breaking.

See facebook/yoga#505
Closes https://github.com/facebook/yoga/pull/506

Reviewed By: astreet

Differential Revision: D4954016

Pulled By: emilsjolander

fbshipit-source-id: d28bd5d174cd76951fb94df85e3b0cfab7f81ff7
2017-04-28 06:27:14 -07:00
Emil Sjolander
e3dbef7cbd Revert D4957570: [yoga] Consolidate measure cache for layout nodes and leaf nodes
Summary: This reverts commit 5c5f39b67bd3f72d92b939ecee2d9a46c80b583f

Differential Revision: D4957570

fbshipit-source-id: 4d30de37c6911aac2dc1243a54914515aabfb229
2017-04-28 04:19:33 -07:00
Ivan Persidskiy
0ee3303791 Configure YogaKit with main screen scale factor
Summary:
Hi! After merging 3db38f2a80 the rounding algorithm become broken in YogaKit because it doesn't configure scale factor.
Closes https://github.com/facebook/yoga/pull/534

Differential Revision: D4969481

Pulled By: emilsjolander

fbshipit-source-id: 57ea42a3b1f37007b2392cda724d509e0b28c4cb
2017-04-28 03:12:12 -07:00
Emil Sjolander
83fddd8af6 Expose print function to java
Summary: Allow printing a node from java

Reviewed By: astreet

Differential Revision: D4962456

fbshipit-source-id: 8f62ed6724490e621fbc11573b2a9b25c56e51f1
2017-04-27 16:28:34 -07:00
Emil Sjolander
77c05b5ff6 Consolidate measure cache for layout nodes and leaf nodes
Summary: Re-use advanced changing logic of leaf nodes in layout nodes. //benchmark:benchmark nested flex test shows a ~15% improvement in layout performance!

Reviewed By: astreet

Differential Revision: D4957570

fbshipit-source-id: 5c5f39b67bd3f72d92b939ecee2d9a46c80b583f
2017-04-27 13:11:50 -07:00
Kazuki Sakamoto
7c324f058c Fix C# MeasureFunc test
Summary: Closes https://github.com/facebook/yoga/pull/533

Reviewed By: emilsjolander

Differential Revision: D4962771

Pulled By: splhack

fbshipit-source-id: 96919da73f0f35c027097259fa189b5658fb11b7
2017-04-27 09:30:20 -07:00
Emil Sjolander
3db38f2a80 Remove rounding from experimental features
Summary: Rounding has been successfully adopted by multiple products and frameworks. Time to move it out of experimental mode. Rounding can still be turned of by setting the point scale factor to 0 on the config.

Reviewed By: gkassabli

Differential Revision: D4953838

fbshipit-source-id: 3ee5f27d92f95b3ed4a01c98bc35e9157f2e91c5
2017-04-27 07:14:29 -07:00
Lukas Wöhrl
f6b17183c5 Let measure behave more like on the web
Summary:
Nodes with a measure function needs to be measured even so it seems there is no available space. So it behaves more like on the web. Fix facebook/yoga#488
Closes https://github.com/facebook/yoga/pull/499

Reviewed By: astreet

Differential Revision: D4954008

Pulled By: emilsjolander

fbshipit-source-id: 5b6d9afae0cdebe33f8b82b67620b3b4527d1efc
2017-04-27 07:14:29 -07:00
Emil Sjolander
8f9d7e243e Expose setPointScaleFactor to java
Summary: Expose setPointScaleFactor to java

Reviewed By: gkassabli

Differential Revision: D4953835

fbshipit-source-id: b1f97d9ec1bb78ccf7f53131fce87955fe66eb02
2017-04-26 12:35:00 -07:00
Cheng Zhao
fde4db9383 Add YGConfigCopy
Summary: Closes https://github.com/facebook/yoga/pull/525

Differential Revision: D4953723

Pulled By: emilsjolander

fbshipit-source-id: 1c54f40dfae5054822a440edf9d0aafb22a465d9
2017-04-26 11:57:01 -07:00
Lukas Wöhrl
3178e3bf15 Fix flex-wrap with max constraint
Summary:
Fixes `flex-wrap` with a max constraint and `justify-content`. Fixes facebook/yoga#514.
Closes https://github.com/facebook/yoga/pull/519

Differential Revision: D4953727

Pulled By: emilsjolander

fbshipit-source-id: 32dec48220be1392ea8dac5f34871d407eb8d49b
2017-04-26 11:46:23 -07:00
ChengWei
cdfd05c742 Fix the parameter error
Summary: Closes https://github.com/facebook/yoga/pull/528

Differential Revision: D4953974

Pulled By: emilsjolander

fbshipit-source-id: eda4770d4eb6cf52304d40a1b7ac17c2f0e17148
2017-04-26 11:27:52 -07:00
Emil Sjolander
76f6a54327 Update fbjni
Summary: Update yoga's copy of fbjni to include some missing java files.

Reviewed By: IanChilds

Differential Revision: D4953841

fbshipit-source-id: 74d5c617a6fcd11e82c86f03e61448b14a34b86b
2017-04-26 07:42:40 -07:00
Robert Spencer
c91e4b3566 Correct android attribute link in docs
Summary:
Addresses issue #523
Closes https://github.com/facebook/yoga/pull/529

Differential Revision: D4953973

Pulled By: emilsjolander

fbshipit-source-id: b6e64f30ad615ba65152f19e775bd6c890e6c6b6
2017-04-26 06:27:17 -07:00
Robert Spencer
e24561bcef Update Android XML attribute names in docs
Summary:
Fixes #507 .  The attribute name format got changed and the docs were left behind.
Closes https://github.com/facebook/yoga/pull/510

Differential Revision: D4953733

Pulled By: emilsjolander

fbshipit-source-id: 6eb02d6745d08fdd8cce669c691794351bd6fbc7
2017-04-26 03:12:51 -07:00
Uldéric KIBONGUI
363e941867 Fixed doc mismatch with the implementation
Summary: Closes https://github.com/facebook/yoga/pull/518

Differential Revision: D4953729

Pulled By: emilsjolander

fbshipit-source-id: 6693a0e44e8f12f07af5c3fe7c0475f8553a1df2
2017-04-26 03:12:51 -07:00
Ivan Persidskiy
3fb2c1888c Downgrade deployment target to ios 7
Summary:
Hey there, lets downgrade deployment target of YogaKit pod to iOS7. This days there is a lot of apps that still have support of ios7 (and  i'm working on one of them :)). And I didnt't find any reason why it couldn't be done.

Thanks
Closes https://github.com/facebook/yoga/pull/524

Differential Revision: D4953726

Pulled By: emilsjolander

fbshipit-source-id: 9e17a40caaa0a3ae26779c0d08acb59f71df2b23
2017-04-26 03:12:51 -07:00
111 changed files with 3603 additions and 1218 deletions

View File

@@ -19,9 +19,9 @@ env:
- TARGET=android - TARGET=android
before_install: before_install:
- openssl aes-256-cbc -K $encrypted_d27e803291ff_key -iv $encrypted_d27e803291ff_iv -in scripts/setup-keys.enc -d >> gradle.properties
- brew update > /dev/null - brew update > /dev/null
- brew tap facebook/fb - brew install --HEAD facebook/fb/buck
- brew install buck
# Java # Java
- | - |
@@ -53,8 +53,8 @@ before_install:
if [[ $TARGET = "js" ]]; then if [[ $TARGET = "js" ]]; then
wget -O /tmp/emsdk-portable.tar.gz https://s3.amazonaws.com/mozilla-games/emscripten/releases/emsdk-portable.tar.gz && wget -O /tmp/emsdk-portable.tar.gz https://s3.amazonaws.com/mozilla-games/emscripten/releases/emsdk-portable.tar.gz &&
tar xf /tmp/emsdk-portable.tar.gz -C /tmp/ && tar xf /tmp/emsdk-portable.tar.gz -C /tmp/ &&
/tmp/emsdk_portable/emsdk install latest >& /dev/null && /tmp/emsdk-portable/emsdk install latest 2>&1 | grep -v '^x ' &&
/tmp/emsdk_portable/emsdk activate latest /tmp/emsdk-portable/emsdk activate latest
fi fi
# Android # Android
@@ -63,7 +63,7 @@ before_install:
brew cask install java; brew cask install java;
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8); export JAVA_HOME=$(/usr/libexec/java_home -v 1.8);
export PATH=$JAVA_HOME/bin:$PATH; export PATH=$JAVA_HOME/bin:$PATH;
brew install android-sdk; brew install caskroom/cask/android-sdk;
export ANDROID_SDK=/usr/local/Cellar/android-sdk/24.4.1_1; export ANDROID_SDK=/usr/local/Cellar/android-sdk/24.4.1_1;
export ANDROID_HOME=/usr/local/Cellar/android-sdk/24.4.1_1; export ANDROID_HOME=/usr/local/Cellar/android-sdk/24.4.1_1;
brew install lib32stdc++6 lib32z1; brew install lib32stdc++6 lib32z1;
@@ -77,7 +77,7 @@ before_install:
cd javascript && cd javascript &&
npm install && npm install &&
unset CC && unset CXX && unset LINK && unset CC && unset CXX && unset LINK &&
source /tmp/emsdk_portable/emsdk_env.sh && source /tmp/emsdk-portable/emsdk_env.sh &&
npm run build:browser npm run build:browser
) fi ) fi

View File

@@ -9,6 +9,7 @@ SOLOADER_TARGET = '//lib/soloader:soloader'
GTEST_TARGET = '//lib/gtest:gtest' GTEST_TARGET = '//lib/gtest:gtest'
JNI_TARGET = '//lib/jni:jni' JNI_TARGET = '//lib/jni:jni'
FBJNI_TARGET = '//lib/fb:fbjni' FBJNI_TARGET = '//lib/fb:fbjni'
FBJNI_JAVA_TARGET = '//lib/fb/src/main/java/com/facebook/jni:jni'
APPCOMPAT_TARGET = '//lib/appcompat:appcompat' APPCOMPAT_TARGET = '//lib/appcompat:appcompat'
ANDROID_SUPPORT_TARGET = '//lib/android-support:android-support' ANDROID_SUPPORT_TARGET = '//lib/android-support:android-support'
ANDROID_TARGET = '//android:android' ANDROID_TARGET = '//android:android'

View File

@@ -15,11 +15,11 @@ podspec = Pod::Spec.new do |spec|
} }
spec.platform = :ios spec.platform = :ios
spec.ios.deployment_target = '8.0' spec.ios.deployment_target = '7.0'
spec.ios.frameworks = 'UIKit' spec.ios.frameworks = 'UIKit'
spec.dependency 'Yoga', '~> 1.3' spec.dependency 'Yoga', '~> 1.3'
spec.source_files = 'YogaKit/Source/*.{h,m}' spec.source_files = 'YogaKit/Source/*.{h,m,swift}'
spec.public_header_files = 'YogaKit/Source/{YGLayout,UIView+Yoga}.h' spec.public_header_files = 'YogaKit/Source/{YGLayout,UIView+Yoga}.h'
spec.private_header_files = 'YogaKit/Source/YGLayout+Private.h' spec.private_header_files = 'YogaKit/Source/YGLayout+Private.h'
end end

View File

@@ -9,6 +9,12 @@
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import <yoga/YGEnums.h> #import <yoga/YGEnums.h>
#import <yoga/Yoga.h>
extern YGValue YGPointValue(CGFloat value)
NS_SWIFT_UNAVAILABLE("Use the swift Int and FloatingPoint extensions instead");
extern YGValue YGPercentValue(CGFloat value)
NS_SWIFT_UNAVAILABLE("Use the swift Int and FloatingPoint extensions instead");
typedef NS_OPTIONS(NSInteger, YGDimensionFlexibility) { typedef NS_OPTIONS(NSInteger, YGDimensionFlexibility) {
YGDimensionFlexibilityFlexibleWidth = 1 << 0, YGDimensionFlexibilityFlexibleWidth = 1 << 0,
@@ -41,34 +47,34 @@ typedef NS_OPTIONS(NSInteger, YGDimensionFlexibility) {
@property (nonatomic, readwrite, assign) CGFloat flexGrow; @property (nonatomic, readwrite, assign) CGFloat flexGrow;
@property (nonatomic, readwrite, assign) CGFloat flexShrink; @property (nonatomic, readwrite, assign) CGFloat flexShrink;
@property (nonatomic, readwrite, assign) CGFloat flexBasis; @property (nonatomic, readwrite, assign) YGValue flexBasis;
@property (nonatomic, readwrite, assign) CGFloat left; @property (nonatomic, readwrite, assign) YGValue left;
@property (nonatomic, readwrite, assign) CGFloat top; @property (nonatomic, readwrite, assign) YGValue top;
@property (nonatomic, readwrite, assign) CGFloat right; @property (nonatomic, readwrite, assign) YGValue right;
@property (nonatomic, readwrite, assign) CGFloat bottom; @property (nonatomic, readwrite, assign) YGValue bottom;
@property (nonatomic, readwrite, assign) CGFloat start; @property (nonatomic, readwrite, assign) YGValue start;
@property (nonatomic, readwrite, assign) CGFloat end; @property (nonatomic, readwrite, assign) YGValue end;
@property (nonatomic, readwrite, assign) CGFloat marginLeft; @property (nonatomic, readwrite, assign) YGValue marginLeft;
@property (nonatomic, readwrite, assign) CGFloat marginTop; @property (nonatomic, readwrite, assign) YGValue marginTop;
@property (nonatomic, readwrite, assign) CGFloat marginRight; @property (nonatomic, readwrite, assign) YGValue marginRight;
@property (nonatomic, readwrite, assign) CGFloat marginBottom; @property (nonatomic, readwrite, assign) YGValue marginBottom;
@property (nonatomic, readwrite, assign) CGFloat marginStart; @property (nonatomic, readwrite, assign) YGValue marginStart;
@property (nonatomic, readwrite, assign) CGFloat marginEnd; @property (nonatomic, readwrite, assign) YGValue marginEnd;
@property (nonatomic, readwrite, assign) CGFloat marginHorizontal; @property (nonatomic, readwrite, assign) YGValue marginHorizontal;
@property (nonatomic, readwrite, assign) CGFloat marginVertical; @property (nonatomic, readwrite, assign) YGValue marginVertical;
@property (nonatomic, readwrite, assign) CGFloat margin; @property (nonatomic, readwrite, assign) YGValue margin;
@property (nonatomic, readwrite, assign) CGFloat paddingLeft; @property (nonatomic, readwrite, assign) YGValue paddingLeft;
@property (nonatomic, readwrite, assign) CGFloat paddingTop; @property (nonatomic, readwrite, assign) YGValue paddingTop;
@property (nonatomic, readwrite, assign) CGFloat paddingRight; @property (nonatomic, readwrite, assign) YGValue paddingRight;
@property (nonatomic, readwrite, assign) CGFloat paddingBottom; @property (nonatomic, readwrite, assign) YGValue paddingBottom;
@property (nonatomic, readwrite, assign) CGFloat paddingStart; @property (nonatomic, readwrite, assign) YGValue paddingStart;
@property (nonatomic, readwrite, assign) CGFloat paddingEnd; @property (nonatomic, readwrite, assign) YGValue paddingEnd;
@property (nonatomic, readwrite, assign) CGFloat paddingHorizontal; @property (nonatomic, readwrite, assign) YGValue paddingHorizontal;
@property (nonatomic, readwrite, assign) CGFloat paddingVertical; @property (nonatomic, readwrite, assign) YGValue paddingVertical;
@property (nonatomic, readwrite, assign) CGFloat padding; @property (nonatomic, readwrite, assign) YGValue padding;
@property (nonatomic, readwrite, assign) CGFloat borderLeftWidth; @property (nonatomic, readwrite, assign) CGFloat borderLeftWidth;
@property (nonatomic, readwrite, assign) CGFloat borderTopWidth; @property (nonatomic, readwrite, assign) CGFloat borderTopWidth;
@@ -78,12 +84,12 @@ typedef NS_OPTIONS(NSInteger, YGDimensionFlexibility) {
@property (nonatomic, readwrite, assign) CGFloat borderEndWidth; @property (nonatomic, readwrite, assign) CGFloat borderEndWidth;
@property (nonatomic, readwrite, assign) CGFloat borderWidth; @property (nonatomic, readwrite, assign) CGFloat borderWidth;
@property (nonatomic, readwrite, assign) CGFloat width; @property (nonatomic, readwrite, assign) YGValue width;
@property (nonatomic, readwrite, assign) CGFloat height; @property (nonatomic, readwrite, assign) YGValue height;
@property (nonatomic, readwrite, assign) CGFloat minWidth; @property (nonatomic, readwrite, assign) YGValue minWidth;
@property (nonatomic, readwrite, assign) CGFloat minHeight; @property (nonatomic, readwrite, assign) YGValue minHeight;
@property (nonatomic, readwrite, assign) CGFloat maxWidth; @property (nonatomic, readwrite, assign) YGValue maxWidth;
@property (nonatomic, readwrite, assign) CGFloat maxHeight; @property (nonatomic, readwrite, assign) YGValue maxHeight;
// Yoga specific properties, not compatible with flexbox specification // Yoga specific properties, not compatible with flexbox specification
@property (nonatomic, readwrite, assign) CGFloat aspectRatio; @property (nonatomic, readwrite, assign) CGFloat aspectRatio;
@@ -104,7 +110,8 @@ typedef NS_OPTIONS(NSInteger, YGDimensionFlexibility) {
Perform a layout calculation and update the frames of the views in the hierarchy with the results. Perform a layout calculation and update the frames of the views in the hierarchy with the results.
If the origin is not preserved, the root view's layout results will applied from {0,0}. If the origin is not preserved, the root view's layout results will applied from {0,0}.
*/ */
- (void)applyLayoutPreservingOrigin:(BOOL)preserveOrigin dimensionFlexibility:(YGDimensionFlexibility)dimensionFlexibility - (void)applyLayoutPreservingOrigin:(BOOL)preserveOrigin
dimensionFlexibility:(YGDimensionFlexibility)dimensionFlexibility
NS_SWIFT_NAME(applyLayout(preservingOrigin:dimensionFlexibility:)); NS_SWIFT_NAME(applyLayout(preservingOrigin:dimensionFlexibility:));
/** /**

View File

@@ -22,23 +22,27 @@
} }
#define YG_VALUE_PROPERTY(lowercased_name, capitalized_name) \ #define YG_VALUE_PROPERTY(lowercased_name, capitalized_name) \
- (CGFloat)lowercased_name \ - (YGValue)lowercased_name \
{ \ { \
YGValue value = YGNodeStyleGet##capitalized_name(self.node); \ return YGNodeStyleGet##capitalized_name(self.node); \
if (value.unit == YGUnitPoint) { \
return value.value; \
} else { \
return YGUndefined; \
} \
} \ } \
\ \
- (void)set##capitalized_name:(CGFloat)lowercased_name \ - (void)set##capitalized_name:(YGValue)lowercased_name \
{ \ { \
YGNodeStyleSet##capitalized_name(self.node, lowercased_name); \ switch (lowercased_name.unit) { \
case YGUnitPoint: \
YGNodeStyleSet##capitalized_name(self.node, lowercased_name.value); \
break; \
case YGUnitPercent: \
YGNodeStyleSet##capitalized_name##Percent(self.node, lowercased_name.value); \
break; \
default: \
NSAssert(NO, @"Not implemented"); \
} \
} }
#define YG_EDGE_PROPERTY_GETTER(lowercased_name, capitalized_name, property, edge) \ #define YG_EDGE_PROPERTY_GETTER(type, lowercased_name, capitalized_name, property, edge) \
- (CGFloat)lowercased_name \ - (type)lowercased_name \
{ \ { \
return YGNodeStyleGet##property(self.node, edge); \ return YGNodeStyleGet##property(self.node, edge); \
} }
@@ -50,28 +54,26 @@
} }
#define YG_EDGE_PROPERTY(lowercased_name, capitalized_name, property, edge) \ #define YG_EDGE_PROPERTY(lowercased_name, capitalized_name, property, edge) \
YG_EDGE_PROPERTY_GETTER(lowercased_name, capitalized_name, property, edge) \ YG_EDGE_PROPERTY_GETTER(CGFloat, lowercased_name, capitalized_name, property, edge) \
YG_EDGE_PROPERTY_SETTER(lowercased_name, capitalized_name, property, edge) YG_EDGE_PROPERTY_SETTER(lowercased_name, capitalized_name, property, edge)
#define YG_VALUE_EDGE_PROPERTY_GETTER(objc_lowercased_name, objc_capitalized_name, c_name, edge) \ #define YG_VALUE_EDGE_PROPERTY_SETTER(objc_lowercased_name, objc_capitalized_name, c_name, edge) \
- (CGFloat)objc_lowercased_name \ - (void)set##objc_capitalized_name:(YGValue)objc_lowercased_name \
{ \ { \
YGValue value = YGNodeStyleGet##c_name(self.node, edge); \ switch (objc_lowercased_name.unit) { \
if (value.unit == YGUnitPoint) { \ case YGUnitPoint: \
return value.value; \ YGNodeStyleSet##c_name(self.node, edge, objc_lowercased_name.value); \
} else { \ break; \
return YGUndefined; \ case YGUnitPercent: \
YGNodeStyleSet##c_name##Percent(self.node, edge, objc_lowercased_name.value); \
break; \
default: \
NSAssert(NO, @"Not implemented"); \
} \ } \
} }
#define YG_VALUE_EDGE_PROPERTY_SETTER(objc_lowercased_name, objc_capitalized_name, c_name, edge) \
- (void)set##objc_capitalized_name:(CGFloat)objc_lowercased_name \
{ \
YGNodeStyleSet##c_name(self.node, edge, objc_lowercased_name); \
}
#define YG_VALUE_EDGE_PROPERTY(lowercased_name, capitalized_name, property, edge) \ #define YG_VALUE_EDGE_PROPERTY(lowercased_name, capitalized_name, property, edge) \
YG_VALUE_EDGE_PROPERTY_GETTER(lowercased_name, capitalized_name, property, edge) \ YG_EDGE_PROPERTY_GETTER(YGValue, lowercased_name, capitalized_name, property, edge) \
YG_VALUE_EDGE_PROPERTY_SETTER(lowercased_name, capitalized_name, property, edge) YG_VALUE_EDGE_PROPERTY_SETTER(lowercased_name, capitalized_name, property, edge)
#define YG_VALUE_EDGES_PROPERTIES(lowercased_name, capitalized_name) \ #define YG_VALUE_EDGES_PROPERTIES(lowercased_name, capitalized_name) \
@@ -85,6 +87,16 @@ YG_VALUE_EDGE_PROPERTY(lowercased_name##Horizontal, capitalized_name##Horizontal
YG_VALUE_EDGE_PROPERTY(lowercased_name##Vertical, capitalized_name##Vertical, capitalized_name, YGEdgeVertical) \ YG_VALUE_EDGE_PROPERTY(lowercased_name##Vertical, capitalized_name##Vertical, capitalized_name, YGEdgeVertical) \
YG_VALUE_EDGE_PROPERTY(lowercased_name, capitalized_name, capitalized_name, YGEdgeAll) YG_VALUE_EDGE_PROPERTY(lowercased_name, capitalized_name, capitalized_name, YGEdgeAll)
YGValue YGPointValue(CGFloat value)
{
return (YGValue) { .value = value, .unit = YGUnitPoint };
}
YGValue YGPercentValue(CGFloat value)
{
return (YGValue) { .value = value, .unit = YGUnitPercent };
}
static YGConfigRef globalConfig; static YGConfigRef globalConfig;
@interface YGLayout () @interface YGLayout ()
@@ -103,6 +115,7 @@ static YGConfigRef globalConfig;
{ {
globalConfig = YGConfigNew(); globalConfig = YGConfigNew();
YGConfigSetExperimentalFeatureEnabled(globalConfig, YGExperimentalFeatureWebFlexBasis, true); YGConfigSetExperimentalFeatureEnabled(globalConfig, YGExperimentalFeatureWebFlexBasis, true);
YGConfigSetPointScaleFactor(globalConfig, [UIScreen mainScreen].scale);
} }
- (instancetype)initWithView:(UIView*)view - (instancetype)initWithView:(UIView*)view
@@ -245,7 +258,7 @@ YG_PROPERTY(CGFloat, aspectRatio, AspectRatio)
size.height = YGUndefined; size.height = YGUndefined;
} }
[self calculateLayoutWithSize:size]; [self calculateLayoutWithSize:size];
YGApplyLayoutToViewHierarchy(self.view, NO); YGApplyLayoutToViewHierarchy(self.view, preserveOrigin);
} }

View File

@@ -0,0 +1,46 @@
/**
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
postfix operator %
extension Int {
public static postfix func %(value: Int) -> YGValue {
return YGValue(value: Float(value), unit: .percent)
}
}
extension Float {
public static postfix func %(value: Float) -> YGValue {
return YGValue(value: value, unit: .percent)
}
}
extension CGFloat {
public static postfix func %(value: CGFloat) -> YGValue {
return YGValue(value: Float(value), unit: .percent)
}
}
extension YGValue : ExpressibleByIntegerLiteral, ExpressibleByFloatLiteral {
public init(integerLiteral value: Int) {
self = YGValue(value: Float(value), unit: .point)
}
public init(floatLiteral value: Float) {
self = YGValue(value: value, unit: .point)
}
public init(_ value: Float) {
self = YGValue(value: value, unit: .point)
}
public init(_ value: CGFloat) {
self = YGValue(value: Float(value), unit: .point)
}
}

View File

@@ -31,11 +31,11 @@
[view configureLayoutWithBlock:^(YGLayout *layout){ [view configureLayoutWithBlock:^(YGLayout *layout){
XCTAssertNotNil(layout); XCTAssertNotNil(layout);
layout.isEnabled = YES; layout.isEnabled = YES;
layout.width = 25; layout.width = YGPointValue(25);
}]; }];
XCTAssertTrue(view.yoga.isEnabled); XCTAssertTrue(view.yoga.isEnabled);
XCTAssertEqual(view.yoga.width, 25); XCTAssertEqual(view.yoga.width.value, 25);
} }
- (void)testNodesAreDeallocedWithSingleView - (void)testNodesAreDeallocedWithSingleView
@@ -44,7 +44,7 @@
@autoreleasepool { @autoreleasepool {
UIView *view = [[UIView alloc] initWithFrame:CGRectZero]; UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
view.yoga.flexBasis = 1; view.yoga.flexBasis = YGPointValue(1);
layoutRef = view.yoga; layoutRef = view.yoga;
XCTAssertNotNil(layoutRef); XCTAssertNotNil(layoutRef);
@@ -63,11 +63,11 @@
@autoreleasepool { @autoreleasepool {
UIView *view = [[UIView alloc] initWithFrame:CGRectZero]; UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
topLayout = view.yoga; topLayout = view.yoga;
topLayout.flexBasis = 1; topLayout.flexBasis = YGPointValue(1);
UIView *subview = [[UIView alloc] initWithFrame:CGRectZero]; UIView *subview = [[UIView alloc] initWithFrame:CGRectZero];
subviewLayout = subview.yoga; subviewLayout = subview.yoga;
subviewLayout.flexBasis = 1; subviewLayout.flexBasis = YGPointValue(1);
view = nil; view = nil;
} }
@@ -113,9 +113,9 @@
UIView *textBadgeView = [[UIView alloc] initWithFrame:CGRectZero]; UIView *textBadgeView = [[UIView alloc] initWithFrame:CGRectZero];
textBadgeView.yoga.isEnabled = YES; textBadgeView.yoga.isEnabled = YES;
textBadgeView.yoga.margin = 0; textBadgeView.yoga.margin = YGPointValue(0);
textBadgeView.yoga.width = 10; textBadgeView.yoga.width = YGPointValue(10);
textBadgeView.yoga.height = 10; textBadgeView.yoga.height = YGPointValue(10);
[container addSubview:textBadgeView]; [container addSubview:textBadgeView];
const CGSize textBadgeViewSize = textBadgeView.yoga.intrinsicSize; const CGSize textBadgeViewSize = textBadgeView.yoga.intrinsicSize;
@@ -136,14 +136,14 @@
UIView *view = [[UIView alloc] initWithFrame:CGRectZero]; UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
view.yoga.isEnabled = YES; view.yoga.isEnabled = YES;
view.yoga.flexBasis = 0; view.yoga.flexBasis = YGPointValue(0);
view.yoga.flexGrow = 1; view.yoga.flexGrow = 1;
[container addSubview:view]; [container addSubview:view];
UIView *view2 = [[UIView alloc] initWithFrame:CGRectZero]; UIView *view2 = [[UIView alloc] initWithFrame:CGRectZero];
view2.yoga.isEnabled = YES; view2.yoga.isEnabled = YES;
view2.yoga.marginTop = 25; view2.yoga.marginTop = YGPointValue(25);
view2.yoga.flexBasis = 0; view2.yoga.flexBasis = YGPointValue(0);
view2.yoga.flexGrow = 1; view2.yoga.flexGrow = 1;
[container addSubview:view2]; [container addSubview:view2];
@@ -161,8 +161,8 @@
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
view.yoga.isEnabled = YES; view.yoga.isEnabled = YES;
view.yoga.width = 100; view.yoga.width = YGPointValue(100);
view.yoga.height = 100; view.yoga.height = YGPointValue(100);
[container addSubview:view]; [container addSubview:view];
[container.yoga applyLayoutPreservingOrigin:YES dimensionFlexibility:YGDimensionFlexibilityFlexibleWidth]; [container.yoga applyLayoutPreservingOrigin:YES dimensionFlexibility:YGDimensionFlexibilityFlexibleWidth];
@@ -177,8 +177,8 @@
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
view.yoga.isEnabled = YES; view.yoga.isEnabled = YES;
view.yoga.width = 100; view.yoga.width = YGPointValue(100);
view.yoga.height = 100; view.yoga.height = YGPointValue(100);
[container addSubview:view]; [container addSubview:view];
[container.yoga applyLayoutPreservingOrigin:YES dimensionFlexibility:YGDimensionFlexibilityFlexibleHeigth]; [container.yoga applyLayoutPreservingOrigin:YES dimensionFlexibility:YGDimensionFlexibilityFlexibleHeigth];
@@ -193,8 +193,8 @@
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
view.yoga.isEnabled = YES; view.yoga.isEnabled = YES;
view.yoga.width = 100; view.yoga.width = YGPointValue(100);
view.yoga.height = 100; view.yoga.height = YGPointValue(100);
[container addSubview:view]; [container addSubview:view];
[container.yoga applyLayoutPreservingOrigin:YES dimensionFlexibility:YGDimensionFlexibilityFlexibleWidth | YGDimensionFlexibilityFlexibleHeigth]; [container.yoga applyLayoutPreservingOrigin:YES dimensionFlexibility:YGDimensionFlexibilityFlexibleWidth | YGDimensionFlexibilityFlexibleHeigth];
@@ -437,12 +437,12 @@
XCTAssertTrue(view.yoga.isLeaf); XCTAssertTrue(view.yoga.isLeaf);
view.yoga.isEnabled = YES; view.yoga.isEnabled = YES;
view.yoga.width = 50.0; view.yoga.width = YGPointValue(50);
XCTAssertTrue(view.yoga.isLeaf); XCTAssertTrue(view.yoga.isLeaf);
UIView *const subview = view.subviews[0]; UIView *const subview = view.subviews[0];
subview.yoga.isEnabled = YES; subview.yoga.isEnabled = YES;
subview.yoga.width = 50.0; subview.yoga.width = YGPointValue(50);
XCTAssertFalse(view.yoga.isLeaf); XCTAssertFalse(view.yoga.isLeaf);
} }
@@ -454,14 +454,14 @@
UIView *subview1 = [[UIView alloc] initWithFrame:CGRectZero]; UIView *subview1 = [[UIView alloc] initWithFrame:CGRectZero];
subview1.yoga.isEnabled = YES; subview1.yoga.isEnabled = YES;
subview1.yoga.width = 100; subview1.yoga.width = YGPointValue(100);
subview1.yoga.flexGrow = 1; subview1.yoga.flexGrow = 1;
subview1.yoga.flexDirection = YGFlexDirectionColumn; subview1.yoga.flexDirection = YGFlexDirectionColumn;
[container addSubview:subview1]; [container addSubview:subview1];
UIView *subview2 = [[UIView alloc] initWithFrame:CGRectZero]; UIView *subview2 = [[UIView alloc] initWithFrame:CGRectZero];
subview2.yoga.isEnabled = YES; subview2.yoga.isEnabled = YES;
subview2.yoga.width = 150; subview2.yoga.width = YGPointValue(150);
subview2.yoga.flexGrow = 1; subview2.yoga.flexGrow = 1;
subview2.yoga.flexDirection = YGFlexDirectionColumn; subview2.yoga.flexDirection = YGFlexDirectionColumn;
[container addSubview:subview2]; [container addSubview:subview2];
@@ -522,155 +522,195 @@
[container.yoga applyLayoutPreservingOrigin:YES]; [container.yoga applyLayoutPreservingOrigin:YES];
} }
- (void)testPointPercent
{
XCTAssertEqual(YGPointValue(1).value, 1);
XCTAssertEqual(YGPointValue(1).unit, YGUnitPoint);
XCTAssertEqual(YGPercentValue(2).value, 2);
XCTAssertEqual(YGPercentValue(2).unit, YGUnitPercent);
}
- (void)testPositionalPropertiesWork - (void)testPositionalPropertiesWork
{ {
UIView *view = [[UIView alloc] initWithFrame:CGRectZero]; UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
view.yoga.left = 1; view.yoga.left = YGPointValue(1);
XCTAssertEqual(YGNodeStyleGetPosition(view.yoga.node, YGEdgeLeft).value, 1); XCTAssertEqual(view.yoga.left.value, 1);
XCTAssertEqual(YGNodeStyleGetPosition(view.yoga.node, YGEdgeLeft).unit, YGUnitPoint); XCTAssertEqual(view.yoga.left.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.left, 1); view.yoga.left = YGPercentValue(2);
XCTAssertEqual(view.yoga.left.value, 2);
XCTAssertEqual(view.yoga.left.unit, YGUnitPercent);
view.yoga.right = 2; view.yoga.right = YGPointValue(3);
XCTAssertEqual(YGNodeStyleGetPosition(view.yoga.node, YGEdgeRight).value, 2); XCTAssertEqual(view.yoga.right.value, 3);
XCTAssertEqual(YGNodeStyleGetPosition(view.yoga.node, YGEdgeRight).unit, YGUnitPoint); XCTAssertEqual(view.yoga.right.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.right, 2); view.yoga.right = YGPercentValue(4);
XCTAssertEqual(view.yoga.right.value, 4);
XCTAssertEqual(view.yoga.right.unit, YGUnitPercent);
view.yoga.top = 3; view.yoga.top = YGPointValue(5);
XCTAssertEqual(YGNodeStyleGetPosition(view.yoga.node, YGEdgeTop).value, 3); XCTAssertEqual(view.yoga.top.value, 5);
XCTAssertEqual(YGNodeStyleGetPosition(view.yoga.node, YGEdgeTop).unit, YGUnitPoint); XCTAssertEqual(view.yoga.top.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.top, 3); view.yoga.top = YGPercentValue(6);
XCTAssertEqual(view.yoga.top.value, 6);
XCTAssertEqual(view.yoga.top.unit, YGUnitPercent);
view.yoga.bottom = 4; view.yoga.bottom = YGPointValue(7);
XCTAssertEqual(YGNodeStyleGetPosition(view.yoga.node, YGEdgeBottom).value, 4); XCTAssertEqual(view.yoga.bottom.value, 7);
XCTAssertEqual(YGNodeStyleGetPosition(view.yoga.node, YGEdgeBottom).unit, YGUnitPoint); XCTAssertEqual(view.yoga.bottom.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.bottom, 4); view.yoga.bottom = YGPercentValue(8);
XCTAssertEqual(view.yoga.bottom.value, 8);
XCTAssertEqual(view.yoga.bottom.unit, YGUnitPercent);
view.yoga.start = 5; view.yoga.start = YGPointValue(9);
XCTAssertEqual(YGNodeStyleGetPosition(view.yoga.node, YGEdgeStart).value, 5); XCTAssertEqual(view.yoga.start.value, 9);
XCTAssertEqual(YGNodeStyleGetPosition(view.yoga.node, YGEdgeStart).unit, YGUnitPoint); XCTAssertEqual(view.yoga.start.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.start, 5); view.yoga.start = YGPercentValue(10);
XCTAssertEqual(view.yoga.start.value, 10);
XCTAssertEqual(view.yoga.start.unit, YGUnitPercent);
view.yoga.end = 6; view.yoga.end = YGPointValue(11);
XCTAssertEqual(YGNodeStyleGetPosition(view.yoga.node, YGEdgeEnd).value, 6); XCTAssertEqual(view.yoga.end.value, 11);
XCTAssertEqual(YGNodeStyleGetPosition(view.yoga.node, YGEdgeEnd).unit, YGUnitPoint); XCTAssertEqual(view.yoga.end.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.end, 6); view.yoga.end = YGPercentValue(12);
XCTAssertEqual(view.yoga.end.value, 12);
XCTAssertEqual(view.yoga.end.unit, YGUnitPercent);
} }
- (void)testMarginPropertiesWork - (void)testMarginPropertiesWork
{ {
UIView *view = [[UIView alloc] initWithFrame:CGRectZero]; UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
view.yoga.margin = 1; view.yoga.margin = YGPointValue(1);
XCTAssertEqual(view.yoga.margin, 1); XCTAssertEqual(view.yoga.margin.value, 1);
XCTAssertTrue(isnan(view.yoga.marginLeft)); XCTAssertEqual(view.yoga.margin.unit, YGUnitPoint);
XCTAssertTrue(isnan(view.yoga.marginRight)); view.yoga.margin = YGPercentValue(2);
XCTAssertTrue(isnan(view.yoga.marginStart)); XCTAssertEqual(view.yoga.margin.value, 2);
XCTAssertTrue(isnan(view.yoga.marginEnd)); XCTAssertEqual(view.yoga.margin.unit, YGUnitPercent);
XCTAssertTrue(isnan(view.yoga.marginTop));
XCTAssertTrue(isnan(view.yoga.marginBottom));
XCTAssertTrue(isnan(view.yoga.marginHorizontal));
XCTAssertTrue(isnan(view.yoga.marginVertical));
view.yoga.marginHorizontal = 2; view.yoga.marginHorizontal = YGPointValue(3);
XCTAssertEqual(view.yoga.marginHorizontal, 2); XCTAssertEqual(view.yoga.marginHorizontal.value, 3);
XCTAssertTrue(isnan(view.yoga.marginLeft)); XCTAssertEqual(view.yoga.marginHorizontal.unit, YGUnitPoint);
XCTAssertTrue(isnan(view.yoga.marginRight)); view.yoga.marginHorizontal = YGPercentValue(4);
XCTAssertTrue(isnan(view.yoga.marginStart)); XCTAssertEqual(view.yoga.marginHorizontal.value, 4);
XCTAssertTrue(isnan(view.yoga.marginEnd)); XCTAssertEqual(view.yoga.marginHorizontal.unit, YGUnitPercent);
view.yoga.marginVertical = 3; view.yoga.marginVertical = YGPointValue(5);
XCTAssertEqual(view.yoga.marginVertical, 3); XCTAssertEqual(view.yoga.marginVertical.value, 5);
XCTAssertTrue(isnan(view.yoga.marginTop)); XCTAssertEqual(view.yoga.marginVertical.unit, YGUnitPoint);
XCTAssertTrue(isnan(view.yoga.marginBottom)); view.yoga.marginVertical = YGPercentValue(6);
XCTAssertEqual(view.yoga.marginVertical.value, 6);
XCTAssertEqual(view.yoga.marginVertical.unit, YGUnitPercent);
view.yoga.marginLeft = 4; view.yoga.marginLeft = YGPointValue(7);
XCTAssertEqual(YGNodeStyleGetMargin(view.yoga.node, YGEdgeLeft).value, 4); XCTAssertEqual(view.yoga.marginLeft.value, 7);
XCTAssertEqual(YGNodeStyleGetMargin(view.yoga.node, YGEdgeLeft).unit, YGUnitPoint); XCTAssertEqual(view.yoga.marginLeft.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.marginLeft, 4); view.yoga.marginLeft = YGPercentValue(8);
XCTAssertEqual(view.yoga.marginLeft.value, 8);
XCTAssertEqual(view.yoga.marginLeft.unit, YGUnitPercent);
view.yoga.marginRight = 5; view.yoga.marginRight = YGPointValue(9);
XCTAssertEqual(YGNodeStyleGetMargin(view.yoga.node, YGEdgeRight).value, 5); XCTAssertEqual(view.yoga.marginRight.value, 9);
XCTAssertEqual(YGNodeStyleGetMargin(view.yoga.node, YGEdgeRight).unit, YGUnitPoint); XCTAssertEqual(view.yoga.marginRight.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.marginRight, 5); view.yoga.marginRight = YGPercentValue(10);
XCTAssertEqual(view.yoga.marginRight.value, 10);
XCTAssertEqual(view.yoga.marginRight.unit, YGUnitPercent);
view.yoga.marginTop = 6; view.yoga.marginTop = YGPointValue(11);
XCTAssertEqual(YGNodeStyleGetMargin(view.yoga.node, YGEdgeTop).value, 6); XCTAssertEqual(view.yoga.marginTop.value, 11);
XCTAssertEqual(YGNodeStyleGetMargin(view.yoga.node, YGEdgeTop).unit, YGUnitPoint); XCTAssertEqual(view.yoga.marginTop.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.marginTop, 6); view.yoga.marginTop = YGPercentValue(12);
XCTAssertEqual(view.yoga.marginTop.value, 12);
XCTAssertEqual(view.yoga.marginTop.unit, YGUnitPercent);
view.yoga.marginBottom = 7; view.yoga.marginBottom = YGPointValue(13);
XCTAssertEqual(YGNodeStyleGetMargin(view.yoga.node, YGEdgeBottom).value, 7); XCTAssertEqual(view.yoga.marginBottom.value, 13);
XCTAssertEqual(YGNodeStyleGetMargin(view.yoga.node, YGEdgeBottom).unit, YGUnitPoint); XCTAssertEqual(view.yoga.marginBottom.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.marginBottom, 7); view.yoga.marginBottom = YGPercentValue(14);
XCTAssertEqual(view.yoga.marginBottom.value, 14);
XCTAssertEqual(view.yoga.marginBottom.unit, YGUnitPercent);
view.yoga.marginStart = 8; view.yoga.marginStart = YGPointValue(15);
XCTAssertEqual(YGNodeStyleGetMargin(view.yoga.node, YGEdgeStart).value, 8); XCTAssertEqual(view.yoga.marginStart.value, 15);
XCTAssertEqual(YGNodeStyleGetMargin(view.yoga.node, YGEdgeStart).unit, YGUnitPoint); XCTAssertEqual(view.yoga.marginStart.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.marginStart, 8); view.yoga.marginStart = YGPercentValue(16);
XCTAssertEqual(view.yoga.marginStart.value, 16);
XCTAssertEqual(view.yoga.marginStart.unit, YGUnitPercent);
view.yoga.marginEnd = 9; view.yoga.marginEnd = YGPointValue(17);
XCTAssertEqual(YGNodeStyleGetMargin(view.yoga.node, YGEdgeEnd).value, 9); XCTAssertEqual(view.yoga.marginEnd.value, 17);
XCTAssertEqual(YGNodeStyleGetMargin(view.yoga.node, YGEdgeEnd).unit, YGUnitPoint); XCTAssertEqual(view.yoga.marginEnd.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.marginEnd, 9); view.yoga.marginEnd = YGPercentValue(18);
XCTAssertEqual(view.yoga.marginEnd.value, 18);
XCTAssertEqual(view.yoga.marginEnd.unit, YGUnitPercent);
} }
- (void)testPaddingPropertiesWork - (void)testPaddingPropertiesWork
{ {
UIView *view = [[UIView alloc] initWithFrame:CGRectZero]; UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
view.yoga.padding = 1; view.yoga.padding = YGPointValue(1);
XCTAssertEqual(view.yoga.padding, 1); XCTAssertEqual(view.yoga.padding.value, 1);
XCTAssertTrue(isnan(view.yoga.paddingLeft)); XCTAssertEqual(view.yoga.padding.unit, YGUnitPoint);
XCTAssertTrue(isnan(view.yoga.paddingRight)); view.yoga.padding = YGPercentValue(2);
XCTAssertTrue(isnan(view.yoga.paddingStart)); XCTAssertEqual(view.yoga.padding.value, 2);
XCTAssertTrue(isnan(view.yoga.paddingEnd)); XCTAssertEqual(view.yoga.padding.unit, YGUnitPercent);
XCTAssertTrue(isnan(view.yoga.paddingTop));
XCTAssertTrue(isnan(view.yoga.paddingBottom));
XCTAssertTrue(isnan(view.yoga.paddingHorizontal));
XCTAssertTrue(isnan(view.yoga.paddingVertical));
view.yoga.paddingHorizontal = 2; view.yoga.paddingHorizontal = YGPointValue(3);
XCTAssertEqual(view.yoga.paddingHorizontal, 2); XCTAssertEqual(view.yoga.paddingHorizontal.value, 3);
XCTAssertTrue(isnan(view.yoga.paddingLeft)); XCTAssertEqual(view.yoga.paddingHorizontal.unit, YGUnitPoint);
XCTAssertTrue(isnan(view.yoga.paddingRight)); view.yoga.paddingHorizontal = YGPercentValue(4);
XCTAssertTrue(isnan(view.yoga.paddingStart)); XCTAssertEqual(view.yoga.paddingHorizontal.value, 4);
XCTAssertTrue(isnan(view.yoga.paddingEnd)); XCTAssertEqual(view.yoga.paddingHorizontal.unit, YGUnitPercent);
view.yoga.paddingVertical = 3; view.yoga.paddingVertical = YGPointValue(5);
XCTAssertEqual(view.yoga.paddingVertical, 3); XCTAssertEqual(view.yoga.paddingVertical.value, 5);
XCTAssertTrue(isnan(view.yoga.paddingTop)); XCTAssertEqual(view.yoga.paddingVertical.unit, YGUnitPoint);
XCTAssertTrue(isnan(view.yoga.paddingBottom)); view.yoga.paddingVertical = YGPercentValue(6);
XCTAssertEqual(view.yoga.paddingVertical.value, 6);
XCTAssertEqual(view.yoga.paddingVertical.unit, YGUnitPercent);
view.yoga.paddingLeft = 4; view.yoga.paddingLeft = YGPointValue(7);
XCTAssertEqual(YGNodeStyleGetPadding(view.yoga.node, YGEdgeLeft).value, 4); XCTAssertEqual(view.yoga.paddingLeft.value, 7);
XCTAssertEqual(YGNodeStyleGetPadding(view.yoga.node, YGEdgeLeft).unit, YGUnitPoint); XCTAssertEqual(view.yoga.paddingLeft.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.paddingLeft, 4); view.yoga.paddingLeft = YGPercentValue(8);
XCTAssertEqual(view.yoga.paddingLeft.value, 8);
XCTAssertEqual(view.yoga.paddingLeft.unit, YGUnitPercent);
view.yoga.paddingRight = 5; view.yoga.paddingRight = YGPointValue(9);
XCTAssertEqual(YGNodeStyleGetPadding(view.yoga.node, YGEdgeRight).value, 5); XCTAssertEqual(view.yoga.paddingRight.value, 9);
XCTAssertEqual(YGNodeStyleGetPadding(view.yoga.node, YGEdgeRight).unit, YGUnitPoint); XCTAssertEqual(view.yoga.paddingRight.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.paddingRight, 5); view.yoga.paddingRight = YGPercentValue(10);
XCTAssertEqual(view.yoga.paddingRight.value, 10);
XCTAssertEqual(view.yoga.paddingRight.unit, YGUnitPercent);
view.yoga.paddingTop = 6; view.yoga.paddingTop = YGPointValue(11);
XCTAssertEqual(YGNodeStyleGetPadding(view.yoga.node, YGEdgeTop).value, 6); XCTAssertEqual(view.yoga.paddingTop.value, 11);
XCTAssertEqual(YGNodeStyleGetPadding(view.yoga.node, YGEdgeTop).unit, YGUnitPoint); XCTAssertEqual(view.yoga.paddingTop.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.paddingTop, 6); view.yoga.paddingTop = YGPercentValue(12);
XCTAssertEqual(view.yoga.paddingTop.value, 12);
XCTAssertEqual(view.yoga.paddingTop.unit, YGUnitPercent);
view.yoga.paddingBottom = 7; view.yoga.paddingBottom = YGPointValue(13);
XCTAssertEqual(YGNodeStyleGetPadding(view.yoga.node, YGEdgeBottom).value, 7); XCTAssertEqual(view.yoga.paddingBottom.value, 13);
XCTAssertEqual(YGNodeStyleGetPadding(view.yoga.node, YGEdgeBottom).unit, YGUnitPoint); XCTAssertEqual(view.yoga.paddingBottom.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.paddingBottom, 7); view.yoga.paddingBottom = YGPercentValue(14);
XCTAssertEqual(view.yoga.paddingBottom.value, 14);
XCTAssertEqual(view.yoga.paddingBottom.unit, YGUnitPercent);
view.yoga.paddingStart = 8; view.yoga.paddingStart = YGPointValue(15);
XCTAssertEqual(YGNodeStyleGetPadding(view.yoga.node, YGEdgeStart).value, 8); XCTAssertEqual(view.yoga.paddingStart.value, 15);
XCTAssertEqual(YGNodeStyleGetPadding(view.yoga.node, YGEdgeStart).unit, YGUnitPoint); XCTAssertEqual(view.yoga.paddingStart.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.paddingStart, 8); view.yoga.paddingStart = YGPercentValue(16);
XCTAssertEqual(view.yoga.paddingStart.value, 16);
XCTAssertEqual(view.yoga.paddingStart.unit, YGUnitPercent);
view.yoga.paddingEnd = 9; view.yoga.paddingEnd = YGPointValue(17);
XCTAssertEqual(YGNodeStyleGetPadding(view.yoga.node, YGEdgeEnd).value, 9); XCTAssertEqual(view.yoga.paddingEnd.value, 17);
XCTAssertEqual(YGNodeStyleGetPadding(view.yoga.node, YGEdgeEnd).unit, YGUnitPoint); XCTAssertEqual(view.yoga.paddingEnd.unit, YGUnitPoint);
XCTAssertEqual(view.yoga.paddingEnd, 9); view.yoga.paddingEnd = YGPercentValue(18);
XCTAssertEqual(view.yoga.paddingEnd.value, 18);
XCTAssertEqual(view.yoga.paddingEnd.unit, YGUnitPercent);
} }
- (void)testBorderWidthPropertiesWork - (void)testBorderWidthPropertiesWork
@@ -679,12 +719,6 @@
view.yoga.borderWidth = 1; view.yoga.borderWidth = 1;
XCTAssertEqual(view.yoga.borderWidth, 1); XCTAssertEqual(view.yoga.borderWidth, 1);
XCTAssertTrue(isnan(view.yoga.borderLeftWidth));
XCTAssertTrue(isnan(view.yoga.borderRightWidth));
XCTAssertTrue(isnan(view.yoga.borderStartWidth));
XCTAssertTrue(isnan(view.yoga.borderEndWidth));
XCTAssertTrue(isnan(view.yoga.borderTopWidth));
XCTAssertTrue(isnan(view.yoga.borderBottomWidth));
view.yoga.borderLeftWidth = 2; view.yoga.borderLeftWidth = 2;
XCTAssertEqual(view.yoga.borderLeftWidth, 2); XCTAssertEqual(view.yoga.borderLeftWidth, 2);

View File

@@ -14,13 +14,13 @@ DEPENDENCIES:
EXTERNAL SOURCES: EXTERNAL SOURCES:
YogaKit: YogaKit:
:path: "../../YogaKit.podspec" :path: ../../YogaKit.podspec
SPEC CHECKSUMS: SPEC CHECKSUMS:
IGListKit: b826c68ef7a4ae1626c09d4d3e1ea7a169e6c36e IGListKit: b826c68ef7a4ae1626c09d4d3e1ea7a169e6c36e
Yoga: 2ed1d7accfef3610a67f58c0cf101a0662137f2c Yoga: 2ed1d7accfef3610a67f58c0cf101a0662137f2c
YogaKit: cddeccc6a8d2aff563e4c738d3bddb290a6de4cb YogaKit: 31576530e8fcae3175469719ec3212397403330b
PODFILE CHECKSUM: 216f8e7127767709e0e43f3711208d238fa5c404 PODFILE CHECKSUM: 216f8e7127767709e0e43f3711208d238fa5c404
COCOAPODS: 1.2.0 COCOAPODS: 1.1.1

View File

@@ -12,6 +12,11 @@ import YogaKit
struct DemoItem { struct DemoItem {
let name: String let name: String
root.backgroundColor = .red
root.yoga.isEnabled = true
root.yoga.width = YGValue(self.view.bounds.size.width)
root.yoga.height = YGValue(self.view.bounds.size.height)
root.yoga.alignItems = .center
} }
final class SwiftViewController: UIViewController, IGListAdapterDataSource { final class SwiftViewController: UIViewController, IGListAdapterDataSource {

View File

@@ -17,16 +17,16 @@
UIView *root = self.view; UIView *root = self.view;
root.backgroundColor = [UIColor redColor]; root.backgroundColor = [UIColor redColor];
root.yoga.isEnabled = YES; root.yoga.isEnabled = YES;
root.yoga.width = self.view.bounds.size.width; root.yoga.width = YGPointValue(self.view.bounds.size.width);
root.yoga.height = self.view.bounds.size.height; root.yoga.height = YGPointValue(self.view.bounds.size.height);
root.yoga.alignItems = YGAlignCenter; root.yoga.alignItems = YGAlignCenter;
root.yoga.justifyContent = YGJustifyCenter; root.yoga.justifyContent = YGJustifyCenter;
UIView *child1 = [UIView new]; UIView *child1 = [UIView new];
child1.backgroundColor = [UIColor blueColor]; child1.backgroundColor = [UIColor blueColor];
child1.yoga.isEnabled = YES; child1.yoga.isEnabled = YES;
child1.yoga.width = 100; child1.yoga.width = YGPointValue(100);
child1.yoga.height = 100; child1.yoga.height = YGPointValue(100);
UIView *child2 = [UIView new]; UIView *child2 = [UIView new];
child2.backgroundColor = [UIColor greenColor]; child2.backgroundColor = [UIColor greenColor];

View File

@@ -17,8 +17,8 @@ final class BasicViewController: UIViewController {
root.backgroundColor = .white root.backgroundColor = .white
root.configureLayout { (layout) in root.configureLayout { (layout) in
layout.isEnabled = true layout.isEnabled = true
layout.width = containerSize.width layout.width = YGValue(containerSize.width)
layout.height = containerSize.height layout.height = YGValue(containerSize.height)
layout.alignItems = .center layout.alignItems = .center
layout.justifyContent = .center layout.justifyContent = .center
} }

View File

@@ -29,7 +29,7 @@ final class LayoutInclusionViewController: UIViewController {
contentView.configureLayout { (layout) in contentView.configureLayout { (layout) in
layout.isEnabled = true layout.isEnabled = true
layout.height = 300 layout.height = 300
layout.width = self.view.bounds.size.width layout.width = YGValue(self.view.bounds.size.width)
layout.flexDirection = .row layout.flexDirection = .row
layout.justifyContent = .center layout.justifyContent = .center
layout.paddingHorizontal = 25 layout.paddingHorizontal = 25

View File

@@ -3,8 +3,8 @@ apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'maven-publish' apply plugin: 'maven-publish'
version = '1.4.1' version = VERSION_NAME
group = 'com.facebook.yoga.android' group = GROUP
android { android {
compileSdkVersion rootProject.compileSdkVersion compileSdkVersion rootProject.compileSdkVersion
@@ -42,8 +42,4 @@ task javadocJar(type: Jar, dependsOn: javadoc) {
from javadoc.destinationDir from javadoc.destinationDir
} }
ext { apply from: rootProject.file('gradle/release.gradle')
bintrayName = 'com.facebook.yoga.android:yoga-layout'
}
apply from: rootProject.file('gradle/android-jcenter-install.gradle')

View File

@@ -0,0 +1,5 @@
GROUP=com.facebook.yoga.android
POM_NAME=YogaLayout
POM_DESCRIPTION=YogaLayout
POM_ARTIFACT_ID=yoga-layout
POM_PACKAGING=aar

View File

@@ -4,7 +4,7 @@ package com.facebook.samples.yoga;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.app.ActionBarActivity; import android.support.v7.app.AppCompatActivity;
import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
@@ -19,7 +19,7 @@ import android.support.v7.app.ActionBar;
import com.facebook.samples.yoga.R; import com.facebook.samples.yoga.R;
import com.facebook.yoga.android.YogaViewLayoutFactory; import com.facebook.yoga.android.YogaViewLayoutFactory;
public class BenchmarkActivity extends ActionBarActivity { public class BenchmarkActivity extends AppCompatActivity {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {

View File

@@ -10,7 +10,7 @@ package com.facebook.samples.yoga;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.support.v7.app.ActionBarActivity; import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
@@ -25,7 +25,7 @@ import com.facebook.yoga.android.YogaViewLayoutFactory;
* {@code main_layout.xml}) that shows off the awesome functionality of the Yoga layout engine * {@code main_layout.xml}) that shows off the awesome functionality of the Yoga layout engine
* as well as some optimisations on layout systems that it facilitates. * as well as some optimisations on layout systems that it facilitates.
*/ */
public class MainActivity extends ActionBarActivity { public class MainActivity extends AppCompatActivity {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {

View File

@@ -10,9 +10,12 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)BaselineFunction.cs" /> <Compile Include="$(MSBuildThisFileDirectory)BaselineFunction.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Logger.cs" />
<Compile Include="$(MSBuildThisFileDirectory)MeasureFunction.cs" /> <Compile Include="$(MSBuildThisFileDirectory)MeasureFunction.cs" />
<Compile Include="$(MSBuildThisFileDirectory)MeasureOutput.cs" /> <Compile Include="$(MSBuildThisFileDirectory)MeasureOutput.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Native.cs" /> <Compile Include="$(MSBuildThisFileDirectory)Native.cs" />
<Compile Include="$(MSBuildThisFileDirectory)YGConfigHandle.cs" />
<Compile Include="$(MSBuildThisFileDirectory)YGNodeHandle.cs" />
<Compile Include="$(MSBuildThisFileDirectory)YogaAlign.cs" /> <Compile Include="$(MSBuildThisFileDirectory)YogaAlign.cs" />
<Compile Include="$(MSBuildThisFileDirectory)YogaBaselineFunc.cs" /> <Compile Include="$(MSBuildThisFileDirectory)YogaBaselineFunc.cs" />
<Compile Include="$(MSBuildThisFileDirectory)YogaConfig.cs" /> <Compile Include="$(MSBuildThisFileDirectory)YogaConfig.cs" />

View File

@@ -0,0 +1,17 @@
/**
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
namespace Facebook.Yoga
{
public delegate void Logger(
YogaConfig config,
YogaNode node,
YogaLogLevel level,
string message);
}

View File

@@ -26,96 +26,9 @@ namespace Facebook.Yoga
private const string DllName = "yoga"; private const string DllName = "yoga";
#endif #endif
internal class YGNodeHandle : SafeHandle
{
#if (UNITY_IOS && !UNITY_EDITOR) || ENABLE_IL2CPP || __IOS__
private GCHandle _managed;
#endif
private YGNodeHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid
{
get
{
return this.handle == IntPtr.Zero;
}
}
protected override bool ReleaseHandle()
{
#if (UNITY_IOS && !UNITY_EDITOR) || ENABLE_IL2CPP || __IOS__
ReleaseManaged();
#endif
Native.YGNodeFree(this.handle);
GC.KeepAlive(this);
return true;
}
#if (UNITY_IOS && !UNITY_EDITOR) || ENABLE_IL2CPP || __IOS__
public void SetContext(YogaNode node)
{
if (!_managed.IsAllocated)
{
#if ENABLE_IL2CPP
// Weak causes 'GCHandle value belongs to a different domain' error
_managed = GCHandle.Alloc(node);
#else
_managed = GCHandle.Alloc(node, GCHandleType.Weak);
#endif
Native.YGNodeSetContext(this.handle, GCHandle.ToIntPtr(_managed));
}
}
public void ReleaseManaged()
{
if (_managed.IsAllocated)
{
_managed.Free();
}
}
public static YogaNode GetManaged(IntPtr ygNodePtr)
{
var node =
GCHandle.FromIntPtr(Native.YGNodeGetContext(ygNodePtr)).Target as YogaNode;
if (node == null)
{
throw new InvalidOperationException("YogaNode is already deallocated");
}
return node;
}
#endif
}
internal class YGConfigHandle : SafeHandle
{
private YGConfigHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid
{
get
{
return this.handle == IntPtr.Zero;
}
}
protected override bool ReleaseHandle()
{
Native.YGConfigFree(this.handle);
GC.KeepAlive(this);
return true;
}
}
[DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] [DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern void YGInteropSetLogger( public static extern void YGInteropSetLogger(
[MarshalAs(UnmanagedType.FunctionPtr)] YogaLogger.Func func); [MarshalAs(UnmanagedType.FunctionPtr)] YogaLogger logger);
[DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] [DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern YGNodeHandle YGNodeNew(); public static extern YGNodeHandle YGNodeNew();
@@ -129,6 +42,9 @@ namespace Facebook.Yoga
[DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] [DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern void YGNodeReset(YGNodeHandle node); public static extern void YGNodeReset(YGNodeHandle node);
[DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern YGConfigHandle YGConfigGetDefault();
[DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] [DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern YGConfigHandle YGConfigNew(); public static extern YGConfigHandle YGConfigNew();
@@ -445,15 +361,19 @@ namespace Facebook.Yoga
#endregion #endregion
#region AOT #region Context
#if (UNITY_IOS && !UNITY_EDITOR) || ENABLE_IL2CPP || __IOS__
[DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] [DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr YGNodeGetContext(IntPtr node); public static extern IntPtr YGNodeGetContext(IntPtr node);
[DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] [DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern void YGNodeSetContext(IntPtr node, IntPtr managed); public static extern void YGNodeSetContext(IntPtr node, IntPtr managed);
#endif
[DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr YGConfigGetContext(IntPtr config);
[DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern void YGConfigSetContext(IntPtr config, IntPtr managed);
#endregion #endregion
} }

View File

@@ -0,0 +1,84 @@
/**
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
using System;
using System.Runtime.InteropServices;
namespace Facebook.Yoga
{
internal class YGConfigHandle : SafeHandle
{
internal static readonly YGConfigHandle Default = Native.YGConfigGetDefault();
private GCHandle _managedConfigHandle;
private YGConfigHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid
{
get
{
return this.handle == IntPtr.Zero;
}
}
protected override bool ReleaseHandle()
{
if (this.handle != Default.handle)
{
ReleaseManaged();
if (!IsInvalid)
{
Native.YGConfigFree(this.handle);
}
}
GC.KeepAlive(this);
return true;
}
public void SetContext(YogaConfig config)
{
if (!_managedConfigHandle.IsAllocated)
{
#if UNITY_5_4_OR_NEWER
// Weak causes 'GCHandle value belongs to a different domain' error
_managedConfigHandle = GCHandle.Alloc(config);
#else
_managedConfigHandle = GCHandle.Alloc(config, GCHandleType.Weak);
#endif
var managedConfigPtr = GCHandle.ToIntPtr(_managedConfigHandle);
Native.YGConfigSetContext(this.handle, managedConfigPtr);
}
}
private void ReleaseManaged()
{
if (_managedConfigHandle.IsAllocated)
{
_managedConfigHandle.Free();
}
}
public static YogaConfig GetManaged(IntPtr unmanagedConfigPtr)
{
if (unmanagedConfigPtr != IntPtr.Zero)
{
var managedConfigPtr = Native.YGConfigGetContext(unmanagedConfigPtr);
var config = GCHandle.FromIntPtr(managedConfigPtr).Target as YogaConfig;
if (config == null)
{
throw new InvalidOperationException("YogaConfig is already deallocated");
}
return config;
}
return null;
}
}
}

View File

@@ -0,0 +1,80 @@
/**
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
using System;
using System.Runtime.InteropServices;
namespace Facebook.Yoga
{
internal class YGNodeHandle : SafeHandle
{
private GCHandle _managedNodeHandle;
private YGNodeHandle() : base(IntPtr.Zero, true)
{
}
public override bool IsInvalid
{
get
{
return this.handle == IntPtr.Zero;
}
}
protected override bool ReleaseHandle()
{
ReleaseManaged();
if (!IsInvalid)
{
Native.YGNodeFree(this.handle);
GC.KeepAlive(this);
}
return true;
}
public void SetContext(YogaNode node)
{
if (!_managedNodeHandle.IsAllocated)
{
#if UNITY_5_4_OR_NEWER
// Weak causes 'GCHandle value belongs to a different domain' error
_managedNodeHandle = GCHandle.Alloc(node);
#else
_managedNodeHandle = GCHandle.Alloc(node, GCHandleType.Weak);
#endif
var managedNodePtr = GCHandle.ToIntPtr(_managedNodeHandle);
Native.YGNodeSetContext(this.handle, managedNodePtr);
}
}
public void ReleaseManaged()
{
if (_managedNodeHandle.IsAllocated)
{
_managedNodeHandle.Free();
}
}
public static YogaNode GetManaged(IntPtr unmanagedNodePtr)
{
if (unmanagedNodePtr != IntPtr.Zero)
{
var managedNodePtr = Native.YGNodeGetContext(unmanagedNodePtr);
var node = GCHandle.FromIntPtr(managedNodePtr).Target as YogaNode;
if (node == null)
{
throw new InvalidOperationException("YogaNode is already deallocated");
}
return node;
}
return null;
}
}
}

View File

@@ -13,5 +13,5 @@ using System.Runtime.InteropServices;
namespace Facebook.Yoga namespace Facebook.Yoga
{ {
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate float YogaBaselineFunc(IntPtr node, float width, float height); public delegate float YogaBaselineFunc(IntPtr unmanagedNodePtr, float width, float height);
} }

View File

@@ -8,29 +8,92 @@
*/ */
using System; using System;
using System.Runtime.InteropServices;
#if __IOS__
using ObjCRuntime;
#endif
#if ENABLE_IL2CPP
using AOT;
#endif
namespace Facebook.Yoga namespace Facebook.Yoga
{ {
public class YogaConfig public class YogaConfig
{ {
private Native.YGConfigHandle _ygConfig; internal static readonly YogaConfig Default = new YogaConfig(YGConfigHandle.Default);
private static YogaLogger _managedLogger;
public YogaConfig() private YGConfigHandle _ygConfig;
private Logger _logger;
private YogaConfig(YGConfigHandle ygConfig)
{ {
_ygConfig = Native.YGConfigNew(); _ygConfig = ygConfig;
if (_ygConfig.IsInvalid) if (_ygConfig.IsInvalid)
{ {
throw new InvalidOperationException("Failed to allocate native memory"); throw new InvalidOperationException("Failed to allocate native memory");
} }
_ygConfig.SetContext(this);
if (_ygConfig == YGConfigHandle.Default)
{
_managedLogger = LoggerInternal;
Native.YGInteropSetLogger(_managedLogger);
}
} }
internal Native.YGConfigHandle Handle public YogaConfig()
: this(Native.YGConfigNew())
{
}
internal YGConfigHandle Handle
{ {
get { get {
return _ygConfig; return _ygConfig;
} }
} }
#if (UNITY_IOS && !UNITY_EDITOR) || ENABLE_IL2CPP || __IOS__
[MonoPInvokeCallback(typeof(YogaLogger))]
#endif
private static void LoggerInternal(
IntPtr unmanagedConfigPtr,
IntPtr unmanagedNodePtr,
YogaLogLevel level,
string message)
{
var config = YGConfigHandle.GetManaged(unmanagedConfigPtr);
if (config == null || config._logger == null)
{
// Default logger
Console.WriteLine(message);
}
else
{
var node = YGNodeHandle.GetManaged(unmanagedNodePtr);
config._logger(config, node, level, message);
}
if (level == YogaLogLevel.Error || level == YogaLogLevel.Fatal)
{
throw new InvalidOperationException(message);
}
}
public Logger Logger
{
get {
return _logger;
}
set {
_logger = value;
}
}
public void SetExperimentalFeatureEnabled( public void SetExperimentalFeatureEnabled(
YogaExperimentalFeature feature, YogaExperimentalFeature feature,
bool enabled) bool enabled)
@@ -68,5 +131,10 @@ namespace Facebook.Yoga
{ {
return Native.YGConfigGetInstanceCount(); return Native.YGConfigGetInstanceCount();
} }
public static void SetDefaultLogger(Logger logger)
{
Default.Logger = logger;
}
} }
} }

View File

@@ -11,8 +11,6 @@ namespace Facebook.Yoga
{ {
public enum YogaExperimentalFeature public enum YogaExperimentalFeature
{ {
Rounding,
WebFlexBasis, WebFlexBasis,
MinFlexFix,
} }
} }

View File

@@ -16,5 +16,6 @@ namespace Facebook.Yoga
Info, Info,
Debug, Debug,
Verbose, Verbose,
Fatal,
} }
} }

View File

@@ -10,48 +10,12 @@
using System; using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
#if __IOS__
using ObjCRuntime;
#endif
#if ENABLE_IL2CPP
using AOT;
#endif
namespace Facebook.Yoga namespace Facebook.Yoga
{
internal static class YogaLogger
{ {
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void Func(YogaLogLevel level, string message); public delegate void YogaLogger(
IntPtr unmanagedConfigPtr,
private static bool _initialized; IntPtr unmanagedNotePtr,
private static Func _managedLogger = LoggerInternal; YogaLogLevel level,
string message);
public static Func Logger = null;
#if (UNITY_IOS && !UNITY_EDITOR) || ENABLE_IL2CPP || __IOS__
[MonoPInvokeCallback(typeof(Func))]
#endif
public static void LoggerInternal(YogaLogLevel level, string message)
{
if (Logger != null)
{
Logger(level, message);
}
if (level == YogaLogLevel.Error)
{
throw new InvalidOperationException(message);
}
}
public static void Initialize()
{
if (!_initialized)
{
Native.YGInteropSetLogger(_managedLogger);
_initialized = true;
}
}
}
} }

View File

@@ -14,7 +14,7 @@ namespace Facebook.Yoga
{ {
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate YogaSize YogaMeasureFunc( public delegate YogaSize YogaMeasureFunc(
IntPtr node, IntPtr unmanagedNodePtr,
float width, float width,
YogaMeasureMode widthMode, YogaMeasureMode widthMode,
float height, float height,

View File

@@ -10,11 +10,9 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text; using System.Text;
#if (UNITY_IOS && !UNITY_EDITOR) || ENABLE_IL2CPP || __IOS__
using System.Runtime.InteropServices;
#endif
#if __IOS__ #if __IOS__
using ObjCRuntime; using ObjCRuntime;
#endif #endif
@@ -26,49 +24,26 @@ namespace Facebook.Yoga
{ {
public partial class YogaNode : IEnumerable<YogaNode> public partial class YogaNode : IEnumerable<YogaNode>
{ {
private readonly Native.YGNodeHandle _ygNode; private readonly YGNodeHandle _ygNode;
private readonly YogaConfig _config; private readonly YogaConfig _config;
private WeakReference _parent; private WeakReference _parent;
private List<YogaNode> _children; private List<YogaNode> _children;
private MeasureFunction _measureFunction; private MeasureFunction _measureFunction;
private BaselineFunction _baselineFunction; private BaselineFunction _baselineFunction;
private object _data;
#if (UNITY_IOS && !UNITY_EDITOR) || ENABLE_IL2CPP || __IOS__
private static YogaMeasureFunc _managedMeasure;
private static YogaBaselineFunc _managedBaseline;
#else
private YogaMeasureFunc _managedMeasure; private YogaMeasureFunc _managedMeasure;
private YogaBaselineFunc _managedBaseline; private YogaBaselineFunc _managedBaseline;
#endif private object _data;
public YogaNode() public YogaNode(YogaConfig config = null)
{ {
YogaLogger.Initialize(); _config = config == null ? YogaConfig.Default : config;
_ygNode = Native.YGNodeNew();
if (_ygNode.IsInvalid)
{
throw new InvalidOperationException("Failed to allocate native memory");
}
}
public YogaNode(YogaConfig config)
{
YogaLogger.Initialize();
if (config != null)
{
_config = config;
_ygNode = Native.YGNodeNewWithConfig(_config.Handle); _ygNode = Native.YGNodeNewWithConfig(_config.Handle);
}
else
{
_ygNode = Native.YGNodeNew();
}
if (_ygNode.IsInvalid) if (_ygNode.IsInvalid)
{ {
throw new InvalidOperationException("Failed to allocate native memory"); throw new InvalidOperationException("Failed to allocate native memory");
} }
_ygNode.SetContext(this);
} }
public YogaNode(YogaNode srcNode) public YogaNode(YogaNode srcNode)
@@ -83,10 +58,9 @@ namespace Facebook.Yoga
_baselineFunction = null; _baselineFunction = null;
_data = null; _data = null;
Native.YGNodeReset(_ygNode);
#if (UNITY_IOS && !UNITY_EDITOR) || ENABLE_IL2CPP || __IOS__
_ygNode.ReleaseManaged(); _ygNode.ReleaseManaged();
#endif Native.YGNodeReset(_ygNode);
_ygNode.SetContext(this);
} }
public bool IsDirty public bool IsDirty
@@ -609,38 +583,15 @@ namespace Facebook.Yoga
public void SetMeasureFunction(MeasureFunction measureFunction) public void SetMeasureFunction(MeasureFunction measureFunction)
{ {
_measureFunction = measureFunction; _measureFunction = measureFunction;
if (measureFunction != null) _managedMeasure = measureFunction != null ? MeasureInternal : (YogaMeasureFunc)null;
{
#if (UNITY_IOS && !UNITY_EDITOR) || ENABLE_IL2CPP || __IOS__
_managedMeasure = MeasureInternalAOT;
_ygNode.SetContext(this);
#else
_managedMeasure = MeasureInternal;
#endif
}
else
{
_managedMeasure = null;
}
Native.YGNodeSetMeasureFunc(_ygNode, _managedMeasure); Native.YGNodeSetMeasureFunc(_ygNode, _managedMeasure);
} }
public void SetBaselineFunction(BaselineFunction baselineFunction) public void SetBaselineFunction(BaselineFunction baselineFunction)
{ {
_baselineFunction = baselineFunction; _baselineFunction = baselineFunction;
if (baselineFunction != null) _managedBaseline =
{ baselineFunction != null ? BaselineInternal : (YogaBaselineFunc)null;
#if (UNITY_IOS && !UNITY_EDITOR) || ENABLE_IL2CPP || __IOS__
_managedBaseline = BaselineInternalAOT;
_ygNode.SetContext(this);
#else
_managedBaseline = BaselineInternal;
#endif
}
else
{
_managedBaseline = null;
}
Native.YGNodeSetBaselineFunc(_ygNode, _managedBaseline); Native.YGNodeSetBaselineFunc(_ygNode, _managedBaseline);
} }
@@ -655,63 +606,46 @@ namespace Facebook.Yoga
#if (UNITY_IOS && !UNITY_EDITOR) || ENABLE_IL2CPP || __IOS__ #if (UNITY_IOS && !UNITY_EDITOR) || ENABLE_IL2CPP || __IOS__
[MonoPInvokeCallback(typeof(YogaMeasureFunc))] [MonoPInvokeCallback(typeof(YogaMeasureFunc))]
private static YogaSize MeasureInternalAOT(
IntPtr ygNodePtr,
float width,
YogaMeasureMode widthMode,
float height,
YogaMeasureMode heightMode)
{
var node = Native.YGNodeHandle.GetManaged(ygNodePtr);
return node.MeasureInternal(IntPtr.Zero, width, widthMode, height, heightMode);
}
#endif #endif
private static YogaSize MeasureInternal(
private YogaSize MeasureInternal( IntPtr unmanagedNodePtr,
IntPtr node,
float width, float width,
YogaMeasureMode widthMode, YogaMeasureMode widthMode,
float height, float height,
YogaMeasureMode heightMode) YogaMeasureMode heightMode)
{ {
if (_measureFunction == null) var node = YGNodeHandle.GetManaged(unmanagedNodePtr);
if (node == null || node._measureFunction == null)
{ {
throw new InvalidOperationException("Measure function is not defined."); throw new InvalidOperationException("Measure function is not defined.");
} }
return node._measureFunction(node, width, widthMode, height, heightMode);
return _measureFunction(this, width, widthMode, height, heightMode);
} }
#if (UNITY_IOS && !UNITY_EDITOR) || ENABLE_IL2CPP || __IOS__ #if (UNITY_IOS && !UNITY_EDITOR) || ENABLE_IL2CPP || __IOS__
[MonoPInvokeCallback(typeof(YogaBaselineFunc))] [MonoPInvokeCallback(typeof(YogaBaselineFunc))]
private static float BaselineInternalAOT( #endif
IntPtr ygNodePtr, private static float BaselineInternal(
IntPtr unmanagedNodePtr,
float width, float width,
float height) float height)
{ {
var node = Native.YGNodeHandle.GetManaged(ygNodePtr); var node = YGNodeHandle.GetManaged(unmanagedNodePtr);
return node.BaselineInternal(IntPtr.Zero, width, height); if (node == null || node._baselineFunction == null)
}
#endif
private float BaselineInternal(IntPtr node, float width, float height)
{
if (_baselineFunction == null)
{ {
throw new InvalidOperationException("Baseline function is not defined."); throw new InvalidOperationException("Baseline function is not defined.");
} }
return node._baselineFunction(node, width, height);
return _baselineFunction(this, width, height);
} }
public string Print(YogaPrintOptions options = public string Print(YogaPrintOptions options =
YogaPrintOptions.Layout|YogaPrintOptions.Style|YogaPrintOptions.Children) YogaPrintOptions.Layout|YogaPrintOptions.Style|YogaPrintOptions.Children)
{ {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
YogaLogger.Func orig = YogaLogger.Logger; Logger orig = _config.Logger;
YogaLogger.Logger = (level, message) => {sb.Append(message);}; _config.Logger = (config, node, level, message) => {sb.Append(message);};
Native.YGNodePrint(_ygNode, options); Native.YGNodePrint(_ygNode, options);
YogaLogger.Logger = orig; _config.Logger = orig;
return sb.ToString(); return sb.ToString();
} }

View File

@@ -9,19 +9,23 @@
#include "YGInterop.h" #include "YGInterop.h"
static YGInteropLoggerFunc gManagedFunc; static YGInteropLogger gManagedLogger;
static int unmanagedLogger(YGLogLevel level, const char *format, va_list args) { static int unmanagedLogger(const YGConfigRef config,
const YGNodeRef node,
YGLogLevel level,
const char *format,
va_list args) {
int result = 0; int result = 0;
if (gManagedFunc) { if (gManagedLogger) {
char buffer[256]; char message[8192];
result = vsnprintf(buffer, sizeof(buffer), format, args); result = vsnprintf(message, sizeof(message), format, args);
(*gManagedFunc)(level, buffer); (*gManagedLogger)(config, node, level, message);
} }
return result; return result;
} }
void YGInteropSetLogger(YGInteropLoggerFunc managedFunc) { void YGInteropSetLogger(YGInteropLogger managedLogger) {
gManagedFunc = managedFunc; gManagedLogger = managedLogger;
YGSetLogger(&unmanagedLogger); YGConfigSetLogger(YGConfigGetDefault(), &unmanagedLogger);
} }

View File

@@ -13,8 +13,13 @@
YG_EXTERN_C_BEGIN YG_EXTERN_C_BEGIN
typedef void (*YGInteropLoggerFunc)(YGLogLevel level, const char *message); typedef int (*YGInteropLogger)(const void *unmanagedConfigPtr,
const void *unmanagedNodePtr,
YGLogLevel level,
const char *message);
WIN_EXPORT void YGInteropSetLogger(YGInteropLoggerFunc managedFunc); WIN_EXPORT YGConfigRef YGConfigGetDefault();
WIN_EXPORT void YGInteropSetLogger(YGInteropLogger managedLogger);
YG_EXTERN_C_END YG_EXTERN_C_END

View File

@@ -1815,5 +1815,148 @@ namespace Facebook.Yoga
Assert.AreEqual(72f, root_child0_child0.LayoutHeight); Assert.AreEqual(72f, root_child0_child0.LayoutHeight);
} }
[Test]
public void Test_align_center_should_size_based_on_content()
{
YogaConfig config = new YogaConfig();
YogaNode root = new YogaNode(config);
root.AlignItems = YogaAlign.Center;
root.MarginTop = 20;
root.Width = 100;
root.Height = 100;
YogaNode root_child0 = new YogaNode(config);
root_child0.JustifyContent = YogaJustify.Center;
root_child0.FlexShrink = 1;
root.Insert(0, root_child0);
YogaNode root_child0_child0 = new YogaNode(config);
root_child0_child0.FlexGrow = 1;
root_child0_child0.FlexShrink = 1;
root_child0.Insert(0, root_child0_child0);
YogaNode root_child0_child0_child0 = new YogaNode(config);
root_child0_child0_child0.Width = 20;
root_child0_child0_child0.Height = 20;
root_child0_child0.Insert(0, root_child0_child0_child0);
root.StyleDirection = YogaDirection.LTR;
root.CalculateLayout();
Assert.AreEqual(0f, root.LayoutX);
Assert.AreEqual(20f, root.LayoutY);
Assert.AreEqual(100f, root.LayoutWidth);
Assert.AreEqual(100f, root.LayoutHeight);
Assert.AreEqual(40f, root_child0.LayoutX);
Assert.AreEqual(0f, root_child0.LayoutY);
Assert.AreEqual(20f, root_child0.LayoutWidth);
Assert.AreEqual(20f, root_child0.LayoutHeight);
Assert.AreEqual(0f, root_child0_child0.LayoutX);
Assert.AreEqual(0f, root_child0_child0.LayoutY);
Assert.AreEqual(20f, root_child0_child0.LayoutWidth);
Assert.AreEqual(20f, root_child0_child0.LayoutHeight);
Assert.AreEqual(0f, root_child0_child0_child0.LayoutX);
Assert.AreEqual(0f, root_child0_child0_child0.LayoutY);
Assert.AreEqual(20f, root_child0_child0_child0.LayoutWidth);
Assert.AreEqual(20f, root_child0_child0_child0.LayoutHeight);
root.StyleDirection = YogaDirection.RTL;
root.CalculateLayout();
Assert.AreEqual(0f, root.LayoutX);
Assert.AreEqual(20f, root.LayoutY);
Assert.AreEqual(100f, root.LayoutWidth);
Assert.AreEqual(100f, root.LayoutHeight);
Assert.AreEqual(40f, root_child0.LayoutX);
Assert.AreEqual(0f, root_child0.LayoutY);
Assert.AreEqual(20f, root_child0.LayoutWidth);
Assert.AreEqual(20f, root_child0.LayoutHeight);
Assert.AreEqual(0f, root_child0_child0.LayoutX);
Assert.AreEqual(0f, root_child0_child0.LayoutY);
Assert.AreEqual(20f, root_child0_child0.LayoutWidth);
Assert.AreEqual(20f, root_child0_child0.LayoutHeight);
Assert.AreEqual(0f, root_child0_child0_child0.LayoutX);
Assert.AreEqual(0f, root_child0_child0_child0.LayoutY);
Assert.AreEqual(20f, root_child0_child0_child0.LayoutWidth);
Assert.AreEqual(20f, root_child0_child0_child0.LayoutHeight);
}
[Test]
public void Test_align_strech_should_size_based_on_parent()
{
YogaConfig config = new YogaConfig();
YogaNode root = new YogaNode(config);
root.MarginTop = 20;
root.Width = 100;
root.Height = 100;
YogaNode root_child0 = new YogaNode(config);
root_child0.JustifyContent = YogaJustify.Center;
root_child0.FlexShrink = 1;
root.Insert(0, root_child0);
YogaNode root_child0_child0 = new YogaNode(config);
root_child0_child0.FlexGrow = 1;
root_child0_child0.FlexShrink = 1;
root_child0.Insert(0, root_child0_child0);
YogaNode root_child0_child0_child0 = new YogaNode(config);
root_child0_child0_child0.Width = 20;
root_child0_child0_child0.Height = 20;
root_child0_child0.Insert(0, root_child0_child0_child0);
root.StyleDirection = YogaDirection.LTR;
root.CalculateLayout();
Assert.AreEqual(0f, root.LayoutX);
Assert.AreEqual(20f, root.LayoutY);
Assert.AreEqual(100f, root.LayoutWidth);
Assert.AreEqual(100f, root.LayoutHeight);
Assert.AreEqual(0f, root_child0.LayoutX);
Assert.AreEqual(0f, root_child0.LayoutY);
Assert.AreEqual(100f, root_child0.LayoutWidth);
Assert.AreEqual(20f, root_child0.LayoutHeight);
Assert.AreEqual(0f, root_child0_child0.LayoutX);
Assert.AreEqual(0f, root_child0_child0.LayoutY);
Assert.AreEqual(100f, root_child0_child0.LayoutWidth);
Assert.AreEqual(20f, root_child0_child0.LayoutHeight);
Assert.AreEqual(0f, root_child0_child0_child0.LayoutX);
Assert.AreEqual(0f, root_child0_child0_child0.LayoutY);
Assert.AreEqual(20f, root_child0_child0_child0.LayoutWidth);
Assert.AreEqual(20f, root_child0_child0_child0.LayoutHeight);
root.StyleDirection = YogaDirection.RTL;
root.CalculateLayout();
Assert.AreEqual(0f, root.LayoutX);
Assert.AreEqual(20f, root.LayoutY);
Assert.AreEqual(100f, root.LayoutWidth);
Assert.AreEqual(100f, root.LayoutHeight);
Assert.AreEqual(0f, root_child0.LayoutX);
Assert.AreEqual(0f, root_child0.LayoutY);
Assert.AreEqual(100f, root_child0.LayoutWidth);
Assert.AreEqual(20f, root_child0.LayoutHeight);
Assert.AreEqual(0f, root_child0_child0.LayoutX);
Assert.AreEqual(0f, root_child0_child0.LayoutY);
Assert.AreEqual(100f, root_child0_child0.LayoutWidth);
Assert.AreEqual(20f, root_child0_child0.LayoutHeight);
Assert.AreEqual(80f, root_child0_child0_child0.LayoutX);
Assert.AreEqual(0f, root_child0_child0_child0.LayoutY);
Assert.AreEqual(20f, root_child0_child0_child0.LayoutWidth);
Assert.AreEqual(20f, root_child0_child0_child0.LayoutHeight);
}
} }
} }

View File

@@ -1381,5 +1381,169 @@ namespace Facebook.Yoga
Assert.AreEqual(80f, root_child0_child1.LayoutHeight); Assert.AreEqual(80f, root_child0_child1.LayoutHeight);
} }
[Test]
public void Test_wrapped_column_max_height()
{
YogaConfig config = new YogaConfig();
YogaNode root = new YogaNode(config);
root.JustifyContent = YogaJustify.Center;
root.AlignContent = YogaAlign.Center;
root.AlignItems = YogaAlign.Center;
root.Wrap = YogaWrap.Wrap;
root.Width = 700;
root.Height = 500;
YogaNode root_child0 = new YogaNode(config);
root_child0.Width = 100;
root_child0.Height = 500;
root_child0.MaxHeight = 200;
root.Insert(0, root_child0);
YogaNode root_child1 = new YogaNode(config);
root_child1.MarginLeft = 20;
root_child1.MarginTop = 20;
root_child1.MarginRight = 20;
root_child1.MarginBottom = 20;
root_child1.Width = 200;
root_child1.Height = 200;
root.Insert(1, root_child1);
YogaNode root_child2 = new YogaNode(config);
root_child2.Width = 100;
root_child2.Height = 100;
root.Insert(2, root_child2);
root.StyleDirection = YogaDirection.LTR;
root.CalculateLayout();
Assert.AreEqual(0f, root.LayoutX);
Assert.AreEqual(0f, root.LayoutY);
Assert.AreEqual(700f, root.LayoutWidth);
Assert.AreEqual(500f, root.LayoutHeight);
Assert.AreEqual(250f, root_child0.LayoutX);
Assert.AreEqual(30f, root_child0.LayoutY);
Assert.AreEqual(100f, root_child0.LayoutWidth);
Assert.AreEqual(200f, root_child0.LayoutHeight);
Assert.AreEqual(200f, root_child1.LayoutX);
Assert.AreEqual(250f, root_child1.LayoutY);
Assert.AreEqual(200f, root_child1.LayoutWidth);
Assert.AreEqual(200f, root_child1.LayoutHeight);
Assert.AreEqual(420f, root_child2.LayoutX);
Assert.AreEqual(200f, root_child2.LayoutY);
Assert.AreEqual(100f, root_child2.LayoutWidth);
Assert.AreEqual(100f, root_child2.LayoutHeight);
root.StyleDirection = YogaDirection.RTL;
root.CalculateLayout();
Assert.AreEqual(0f, root.LayoutX);
Assert.AreEqual(0f, root.LayoutY);
Assert.AreEqual(700f, root.LayoutWidth);
Assert.AreEqual(500f, root.LayoutHeight);
Assert.AreEqual(350f, root_child0.LayoutX);
Assert.AreEqual(30f, root_child0.LayoutY);
Assert.AreEqual(100f, root_child0.LayoutWidth);
Assert.AreEqual(200f, root_child0.LayoutHeight);
Assert.AreEqual(300f, root_child1.LayoutX);
Assert.AreEqual(250f, root_child1.LayoutY);
Assert.AreEqual(200f, root_child1.LayoutWidth);
Assert.AreEqual(200f, root_child1.LayoutHeight);
Assert.AreEqual(180f, root_child2.LayoutX);
Assert.AreEqual(200f, root_child2.LayoutY);
Assert.AreEqual(100f, root_child2.LayoutWidth);
Assert.AreEqual(100f, root_child2.LayoutHeight);
}
[Test]
public void Test_wrapped_column_max_height_flex()
{
YogaConfig config = new YogaConfig();
YogaNode root = new YogaNode(config);
root.JustifyContent = YogaJustify.Center;
root.AlignContent = YogaAlign.Center;
root.AlignItems = YogaAlign.Center;
root.Wrap = YogaWrap.Wrap;
root.Width = 700;
root.Height = 500;
YogaNode root_child0 = new YogaNode(config);
root_child0.FlexGrow = 1;
root_child0.FlexShrink = 1;
root_child0.FlexBasis = 0.Percent();
root_child0.Width = 100;
root_child0.Height = 500;
root_child0.MaxHeight = 200;
root.Insert(0, root_child0);
YogaNode root_child1 = new YogaNode(config);
root_child1.FlexGrow = 1;
root_child1.FlexShrink = 1;
root_child1.FlexBasis = 0.Percent();
root_child1.MarginLeft = 20;
root_child1.MarginTop = 20;
root_child1.MarginRight = 20;
root_child1.MarginBottom = 20;
root_child1.Width = 200;
root_child1.Height = 200;
root.Insert(1, root_child1);
YogaNode root_child2 = new YogaNode(config);
root_child2.Width = 100;
root_child2.Height = 100;
root.Insert(2, root_child2);
root.StyleDirection = YogaDirection.LTR;
root.CalculateLayout();
Assert.AreEqual(0f, root.LayoutX);
Assert.AreEqual(0f, root.LayoutY);
Assert.AreEqual(700f, root.LayoutWidth);
Assert.AreEqual(500f, root.LayoutHeight);
Assert.AreEqual(300f, root_child0.LayoutX);
Assert.AreEqual(0f, root_child0.LayoutY);
Assert.AreEqual(100f, root_child0.LayoutWidth);
Assert.AreEqual(180f, root_child0.LayoutHeight);
Assert.AreEqual(250f, root_child1.LayoutX);
Assert.AreEqual(200f, root_child1.LayoutY);
Assert.AreEqual(200f, root_child1.LayoutWidth);
Assert.AreEqual(180f, root_child1.LayoutHeight);
Assert.AreEqual(300f, root_child2.LayoutX);
Assert.AreEqual(400f, root_child2.LayoutY);
Assert.AreEqual(100f, root_child2.LayoutWidth);
Assert.AreEqual(100f, root_child2.LayoutHeight);
root.StyleDirection = YogaDirection.RTL;
root.CalculateLayout();
Assert.AreEqual(0f, root.LayoutX);
Assert.AreEqual(0f, root.LayoutY);
Assert.AreEqual(700f, root.LayoutWidth);
Assert.AreEqual(500f, root.LayoutHeight);
Assert.AreEqual(300f, root_child0.LayoutX);
Assert.AreEqual(0f, root_child0.LayoutY);
Assert.AreEqual(100f, root_child0.LayoutWidth);
Assert.AreEqual(180f, root_child0.LayoutHeight);
Assert.AreEqual(250f, root_child1.LayoutX);
Assert.AreEqual(200f, root_child1.LayoutY);
Assert.AreEqual(200f, root_child1.LayoutWidth);
Assert.AreEqual(180f, root_child1.LayoutHeight);
Assert.AreEqual(300f, root_child2.LayoutX);
Assert.AreEqual(400f, root_child2.LayoutY);
Assert.AreEqual(100f, root_child2.LayoutWidth);
Assert.AreEqual(100f, root_child2.LayoutHeight);
}
} }
} }

View File

@@ -366,7 +366,6 @@ namespace Facebook.Yoga
public void Test_flex_grow_to_min() public void Test_flex_grow_to_min()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.MinFlexFix, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Width = 100; root.Width = 100;
@@ -422,7 +421,6 @@ namespace Facebook.Yoga
public void Test_flex_grow_in_at_most_container() public void Test_flex_grow_in_at_most_container()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.MinFlexFix, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.FlexDirection = YogaFlexDirection.Row; root.FlexDirection = YogaFlexDirection.Row;

View File

@@ -21,7 +21,6 @@ namespace Facebook.Yoga
public void Test_percentage_width_height() public void Test_percentage_width_height()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.FlexDirection = YogaFlexDirection.Row; root.FlexDirection = YogaFlexDirection.Row;
@@ -63,7 +62,6 @@ namespace Facebook.Yoga
public void Test_percentage_position_left_top() public void Test_percentage_position_left_top()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.FlexDirection = YogaFlexDirection.Row; root.FlexDirection = YogaFlexDirection.Row;
@@ -107,7 +105,6 @@ namespace Facebook.Yoga
public void Test_percentage_position_bottom_right() public void Test_percentage_position_bottom_right()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.FlexDirection = YogaFlexDirection.Row; root.FlexDirection = YogaFlexDirection.Row;
@@ -151,7 +148,6 @@ namespace Facebook.Yoga
public void Test_percentage_flex_basis() public void Test_percentage_flex_basis()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.FlexDirection = YogaFlexDirection.Row; root.FlexDirection = YogaFlexDirection.Row;
@@ -208,7 +204,6 @@ namespace Facebook.Yoga
public void Test_percentage_flex_basis_cross() public void Test_percentage_flex_basis_cross()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Width = 200; root.Width = 200;
@@ -264,7 +259,6 @@ namespace Facebook.Yoga
public void Test_percentage_flex_basis_cross_min_height() public void Test_percentage_flex_basis_cross_min_height()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Width = 200; root.Width = 200;
@@ -320,7 +314,6 @@ namespace Facebook.Yoga
public void Test_percentage_flex_basis_main_max_height() public void Test_percentage_flex_basis_main_max_height()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.FlexDirection = YogaFlexDirection.Row; root.FlexDirection = YogaFlexDirection.Row;
@@ -379,7 +372,6 @@ namespace Facebook.Yoga
public void Test_percentage_flex_basis_cross_max_height() public void Test_percentage_flex_basis_cross_max_height()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Width = 200; root.Width = 200;
@@ -437,7 +429,6 @@ namespace Facebook.Yoga
public void Test_percentage_flex_basis_main_max_width() public void Test_percentage_flex_basis_main_max_width()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.FlexDirection = YogaFlexDirection.Row; root.FlexDirection = YogaFlexDirection.Row;
@@ -496,7 +487,6 @@ namespace Facebook.Yoga
public void Test_percentage_flex_basis_cross_max_width() public void Test_percentage_flex_basis_cross_max_width()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Width = 200; root.Width = 200;
@@ -554,7 +544,6 @@ namespace Facebook.Yoga
public void Test_percentage_flex_basis_main_min_width() public void Test_percentage_flex_basis_main_min_width()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.FlexDirection = YogaFlexDirection.Row; root.FlexDirection = YogaFlexDirection.Row;
@@ -613,7 +602,6 @@ namespace Facebook.Yoga
public void Test_percentage_flex_basis_cross_min_width() public void Test_percentage_flex_basis_cross_min_width()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Width = 200; root.Width = 200;
@@ -671,7 +659,6 @@ namespace Facebook.Yoga
public void Test_percentage_multiple_nested_with_padding_margin_and_percentage_values() public void Test_percentage_multiple_nested_with_padding_margin_and_percentage_values()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Width = 200; root.Width = 200;
@@ -781,7 +768,6 @@ namespace Facebook.Yoga
public void Test_percentage_margin_should_calculate_based_only_on_width() public void Test_percentage_margin_should_calculate_based_only_on_width()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Width = 200; root.Width = 200;
@@ -840,7 +826,6 @@ namespace Facebook.Yoga
public void Test_percentage_padding_should_calculate_based_only_on_width() public void Test_percentage_padding_should_calculate_based_only_on_width()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Width = 200; root.Width = 200;
@@ -899,7 +884,6 @@ namespace Facebook.Yoga
public void Test_percentage_absolute_position() public void Test_percentage_absolute_position()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Width = 200; root.Width = 200;
@@ -1063,7 +1047,6 @@ namespace Facebook.Yoga
public void Test_percentage_container_in_wrapping_container() public void Test_percentage_container_in_wrapping_container()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.MinFlexFix, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.JustifyContent = YogaJustify.Center; root.JustifyContent = YogaJustify.Center;

View File

@@ -21,7 +21,6 @@ namespace Facebook.Yoga
public void Test_rounding_flex_basis_flex_grow_row_width_of_100() public void Test_rounding_flex_basis_flex_grow_row_width_of_100()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.FlexDirection = YogaFlexDirection.Row; root.FlexDirection = YogaFlexDirection.Row;
@@ -90,7 +89,6 @@ namespace Facebook.Yoga
public void Test_rounding_flex_basis_flex_grow_row_prime_number_width() public void Test_rounding_flex_basis_flex_grow_row_prime_number_width()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.FlexDirection = YogaFlexDirection.Row; root.FlexDirection = YogaFlexDirection.Row;
@@ -187,7 +185,6 @@ namespace Facebook.Yoga
public void Test_rounding_flex_basis_flex_shrink_row() public void Test_rounding_flex_basis_flex_shrink_row()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.FlexDirection = YogaFlexDirection.Row; root.FlexDirection = YogaFlexDirection.Row;
@@ -257,7 +254,6 @@ namespace Facebook.Yoga
public void Test_rounding_flex_basis_overrides_main_size() public void Test_rounding_flex_basis_overrides_main_size()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Width = 100; root.Width = 100;
@@ -329,7 +325,6 @@ namespace Facebook.Yoga
public void Test_rounding_total_fractial() public void Test_rounding_total_fractial()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Width = 87.4f; root.Width = 87.4f;
@@ -401,7 +396,6 @@ namespace Facebook.Yoga
public void Test_rounding_total_fractial_nested() public void Test_rounding_total_fractial_nested()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Width = 87.4f; root.Width = 87.4f;
@@ -507,7 +501,6 @@ namespace Facebook.Yoga
public void Test_rounding_fractial_input_1() public void Test_rounding_fractial_input_1()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Width = 100; root.Width = 100;
@@ -579,7 +572,6 @@ namespace Facebook.Yoga
public void Test_rounding_fractial_input_2() public void Test_rounding_fractial_input_2()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Width = 100; root.Width = 100;
@@ -651,7 +643,6 @@ namespace Facebook.Yoga
public void Test_rounding_fractial_input_3() public void Test_rounding_fractial_input_3()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Top = 0.3f; root.Top = 0.3f;
@@ -724,7 +715,6 @@ namespace Facebook.Yoga
public void Test_rounding_fractial_input_4() public void Test_rounding_fractial_input_4()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Top = 0.7f; root.Top = 0.7f;
@@ -797,7 +787,6 @@ namespace Facebook.Yoga
public void Test_rounding_inner_node_controversy_horizontal() public void Test_rounding_inner_node_controversy_horizontal()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.FlexDirection = YogaFlexDirection.Row; root.FlexDirection = YogaFlexDirection.Row;
@@ -883,7 +872,6 @@ namespace Facebook.Yoga
public void Test_rounding_inner_node_controversy_vertical() public void Test_rounding_inner_node_controversy_vertical()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.Height = 320; root.Height = 320;
@@ -968,7 +956,6 @@ namespace Facebook.Yoga
public void Test_rounding_inner_node_controversy_combined() public void Test_rounding_inner_node_controversy_combined()
{ {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.SetExperimentalFeatureEnabled(YogaExperimentalFeature.Rounding, true);
YogaNode root = new YogaNode(config); YogaNode root = new YogaNode(config);
root.FlexDirection = YogaFlexDirection.Row; root.FlexDirection = YogaFlexDirection.Row;

View File

@@ -69,6 +69,7 @@ namespace Facebook.Yoga
Assert.AreEqual(YogaFlexDirection.Row, node1.FlexDirection); Assert.AreEqual(YogaFlexDirection.Row, node1.FlexDirection);
} }
#if !UNITY_5_4_OR_NEWER
public static void ForceGC() public static void ForceGC()
{ {
YogaNodeTest.ForceGC(); YogaNodeTest.ForceGC();
@@ -132,5 +133,6 @@ namespace Facebook.Yoga
return node; return node;
} }
#endif
} }
} }

View File

@@ -164,6 +164,14 @@ namespace Facebook.Yoga
return MeasureOutput.Make(123.4f, 81.7f); return MeasureOutput.Make(123.4f, 81.7f);
}); });
node.CalculateLayout(); node.CalculateLayout();
Assert.AreEqual(124.0f, node.LayoutWidth);
Assert.AreEqual(82.0f, node.LayoutHeight);
node = new YogaNode(new YogaConfig{PointScaleFactor = 0});
node.SetMeasureFunction((_, width, widthMode, height, heightMode) => {
return MeasureOutput.Make(123.4f, 81.7f);
});
node.CalculateLayout();
Assert.AreEqual(123.4f, node.LayoutWidth); Assert.AreEqual(123.4f, node.LayoutWidth);
Assert.AreEqual(81.7f, node.LayoutHeight); Assert.AreEqual(81.7f, node.LayoutHeight);
} }
@@ -240,6 +248,26 @@ namespace Facebook.Yoga
Assert.AreEqual(0, child2.LayoutY); Assert.AreEqual(0, child2.LayoutY);
} }
[Test]
public void TestPrintOneNode()
{
YogaNode node = new YogaNode();
node.Width = 100;
node.Height = 120;
node.CalculateLayout();
Assert.AreEqual("<div layout=\"width: 100; height: 120; top: 0; left: 0;\" style=\"width: 100px; height: 120px; \" ></div>", node.Print());
}
[Test]
public void TestPrintWithLogger()
{
YogaNode node = new YogaNode(new YogaConfig{Logger = (c, n, l, m) => {}});
node.Width = 110;
node.Height = 105;
node.CalculateLayout();
Assert.AreEqual("<div layout=\"width: 110; height: 105; top: 0; left: 0;\" style=\"width: 110px; height: 105px; \" ></div>", node.Print());
}
[Test] [Test]
public void TestPrint() public void TestPrint()
{ {
@@ -301,9 +329,10 @@ namespace Facebook.Yoga
Assert.AreEqual(90.Pt(), node4.MaxHeight); Assert.AreEqual(90.Pt(), node4.MaxHeight);
} }
#if !UNITY_5_4_OR_NEWER
public static void ForceGC() public static void ForceGC()
{ {
GC.Collect(GC.MaxGeneration); GC.Collect();
GC.WaitForPendingFinalizers(); GC.WaitForPendingFinalizers();
} }
@@ -430,6 +459,7 @@ namespace Facebook.Yoga
return MeasureOutput.Make(120, 130); return MeasureOutput.Make(120, 130);
}); });
} }
#endif
[Test] [Test]
public void TestLayoutMargin() { public void TestLayoutMargin() {

View File

@@ -24,5 +24,5 @@ ROOT=`buck root|tail -1`
DYLIB=`buck targets --show-output $TARGET|tail -1|awk '{print $2}'` DYLIB=`buck targets --show-output $TARGET|tail -1|awk '{print $2}'`
cp $ROOT/$DYLIB . cp $ROOT/$DYLIB .
mcs -debug -t:library -r:$NUNIT/nunit.framework.dll -out:YogaTest.dll *.cs ../../../csharp/Facebook.Yoga/*cs mcs -debug -d:YOGA_ENABLE_GC_TEST -t:library -r:$NUNIT/nunit.framework.dll -out:YogaTest.dll *.cs ../../../csharp/Facebook.Yoga/*cs
MONO_PATH=$NUNIT mono --arch=64 --debug $NUNIT/nunit-console.exe YogaTest.dll MONO_PATH=$NUNIT mono --arch=64 --debug $NUNIT/nunit-console.exe YogaTest.dll

View File

@@ -140,6 +140,3 @@ PLATFORMS
DEPENDENCIES DEPENDENCIES
github-pages (~> 104) github-pages (~> 104)
BUNDLED WITH
1.14.6

View File

@@ -20,30 +20,30 @@ There is an easy interface to Yoga called `YogaLayout`. This is a view group th
xmlns:yoga="http://schemas.android.com/apk/res-auto" xmlns:yoga="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
yoga:align_items="stretch" yoga:yg_alignItems="stretch"
> >
<YogaLayout <YogaLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/sample_children_background" android:background="@drawable/sample_children_background"
yoga:margin_horizontal="10dp" yoga:yg_marginHorizontal="10dp"
yoga:margin_top="5dp" yoga:yg_marginTop="5dp"
yoga:flex_direction="row" yoga:yg_flexDirection="row"
yoga:align_items="center" yoga:yg_alignItems="center"
> >
<ImageView <ImageView
android:layout_width="50dp" android:layout_width="50dp"
android:layout_height="50dp" android:layout_height="50dp"
android:src="@drawable/ic_launcher" android:src="@drawable/ic_launcher"
yoga:flex="0" yoga:yg_flex="0"
/> />
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/child_1_text" android:text="@string/child_1_text"
android:textColor="@color/children_text" android:textColor="@color/children_text"
yoga:flex="1" yoga:yg_flex="1"
yoga:margin_start="8dp" yoga:yg_marginStart="8dp"
/> />
</YogaLayout> </YogaLayout>
</YogaLayout> </YogaLayout>
@@ -59,7 +59,7 @@ compile 'com.facebook.yoga.android:yoga-layout:1.2.0'
## layout\_width and layout\_height ## layout\_width and layout\_height
If either are set to an actual size (in px or dp etc) then this is taken as a default for `yoga:height` or `yoga:width`. Otherwise they are ignored. If either are set to an actual size (in px or dp etc) then this is taken as a default for `yoga:yg_height` or `yoga:ygWidth`. Otherwise they are ignored.
## VirtualYogaLayout ## VirtualYogaLayout
@@ -67,11 +67,11 @@ Sometimes you will nest `YogaLayout`s within `YogaLayout`s in order to get your
## RTL locales ## RTL locales
RTL locales are supported by default. That is, unless you explicitly set the `yoga:direction="ltr|rtl|inherit"` attribute on a view, it will obtain the locale direction _at runtime_. This means that the layout will rearrange properly, even if the locale changes while your app is running! RTL locales are supported by default. That is, unless you explicitly set the `yoga:yg_direction="ltr|rtl|inherit"` attribute on a view, it will obtain the locale direction At runtime_. This means that the layout will rearrange properly, even if the locale changes while your app is running!
## Attributes ## Attributes
The list of all attributes can be found in [attrs.xml](https://github.com/facebook/yoga/blob/master/android/sample/res/com/facebook/samples/yoga/res/values/attrs.xml), but logically map from the Yoga properties. The list of all attributes can be found in [attrs.xml](https://github.com/facebook/yoga/blob/master/android/src/main/res/values/attrs.xml), but logically map from the Yoga properties.
## Auto margins ## Auto margins

View File

@@ -28,7 +28,7 @@ The following functions help manage the children of a node.
void YGNodeInsertChild(YGNodeRef node, YGNodeRef child, uint32_t index); void YGNodeInsertChild(YGNodeRef node, YGNodeRef child, uint32_t index);
void YGNodeRemoveChild(YGNodeRef node, YGNodeRef child); void YGNodeRemoveChild(YGNodeRef node, YGNodeRef child);
YGNodeRef YGNodeGetChild(YGNodeRef node, uint32_t index); YGNodeRef YGNodeGetChild(YGNodeRef node, uint32_t index);
uint32_t YGNodeChildCount(YGNodeRef node); uint32_t YGNodeGetChildCount(YGNodeRef node);
``` ```
### Style getters & setters ### Style getters & setters

View File

@@ -163,25 +163,25 @@ root.Insert(text, 1);
<YogaLayout <YogaLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
yoga:justify_content="stretch"> yoga:yg_justifyContent="stretch">
<ImageView <ImageView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
yoga:flex="1"/> yoga:yg_flex="1"/>
<VirtualYogaLayout <VirtualYogaLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
yoga:padding_all="20px" yoga:yg_paddingAll="20px"
yoga:flex_direction="row" yoga:yg_flexDirection="row"
yoga:align_items="center"> yoga:yg_alignItems="center">
<ImageView <ImageView
android:layout_width="50dp" android:layout_width="50dp"
android:layout_height="50dp"/> android:layout_height="50dp"/>
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
yoga:flex="1" yoga:yg_flex="1"
yoga:margin_start="20px"/> yoga:yg_marginStart="20px"/>
</VirtualYogaLayout> </VirtualYogaLayout>
</YogaLayout> </YogaLayout>
``` ```

View File

@@ -90,12 +90,11 @@ ENUMS = {
'Info', 'Info',
'Debug', 'Debug',
'Verbose', 'Verbose',
'Fatal',
], ],
'ExperimentalFeature': [ 'ExperimentalFeature': [
'Rounding',
# Mimic web flex-basis behavior. # Mimic web flex-basis behavior.
'WebFlexBasis', 'WebFlexBasis',
'MinFlexFix'
], ],
'PrintOptions': [ 'PrintOptions': [
('Layout', 1), ('Layout', 1),

View File

@@ -167,3 +167,20 @@
<div style="width: 72px; height: 72px;"></div> <div style="width: 72px; height: 72px;"></div>
</div> </div>
</div> </div>
<div id="align_center_should_size_based_on_content" style="width: 100px; height: 100px; align-items: center; margin-top: 20px;">
<div style="flex-grow: 0; flex-shrink: 1; justify-content: center;">
<div style="flex-grow: 1; flex-shrink: 1;">
<div style="width: 20px; height: 20px;"></div>
</div>
</div>
</div>
<div id="align_strech_should_size_based_on_parent" style="width: 100px; height: 100px; align-items: strech; margin-top: 20px;">
<div style="flex-grow: 0; flex-shrink: 1; justify-content: center;">
<div style="flex-grow: 1; flex-shrink: 1;">
<div style="width: 20px; height: 20px;"></div>
</div>
</div>
</div>

View File

@@ -113,3 +113,15 @@
<div style="width: 80px; height: 80px;"></div> <div style="width: 80px; height: 80px;"></div>
</div> </div>
</div> </div>
<div id="wrapped_column_max_height" style="height: 500px; width: 700px; flex-direction: column;align-items: center; justify-content: center; align-content: center; flex-wrap:wrap;">
<div style="width: 100px; height: 500px; max-height: 200px;"></div>
<div style="width: 200px; height: 200px; margin: 20px;"></div>
<div style="width: 100px; height: 100px;"></div>
</div>
<div id="wrapped_column_max_height_flex" style="height: 500px; width: 700px; flex-direction: column;align-items: center; justify-content: center; align-content: center; flex-wrap:wrap;">
<div style="width: 100px; height: 500px; max-height: 200px; flex: 1;"></div>
<div style="width: 200px; height: 200px; margin: 20px; flex: 1"></div>
<div style="width: 100px; height: 100px;"></div>
</div>

View File

@@ -30,12 +30,12 @@
<div style="width: 50px; height: 50px;"></div> <div style="width: 50px; height: 50px;"></div>
</div> </div>
<div id="flex_grow_to_min" experiments="MinFlexFix" style="min-height: 100px; max-height: 500px; width: 100px;"> <div id="flex_grow_to_min" style="min-height: 100px; max-height: 500px; width: 100px;">
<div style="flex-grow: 1; flex-shrink: 1;"></div> <div style="flex-grow: 1; flex-shrink: 1;"></div>
<div style="height: 50px;"></div> <div style="height: 50px;"></div>
</div> </div>
<div id="flex_grow_in_at_most_container" experiments="MinFlexFix" style="width: 100px; height: 100px; background-color: white; flex-direction: row; align-items: flex-start;"> <div id="flex_grow_in_at_most_container" style="width: 100px; height: 100px; background-color: white; flex-direction: row; align-items: flex-start;">
<div style="flex-direction: row;"> <div style="flex-direction: row;">
<div style="flex-grow: 1; flex-basis: 0px;"></div> <div style="flex-grow: 1; flex-basis: 0px;"></div>
</div> </div>

View File

@@ -1,61 +1,61 @@
<div id="percentage_width_height" experiments="Rounding" style="width: 200px; height: 200px; flex-direction: row;"> <div id="percentage_width_height" style="width: 200px; height: 200px; flex-direction: row;">
<div style="width: 30%; height: 30%;"></div> <div style="width: 30%; height: 30%;"></div>
</div> </div>
<div id="percentage_position_left_top" experiments="Rounding" style="width: 400px; height: 400px; flex-direction: row;"> <div id="percentage_position_left_top" style="width: 400px; height: 400px; flex-direction: row;">
<div style="width: 45%; height: 55%; left: 10%; top: 20%"></div> <div style="width: 45%; height: 55%; left: 10%; top: 20%"></div>
</div> </div>
<div id="percentage_position_bottom_right" experiments="Rounding" style="width: 500px; height: 500px; flex-direction: row;"> <div id="percentage_position_bottom_right" style="width: 500px; height: 500px; flex-direction: row;">
<div style="width: 55%; height: 15%; bottom: 10%; right: 20%"></div> <div style="width: 55%; height: 15%; bottom: 10%; right: 20%"></div>
</div> </div>
<div id="percentage_flex_basis" experiments="Rounding" style="width: 200px; height: 200px; flex-direction: row;"> <div id="percentage_flex_basis" style="width: 200px; height: 200px; flex-direction: row;">
<div style="flex-grow: 1; flex-basis: 50%;"></div> <div style="flex-grow: 1; flex-basis: 50%;"></div>
<div style="flex-grow: 1; flex-basis: 25%;"></div> <div style="flex-grow: 1; flex-basis: 25%;"></div>
</div> </div>
<div id="percentage_flex_basis_cross" experiments="Rounding" style="width: 200px; height: 200px; flex-direction: column;"> <div id="percentage_flex_basis_cross" style="width: 200px; height: 200px; flex-direction: column;">
<div style="flex-grow: 1; flex-basis: 50%;"></div> <div style="flex-grow: 1; flex-basis: 50%;"></div>
<div style="flex-grow: 1; flex-basis: 25%;"></div> <div style="flex-grow: 1; flex-basis: 25%;"></div>
</div> </div>
<div id="percentage_flex_basis_cross_min_height" experiments="Rounding" style="width: 200px; height: 200px; flex-direction: column;"> <div id="percentage_flex_basis_cross_min_height" style="width: 200px; height: 200px; flex-direction: column;">
<div style="flex-grow: 1; min-height: 60%;"></div> <div style="flex-grow: 1; min-height: 60%;"></div>
<div style="flex-grow: 2; min-height: 10%;"></div> <div style="flex-grow: 2; min-height: 10%;"></div>
</div> </div>
<div id="percentage_flex_basis_main_max_height" experiments="Rounding" style="width: 200px; height: 200px; flex-direction: row;"> <div id="percentage_flex_basis_main_max_height" style="width: 200px; height: 200px; flex-direction: row;">
<div style="flex-grow: 1; flex-basis: 10%; max-height: 60%;"></div> <div style="flex-grow: 1; flex-basis: 10%; max-height: 60%;"></div>
<div style="flex-grow: 4; flex-basis: 10%; max-height: 20%;"></div> <div style="flex-grow: 4; flex-basis: 10%; max-height: 20%;"></div>
</div> </div>
<div id="percentage_flex_basis_cross_max_height" experiments="Rounding" style="width: 200px; height: 200px; flex-direction: column;"> <div id="percentage_flex_basis_cross_max_height" style="width: 200px; height: 200px; flex-direction: column;">
<div style="flex-grow: 1; flex-basis: 10%; max-height: 60%;"></div> <div style="flex-grow: 1; flex-basis: 10%; max-height: 60%;"></div>
<div style="flex-grow: 4; flex-basis: 10%; max-height: 20%;"></div> <div style="flex-grow: 4; flex-basis: 10%; max-height: 20%;"></div>
</div> </div>
<div id="percentage_flex_basis_main_max_width" experiments="Rounding" style="width: 200px; height: 200px; flex-direction: row;"> <div id="percentage_flex_basis_main_max_width" style="width: 200px; height: 200px; flex-direction: row;">
<div style="flex-grow: 1; flex-basis: 15%; max-width: 60%;"></div> <div style="flex-grow: 1; flex-basis: 15%; max-width: 60%;"></div>
<div style="flex-grow: 4; flex-basis: 10%; max-width: 20%;"></div> <div style="flex-grow: 4; flex-basis: 10%; max-width: 20%;"></div>
</div> </div>
<div id="percentage_flex_basis_cross_max_width" experiments="Rounding" style="width: 200px; height: 200px; flex-direction: column;"> <div id="percentage_flex_basis_cross_max_width" style="width: 200px; height: 200px; flex-direction: column;">
<div style="flex-grow: 1; flex-basis: 10%; max-width: 60%;"></div> <div style="flex-grow: 1; flex-basis: 10%; max-width: 60%;"></div>
<div style="flex-grow: 4; flex-basis: 15%; max-width: 20%;"></div> <div style="flex-grow: 4; flex-basis: 15%; max-width: 20%;"></div>
</div> </div>
<div id="percentage_flex_basis_main_min_width" experiments="Rounding" style="width: 200px; height: 200px; flex-direction: row;"> <div id="percentage_flex_basis_main_min_width" style="width: 200px; height: 200px; flex-direction: row;">
<div style="flex-grow: 1; flex-basis: 15%; min-width: 60%;"></div> <div style="flex-grow: 1; flex-basis: 15%; min-width: 60%;"></div>
<div style="flex-grow: 4; flex-basis: 10%; min-width: 20%;"></div> <div style="flex-grow: 4; flex-basis: 10%; min-width: 20%;"></div>
</div> </div>
<div id="percentage_flex_basis_cross_min_width" experiments="Rounding" style="width: 200px; height: 200px; flex-direction: column;"> <div id="percentage_flex_basis_cross_min_width" style="width: 200px; height: 200px; flex-direction: column;">
<div style="flex-grow: 1; flex-basis: 10%; min-width: 60%;"></div> <div style="flex-grow: 1; flex-basis: 10%; min-width: 60%;"></div>
<div style="flex-grow: 4; flex-basis: 15%; min-width: 20%;"></div> <div style="flex-grow: 4; flex-basis: 15%; min-width: 20%;"></div>
</div> </div>
<div id="percentage_multiple_nested_with_padding_margin_and_percentage_values" experiments="Rounding" style="width: 200px; height: 200px; flex-direction: column;"> <div id="percentage_multiple_nested_with_padding_margin_and_percentage_values" style="width: 200px; height: 200px; flex-direction: column;">
<div style="flex-grow: 1; flex-basis: 10%; min-width: 60%; margin: 5px; padding: 3px;"> <div style="flex-grow: 1; flex-basis: 10%; min-width: 60%; margin: 5px; padding: 3px;">
<div style="width: 50%; margin: 5px; padding: 3%;"> <div style="width: 50%; margin: 5px; padding: 3%;">
<div style="width: 45%; margin: 5%; padding: 3px;"></div> <div style="width: 45%; margin: 5%; padding: 3px;"></div>
@@ -64,19 +64,19 @@
<div style="flex-grow: 4; flex-basis: 15%; min-width: 20%;"></div> <div style="flex-grow: 4; flex-basis: 15%; min-width: 20%;"></div>
</div> </div>
<div id="percentage_margin_should_calculate_based_only_on_width" experiments="Rounding" style="width: 200px; height: 100px;"> <div id="percentage_margin_should_calculate_based_only_on_width" style="width: 200px; height: 100px;">
<div style="flex-grow: 1; margin: 10%;"> <div style="flex-grow: 1; margin: 10%;">
<div style="width: 10px; height: 10px;"></div> <div style="width: 10px; height: 10px;"></div>
</div> </div>
</div> </div>
<div id="percentage_padding_should_calculate_based_only_on_width" experiments="Rounding" style="width: 200px; height: 100px;"> <div id="percentage_padding_should_calculate_based_only_on_width" style="width: 200px; height: 100px;">
<div style="flex-grow: 1; padding: 10%;"> <div style="flex-grow: 1; padding: 10%;">
<div style="width: 10px; height: 10px;"></div> <div style="width: 10px; height: 10px;"></div>
</div> </div>
</div> </div>
<div id="percentage_absolute_position" experiments="Rounding" style="width: 200px; height: 100px;"> <div id="percentage_absolute_position" style="width: 200px; height: 100px;">
<div style="position: absolute; top: 10%; left: 30%; width: 10px; height: 10px;"></div> <div style="position: absolute; top: 10%; left: 30%; width: 10px; height: 10px;"></div>
</div> </div>
@@ -92,7 +92,7 @@
<div style="width: 100px;"></div> <div style="width: 100px;"></div>
</div> </div>
<div id="percentage_container_in_wrapping_container" experiments="MinFlexFix" style="align-items: center; width: 200px; height: 200px; justify-content: center;"> <div id="percentage_container_in_wrapping_container" style="align-items: center; width: 200px; height: 200px; justify-content: center;">
<div> <div>
<div style="alignItems: center; flex-direction: row; justify-content: center; width: 100%;"> <div style="alignItems: center; flex-direction: row; justify-content: center; width: 100%;">
<div style="width: 50px; height: 50px;"></div> <div style="width: 50px; height: 50px;"></div>

View File

@@ -1,10 +1,10 @@
<div id="rounding_flex_basis_flex_grow_row_width_of_100" experiments="Rounding" style="width: 100px; height: 100px; flex-direction: row;"> <div id="rounding_flex_basis_flex_grow_row_width_of_100" style="width: 100px; height: 100px; flex-direction: row;">
<div style="flex-grow: 1;"></div> <div style="flex-grow: 1;"></div>
<div style="flex-grow: 1;"></div> <div style="flex-grow: 1;"></div>
<div style="flex-grow: 1;"></div> <div style="flex-grow: 1;"></div>
</div> </div>
<div id="rounding_flex_basis_flex_grow_row_prime_number_width" experiments="Rounding" style="width: 113px; height: 100px; flex-direction: row;"> <div id="rounding_flex_basis_flex_grow_row_prime_number_width" style="width: 113px; height: 100px; flex-direction: row;">
<div style="flex-grow: 1;"></div> <div style="flex-grow: 1;"></div>
<div style="flex-grow: 1;"></div> <div style="flex-grow: 1;"></div>
<div style="flex-grow: 1;"></div> <div style="flex-grow: 1;"></div>
@@ -12,25 +12,25 @@
<div style="flex-grow: 1;"></div> <div style="flex-grow: 1;"></div>
</div> </div>
<div id="rounding_flex_basis_flex_shrink_row" experiments="Rounding" style="width: 101px; height: 100px; flex-direction: row;"> <div id="rounding_flex_basis_flex_shrink_row" style="width: 101px; height: 100px; flex-direction: row;">
<div style="flex-basis: 100px; flex-shrink: 1;"></div> <div style="flex-basis: 100px; flex-shrink: 1;"></div>
<div style="flex-basis: 25px;"></div> <div style="flex-basis: 25px;"></div>
<div style="flex-basis: 25px;"></div> <div style="flex-basis: 25px;"></div>
</div> </div>
<div id="rounding_flex_basis_overrides_main_size" experiments="Rounding" style="height: 113px; width: 100px;"> <div id="rounding_flex_basis_overrides_main_size" style="height: 113px; width: 100px;">
<div style="height: 20px; flex-grow:1; flex-basis:50px;"></div> <div style="height: 20px; flex-grow:1; flex-basis:50px;"></div>
<div style="height: 10px; flex-grow:1;"></div> <div style="height: 10px; flex-grow:1;"></div>
<div style="height: 10px; flex-grow:1;"></div> <div style="height: 10px; flex-grow:1;"></div>
</div> </div>
<div id="rounding_total_fractial" experiments="Rounding" style="height: 113.4px; width: 87.4px;"> <div id="rounding_total_fractial" style="height: 113.4px; width: 87.4px;">
<div style="height: 20.3px; flex-grow:0.7; flex-basis:50.3px;"></div> <div style="height: 20.3px; flex-grow:0.7; flex-basis:50.3px;"></div>
<div style="height: 10px; flex-grow:1.6;"></div> <div style="height: 10px; flex-grow:1.6;"></div>
<div style="height: 10.7px; flex-grow:1.1;"></div> <div style="height: 10.7px; flex-grow:1.1;"></div>
</div> </div>
<div id="rounding_total_fractial_nested" experiments="Rounding" style="height: 113.4px; width: 87.4px;"> <div id="rounding_total_fractial_nested" style="height: 113.4px; width: 87.4px;">
<div style="height: 20.3px; flex-grow:0.7; flex-basis:50.3px;"> <div style="height: 20.3px; flex-grow:0.7; flex-basis:50.3px;">
<div style="bottom: 13.3px; height: 9.9px; flex-grow:1; flex-basis:0.3px;"></div> <div style="bottom: 13.3px; height: 9.9px; flex-grow:1; flex-basis:0.3px;"></div>
<div style="top: 13.3px; height: 1.1px; flex-grow:4; flex-basis:0.3px;"></div> <div style="top: 13.3px; height: 1.1px; flex-grow:4; flex-basis:0.3px;"></div>
@@ -39,31 +39,31 @@
<div style="height: 10.7px; flex-grow:1.1;"></div> <div style="height: 10.7px; flex-grow:1.1;"></div>
</div> </div>
<div id="rounding_fractial_input_1" experiments="Rounding" style="height: 113.4px; width: 100px;"> <div id="rounding_fractial_input_1" style="height: 113.4px; width: 100px;">
<div style="height: 20px; flex-grow:1; flex-basis:50px;"></div> <div style="height: 20px; flex-grow:1; flex-basis:50px;"></div>
<div style="height: 10px; flex-grow:1;"></div> <div style="height: 10px; flex-grow:1;"></div>
<div style="height: 10px; flex-grow:1;"></div> <div style="height: 10px; flex-grow:1;"></div>
</div> </div>
<div id="rounding_fractial_input_2" experiments="Rounding" style="height: 113.6px; width: 100px;"> <div id="rounding_fractial_input_2" style="height: 113.6px; width: 100px;">
<div style="height: 20px; flex-grow:1; flex-basis:50px;"></div> <div style="height: 20px; flex-grow:1; flex-basis:50px;"></div>
<div style="height: 10px; flex-grow:1;"></div> <div style="height: 10px; flex-grow:1;"></div>
<div style="height: 10px; flex-grow:1;"></div> <div style="height: 10px; flex-grow:1;"></div>
</div> </div>
<div id="rounding_fractial_input_3" experiments="Rounding" style="top: 0.3px; height: 113.4px; width: 100px;"> <div id="rounding_fractial_input_3" style="top: 0.3px; height: 113.4px; width: 100px;">
<div style="height: 20px; flex-grow:1; flex-basis:50px;"></div> <div style="height: 20px; flex-grow:1; flex-basis:50px;"></div>
<div style="height: 10px; flex-grow:1;"></div> <div style="height: 10px; flex-grow:1;"></div>
<div style="height: 10px; flex-grow:1;"></div> <div style="height: 10px; flex-grow:1;"></div>
</div> </div>
<div id="rounding_fractial_input_4" experiments="Rounding" style="top: 0.7px; height: 113.4px; width: 100px;"> <div id="rounding_fractial_input_4" style="top: 0.7px; height: 113.4px; width: 100px;">
<div style="height: 20px; flex-grow:1; flex-basis:50px;"></div> <div style="height: 20px; flex-grow:1; flex-basis:50px;"></div>
<div style="height: 10px; flex-grow:1;"></div> <div style="height: 10px; flex-grow:1;"></div>
<div style="height: 10px; flex-grow:1;"></div> <div style="height: 10px; flex-grow:1;"></div>
</div> </div>
<div id="rounding_inner_node_controversy_horizontal" experiments="Rounding" style="width: 320px; flex-direction: row;"> <div id="rounding_inner_node_controversy_horizontal" style="width: 320px; flex-direction: row;">
<div style="height: 10px; flex-grow:1;"></div> <div style="height: 10px; flex-grow:1;"></div>
<div style="height: 10px; flex-grow:1;"> <div style="height: 10px; flex-grow:1;">
<div style="height: 10px; flex-grow:1;"> <div style="height: 10px; flex-grow:1;">
@@ -72,7 +72,7 @@
<div style="height: 10px; flex-grow:1;"></div> <div style="height: 10px; flex-grow:1;"></div>
</div> </div>
<div id="rounding_inner_node_controversy_vertical" experiments="Rounding" style="height: 320px;"> <div id="rounding_inner_node_controversy_vertical" style="height: 320px;">
<div style="width: 10px; flex-grow:1;"></div> <div style="width: 10px; flex-grow:1;"></div>
<div style="width: 10px; flex-grow:1;"> <div style="width: 10px; flex-grow:1;">
<div style="width: 10px; flex-grow:1;"> <div style="width: 10px; flex-grow:1;">
@@ -81,7 +81,7 @@
<div style="width: 10px; flex-grow:1;"></div> <div style="width: 10px; flex-grow:1;"></div>
</div> </div>
<div id="rounding_inner_node_controversy_combined" experiments="Rounding" style="width: 640px; height: 320px; flex-direction: row;"> <div id="rounding_inner_node_controversy_combined" style="width: 640px; height: 320px; flex-direction: row;">
<div style="height: 100%; flex-grow:1;"></div> <div style="height: 100%; flex-grow:1;"></div>
<div style="height: 100%; flex-grow:1; flex-direction: column;"> <div style="height: 100%; flex-grow:1; flex-direction: column;">
<div style="width: 100%; flex-grow:1;"></div> <div style="width: 100%; flex-grow:1;"></div>

View File

@@ -431,11 +431,6 @@ function getRoundedSize(node) {
function calculateTree(root, roundToPixelGrid) { function calculateTree(root, roundToPixelGrid) {
var rootLayout = []; var rootLayout = [];
// Any occurrence of "Rounding" mark during node tree traverse turns this feature on for whole subtree.
if ((root.getAttribute('experiments') || '').split(' ').indexOf('Rounding') != -1) {
roundToPixelGrid = true;
}
for (var i = 0; i < root.children.length; i++) { for (var i = 0; i < root.children.length; i++) {
var child = root.children[i]; var child = root.children[i];
var layout = { var layout = {
@@ -453,11 +448,9 @@ function calculateTree(root, roundToPixelGrid) {
: [], : [],
}; };
if (roundToPixelGrid) {
var size = getRoundedSize(child); var size = getRoundedSize(child);
layout.width = size.width; layout.width = size.width;
layout.height = size.height; layout.height = size.height;
}
rootLayout.push(layout); rootLayout.push(layout);
} }

View File

@@ -1,4 +1,14 @@
bintrayUsername= # Project-wide Gradle settings.
bintrayApiKey=
bintrayGpgPassword= org.gradle.jvmargs=-Xmx1536M
dryRun=false
VERSION_NAME=1.4.3-SNAPSHOT
POM_URL=https://github.com/facebook/yoga
POM_SCM_URL=https://github.com/facebook/yoga.git
POM_SCM_CONNECTION=scm:git:https://github.com/facebook/yoga.git
POM_SCM_DEV_CONNECTION=scm:git:git@github.com:facebook/yoga.git
POM_LICENSE_NAME=BSD License
POM_LICENSE_URL=https://github.com/facebook/yoga/blob/master/LICENSE
POM_LICENSE_DIST=repo
POM_DEVELOPER_ID=facebook
POM_DEVELOPER_NAME=facebook

View File

@@ -1,92 +0,0 @@
ext {
bintrayUserOrg = 'facebook'
bintrayRepo = 'maven'
siteURL = "https://facebook.github.io/yoga/"
projectLicenses = {
license {
name 'BSD License'
url 'https://github.com/facebook/yoga/blob/master/LICENSE'
distribution 'repo'
}
}
}
def getBintrayUsername() {
return property('bintrayUsername') || System.getenv('BINTRAY_USERNAME')
}
def getBintrayApiKey() {
return property('bintrayApiKey') || System.getenv('BINTRAY_API_KEY')
}
def getBintrayGpgPassword() {
return property('bintrayGpgPassword') || System.getenv('BINTRAY_GPG_PASSWORD')
}
def dryRunOnly() {
return hasProperty('dryRun') ? property('dryRun').toBoolean() : false
}
def pomConfig = {
licenses {
// TODO Can we grab this from above?
license {
name 'BSD License'
url 'https://github.com/facebook/yoga/blob/master/LICENSE'
distribution 'repo'
}
}
}
publishing {
publications {
primaryPublication(MavenPublication) {
groupId group
artifact(sourcesJar)
artifact(javadocJar)
pom.packaging='aar'
pom.withXml {
def root = asNode()
root.appendNode('name', 'Yoga')
root.appendNode('url', siteURL)
root.children().last() + pomConfig
def dependenciesNode = root.appendNode('dependencies')
//Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each
configurations.compile.allDependencies.each {
if(it.group != null && (it.name != null || "unspecified".equals(it.name)) && it.version != null) {
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', it.group)
dependencyNode.appendNode('artifactId', it.name)
dependencyNode.appendNode('version', it.version)
}
}
}
}
}
}
bintray {
user = getBintrayUsername()
key = getBintrayApiKey()
publications = ['primaryPublication']
configurations = ['archives']
pkg {
repo = bintrayRepo
userOrg = bintrayUserOrg
name = project.bintrayName
dryRun = dryRunOnly()
licenses = projectLicenses
override = true
publish = true
publicDownloadNumbers = true
version {
name = project.version
released = new Date()
gpg {
sign = true
passphrase = getBintrayGpgPassword()
}
}
}
}

View File

@@ -0,0 +1,37 @@
// Configure the Android maven publication
apply plugin: 'com.github.dcendents.android-maven'
version = VERSION_NAME
group = GROUP
// Set the .aar / .jar base file name to match the artifact ID
// in case the module has a different name
project.archivesBaseName = POM_ARTIFACT_ID
install {
repositories.mavenInstaller {
// This generates POM.xml with proper parameters
pom.project {
name POM_NAME
artifactId POM_ARTIFACT_ID
packaging POM_PACKAGING
description POM_DESCRIPTION
url projectUrl
scm {
url scmUrl
connection scmConnection
developerConnection scmDeveloperConnection
}
licenses projectLicenses
developers {
developer {
id developerId
name developerName
}
}
}
}
}

View File

@@ -0,0 +1,47 @@
// Android tasks for Javadoc and sources.jar generation
afterEvaluate { project ->
if (POM_PACKAGING == 'aar') {
task androidJavadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
exclude '**/pom.xml'
exclude '**/proguard_annotations.pro'
classpath += files(android.bootClasspath)
}
task androidJavadocJar(type: Jar) {
classifier = 'javadoc'
from androidJavadoc.destinationDir
}
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
android.libraryVariants.all { variant ->
def name = variant.name.capitalize()
task "jar${name}"(type: Jar, dependsOn: variant.javaCompile) {
from variant.javaCompile.destinationDir
}
}
artifacts.add('archives', androidJavadocJar)
artifacts.add('archives', androidSourcesJar)
}
if (POM_PACKAGING == 'jar') {
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = 'sources'
from sourceSets.main.allSource
}
artifacts.add('archives', javadocJar)
artifacts.add('archives', sourcesJar)
}
}

63
gradle/bintray.gradle Normal file
View File

@@ -0,0 +1,63 @@
// Upload to Bintray
apply plugin: 'com.jfrog.bintray'
def getBintrayUsername() {
return project.hasProperty('bintrayUsername') ? property('bintrayUsername') : System.getenv('BINTRAY_USERNAME')
}
def getBintrayApiKey() {
return project.hasProperty('bintrayApiKey') ? property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY')
}
def getBintrayGpgPassword() {
return project.hasProperty('bintrayGpgPassword') ? property('bintrayGpgPassword') : System.getenv('BINTRAY_GPG_PASSWORD')
}
def getMavenCentralUsername() {
return project.hasProperty('mavenCentralUsername') ? property('mavenCentralUsername') : System.getenv('MAVEN_CENTRAL_USERNAME')
}
def getMavenCentralPassword() {
return project.hasProperty('mavenCentralPassword') ? property('mavenCentralPassword') : System.getenv('MAVEN_CENTRAL_PASSWORD')
}
def shouldSyncWithMavenCentral() {
return project.hasProperty('syncWithMavenCentral') ? property('syncWithMavenCentral').toBoolean() : false
}
def dryRunOnly() {
return project.hasProperty('dryRun') ? property('dryRun').toBoolean() : false
}
bintray {
user = getBintrayUsername()
key = getBintrayApiKey()
configurations = ['archives']
pkg {
repo = bintrayRepo
userOrg = bintrayUserOrg
name = bintrayName
desc = bintrayDescription
websiteUrl = projectUrl
issueTrackerUrl = issuesUrl
vcsUrl = scmUrl
licenses = projectLicenses
dryRun = dryRunOnly()
override = true
publish = true
publicDownloadNumbers = true
version {
desc = bintrayDescription
gpg {
sign = true
passphrase = getBintrayGpgPassword()
}
mavenCentralSync {
sync = shouldSyncWithMavenCentral()
user = getMavenCentralUsername()
password = getMavenCentralPassword()
close = '1' // If set to 0, you have to manually click release
}
}
}
}

View File

@@ -0,0 +1,96 @@
/*
* Copyright 2013 Chris Banes
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
apply plugin: 'signing'
version = VERSION_NAME
group = GROUP
def isReleaseBuild() {
return VERSION_NAME.contains('SNAPSHOT') == false
}
def getReleaseRepositoryUrl() {
return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL
: "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
}
def getSnapshotRepositoryUrl() {
return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL
: "https://oss.sonatype.org/content/repositories/snapshots/"
}
def getRepositoryUsername() {
return hasProperty('SONATYPE_NEXUS_USERNAME') ? SONATYPE_NEXUS_USERNAME : ""
}
def getRepositoryPassword() {
return hasProperty('SONATYPE_NEXUS_PASSWORD') ? SONATYPE_NEXUS_PASSWORD : ""
}
afterEvaluate { project ->
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
pom.groupId = GROUP
pom.artifactId = POM_ARTIFACT_ID
pom.version = VERSION_NAME
repository(url: getReleaseRepositoryUrl()) {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}
snapshotRepository(url: getSnapshotRepositoryUrl()) {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}
pom.project {
name POM_NAME
packaging POM_PACKAGING
description POM_DESCRIPTION
url POM_URL
scm {
url POM_SCM_URL
connection POM_SCM_CONNECTION
developerConnection POM_SCM_DEV_CONNECTION
}
licenses {
license {
name POM_LICENSE_NAME
url POM_LICENSE_URL
distribution POM_LICENSE_DIST
}
}
developers {
developer {
id POM_DEVELOPER_ID
name POM_DEVELOPER_NAME
}
}
}
}
}
}
signing {
required { isReleaseBuild() && gradle.taskGraph.hasTask('uploadArchives') }
sign configurations.archives
}
}

View File

@@ -0,0 +1,33 @@
// Set up everything required for releasing on Bintray
ext {
bintrayRepo = 'maven'
bintrayUserOrg = 'facebook'
bintrayName = "${GROUP}:${POM_ARTIFACT_ID}"
bintrayDescription = POM_DESCRIPTION
projectUrl = POM_URL
issuesUrl = 'https://github.com/facebook/yoga/issues'
scmUrl = POM_SCM_URL
scmConnection = POM_SCM_CONNECTION
scmDeveloperConnection = POM_SCM_DEV_CONNECTION
publishedGroupId = GROUP
libraryName = 'yoga'
artifact = 'yoga'
developerId = POM_DEVELOPER_ID
developerName = POM_DEVELOPER_NAME
projectLicenses = {
license {
name = POM_LICENSE_NAME
url = POM_LICENSE_URL
distribution = POM_LICENSE_DIST
}
}
}
// Set up the Android Maven publication (POM etc.)
apply from: rootProject.file('gradle/android-maven-install.gradle')
// Upload to Bintray
apply from: rootProject.file('gradle/bintray.gradle')

8
gradle/release.gradle Normal file
View File

@@ -0,0 +1,8 @@
// Common Android tasks for all releases that generate Javadocs, sources, etc.
apply from: rootProject.file('gradle/android-tasks.gradle')
// Upload to Bintray
apply from: rootProject.file('gradle/release-bintray.gradle')
// Upload directly to standard Maven Central (for SNAPSHOTs)
apply from: rootProject.file('gradle/gradle-mvn-push.gradle')

View File

@@ -3,8 +3,8 @@ apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'maven-publish' apply plugin: 'maven-publish'
version = '1.4.2' group = GROUP
group = 'com.facebook.yoga' version = VERSION_NAME
android { android {
compileSdkVersion rootProject.compileSdkVersion compileSdkVersion rootProject.compileSdkVersion
@@ -73,4 +73,4 @@ ext {
bintrayName = 'com.facebook.yoga:yoga' bintrayName = 'com.facebook.yoga:yoga'
} }
apply from: rootProject.file('gradle/android-jcenter-install.gradle') apply from: rootProject.file('gradle/release.gradle')

View File

@@ -20,6 +20,7 @@ public class YogaConfig {
} }
long mNativePointer; long mNativePointer;
private YogaLogger mLogger;
private native long jni_YGConfigNew(); private native long jni_YGConfigNew();
public YogaConfig() { public YogaConfig() {
@@ -51,4 +52,30 @@ public class YogaConfig {
public void setUseWebDefaults(boolean useWebDefaults) { public void setUseWebDefaults(boolean useWebDefaults) {
jni_YGConfigSetUseWebDefaults(mNativePointer, useWebDefaults); jni_YGConfigSetUseWebDefaults(mNativePointer, useWebDefaults);
} }
private native void jni_YGConfigSetPointScaleFactor(long nativePointer, float pixelsInPoint);
public void setPointScaleFactor(float pixelsInPoint) {
jni_YGConfigSetPointScaleFactor(mNativePointer, pixelsInPoint);
}
private native void jni_YGConfigSetUseLegacyStretchBehaviour(long nativePointer, boolean useLegacyStretchBehaviour);
/**
* Yoga previously had an error where containers would take the maximum space possible instead of the minimum
* like they are supposed to. In practice this resulted in implicit behaviour similar to align-self: stretch;
* Because this was such a long-standing bug we must allow legacy users to switch back to this behaviour.
*/
public void setUseLegacyStretchBehaviour(boolean useLegacyStretchBehaviour) {
jni_YGConfigSetUseLegacyStretchBehaviour(mNativePointer, useLegacyStretchBehaviour);
}
private native void jni_YGConfigSetLogger(long nativePointer, Object logger);
public void setLogger(YogaLogger logger) {
mLogger = logger;
jni_YGConfigSetLogger(mNativePointer, logger);
}
public YogaLogger getLogger() {
return mLogger;
}
} }

View File

@@ -13,9 +13,7 @@ import com.facebook.proguard.annotations.DoNotStrip;
@DoNotStrip @DoNotStrip
public enum YogaExperimentalFeature { public enum YogaExperimentalFeature {
ROUNDING(0), WEB_FLEX_BASIS(0);
WEB_FLEX_BASIS(1),
MIN_FLEX_FIX(2);
private int mIntValue; private int mIntValue;
@@ -29,9 +27,7 @@ public enum YogaExperimentalFeature {
public static YogaExperimentalFeature fromInt(int value) { public static YogaExperimentalFeature fromInt(int value) {
switch (value) { switch (value) {
case 0: return ROUNDING; case 0: return WEB_FLEX_BASIS;
case 1: return WEB_FLEX_BASIS;
case 2: return MIN_FLEX_FIX;
default: throw new IllegalArgumentException("Unknown enum value: " + value); default: throw new IllegalArgumentException("Unknown enum value: " + value);
} }
} }

View File

@@ -17,7 +17,8 @@ public enum YogaLogLevel {
WARN(1), WARN(1),
INFO(2), INFO(2),
DEBUG(3), DEBUG(3),
VERBOSE(4); VERBOSE(4),
FATAL(5);
private int mIntValue; private int mIntValue;
@@ -36,6 +37,7 @@ public enum YogaLogLevel {
case 2: return INFO; case 2: return INFO;
case 3: return DEBUG; case 3: return DEBUG;
case 4: return VERBOSE; case 4: return VERBOSE;
case 5: return FATAL;
default: throw new IllegalArgumentException("Unknown enum value: " + value); default: throw new IllegalArgumentException("Unknown enum value: " + value);
} }
} }

View File

@@ -18,5 +18,5 @@ import com.facebook.proguard.annotations.DoNotStrip;
@DoNotStrip @DoNotStrip
public interface YogaLogger { public interface YogaLogger {
@DoNotStrip @DoNotStrip
void log(YogaLogLevel level, String message); void log(YogaNode node, YogaLogLevel level, String message);
} }

View File

@@ -28,12 +28,6 @@ public class YogaNode {
* Get native instance count. Useful for testing only. * Get native instance count. Useful for testing only.
*/ */
static native int jni_YGNodeGetInstanceCount(); static native int jni_YGNodeGetInstanceCount();
static native void jni_YGLog(int level, String message);
private static native void jni_YGSetLogger(Object logger);
public static void setLogger(YogaLogger logger) {
jni_YGSetLogger(logger);
}
private YogaNode mParent; private YogaNode mParent;
private List<YogaNode> mChildren; private List<YogaNode> mChildren;
@@ -667,4 +661,14 @@ public class YogaNode {
public Object getData() { public Object getData() {
return mData; return mData;
} }
private native void jni_YGNodePrint(long nativePointer);
/**
* Use the set logger (defaults to adb log) to print out the styles, children, and computed
* layout of the tree rooted at this node.
*/
public void print() {
jni_YGNodePrint(mNativePointer);
}
} }

5
java/gradle.properties Normal file
View File

@@ -0,0 +1,5 @@
GROUP=com.facebook.yoga
POM_NAME=Yoga
POM_DESCRIPTION=Java bindings to libyoga
POM_ARTIFACT_ID=yoga
POM_PACKAGING=aar

View File

@@ -14,8 +14,12 @@
using namespace facebook::jni; using namespace facebook::jni;
using namespace std; using namespace std;
static inline weak_ref<jobject> *YGNodeJobject(YGNodeRef node) { struct JYogaNode : public JavaClass<JYogaNode> {
return reinterpret_cast<weak_ref<jobject> *>(YGNodeGetContext(node)); static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaNode;";
};
static inline weak_ref<JYogaNode> *YGNodeJobject(YGNodeRef node) {
return reinterpret_cast<weak_ref<JYogaNode> *>(YGNodeGetContext(node));
} }
static void YGTransferLayoutDirection(YGNodeRef node, alias_ref<jobject> javaNode) { static void YGTransferLayoutDirection(YGNodeRef node, alias_ref<jobject> javaNode) {
@@ -90,7 +94,7 @@ static void YGTransferLayoutOutputsRecursive(YGNodeRef root) {
YGTransferLayoutOutputsRecursive(YGNodeGetChild(root, i)); YGTransferLayoutOutputsRecursive(YGNodeGetChild(root, i));
} }
} else { } else {
YGLog(YGLogLevelError, "Java YGNode was GCed during layout calculation\n"); YGLog(root, YGLogLevelError, "Java YGNode was GCed during layout calculation\n");
} }
} }
} }
@@ -99,7 +103,7 @@ static void YGPrint(YGNodeRef node) {
if (auto obj = YGNodeJobject(node)->lockLocal()) { if (auto obj = YGNodeJobject(node)->lockLocal()) {
cout << obj->toString() << endl; cout << obj->toString() << endl;
} else { } else {
YGLog(YGLogLevelError, "Java YGNode was GCed during layout calculation\n"); YGLog(node, YGLogLevelError, "Java YGNode was GCed during layout calculation\n");
} }
} }
@@ -136,7 +140,7 @@ static YGSize YGJNIMeasureFunc(YGNodeRef node,
return YGSize{*measuredWidth, *measuredHeight}; return YGSize{*measuredWidth, *measuredHeight};
} else { } else {
YGLog(YGLogLevelError, "Java YGNode was GCed during layout calculation\n"); YGLog(node, YGLogLevelError, "Java YGNode was GCed during layout calculation\n");
return YGSize{ return YGSize{
widthMode == YGMeasureModeUndefined ? 0 : width, widthMode == YGMeasureModeUndefined ? 0 : width,
heightMode == YGMeasureModeUndefined ? 0 : height, heightMode == YGMeasureModeUndefined ? 0 : height,
@@ -148,20 +152,28 @@ struct JYogaLogLevel : public JavaClass<JYogaLogLevel> {
static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaLogLevel;"; static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaLogLevel;";
}; };
static global_ref<jobject> *jLogger; static int YGJNILogFunc(const YGConfigRef config,
static int YGLog(YGLogLevel level, const char *format, va_list args) { const YGNodeRef node,
YGLogLevel level,
const char *format,
va_list args) {
char buffer[256]; char buffer[256];
int result = vsnprintf(buffer, sizeof(buffer), format, args); int result = vsnprintf(buffer, sizeof(buffer), format, args);
static auto logFunc = findClassStatic("com/facebook/yoga/YogaLogger") static auto logFunc =
->getMethod<void(local_ref<JYogaLogLevel>, jstring)>("log"); findClassStatic("com/facebook/yoga/YogaLogger")
->getMethod<void(local_ref<JYogaNode>, local_ref<JYogaLogLevel>, jstring)>("log");
static auto logLevelFromInt = static auto logLevelFromInt =
JYogaLogLevel::javaClassStatic()->getStaticMethod<JYogaLogLevel::javaobject(jint)>("fromInt"); JYogaLogLevel::javaClassStatic()->getStaticMethod<JYogaLogLevel::javaobject(jint)>("fromInt");
logFunc(jLogger->get(), if (auto obj = YGNodeJobject(node)->lockLocal()) {
auto jlogger = reinterpret_cast<global_ref<jobject> *>(YGConfigGetContext(config));
logFunc(jlogger->get(),
obj,
logLevelFromInt(JYogaLogLevel::javaClassStatic(), static_cast<jint>(level)), logLevelFromInt(JYogaLogLevel::javaClassStatic(), static_cast<jint>(level)),
Environment::current()->NewStringUTF(buffer)); Environment::current()->NewStringUTF(buffer));
}
return result; return result;
} }
@@ -174,27 +186,6 @@ static inline YGConfigRef _jlong2YGConfigRef(jlong addr) {
return reinterpret_cast<YGConfigRef>(static_cast<intptr_t>(addr)); return reinterpret_cast<YGConfigRef>(static_cast<intptr_t>(addr));
} }
void jni_YGSetLogger(alias_ref<jclass> clazz, alias_ref<jobject> logger) {
if (jLogger) {
jLogger->releaseAlias();
delete jLogger;
}
if (logger) {
jLogger = new global_ref<jobject>(make_global(logger));
YGSetLogger(YGLog);
} else {
jLogger = NULL;
YGSetLogger(NULL);
}
}
void jni_YGLog(alias_ref<jclass> clazz, jint level, jstring message) {
const char *nMessage = Environment::current()->GetStringUTFChars(message, 0);
YGLog(static_cast<YGLogLevel>(level), "%s", nMessage);
Environment::current()->ReleaseStringUTFChars(message, nMessage);
}
jlong jni_YGNodeNew(alias_ref<jobject> thiz) { jlong jni_YGNodeNew(alias_ref<jobject> thiz) {
const YGNodeRef node = YGNodeNew(); const YGNodeRef node = YGNodeNew();
YGNodeSetContext(node, new weak_ref<jobject>(make_weak(thiz))); YGNodeSetContext(node, new weak_ref<jobject>(make_weak(thiz)));
@@ -223,6 +214,13 @@ void jni_YGNodeReset(alias_ref<jobject> thiz, jlong nativePointer) {
YGNodeSetPrintFunc(node, YGPrint); YGNodeSetPrintFunc(node, YGPrint);
} }
void jni_YGNodePrint(alias_ref<jobject> thiz, jlong nativePointer) {
const YGNodeRef node = _jlong2YGNodeRef(nativePointer);
YGNodePrint(node,
(YGPrintOptions)(YGPrintOptionsStyle | YGPrintOptionsLayout |
YGPrintOptionsChildren));
}
void jni_YGNodeInsertChild(alias_ref<jobject>, jlong nativePointer, jlong childPointer, jint index) { void jni_YGNodeInsertChild(alias_ref<jobject>, jlong nativePointer, jlong childPointer, jint index) {
YGNodeInsertChild(_jlong2YGNodeRef(nativePointer), _jlong2YGNodeRef(childPointer), index); YGNodeInsertChild(_jlong2YGNodeRef(nativePointer), _jlong2YGNodeRef(childPointer), index);
} }
@@ -388,16 +386,56 @@ void jni_YGConfigFree(alias_ref<jobject>, jlong nativePointer) {
YGConfigFree(config); YGConfigFree(config);
} }
void jni_YGConfigSetExperimentalFeatureEnabled(alias_ref<jobject>, jlong nativePointer, jint feature, jboolean enabled) { void jni_YGConfigSetExperimentalFeatureEnabled(alias_ref<jobject>,
jlong nativePointer,
jint feature,
jboolean enabled) {
const YGConfigRef config = _jlong2YGConfigRef(nativePointer); const YGConfigRef config = _jlong2YGConfigRef(nativePointer);
YGConfigSetExperimentalFeatureEnabled(config, static_cast<YGExperimentalFeature>(feature), enabled); YGConfigSetExperimentalFeatureEnabled(config,
static_cast<YGExperimentalFeature>(feature),
enabled);
} }
void jni_YGConfigSetUseWebDefaults(alias_ref<jobject>, jlong nativePointer, jboolean useWebDefaults) { void jni_YGConfigSetUseWebDefaults(alias_ref<jobject>,
jlong nativePointer,
jboolean useWebDefaults) {
const YGConfigRef config = _jlong2YGConfigRef(nativePointer); const YGConfigRef config = _jlong2YGConfigRef(nativePointer);
YGConfigSetUseWebDefaults(config, useWebDefaults); YGConfigSetUseWebDefaults(config, useWebDefaults);
} }
void jni_YGConfigSetPointScaleFactor(alias_ref<jobject>,
jlong nativePointer,
jfloat pixelsInPoint) {
const YGConfigRef config = _jlong2YGConfigRef(nativePointer);
YGConfigSetPointScaleFactor(config, pixelsInPoint);
}
void jni_YGConfigSetUseLegacyStretchBehaviour(alias_ref<jobject>,
jlong nativePointer,
jboolean useLegacyStretchBehaviour) {
const YGConfigRef config = _jlong2YGConfigRef(nativePointer);
YGConfigSetUseLegacyStretchBehaviour(config, useLegacyStretchBehaviour);
}
void jni_YGConfigSetLogger(alias_ref<jobject>, jlong nativePointer, alias_ref<jobject> logger) {
const YGConfigRef config = _jlong2YGConfigRef(nativePointer);
auto context = YGConfigGetContext(config);
if (context) {
auto jlogger = reinterpret_cast<global_ref<jobject> *>(context);
jlogger->releaseAlias();
delete jlogger;
}
if (logger) {
YGConfigSetContext(config, new global_ref<jobject>(make_global(logger)));
YGConfigSetLogger(config, YGJNILogFunc);
} else {
YGConfigSetContext(config, NULL);
YGConfigSetLogger(config, NULL);
}
}
jint jni_YGNodeGetInstanceCount(alias_ref<jclass> clazz) { jint jni_YGNodeGetInstanceCount(alias_ref<jclass> clazz) {
return YGNodeGetInstanceCount(); return YGNodeGetInstanceCount();
} }
@@ -483,8 +521,7 @@ jint JNI_OnLoad(JavaVM *vm, void *) {
YGMakeNativeMethod(jni_YGNodeStyleGetAspectRatio), YGMakeNativeMethod(jni_YGNodeStyleGetAspectRatio),
YGMakeNativeMethod(jni_YGNodeStyleSetAspectRatio), YGMakeNativeMethod(jni_YGNodeStyleSetAspectRatio),
YGMakeNativeMethod(jni_YGNodeGetInstanceCount), YGMakeNativeMethod(jni_YGNodeGetInstanceCount),
YGMakeNativeMethod(jni_YGSetLogger), YGMakeNativeMethod(jni_YGNodePrint),
YGMakeNativeMethod(jni_YGLog),
}); });
registerNatives("com/facebook/yoga/YogaConfig", registerNatives("com/facebook/yoga/YogaConfig",
{ {
@@ -492,6 +529,9 @@ jint JNI_OnLoad(JavaVM *vm, void *) {
YGMakeNativeMethod(jni_YGConfigFree), YGMakeNativeMethod(jni_YGConfigFree),
YGMakeNativeMethod(jni_YGConfigSetExperimentalFeatureEnabled), YGMakeNativeMethod(jni_YGConfigSetExperimentalFeatureEnabled),
YGMakeNativeMethod(jni_YGConfigSetUseWebDefaults), YGMakeNativeMethod(jni_YGConfigSetUseWebDefaults),
YGMakeNativeMethod(jni_YGConfigSetPointScaleFactor),
YGMakeNativeMethod(jni_YGConfigSetUseLegacyStretchBehaviour),
YGMakeNativeMethod(jni_YGConfigSetLogger),
}); });
}); });
} }

View File

@@ -1791,4 +1791,145 @@ public class YGAlignItemsTest {
assertEquals(72f, root_child0_child0.getLayoutHeight(), 0.0f); assertEquals(72f, root_child0_child0.getLayoutHeight(), 0.0f);
} }
@Test
public void test_align_center_should_size_based_on_content() {
YogaConfig config = new YogaConfig();
final YogaNode root = new YogaNode(config);
root.setAlignItems(YogaAlign.CENTER);
root.setMargin(YogaEdge.TOP, 20f);
root.setWidth(100f);
root.setHeight(100f);
final YogaNode root_child0 = new YogaNode(config);
root_child0.setJustifyContent(YogaJustify.CENTER);
root_child0.setFlexShrink(1f);
root.addChildAt(root_child0, 0);
final YogaNode root_child0_child0 = new YogaNode(config);
root_child0_child0.setFlexGrow(1f);
root_child0_child0.setFlexShrink(1f);
root_child0.addChildAt(root_child0_child0, 0);
final YogaNode root_child0_child0_child0 = new YogaNode(config);
root_child0_child0_child0.setWidth(20f);
root_child0_child0_child0.setHeight(20f);
root_child0_child0.addChildAt(root_child0_child0_child0, 0);
root.setDirection(YogaDirection.LTR);
root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED);
assertEquals(0f, root.getLayoutX(), 0.0f);
assertEquals(20f, root.getLayoutY(), 0.0f);
assertEquals(100f, root.getLayoutWidth(), 0.0f);
assertEquals(100f, root.getLayoutHeight(), 0.0f);
assertEquals(40f, root_child0.getLayoutX(), 0.0f);
assertEquals(0f, root_child0.getLayoutY(), 0.0f);
assertEquals(20f, root_child0.getLayoutWidth(), 0.0f);
assertEquals(20f, root_child0.getLayoutHeight(), 0.0f);
assertEquals(0f, root_child0_child0.getLayoutX(), 0.0f);
assertEquals(0f, root_child0_child0.getLayoutY(), 0.0f);
assertEquals(20f, root_child0_child0.getLayoutWidth(), 0.0f);
assertEquals(20f, 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(20f, root_child0_child0_child0.getLayoutWidth(), 0.0f);
assertEquals(20f, root_child0_child0_child0.getLayoutHeight(), 0.0f);
root.setDirection(YogaDirection.RTL);
root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED);
assertEquals(0f, root.getLayoutX(), 0.0f);
assertEquals(20f, root.getLayoutY(), 0.0f);
assertEquals(100f, root.getLayoutWidth(), 0.0f);
assertEquals(100f, root.getLayoutHeight(), 0.0f);
assertEquals(40f, root_child0.getLayoutX(), 0.0f);
assertEquals(0f, root_child0.getLayoutY(), 0.0f);
assertEquals(20f, root_child0.getLayoutWidth(), 0.0f);
assertEquals(20f, root_child0.getLayoutHeight(), 0.0f);
assertEquals(0f, root_child0_child0.getLayoutX(), 0.0f);
assertEquals(0f, root_child0_child0.getLayoutY(), 0.0f);
assertEquals(20f, root_child0_child0.getLayoutWidth(), 0.0f);
assertEquals(20f, 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(20f, root_child0_child0_child0.getLayoutWidth(), 0.0f);
assertEquals(20f, root_child0_child0_child0.getLayoutHeight(), 0.0f);
}
@Test
public void test_align_strech_should_size_based_on_parent() {
YogaConfig config = new YogaConfig();
final YogaNode root = new YogaNode(config);
root.setMargin(YogaEdge.TOP, 20f);
root.setWidth(100f);
root.setHeight(100f);
final YogaNode root_child0 = new YogaNode(config);
root_child0.setJustifyContent(YogaJustify.CENTER);
root_child0.setFlexShrink(1f);
root.addChildAt(root_child0, 0);
final YogaNode root_child0_child0 = new YogaNode(config);
root_child0_child0.setFlexGrow(1f);
root_child0_child0.setFlexShrink(1f);
root_child0.addChildAt(root_child0_child0, 0);
final YogaNode root_child0_child0_child0 = new YogaNode(config);
root_child0_child0_child0.setWidth(20f);
root_child0_child0_child0.setHeight(20f);
root_child0_child0.addChildAt(root_child0_child0_child0, 0);
root.setDirection(YogaDirection.LTR);
root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED);
assertEquals(0f, root.getLayoutX(), 0.0f);
assertEquals(20f, root.getLayoutY(), 0.0f);
assertEquals(100f, root.getLayoutWidth(), 0.0f);
assertEquals(100f, root.getLayoutHeight(), 0.0f);
assertEquals(0f, root_child0.getLayoutX(), 0.0f);
assertEquals(0f, root_child0.getLayoutY(), 0.0f);
assertEquals(100f, root_child0.getLayoutWidth(), 0.0f);
assertEquals(20f, root_child0.getLayoutHeight(), 0.0f);
assertEquals(0f, root_child0_child0.getLayoutX(), 0.0f);
assertEquals(0f, root_child0_child0.getLayoutY(), 0.0f);
assertEquals(100f, root_child0_child0.getLayoutWidth(), 0.0f);
assertEquals(20f, 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(20f, root_child0_child0_child0.getLayoutWidth(), 0.0f);
assertEquals(20f, root_child0_child0_child0.getLayoutHeight(), 0.0f);
root.setDirection(YogaDirection.RTL);
root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED);
assertEquals(0f, root.getLayoutX(), 0.0f);
assertEquals(20f, root.getLayoutY(), 0.0f);
assertEquals(100f, root.getLayoutWidth(), 0.0f);
assertEquals(100f, root.getLayoutHeight(), 0.0f);
assertEquals(0f, root_child0.getLayoutX(), 0.0f);
assertEquals(0f, root_child0.getLayoutY(), 0.0f);
assertEquals(100f, root_child0.getLayoutWidth(), 0.0f);
assertEquals(20f, root_child0.getLayoutHeight(), 0.0f);
assertEquals(0f, root_child0_child0.getLayoutX(), 0.0f);
assertEquals(0f, root_child0_child0.getLayoutY(), 0.0f);
assertEquals(100f, root_child0_child0.getLayoutWidth(), 0.0f);
assertEquals(20f, root_child0_child0.getLayoutHeight(), 0.0f);
assertEquals(80f, root_child0_child0_child0.getLayoutX(), 0.0f);
assertEquals(0f, root_child0_child0_child0.getLayoutY(), 0.0f);
assertEquals(20f, root_child0_child0_child0.getLayoutWidth(), 0.0f);
assertEquals(20f, root_child0_child0_child0.getLayoutHeight(), 0.0f);
}
} }

View File

@@ -1364,4 +1364,166 @@ public class YGFlexWrapTest {
assertEquals(80f, root_child0_child1.getLayoutHeight(), 0.0f); assertEquals(80f, root_child0_child1.getLayoutHeight(), 0.0f);
} }
@Test
public void test_wrapped_column_max_height() {
YogaConfig config = new YogaConfig();
final YogaNode root = new YogaNode(config);
root.setJustifyContent(YogaJustify.CENTER);
root.setAlignContent(YogaAlign.CENTER);
root.setAlignItems(YogaAlign.CENTER);
root.setWrap(YogaWrap.WRAP);
root.setWidth(700f);
root.setHeight(500f);
final YogaNode root_child0 = new YogaNode(config);
root_child0.setWidth(100f);
root_child0.setHeight(500f);
root_child0.setMaxHeight(200f);
root.addChildAt(root_child0, 0);
final YogaNode root_child1 = new YogaNode(config);
root_child1.setMargin(YogaEdge.LEFT, 20f);
root_child1.setMargin(YogaEdge.TOP, 20f);
root_child1.setMargin(YogaEdge.RIGHT, 20f);
root_child1.setMargin(YogaEdge.BOTTOM, 20f);
root_child1.setWidth(200f);
root_child1.setHeight(200f);
root.addChildAt(root_child1, 1);
final YogaNode root_child2 = new YogaNode(config);
root_child2.setWidth(100f);
root_child2.setHeight(100f);
root.addChildAt(root_child2, 2);
root.setDirection(YogaDirection.LTR);
root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED);
assertEquals(0f, root.getLayoutX(), 0.0f);
assertEquals(0f, root.getLayoutY(), 0.0f);
assertEquals(700f, root.getLayoutWidth(), 0.0f);
assertEquals(500f, root.getLayoutHeight(), 0.0f);
assertEquals(250f, root_child0.getLayoutX(), 0.0f);
assertEquals(30f, root_child0.getLayoutY(), 0.0f);
assertEquals(100f, root_child0.getLayoutWidth(), 0.0f);
assertEquals(200f, root_child0.getLayoutHeight(), 0.0f);
assertEquals(200f, root_child1.getLayoutX(), 0.0f);
assertEquals(250f, root_child1.getLayoutY(), 0.0f);
assertEquals(200f, root_child1.getLayoutWidth(), 0.0f);
assertEquals(200f, root_child1.getLayoutHeight(), 0.0f);
assertEquals(420f, root_child2.getLayoutX(), 0.0f);
assertEquals(200f, root_child2.getLayoutY(), 0.0f);
assertEquals(100f, root_child2.getLayoutWidth(), 0.0f);
assertEquals(100f, root_child2.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(700f, root.getLayoutWidth(), 0.0f);
assertEquals(500f, root.getLayoutHeight(), 0.0f);
assertEquals(350f, root_child0.getLayoutX(), 0.0f);
assertEquals(30f, root_child0.getLayoutY(), 0.0f);
assertEquals(100f, root_child0.getLayoutWidth(), 0.0f);
assertEquals(200f, root_child0.getLayoutHeight(), 0.0f);
assertEquals(300f, root_child1.getLayoutX(), 0.0f);
assertEquals(250f, root_child1.getLayoutY(), 0.0f);
assertEquals(200f, root_child1.getLayoutWidth(), 0.0f);
assertEquals(200f, root_child1.getLayoutHeight(), 0.0f);
assertEquals(180f, root_child2.getLayoutX(), 0.0f);
assertEquals(200f, root_child2.getLayoutY(), 0.0f);
assertEquals(100f, root_child2.getLayoutWidth(), 0.0f);
assertEquals(100f, root_child2.getLayoutHeight(), 0.0f);
}
@Test
public void test_wrapped_column_max_height_flex() {
YogaConfig config = new YogaConfig();
final YogaNode root = new YogaNode(config);
root.setJustifyContent(YogaJustify.CENTER);
root.setAlignContent(YogaAlign.CENTER);
root.setAlignItems(YogaAlign.CENTER);
root.setWrap(YogaWrap.WRAP);
root.setWidth(700f);
root.setHeight(500f);
final YogaNode root_child0 = new YogaNode(config);
root_child0.setFlexGrow(1f);
root_child0.setFlexShrink(1f);
root_child0.setFlexBasisPercent(0f);
root_child0.setWidth(100f);
root_child0.setHeight(500f);
root_child0.setMaxHeight(200f);
root.addChildAt(root_child0, 0);
final YogaNode root_child1 = new YogaNode(config);
root_child1.setFlexGrow(1f);
root_child1.setFlexShrink(1f);
root_child1.setFlexBasisPercent(0f);
root_child1.setMargin(YogaEdge.LEFT, 20f);
root_child1.setMargin(YogaEdge.TOP, 20f);
root_child1.setMargin(YogaEdge.RIGHT, 20f);
root_child1.setMargin(YogaEdge.BOTTOM, 20f);
root_child1.setWidth(200f);
root_child1.setHeight(200f);
root.addChildAt(root_child1, 1);
final YogaNode root_child2 = new YogaNode(config);
root_child2.setWidth(100f);
root_child2.setHeight(100f);
root.addChildAt(root_child2, 2);
root.setDirection(YogaDirection.LTR);
root.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED);
assertEquals(0f, root.getLayoutX(), 0.0f);
assertEquals(0f, root.getLayoutY(), 0.0f);
assertEquals(700f, root.getLayoutWidth(), 0.0f);
assertEquals(500f, root.getLayoutHeight(), 0.0f);
assertEquals(300f, root_child0.getLayoutX(), 0.0f);
assertEquals(0f, root_child0.getLayoutY(), 0.0f);
assertEquals(100f, root_child0.getLayoutWidth(), 0.0f);
assertEquals(180f, root_child0.getLayoutHeight(), 0.0f);
assertEquals(250f, root_child1.getLayoutX(), 0.0f);
assertEquals(200f, root_child1.getLayoutY(), 0.0f);
assertEquals(200f, root_child1.getLayoutWidth(), 0.0f);
assertEquals(180f, root_child1.getLayoutHeight(), 0.0f);
assertEquals(300f, root_child2.getLayoutX(), 0.0f);
assertEquals(400f, root_child2.getLayoutY(), 0.0f);
assertEquals(100f, root_child2.getLayoutWidth(), 0.0f);
assertEquals(100f, root_child2.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(700f, root.getLayoutWidth(), 0.0f);
assertEquals(500f, root.getLayoutHeight(), 0.0f);
assertEquals(300f, root_child0.getLayoutX(), 0.0f);
assertEquals(0f, root_child0.getLayoutY(), 0.0f);
assertEquals(100f, root_child0.getLayoutWidth(), 0.0f);
assertEquals(180f, root_child0.getLayoutHeight(), 0.0f);
assertEquals(250f, root_child1.getLayoutX(), 0.0f);
assertEquals(200f, root_child1.getLayoutY(), 0.0f);
assertEquals(200f, root_child1.getLayoutWidth(), 0.0f);
assertEquals(180f, root_child1.getLayoutHeight(), 0.0f);
assertEquals(300f, root_child2.getLayoutX(), 0.0f);
assertEquals(400f, root_child2.getLayoutY(), 0.0f);
assertEquals(100f, root_child2.getLayoutWidth(), 0.0f);
assertEquals(100f, root_child2.getLayoutHeight(), 0.0f);
}
} }

View File

@@ -357,7 +357,6 @@ public class YGMinMaxDimensionTest {
@Test @Test
public void test_flex_grow_to_min() { public void test_flex_grow_to_min() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.MIN_FLEX_FIX, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setWidth(100f); root.setWidth(100f);
@@ -412,7 +411,6 @@ public class YGMinMaxDimensionTest {
@Test @Test
public void test_flex_grow_in_at_most_container() { public void test_flex_grow_in_at_most_container() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.MIN_FLEX_FIX, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setFlexDirection(YogaFlexDirection.ROW); root.setFlexDirection(YogaFlexDirection.ROW);

View File

@@ -19,7 +19,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_width_height() { public void test_percentage_width_height() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setFlexDirection(YogaFlexDirection.ROW); root.setFlexDirection(YogaFlexDirection.ROW);
@@ -60,7 +59,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_position_left_top() { public void test_percentage_position_left_top() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setFlexDirection(YogaFlexDirection.ROW); root.setFlexDirection(YogaFlexDirection.ROW);
@@ -103,7 +101,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_position_bottom_right() { public void test_percentage_position_bottom_right() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setFlexDirection(YogaFlexDirection.ROW); root.setFlexDirection(YogaFlexDirection.ROW);
@@ -146,7 +143,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_flex_basis() { public void test_percentage_flex_basis() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setFlexDirection(YogaFlexDirection.ROW); root.setFlexDirection(YogaFlexDirection.ROW);
@@ -202,7 +198,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_flex_basis_cross() { public void test_percentage_flex_basis_cross() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setWidth(200f); root.setWidth(200f);
@@ -257,7 +252,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_flex_basis_cross_min_height() { public void test_percentage_flex_basis_cross_min_height() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setWidth(200f); root.setWidth(200f);
@@ -312,7 +306,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_flex_basis_main_max_height() { public void test_percentage_flex_basis_main_max_height() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setFlexDirection(YogaFlexDirection.ROW); root.setFlexDirection(YogaFlexDirection.ROW);
@@ -370,7 +363,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_flex_basis_cross_max_height() { public void test_percentage_flex_basis_cross_max_height() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setWidth(200f); root.setWidth(200f);
@@ -427,7 +419,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_flex_basis_main_max_width() { public void test_percentage_flex_basis_main_max_width() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setFlexDirection(YogaFlexDirection.ROW); root.setFlexDirection(YogaFlexDirection.ROW);
@@ -485,7 +476,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_flex_basis_cross_max_width() { public void test_percentage_flex_basis_cross_max_width() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setWidth(200f); root.setWidth(200f);
@@ -542,7 +532,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_flex_basis_main_min_width() { public void test_percentage_flex_basis_main_min_width() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setFlexDirection(YogaFlexDirection.ROW); root.setFlexDirection(YogaFlexDirection.ROW);
@@ -600,7 +589,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_flex_basis_cross_min_width() { public void test_percentage_flex_basis_cross_min_width() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setWidth(200f); root.setWidth(200f);
@@ -657,7 +645,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_multiple_nested_with_padding_margin_and_percentage_values() { public void test_percentage_multiple_nested_with_padding_margin_and_percentage_values() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setWidth(200f); root.setWidth(200f);
@@ -766,7 +753,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_margin_should_calculate_based_only_on_width() { public void test_percentage_margin_should_calculate_based_only_on_width() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setWidth(200f); root.setWidth(200f);
@@ -824,7 +810,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_padding_should_calculate_based_only_on_width() { public void test_percentage_padding_should_calculate_based_only_on_width() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setWidth(200f); root.setWidth(200f);
@@ -882,7 +867,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_absolute_position() { public void test_percentage_absolute_position() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setWidth(200f); root.setWidth(200f);
@@ -1043,7 +1027,6 @@ public class YGPercentageTest {
@Test @Test
public void test_percentage_container_in_wrapping_container() { public void test_percentage_container_in_wrapping_container() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.MIN_FLEX_FIX, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setJustifyContent(YogaJustify.CENTER); root.setJustifyContent(YogaJustify.CENTER);

View File

@@ -19,7 +19,6 @@ public class YGRoundingTest {
@Test @Test
public void test_rounding_flex_basis_flex_grow_row_width_of_100() { public void test_rounding_flex_basis_flex_grow_row_width_of_100() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setFlexDirection(YogaFlexDirection.ROW); root.setFlexDirection(YogaFlexDirection.ROW);
@@ -87,7 +86,6 @@ public class YGRoundingTest {
@Test @Test
public void test_rounding_flex_basis_flex_grow_row_prime_number_width() { public void test_rounding_flex_basis_flex_grow_row_prime_number_width() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setFlexDirection(YogaFlexDirection.ROW); root.setFlexDirection(YogaFlexDirection.ROW);
@@ -183,7 +181,6 @@ public class YGRoundingTest {
@Test @Test
public void test_rounding_flex_basis_flex_shrink_row() { public void test_rounding_flex_basis_flex_shrink_row() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setFlexDirection(YogaFlexDirection.ROW); root.setFlexDirection(YogaFlexDirection.ROW);
@@ -252,7 +249,6 @@ public class YGRoundingTest {
@Test @Test
public void test_rounding_flex_basis_overrides_main_size() { public void test_rounding_flex_basis_overrides_main_size() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setWidth(100f); root.setWidth(100f);
@@ -323,7 +319,6 @@ public class YGRoundingTest {
@Test @Test
public void test_rounding_total_fractial() { public void test_rounding_total_fractial() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setWidth(87.4f); root.setWidth(87.4f);
@@ -394,7 +389,6 @@ public class YGRoundingTest {
@Test @Test
public void test_rounding_total_fractial_nested() { public void test_rounding_total_fractial_nested() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setWidth(87.4f); root.setWidth(87.4f);
@@ -499,7 +493,6 @@ public class YGRoundingTest {
@Test @Test
public void test_rounding_fractial_input_1() { public void test_rounding_fractial_input_1() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setWidth(100f); root.setWidth(100f);
@@ -570,7 +563,6 @@ public class YGRoundingTest {
@Test @Test
public void test_rounding_fractial_input_2() { public void test_rounding_fractial_input_2() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setWidth(100f); root.setWidth(100f);
@@ -641,7 +633,6 @@ public class YGRoundingTest {
@Test @Test
public void test_rounding_fractial_input_3() { public void test_rounding_fractial_input_3() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setPosition(YogaEdge.TOP, 0.3f); root.setPosition(YogaEdge.TOP, 0.3f);
@@ -713,7 +704,6 @@ public class YGRoundingTest {
@Test @Test
public void test_rounding_fractial_input_4() { public void test_rounding_fractial_input_4() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setPosition(YogaEdge.TOP, 0.7f); root.setPosition(YogaEdge.TOP, 0.7f);
@@ -785,7 +775,6 @@ public class YGRoundingTest {
@Test @Test
public void test_rounding_inner_node_controversy_horizontal() { public void test_rounding_inner_node_controversy_horizontal() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setFlexDirection(YogaFlexDirection.ROW); root.setFlexDirection(YogaFlexDirection.ROW);
@@ -870,7 +859,6 @@ public class YGRoundingTest {
@Test @Test
public void test_rounding_inner_node_controversy_vertical() { public void test_rounding_inner_node_controversy_vertical() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setHeight(320f); root.setHeight(320f);
@@ -954,7 +942,6 @@ public class YGRoundingTest {
@Test @Test
public void test_rounding_inner_node_controversy_combined() { public void test_rounding_inner_node_controversy_combined() {
YogaConfig config = new YogaConfig(); YogaConfig config = new YogaConfig();
config.setExperimentalFeatureEnabled(YogaExperimentalFeature.ROUNDING, true);
final YogaNode root = new YogaNode(config); final YogaNode root = new YogaNode(config);
root.setFlexDirection(YogaFlexDirection.ROW); root.setFlexDirection(YogaFlexDirection.ROW);

View File

@@ -84,8 +84,8 @@ public class YogaNodeTest {
} }
}); });
node.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); node.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED);
assertEquals(100.5f, node.getLayoutWidth(), 0.0f); assertEquals(101f, node.getLayoutWidth(), 0.01f);
assertEquals(100.5f, node.getLayoutHeight(), 0.0f); assertEquals(101f, node.getLayoutHeight(), 0.01f);
} }
@Test @Test
@@ -102,8 +102,8 @@ public class YogaNodeTest {
} }
}); });
node.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); node.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED);
assertEquals(Float.MIN_VALUE, node.getLayoutWidth(), 0.0f); assertEquals(Float.MIN_VALUE, node.getLayoutWidth(), 0.01f);
assertEquals(Float.MIN_VALUE, node.getLayoutHeight(), 0.0f); assertEquals(Float.MIN_VALUE, node.getLayoutHeight(), 0.01f);
} }
@Test @Test
@@ -120,40 +120,8 @@ public class YogaNodeTest {
} }
}); });
node.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED); node.calculateLayout(YogaConstants.UNDEFINED, YogaConstants.UNDEFINED);
assertEquals(Float.MAX_VALUE, node.getLayoutWidth(), 0.0f); assertEquals(Float.MAX_VALUE, node.getLayoutWidth(), 0.01f);
assertEquals(Float.MAX_VALUE, node.getLayoutHeight(), 0.0f); assertEquals(Float.MAX_VALUE, node.getLayoutHeight(), 0.01f);
}
private YogaLogLevel mLogLevel;
private String mLogMessage;
@Test
public void testLogger() {
YogaNode.setLogger(new YogaLogger() {
public void log(YogaLogLevel level, String message) {
mLogLevel = level;
mLogMessage = message;
}
});
YogaNode.jni_YGLog(YogaLogLevel.DEBUG.intValue(), "Hello");
assertEquals(YogaLogLevel.DEBUG, mLogLevel);
assertEquals("Hello", mLogMessage);
}
@Test
public void testUpdateLogger() {
YogaNode.setLogger(new YogaLogger() {
public void log(YogaLogLevel level, String message) {}
});
YogaNode.setLogger(new YogaLogger() {
public void log(YogaLogLevel level, String message) {
mLogLevel = level;
mLogMessage = message;
}
});
YogaNode.jni_YGLog(YogaLogLevel.VERBOSE.intValue(), "Flexbox");
assertEquals(YogaLogLevel.VERBOSE, mLogLevel);
assertEquals("Flexbox", mLogMessage);
} }
@Test @Test

View File

@@ -43,10 +43,8 @@ module.exports = {
EDGE_VERTICAL: 7, EDGE_VERTICAL: 7,
EDGE_ALL: 8, EDGE_ALL: 8,
EXPERIMENTAL_FEATURE_COUNT: 3, EXPERIMENTAL_FEATURE_COUNT: 1,
EXPERIMENTAL_FEATURE_ROUNDING: 0, EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS: 0,
EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS: 1,
EXPERIMENTAL_FEATURE_MIN_FLEX_FIX: 2,
FLEX_DIRECTION_COUNT: 4, FLEX_DIRECTION_COUNT: 4,
FLEX_DIRECTION_COLUMN: 0, FLEX_DIRECTION_COLUMN: 0,
@@ -61,12 +59,13 @@ module.exports = {
JUSTIFY_SPACE_BETWEEN: 3, JUSTIFY_SPACE_BETWEEN: 3,
JUSTIFY_SPACE_AROUND: 4, JUSTIFY_SPACE_AROUND: 4,
LOG_LEVEL_COUNT: 5, LOG_LEVEL_COUNT: 6,
LOG_LEVEL_ERROR: 0, LOG_LEVEL_ERROR: 0,
LOG_LEVEL_WARN: 1, LOG_LEVEL_WARN: 1,
LOG_LEVEL_INFO: 2, LOG_LEVEL_INFO: 2,
LOG_LEVEL_DEBUG: 3, LOG_LEVEL_DEBUG: 3,
LOG_LEVEL_VERBOSE: 4, LOG_LEVEL_VERBOSE: 4,
LOG_LEVEL_FATAL: 5,
MEASURE_MODE_COUNT: 3, MEASURE_MODE_COUNT: 3,
MEASURE_MODE_UNDEFINED: 0, MEASURE_MODE_UNDEFINED: 0,

View File

@@ -23,7 +23,7 @@ module.exports = function (bind, lib) {
UNDEFINED: NaN UNDEFINED: NaN
}, require(`./YGEnums`)); }, require('./YGEnums'));
class Layout { class Layout {

View File

@@ -1878,3 +1878,152 @@ it("align_items_flex_end_child_without_margin_bigger_than_parent", function () {
config.free(); config.free();
} }
}); });
it("align_center_should_size_based_on_content", function () {
var config = Yoga.Config.create();
try {
var root = Yoga.Node.create(config);
root.setAlignItems(Yoga.ALIGN_CENTER);
root.setMargin(Yoga.EDGE_TOP, 20);
root.setWidth(100);
root.setHeight(100);
var root_child0 = Yoga.Node.create(config);
root_child0.setJustifyContent(Yoga.JUSTIFY_CENTER);
root_child0.setFlexShrink(1);
root.insertChild(root_child0, 0);
var root_child0_child0 = Yoga.Node.create(config);
root_child0_child0.setFlexGrow(1);
root_child0_child0.setFlexShrink(1);
root_child0.insertChild(root_child0_child0, 0);
var root_child0_child0_child0 = Yoga.Node.create(config);
root_child0_child0_child0.setWidth(20);
root_child0_child0_child0.setHeight(20);
root_child0_child0.insertChild(root_child0_child0_child0, 0);
root.calculateLayout(Yoga.UNDEFINED, Yoga.UNDEFINED, Yoga.DIRECTION_LTR);
console.assert(0 === root.getComputedLeft(), "0 === root.getComputedLeft() (" + root.getComputedLeft() + ")");
console.assert(20 === root.getComputedTop(), "20 === root.getComputedTop() (" + root.getComputedTop() + ")");
console.assert(100 === root.getComputedWidth(), "100 === root.getComputedWidth() (" + root.getComputedWidth() + ")");
console.assert(100 === root.getComputedHeight(), "100 === root.getComputedHeight() (" + root.getComputedHeight() + ")");
console.assert(40 === root_child0.getComputedLeft(), "40 === root_child0.getComputedLeft() (" + root_child0.getComputedLeft() + ")");
console.assert(0 === root_child0.getComputedTop(), "0 === root_child0.getComputedTop() (" + root_child0.getComputedTop() + ")");
console.assert(20 === root_child0.getComputedWidth(), "20 === root_child0.getComputedWidth() (" + root_child0.getComputedWidth() + ")");
console.assert(20 === root_child0.getComputedHeight(), "20 === root_child0.getComputedHeight() (" + root_child0.getComputedHeight() + ")");
console.assert(0 === root_child0_child0.getComputedLeft(), "0 === root_child0_child0.getComputedLeft() (" + root_child0_child0.getComputedLeft() + ")");
console.assert(0 === root_child0_child0.getComputedTop(), "0 === root_child0_child0.getComputedTop() (" + root_child0_child0.getComputedTop() + ")");
console.assert(20 === root_child0_child0.getComputedWidth(), "20 === root_child0_child0.getComputedWidth() (" + root_child0_child0.getComputedWidth() + ")");
console.assert(20 === root_child0_child0.getComputedHeight(), "20 === root_child0_child0.getComputedHeight() (" + root_child0_child0.getComputedHeight() + ")");
console.assert(0 === root_child0_child0_child0.getComputedLeft(), "0 === root_child0_child0_child0.getComputedLeft() (" + root_child0_child0_child0.getComputedLeft() + ")");
console.assert(0 === root_child0_child0_child0.getComputedTop(), "0 === root_child0_child0_child0.getComputedTop() (" + root_child0_child0_child0.getComputedTop() + ")");
console.assert(20 === root_child0_child0_child0.getComputedWidth(), "20 === root_child0_child0_child0.getComputedWidth() (" + root_child0_child0_child0.getComputedWidth() + ")");
console.assert(20 === root_child0_child0_child0.getComputedHeight(), "20 === root_child0_child0_child0.getComputedHeight() (" + root_child0_child0_child0.getComputedHeight() + ")");
root.calculateLayout(Yoga.UNDEFINED, Yoga.UNDEFINED, Yoga.DIRECTION_RTL);
console.assert(0 === root.getComputedLeft(), "0 === root.getComputedLeft() (" + root.getComputedLeft() + ")");
console.assert(20 === root.getComputedTop(), "20 === root.getComputedTop() (" + root.getComputedTop() + ")");
console.assert(100 === root.getComputedWidth(), "100 === root.getComputedWidth() (" + root.getComputedWidth() + ")");
console.assert(100 === root.getComputedHeight(), "100 === root.getComputedHeight() (" + root.getComputedHeight() + ")");
console.assert(40 === root_child0.getComputedLeft(), "40 === root_child0.getComputedLeft() (" + root_child0.getComputedLeft() + ")");
console.assert(0 === root_child0.getComputedTop(), "0 === root_child0.getComputedTop() (" + root_child0.getComputedTop() + ")");
console.assert(20 === root_child0.getComputedWidth(), "20 === root_child0.getComputedWidth() (" + root_child0.getComputedWidth() + ")");
console.assert(20 === root_child0.getComputedHeight(), "20 === root_child0.getComputedHeight() (" + root_child0.getComputedHeight() + ")");
console.assert(0 === root_child0_child0.getComputedLeft(), "0 === root_child0_child0.getComputedLeft() (" + root_child0_child0.getComputedLeft() + ")");
console.assert(0 === root_child0_child0.getComputedTop(), "0 === root_child0_child0.getComputedTop() (" + root_child0_child0.getComputedTop() + ")");
console.assert(20 === root_child0_child0.getComputedWidth(), "20 === root_child0_child0.getComputedWidth() (" + root_child0_child0.getComputedWidth() + ")");
console.assert(20 === root_child0_child0.getComputedHeight(), "20 === root_child0_child0.getComputedHeight() (" + root_child0_child0.getComputedHeight() + ")");
console.assert(0 === root_child0_child0_child0.getComputedLeft(), "0 === root_child0_child0_child0.getComputedLeft() (" + root_child0_child0_child0.getComputedLeft() + ")");
console.assert(0 === root_child0_child0_child0.getComputedTop(), "0 === root_child0_child0_child0.getComputedTop() (" + root_child0_child0_child0.getComputedTop() + ")");
console.assert(20 === root_child0_child0_child0.getComputedWidth(), "20 === root_child0_child0_child0.getComputedWidth() (" + root_child0_child0_child0.getComputedWidth() + ")");
console.assert(20 === root_child0_child0_child0.getComputedHeight(), "20 === root_child0_child0_child0.getComputedHeight() (" + root_child0_child0_child0.getComputedHeight() + ")");
} finally {
if (typeof root !== "undefined") {
root.freeRecursive();
}
config.free();
}
});
it("align_strech_should_size_based_on_parent", function () {
var config = Yoga.Config.create();
try {
var root = Yoga.Node.create(config);
root.setMargin(Yoga.EDGE_TOP, 20);
root.setWidth(100);
root.setHeight(100);
var root_child0 = Yoga.Node.create(config);
root_child0.setJustifyContent(Yoga.JUSTIFY_CENTER);
root_child0.setFlexShrink(1);
root.insertChild(root_child0, 0);
var root_child0_child0 = Yoga.Node.create(config);
root_child0_child0.setFlexGrow(1);
root_child0_child0.setFlexShrink(1);
root_child0.insertChild(root_child0_child0, 0);
var root_child0_child0_child0 = Yoga.Node.create(config);
root_child0_child0_child0.setWidth(20);
root_child0_child0_child0.setHeight(20);
root_child0_child0.insertChild(root_child0_child0_child0, 0);
root.calculateLayout(Yoga.UNDEFINED, Yoga.UNDEFINED, Yoga.DIRECTION_LTR);
console.assert(0 === root.getComputedLeft(), "0 === root.getComputedLeft() (" + root.getComputedLeft() + ")");
console.assert(20 === root.getComputedTop(), "20 === root.getComputedTop() (" + root.getComputedTop() + ")");
console.assert(100 === root.getComputedWidth(), "100 === root.getComputedWidth() (" + root.getComputedWidth() + ")");
console.assert(100 === root.getComputedHeight(), "100 === root.getComputedHeight() (" + root.getComputedHeight() + ")");
console.assert(0 === root_child0.getComputedLeft(), "0 === root_child0.getComputedLeft() (" + root_child0.getComputedLeft() + ")");
console.assert(0 === root_child0.getComputedTop(), "0 === root_child0.getComputedTop() (" + root_child0.getComputedTop() + ")");
console.assert(100 === root_child0.getComputedWidth(), "100 === root_child0.getComputedWidth() (" + root_child0.getComputedWidth() + ")");
console.assert(20 === root_child0.getComputedHeight(), "20 === root_child0.getComputedHeight() (" + root_child0.getComputedHeight() + ")");
console.assert(0 === root_child0_child0.getComputedLeft(), "0 === root_child0_child0.getComputedLeft() (" + root_child0_child0.getComputedLeft() + ")");
console.assert(0 === root_child0_child0.getComputedTop(), "0 === root_child0_child0.getComputedTop() (" + root_child0_child0.getComputedTop() + ")");
console.assert(100 === root_child0_child0.getComputedWidth(), "100 === root_child0_child0.getComputedWidth() (" + root_child0_child0.getComputedWidth() + ")");
console.assert(20 === root_child0_child0.getComputedHeight(), "20 === root_child0_child0.getComputedHeight() (" + root_child0_child0.getComputedHeight() + ")");
console.assert(0 === root_child0_child0_child0.getComputedLeft(), "0 === root_child0_child0_child0.getComputedLeft() (" + root_child0_child0_child0.getComputedLeft() + ")");
console.assert(0 === root_child0_child0_child0.getComputedTop(), "0 === root_child0_child0_child0.getComputedTop() (" + root_child0_child0_child0.getComputedTop() + ")");
console.assert(20 === root_child0_child0_child0.getComputedWidth(), "20 === root_child0_child0_child0.getComputedWidth() (" + root_child0_child0_child0.getComputedWidth() + ")");
console.assert(20 === root_child0_child0_child0.getComputedHeight(), "20 === root_child0_child0_child0.getComputedHeight() (" + root_child0_child0_child0.getComputedHeight() + ")");
root.calculateLayout(Yoga.UNDEFINED, Yoga.UNDEFINED, Yoga.DIRECTION_RTL);
console.assert(0 === root.getComputedLeft(), "0 === root.getComputedLeft() (" + root.getComputedLeft() + ")");
console.assert(20 === root.getComputedTop(), "20 === root.getComputedTop() (" + root.getComputedTop() + ")");
console.assert(100 === root.getComputedWidth(), "100 === root.getComputedWidth() (" + root.getComputedWidth() + ")");
console.assert(100 === root.getComputedHeight(), "100 === root.getComputedHeight() (" + root.getComputedHeight() + ")");
console.assert(0 === root_child0.getComputedLeft(), "0 === root_child0.getComputedLeft() (" + root_child0.getComputedLeft() + ")");
console.assert(0 === root_child0.getComputedTop(), "0 === root_child0.getComputedTop() (" + root_child0.getComputedTop() + ")");
console.assert(100 === root_child0.getComputedWidth(), "100 === root_child0.getComputedWidth() (" + root_child0.getComputedWidth() + ")");
console.assert(20 === root_child0.getComputedHeight(), "20 === root_child0.getComputedHeight() (" + root_child0.getComputedHeight() + ")");
console.assert(0 === root_child0_child0.getComputedLeft(), "0 === root_child0_child0.getComputedLeft() (" + root_child0_child0.getComputedLeft() + ")");
console.assert(0 === root_child0_child0.getComputedTop(), "0 === root_child0_child0.getComputedTop() (" + root_child0_child0.getComputedTop() + ")");
console.assert(100 === root_child0_child0.getComputedWidth(), "100 === root_child0_child0.getComputedWidth() (" + root_child0_child0.getComputedWidth() + ")");
console.assert(20 === root_child0_child0.getComputedHeight(), "20 === root_child0_child0.getComputedHeight() (" + root_child0_child0.getComputedHeight() + ")");
console.assert(80 === root_child0_child0_child0.getComputedLeft(), "80 === root_child0_child0_child0.getComputedLeft() (" + root_child0_child0_child0.getComputedLeft() + ")");
console.assert(0 === root_child0_child0_child0.getComputedTop(), "0 === root_child0_child0_child0.getComputedTop() (" + root_child0_child0_child0.getComputedTop() + ")");
console.assert(20 === root_child0_child0_child0.getComputedWidth(), "20 === root_child0_child0_child0.getComputedWidth() (" + root_child0_child0_child0.getComputedWidth() + ")");
console.assert(20 === root_child0_child0_child0.getComputedHeight(), "20 === root_child0_child0_child0.getComputedHeight() (" + root_child0_child0_child0.getComputedHeight() + ")");
} finally {
if (typeof root !== "undefined") {
root.freeRecursive();
}
config.free();
}
});

View File

@@ -1423,3 +1423,173 @@ it("wrapped_row_within_align_items_flex_end", function () {
config.free(); config.free();
} }
}); });
it("wrapped_column_max_height", function () {
var config = Yoga.Config.create();
try {
var root = Yoga.Node.create(config);
root.setJustifyContent(Yoga.JUSTIFY_CENTER);
root.setAlignContent(Yoga.ALIGN_CENTER);
root.setAlignItems(Yoga.ALIGN_CENTER);
root.setFlexWrap(Yoga.WRAP_WRAP);
root.setWidth(700);
root.setHeight(500);
var root_child0 = Yoga.Node.create(config);
root_child0.setWidth(100);
root_child0.setHeight(500);
root_child0.setMaxHeight(200);
root.insertChild(root_child0, 0);
var root_child1 = Yoga.Node.create(config);
root_child1.setMargin(Yoga.EDGE_LEFT, 20);
root_child1.setMargin(Yoga.EDGE_TOP, 20);
root_child1.setMargin(Yoga.EDGE_RIGHT, 20);
root_child1.setMargin(Yoga.EDGE_BOTTOM, 20);
root_child1.setWidth(200);
root_child1.setHeight(200);
root.insertChild(root_child1, 1);
var root_child2 = Yoga.Node.create(config);
root_child2.setWidth(100);
root_child2.setHeight(100);
root.insertChild(root_child2, 2);
root.calculateLayout(Yoga.UNDEFINED, Yoga.UNDEFINED, Yoga.DIRECTION_LTR);
console.assert(0 === root.getComputedLeft(), "0 === root.getComputedLeft() (" + root.getComputedLeft() + ")");
console.assert(0 === root.getComputedTop(), "0 === root.getComputedTop() (" + root.getComputedTop() + ")");
console.assert(700 === root.getComputedWidth(), "700 === root.getComputedWidth() (" + root.getComputedWidth() + ")");
console.assert(500 === root.getComputedHeight(), "500 === root.getComputedHeight() (" + root.getComputedHeight() + ")");
console.assert(250 === root_child0.getComputedLeft(), "250 === root_child0.getComputedLeft() (" + root_child0.getComputedLeft() + ")");
console.assert(30 === root_child0.getComputedTop(), "30 === root_child0.getComputedTop() (" + root_child0.getComputedTop() + ")");
console.assert(100 === root_child0.getComputedWidth(), "100 === root_child0.getComputedWidth() (" + root_child0.getComputedWidth() + ")");
console.assert(200 === root_child0.getComputedHeight(), "200 === root_child0.getComputedHeight() (" + root_child0.getComputedHeight() + ")");
console.assert(200 === root_child1.getComputedLeft(), "200 === root_child1.getComputedLeft() (" + root_child1.getComputedLeft() + ")");
console.assert(250 === root_child1.getComputedTop(), "250 === root_child1.getComputedTop() (" + root_child1.getComputedTop() + ")");
console.assert(200 === root_child1.getComputedWidth(), "200 === root_child1.getComputedWidth() (" + root_child1.getComputedWidth() + ")");
console.assert(200 === root_child1.getComputedHeight(), "200 === root_child1.getComputedHeight() (" + root_child1.getComputedHeight() + ")");
console.assert(420 === root_child2.getComputedLeft(), "420 === root_child2.getComputedLeft() (" + root_child2.getComputedLeft() + ")");
console.assert(200 === root_child2.getComputedTop(), "200 === root_child2.getComputedTop() (" + root_child2.getComputedTop() + ")");
console.assert(100 === root_child2.getComputedWidth(), "100 === root_child2.getComputedWidth() (" + root_child2.getComputedWidth() + ")");
console.assert(100 === root_child2.getComputedHeight(), "100 === root_child2.getComputedHeight() (" + root_child2.getComputedHeight() + ")");
root.calculateLayout(Yoga.UNDEFINED, Yoga.UNDEFINED, Yoga.DIRECTION_RTL);
console.assert(0 === root.getComputedLeft(), "0 === root.getComputedLeft() (" + root.getComputedLeft() + ")");
console.assert(0 === root.getComputedTop(), "0 === root.getComputedTop() (" + root.getComputedTop() + ")");
console.assert(700 === root.getComputedWidth(), "700 === root.getComputedWidth() (" + root.getComputedWidth() + ")");
console.assert(500 === root.getComputedHeight(), "500 === root.getComputedHeight() (" + root.getComputedHeight() + ")");
console.assert(350 === root_child0.getComputedLeft(), "350 === root_child0.getComputedLeft() (" + root_child0.getComputedLeft() + ")");
console.assert(30 === root_child0.getComputedTop(), "30 === root_child0.getComputedTop() (" + root_child0.getComputedTop() + ")");
console.assert(100 === root_child0.getComputedWidth(), "100 === root_child0.getComputedWidth() (" + root_child0.getComputedWidth() + ")");
console.assert(200 === root_child0.getComputedHeight(), "200 === root_child0.getComputedHeight() (" + root_child0.getComputedHeight() + ")");
console.assert(300 === root_child1.getComputedLeft(), "300 === root_child1.getComputedLeft() (" + root_child1.getComputedLeft() + ")");
console.assert(250 === root_child1.getComputedTop(), "250 === root_child1.getComputedTop() (" + root_child1.getComputedTop() + ")");
console.assert(200 === root_child1.getComputedWidth(), "200 === root_child1.getComputedWidth() (" + root_child1.getComputedWidth() + ")");
console.assert(200 === root_child1.getComputedHeight(), "200 === root_child1.getComputedHeight() (" + root_child1.getComputedHeight() + ")");
console.assert(180 === root_child2.getComputedLeft(), "180 === root_child2.getComputedLeft() (" + root_child2.getComputedLeft() + ")");
console.assert(200 === root_child2.getComputedTop(), "200 === root_child2.getComputedTop() (" + root_child2.getComputedTop() + ")");
console.assert(100 === root_child2.getComputedWidth(), "100 === root_child2.getComputedWidth() (" + root_child2.getComputedWidth() + ")");
console.assert(100 === root_child2.getComputedHeight(), "100 === root_child2.getComputedHeight() (" + root_child2.getComputedHeight() + ")");
} finally {
if (typeof root !== "undefined") {
root.freeRecursive();
}
config.free();
}
});
it("wrapped_column_max_height_flex", function () {
var config = Yoga.Config.create();
try {
var root = Yoga.Node.create(config);
root.setJustifyContent(Yoga.JUSTIFY_CENTER);
root.setAlignContent(Yoga.ALIGN_CENTER);
root.setAlignItems(Yoga.ALIGN_CENTER);
root.setFlexWrap(Yoga.WRAP_WRAP);
root.setWidth(700);
root.setHeight(500);
var root_child0 = Yoga.Node.create(config);
root_child0.setFlexGrow(1);
root_child0.setFlexShrink(1);
root_child0.setFlexBasis("0%");
root_child0.setWidth(100);
root_child0.setHeight(500);
root_child0.setMaxHeight(200);
root.insertChild(root_child0, 0);
var root_child1 = Yoga.Node.create(config);
root_child1.setFlexGrow(1);
root_child1.setFlexShrink(1);
root_child1.setFlexBasis("0%");
root_child1.setMargin(Yoga.EDGE_LEFT, 20);
root_child1.setMargin(Yoga.EDGE_TOP, 20);
root_child1.setMargin(Yoga.EDGE_RIGHT, 20);
root_child1.setMargin(Yoga.EDGE_BOTTOM, 20);
root_child1.setWidth(200);
root_child1.setHeight(200);
root.insertChild(root_child1, 1);
var root_child2 = Yoga.Node.create(config);
root_child2.setWidth(100);
root_child2.setHeight(100);
root.insertChild(root_child2, 2);
root.calculateLayout(Yoga.UNDEFINED, Yoga.UNDEFINED, Yoga.DIRECTION_LTR);
console.assert(0 === root.getComputedLeft(), "0 === root.getComputedLeft() (" + root.getComputedLeft() + ")");
console.assert(0 === root.getComputedTop(), "0 === root.getComputedTop() (" + root.getComputedTop() + ")");
console.assert(700 === root.getComputedWidth(), "700 === root.getComputedWidth() (" + root.getComputedWidth() + ")");
console.assert(500 === root.getComputedHeight(), "500 === root.getComputedHeight() (" + root.getComputedHeight() + ")");
console.assert(300 === root_child0.getComputedLeft(), "300 === root_child0.getComputedLeft() (" + root_child0.getComputedLeft() + ")");
console.assert(0 === root_child0.getComputedTop(), "0 === root_child0.getComputedTop() (" + root_child0.getComputedTop() + ")");
console.assert(100 === root_child0.getComputedWidth(), "100 === root_child0.getComputedWidth() (" + root_child0.getComputedWidth() + ")");
console.assert(180 === root_child0.getComputedHeight(), "180 === root_child0.getComputedHeight() (" + root_child0.getComputedHeight() + ")");
console.assert(250 === root_child1.getComputedLeft(), "250 === root_child1.getComputedLeft() (" + root_child1.getComputedLeft() + ")");
console.assert(200 === root_child1.getComputedTop(), "200 === root_child1.getComputedTop() (" + root_child1.getComputedTop() + ")");
console.assert(200 === root_child1.getComputedWidth(), "200 === root_child1.getComputedWidth() (" + root_child1.getComputedWidth() + ")");
console.assert(180 === root_child1.getComputedHeight(), "180 === root_child1.getComputedHeight() (" + root_child1.getComputedHeight() + ")");
console.assert(300 === root_child2.getComputedLeft(), "300 === root_child2.getComputedLeft() (" + root_child2.getComputedLeft() + ")");
console.assert(400 === root_child2.getComputedTop(), "400 === root_child2.getComputedTop() (" + root_child2.getComputedTop() + ")");
console.assert(100 === root_child2.getComputedWidth(), "100 === root_child2.getComputedWidth() (" + root_child2.getComputedWidth() + ")");
console.assert(100 === root_child2.getComputedHeight(), "100 === root_child2.getComputedHeight() (" + root_child2.getComputedHeight() + ")");
root.calculateLayout(Yoga.UNDEFINED, Yoga.UNDEFINED, Yoga.DIRECTION_RTL);
console.assert(0 === root.getComputedLeft(), "0 === root.getComputedLeft() (" + root.getComputedLeft() + ")");
console.assert(0 === root.getComputedTop(), "0 === root.getComputedTop() (" + root.getComputedTop() + ")");
console.assert(700 === root.getComputedWidth(), "700 === root.getComputedWidth() (" + root.getComputedWidth() + ")");
console.assert(500 === root.getComputedHeight(), "500 === root.getComputedHeight() (" + root.getComputedHeight() + ")");
console.assert(300 === root_child0.getComputedLeft(), "300 === root_child0.getComputedLeft() (" + root_child0.getComputedLeft() + ")");
console.assert(0 === root_child0.getComputedTop(), "0 === root_child0.getComputedTop() (" + root_child0.getComputedTop() + ")");
console.assert(100 === root_child0.getComputedWidth(), "100 === root_child0.getComputedWidth() (" + root_child0.getComputedWidth() + ")");
console.assert(180 === root_child0.getComputedHeight(), "180 === root_child0.getComputedHeight() (" + root_child0.getComputedHeight() + ")");
console.assert(250 === root_child1.getComputedLeft(), "250 === root_child1.getComputedLeft() (" + root_child1.getComputedLeft() + ")");
console.assert(200 === root_child1.getComputedTop(), "200 === root_child1.getComputedTop() (" + root_child1.getComputedTop() + ")");
console.assert(200 === root_child1.getComputedWidth(), "200 === root_child1.getComputedWidth() (" + root_child1.getComputedWidth() + ")");
console.assert(180 === root_child1.getComputedHeight(), "180 === root_child1.getComputedHeight() (" + root_child1.getComputedHeight() + ")");
console.assert(300 === root_child2.getComputedLeft(), "300 === root_child2.getComputedLeft() (" + root_child2.getComputedLeft() + ")");
console.assert(400 === root_child2.getComputedTop(), "400 === root_child2.getComputedTop() (" + root_child2.getComputedTop() + ")");
console.assert(100 === root_child2.getComputedWidth(), "100 === root_child2.getComputedWidth() (" + root_child2.getComputedWidth() + ")");
console.assert(100 === root_child2.getComputedHeight(), "100 === root_child2.getComputedHeight() (" + root_child2.getComputedHeight() + ")");
} finally {
if (typeof root !== "undefined") {
root.freeRecursive();
}
config.free();
}
});

View File

@@ -380,8 +380,6 @@ it("justify_content_overflow_min_max", function () {
it("flex_grow_to_min", function () { it("flex_grow_to_min", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_MIN_FLEX_FIX, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setWidth(100); root.setWidth(100);
@@ -440,8 +438,6 @@ it("flex_grow_to_min", function () {
it("flex_grow_in_at_most_container", function () { it("flex_grow_in_at_most_container", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_MIN_FLEX_FIX, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW); root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);

View File

@@ -14,8 +14,6 @@ var Yoga = Yoga || require("../../sources/entry-" + process.env.TEST_ENTRY);
it("percentage_width_height", function () { it("percentage_width_height", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW); root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);
@@ -60,8 +58,6 @@ it("percentage_width_height", function () {
it("percentage_position_left_top", function () { it("percentage_position_left_top", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW); root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);
@@ -108,8 +104,6 @@ it("percentage_position_left_top", function () {
it("percentage_position_bottom_right", function () { it("percentage_position_bottom_right", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW); root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);
@@ -156,8 +150,6 @@ it("percentage_position_bottom_right", function () {
it("percentage_flex_basis", function () { it("percentage_flex_basis", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW); root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);
@@ -217,8 +209,6 @@ it("percentage_flex_basis", function () {
it("percentage_flex_basis_cross", function () { it("percentage_flex_basis_cross", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setWidth(200); root.setWidth(200);
@@ -277,8 +267,6 @@ it("percentage_flex_basis_cross", function () {
it("percentage_flex_basis_cross_min_height", function () { it("percentage_flex_basis_cross_min_height", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setWidth(200); root.setWidth(200);
@@ -337,8 +325,6 @@ it("percentage_flex_basis_cross_min_height", function () {
it("percentage_flex_basis_main_max_height", function () { it("percentage_flex_basis_main_max_height", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW); root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);
@@ -400,8 +386,6 @@ it("percentage_flex_basis_main_max_height", function () {
it("percentage_flex_basis_cross_max_height", function () { it("percentage_flex_basis_cross_max_height", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setWidth(200); root.setWidth(200);
@@ -462,8 +446,6 @@ it("percentage_flex_basis_cross_max_height", function () {
it("percentage_flex_basis_main_max_width", function () { it("percentage_flex_basis_main_max_width", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW); root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);
@@ -525,8 +507,6 @@ it("percentage_flex_basis_main_max_width", function () {
it("percentage_flex_basis_cross_max_width", function () { it("percentage_flex_basis_cross_max_width", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setWidth(200); root.setWidth(200);
@@ -587,8 +567,6 @@ it("percentage_flex_basis_cross_max_width", function () {
it("percentage_flex_basis_main_min_width", function () { it("percentage_flex_basis_main_min_width", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW); root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);
@@ -650,8 +628,6 @@ it("percentage_flex_basis_main_min_width", function () {
it("percentage_flex_basis_cross_min_width", function () { it("percentage_flex_basis_cross_min_width", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setWidth(200); root.setWidth(200);
@@ -712,8 +688,6 @@ it("percentage_flex_basis_cross_min_width", function () {
it("percentage_multiple_nested_with_padding_margin_and_percentage_values", function () { it("percentage_multiple_nested_with_padding_margin_and_percentage_values", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setWidth(200); root.setWidth(200);
@@ -826,8 +800,6 @@ it("percentage_multiple_nested_with_padding_margin_and_percentage_values", funct
it("percentage_margin_should_calculate_based_only_on_width", function () { it("percentage_margin_should_calculate_based_only_on_width", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setWidth(200); root.setWidth(200);
@@ -889,8 +861,6 @@ it("percentage_margin_should_calculate_based_only_on_width", function () {
it("percentage_padding_should_calculate_based_only_on_width", function () { it("percentage_padding_should_calculate_based_only_on_width", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setWidth(200); root.setWidth(200);
@@ -952,8 +922,6 @@ it("percentage_padding_should_calculate_based_only_on_width", function () {
it("percentage_absolute_position", function () { it("percentage_absolute_position", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setWidth(200); root.setWidth(200);
@@ -1126,8 +1094,6 @@ it("percent_within_flex_grow", function () {
it("percentage_container_in_wrapping_container", function () { it("percentage_container_in_wrapping_container", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_MIN_FLEX_FIX, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setJustifyContent(Yoga.JUSTIFY_CENTER); root.setJustifyContent(Yoga.JUSTIFY_CENTER);

View File

@@ -14,8 +14,6 @@ var Yoga = Yoga || require("../../sources/entry-" + process.env.TEST_ENTRY);
it("rounding_flex_basis_flex_grow_row_width_of_100", function () { it("rounding_flex_basis_flex_grow_row_width_of_100", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW); root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);
@@ -87,8 +85,6 @@ it("rounding_flex_basis_flex_grow_row_width_of_100", function () {
it("rounding_flex_basis_flex_grow_row_prime_number_width", function () { it("rounding_flex_basis_flex_grow_row_prime_number_width", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW); root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);
@@ -188,8 +184,6 @@ it("rounding_flex_basis_flex_grow_row_prime_number_width", function () {
it("rounding_flex_basis_flex_shrink_row", function () { it("rounding_flex_basis_flex_shrink_row", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW); root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);
@@ -262,8 +256,6 @@ it("rounding_flex_basis_flex_shrink_row", function () {
it("rounding_flex_basis_overrides_main_size", function () { it("rounding_flex_basis_overrides_main_size", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setWidth(100); root.setWidth(100);
@@ -338,8 +330,6 @@ it("rounding_flex_basis_overrides_main_size", function () {
it("rounding_total_fractial", function () { it("rounding_total_fractial", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setWidth(87.4); root.setWidth(87.4);
@@ -414,8 +404,6 @@ it("rounding_total_fractial", function () {
it("rounding_total_fractial_nested", function () { it("rounding_total_fractial_nested", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setWidth(87.4); root.setWidth(87.4);
@@ -524,8 +512,6 @@ it("rounding_total_fractial_nested", function () {
it("rounding_fractial_input_1", function () { it("rounding_fractial_input_1", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setWidth(100); root.setWidth(100);
@@ -600,8 +586,6 @@ it("rounding_fractial_input_1", function () {
it("rounding_fractial_input_2", function () { it("rounding_fractial_input_2", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setWidth(100); root.setWidth(100);
@@ -676,8 +660,6 @@ it("rounding_fractial_input_2", function () {
it("rounding_fractial_input_3", function () { it("rounding_fractial_input_3", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setPosition(Yoga.EDGE_TOP, 0.3); root.setPosition(Yoga.EDGE_TOP, 0.3);
@@ -753,8 +735,6 @@ it("rounding_fractial_input_3", function () {
it("rounding_fractial_input_4", function () { it("rounding_fractial_input_4", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setPosition(Yoga.EDGE_TOP, 0.7); root.setPosition(Yoga.EDGE_TOP, 0.7);
@@ -830,8 +810,6 @@ it("rounding_fractial_input_4", function () {
it("rounding_inner_node_controversy_horizontal", function () { it("rounding_inner_node_controversy_horizontal", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW); root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);
@@ -920,8 +898,6 @@ it("rounding_inner_node_controversy_horizontal", function () {
it("rounding_inner_node_controversy_vertical", function () { it("rounding_inner_node_controversy_vertical", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setHeight(320); root.setHeight(320);
@@ -1009,8 +985,6 @@ it("rounding_inner_node_controversy_vertical", function () {
it("rounding_inner_node_controversy_combined", function () { it("rounding_inner_node_controversy_combined", function () {
var config = Yoga.Config.create(); var config = Yoga.Config.create();
config.setExperimentalFeatureEnabled(Yoga.EXPERIMENTAL_FEATURE_ROUNDING, true);
try { try {
var root = Yoga.Node.create(config); var root = Yoga.Node.create(config);
root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW); root.setFlexDirection(Yoga.FLEX_DIRECTION_ROW);

View File

@@ -40,6 +40,7 @@ cxx_library(
visibility = ["PUBLIC"], visibility = ["PUBLIC"],
deps = [ deps = [
":ndklog", ":ndklog",
FBJNI_JAVA_TARGET,
JNI_TARGET, JNI_TARGET,
], ],
) )

View File

@@ -24,4 +24,10 @@ android {
path 'src/main/cpp/CMakeLists.txt' path 'src/main/cpp/CMakeLists.txt'
} }
} }
dependencies {
compile 'com.facebook.soloader:soloader:0.2.0'
compile 'com.google.code.findbugs:jsr305:3.0.1'
compile project(':yoga:proguard-annotations')
}
} }

View File

@@ -39,7 +39,7 @@ local_ref<JByteBuffer> JByteBuffer::wrapBytes(uint8_t* data, size_t size) {
return res; return res;
} }
uint8_t* JByteBuffer::getDirectBytes() { uint8_t* JByteBuffer::getDirectBytes() const {
if (!self()) { if (!self()) {
throwNewJavaException("java/lang/NullPointerException", "java.lang.NullPointerException"); throwNewJavaException("java/lang/NullPointerException", "java.lang.NullPointerException");
} }
@@ -54,7 +54,7 @@ uint8_t* JByteBuffer::getDirectBytes() {
return static_cast<uint8_t*>(bytes); return static_cast<uint8_t*>(bytes);
} }
size_t JByteBuffer::getDirectSize() { size_t JByteBuffer::getDirectSize() const {
if (!self()) { if (!self()) {
throwNewJavaException("java/lang/NullPointerException", "java.lang.NullPointerException"); throwNewJavaException("java/lang/NullPointerException", "java.lang.NullPointerException");
} }
@@ -69,7 +69,7 @@ size_t JByteBuffer::getDirectSize() {
return static_cast<size_t>(size); return static_cast<size_t>(size);
} }
bool JByteBuffer::isDirect() { bool JByteBuffer::isDirect() const {
static auto meth = javaClassStatic()->getMethod<jboolean()>("isDirect"); static auto meth = javaClassStatic()->getMethod<jboolean()>("isDirect");
return meth(self()); return meth(self());
} }

View File

@@ -0,0 +1,22 @@
# Copyright (c) 2014-present, Facebook, Inc.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree. An additional grant
# of patent rights can be found in the PATENTS file in the same directory.
include_defs("//YOGA_DEFS")
java_library(
name = "jni",
srcs = glob(["**/*.java"]),
proguard_config = "fbjni.pro",
visibility = [
"PUBLIC",
],
deps = [
PROGRUARD_ANNOTATIONS_TARGET,
SOLOADER_TARGET,
JSR_305_TARGET,
],
)

View File

@@ -0,0 +1,35 @@
// Copyright 2004-present Facebook. All Rights Reserved.
package com.facebook.jni;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.soloader.SoLoader;
/**
* A Java Object that has native memory allocated corresponding to this instance.
*
* NB: THREAD SAFETY (this comment also exists at Countable.cpp)
*
* {@link #dispose} deletes the corresponding native object on whatever thread the method is called
* on. In the common case when this is called by Countable#finalize(), this will be called on the
* system finalizer thread. If you manually call dispose on the Java object, the native object
* will be deleted synchronously on that thread.
*/
@DoNotStrip
public class Countable {
static {
SoLoader.loadLibrary("fb");
}
// Private C++ instance
@DoNotStrip
private long mInstance = 0;
public native void dispose();
protected void finalize() throws Throwable {
dispose();
super.finalize();
}
}

View File

@@ -0,0 +1,49 @@
// Copyright 2004-present Facebook. All Rights Reserved.
package com.facebook.jni;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.soloader.SoLoader;
/**
* This object holds a native C++ member for hybrid Java/C++ objects.
*
* NB: THREAD SAFETY
*
* {@link #dispose} deletes the corresponding native object on whatever thread
* the method is called on. In the common case when this is called by
* HybridData#finalize(), this will be called on the system finalizer
* thread. If you manually call resetNative() on the Java object, the C++
* object will be deleted synchronously on that thread.
*/
@DoNotStrip
public class HybridData {
static {
SoLoader.loadLibrary("fb");
}
// Private C++ instance
@DoNotStrip
private long mNativePointer = 0;
/**
* To explicitly delete the instance, call resetNative(). If the C++
* instance is referenced after this is called, a NullPointerException will
* be thrown. resetNative() may be called multiple times safely. Because
* {@link #finalize} calls resetNative, the instance will not leak if this is
* not called, but timing of deletion and the thread the C++ dtor is called
* on will be at the whim of the Java GC. If you want to control the thread
* and timing of the destructor, you should call resetNative() explicitly.
*/
public native void resetNative();
protected void finalize() throws Throwable {
resetNative();
super.finalize();
}
public boolean isValid() {
return mNativePointer != 0;
}
}

View File

@@ -0,0 +1,56 @@
/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.jni;
import com.facebook.proguard.annotations.DoNotStrip;
import javax.annotation.Nullable;
import java.util.Iterator;
/**
* To iterate over an Iterator from C++ requires two calls per entry: hasNext()
* and next(). This helper reduces it to one call and one field get per entry.
* It does not use a generic argument, since in C++, the types will be erased,
* anyway. This is *not* a {@link java.util.Iterator}.
*/
@DoNotStrip
public class IteratorHelper {
private final Iterator mIterator;
// This is private, but accessed via JNI.
@DoNotStrip
private @Nullable Object mElement;
@DoNotStrip
public IteratorHelper(Iterator iterator) {
mIterator = iterator;
}
@DoNotStrip
public IteratorHelper(Iterable iterable) {
mIterator = iterable.iterator();
}
/**
* Moves the helper to the next entry in the map, if any. Returns true iff
* there is an entry to read.
*/
@DoNotStrip
boolean hasNext() {
if (mIterator.hasNext()) {
mElement = mIterator.next();
return true;
} else {
mElement = null;
return false;
}
}
}

View File

@@ -0,0 +1,53 @@
/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.jni;
import javax.annotation.Nullable;
import java.util.Iterator;
import java.util.Map;
import com.facebook.proguard.annotations.DoNotStrip;
/**
* To iterate over a Map from C++ requires four calls per entry: hasNext(),
* next(), getKey(), getValue(). This helper reduces it to one call and two
* field gets per entry. It does not use a generic argument, since in C++, the
* types will be erased, anyway. This is *not* a {@link java.util.Iterator}.
*/
@DoNotStrip
public class MapIteratorHelper {
@DoNotStrip private final Iterator<Map.Entry> mIterator;
@DoNotStrip private @Nullable Object mKey;
@DoNotStrip private @Nullable Object mValue;
@DoNotStrip
public MapIteratorHelper(Map map) {
mIterator = map.entrySet().iterator();
}
/**
* Moves the helper to the next entry in the map, if any. Returns true iff
* there is an entry to read.
*/
@DoNotStrip
boolean hasNext() {
if (mIterator.hasNext()) {
Map.Entry entry = mIterator.next();
mKey = entry.getKey();
mValue = entry.getValue();
return true;
} else {
mKey = null;
mValue = null;
return false;
}
}
}

View File

@@ -0,0 +1,28 @@
/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.jni;
import com.facebook.jni.HybridData;
import com.facebook.proguard.annotations.DoNotStrip;
/**
* A Runnable that has a native run implementation.
*/
@DoNotStrip
public class NativeRunnable implements Runnable {
private final HybridData mHybridData;
private NativeRunnable(HybridData hybridData) {
mHybridData = hybridData;
}
public native void run();
}

View File

@@ -0,0 +1,22 @@
// Copyright 2004-present Facebook. All Rights Reserved.
package com.facebook.jni;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.soloader.SoLoader;
@DoNotStrip
public class ThreadScopeSupport {
static {
SoLoader.loadLibrary("fb");
}
// This is just used for ThreadScope::withClassLoader to have a java function
// in the stack so that jni has access to the correct classloader.
@DoNotStrip
private static void runStdFunction(long ptr) {
runStdFunctionImpl(ptr);
}
private static native void runStdFunctionImpl(long ptr);
}

View File

@@ -0,0 +1,11 @@
# For common use cases for the hybrid pattern, keep symbols which may
# be referenced only from C++.
-keepclassmembers class * {
com.facebook.jni.HybridData *;
<init>(com.facebook.jni.HybridData);
}
-keepclasseswithmembers class * {
com.facebook.jni.HybridData *;
}

View File

@@ -0,0 +1,25 @@
#!/usr/bin/env bash
#
# Deploy a SNAPSHOT JAR after every successful Circle CI To Sonatype.
# See https://circleci.com/docs/1.0/environment-variables/
#
set -e
BASEDIR="$(readlink -m "$(dirname "$0")/..")"
IS_SNAPSHOT="$(grep 'VERSION_NAME=[0-9\.]\+-SNAPSHOT' "$BASEDIR/gradle.properties")"
if [ "$TRAVIS_REPO_SLUG" != "facebook/yoga" ]; then
echo "Skipping repository. Expected project to be 'facebook/yoga', but was '$TRAVIS_REPO_SLUG'."
exit
elif [ "$TRAVIS_BRANCH" != "master" ]; then
echo "Skipping build. Expected branch name to be 'master', but was '$TRAVIS_BRANCH'."
exit
elif [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
echo "Skipping build. Only considering non-PR builds, but URL was '$TRAVIS_PULL_REQUEST'."
exit
elif [ "$IS_SNAPSHOT" == "" ]; then
echo "Skipping build. Given build doesn't appear to be a SNAPSHOT release."
else
"$BASEDIR/gradlew" uploadArchives
fi

1
scripts/setup-keys.enc Normal file
View File

@@ -0,0 +1 @@
k<EFBFBD><EFBFBD><EFBFBD><04><18>=+\M<><4D>n<EFBFBD>mq6<71>P<16><>q<EFBFBD>Z<<3C>c%<25><><1D>j<EFBFBD><6A><EFBFBD>d<EFBFBD><64><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><11>9C7P`]<5D><><EFBFBD><EFBFBD>#<23>Z<EFBFBD>+<2B><><EFBFBD><EFBFBD><EFBFBD>^ 7<><37><EFBFBD><EFBFBD><EFBFBD>*<2A><><EFBFBD>r<EFBFBD>`L<>A<13>1m<31><6D><EFBFBD>0h<30>n% v<><76>

View File

@@ -1809,3 +1809,146 @@ TEST(YogaTest, align_items_flex_end_child_without_margin_bigger_than_parent) {
YGConfigFree(config); YGConfigFree(config);
} }
TEST(YogaTest, align_center_should_size_based_on_content) {
const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetAlignItems(root, YGAlignCenter);
YGNodeStyleSetMargin(root, YGEdgeTop, 20);
YGNodeStyleSetWidth(root, 100);
YGNodeStyleSetHeight(root, 100);
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetJustifyContent(root_child0, YGJustifyCenter);
YGNodeStyleSetFlexShrink(root_child0, 1);
YGNodeInsertChild(root, root_child0, 0);
const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetFlexGrow(root_child0_child0, 1);
YGNodeStyleSetFlexShrink(root_child0_child0, 1);
YGNodeInsertChild(root_child0, root_child0_child0, 0);
const YGNodeRef root_child0_child0_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetWidth(root_child0_child0_child0, 20);
YGNodeStyleSetHeight(root_child0_child0_child0, 20);
YGNodeInsertChild(root_child0_child0, root_child0_child0_child0, 0);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetWidth(root_child0_child0));
ASSERT_FLOAT_EQ(20, 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(20, YGNodeLayoutGetWidth(root_child0_child0_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0_child0_child0));
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetWidth(root_child0_child0));
ASSERT_FLOAT_EQ(20, 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(20, YGNodeLayoutGetWidth(root_child0_child0_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0_child0_child0));
YGNodeFreeRecursive(root);
YGConfigFree(config);
}
TEST(YogaTest, align_strech_should_size_based_on_parent) {
const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetMargin(root, YGEdgeTop, 20);
YGNodeStyleSetWidth(root, 100);
YGNodeStyleSetHeight(root, 100);
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetJustifyContent(root_child0, YGJustifyCenter);
YGNodeStyleSetFlexShrink(root_child0, 1);
YGNodeInsertChild(root, root_child0, 0);
const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetFlexGrow(root_child0_child0, 1);
YGNodeStyleSetFlexShrink(root_child0_child0, 1);
YGNodeInsertChild(root_child0, root_child0_child0, 0);
const YGNodeRef root_child0_child0_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetWidth(root_child0_child0_child0, 20);
YGNodeStyleSetHeight(root_child0_child0_child0, 20);
YGNodeInsertChild(root_child0_child0, root_child0_child0_child0, 0);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0));
ASSERT_FLOAT_EQ(20, 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(20, YGNodeLayoutGetWidth(root_child0_child0_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0_child0_child0));
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0_child0));
ASSERT_FLOAT_EQ(80, YGNodeLayoutGetLeft(root_child0_child0_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0_child0_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetWidth(root_child0_child0_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetHeight(root_child0_child0_child0));
YGNodeFreeRecursive(root);
YGConfigFree(config);
}

View File

@@ -1375,3 +1375,167 @@ TEST(YogaTest, wrapped_row_within_align_items_flex_end) {
YGConfigFree(config); YGConfigFree(config);
} }
TEST(YogaTest, wrapped_column_max_height) {
const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetJustifyContent(root, YGJustifyCenter);
YGNodeStyleSetAlignContent(root, YGAlignCenter);
YGNodeStyleSetAlignItems(root, YGAlignCenter);
YGNodeStyleSetFlexWrap(root, YGWrapWrap);
YGNodeStyleSetWidth(root, 700);
YGNodeStyleSetHeight(root, 500);
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetWidth(root_child0, 100);
YGNodeStyleSetHeight(root_child0, 500);
YGNodeStyleSetMaxHeight(root_child0, 200);
YGNodeInsertChild(root, root_child0, 0);
const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
YGNodeStyleSetMargin(root_child1, YGEdgeLeft, 20);
YGNodeStyleSetMargin(root_child1, YGEdgeTop, 20);
YGNodeStyleSetMargin(root_child1, YGEdgeRight, 20);
YGNodeStyleSetMargin(root_child1, YGEdgeBottom, 20);
YGNodeStyleSetWidth(root_child1, 200);
YGNodeStyleSetHeight(root_child1, 200);
YGNodeInsertChild(root, root_child1, 1);
const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
YGNodeStyleSetWidth(root_child2, 100);
YGNodeStyleSetHeight(root_child2, 100);
YGNodeInsertChild(root, root_child2, 2);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(700, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(250, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(200, YGNodeLayoutGetLeft(root_child1));
ASSERT_FLOAT_EQ(250, YGNodeLayoutGetTop(root_child1));
ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child1));
ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child1));
ASSERT_FLOAT_EQ(420, YGNodeLayoutGetLeft(root_child2));
ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child2));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(700, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(350, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(30, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(300, YGNodeLayoutGetLeft(root_child1));
ASSERT_FLOAT_EQ(250, YGNodeLayoutGetTop(root_child1));
ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child1));
ASSERT_FLOAT_EQ(200, YGNodeLayoutGetHeight(root_child1));
ASSERT_FLOAT_EQ(180, YGNodeLayoutGetLeft(root_child2));
ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child2));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
YGNodeFreeRecursive(root);
YGConfigFree(config);
}
TEST(YogaTest, wrapped_column_max_height_flex) {
const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetJustifyContent(root, YGJustifyCenter);
YGNodeStyleSetAlignContent(root, YGAlignCenter);
YGNodeStyleSetAlignItems(root, YGAlignCenter);
YGNodeStyleSetFlexWrap(root, YGWrapWrap);
YGNodeStyleSetWidth(root, 700);
YGNodeStyleSetHeight(root, 500);
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetFlexGrow(root_child0, 1);
YGNodeStyleSetFlexShrink(root_child0, 1);
YGNodeStyleSetFlexBasisPercent(root_child0, 0);
YGNodeStyleSetWidth(root_child0, 100);
YGNodeStyleSetHeight(root_child0, 500);
YGNodeStyleSetMaxHeight(root_child0, 200);
YGNodeInsertChild(root, root_child0, 0);
const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
YGNodeStyleSetFlexGrow(root_child1, 1);
YGNodeStyleSetFlexShrink(root_child1, 1);
YGNodeStyleSetFlexBasisPercent(root_child1, 0);
YGNodeStyleSetMargin(root_child1, YGEdgeLeft, 20);
YGNodeStyleSetMargin(root_child1, YGEdgeTop, 20);
YGNodeStyleSetMargin(root_child1, YGEdgeRight, 20);
YGNodeStyleSetMargin(root_child1, YGEdgeBottom, 20);
YGNodeStyleSetWidth(root_child1, 200);
YGNodeStyleSetHeight(root_child1, 200);
YGNodeInsertChild(root, root_child1, 1);
const YGNodeRef root_child2 = YGNodeNewWithConfig(config);
YGNodeStyleSetWidth(root_child2, 100);
YGNodeStyleSetHeight(root_child2, 100);
YGNodeInsertChild(root, root_child2, 2);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(700, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(300, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(180, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(250, YGNodeLayoutGetLeft(root_child1));
ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child1));
ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child1));
ASSERT_FLOAT_EQ(180, YGNodeLayoutGetHeight(root_child1));
ASSERT_FLOAT_EQ(300, YGNodeLayoutGetLeft(root_child2));
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetTop(root_child2));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(700, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(300, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(180, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(250, YGNodeLayoutGetLeft(root_child1));
ASSERT_FLOAT_EQ(200, YGNodeLayoutGetTop(root_child1));
ASSERT_FLOAT_EQ(200, YGNodeLayoutGetWidth(root_child1));
ASSERT_FLOAT_EQ(180, YGNodeLayoutGetHeight(root_child1));
ASSERT_FLOAT_EQ(300, YGNodeLayoutGetLeft(root_child2));
ASSERT_FLOAT_EQ(400, YGNodeLayoutGetTop(root_child2));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
YGNodeFreeRecursive(root);
YGConfigFree(config);
}

View File

@@ -8,23 +8,33 @@
*/ */
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <yoga/Yoga.h>
#include <stdarg.h> #include <stdarg.h>
#include <yoga/Yoga.h>
namespace { namespace {
char writeBuffer[4096]; char writeBuffer[4096];
int _unmanagedLogger(YGLogLevel level, const char *format, va_list args) { int _unmanagedLogger(const YGConfigRef config,
return vsnprintf(writeBuffer + strlen(writeBuffer), sizeof(writeBuffer) - strlen(writeBuffer), format, args); const YGNodeRef node,
YGLogLevel level,
const char *format,
va_list args) {
return vsnprintf(writeBuffer + strlen(writeBuffer),
sizeof(writeBuffer) - strlen(writeBuffer),
format,
args);
} }
} }
TEST(YogaTest, logger_default_node_should_print_no_style_info) { TEST(YogaTest, logger_default_node_should_print_no_style_info) {
writeBuffer[0] = '\0'; writeBuffer[0] = '\0';
YGSetLogger(_unmanagedLogger); const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNew(); YGConfigSetLogger(config, _unmanagedLogger);
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeCalculateLayout(root, YGUnitUndefined, YGUnitUndefined, YGDirectionLTR); YGNodeCalculateLayout(root, YGUnitUndefined, YGUnitUndefined, YGDirectionLTR);
YGNodePrint(root, (YGPrintOptions)(YGPrintOptionsLayout | YGPrintOptionsChildren | YGPrintOptionsStyle)); YGNodePrint(root,
YGSetLogger(NULL); (YGPrintOptions)(YGPrintOptionsLayout | YGPrintOptionsChildren |
YGPrintOptionsStyle));
YGConfigSetLogger(config, NULL);
YGNodeFree(root); YGNodeFree(root);
const char *expected = "<div layout=\"width: 0; height: 0; top: 0; left: 0;\" style=\"\" ></div>"; const char *expected = "<div layout=\"width: 0; height: 0; top: 0; left: 0;\" style=\"\" ></div>";
@@ -33,8 +43,9 @@ TEST(YogaTest, logger_default_node_should_print_no_style_info) {
TEST(YogaTest, logger_node_with_percentage_absolute_position_and_margin) { TEST(YogaTest, logger_node_with_percentage_absolute_position_and_margin) {
writeBuffer[0] = '\0'; writeBuffer[0] = '\0';
YGSetLogger(_unmanagedLogger); const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNew(); YGConfigSetLogger(config, _unmanagedLogger);
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute); YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute);
YGNodeStyleSetWidthPercent(root, 50); YGNodeStyleSetWidthPercent(root, 50);
YGNodeStyleSetHeightPercent(root, 75); YGNodeStyleSetHeightPercent(root, 75);
@@ -42,27 +53,37 @@ TEST(YogaTest, logger_node_with_percentage_absolute_position_and_margin) {
YGNodeStyleSetMargin(root, YGEdgeRight, 10); YGNodeStyleSetMargin(root, YGEdgeRight, 10);
YGNodeStyleSetMarginAuto(root, YGEdgeLeft); YGNodeStyleSetMarginAuto(root, YGEdgeLeft);
YGNodeCalculateLayout(root, YGUnitUndefined, YGUnitUndefined, YGDirectionLTR); YGNodeCalculateLayout(root, YGUnitUndefined, YGUnitUndefined, YGDirectionLTR);
YGNodePrint(root, (YGPrintOptions)(YGPrintOptionsLayout | YGPrintOptionsChildren | YGPrintOptionsStyle)); YGNodePrint(root,
YGSetLogger(NULL); (YGPrintOptions)(YGPrintOptionsLayout | YGPrintOptionsChildren |
YGPrintOptionsStyle));
YGConfigSetLogger(config, NULL);
YGNodeFree(root); YGNodeFree(root);
const char * expected = "<div layout=\"width: 0; height: 0; top: 0; left: 0;\" style=\"flex: 1; margin-left: auto; margin-right: 10px; width: 50%; height: 75%; position: absolute; \" ></div>"; const char *expected = "<div layout=\"width: 0; height: 0; top: 0; left: 0;\" style=\"flex: 1; "
"margin-left: auto; margin-right: 10px; width: 50%; height: 75%; "
"position: absolute; \" ></div>";
ASSERT_STREQ(expected, writeBuffer); ASSERT_STREQ(expected, writeBuffer);
} }
TEST(YogaTest, logger_node_with_children_should_print_indented) { TEST(YogaTest, logger_node_with_children_should_print_indented) {
writeBuffer[0] = '\0'; writeBuffer[0] = '\0';
YGSetLogger(_unmanagedLogger); const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNew(); YGConfigSetLogger(config, _unmanagedLogger);
const YGNodeRef child0 = YGNodeNew(); const YGNodeRef root = YGNodeNewWithConfig(config);
const YGNodeRef child1 = YGNodeNew(); const YGNodeRef child0 = YGNodeNewWithConfig(config);
const YGNodeRef child1 = YGNodeNewWithConfig(config);
YGNodeInsertChild(root, child0, 0); YGNodeInsertChild(root, child0, 0);
YGNodeInsertChild(root, child1, 1); YGNodeInsertChild(root, child1, 1);
YGNodeCalculateLayout(root, YGUnitUndefined, YGUnitUndefined, YGDirectionLTR); YGNodeCalculateLayout(root, YGUnitUndefined, YGUnitUndefined, YGDirectionLTR);
YGNodePrint(root, (YGPrintOptions)(YGPrintOptionsLayout | YGPrintOptionsChildren | YGPrintOptionsStyle)); YGNodePrint(root,
YGSetLogger(NULL); (YGPrintOptions)(YGPrintOptionsLayout | YGPrintOptionsChildren |
YGPrintOptionsStyle));
YGConfigSetLogger(config, NULL);
YGNodeFreeRecursive(root); YGNodeFreeRecursive(root);
const char * expected = "<div layout=\"width: 0; height: 0; top: 0; left: 0;\" style=\"\" >\n <div layout=\"width: 0; height: 0; top: 0; left: 0;\" style=\"\" ></div>\n <div layout=\"width: 0; height: 0; top: 0; left: 0;\" style=\"\" ></div>\n</div>"; const char *expected = "<div layout=\"width: 0; height: 0; top: 0; left: 0;\" style=\"\" >\n "
"<div layout=\"width: 0; height: 0; top: 0; left: 0;\" style=\"\" "
"></div>\n <div layout=\"width: 0; height: 0; top: 0; left: 0;\" "
"style=\"\" ></div>\n</div>";
ASSERT_STREQ(expected, writeBuffer); ASSERT_STREQ(expected, writeBuffer);
} }

View File

@@ -25,6 +25,20 @@ static YGSize _measure(YGNodeRef node,
}; };
} }
static YGSize _simulate_wrapping_text(YGNodeRef node,
float width,
YGMeasureMode widthMode,
float height,
YGMeasureMode heightMode) {
if (widthMode == YGMeasureModeUndefined || width >= 68) {
return YGSize{.width = 68, .height = 16};
}
return YGSize{
.width = 50, .height = 32,
};
}
TEST(YogaTest, dont_measure_single_grow_shrink_child) { TEST(YogaTest, dont_measure_single_grow_shrink_child) {
const YGNodeRef root = YGNodeNew(); const YGNodeRef root = YGNodeNew();
YGNodeStyleSetWidth(root, 100); YGNodeStyleSetWidth(root, 100);
@@ -179,6 +193,346 @@ TEST(YogaTest, dont_measure_when_min_equals_max_mixed_height_percent) {
YGNodeFreeRecursive(root); YGNodeFreeRecursive(root);
} }
TEST(YogaTest, measure_enough_size_should_be_in_single_line) {
const YGNodeRef root = YGNodeNew();
YGNodeStyleSetWidth(root, 100);
const YGNodeRef root_child0 = YGNodeNew();
YGNodeStyleSetAlignSelf(root_child0, YGAlignFlexStart);
YGNodeSetMeasureFunc(root_child0, _simulate_wrapping_text);
YGNodeInsertChild(root, root_child0, 0);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(68, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(16, YGNodeLayoutGetHeight(root_child0));
YGNodeFreeRecursive(root);
}
TEST(YogaTest, measure_not_enough_size_should_wrap) {
const YGNodeRef root = YGNodeNew();
YGNodeStyleSetWidth(root, 55);
const YGNodeRef root_child0 = YGNodeNew();
YGNodeStyleSetAlignSelf(root_child0, YGAlignFlexStart);
YGNodeSetMeasureFunc(root_child0, _simulate_wrapping_text);
YGNodeInsertChild(root, root_child0, 0);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(32, YGNodeLayoutGetHeight(root_child0));
YGNodeFreeRecursive(root);
}
TEST(YogaTest, measure_zero_space_should_grow) {
const YGNodeRef root = YGNodeNew();
YGNodeStyleSetHeight(root, 200);
YGNodeStyleSetFlexDirection(root, YGFlexDirectionColumn);
YGNodeStyleSetFlexGrow(root, 0);
int measureCount = 0;
const YGNodeRef root_child0 = YGNodeNew();
YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionColumn);
YGNodeStyleSetPadding(root_child0, YGEdgeAll, 100);
YGNodeSetContext(root_child0, &measureCount);
YGNodeSetMeasureFunc(root_child0, _measure);
YGNodeInsertChild(root, root_child0, 0);
YGNodeCalculateLayout(root, 282, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(282, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
YGNodeFreeRecursive(root);
}
TEST(YogaTest, measure_flex_direction_row_and_padding) {
const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
YGNodeStyleSetPadding(root, YGEdgeLeft, 25);
YGNodeStyleSetPadding(root, YGEdgeTop, 25);
YGNodeStyleSetPadding(root, YGEdgeRight, 25);
YGNodeStyleSetPadding(root, YGEdgeBottom, 25);
YGNodeStyleSetWidth(root, 50);
YGNodeStyleSetHeight(root, 50);
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeSetMeasureFunc(root_child0, _simulate_wrapping_text);
YGNodeInsertChild(root, root_child0, 0);
const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
YGNodeStyleSetWidth(root_child1, 5);
YGNodeStyleSetHeight(root_child1, 5);
YGNodeInsertChild(root, root_child1, 1);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(25, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(25, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(75, YGNodeLayoutGetLeft(root_child1));
ASSERT_FLOAT_EQ(25, YGNodeLayoutGetTop(root_child1));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetWidth(root_child1));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetHeight(root_child1));
YGNodeFreeRecursive(root);
YGConfigFree(config);
}
TEST(YogaTest, measure_flex_direction_column_and_padding) {
const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetMargin(root, YGEdgeTop, 20);
YGNodeStyleSetPadding(root, YGEdgeAll, 25);
YGNodeStyleSetWidth(root, 50);
YGNodeStyleSetHeight(root, 50);
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeSetMeasureFunc(root_child0, _simulate_wrapping_text);
YGNodeInsertChild(root, root_child0, 0);
const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
YGNodeStyleSetWidth(root_child1, 5);
YGNodeStyleSetHeight(root_child1, 5);
YGNodeInsertChild(root, root_child1, 1);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(25, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(25, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(32, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(25, YGNodeLayoutGetLeft(root_child1));
ASSERT_FLOAT_EQ(57, YGNodeLayoutGetTop(root_child1));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetWidth(root_child1));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetHeight(root_child1));
YGNodeFreeRecursive(root);
YGConfigFree(config);
}
TEST(YogaTest, measure_flex_direction_row_no_padding) {
const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
YGNodeStyleSetMargin(root, YGEdgeTop, 20);
YGNodeStyleSetWidth(root, 50);
YGNodeStyleSetHeight(root, 50);
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeSetMeasureFunc(root_child0, _simulate_wrapping_text);
YGNodeInsertChild(root, root_child0, 0);
const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
YGNodeStyleSetWidth(root_child1, 5);
YGNodeStyleSetHeight(root_child1, 5);
YGNodeInsertChild(root, root_child1, 1);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child1));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetWidth(root_child1));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetHeight(root_child1));
YGNodeFreeRecursive(root);
YGConfigFree(config);
}
TEST(YogaTest, measure_flex_direction_row_no_padding_align_items_flexstart) {
const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
YGNodeStyleSetMargin(root, YGEdgeTop, 20);
YGNodeStyleSetWidth(root, 50);
YGNodeStyleSetHeight(root, 50);
YGNodeStyleSetAlignItems(root, YGAlignFlexStart);
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeSetMeasureFunc(root_child0, _simulate_wrapping_text);
YGNodeInsertChild(root, root_child0, 0);
const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
YGNodeStyleSetWidth(root_child1, 5);
YGNodeStyleSetHeight(root_child1, 5);
YGNodeInsertChild(root, root_child1, 1);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(32, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child1));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetWidth(root_child1));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetHeight(root_child1));
YGNodeFreeRecursive(root);
YGConfigFree(config);
}
TEST(YogaTest, measure_with_fixed_size) {
const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetMargin(root, YGEdgeTop, 20);
YGNodeStyleSetPadding(root, YGEdgeAll, 25);
YGNodeStyleSetWidth(root, 50);
YGNodeStyleSetHeight(root, 50);
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeSetMeasureFunc(root_child0, _simulate_wrapping_text);
YGNodeStyleSetWidth(root_child0, 10);
YGNodeStyleSetHeight(root_child0, 10);
YGNodeInsertChild(root, root_child0, 0);
const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
YGNodeStyleSetWidth(root_child1, 5);
YGNodeStyleSetHeight(root_child1, 5);
YGNodeInsertChild(root, root_child1, 1);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(25, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(25, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(10, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(25, YGNodeLayoutGetLeft(root_child1));
ASSERT_FLOAT_EQ(35, YGNodeLayoutGetTop(root_child1));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetWidth(root_child1));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetHeight(root_child1));
YGNodeFreeRecursive(root);
YGConfigFree(config);
}
TEST(YogaTest, measure_with_flex_shrink) {
const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetMargin(root, YGEdgeTop, 20);
YGNodeStyleSetPadding(root, YGEdgeAll, 25);
YGNodeStyleSetWidth(root, 50);
YGNodeStyleSetHeight(root, 50);
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeSetMeasureFunc(root_child0, _simulate_wrapping_text);
YGNodeStyleSetFlexShrink(root_child0, 1);
YGNodeInsertChild(root, root_child0, 0);
const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
YGNodeStyleSetWidth(root_child1, 5);
YGNodeStyleSetHeight(root_child1, 5);
YGNodeInsertChild(root, root_child1, 1);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(25, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(25, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(25, YGNodeLayoutGetLeft(root_child1));
ASSERT_FLOAT_EQ(25, YGNodeLayoutGetTop(root_child1));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetWidth(root_child1));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetHeight(root_child1));
YGNodeFreeRecursive(root);
YGConfigFree(config);
}
TEST(YogaTest, measure_no_padding) {
const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetMargin(root, YGEdgeTop, 20);
YGNodeStyleSetWidth(root, 50);
YGNodeStyleSetHeight(root, 50);
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeSetMeasureFunc(root_child0, _simulate_wrapping_text);
YGNodeStyleSetFlexShrink(root_child0, 1);
YGNodeInsertChild(root, root_child0, 0);
const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
YGNodeStyleSetWidth(root_child1, 5);
YGNodeStyleSetHeight(root_child1, 5);
YGNodeInsertChild(root, root_child1, 1);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(32, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
ASSERT_FLOAT_EQ(32, YGNodeLayoutGetTop(root_child1));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetWidth(root_child1));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetHeight(root_child1));
YGNodeFreeRecursive(root);
YGConfigFree(config);
}
#if GTEST_HAS_DEATH_TEST #if GTEST_HAS_DEATH_TEST
TEST(YogaDeathTest, cannot_add_child_to_node_with_measure_func) { TEST(YogaDeathTest, cannot_add_child_to_node_with_measure_func) {
const YGNodeRef root = YGNodeNew(); const YGNodeRef root = YGNodeNew();
@@ -209,4 +563,3 @@ TEST(YogaTest, can_nullify_measure_func_on_any_node) {
ASSERT_TRUE(YGNodeGetMeasureFunc(root) == NULL); ASSERT_TRUE(YGNodeGetMeasureFunc(root) == NULL);
YGNodeFreeRecursive(root); YGNodeFreeRecursive(root);
} }

View File

@@ -11,6 +11,7 @@
#include <yoga/Yoga.h> #include <yoga/Yoga.h>
extern int32_t gNodeInstanceCount; extern int32_t gNodeInstanceCount;
extern int32_t gConfigInstanceCount;
static int testMallocCount; static int testMallocCount;
static int testCallocCount; static int testCallocCount;
@@ -39,6 +40,7 @@ static void testFree(void *ptr) {
TEST(YogaTest, memory_func_default) { TEST(YogaTest, memory_func_default) {
gNodeInstanceCount = 0; // Reset YGNode instance count for memory func test gNodeInstanceCount = 0; // Reset YGNode instance count for memory func test
gConfigInstanceCount = 0; // Reset YGConfig instance count for memory func test
YGSetMemoryFuncs(NULL, NULL, NULL, NULL); YGSetMemoryFuncs(NULL, NULL, NULL, NULL);
const YGNodeRef root = YGNodeNew(); const YGNodeRef root = YGNodeNew();
const YGNodeRef root_child0 = YGNodeNew(); const YGNodeRef root_child0 = YGNodeNew();
@@ -48,6 +50,7 @@ TEST(YogaTest, memory_func_default) {
TEST(YogaTest, memory_func_test_funcs) { TEST(YogaTest, memory_func_test_funcs) {
gNodeInstanceCount = 0; // Reset YGNode instance count for memory func test gNodeInstanceCount = 0; // Reset YGNode instance count for memory func test
gConfigInstanceCount = 0; // Reset YGConfig instance count for memory func test
YGSetMemoryFuncs(&testMalloc, &testCalloc, &testRealloc, &testFree); YGSetMemoryFuncs(&testMalloc, &testCalloc, &testRealloc, &testFree);
const YGNodeRef root = YGNodeNew(); const YGNodeRef root = YGNodeNew();
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
@@ -65,6 +68,7 @@ TEST(YogaTest, memory_func_test_funcs) {
#if GTEST_HAS_DEATH_TEST #if GTEST_HAS_DEATH_TEST
TEST(YogaDeathTest, memory_func_assert_zero_nodes) { TEST(YogaDeathTest, memory_func_assert_zero_nodes) {
gNodeInstanceCount = 0; // Reset YGNode instance count for memory func test gNodeInstanceCount = 0; // Reset YGNode instance count for memory func test
gConfigInstanceCount = 0; // Reset YGConfig instance count for memory func test
const YGNodeRef root = YGNodeNew(); const YGNodeRef root = YGNodeNew();
ASSERT_DEATH(YGSetMemoryFuncs(&testMalloc, &testCalloc, &testRealloc, &testFree), ASSERT_DEATH(YGSetMemoryFuncs(&testMalloc, &testCalloc, &testRealloc, &testFree),
"Cannot set memory functions: all node must be freed first"); "Cannot set memory functions: all node must be freed first");
@@ -73,6 +77,7 @@ TEST(YogaDeathTest, memory_func_assert_zero_nodes) {
TEST(YogaDeathTest, memory_func_assert_all_non_null) { TEST(YogaDeathTest, memory_func_assert_all_non_null) {
gNodeInstanceCount = 0; // Reset YGNode instance count for memory func test gNodeInstanceCount = 0; // Reset YGNode instance count for memory func test
gConfigInstanceCount = 0; // Reset YGConfig instance count for memory func test
ASSERT_DEATH(YGSetMemoryFuncs(NULL, &testCalloc, &testRealloc, &testFree), ASSERT_DEATH(YGSetMemoryFuncs(NULL, &testCalloc, &testRealloc, &testFree),
"Cannot set memory functions: functions must be all NULL or Non-NULL"); "Cannot set memory functions: functions must be all NULL or Non-NULL");
} }

View File

@@ -359,7 +359,6 @@ TEST(YogaTest, justify_content_overflow_min_max) {
TEST(YogaTest, flex_grow_to_min) { TEST(YogaTest, flex_grow_to_min) {
const YGConfigRef config = YGConfigNew(); const YGConfigRef config = YGConfigNew();
YGConfigSetExperimentalFeatureEnabled(config, YGExperimentalFeatureMinFlexFix, true);
const YGNodeRef root = YGNodeNewWithConfig(config); const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetWidth(root, 100); YGNodeStyleSetWidth(root, 100);
@@ -415,7 +414,6 @@ TEST(YogaTest, flex_grow_to_min) {
TEST(YogaTest, flex_grow_in_at_most_container) { TEST(YogaTest, flex_grow_in_at_most_container) {
const YGConfigRef config = YGConfigNew(); const YGConfigRef config = YGConfigNew();
YGConfigSetExperimentalFeatureEnabled(config, YGExperimentalFeatureMinFlexFix, true);
const YGNodeRef root = YGNodeNewWithConfig(config); const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);

Some files were not shown because too many files have changed in this diff Show More