Compare commits

..

1 Commits

Author SHA1 Message Date
Lukas Wöhrl
2a3d9ba20e transfer current layout before calling basline function
do not reset newLayoutFlag on baseline transfer

fixed bad method call

fix reference
2018-04-28 12:58:10 +02:00
65 changed files with 14350 additions and 2634 deletions

3
BUCK
View File

@@ -2,7 +2,8 @@
# #
# This source code is licensed under the MIT license found in the # This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree. # LICENSE file in the root directory of this source tree.
load("//:yoga_defs.bzl", "BASE_COMPILER_FLAGS", "GTEST_TARGET", "LIBRARY_COMPILER_FLAGS", "subdir_glob", "yoga_cxx_library", "yoga_cxx_test", "yoga_dep")
load("//:yoga_defs.bzl", "LIBRARY_COMPILER_FLAGS", "BASE_COMPILER_FLAGS", "GTEST_TARGET", "yoga_dep", "yoga_cxx_library", "yoga_cxx_test")
GMOCK_OVERRIDE_FLAGS = [ GMOCK_OVERRIDE_FLAGS = [
# gmock does not mark mocked methods as override, ignore the warnings in tests # gmock does not mark mocked methods as override, ignore the warnings in tests

View File

@@ -1,6 +1,6 @@
Pod::Spec.new do |spec| Pod::Spec.new do |spec|
spec.name = 'Yoga' spec.name = 'Yoga'
spec.version = '1.9.0' spec.version = '1.8.0'
spec.license = { :type => 'MIT', :file => "LICENSE" } spec.license = { :type => 'MIT', :file => "LICENSE" }
spec.homepage = 'https://yogalayout.com/' spec.homepage = 'https://yogalayout.com/'
spec.documentation_url = 'https://yogalayout.com/docs' spec.documentation_url = 'https://yogalayout.com/docs'
@@ -11,14 +11,11 @@ Pod::Spec.new do |spec|
spec.authors = 'Facebook' spec.authors = 'Facebook'
spec.source = { spec.source = {
:git => 'https://github.com/facebook/yoga.git', :git => 'https://github.com/facebook/yoga.git',
:tag => spec.version.to_s, :tag => '1.8.0',
} }
spec.platforms = { :ios => "8.0", :tvos => "10.0" } spec.osx.deployment_target = '10.13'
spec.module_name = 'yoga' spec.module_name = 'yoga'
spec.requires_arc = false spec.requires_arc = false
spec.pod_target_xcconfig = {
'DEFINES_MODULE' => 'YES'
}
spec.compiler_flags = [ spec.compiler_flags = [
'-fno-omit-frame-pointer', '-fno-omit-frame-pointer',
'-fexceptions', '-fexceptions',

View File

@@ -1,6 +1,6 @@
podspec = Pod::Spec.new do |spec| podspec = Pod::Spec.new do |spec|
spec.name = 'YogaKit' spec.name = 'YogaKit'
spec.version = '1.9.0' spec.version = '1.7.0'
spec.license = { :type => 'MIT', :file => "LICENSE" } spec.license = { :type => 'MIT', :file => "LICENSE" }
spec.homepage = 'https://facebook.github.io/yoga/' spec.homepage = 'https://facebook.github.io/yoga/'
spec.documentation_url = 'https://facebook.github.io/yoga/docs/api/yogakit/' spec.documentation_url = 'https://facebook.github.io/yoga/docs/api/yogakit/'
@@ -11,14 +11,14 @@ podspec = Pod::Spec.new do |spec|
spec.authors = 'Facebook' spec.authors = 'Facebook'
spec.source = { spec.source = {
:git => 'https://github.com/facebook/yoga.git', :git => 'https://github.com/facebook/yoga.git',
:tag => spec.version.to_s, :tag => '1.7.0',
} }
spec.platform = :ios spec.platform = :ios
spec.ios.deployment_target = '8.0' spec.ios.deployment_target = '8.0'
spec.ios.frameworks = 'UIKit' spec.ios.frameworks = 'UIKit'
spec.dependency 'Yoga', '~> 1.9' spec.dependency 'Yoga', '~> 1.7'
spec.source_files = 'YogaKit/Source/*.{h,m,swift}' 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'

View File

@@ -2,7 +2,8 @@
# #
# This source code is licensed under the MIT license found in the # This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree. # LICENSE file in the root directory of this source tree.
load("//:yoga_defs.bzl", "subdir_glob", "yoga_apple_library", "yoga_apple_test", "yoga_dep")
load("//:yoga_defs.bzl", "yoga_dep", "yoga_apple_library", "yoga_apple_test")
COMPILER_FLAGS = [ COMPILER_FLAGS = [
"-fobjc-arc", "-fobjc-arc",

View File

@@ -4,7 +4,7 @@
# This source code is licensed under the license found in the # This source code is licensed under the license found in the
# LICENSE-examples file in the root directory of this source tree. # LICENSE-examples file in the root directory of this source tree.
load("//:yoga_defs.bzl", "ANDROID_RES_TARGET", "ANDROID_SAMPLE_JAVA_TARGET", "ANDROID_SAMPLE_RES_TARGET", "yoga_android_binary", "yoga_android_resource") load("//:yoga_defs.bzl", "ANDROID_SAMPLE_JAVA_TARGET", "ANDROID_SAMPLE_RES_TARGET", "ANDROID_RES_TARGET", "yoga_android_binary", "yoga_android_resource")
yoga_android_binary( yoga_android_binary(
name = "sample", name = "sample",

View File

@@ -2,9 +2,10 @@
# #
# This source code is licensed under the MIT license found in the # This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree. # LICENSE file in the root directory of this source tree.
load("//:yoga_defs.bzl", "subdir_glob", "yoga_cxx_binary", "yoga_dep")
yoga_cxx_binary( load("//:yoga_defs.bzl", "yoga_dep", "ANDROID", "APPLE")
cxx_binary(
name = "benchmark", name = "benchmark",
srcs = glob(["*.c"]), srcs = glob(["*.c"]),
headers = subdir_glob([("", "*.h")]), headers = subdir_glob([("", "*.h")]),
@@ -17,6 +18,7 @@ yoga_cxx_binary(
"-O3", "-O3",
"-std=c11", "-std=c11",
], ],
platforms = (ANDROID, APPLE),
visibility = ["PUBLIC"], visibility = ["PUBLIC"],
deps = [ deps = [
yoga_dep(":yoga"), yoga_dep(":yoga"),

View File

@@ -5,72 +5,10 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
#include <math.h> #include "YGBenchmark.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <yoga/Yoga.h> #include <yoga/Yoga.h>
#define NUM_REPETITIONS 1000
#define YGBENCHMARKS(BLOCK) \
int main(int argc, char const *argv[]) { \
clock_t __start; \
clock_t __endTimes[NUM_REPETITIONS]; \
{ BLOCK } \
return 0; \
}
#define YGBENCHMARK(NAME, BLOCK) \
__start = clock(); \
for (uint32_t __i = 0; __i < NUM_REPETITIONS; __i++) { \
{ BLOCK } \
__endTimes[__i] = clock(); \
} \
__printBenchmarkResult(NAME, __start, __endTimes);
static int __compareDoubles(const void *a, const void *b) {
double arg1 = *(const double *) a;
double arg2 = *(const double *) b;
if (arg1 < arg2) {
return -1;
}
if (arg1 > arg2) {
return 1;
}
return 0;
}
static void __printBenchmarkResult(char *name, clock_t start, clock_t *endTimes) {
double timesInMs[NUM_REPETITIONS];
double mean = 0;
clock_t lastEnd = start;
for (uint32_t i = 0; i < NUM_REPETITIONS; i++) {
timesInMs[i] = (endTimes[i] - lastEnd) / (double) CLOCKS_PER_SEC * 1000;
lastEnd = endTimes[i];
mean += timesInMs[i];
}
mean /= NUM_REPETITIONS;
qsort(timesInMs, NUM_REPETITIONS, sizeof(double), __compareDoubles);
double median = timesInMs[NUM_REPETITIONS / 2];
double variance = 0;
for (uint32_t i = 0; i < NUM_REPETITIONS; i++) {
variance += pow(timesInMs[i] - mean, 2);
}
variance /= NUM_REPETITIONS;
double stddev = sqrt(variance);
printf("%s: median: %lf ms, stddev: %lf ms\n", name, median, stddev);
}
static YGSize _measure(YGNodeRef node, static YGSize _measure(YGNodeRef node,
float width, float width,
YGMeasureMode widthMode, YGMeasureMode widthMode,
@@ -159,7 +97,7 @@ YGBENCHMARKS({
YGNodeStyleSetHeight(grandGrandChild, 10); YGNodeStyleSetHeight(grandGrandChild, 10);
YGNodeInsertChild(grandChild, grandGrandChild, 0); YGNodeInsertChild(grandChild, grandGrandChild, 0);
for (uint32_t iiii = 0; iiii < 10; iiii++) { for (uint32_t iii = 0; iii < 10; iii++) {
const YGNodeRef grandGrandGrandChild = YGNodeNew(); const YGNodeRef grandGrandGrandChild = YGNodeNew();
YGNodeStyleSetFlexDirection(grandGrandGrandChild, YGFlexDirectionRow); YGNodeStyleSetFlexDirection(grandGrandGrandChild, YGFlexDirectionRow);
YGNodeStyleSetFlexGrow(grandGrandGrandChild, 1); YGNodeStyleSetFlexGrow(grandGrandGrandChild, 1);

71
benchmark/YGBenchmark.h Normal file
View File

@@ -0,0 +1,71 @@
/**
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <math.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUM_REPETITIONS 1000
#define YGBENCHMARKS(BLOCK) \
int main(int argc, char const *argv[]) { \
clock_t __start; \
clock_t __endTimes[NUM_REPETITIONS]; \
{ BLOCK } \
return 0; \
}
#define YGBENCHMARK(NAME, BLOCK) \
__start = clock(); \
for (uint32_t __i = 0; __i < NUM_REPETITIONS; __i++) { \
{ BLOCK } \
__endTimes[__i] = clock(); \
} \
__printBenchmarkResult(NAME, __start, __endTimes);
int __compareDoubles(const void *a, const void *b) {
double arg1 = *(const double *) a;
double arg2 = *(const double *) b;
if (arg1 < arg2) {
return -1;
}
if (arg1 > arg2) {
return 1;
}
return 0;
}
void __printBenchmarkResult(char *name, clock_t start, clock_t *endTimes) {
double timesInMs[NUM_REPETITIONS];
double mean = 0;
clock_t lastEnd = start;
for (uint32_t i = 0; i < NUM_REPETITIONS; i++) {
timesInMs[i] = (endTimes[i] - lastEnd) / (double) CLOCKS_PER_SEC * 1000;
lastEnd = endTimes[i];
mean += timesInMs[i];
}
mean /= NUM_REPETITIONS;
qsort(timesInMs, NUM_REPETITIONS, sizeof(double), __compareDoubles);
double median = timesInMs[NUM_REPETITIONS / 2];
double variance = 0;
for (uint32_t i = 0; i < NUM_REPETITIONS; i++) {
variance += pow(timesInMs[i] - mean, 2);
}
variance /= NUM_REPETITIONS;
double stddev = sqrt(variance);
printf("%s: median: %lf ms, stddev: %lf ms\n", name, median, stddev);
}

View File

@@ -3,7 +3,7 @@
# This source code is licensed under the MIT license found in the # This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree. # LICENSE file in the root directory of this source tree.
load("//:yoga_defs.bzl", "BASE_COMPILER_FLAGS", "is_apple_platform", "yoga_cxx_library", "yoga_dep") load("//:yoga_defs.bzl", "BASE_COMPILER_FLAGS", "yoga_dep", "yoga_cxx_library", "is_apple_platform")
COMPILER_FLAGS = BASE_COMPILER_FLAGS + ["-std=c++11"] COMPILER_FLAGS = BASE_COMPILER_FLAGS + ["-std=c++11"]
@@ -35,38 +35,37 @@ yoga_cxx_library(
if is_apple_platform(): if is_apple_platform():
yoganet_ios_srcs = [] yoganet_ios_srcs = []
for arch in [ for arch in [
"iphonesimulator-x86_64", 'iphonesimulator-x86_64', 'iphoneos-arm64'
"iphoneos-arm64",
]: ]:
name = "yoganet-" + arch name = 'yoganet-' + arch
yoganet_ios_srcs.append(":" + name) yoganet_ios_srcs.append(':' + name)
genrule( genrule(
name = name, name = name,
srcs = [ srcs = [
yoga_dep(":yogaApple#%s,static" % arch), yoga_dep(':yogaApple#%s,static' % arch),
yoga_dep("YogaKit:YogaKitApple#%s,static" % arch), yoga_dep('YogaKit:YogaKitApple#%s,static' % arch),
yoga_dep("csharp:yoganetApple#%s,static" % arch), yoga_dep('csharp:yoganetApple#%s,static' % arch),
], ],
out = "libyoga-%s.a" % arch, out = 'libyoga-%s.a' % arch,
cmd = "libtool -static -o $OUT $SRCS", cmd = 'libtool -static -o $OUT $SRCS',
visibility = [yoga_dep("csharp:yoganet-ios")], visibility = [yoga_dep('csharp:yoganet-ios')],
) )
genrule( genrule(
name = "yoganet-ios", name = 'yoganet-ios',
srcs = yoganet_ios_srcs, srcs = yoganet_ios_srcs,
out = "libyoga.a", out = 'libyoga.a',
cmd = "lipo $SRCS -create -output $OUT", cmd = 'lipo $SRCS -create -output $OUT',
visibility = ["PUBLIC"], visibility = ['PUBLIC'],
) )
yoganet_macosx_target = "csharp:yoganetAppleMac#macosx-%s,dynamic" yoganet_macosx_target = 'csharp:yoganetAppleMac#macosx-%s,dynamic'
genrule( genrule(
name = "yoganet-macosx", name = 'yoganet-macosx',
srcs = [ srcs = [
yoga_dep(yoganet_macosx_target % "x86_64"), yoga_dep(yoganet_macosx_target % 'x86_64')
], ],
out = "libyoga.dylib", out = 'libyoga.dylib',
cmd = "lipo $SRCS -create -output $OUT", cmd = 'lipo $SRCS -create -output $OUT',
visibility = ["PUBLIC"], visibility = ['PUBLIC'],
) )

View File

@@ -3,7 +3,7 @@
# This source code is licensed under the MIT license found in the # This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree. # LICENSE file in the root directory of this source tree.
load("//:yoga_defs.bzl", "ANDROID", "CXX_LIBRARY_WHITELIST", "FBJNI_JAVA_TARGET", "FBJNI_TARGET", "INFER_ANNOTATIONS_TARGET", "JNI_TARGET", "JSR_305_TARGET", "JUNIT_TARGET", "PROGRUARD_ANNOTATIONS_TARGET", "SOLOADER_TARGET", "yoga_cxx_library", "yoga_dep", "yoga_java_binary", "yoga_java_library", "yoga_java_test") load("//:yoga_defs.bzl", "FBJNI_TARGET", "JNI_TARGET", "INFER_ANNOTATIONS_TARGET", "JSR_305_TARGET", "PROGRUARD_ANNOTATIONS_TARGET", "SOLOADER_TARGET", "JUNIT_TARGET", "FBJNI_JAVA_TARGET", "CXX_LIBRARY_WHITELIST", "ANDROID", "yoga_dep", "yoga_cxx_library", "yoga_java_library", "yoga_java_test", "yoga_java_binary")
yoga_cxx_library( yoga_cxx_library(
name = "jni", name = "jni",

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
public class YogaConstants { public class YogaConstants {

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
/** /**

View File

@@ -1,9 +1,8 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
@@ -175,8 +174,6 @@ public class YogaNode implements Cloneable {
jni_YGNodeInsertSharedChild(mNativePointer, child.mNativePointer, i); jni_YGNodeInsertSharedChild(mNativePointer, child.mNativePointer, i);
} }
private native void jni_YGNodeSetOwner(long nativePointer, long newOwnerNativePointer);
private native long jni_YGNodeClone(long nativePointer, Object newNode); private native long jni_YGNodeClone(long nativePointer, Object newNode);
@Override @Override
@@ -184,23 +181,10 @@ public class YogaNode implements Cloneable {
try { try {
YogaNode clonedYogaNode = (YogaNode) super.clone(); YogaNode clonedYogaNode = (YogaNode) super.clone();
long clonedNativePointer = jni_YGNodeClone(mNativePointer, clonedYogaNode); long clonedNativePointer = jni_YGNodeClone(mNativePointer, clonedYogaNode);
if (mChildren != null) {
for (YogaNode child : mChildren) {
child.jni_YGNodeSetOwner(child.mNativePointer, 0);
child.mOwner = null;
}
}
clonedYogaNode.mNativePointer = clonedNativePointer; clonedYogaNode.mNativePointer = clonedNativePointer;
clonedYogaNode.mOwner = null; clonedYogaNode.mOwner = null;
clonedYogaNode.mChildren = clonedYogaNode.mChildren =
mChildren != null ? (List<YogaNode>) ((ArrayList) mChildren).clone() : null; mChildren != null ? (List<YogaNode>) ((ArrayList) mChildren).clone() : null;
if (clonedYogaNode.mChildren != null) {
for (YogaNode child : clonedYogaNode.mChildren) {
child.mOwner = null;
}
}
return clonedYogaNode; return clonedYogaNode;
} catch (CloneNotSupportedException ex) { } catch (CloneNotSupportedException ex) {
// This class implements Cloneable, this should not happen // This class implements Cloneable, this should not happen
@@ -250,14 +234,15 @@ public class YogaNode implements Cloneable {
* {@link YogaNode} is shared between two or more YogaTrees. * {@link YogaNode} is shared between two or more YogaTrees.
*/ */
@Nullable @Nullable
public YogaNode getOwner() { public
YogaNode getOwner() {
return mOwner; return mOwner;
} }
/** @deprecated Use #getOwner() instead. This will be removed in the next version. */ /** @deprecated Use #getOwner() instead. This will be removed in the next version. */
@Deprecated @Deprecated
@Nullable @Nullable
public YogaNode getParent() { YogaNode getParent() {
return getOwner(); return getOwner();
} }

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2017-present, Facebook, Inc. * Copyright (c) 2017-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,167 +0,0 @@
/*
* Copyright (c) 2018-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the LICENSE
* file in the root directory of this source tree.
*
*/
package com.facebook.yoga;
public interface YogaNodeProperties {
YogaNodeProperties clone(YogaNode node);
long getNativePointer();
void onAfterCalculateLayout();
void reset();
boolean hasNewLayout();
boolean isDirty();
void markLayoutSeen();
YogaDirection getStyleDirection();
void setDirection(YogaDirection direction);
YogaFlexDirection getFlexDirection();
void setFlexDirection(YogaFlexDirection flexDirection);
YogaJustify getJustifyContent();
void setJustifyContent(YogaJustify justifyContent);
YogaAlign getAlignItems();
void setAlignItems(YogaAlign alignItems);
YogaAlign getAlignSelf();
void setAlignSelf(YogaAlign alignSelf);
YogaAlign getAlignContent();
void setAlignContent(YogaAlign alignContent);
YogaPositionType getPositionType();
void setPositionType(YogaPositionType positionType);
void setWrap(YogaWrap flexWrap);
YogaOverflow getOverflow();
void setOverflow(YogaOverflow overflow);
YogaDisplay getDisplay();
void setDisplay(YogaDisplay display);
void setFlex(float flex);
float getFlexGrow();
void setFlexGrow(float flexGrow);
float getFlexShrink();
void setFlexShrink(float flexShrink);
YogaValue getFlexBasis();
void setFlexBasis(float flexBasis);
void setFlexBasisPercent(float percent);
void setFlexBasisAuto();
YogaValue getMargin(YogaEdge edge);
void setMargin(YogaEdge edge, float margin);
void setMarginPercent(YogaEdge edge, float percent);
void setMarginAuto(YogaEdge edge);
YogaValue getPadding(YogaEdge edge);
void setPadding(YogaEdge edge, float padding);
void setPaddingPercent(YogaEdge edge, float percent);
float getBorder(YogaEdge edge);
void setBorder(YogaEdge edge, float border);
YogaValue getPosition(YogaEdge edge);
void setPosition(YogaEdge edge, float position);
void setPositionPercent(YogaEdge edge, float percent);
YogaValue getWidth();
void setWidth(float width);
void setWidthPercent(float percent);
void setWidthAuto();
YogaValue getHeight();
void setHeight(float height);
void setHeightPercent(float percent);
void setHeightAuto();
YogaValue getMinWidth();
void setMinWidth(float minWidth);
void setMinWidthPercent(float percent);
YogaValue getMinHeight();
void setMinHeight(float minHeight);
void setMinHeightPercent(float percent);
YogaValue getMaxWidth();
void setMaxWidth(float maxWidth);
void setMaxWidthPercent(float percent);
YogaValue getMaxHeight();
void setMaxHeight(float maxheight);
void setMaxHeightPercent(float percent);
float getAspectRatio();
void setAspectRatio(float aspectRatio);
float getLayoutX();
float getLayoutY();
float getLayoutWidth();
float getLayoutHeight();
boolean getDoesLegacyStretchFlagAffectsLayout();
float getLayoutMargin(YogaEdge edge);
float getLayoutPadding(YogaEdge edge);
float getLayoutBorder(YogaEdge edge);
YogaDirection getLayoutDirection();
}

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /*
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
package com.facebook.yoga; package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.proguard.annotations.DoNotStrip;

View File

@@ -1,10 +1,10 @@
/* /**
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
#include <fb/fbjni.h> #include <fb/fbjni.h>
#include <yoga/YGNode.h> #include <yoga/YGNode.h>
#include <yoga/Yoga.h> #include <yoga/Yoga.h>
@@ -33,67 +33,42 @@ struct YGConfigContext {
} }
}; };
static inline weak_ref<JYogaNode>* YGNodeJobject(YGNodeRef node) { static inline weak_ref<JYogaNode> *YGNodeJobject(YGNodeRef node) {
return reinterpret_cast<weak_ref<JYogaNode>*>(node->getContext()); return reinterpret_cast<weak_ref<JYogaNode>*>(node->getContext());
} }
static void YGTransferLayoutDirection( static void YGTransferLayoutDirection(YGNodeRef node, alias_ref<jobject> javaNode) {
YGNodeRef node, static auto layoutDirectionField = javaNode->getClass()->getField<jint>("mLayoutDirection");
alias_ref<jobject> javaNode) { javaNode->setFieldValue(layoutDirectionField, static_cast<jint>(YGNodeLayoutGetDirection(node)));
static auto layoutDirectionField =
javaNode->getClass()->getField<jint>("mLayoutDirection");
javaNode->setFieldValue(
layoutDirectionField, static_cast<jint>(YGNodeLayoutGetDirection(node)));
} }
static void YGTransferLayoutOutputsRecursive(YGNodeRef root) { static void YGTransferLayoutOutputsRecursiveImpl(YGNodeRef root, bool transferAndResetNewLayoutFlag) {
if (!root->getHasNewLayout()) { if (root->getHasNewLayout()) {
return; if (auto obj = YGNodeJobject(root)->lockLocal()) {
}
auto obj = YGNodeJobject(root)->lockLocal();
if (!obj) {
YGLog(
root,
YGLogLevelError,
"Java YGNode was GCed during layout calculation\n");
return;
}
static auto widthField = obj->getClass()->getField<jfloat>("mWidth"); static auto widthField = obj->getClass()->getField<jfloat>("mWidth");
static auto heightField = obj->getClass()->getField<jfloat>("mHeight"); static auto heightField = obj->getClass()->getField<jfloat>("mHeight");
static auto leftField = obj->getClass()->getField<jfloat>("mLeft"); static auto leftField = obj->getClass()->getField<jfloat>("mLeft");
static auto topField = obj->getClass()->getField<jfloat>("mTop"); static auto topField = obj->getClass()->getField<jfloat>("mTop");
static auto marginLeftField = static auto marginLeftField = obj->getClass()->getField<jfloat>("mMarginLeft");
obj->getClass()->getField<jfloat>("mMarginLeft");
static auto marginTopField = obj->getClass()->getField<jfloat>("mMarginTop"); static auto marginTopField = obj->getClass()->getField<jfloat>("mMarginTop");
static auto marginRightField = static auto marginRightField = obj->getClass()->getField<jfloat>("mMarginRight");
obj->getClass()->getField<jfloat>("mMarginRight"); static auto marginBottomField = obj->getClass()->getField<jfloat>("mMarginBottom");
static auto marginBottomField =
obj->getClass()->getField<jfloat>("mMarginBottom");
static auto paddingLeftField = static auto paddingLeftField = obj->getClass()->getField<jfloat>("mPaddingLeft");
obj->getClass()->getField<jfloat>("mPaddingLeft"); static auto paddingTopField = obj->getClass()->getField<jfloat>("mPaddingTop");
static auto paddingTopField = static auto paddingRightField = obj->getClass()->getField<jfloat>("mPaddingRight");
obj->getClass()->getField<jfloat>("mPaddingTop"); static auto paddingBottomField = obj->getClass()->getField<jfloat>("mPaddingBottom");
static auto paddingRightField =
obj->getClass()->getField<jfloat>("mPaddingRight");
static auto paddingBottomField =
obj->getClass()->getField<jfloat>("mPaddingBottom");
static auto borderLeftField = static auto borderLeftField = obj->getClass()->getField<jfloat>("mBorderLeft");
obj->getClass()->getField<jfloat>("mBorderLeft");
static auto borderTopField = obj->getClass()->getField<jfloat>("mBorderTop"); static auto borderTopField = obj->getClass()->getField<jfloat>("mBorderTop");
static auto borderRightField = static auto borderRightField = obj->getClass()->getField<jfloat>("mBorderRight");
obj->getClass()->getField<jfloat>("mBorderRight"); static auto borderBottomField = obj->getClass()->getField<jfloat>("mBorderBottom");
static auto borderBottomField =
obj->getClass()->getField<jfloat>("mBorderBottom");
static auto edgeSetFlagField = static auto edgeSetFlagField = obj->getClass()->getField<jint>("mEdgeSetFlag");
obj->getClass()->getField<jint>("mEdgeSetFlag"); static auto hasNewLayoutField = obj->getClass()->getField<jboolean>("mHasNewLayout");
static auto hasNewLayoutField = static auto doesLegacyStretchBehaviour =
obj->getClass()->getField<jboolean>("mHasNewLayout"); obj->getClass()->getField<jboolean>(
static auto doesLegacyStretchBehaviour = obj->getClass()->getField<jboolean>(
"mDoesLegacyStretchFlagAffectsLayout"); "mDoesLegacyStretchFlagAffectsLayout");
/* Those flags needs be in sync with YogaNode.java */ /* Those flags needs be in sync with YogaNode.java */
@@ -101,7 +76,7 @@ static void YGTransferLayoutOutputsRecursive(YGNodeRef root) {
const int PADDING = 2; const int PADDING = 2;
const int BORDER = 4; const int BORDER = 4;
int hasEdgeSetFlag = (int)obj->getFieldValue(edgeSetFlagField); int hasEdgeSetFlag = (int) obj->getFieldValue(edgeSetFlagField);
obj->setFieldValue(widthField, YGNodeLayoutGetWidth(root)); obj->setFieldValue(widthField, YGNodeLayoutGetWidth(root));
obj->setFieldValue(heightField, YGNodeLayoutGetHeight(root)); obj->setFieldValue(heightField, YGNodeLayoutGetHeight(root));
@@ -114,7 +89,8 @@ static void YGTransferLayoutOutputsRecursive(YGNodeRef root) {
if ((hasEdgeSetFlag & MARGIN) == MARGIN) { if ((hasEdgeSetFlag & MARGIN) == MARGIN) {
obj->setFieldValue( obj->setFieldValue(
marginLeftField, YGNodeLayoutGetMargin(root, YGEdgeLeft)); marginLeftField, YGNodeLayoutGetMargin(root, YGEdgeLeft));
obj->setFieldValue(marginTopField, YGNodeLayoutGetMargin(root, YGEdgeTop)); obj->setFieldValue(
marginTopField, YGNodeLayoutGetMargin(root, YGEdgeTop));
obj->setFieldValue( obj->setFieldValue(
marginRightField, YGNodeLayoutGetMargin(root, YGEdgeRight)); marginRightField, YGNodeLayoutGetMargin(root, YGEdgeRight));
obj->setFieldValue( obj->setFieldValue(
@@ -122,51 +98,55 @@ static void YGTransferLayoutOutputsRecursive(YGNodeRef root) {
} }
if ((hasEdgeSetFlag & PADDING) == PADDING) { if ((hasEdgeSetFlag & PADDING) == PADDING) {
obj->setFieldValue( obj->setFieldValue(paddingLeftField, YGNodeLayoutGetPadding(root, YGEdgeLeft));
paddingLeftField, YGNodeLayoutGetPadding(root, YGEdgeLeft)); obj->setFieldValue(paddingTopField, YGNodeLayoutGetPadding(root, YGEdgeTop));
obj->setFieldValue( obj->setFieldValue(paddingRightField, YGNodeLayoutGetPadding(root, YGEdgeRight));
paddingTopField, YGNodeLayoutGetPadding(root, YGEdgeTop)); obj->setFieldValue(paddingBottomField, YGNodeLayoutGetPadding(root, YGEdgeBottom));
obj->setFieldValue(
paddingRightField, YGNodeLayoutGetPadding(root, YGEdgeRight));
obj->setFieldValue(
paddingBottomField, YGNodeLayoutGetPadding(root, YGEdgeBottom));
} }
if ((hasEdgeSetFlag & BORDER) == BORDER) { if ((hasEdgeSetFlag & BORDER) == BORDER) {
obj->setFieldValue( obj->setFieldValue(borderLeftField, YGNodeLayoutGetBorder(root, YGEdgeLeft));
borderLeftField, YGNodeLayoutGetBorder(root, YGEdgeLeft));
obj->setFieldValue(borderTopField, YGNodeLayoutGetBorder(root, YGEdgeTop)); obj->setFieldValue(borderTopField, YGNodeLayoutGetBorder(root, YGEdgeTop));
obj->setFieldValue( obj->setFieldValue(borderRightField, YGNodeLayoutGetBorder(root, YGEdgeRight));
borderRightField, YGNodeLayoutGetBorder(root, YGEdgeRight)); obj->setFieldValue(borderBottomField, YGNodeLayoutGetBorder(root, YGEdgeBottom));
obj->setFieldValue(
borderBottomField, YGNodeLayoutGetBorder(root, YGEdgeBottom));
} }
obj->setFieldValue<jboolean>(hasNewLayoutField, true);
YGTransferLayoutDirection(root, obj); YGTransferLayoutDirection(root, obj);
if(transferAndResetNewLayoutFlag){
obj->setFieldValue<jboolean>(hasNewLayoutField, true);
root->setHasNewLayout(false); root->setHasNewLayout(false);
}
for (uint32_t i = 0; i < YGNodeGetChildCount(root); i++) { for (uint32_t i = 0; i < YGNodeGetChildCount(root); i++) {
YGTransferLayoutOutputsRecursive(YGNodeGetChild(root, i)); YGTransferLayoutOutputsRecursiveImpl(YGNodeGetChild(root, i), transferAndResetNewLayoutFlag);
} }
} else {
YGLog(root, YGLogLevelError, "Java YGNode was GCed during layout calculation\n");
}
}
}
static void YGTransferLayoutOutputsRecursive(YGNodeRef root) {
YGTransferLayoutOutputsRecursiveImpl(root, true);
}
static void YGTransferLayoutOutputsRecursiveForBaseline(YGNodeRef root) {
YGTransferLayoutOutputsRecursiveImpl(root, false);
} }
static void YGPrint(YGNodeRef node) { 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( YGLog(node, YGLogLevelError, "Java YGNode was GCed during layout calculation\n");
node,
YGLogLevelError,
"Java YGNode was GCed during layout calculation\n");
} }
} }
static float YGJNIBaselineFunc(YGNodeRef node, float width, float height) { static float YGJNIBaselineFunc(YGNodeRef node, float width, float height) {
if (auto obj = YGNodeJobject(node)->lockLocal()) { if (auto obj = YGNodeJobject(node)->lockLocal()) {
static auto baselineFunc = static auto baselineFunc = findClassStatic("com/facebook/yoga/YogaNode")
findClassStatic("com/facebook/yoga/YogaNode")
->getMethod<jfloat(jfloat, jfloat)>("baseline"); ->getMethod<jfloat(jfloat, jfloat)>("baseline");
YGTransferLayoutOutputsRecursiveForBaseline(node);
return baselineFunc(obj, width, height); return baselineFunc(obj, width, height);
} else { } else {
return height; return height;
@@ -181,17 +161,20 @@ static inline YGConfigRef _jlong2YGConfigRef(jlong addr) {
return reinterpret_cast<YGConfigRef>(static_cast<intptr_t>(addr)); return reinterpret_cast<YGConfigRef>(static_cast<intptr_t>(addr));
} }
static YGNodeRef static YGNodeRef YGJNIOnNodeClonedFunc(
YGJNIOnNodeClonedFunc(YGNodeRef oldNode, YGNodeRef owner, int childIndex) { YGNodeRef oldNode,
YGNodeRef owner,
int childIndex) {
auto config = oldNode->getConfig(); auto config = oldNode->getConfig();
if (!config) { if (!config) {
return nullptr; return nullptr;
} }
static auto onNodeClonedFunc = static auto onNodeClonedFunc = findClassStatic("com/facebook/yoga/YogaConfig")
findClassStatic("com/facebook/yoga/YogaConfig")
->getMethod<alias_ref<JYogaNode>( ->getMethod<alias_ref<JYogaNode>(
local_ref<JYogaNode>, local_ref<JYogaNode>, jint)>("cloneNode"); local_ref<JYogaNode>,
local_ref<JYogaNode>,
jint)>("cloneNode");
auto context = reinterpret_cast<YGConfigContext*>(YGConfigGetContext(config)); auto context = reinterpret_cast<YGConfigContext*>(YGConfigGetContext(config));
auto javaConfig = context->config; auto javaConfig = context->config;
@@ -202,12 +185,15 @@ YGJNIOnNodeClonedFunc(YGNodeRef oldNode, YGNodeRef owner, int childIndex) {
YGNodeJobject(owner)->lockLocal(), YGNodeJobject(owner)->lockLocal(),
childIndex); childIndex);
static auto replaceChild = static auto replaceChild = findClassStatic("com/facebook/yoga/YogaNode")
findClassStatic("com/facebook/yoga/YogaNode") ->getMethod<jlong(
->getMethod<jlong(local_ref<JYogaNode>, jint)>("replaceChild"); local_ref<JYogaNode>,
jint)>("replaceChild");
jlong newNodeNativePointer = jlong newNodeNativePointer = replaceChild(
replaceChild(YGNodeJobject(owner)->lockLocal(), newNode, childIndex); YGNodeJobject(owner)->lockLocal(),
newNode,
childIndex);
return _jlong2YGNodeRef(newNodeNativePointer); return _jlong2YGNodeRef(newNodeNativePointer);
} }
@@ -219,30 +205,24 @@ static YGSize YGJNIMeasureFunc(
float height, float height,
YGMeasureMode heightMode) { YGMeasureMode heightMode) {
if (auto obj = YGNodeJobject(node)->lockLocal()) { if (auto obj = YGNodeJobject(node)->lockLocal()) {
static auto measureFunc = static auto measureFunc = findClassStatic("com/facebook/yoga/YogaNode")
findClassStatic("com/facebook/yoga/YogaNode")
->getMethod<jlong(jfloat, jint, jfloat, jint)>("measure"); ->getMethod<jlong(jfloat, jint, jfloat, jint)>("measure");
YGTransferLayoutDirection(node, obj); YGTransferLayoutDirection(node, obj);
const auto measureResult = const auto measureResult = measureFunc(obj, width, widthMode, height, heightMode);
measureFunc(obj, width, widthMode, height, heightMode);
static_assert( static_assert(sizeof(measureResult) == 8,
sizeof(measureResult) == 8,
"Expected measureResult to be 8 bytes, or two 32 bit ints"); "Expected measureResult to be 8 bytes, or two 32 bit ints");
int32_t wBits = 0xFFFFFFFF & (measureResult >> 32); int32_t wBits = 0xFFFFFFFF & (measureResult >> 32);
int32_t hBits = 0xFFFFFFFF & measureResult; int32_t hBits = 0xFFFFFFFF & measureResult;
const float* measuredWidth = reinterpret_cast<float*>(&wBits); const float *measuredWidth = reinterpret_cast<float *>(&wBits);
const float* measuredHeight = reinterpret_cast<float*>(&hBits); const float *measuredHeight = reinterpret_cast<float *>(&hBits);
return YGSize{*measuredWidth, *measuredHeight}; return YGSize{*measuredWidth, *measuredHeight};
} else { } else {
YGLog( YGLog(node, YGLogLevelError, "Java YGNode was GCed during layout calculation\n");
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,
@@ -254,11 +234,10 @@ struct JYogaLogLevel : public JavaClass<JYogaLogLevel> {
static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaLogLevel;"; static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaLogLevel;";
}; };
static int YGJNILogFunc( static int YGJNILogFunc(const YGConfigRef config,
const YGConfigRef config,
const YGNodeRef node, const YGNodeRef node,
YGLogLevel level, YGLogLevel level,
const char* format, const char *format,
va_list args) { va_list args) {
int result = vsnprintf(NULL, 0, format, args); int result = vsnprintf(NULL, 0, format, args);
std::vector<char> buffer(1 + result); std::vector<char> buffer(1 + result);
@@ -266,16 +245,13 @@ static int YGJNILogFunc(
static auto logFunc = static auto logFunc =
findClassStatic("com/facebook/yoga/YogaLogger") findClassStatic("com/facebook/yoga/YogaLogger")
->getMethod<void( ->getMethod<void(local_ref<JYogaNode>, local_ref<JYogaLogLevel>, jstring)>("log");
local_ref<JYogaNode>, local_ref<JYogaLogLevel>, jstring)>("log");
static auto logLevelFromInt = static auto logLevelFromInt =
JYogaLogLevel::javaClassStatic() JYogaLogLevel::javaClassStatic()->getStaticMethod<JYogaLogLevel::javaobject(jint)>("fromInt");
->getStaticMethod<JYogaLogLevel::javaobject(jint)>("fromInt");
if (auto obj = YGNodeJobject(node)->lockLocal()) { if (auto obj = YGNodeJobject(node)->lockLocal()) {
auto jlogger = auto jlogger = reinterpret_cast<global_ref<jobject> *>(YGConfigGetContext(config));
reinterpret_cast<global_ref<jobject>*>(YGConfigGetContext(config));
logFunc( logFunc(
jlogger->get(), jlogger->get(),
obj, obj,
@@ -303,16 +279,6 @@ jlong jni_YGNodeNewWithConfig(alias_ref<jobject> thiz, jlong configPointer) {
return reinterpret_cast<jlong>(node); return reinterpret_cast<jlong>(node);
} }
void jni_YGNodeSetOwner(
alias_ref<jobject> thiz,
jlong nativePointer,
jlong newOwnerNativePointer) {
const YGNodeRef node = _jlong2YGNodeRef(nativePointer);
const YGNodeRef newOwnerNode = _jlong2YGNodeRef(newOwnerNativePointer);
node->setOwner(newOwnerNode);
}
jlong jni_YGNodeClone( jlong jni_YGNodeClone(
alias_ref<jobject> thiz, alias_ref<jobject> thiz,
jlong nativePointer, jlong nativePointer,
@@ -344,19 +310,13 @@ void jni_YGNodeReset(alias_ref<jobject> thiz, jlong nativePointer) {
void jni_YGNodePrint(alias_ref<jobject> thiz, jlong nativePointer) { void jni_YGNodePrint(alias_ref<jobject> thiz, jlong nativePointer) {
const YGNodeRef node = _jlong2YGNodeRef(nativePointer); const YGNodeRef node = _jlong2YGNodeRef(nativePointer);
YGNodePrint( YGNodePrint(node,
node, (YGPrintOptions)(YGPrintOptionsStyle | YGPrintOptionsLayout |
(YGPrintOptions)( YGPrintOptionsChildren));
YGPrintOptionsStyle | YGPrintOptionsLayout | YGPrintOptionsChildren));
} }
void jni_YGNodeInsertChild( void jni_YGNodeInsertChild(alias_ref<jobject>, jlong nativePointer, jlong childPointer, jint index) {
alias_ref<jobject>, YGNodeInsertChild(_jlong2YGNodeRef(nativePointer), _jlong2YGNodeRef(childPointer), index);
jlong nativePointer,
jlong childPointer,
jint index) {
YGNodeInsertChild(
_jlong2YGNodeRef(nativePointer), _jlong2YGNodeRef(childPointer), index);
} }
void jni_YGNodeInsertSharedChild( void jni_YGNodeInsertSharedChild(
@@ -368,22 +328,16 @@ void jni_YGNodeInsertSharedChild(
_jlong2YGNodeRef(nativePointer), _jlong2YGNodeRef(childPointer), index); _jlong2YGNodeRef(nativePointer), _jlong2YGNodeRef(childPointer), index);
} }
void jni_YGNodeRemoveChild( void jni_YGNodeRemoveChild(alias_ref<jobject>, jlong nativePointer, jlong childPointer) {
alias_ref<jobject>, YGNodeRemoveChild(_jlong2YGNodeRef(nativePointer), _jlong2YGNodeRef(childPointer));
jlong nativePointer,
jlong childPointer) {
YGNodeRemoveChild(
_jlong2YGNodeRef(nativePointer), _jlong2YGNodeRef(childPointer));
} }
void jni_YGNodeCalculateLayout( void jni_YGNodeCalculateLayout(alias_ref<jobject>,
alias_ref<jobject>,
jlong nativePointer, jlong nativePointer,
jfloat width, jfloat width,
jfloat height) { jfloat height) {
const YGNodeRef root = _jlong2YGNodeRef(nativePointer); const YGNodeRef root = _jlong2YGNodeRef(nativePointer);
YGNodeCalculateLayout( YGNodeCalculateLayout(root,
root,
static_cast<float>(width), static_cast<float>(width),
static_cast<float>(height), static_cast<float>(height),
YGNodeStyleGetDirection(_jlong2YGNodeRef(nativePointer))); YGNodeStyleGetDirection(_jlong2YGNodeRef(nativePointer)));
@@ -404,28 +358,20 @@ jboolean jni_YGNodeIsDirty(alias_ref<jobject>, jlong nativePointer) {
return (jboolean)_jlong2YGNodeRef(nativePointer)->isDirty(); return (jboolean)_jlong2YGNodeRef(nativePointer)->isDirty();
} }
void jni_YGNodeSetHasMeasureFunc( void jni_YGNodeSetHasMeasureFunc(alias_ref<jobject>, jlong nativePointer, jboolean hasMeasureFunc) {
alias_ref<jobject>,
jlong nativePointer,
jboolean hasMeasureFunc) {
_jlong2YGNodeRef(nativePointer) _jlong2YGNodeRef(nativePointer)
->setMeasureFunc(hasMeasureFunc ? YGJNIMeasureFunc : nullptr); ->setMeasureFunc(hasMeasureFunc ? YGJNIMeasureFunc : nullptr);
} }
void jni_YGNodeSetHasBaselineFunc( void jni_YGNodeSetHasBaselineFunc(alias_ref<jobject>,
alias_ref<jobject>,
jlong nativePointer, jlong nativePointer,
jboolean hasBaselineFunc) { jboolean hasBaselineFunc) {
_jlong2YGNodeRef(nativePointer) _jlong2YGNodeRef(nativePointer)
->setBaseLineFunc(hasBaselineFunc ? YGJNIBaselineFunc : nullptr); ->setBaseLineFunc(hasBaselineFunc ? YGJNIBaselineFunc : nullptr);
} }
void jni_YGNodeCopyStyle( void jni_YGNodeCopyStyle(alias_ref<jobject>, jlong dstNativePointer, jlong srcNativePointer) {
alias_ref<jobject>, YGNodeCopyStyle(_jlong2YGNodeRef(dstNativePointer), _jlong2YGNodeRef(srcNativePointer));
jlong dstNativePointer,
jlong srcNativePointer) {
YGNodeCopyStyle(
_jlong2YGNodeRef(dstNativePointer), _jlong2YGNodeRef(srcNativePointer));
} }
struct JYogaValue : public JavaClass<JYogaValue> { struct JYogaValue : public JavaClass<JYogaValue> {
@@ -448,75 +394,66 @@ struct JYogaValue : public JavaClass<JYogaValue> {
} }
#define YG_NODE_JNI_STYLE_UNIT_PROP(name) \ #define YG_NODE_JNI_STYLE_UNIT_PROP(name) \
local_ref<jobject> jni_YGNodeStyleGet##name( \ local_ref<jobject> jni_YGNodeStyleGet##name(alias_ref<jobject>, jlong nativePointer) { \
alias_ref<jobject>, jlong nativePointer) { \ return JYogaValue::create(YGNodeStyleGet##name(_jlong2YGNodeRef(nativePointer))); \
return JYogaValue::create( \
YGNodeStyleGet##name(_jlong2YGNodeRef(nativePointer))); \
} \ } \
\ \
void jni_YGNodeStyleSet##name( \ void jni_YGNodeStyleSet##name(alias_ref<jobject>, jlong nativePointer, jfloat value) { \
alias_ref<jobject>, jlong nativePointer, jfloat value) { \ YGNodeStyleSet##name(_jlong2YGNodeRef(nativePointer), static_cast<float>(value)); \
YGNodeStyleSet##name( \
_jlong2YGNodeRef(nativePointer), static_cast<float>(value)); \
} \ } \
\ \
void jni_YGNodeStyleSet##name##Percent( \ void jni_YGNodeStyleSet##name##Percent(alias_ref<jobject>, jlong nativePointer, jfloat value) { \
alias_ref<jobject>, jlong nativePointer, jfloat value) { \ YGNodeStyleSet##name##Percent(_jlong2YGNodeRef(nativePointer), static_cast<float>(value)); \
YGNodeStyleSet##name##Percent( \
_jlong2YGNodeRef(nativePointer), static_cast<float>(value)); \
} }
#define YG_NODE_JNI_STYLE_UNIT_PROP_AUTO(name) \ #define YG_NODE_JNI_STYLE_UNIT_PROP_AUTO(name) \
YG_NODE_JNI_STYLE_UNIT_PROP(name) \ YG_NODE_JNI_STYLE_UNIT_PROP(name) \
void jni_YGNodeStyleSet##name##Auto( \ void jni_YGNodeStyleSet##name##Auto(alias_ref<jobject>, jlong nativePointer) { \
alias_ref<jobject>, jlong nativePointer) { \
YGNodeStyleSet##name##Auto(_jlong2YGNodeRef(nativePointer)); \ YGNodeStyleSet##name##Auto(_jlong2YGNodeRef(nativePointer)); \
} }
#define YG_NODE_JNI_STYLE_EDGE_PROP(javatype, type, name) \ #define YG_NODE_JNI_STYLE_EDGE_PROP(javatype, type, name) \
javatype jni_YGNodeStyleGet##name( \ javatype jni_YGNodeStyleGet##name(alias_ref<jobject>, jlong nativePointer, jint edge) { \
alias_ref<jobject>, jlong nativePointer, jint edge) { \ return (javatype) YGNodeStyleGet##name(_jlong2YGNodeRef(nativePointer), \
return (javatype)YGNodeStyleGet##name( \ static_cast<YGEdge>(edge)); \
_jlong2YGNodeRef(nativePointer), static_cast<YGEdge>(edge)); \
} \ } \
\ \
void jni_YGNodeStyleSet##name( \ void jni_YGNodeStyleSet##name(alias_ref<jobject>, \
alias_ref<jobject>, jlong nativePointer, jint edge, javatype value) { \ jlong nativePointer, \
YGNodeStyleSet##name( \ jint edge, \
_jlong2YGNodeRef(nativePointer), \ javatype value) { \
YGNodeStyleSet##name(_jlong2YGNodeRef(nativePointer), \
static_cast<YGEdge>(edge), \ static_cast<YGEdge>(edge), \
static_cast<type>(value)); \ static_cast<type>(value)); \
} }
#define YG_NODE_JNI_STYLE_EDGE_UNIT_PROP(name) \ #define YG_NODE_JNI_STYLE_EDGE_UNIT_PROP(name) \
local_ref<jobject> jni_YGNodeStyleGet##name( \ local_ref<jobject> jni_YGNodeStyleGet##name(alias_ref<jobject>, \
alias_ref<jobject>, jlong nativePointer, jint edge) { \ jlong nativePointer, \
return JYogaValue::create(YGNodeStyleGet##name( \ jint edge) { \
_jlong2YGNodeRef(nativePointer), static_cast<YGEdge>(edge))); \ return JYogaValue::create( \
YGNodeStyleGet##name(_jlong2YGNodeRef(nativePointer), static_cast<YGEdge>(edge))); \
} \ } \
\ \
void jni_YGNodeStyleSet##name( \ void jni_YGNodeStyleSet##name(alias_ref<jobject>, jlong nativePointer, jint edge, jfloat value) { \
alias_ref<jobject>, jlong nativePointer, jint edge, jfloat value) { \ YGNodeStyleSet##name(_jlong2YGNodeRef(nativePointer), \
YGNodeStyleSet##name( \
_jlong2YGNodeRef(nativePointer), \
static_cast<YGEdge>(edge), \ static_cast<YGEdge>(edge), \
static_cast<float>(value)); \ static_cast<float>(value)); \
} \ } \
\ \
void jni_YGNodeStyleSet##name##Percent( \ void jni_YGNodeStyleSet##name##Percent(alias_ref<jobject>, \
alias_ref<jobject>, jlong nativePointer, jint edge, jfloat value) { \ jlong nativePointer, \
YGNodeStyleSet##name##Percent( \ jint edge, \
_jlong2YGNodeRef(nativePointer), \ jfloat value) { \
YGNodeStyleSet##name##Percent(_jlong2YGNodeRef(nativePointer), \
static_cast<YGEdge>(edge), \ static_cast<YGEdge>(edge), \
static_cast<float>(value)); \ static_cast<float>(value)); \
} }
#define YG_NODE_JNI_STYLE_EDGE_UNIT_PROP_AUTO(name) \ #define YG_NODE_JNI_STYLE_EDGE_UNIT_PROP_AUTO(name) \
YG_NODE_JNI_STYLE_EDGE_UNIT_PROP(name) \ YG_NODE_JNI_STYLE_EDGE_UNIT_PROP(name) \
void jni_YGNodeStyleSet##name##Auto( \ void jni_YGNodeStyleSet##name##Auto(alias_ref<jobject>, jlong nativePointer, jint edge) { \
alias_ref<jobject>, jlong nativePointer, jint edge) { \ YGNodeStyleSet##name##Auto(_jlong2YGNodeRef(nativePointer), static_cast<YGEdge>(edge)); \
YGNodeStyleSet##name##Auto( \
_jlong2YGNodeRef(nativePointer), static_cast<YGEdge>(edge)); \
} }
YG_NODE_JNI_STYLE_PROP(jint, YGDirection, Direction); YG_NODE_JNI_STYLE_PROP(jint, YGDirection, Direction);
@@ -530,12 +467,8 @@ YG_NODE_JNI_STYLE_PROP(jint, YGWrap, FlexWrap);
YG_NODE_JNI_STYLE_PROP(jint, YGOverflow, Overflow); YG_NODE_JNI_STYLE_PROP(jint, YGOverflow, Overflow);
YG_NODE_JNI_STYLE_PROP(jint, YGDisplay, Display); YG_NODE_JNI_STYLE_PROP(jint, YGDisplay, Display);
void jni_YGNodeStyleSetFlex( void jni_YGNodeStyleSetFlex(alias_ref<jobject>, jlong nativePointer, jfloat value) {
alias_ref<jobject>, YGNodeStyleSetFlex(_jlong2YGNodeRef(nativePointer), static_cast<float>(value));
jlong nativePointer,
jfloat value) {
YGNodeStyleSetFlex(
_jlong2YGNodeRef(nativePointer), static_cast<float>(value));
} }
YG_NODE_JNI_STYLE_PROP(jfloat, float, FlexGrow); YG_NODE_JNI_STYLE_PROP(jfloat, float, FlexGrow);
YG_NODE_JNI_STYLE_PROP(jfloat, float, FlexShrink); YG_NODE_JNI_STYLE_PROP(jfloat, float, FlexShrink);
@@ -569,14 +502,14 @@ void jni_YGConfigFree(alias_ref<jobject>, jlong nativePointer) {
YGConfigFree(config); YGConfigFree(config);
} }
void jni_YGConfigSetExperimentalFeatureEnabled( void jni_YGConfigSetExperimentalFeatureEnabled(alias_ref<jobject>,
alias_ref<jobject>,
jlong nativePointer, jlong nativePointer,
jint feature, jint feature,
jboolean enabled) { jboolean enabled) {
const YGConfigRef config = _jlong2YGConfigRef(nativePointer); const YGConfigRef config = _jlong2YGConfigRef(nativePointer);
YGConfigSetExperimentalFeatureEnabled( YGConfigSetExperimentalFeatureEnabled(config,
config, static_cast<YGExperimentalFeature>(feature), enabled); static_cast<YGExperimentalFeature>(feature),
enabled);
} }
void jni_YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviour( void jni_YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviour(
@@ -587,24 +520,21 @@ void jni_YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviour(
YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviour(config, enabled); YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviour(config, enabled);
} }
void jni_YGConfigSetUseWebDefaults( void jni_YGConfigSetUseWebDefaults(alias_ref<jobject>,
alias_ref<jobject>,
jlong nativePointer, jlong nativePointer,
jboolean useWebDefaults) { jboolean useWebDefaults) {
const YGConfigRef config = _jlong2YGConfigRef(nativePointer); const YGConfigRef config = _jlong2YGConfigRef(nativePointer);
YGConfigSetUseWebDefaults(config, useWebDefaults); YGConfigSetUseWebDefaults(config, useWebDefaults);
} }
void jni_YGConfigSetPointScaleFactor( void jni_YGConfigSetPointScaleFactor(alias_ref<jobject>,
alias_ref<jobject>,
jlong nativePointer, jlong nativePointer,
jfloat pixelsInPoint) { jfloat pixelsInPoint) {
const YGConfigRef config = _jlong2YGConfigRef(nativePointer); const YGConfigRef config = _jlong2YGConfigRef(nativePointer);
YGConfigSetPointScaleFactor(config, pixelsInPoint); YGConfigSetPointScaleFactor(config, pixelsInPoint);
} }
void jni_YGConfigSetUseLegacyStretchBehaviour( void jni_YGConfigSetUseLegacyStretchBehaviour(alias_ref<jobject>,
alias_ref<jobject>,
jlong nativePointer, jlong nativePointer,
jboolean useLegacyStretchBehaviour) { jboolean useLegacyStretchBehaviour) {
const YGConfigRef config = _jlong2YGConfigRef(nativePointer); const YGConfigRef config = _jlong2YGConfigRef(nativePointer);
@@ -663,7 +593,7 @@ jint jni_YGNodeGetInstanceCount(alias_ref<jclass> clazz) {
#define YGMakeNativeMethod(name) makeNativeMethod(#name, name) #define YGMakeNativeMethod(name) makeNativeMethod(#name, name)
jint JNI_OnLoad(JavaVM* vm, void*) { jint JNI_OnLoad(JavaVM *vm, void *) {
return initialize(vm, [] { return initialize(vm, [] {
registerNatives( registerNatives(
"com/facebook/yoga/YogaNode", "com/facebook/yoga/YogaNode",
@@ -748,7 +678,6 @@ jint JNI_OnLoad(JavaVM* vm, void*) {
YGMakeNativeMethod(jni_YGNodeGetInstanceCount), YGMakeNativeMethod(jni_YGNodeGetInstanceCount),
YGMakeNativeMethod(jni_YGNodePrint), YGMakeNativeMethod(jni_YGNodePrint),
YGMakeNativeMethod(jni_YGNodeClone), YGMakeNativeMethod(jni_YGNodeClone),
YGMakeNativeMethod(jni_YGNodeSetOwner),
}); });
registerNatives( registerNatives(
"com/facebook/yoga/YogaConfig", "com/facebook/yoga/YogaConfig",

View File

@@ -61,7 +61,7 @@ for (let [name, results] of testResults) {
for (let [type, result] of results) { for (let [type, result] of results) {
console.log( console.log(
` - ${type}: ${result}ms (${Math.round((result / min) * 10000) / 100}%)`, ` - ${type}: ${result}ms (${Math.round(result / min * 10000) / 100}%)`,
); );
} }
} }

View File

@@ -2,7 +2,8 @@
# #
# This source code is licensed under the MIT license found in the # This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree. # LICENSE file in the root directory of this source tree.
load("//:yoga_defs.bzl", "ANDROID", "FBJNI_JAVA_TARGET", "JNI_TARGET", "YOGA_ROOTS", "subdir_glob", "yoga_cxx_library", "yoga_prebuilt_cxx_library")
load("//:yoga_defs.bzl", "yoga_prebuilt_cxx_library", "yoga_cxx_library", "YOGA_ROOTS", "FBJNI_JAVA_TARGET", "JNI_TARGET", "ANDROID")
yoga_prebuilt_cxx_library( yoga_prebuilt_cxx_library(
name = "ndklog", name = "ndklog",

View File

@@ -3,7 +3,7 @@
# This source code is licensed under the MIT license found in the # This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree. # LICENSE file in the root directory of this source tree.
load("//:yoga_defs.bzl", "JSR_305_TARGET", "PROGRUARD_ANNOTATIONS_TARGET", "SOLOADER_TARGET", "yoga_java_library") load("//:yoga_defs.bzl", "PROGRUARD_ANNOTATIONS_TARGET", "SOLOADER_TARGET", "JSR_305_TARGET", "yoga_java_library")
yoga_java_library( yoga_java_library(
name = "jni", name = "jni",

View File

@@ -2,7 +2,8 @@
# #
# This source code is licensed under the MIT license found in the # This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree. # LICENSE file in the root directory of this source tree.
load("//:yoga_defs.bzl", "YOGA_ROOTS", "subdir_glob", "yoga_cxx_library")
load("//:yoga_defs.bzl", "yoga_cxx_library", "YOGA_ROOTS")
COMPILER_FLAGS = [ COMPILER_FLAGS = [
"-std=c++11", "-std=c++11",

View File

@@ -3,7 +3,7 @@
# This source code is licensed under the MIT license found in the # This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree. # LICENSE file in the root directory of this source tree.
load("//:yoga_defs.bzl", "YOGA_ROOTS", "yoga_java_library", "yoga_prebuilt_jar") load("//:yoga_defs.bzl", "YOGA_ROOTS", "yoga_prebuilt_jar", "yoga_java_library")
yoga_prebuilt_jar( yoga_prebuilt_jar(
name = "infer-annotations-jar", name = "infer-annotations-jar",
@@ -12,8 +12,8 @@ yoga_prebuilt_jar(
yoga_java_library( yoga_java_library(
name = "infer-annotations", name = "infer-annotations",
visibility = YOGA_ROOTS,
exported_deps = [ exported_deps = [
":infer-annotations-jar", ":infer-annotations-jar",
], ],
visibility = YOGA_ROOTS,
) )

View File

@@ -3,7 +3,7 @@
# This source code is licensed under the MIT license found in the # This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree. # LICENSE file in the root directory of this source tree.
load("//:yoga_defs.bzl", "YOGA_ROOTS", "yoga_java_library", "yoga_prebuilt_jar") load("//:yoga_defs.bzl", "YOGA_ROOTS", "yoga_prebuilt_jar", "yoga_java_library")
yoga_prebuilt_jar( yoga_prebuilt_jar(
name = "jsr305-jar", name = "jsr305-jar",
@@ -12,8 +12,8 @@ yoga_prebuilt_jar(
yoga_java_library( yoga_java_library(
name = "jsr-305", name = "jsr-305",
visibility = YOGA_ROOTS,
exported_deps = [ exported_deps = [
":jsr305-jar", ":jsr305-jar",
], ],
visibility = YOGA_ROOTS,
) )

View File

@@ -3,7 +3,7 @@
# This source code is licensed under the MIT license found in the # This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree. # LICENSE file in the root directory of this source tree.
load("//:yoga_defs.bzl", "YOGA_ROOTS", "yoga_java_library", "yoga_prebuilt_jar") load("//:yoga_defs.bzl", "YOGA_ROOTS", "yoga_prebuilt_jar", "yoga_java_library")
yoga_prebuilt_jar( yoga_prebuilt_jar(
name = "junit-jar", name = "junit-jar",
@@ -12,8 +12,8 @@ yoga_prebuilt_jar(
yoga_java_library( yoga_java_library(
name = "junit", name = "junit",
visibility = YOGA_ROOTS,
exported_deps = [ exported_deps = [
":junit-jar", ":junit-jar",
], ],
visibility = YOGA_ROOTS,
) )

View File

@@ -1,10 +1,10 @@
/* /**
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
// @Generated by gentest/gentest.rb from gentest/fixtures/YGFlexTest.html // @Generated by gentest/gentest.rb from gentest/fixtures/YGFlexTest.html
#include <gtest/gtest.h> #include <gtest/gtest.h>
@@ -64,90 +64,6 @@ TEST(YogaTest, flex_basis_flex_grow_column) {
YGConfigFree(config); YGConfigFree(config);
} }
TEST(YogaTest, flex_shrink_flex_grow_row) {
const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
YGNodeStyleSetWidth(root, 500);
YGNodeStyleSetHeight(root, 500);
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetFlexGrow(root_child0, 0);
YGNodeStyleSetFlexShrink(root_child0, 1);
YGNodeStyleSetWidth(root_child0, 500);
YGNodeStyleSetHeight(root_child0, 100);
YGNodeInsertChild(root, root_child0, 0);
const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
YGNodeStyleSetFlexGrow(root_child1, 0);
YGNodeStyleSetFlexShrink(root_child1, 1);
YGNodeStyleSetWidth(root_child1, 500);
YGNodeStyleSetHeight(root_child1, 100);
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(500, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(250, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(250, YGNodeLayoutGetLeft(root_child1));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
ASSERT_FLOAT_EQ(250, YGNodeLayoutGetWidth(root_child1));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
YGNodeFreeRecursive(root);
YGConfigFree(config);
}
TEST(YogaTest, flex_shrink_flex_grow_child_flex_shrink_other_child) {
const YGConfigRef config = YGConfigNew();
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
YGNodeStyleSetWidth(root, 500);
YGNodeStyleSetHeight(root, 500);
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetFlexGrow(root_child0, 0);
YGNodeStyleSetFlexShrink(root_child0, 1);
YGNodeStyleSetWidth(root_child0, 500);
YGNodeStyleSetHeight(root_child0, 100);
YGNodeInsertChild(root, root_child0, 0);
const YGNodeRef root_child1 = YGNodeNewWithConfig(config);
YGNodeStyleSetFlexGrow(root_child1, 1);
YGNodeStyleSetFlexShrink(root_child1, 1);
YGNodeStyleSetWidth(root_child1, 500);
YGNodeStyleSetHeight(root_child1, 100);
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(500, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(500, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(250, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(250, YGNodeLayoutGetLeft(root_child1));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
ASSERT_FLOAT_EQ(250, YGNodeLayoutGetWidth(root_child1));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child1));
YGNodeFreeRecursive(root);
YGConfigFree(config);
}
TEST(YogaTest, flex_basis_flex_grow_row) { TEST(YogaTest, flex_basis_flex_grow_row) {
const YGConfigRef config = YGConfigNew(); const YGConfigRef config = YGConfigNew();

View File

@@ -1,10 +1,10 @@
/* /**
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <yoga/YGNode.h> #include <yoga/YGNode.h>
#include <yoga/Yoga.h> #include <yoga/Yoga.h>

View File

@@ -5,6 +5,8 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
// @Generated by gentest/gentest.rb from gentest/fixtures/YGPercentageTest.html
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <yoga/Yoga.h> #include <yoga/Yoga.h>

12381
website/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -4,22 +4,21 @@
"version": "1.0.0", "version": "1.0.0",
"author": "Kyle Mathews <mathews.kyle@gmail.com>", "author": "Kyle Mathews <mathews.kyle@gmail.com>",
"dependencies": { "dependencies": {
"antd": "^3.6.5", "antd": "^3.2.0",
"atob": "^2.1.1", "atob": "^2.0.3",
"btoa": "^1.2.1", "gatsby": "^1.9.158",
"gatsby": "^1.9.273", "gatsby-link": "^1.6.34",
"gatsby-link": "^1.6.45", "gatsby-plugin-antd": "^1.0.10",
"gatsby-plugin-antd": "^1.0.12", "gatsby-plugin-google-analytics": "^1.0.19",
"gatsby-plugin-google-analytics": "^1.0.31", "gatsby-plugin-less": "^1.1.4",
"gatsby-plugin-less": "^1.1.8", "gatsby-plugin-react-helmet": "^2.0.3",
"gatsby-plugin-react-helmet": "^2.0.11", "gatsby-plugin-react-next": "^1.0.8",
"gatsby-plugin-react-next": "^1.0.11", "gatsby-remark-prismjs": "^1.2.14",
"gatsby-remark-prismjs": "^2.0.4", "gatsby-source-filesystem": "^1.5.18",
"gatsby-source-filesystem": "^1.5.39", "gatsby-transformer-remark": "^1.7.31",
"gatsby-transformer-remark": "^1.7.44",
"immutable": "^4.0.0-rc.9", "immutable": "^4.0.0-rc.9",
"react-helmet": "^5.2.0", "react-helmet": "^5.2.0",
"react-syntax-highlighter": "^8.0.0", "react-syntax-highlighter": "^7.0.0",
"yoga-layout": "^1.9.3" "yoga-layout": "^1.9.3"
}, },
"keywords": [ "keywords": [
@@ -32,6 +31,6 @@
"develop": "gatsby develop" "develop": "gatsby develop"
}, },
"devDependencies": { "devDependencies": {
"prettier": "1.13.7" "prettier": "1.12.1"
} }
} }

View File

@@ -137,9 +137,9 @@ function getLayoutCode(
)}\n${indent}\t},`, )}\n${indent}\t},`,
), ),
); );
lines.push(indent + `}]${isRoot ? ';' : ','}`); lines.push(indent + `}]${isRoot ? ';' : ''}`);
} else { } else {
lines[lines.length - 1] += '],'; lines[lines.length - 1] += ']';
CKFlexboxComponentChild.forEach(key => { CKFlexboxComponentChild.forEach(key => {
let line = renderKey(node, key, indent); let line = renderKey(node, key, indent);
if (line) { if (line) {
@@ -165,7 +165,7 @@ function renderKey(node: Yoga$Node, key: string, indent: string): ?string {
); );
} }
['top', 'start', 'end', 'bottom'].forEach(pKey => { ['top', 'left', 'right', 'bottom'].forEach(pKey => {
if (node[key][pKey]) { if (node[key][pKey]) {
lines.push(indent + `\t.${pKey} = ${getValue(node[key][pKey])},`); lines.push(indent + `\t.${pKey} = ${getValue(node[key][pKey])},`);
} }

View File

@@ -33,7 +33,7 @@ export default (props: Props<*>) => {
type="text" type="text"
{...props} {...props}
onChange={e => props.onChange(props.property, e.target.value)} onChange={e => props.onChange(props.property, e.target.value)}
placeholder={props.placeholder || 'undefined'} placeholder="undefined"
onFocus={e => e.target.select()} onFocus={e => e.target.select()}
value={Number.isNaN(props.value) ? '' : props.value} value={Number.isNaN(props.value) ? '' : props.value}
/> />

View File

@@ -89,7 +89,6 @@ export default class Editor extends Component<Props> {
<EditValue <EditValue
type="text" type="text"
property="flexBasis" property="flexBasis"
placeholder="auto"
disabled={disabled || selectedNodeIsRoot} disabled={disabled || selectedNodeIsRoot}
value={node ? node.flexBasis : undefined} value={node ? node.flexBasis : undefined}
onChange={this.props.onChangeLayout} onChange={this.props.onChangeLayout}
@@ -105,7 +104,6 @@ export default class Editor extends Component<Props> {
<EditValue <EditValue
type="text" type="text"
property="flexGrow" property="flexGrow"
placeholder="0"
disabled={disabled || selectedNodeIsRoot} disabled={disabled || selectedNodeIsRoot}
value={node ? node.flexGrow : undefined} value={node ? node.flexGrow : undefined}
onChange={this.props.onChangeLayout} onChange={this.props.onChangeLayout}
@@ -122,7 +120,6 @@ export default class Editor extends Component<Props> {
<EditValue <EditValue
type="text" type="text"
property="flexShrink" property="flexShrink"
placeholder="1"
disabled={disabled || selectedNodeIsRoot} disabled={disabled || selectedNodeIsRoot}
value={node ? node.flexShrink : undefined} value={node ? node.flexShrink : undefined}
onChange={this.props.onChangeLayout} onChange={this.props.onChangeLayout}
@@ -225,62 +222,6 @@ export default class Editor extends Component<Props> {
/> />
</Col> </Col>
</Row> </Row>
<h2>
Max-Width &times; Max-Height
<InfoText doclink="/docs/min-max">
Maximum dimensions of the node
</InfoText>
</h2>
<Row gutter={15}>
<Col span={12}>
<EditValue
type="text"
placeholder="none"
property="maxWidth"
disabled={disabled}
value={node ? node.maxWidth : undefined}
onChange={this.props.onChangeLayout}
/>
</Col>
<Col span={12}>
<EditValue
type="text"
placeholder="none"
property="maxHeight"
disabled={disabled}
value={node ? node.maxHeight : undefined}
onChange={this.props.onChangeLayout}
/>
</Col>
</Row>
<h2>
Min-Width &times; Min-Height
<InfoText doclink="/docs/min-max">
Minimum dimensions of the node
</InfoText>
</h2>
<Row gutter={15}>
<Col span={12}>
<EditValue
type="text"
placeholder="0"
property="minWidth"
disabled={disabled}
value={node ? node.minWidth : undefined}
onChange={this.props.onChangeLayout}
/>
</Col>
<Col span={12}>
<EditValue
type="text"
placeholder="0"
property="minHeight"
disabled={disabled}
value={node ? node.minHeight : undefined}
onChange={this.props.onChangeLayout}
/>
</Col>
</Row>
<h2> <h2>
Aspect Ratio Aspect Ratio

View File

@@ -19,22 +19,18 @@ import type {
Yoga$JustifyContent, Yoga$JustifyContent,
Yoga$FlexDirection, Yoga$FlexDirection,
Yoga$FlexWrap, Yoga$FlexWrap,
Yoga$PositionType, Yoga$YogaPositionType,
} from 'yoga-layout'; } from 'yoga-layout';
export type LayoutRecordT = RecordOf<{ export type LayoutRecordT = RecordOf<{
width?: ?number, width?: ?number,
height?: ?number, height?: ?number,
minWidth?: ?number,
minHeight?: ?number,
maxWidth?: ?number,
maxHeight?: ?number,
justifyContent?: Yoga$JustifyContent, justifyContent?: Yoga$JustifyContent,
padding: PositionRecordT, padding: PositionRecordT,
border: PositionRecordT, border: PositionRecordT,
margin: PositionRecordT, margin: PositionRecordT,
position: PositionRecordT, position: PositionRecordT,
positionType: Yoga$PositionType, positionType: Yoga$YogaPositionType,
alignItems?: Yoga$Align, alignItems?: Yoga$Align,
alignSelf?: Yoga$Align, alignSelf?: Yoga$Align,
alignContent?: Yoga$Align, alignContent?: Yoga$Align,
@@ -55,10 +51,6 @@ export type LayoutRecordT = RecordOf<{
const r: LayoutRecordT = Record({ const r: LayoutRecordT = Record({
width: 'auto', width: 'auto',
height: 'auto', height: 'auto',
minWidth: 0,
minHeight: 0,
maxWidth: 'none',
maxHeight: 'none',
justifyContent: yoga.JUSTIFY_FLEX_START, justifyContent: yoga.JUSTIFY_FLEX_START,
alignItems: yoga.ALIGN_STRETCH, alignItems: yoga.ALIGN_STRETCH,
alignSelf: yoga.ALIGN_AUTO, alignSelf: yoga.ALIGN_AUTO,

View File

@@ -18,8 +18,7 @@ import {List, setIn} from 'immutable';
import PositionRecord from './PositionRecord'; import PositionRecord from './PositionRecord';
import LayoutRecord from './LayoutRecord'; import LayoutRecord from './LayoutRecord';
import Sidebar from './Sidebar'; import Sidebar from './Sidebar';
import {Row, Col, Button} from 'antd'; import {Row, Col} from 'antd';
import btoa from 'btoa';
import type {LayoutRecordT} from './LayoutRecord'; import type {LayoutRecordT} from './LayoutRecord';
import type {Yoga$Direction} from 'yoga-layout'; import type {Yoga$Direction} from 'yoga-layout';
import './index.css'; import './index.css';
@@ -165,15 +164,12 @@ export default class Playground extends Component<Props, State> {
}); });
if (this.props.persist) { if (this.props.persist) {
window.location.hash = this.getHash(layoutDefinition); window.location.hash = btoa(
JSON.stringify(this.removeUnchangedProperties(layoutDefinition)),
);
} }
} }
getHash = (
layoutDefinition: LayoutRecordT = this.state.layoutDefinition,
): string =>
btoa(JSON.stringify(this.removeUnchangedProperties(layoutDefinition)));
removeUnchangedProperties = (node: LayoutRecordT): Object => { removeUnchangedProperties = (node: LayoutRecordT): Object => {
const untouchedLayout = LayoutRecord({}); const untouchedLayout = LayoutRecord({});
const untouchedPosition = PositionRecord({}); const untouchedPosition = PositionRecord({});
@@ -247,15 +243,7 @@ export default class Playground extends Component<Props, State> {
/> />
</Col> </Col>
<Col span={12}> <Col span={12}>
{this.props.persist ? (
<URLShortener /> <URLShortener />
) : (
<Button
href={`/playground#${this.getHash()}`}
type="primary">
Open Playground
</Button>
)}
</Col> </Col>
</Row> </Row>
</div> </div>

View File

@@ -34,7 +34,7 @@ export default ({data}) => (
comes with an interactive playground for you to explore that comes with an interactive playground for you to explore that
feature. The examples section showcases some of the most common feature. The examples section showcases some of the most common
layouts and how to build them. This is a community projects and layouts and how to build them. This is a community projects and
contributions within documentation, code, and tests are more than contributions within documentation, code, and tests are more then
welcome. The contributing section below covers how to get started. welcome. The contributing section below covers how to get started.
</p> </p>
</Col> </Col>

View File

@@ -183,7 +183,6 @@ const AboutSectionTwo = () => (
); );
export default () => ( export default () => (
<div>
<Page className="landing-page" title="A cross-platform layout engine"> <Page className="landing-page" title="A cross-platform layout engine">
<HeroSection /> <HeroSection />
<PlaygroundSection /> <PlaygroundSection />
@@ -192,5 +191,4 @@ export default () => (
<AboutSectionTwo /> <AboutSectionTwo />
<Footer /> <Footer />
</Page> </Page>
</div>
); );

View File

@@ -3,13 +3,11 @@
flex: 1; flex: 1;
} }
@media (max-width: 991px) { .playground-page .error-container {
.playground-page .error-container {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
}
} }
.playground-page .error-text { .playground-page .error-text {

File diff suppressed because it is too large Load Diff

View File

@@ -1,16 +1,16 @@
/* /**
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
#include "YGFloatOptional.h" #include "YGFloatOptional.h"
#include <cstdlib> #include <cstdlib>
#include <iostream> #include <iostream>
#include "Yoga.h" #include "Yoga.h"
YGFloatOptional::YGFloatOptional(float value) { YGFloatOptional::YGFloatOptional(const float& value) {
if (YGFloatIsUndefined(value)) { if (YGFloatIsUndefined(value)) {
isUndefined_ = true; isUndefined_ = true;
value_ = 0; value_ = 0;
@@ -31,9 +31,18 @@ const float& YGFloatOptional::getValue() const {
return value_; return value_;
} }
void YGFloatOptional::setValue(const float& val) {
value_ = val;
isUndefined_ = false;
}
const bool& YGFloatOptional::isUndefined() const {
return isUndefined_;
}
bool YGFloatOptional::operator==(const YGFloatOptional& op) const { bool YGFloatOptional::operator==(const YGFloatOptional& op) const {
if (isUndefined_ == op.isUndefined()) { if (isUndefined_ == op.isUndefined()) {
return isUndefined_ || value_ == op.getValue(); return isUndefined_ ? true : value_ == op.getValue();
} }
return false; return false;
} }
@@ -42,14 +51,14 @@ bool YGFloatOptional::operator!=(const YGFloatOptional& op) const {
return !(*this == op); return !(*this == op);
} }
bool YGFloatOptional::operator==(float val) const { bool YGFloatOptional::operator==(const float& val) const {
if (YGFloatIsUndefined(val) == isUndefined_) { if (YGFloatIsUndefined(val) == isUndefined_) {
return isUndefined_ || val == value_; return isUndefined_ ? true : val == value_;
} }
return false; return false;
} }
bool YGFloatOptional::operator!=(float val) const { bool YGFloatOptional::operator!=(const float& val) const {
return !(*this == val); return !(*this == val);
} }
@@ -75,9 +84,9 @@ bool YGFloatOptional::operator<(const YGFloatOptional& op) const {
} }
bool YGFloatOptional::operator>=(const YGFloatOptional& op) const { bool YGFloatOptional::operator>=(const YGFloatOptional& op) const {
return *this == op || *this > op; return *this == op ? true : *this > op;
} }
bool YGFloatOptional::operator<=(const YGFloatOptional& op) const { bool YGFloatOptional::operator<=(const YGFloatOptional& op) const {
return *this == op || *this < op; return *this == op ? true : *this < op;
} }

View File

@@ -1,10 +1,10 @@
/* /**
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
#pragma once #pragma once
struct YGFloatOptional { struct YGFloatOptional {
@@ -13,7 +13,7 @@ struct YGFloatOptional {
bool isUndefined_; bool isUndefined_;
public: public:
explicit YGFloatOptional(float value); explicit YGFloatOptional(const float& value);
explicit YGFloatOptional(); explicit YGFloatOptional();
// Program will terminate if the value of an undefined is accessed. Please // Program will terminate if the value of an undefined is accessed. Please
@@ -22,14 +22,9 @@ struct YGFloatOptional {
const float& getValue() const; const float& getValue() const;
// Sets the value of float optional, and thus isUndefined is assigned false. // Sets the value of float optional, and thus isUndefined is assigned false.
void setValue(float val) { void setValue(const float& val);
value_ = val;
isUndefined_ = false;
}
bool isUndefined() const { const bool& isUndefined() const;
return isUndefined_;
}
YGFloatOptional operator+(const YGFloatOptional& op); YGFloatOptional operator+(const YGFloatOptional& op);
bool operator>(const YGFloatOptional& op) const; bool operator>(const YGFloatOptional& op) const;
@@ -39,6 +34,6 @@ struct YGFloatOptional {
bool operator==(const YGFloatOptional& op) const; bool operator==(const YGFloatOptional& op) const;
bool operator!=(const YGFloatOptional& op) const; bool operator!=(const YGFloatOptional& op) const;
bool operator==(float val) const; bool operator==(const float& val) const;
bool operator!=(float val) const; bool operator!=(const float& val) const;
}; };

View File

@@ -9,6 +9,82 @@
#include <iostream> #include <iostream>
#include "Utils.h" #include "Utils.h"
void* YGNode::getContext() const {
return context_;
}
YGPrintFunc YGNode::getPrintFunc() const {
return print_;
}
bool YGNode::getHasNewLayout() const {
return hasNewLayout_;
}
YGNodeType YGNode::getNodeType() const {
return nodeType_;
}
YGMeasureFunc YGNode::getMeasure() const {
return measure_;
}
YGBaselineFunc YGNode::getBaseline() const {
return baseline_;
}
YGDirtiedFunc YGNode::getDirtied() const {
return dirtied_;
}
YGStyle& YGNode::getStyle() {
return style_;
}
YGLayout& YGNode::getLayout() {
return layout_;
}
uint32_t YGNode::getLineIndex() const {
return lineIndex_;
}
YGNodeRef YGNode::getOwner() const {
return owner_;
}
YGVector YGNode::getChildren() const {
return children_;
}
uint32_t YGNode::getChildrenCount() const {
return static_cast<uint32_t>(children_.size());
}
YGNodeRef YGNode::getChild(uint32_t index) const {
return children_.at(index);
}
YGNodeRef YGNode::getNextChild() const {
return nextChild_;
}
YGConfigRef YGNode::getConfig() const {
return config_;
}
bool YGNode::isDirty() const {
return isDirty_;
}
YGValue YGNode::getResolvedDimension(int index) {
return resolvedDimensions_[index];
}
std::array<YGValue, 2> YGNode::getResolvedDimensions() const {
return resolvedDimensions_;
}
YGFloatOptional YGNode::getLeadingPosition( YGFloatOptional YGNode::getLeadingPosition(
const YGFlexDirection& axis, const YGFlexDirection& axis,
const float& axisSize) const { const float& axisSize) const {
@@ -97,7 +173,29 @@ YGFloatOptional YGNode::getMarginForAxis(
// Setters // Setters
void YGNode::setContext(void* context) {
context_ = context;
}
void YGNode::setPrintFunc(YGPrintFunc printFunc) {
print_ = printFunc;
}
void YGNode::setHasNewLayout(bool hasNewLayout) {
hasNewLayout_ = hasNewLayout;
}
void YGNode::setNodeType(YGNodeType nodeType) {
nodeType_ = nodeType;
}
void YGNode::setStyleFlexDirection(YGFlexDirection direction) {
style_.flexDirection = direction;
}
void YGNode::setStyleAlignContent(YGAlign alignContent) {
style_.alignContent = alignContent;
}
void YGNode::setMeasureFunc(YGMeasureFunc measureFunc) { void YGNode::setMeasureFunc(YGMeasureFunc measureFunc) {
if (measureFunc == nullptr) { if (measureFunc == nullptr) {
@@ -119,6 +217,38 @@ void YGNode::setMeasureFunc(YGMeasureFunc measureFunc) {
measure_ = measureFunc; measure_ = measureFunc;
} }
void YGNode::setBaseLineFunc(YGBaselineFunc baseLineFunc) {
baseline_ = baseLineFunc;
}
void YGNode::setDirtiedFunc(YGDirtiedFunc dirtiedFunc) {
dirtied_ = dirtiedFunc;
}
void YGNode::setStyle(const YGStyle& style) {
style_ = style;
}
void YGNode::setLayout(const YGLayout& layout) {
layout_ = layout;
}
void YGNode::setLineIndex(uint32_t lineIndex) {
lineIndex_ = lineIndex;
}
void YGNode::setOwner(YGNodeRef owner) {
owner_ = owner;
}
void YGNode::setChildren(const YGVector& children) {
children_ = children;
}
void YGNode::setNextChild(YGNodeRef nextChild) {
nextChild_ = nextChild;
}
void YGNode::replaceChild(YGNodeRef child, uint32_t index) { void YGNode::replaceChild(YGNodeRef child, uint32_t index) {
children_[index] = child; children_[index] = child;
} }
@@ -131,6 +261,10 @@ void YGNode::insertChild(YGNodeRef child, uint32_t index) {
children_.insert(children_.begin() + index, child); children_.insert(children_.begin() + index, child);
} }
void YGNode::setConfig(YGConfigRef config) {
config_ = config;
}
void YGNode::setDirty(bool isDirty) { void YGNode::setDirty(bool isDirty) {
if (isDirty == isDirty_) { if (isDirty == isDirty_) {
return; return;
@@ -267,6 +401,7 @@ YGNode::YGNode()
lineIndex_(0), lineIndex_(0),
owner_(nullptr), owner_(nullptr),
children_(YGVector()), children_(YGVector()),
nextChild_(nullptr),
config_(nullptr), config_(nullptr),
isDirty_(false), isDirty_(false),
resolvedDimensions_({{YGValueUndefined, YGValueUndefined}}) {} resolvedDimensions_({{YGValueUndefined, YGValueUndefined}}) {}
@@ -284,6 +419,7 @@ YGNode::YGNode(const YGNode& node)
lineIndex_(node.lineIndex_), lineIndex_(node.lineIndex_),
owner_(node.owner_), owner_(node.owner_),
children_(node.children_), children_(node.children_),
nextChild_(node.nextChild_),
config_(node.config_), config_(node.config_),
isDirty_(node.isDirty_), isDirty_(node.isDirty_),
resolvedDimensions_(node.resolvedDimensions_) {} resolvedDimensions_(node.resolvedDimensions_) {}
@@ -305,6 +441,7 @@ YGNode::YGNode(
uint32_t lineIndex, uint32_t lineIndex,
YGNodeRef owner, YGNodeRef owner,
const YGVector& children, const YGVector& children,
YGNodeRef nextChild,
YGConfigRef config, YGConfigRef config,
bool isDirty, bool isDirty,
std::array<YGValue, 2> resolvedDimensions) std::array<YGValue, 2> resolvedDimensions)
@@ -320,6 +457,7 @@ YGNode::YGNode(
lineIndex_(lineIndex), lineIndex_(lineIndex),
owner_(owner), owner_(owner),
children_(children), children_(children),
nextChild_(nextChild),
config_(config), config_(config),
isDirty_(isDirty), isDirty_(isDirty),
resolvedDimensions_(resolvedDimensions) {} resolvedDimensions_(resolvedDimensions) {}
@@ -345,6 +483,7 @@ YGNode& YGNode::operator=(const YGNode& node) {
lineIndex_ = node.getLineIndex(); lineIndex_ = node.getLineIndex();
owner_ = node.getOwner(); owner_ = node.getOwner();
children_ = node.getChildren(); children_ = node.getChildren();
nextChild_ = node.getNextChild();
config_ = node.getConfig(); config_ = node.getConfig();
isDirty_ = node.isDirty(); isDirty_ = node.isDirty();
resolvedDimensions_ = node.getResolvedDimensions(); resolvedDimensions_ = node.getResolvedDimensions();

View File

@@ -26,6 +26,7 @@ struct YGNode {
uint32_t lineIndex_; uint32_t lineIndex_;
YGNodeRef owner_; YGNodeRef owner_;
YGVector children_; YGVector children_;
YGNodeRef nextChild_;
YGConfigRef config_; YGConfigRef config_;
bool isDirty_; bool isDirty_;
std::array<YGValue, 2> resolvedDimensions_; std::array<YGValue, 2> resolvedDimensions_;
@@ -53,102 +54,38 @@ struct YGNode {
uint32_t lineIndex, uint32_t lineIndex,
YGNodeRef owner, YGNodeRef owner,
const YGVector& children, const YGVector& children,
YGNodeRef nextChild,
YGConfigRef config, YGConfigRef config,
bool isDirty, bool isDirty,
std::array<YGValue, 2> resolvedDimensions); std::array<YGValue, 2> resolvedDimensions);
// Getters // Getters
void* getContext() const { void* getContext() const;
return context_; YGPrintFunc getPrintFunc() const;
} bool getHasNewLayout() const;
YGNodeType getNodeType() const;
YGPrintFunc getPrintFunc() const { YGMeasureFunc getMeasure() const;
return print_; YGBaselineFunc getBaseline() const;
} YGDirtiedFunc getDirtied() const;
bool getHasNewLayout() const {
return hasNewLayout_;
}
YGNodeType getNodeType() const {
return nodeType_;
}
YGMeasureFunc getMeasure() const {
return measure_;
}
YGBaselineFunc getBaseline() const {
return baseline_;
}
YGDirtiedFunc getDirtied() const {
return dirtied_;
}
// For Performance reasons passing as reference. // For Performance reasons passing as reference.
YGStyle& getStyle() { YGStyle& getStyle();
return style_;
}
const YGStyle& getStyle() const {
return style_;
}
// For Performance reasons passing as reference. // For Performance reasons passing as reference.
YGLayout& getLayout() { YGLayout& getLayout();
return layout_; uint32_t getLineIndex() const;
}
const YGLayout& getLayout() const {
return layout_;
}
uint32_t getLineIndex() const {
return lineIndex_;
}
// returns the YGNodeRef that owns this YGNode. An owner is used to identify // returns the YGNodeRef that owns this YGNode. An owner is used to identify
// the YogaTree that a YGNode belongs to. // the YogaTree that a YGNode belongs to.
// This method will return the parent of the YGNode when a YGNode only belongs // This method will return the parent of the YGNode when a YGNode only belongs
// to one YogaTree or nullptr when the YGNode is shared between two or more // to one YogaTree or nullptr when the YGNode is shared between two or more
// YogaTrees. // YogaTrees.
YGNodeRef getOwner() const { YGNodeRef getOwner() const;
return owner_; YGVector getChildren() const;
} uint32_t getChildrenCount() const;
YGNodeRef getChild(uint32_t index) const;
// Deprecated, use getOwner() instead. YGNodeRef getNextChild() const;
YGNodeRef getParent() const { YGConfigRef getConfig() const;
return getOwner(); bool isDirty() const;
} std::array<YGValue, 2> getResolvedDimensions() const;
YGValue getResolvedDimension(int index);
YGVector getChildren() const {
return children_;
}
uint32_t getChildrenCount() const {
return static_cast<uint32_t>(children_.size());
}
YGNodeRef getChild(uint32_t index) const {
return children_.at(index);
}
YGConfigRef getConfig() const {
return config_;
}
bool isDirty() const {
return isDirty_;
}
std::array<YGValue, 2> getResolvedDimensions() const {
return resolvedDimensions_;
}
YGValue getResolvedDimension(int index) const {
return resolvedDimensions_[index];
}
// Methods related to positions, margin, padding and border // Methods related to positions, margin, padding and border
YGFloatOptional getLeadingPosition(const YGFlexDirection& axis, YGFloatOptional getLeadingPosition(const YGFlexDirection& axis,
@@ -183,66 +120,22 @@ struct YGNode {
const float& widthSize) const; const float& widthSize) const;
// Setters // Setters
void setContext(void* context) { void setContext(void* context);
context_ = context; void setPrintFunc(YGPrintFunc printFunc);
} void setHasNewLayout(bool hasNewLayout);
void setNodeType(YGNodeType nodeTye);
void setPrintFunc(YGPrintFunc printFunc) {
print_ = printFunc;
}
void setHasNewLayout(bool hasNewLayout) {
hasNewLayout_ = hasNewLayout;
}
void setNodeType(YGNodeType nodeType) {
nodeType_ = nodeType;
}
void setStyleFlexDirection(YGFlexDirection direction) {
style_.flexDirection = direction;
}
void setStyleAlignContent(YGAlign alignContent) {
style_.alignContent = alignContent;
}
void setMeasureFunc(YGMeasureFunc measureFunc); void setMeasureFunc(YGMeasureFunc measureFunc);
void setBaseLineFunc(YGBaselineFunc baseLineFunc);
void setBaseLineFunc(YGBaselineFunc baseLineFunc) { void setDirtiedFunc(YGDirtiedFunc dirtiedFunc);
baseline_ = baseLineFunc; void setStyle(const YGStyle& style);
} void setStyleFlexDirection(YGFlexDirection direction);
void setStyleAlignContent(YGAlign alignContent);
void setDirtiedFunc(YGDirtiedFunc dirtiedFunc) { void setLayout(const YGLayout& layout);
dirtied_ = dirtiedFunc; void setLineIndex(uint32_t lineIndex);
} void setOwner(YGNodeRef owner);
void setChildren(const YGVector& children);
void setStyle(const YGStyle& style) { void setNextChild(YGNodeRef nextChild);
style_ = style; void setConfig(YGConfigRef config);
}
void setLayout(const YGLayout& layout) {
layout_ = layout;
}
void setLineIndex(uint32_t lineIndex) {
lineIndex_ = lineIndex;
}
void setOwner(YGNodeRef owner) {
owner_ = owner;
}
void setChildren(const YGVector& children) {
children_ = children;
}
// TODO: rvalue override for setChildren
void setConfig(YGConfigRef config) {
config_ = config;
}
void setDirty(bool isDirty); void setDirty(bool isDirty);
void setLayoutLastOwnerDirection(YGDirection direction); void setLayoutLastOwnerDirection(YGDirection direction);
void setLayoutComputedFlexBasis(const YGFloatOptional& computedFlexBasis); void setLayoutComputedFlexBasis(const YGFloatOptional& computedFlexBasis);

View File

@@ -1,9 +1,8 @@
/* /**
* Copyright (c) 2014-present, Facebook, Inc. * Copyright (c) 2014-present, Facebook, Inc.
* *
* This source code is licensed under the MIT license found in the LICENSE * This source code is licensed under the MIT license found in the
* file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*
*/ */
#include "Yoga.h" #include "Yoga.h"
@@ -275,6 +274,10 @@ static YGNodeRef YGNodeDeepClone(YGNodeRef oldNode) {
node->setConfig(YGConfigClone(*(oldNode->getConfig()))); node->setConfig(YGConfigClone(*(oldNode->getConfig())));
} }
if (oldNode->getNextChild() != nullptr) {
node->setNextChild(YGNodeDeepClone(oldNode->getNextChild()));
}
return node; return node;
} }
@@ -532,10 +535,6 @@ YGNodeRef YGNodeGetOwner(const YGNodeRef node) {
return node->getOwner(); return node->getOwner();
} }
YGNodeRef YGNodeGetParent(const YGNodeRef node) {
return node->getOwner();
}
void YGNodeMarkDirty(const YGNodeRef node) { void YGNodeMarkDirty(const YGNodeRef node) {
YGAssertWithNode( YGAssertWithNode(
node, node,
@@ -1784,17 +1783,16 @@ static void YGNodeComputeFlexBasisForChildren(
// child to exactly match the remaining space // child to exactly match the remaining space
if (measureModeMainDim == YGMeasureModeExactly) { if (measureModeMainDim == YGMeasureModeExactly) {
for (auto child : children) { for (auto child : children) {
if (singleFlexChild != nullptr) {
if (child->isNodeFlexible()) { if (child->isNodeFlexible()) {
if (singleFlexChild != nullptr || // There is already a flexible child, abort
YGFloatsEqual(child->resolveFlexGrow(), 0.0f) ||
YGFloatsEqual(child->resolveFlexShrink(), 0.0f)) {
// There is already a flexible child, or this flexible child doesn't
// have flexGrow and flexShrink, abort
singleFlexChild = nullptr; singleFlexChild = nullptr;
break; break;
} else {
singleFlexChild = child;
} }
} else if (
child->resolveFlexGrow() > 0.0f &&
child->resolveFlexShrink() > 0.0f) {
singleFlexChild = child;
} }
} }
} }

View File

@@ -92,7 +92,6 @@ WIN_EXPORT void YGNodeRemoveChild(const YGNodeRef node, const YGNodeRef child);
WIN_EXPORT void YGNodeRemoveAllChildren(const YGNodeRef node); WIN_EXPORT void YGNodeRemoveAllChildren(const YGNodeRef node);
WIN_EXPORT YGNodeRef YGNodeGetChild(const YGNodeRef node, const uint32_t index); WIN_EXPORT YGNodeRef YGNodeGetChild(const YGNodeRef node, const uint32_t index);
WIN_EXPORT YGNodeRef YGNodeGetOwner(const YGNodeRef node); WIN_EXPORT YGNodeRef YGNodeGetOwner(const YGNodeRef node);
WIN_EXPORT YGNodeRef YGNodeGetParent(const YGNodeRef node);
WIN_EXPORT uint32_t YGNodeGetChildCount(const YGNodeRef node); WIN_EXPORT uint32_t YGNodeGetChildCount(const YGNodeRef node);
WIN_EXPORT void YGNodeSetChildren( WIN_EXPORT void YGNodeSetChildren(
YGNodeRef const owner, YGNodeRef const owner,

View File

@@ -1,192 +1,103 @@
"""Provides macros for working with yoga library.""" """Provides macros for working with yoga library."""
YOGA_ROOTS = ["//..."] YOGA_ROOTS = ['//...']
JAVA_TARGET = '//java:java'
JAVA_TARGET = "//java:java" INFER_ANNOTATIONS_TARGET = '//lib/infer-annotations:infer-annotations'
JSR_305_TARGET = '//lib/jsr-305:jsr-305'
INFER_ANNOTATIONS_TARGET = "//lib/infer-annotations:infer-annotations" JUNIT_TARGET = '//lib/junit:junit'
PROGRUARD_ANNOTATIONS_TARGET = '//java/proguard-annotations/src/main/java/com/facebook/proguard/annotations:annotations'
JSR_305_TARGET = "//lib/jsr-305:jsr-305" SOLOADER_TARGET = '//lib/soloader:soloader'
GTEST_TARGET = '//lib/gtest:gtest'
JUNIT_TARGET = "//lib/junit:junit" JNI_TARGET = '//lib/jni:jni'
FBJNI_TARGET = '//lib/fb:fbjni'
PROGRUARD_ANNOTATIONS_TARGET = "//java/proguard-annotations/src/main/java/com/facebook/proguard/annotations:annotations" FBJNI_JAVA_TARGET = '//lib/fb/src/main/java/com/facebook/jni:jni'
APPCOMPAT_TARGET = '//lib/appcompat:appcompat'
SOLOADER_TARGET = "//lib/soloader:soloader" APPLE = ''
ANDROID = ''
GTEST_TARGET = "//lib/gtest:gtest" ANDROID_SUPPORT_TARGET = '//lib/android-support:android-support'
ANDROID_TARGET = '//android:android'
JNI_TARGET = "//lib/jni:jni" ANDROID_JAVA_TARGET = '//android/src/main/java/com/facebook/yoga/android:android'
ANDROID_RES_TARGET = '//android:res'
FBJNI_TARGET = "//lib/fb:fbjni" ANDROID_SAMPLE_JAVA_TARGET = '//android/sample/java/com/facebook/samples/yoga:yoga'
ANDROID_SAMPLE_RES_TARGET = '//android/sample:res'
FBJNI_JAVA_TARGET = "//lib/fb/src/main/java/com/facebook/jni:jni"
APPCOMPAT_TARGET = "//lib/appcompat:appcompat"
APPLE = ""
ANDROID = ""
ANDROID_SUPPORT_TARGET = "//lib/android-support:android-support"
ANDROID_TARGET = "//android:android"
ANDROID_JAVA_TARGET = "//android/src/main/java/com/facebook/yoga/android:android"
ANDROID_RES_TARGET = "//android:res"
ANDROID_SAMPLE_JAVA_TARGET = "//android/sample/java/com/facebook/samples/yoga:yoga"
ANDROID_SAMPLE_RES_TARGET = "//android/sample:res"
CXX_LIBRARY_WHITELIST = [ CXX_LIBRARY_WHITELIST = [
"//:yoga", '//:yoga',
"//lib/fb:fbjni", '//lib/fb:fbjni',
"//java:jni", '//java:jni',
] ]
BASE_COMPILER_FLAGS = [ BASE_COMPILER_FLAGS = [
"-fno-omit-frame-pointer", '-fno-omit-frame-pointer',
"-fexceptions", '-fexceptions',
"-Wall", '-Wall',
"-Werror", '-Werror',
"-O3", '-O3',
"-ffast-math", '-ffast-math',
] ]
LIBRARY_COMPILER_FLAGS = BASE_COMPILER_FLAGS + [ LIBRARY_COMPILER_FLAGS = BASE_COMPILER_FLAGS + [
"-fPIC", '-fPIC',
] ]
def _paths_join(path, *others):
"""Joins one or more path components."""
result = path
for p in others:
if p.startswith("/"): # absolute
result = p
elif not result or result.endswith("/"):
result += p
else:
result += "/" + p
return result
def subdir_glob(glob_specs, exclude = None, prefix = ""):
"""Returns a dict of sub-directory relative paths to full paths.
The subdir_glob() function is useful for defining header maps for C/C++
libraries which should be relative the given sub-directory.
Given a list of tuples, the form of (relative-sub-directory, glob-pattern),
it returns a dict of sub-directory relative paths to full paths.
Please refer to native.glob() for explanations and examples of the pattern.
Args:
glob_specs: The array of tuples in form of
(relative-sub-directory, glob-pattern inside relative-sub-directory).
type: List[Tuple[str, str]]
exclude: A list of patterns to identify files that should be removed
from the set specified by the first argument. Defaults to [].
type: Optional[List[str]]
prefix: If is not None, prepends it to each key in the dictionary.
Defaults to None.
type: Optional[str]
Returns:
A dict of sub-directory relative paths to full paths.
"""
if exclude == None:
exclude = []
results = []
for dirpath, glob_pattern in glob_specs:
results.append(
_single_subdir_glob(dirpath, glob_pattern, exclude, prefix),
)
return _merge_maps(*results)
def _merge_maps(*file_maps):
result = {}
for file_map in file_maps:
for key in file_map:
if key in result and result[key] != file_map[key]:
fail(
"Conflicting files in file search paths. " +
"\"%s\" maps to both \"%s\" and \"%s\"." %
(key, result[key], file_map[key]),
)
result[key] = file_map[key]
return result
def _single_subdir_glob(dirpath, glob_pattern, exclude = None, prefix = None):
if exclude == None:
exclude = []
results = {}
files = native.glob([_paths_join(dirpath, glob_pattern)], exclude = exclude)
for f in files:
if dirpath:
key = f[len(dirpath) + 1:]
else:
key = f
if prefix:
key = _paths_join(prefix, key)
results[key] = f
return results
def yoga_dep(dep): def yoga_dep(dep):
return "//" + dep return '//' + dep
def yoga_android_aar(*args, **kwargs): def yoga_android_aar(*args, **kwargs):
native.android_aar(*args, **kwargs) native.android_aar(*args, **kwargs)
def yoga_android_binary(*args, **kwargs): def yoga_android_binary(*args, **kwargs):
native.android_binary(*args, **kwargs) native.android_binary(*args, **kwargs)
def yoga_android_library(*args, **kwargs): def yoga_android_library(*args, **kwargs):
native.android_library(*args, **kwargs) native.android_library(*args, **kwargs)
def yoga_android_resource(*args, **kwargs): def yoga_android_resource(*args, **kwargs):
native.android_resource(*args, **kwargs) native.android_resource(*args, **kwargs)
def yoga_apple_library(*args, **kwargs): def yoga_apple_library(*args, **kwargs):
native.apple_library(*args, **kwargs) native.apple_library(*args, **kwargs)
def yoga_apple_test(*args, **kwargs): def yoga_apple_test(*args, **kwargs):
native.apple_test(*args, **kwargs) native.apple_test(*args, **kwargs)
def yoga_cxx_binary(*args, **kwargs):
kwargs.pop("platforms", None)
native.cxx_binary(*args, **kwargs)
def yoga_cxx_library(*args, **kwargs): def yoga_cxx_library(*args, **kwargs):
# Currently unused # Currently unused
kwargs.pop("platforms", None) kwargs.pop("platforms", None)
native.cxx_library(*args, **kwargs) native.cxx_library(*args, **kwargs)
def yoga_cxx_test(*args, **kwargs): def yoga_cxx_test(*args, **kwargs):
native.cxx_test(*args, **kwargs) native.cxx_test(*args, **kwargs)
def yoga_java_binary(*args, **kwargs): def yoga_java_binary(*args, **kwargs):
native.java_binary(*args, **kwargs) native.java_binary(*args, **kwargs)
def yoga_java_library(*args, **kwargs): def yoga_java_library(*args, **kwargs):
native.java_library(*args, **kwargs) native.java_library(*args, **kwargs)
def yoga_java_test(*args, **kwargs): def yoga_java_test(*args, **kwargs):
native.java_test(*args, **kwargs) native.java_test(*args, **kwargs)
def yoga_prebuilt_cxx_library(*args, **kwargs): def yoga_prebuilt_cxx_library(*args, **kwargs):
native.prebuilt_cxx_library(*args, **kwargs) native.prebuilt_cxx_library(*args, **kwargs)
def yoga_prebuilt_jar(*args, **kwargs): def yoga_prebuilt_jar(*args, **kwargs):
native.prebuilt_jar(*args, **kwargs) native.prebuilt_jar(*args, **kwargs)
def is_apple_platform(): def is_apple_platform():
return True return True