2016-12-03 04:40:18 -08:00
|
|
|
/**
|
|
|
|
* Copyright (c) 2014-present, Facebook, Inc.
|
|
|
|
*
|
2018-02-16 18:24:55 -08:00
|
|
|
* This source code is licensed under the MIT license found in the
|
|
|
|
* LICENSE file in the root directory of this source tree.
|
2016-12-03 04:40:18 -08:00
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <assert.h>
|
|
|
|
#include <math.h>
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#ifndef __cplusplus
|
|
|
|
#include <stdbool.h>
|
|
|
|
#endif
|
|
|
|
|
2018-03-01 04:00:35 -08:00
|
|
|
/** Large positive number signifies that the property(float) is undefined.
|
|
|
|
*Earlier we used to have YGundefined as NAN, but the downside of this is that
|
|
|
|
*we can't use -ffast-math compiler flag as it assumes all floating-point
|
|
|
|
*calculation involve and result into finite numbers. For more information
|
|
|
|
*regarding -ffast-math compiler flag in clang, have a look at
|
|
|
|
*https://clang.llvm.org/docs/UsersManual.html#cmdoption-ffast-math
|
|
|
|
**/
|
|
|
|
#define YGUndefined 10E20F
|
2016-12-03 04:40:18 -08:00
|
|
|
|
|
|
|
#include "YGEnums.h"
|
|
|
|
#include "YGMacros.h"
|
|
|
|
|
|
|
|
YG_EXTERN_C_BEGIN
|
|
|
|
|
|
|
|
typedef struct YGSize {
|
|
|
|
float width;
|
|
|
|
float height;
|
|
|
|
} YGSize;
|
|
|
|
|
Add feature to use percentage as value unit
Summary:
Adds the feature to use percentage as a value unit.
You can use the function ```YGPx(float)``` and ```YGPercent(float)``` for convenience.
I did some benchmarks:
```
Without Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.146683 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.490101 ms
Huge nested layout: median: 23.000000 ms, stddev: 0.928291 ms
Stack with flex: median: 0.000000 ms, stddev: 0.170587 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.143384 ms
Nested flex: median: 0.000000 ms, stddev: 0.477791 ms
Huge nested layout: median: 22.000000 ms, stddev: 2.129779 ms
With Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.132951 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.489570 ms
Huge nested layout: median: 21.000000 ms, stddev: 1.390476 ms
Closes https://github.com/facebook/yoga/pull/258
Reviewed By: dshahidehpour
Differential Revision: D4361945
Pulled By: emilsjolander
fbshipit-source-id: a8f5bc63ad352eb9410d792729e56664468cd76a
2017-01-02 05:20:37 -08:00
|
|
|
typedef struct YGValue {
|
|
|
|
float value;
|
|
|
|
YGUnit unit;
|
|
|
|
} YGValue;
|
|
|
|
|
2017-12-19 11:18:00 -08:00
|
|
|
extern const YGValue YGValueUndefined;
|
|
|
|
extern const YGValue YGValueAuto;
|
2017-01-11 03:58:03 -08:00
|
|
|
|
2017-03-01 09:19:55 -08:00
|
|
|
typedef struct YGConfig *YGConfigRef;
|
2017-12-19 11:18:00 -08:00
|
|
|
|
|
|
|
typedef struct YGNode* YGNodeRef;
|
|
|
|
|
2016-12-03 04:40:18 -08:00
|
|
|
typedef YGSize (*YGMeasureFunc)(YGNodeRef node,
|
|
|
|
float width,
|
|
|
|
YGMeasureMode widthMode,
|
|
|
|
float height,
|
|
|
|
YGMeasureMode heightMode);
|
2017-01-06 06:51:56 -08:00
|
|
|
typedef float (*YGBaselineFunc)(YGNodeRef node, const float width, const float height);
|
2018-01-10 09:45:08 -08:00
|
|
|
typedef void (*YGDirtiedFunc)(YGNodeRef node);
|
2016-12-03 04:40:18 -08:00
|
|
|
typedef void (*YGPrintFunc)(YGNodeRef node);
|
2017-05-03 09:22:35 -07:00
|
|
|
typedef int (*YGLogger)(const YGConfigRef config,
|
|
|
|
const YGNodeRef node,
|
|
|
|
YGLogLevel level,
|
|
|
|
const char *format,
|
|
|
|
va_list args);
|
2018-04-01 18:27:04 -07:00
|
|
|
typedef YGNodeRef (*YGCloneNodeFunc)(YGNodeRef oldNode,
|
Persistent Yoga
Summary:
This is meant to show a possible route format for a persistent form of Yoga. Where previous layouts can remain intact while still taking advantage of incremental layout by reusing previous subtrees.
```c
YGNodeRef YGNodeClone(const YGNodeRef node);
```
The core of this functionality is a new API to clone an existing node. This makes a new detached node with all the same values as the previous one. Conceptually this makes the original node "frozen" from that point on. It's now immutable. (This is not yet enforced at runtime in this PR but something we should add.)
Since the original is frozen, we reuse the children set from the original node. Their parent pointers still point back to the original tree though.
The cloned node is still mutable. It can have its styles updated, and nodes can be inserted or deleted. If an insertion/deletion happens on a cloned node whose children were reused, it'll first shallow clone its children automatically.
As a convenience I also added an API to clear all children:
```c
void YGNodeRemoveAllChildren(const YGNodeRef node);
```
During insert/delete, or as a result of layout a set of reused children may need to be first cloned. A kind of copy-on-write. When that happens, the host may want to respond. E.g. by updating the `context` such as by cloning any wrapper objects and attaching them to the new node.
```c
typedef void (*YGNodeClonedFunc)(YGNodeRef oldNode,
YGNodeRef newNode,
YGNodeRef parent,
int childIndex);
void YGConfigSetNodeClonedFunc(YGConfigRef config,
YGNodeClonedFunc callback);
```
This PR doesn't change any existing semantics for trees that are not first cloned.
It's possible for a single node to exist in two trees at once and be used by multiple threads. Therefore it's not safe to recursively free a whole tree when you use persistence. To solve this, any user of the library has to manually manage ref counting or tracing GC. E.g. by replicating the tree structure in a wrapper.
In a follow up we could consider moving ref counting into Yoga.
Closes https://github.com/facebook/yoga/pull/636
Reviewed By: emilsjolander
Differential Revision: D5941921
Pulled By: sebmarkbage
fbshipit-source-id: c8e93421824c112d09c4773bed4e3141b6491ccf
2017-10-17 01:02:04 -07:00
|
|
|
YGNodeRef parent,
|
|
|
|
int childIndex);
|
2016-12-03 04:40:18 -08:00
|
|
|
|
|
|
|
// YGNode
|
|
|
|
WIN_EXPORT YGNodeRef YGNodeNew(void);
|
2017-03-01 09:19:55 -08:00
|
|
|
WIN_EXPORT YGNodeRef YGNodeNewWithConfig(const YGConfigRef config);
|
Persistent Yoga
Summary:
This is meant to show a possible route format for a persistent form of Yoga. Where previous layouts can remain intact while still taking advantage of incremental layout by reusing previous subtrees.
```c
YGNodeRef YGNodeClone(const YGNodeRef node);
```
The core of this functionality is a new API to clone an existing node. This makes a new detached node with all the same values as the previous one. Conceptually this makes the original node "frozen" from that point on. It's now immutable. (This is not yet enforced at runtime in this PR but something we should add.)
Since the original is frozen, we reuse the children set from the original node. Their parent pointers still point back to the original tree though.
The cloned node is still mutable. It can have its styles updated, and nodes can be inserted or deleted. If an insertion/deletion happens on a cloned node whose children were reused, it'll first shallow clone its children automatically.
As a convenience I also added an API to clear all children:
```c
void YGNodeRemoveAllChildren(const YGNodeRef node);
```
During insert/delete, or as a result of layout a set of reused children may need to be first cloned. A kind of copy-on-write. When that happens, the host may want to respond. E.g. by updating the `context` such as by cloning any wrapper objects and attaching them to the new node.
```c
typedef void (*YGNodeClonedFunc)(YGNodeRef oldNode,
YGNodeRef newNode,
YGNodeRef parent,
int childIndex);
void YGConfigSetNodeClonedFunc(YGConfigRef config,
YGNodeClonedFunc callback);
```
This PR doesn't change any existing semantics for trees that are not first cloned.
It's possible for a single node to exist in two trees at once and be used by multiple threads. Therefore it's not safe to recursively free a whole tree when you use persistence. To solve this, any user of the library has to manually manage ref counting or tracing GC. E.g. by replicating the tree structure in a wrapper.
In a follow up we could consider moving ref counting into Yoga.
Closes https://github.com/facebook/yoga/pull/636
Reviewed By: emilsjolander
Differential Revision: D5941921
Pulled By: sebmarkbage
fbshipit-source-id: c8e93421824c112d09c4773bed4e3141b6491ccf
2017-10-17 01:02:04 -07:00
|
|
|
WIN_EXPORT YGNodeRef YGNodeClone(const YGNodeRef node);
|
2016-12-03 04:40:18 -08:00
|
|
|
WIN_EXPORT void YGNodeFree(const YGNodeRef node);
|
|
|
|
WIN_EXPORT void YGNodeFreeRecursive(const YGNodeRef node);
|
|
|
|
WIN_EXPORT void YGNodeReset(const YGNodeRef node);
|
|
|
|
WIN_EXPORT int32_t YGNodeGetInstanceCount(void);
|
|
|
|
|
|
|
|
WIN_EXPORT void YGNodeInsertChild(const YGNodeRef node,
|
|
|
|
const YGNodeRef child,
|
|
|
|
const uint32_t index);
|
|
|
|
WIN_EXPORT void YGNodeRemoveChild(const YGNodeRef node, const YGNodeRef child);
|
Persistent Yoga
Summary:
This is meant to show a possible route format for a persistent form of Yoga. Where previous layouts can remain intact while still taking advantage of incremental layout by reusing previous subtrees.
```c
YGNodeRef YGNodeClone(const YGNodeRef node);
```
The core of this functionality is a new API to clone an existing node. This makes a new detached node with all the same values as the previous one. Conceptually this makes the original node "frozen" from that point on. It's now immutable. (This is not yet enforced at runtime in this PR but something we should add.)
Since the original is frozen, we reuse the children set from the original node. Their parent pointers still point back to the original tree though.
The cloned node is still mutable. It can have its styles updated, and nodes can be inserted or deleted. If an insertion/deletion happens on a cloned node whose children were reused, it'll first shallow clone its children automatically.
As a convenience I also added an API to clear all children:
```c
void YGNodeRemoveAllChildren(const YGNodeRef node);
```
During insert/delete, or as a result of layout a set of reused children may need to be first cloned. A kind of copy-on-write. When that happens, the host may want to respond. E.g. by updating the `context` such as by cloning any wrapper objects and attaching them to the new node.
```c
typedef void (*YGNodeClonedFunc)(YGNodeRef oldNode,
YGNodeRef newNode,
YGNodeRef parent,
int childIndex);
void YGConfigSetNodeClonedFunc(YGConfigRef config,
YGNodeClonedFunc callback);
```
This PR doesn't change any existing semantics for trees that are not first cloned.
It's possible for a single node to exist in two trees at once and be used by multiple threads. Therefore it's not safe to recursively free a whole tree when you use persistence. To solve this, any user of the library has to manually manage ref counting or tracing GC. E.g. by replicating the tree structure in a wrapper.
In a follow up we could consider moving ref counting into Yoga.
Closes https://github.com/facebook/yoga/pull/636
Reviewed By: emilsjolander
Differential Revision: D5941921
Pulled By: sebmarkbage
fbshipit-source-id: c8e93421824c112d09c4773bed4e3141b6491ccf
2017-10-17 01:02:04 -07:00
|
|
|
WIN_EXPORT void YGNodeRemoveAllChildren(const YGNodeRef node);
|
2016-12-03 04:40:18 -08:00
|
|
|
WIN_EXPORT YGNodeRef YGNodeGetChild(const YGNodeRef node, const uint32_t index);
|
2018-04-01 18:27:06 -07:00
|
|
|
WIN_EXPORT YGNodeRef YGNodeGetOwner(const YGNodeRef node);
|
2016-12-16 04:39:13 -08:00
|
|
|
WIN_EXPORT uint32_t YGNodeGetChildCount(const YGNodeRef node);
|
2018-03-25 13:56:13 -07:00
|
|
|
WIN_EXPORT void YGNodeSetChildren(YGNodeRef const parent, const YGNodeRef children[], const uint32_t count);
|
2016-12-03 04:40:18 -08:00
|
|
|
|
|
|
|
WIN_EXPORT void YGNodeCalculateLayout(const YGNodeRef node,
|
|
|
|
const float availableWidth,
|
|
|
|
const float availableHeight,
|
2018-04-01 18:27:06 -07:00
|
|
|
const YGDirection ownerDirection);
|
2016-12-03 04:40:18 -08:00
|
|
|
|
|
|
|
// Mark a node as dirty. Only valid for nodes with a custom measure function
|
|
|
|
// set.
|
|
|
|
// YG knows when to mark all other nodes as dirty but because nodes with
|
|
|
|
// measure functions
|
|
|
|
// depends on information not known to YG they must perform this dirty
|
|
|
|
// marking manually.
|
|
|
|
WIN_EXPORT void YGNodeMarkDirty(const YGNodeRef node);
|
|
|
|
|
2018-02-08 04:51:12 -08:00
|
|
|
// This function marks the current node and all its descendants as dirty. This function is added to test yoga benchmarks.
|
|
|
|
// This function is not expected to be used in production as calling `YGCalculateLayout` will cause the recalculation of each and every node.
|
|
|
|
WIN_EXPORT void YGNodeMarkDirtyAndPropogateToDescendants(const YGNodeRef node);
|
|
|
|
|
2016-12-03 04:40:18 -08:00
|
|
|
WIN_EXPORT void YGNodePrint(const YGNodeRef node, const YGPrintOptions options);
|
|
|
|
|
Add feature to use percentage as value unit
Summary:
Adds the feature to use percentage as a value unit.
You can use the function ```YGPx(float)``` and ```YGPercent(float)``` for convenience.
I did some benchmarks:
```
Without Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.146683 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.490101 ms
Huge nested layout: median: 23.000000 ms, stddev: 0.928291 ms
Stack with flex: median: 0.000000 ms, stddev: 0.170587 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.143384 ms
Nested flex: median: 0.000000 ms, stddev: 0.477791 ms
Huge nested layout: median: 22.000000 ms, stddev: 2.129779 ms
With Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.132951 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.489570 ms
Huge nested layout: median: 21.000000 ms, stddev: 1.390476 ms
Closes https://github.com/facebook/yoga/pull/258
Reviewed By: dshahidehpour
Differential Revision: D4361945
Pulled By: emilsjolander
fbshipit-source-id: a8f5bc63ad352eb9410d792729e56664468cd76a
2017-01-02 05:20:37 -08:00
|
|
|
WIN_EXPORT bool YGFloatIsUndefined(const float value);
|
2016-12-03 04:40:18 -08:00
|
|
|
|
|
|
|
WIN_EXPORT bool YGNodeCanUseCachedMeasurement(const YGMeasureMode widthMode,
|
|
|
|
const float width,
|
|
|
|
const YGMeasureMode heightMode,
|
|
|
|
const float height,
|
|
|
|
const YGMeasureMode lastWidthMode,
|
|
|
|
const float lastWidth,
|
|
|
|
const YGMeasureMode lastHeightMode,
|
|
|
|
const float lastHeight,
|
|
|
|
const float lastComputedWidth,
|
|
|
|
const float lastComputedHeight,
|
|
|
|
const float marginRow,
|
2017-05-15 06:18:24 -07:00
|
|
|
const float marginColumn,
|
2017-08-23 02:40:04 -07:00
|
|
|
const YGConfigRef config);
|
2016-12-03 04:40:18 -08:00
|
|
|
|
|
|
|
WIN_EXPORT void YGNodeCopyStyle(const YGNodeRef dstNode, const YGNodeRef srcNode);
|
|
|
|
|
|
|
|
#define YG_NODE_PROPERTY(type, name, paramName) \
|
|
|
|
WIN_EXPORT void YGNodeSet##name(const YGNodeRef node, type paramName); \
|
|
|
|
WIN_EXPORT type YGNodeGet##name(const YGNodeRef node);
|
|
|
|
|
|
|
|
#define YG_NODE_STYLE_PROPERTY(type, name, paramName) \
|
|
|
|
WIN_EXPORT void YGNodeStyleSet##name(const YGNodeRef node, const type paramName); \
|
|
|
|
WIN_EXPORT type YGNodeStyleGet##name(const YGNodeRef node);
|
|
|
|
|
Add feature to use percentage as value unit
Summary:
Adds the feature to use percentage as a value unit.
You can use the function ```YGPx(float)``` and ```YGPercent(float)``` for convenience.
I did some benchmarks:
```
Without Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.146683 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.490101 ms
Huge nested layout: median: 23.000000 ms, stddev: 0.928291 ms
Stack with flex: median: 0.000000 ms, stddev: 0.170587 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.143384 ms
Nested flex: median: 0.000000 ms, stddev: 0.477791 ms
Huge nested layout: median: 22.000000 ms, stddev: 2.129779 ms
With Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.132951 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.489570 ms
Huge nested layout: median: 21.000000 ms, stddev: 1.390476 ms
Closes https://github.com/facebook/yoga/pull/258
Reviewed By: dshahidehpour
Differential Revision: D4361945
Pulled By: emilsjolander
fbshipit-source-id: a8f5bc63ad352eb9410d792729e56664468cd76a
2017-01-02 05:20:37 -08:00
|
|
|
#define YG_NODE_STYLE_PROPERTY_UNIT(type, name, paramName) \
|
|
|
|
WIN_EXPORT void YGNodeStyleSet##name(const YGNodeRef node, const float paramName); \
|
|
|
|
WIN_EXPORT void YGNodeStyleSet##name##Percent(const YGNodeRef node, const float paramName); \
|
|
|
|
WIN_EXPORT type YGNodeStyleGet##name(const YGNodeRef node);
|
|
|
|
|
2017-02-14 14:26:09 -08:00
|
|
|
#define YG_NODE_STYLE_PROPERTY_UNIT_AUTO(type, name, paramName) \
|
|
|
|
YG_NODE_STYLE_PROPERTY_UNIT(type, name, paramName) \
|
|
|
|
WIN_EXPORT void YGNodeStyleSet##name##Auto(const YGNodeRef node);
|
|
|
|
|
2016-12-03 04:40:18 -08:00
|
|
|
#define YG_NODE_STYLE_EDGE_PROPERTY(type, name, paramName) \
|
|
|
|
WIN_EXPORT void YGNodeStyleSet##name(const YGNodeRef node, \
|
|
|
|
const YGEdge edge, \
|
|
|
|
const type paramName); \
|
|
|
|
WIN_EXPORT type YGNodeStyleGet##name(const YGNodeRef node, const YGEdge edge);
|
|
|
|
|
Add feature to use percentage as value unit
Summary:
Adds the feature to use percentage as a value unit.
You can use the function ```YGPx(float)``` and ```YGPercent(float)``` for convenience.
I did some benchmarks:
```
Without Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.146683 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.490101 ms
Huge nested layout: median: 23.000000 ms, stddev: 0.928291 ms
Stack with flex: median: 0.000000 ms, stddev: 0.170587 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.143384 ms
Nested flex: median: 0.000000 ms, stddev: 0.477791 ms
Huge nested layout: median: 22.000000 ms, stddev: 2.129779 ms
With Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.132951 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.489570 ms
Huge nested layout: median: 21.000000 ms, stddev: 1.390476 ms
Closes https://github.com/facebook/yoga/pull/258
Reviewed By: dshahidehpour
Differential Revision: D4361945
Pulled By: emilsjolander
fbshipit-source-id: a8f5bc63ad352eb9410d792729e56664468cd76a
2017-01-02 05:20:37 -08:00
|
|
|
#define YG_NODE_STYLE_EDGE_PROPERTY_UNIT(type, name, paramName) \
|
|
|
|
WIN_EXPORT void YGNodeStyleSet##name(const YGNodeRef node, \
|
|
|
|
const YGEdge edge, \
|
|
|
|
const float paramName); \
|
|
|
|
WIN_EXPORT void YGNodeStyleSet##name##Percent(const YGNodeRef node, \
|
|
|
|
const YGEdge edge, \
|
|
|
|
const float paramName); \
|
2017-03-06 11:29:52 -08:00
|
|
|
WIN_EXPORT WIN_STRUCT(type) YGNodeStyleGet##name(const YGNodeRef node, const YGEdge edge);
|
Add feature to use percentage as value unit
Summary:
Adds the feature to use percentage as a value unit.
You can use the function ```YGPx(float)``` and ```YGPercent(float)``` for convenience.
I did some benchmarks:
```
Without Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.146683 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.490101 ms
Huge nested layout: median: 23.000000 ms, stddev: 0.928291 ms
Stack with flex: median: 0.000000 ms, stddev: 0.170587 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.143384 ms
Nested flex: median: 0.000000 ms, stddev: 0.477791 ms
Huge nested layout: median: 22.000000 ms, stddev: 2.129779 ms
With Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.132951 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.489570 ms
Huge nested layout: median: 21.000000 ms, stddev: 1.390476 ms
Closes https://github.com/facebook/yoga/pull/258
Reviewed By: dshahidehpour
Differential Revision: D4361945
Pulled By: emilsjolander
fbshipit-source-id: a8f5bc63ad352eb9410d792729e56664468cd76a
2017-01-02 05:20:37 -08:00
|
|
|
|
2017-02-14 14:26:09 -08:00
|
|
|
#define YG_NODE_STYLE_EDGE_PROPERTY_UNIT_AUTO(type, name) \
|
|
|
|
WIN_EXPORT void YGNodeStyleSet##name##Auto(const YGNodeRef node, const YGEdge edge);
|
|
|
|
|
2016-12-03 04:40:18 -08:00
|
|
|
#define YG_NODE_LAYOUT_PROPERTY(type, name) \
|
|
|
|
WIN_EXPORT type YGNodeLayoutGet##name(const YGNodeRef node);
|
|
|
|
|
2017-01-26 13:36:38 -08:00
|
|
|
#define YG_NODE_LAYOUT_EDGE_PROPERTY(type, name) \
|
|
|
|
WIN_EXPORT type YGNodeLayoutGet##name(const YGNodeRef node, const YGEdge edge);
|
|
|
|
|
2017-12-19 11:18:00 -08:00
|
|
|
void* YGNodeGetContext(YGNodeRef node);
|
|
|
|
void YGNodeSetContext(YGNodeRef node, void* context);
|
|
|
|
YGMeasureFunc YGNodeGetMeasureFunc(YGNodeRef node);
|
|
|
|
void YGNodeSetMeasureFunc(YGNodeRef node, YGMeasureFunc measureFunc);
|
|
|
|
YGBaselineFunc YGNodeGetBaselineFunc(YGNodeRef node);
|
|
|
|
void YGNodeSetBaselineFunc(YGNodeRef node, YGBaselineFunc baselineFunc);
|
2018-01-15 15:35:51 -08:00
|
|
|
YGDirtiedFunc YGNodeGetDirtiedFunc(YGNodeRef node);
|
|
|
|
void YGNodeSetDirtiedFunc(YGNodeRef node, YGDirtiedFunc dirtiedFunc);
|
2017-12-19 11:18:00 -08:00
|
|
|
YGPrintFunc YGNodeGetPrintFunc(YGNodeRef node);
|
|
|
|
void YGNodeSetPrintFunc(YGNodeRef node, YGPrintFunc printFunc);
|
|
|
|
bool YGNodeGetHasNewLayout(YGNodeRef node);
|
|
|
|
void YGNodeSetHasNewLayout(YGNodeRef node, bool hasNewLayout);
|
|
|
|
YGNodeType YGNodeGetNodeType(YGNodeRef node);
|
|
|
|
void YGNodeSetNodeType(YGNodeRef node, YGNodeType nodeType);
|
|
|
|
bool YGNodeIsDirty(YGNodeRef node);
|
2018-02-02 07:38:17 -08:00
|
|
|
bool YGNodeLayoutGetDidUseLegacyFlag(const YGNodeRef node);
|
2016-12-03 04:40:18 -08:00
|
|
|
|
|
|
|
YG_NODE_STYLE_PROPERTY(YGDirection, Direction, direction);
|
|
|
|
YG_NODE_STYLE_PROPERTY(YGFlexDirection, FlexDirection, flexDirection);
|
|
|
|
YG_NODE_STYLE_PROPERTY(YGJustify, JustifyContent, justifyContent);
|
|
|
|
YG_NODE_STYLE_PROPERTY(YGAlign, AlignContent, alignContent);
|
|
|
|
YG_NODE_STYLE_PROPERTY(YGAlign, AlignItems, alignItems);
|
|
|
|
YG_NODE_STYLE_PROPERTY(YGAlign, AlignSelf, alignSelf);
|
|
|
|
YG_NODE_STYLE_PROPERTY(YGPositionType, PositionType, positionType);
|
|
|
|
YG_NODE_STYLE_PROPERTY(YGWrap, FlexWrap, flexWrap);
|
|
|
|
YG_NODE_STYLE_PROPERTY(YGOverflow, Overflow, overflow);
|
2017-02-06 09:31:22 -08:00
|
|
|
YG_NODE_STYLE_PROPERTY(YGDisplay, Display, display);
|
2017-02-28 09:17:17 -08:00
|
|
|
YG_NODE_STYLE_PROPERTY(float, Flex, flex);
|
2016-12-03 04:40:18 -08:00
|
|
|
YG_NODE_STYLE_PROPERTY(float, FlexGrow, flexGrow);
|
|
|
|
YG_NODE_STYLE_PROPERTY(float, FlexShrink, flexShrink);
|
2017-02-14 14:26:09 -08:00
|
|
|
YG_NODE_STYLE_PROPERTY_UNIT_AUTO(YGValue, FlexBasis, flexBasis);
|
2016-12-03 04:40:18 -08:00
|
|
|
|
Add feature to use percentage as value unit
Summary:
Adds the feature to use percentage as a value unit.
You can use the function ```YGPx(float)``` and ```YGPercent(float)``` for convenience.
I did some benchmarks:
```
Without Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.146683 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.490101 ms
Huge nested layout: median: 23.000000 ms, stddev: 0.928291 ms
Stack with flex: median: 0.000000 ms, stddev: 0.170587 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.143384 ms
Nested flex: median: 0.000000 ms, stddev: 0.477791 ms
Huge nested layout: median: 22.000000 ms, stddev: 2.129779 ms
With Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.132951 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.489570 ms
Huge nested layout: median: 21.000000 ms, stddev: 1.390476 ms
Closes https://github.com/facebook/yoga/pull/258
Reviewed By: dshahidehpour
Differential Revision: D4361945
Pulled By: emilsjolander
fbshipit-source-id: a8f5bc63ad352eb9410d792729e56664468cd76a
2017-01-02 05:20:37 -08:00
|
|
|
YG_NODE_STYLE_EDGE_PROPERTY_UNIT(YGValue, Position, position);
|
|
|
|
YG_NODE_STYLE_EDGE_PROPERTY_UNIT(YGValue, Margin, margin);
|
2017-02-14 14:26:09 -08:00
|
|
|
YG_NODE_STYLE_EDGE_PROPERTY_UNIT_AUTO(YGValue, Margin);
|
Add feature to use percentage as value unit
Summary:
Adds the feature to use percentage as a value unit.
You can use the function ```YGPx(float)``` and ```YGPercent(float)``` for convenience.
I did some benchmarks:
```
Without Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.146683 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.490101 ms
Huge nested layout: median: 23.000000 ms, stddev: 0.928291 ms
Stack with flex: median: 0.000000 ms, stddev: 0.170587 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.143384 ms
Nested flex: median: 0.000000 ms, stddev: 0.477791 ms
Huge nested layout: median: 22.000000 ms, stddev: 2.129779 ms
With Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.132951 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.489570 ms
Huge nested layout: median: 21.000000 ms, stddev: 1.390476 ms
Closes https://github.com/facebook/yoga/pull/258
Reviewed By: dshahidehpour
Differential Revision: D4361945
Pulled By: emilsjolander
fbshipit-source-id: a8f5bc63ad352eb9410d792729e56664468cd76a
2017-01-02 05:20:37 -08:00
|
|
|
YG_NODE_STYLE_EDGE_PROPERTY_UNIT(YGValue, Padding, padding);
|
2016-12-03 04:40:18 -08:00
|
|
|
YG_NODE_STYLE_EDGE_PROPERTY(float, Border, border);
|
|
|
|
|
2017-02-14 14:26:09 -08:00
|
|
|
YG_NODE_STYLE_PROPERTY_UNIT_AUTO(YGValue, Width, width);
|
|
|
|
YG_NODE_STYLE_PROPERTY_UNIT_AUTO(YGValue, Height, height);
|
Add feature to use percentage as value unit
Summary:
Adds the feature to use percentage as a value unit.
You can use the function ```YGPx(float)``` and ```YGPercent(float)``` for convenience.
I did some benchmarks:
```
Without Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.146683 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.490101 ms
Huge nested layout: median: 23.000000 ms, stddev: 0.928291 ms
Stack with flex: median: 0.000000 ms, stddev: 0.170587 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.143384 ms
Nested flex: median: 0.000000 ms, stddev: 0.477791 ms
Huge nested layout: median: 22.000000 ms, stddev: 2.129779 ms
With Percentage Feature - Release x86:
Stack with flex: median: 0.000000 ms, stddev: 0.132951 ms
Align stretch in undefined axis: median: 0.000000 ms, stddev: 0.136525 ms
Nested flex: median: 0.000000 ms, stddev: 0.489570 ms
Huge nested layout: median: 21.000000 ms, stddev: 1.390476 ms
Closes https://github.com/facebook/yoga/pull/258
Reviewed By: dshahidehpour
Differential Revision: D4361945
Pulled By: emilsjolander
fbshipit-source-id: a8f5bc63ad352eb9410d792729e56664468cd76a
2017-01-02 05:20:37 -08:00
|
|
|
YG_NODE_STYLE_PROPERTY_UNIT(YGValue, MinWidth, minWidth);
|
|
|
|
YG_NODE_STYLE_PROPERTY_UNIT(YGValue, MinHeight, minHeight);
|
|
|
|
YG_NODE_STYLE_PROPERTY_UNIT(YGValue, MaxWidth, maxWidth);
|
|
|
|
YG_NODE_STYLE_PROPERTY_UNIT(YGValue, MaxHeight, maxHeight);
|
2016-12-03 04:40:18 -08:00
|
|
|
|
|
|
|
// Yoga specific properties, not compatible with flexbox specification
|
|
|
|
// Aspect ratio control the size of the undefined dimension of a node.
|
2016-12-22 02:57:15 -08:00
|
|
|
// Aspect ratio is encoded as a floating point value width/height. e.g. A value of 2 leads to a node
|
|
|
|
// with a width twice the size of its height while a value of 0.5 gives the opposite effect.
|
|
|
|
//
|
2016-12-03 04:40:18 -08:00
|
|
|
// - On a node with a set width/height aspect ratio control the size of the unset dimension
|
|
|
|
// - On a node with a set flex basis aspect ratio controls the size of the node in the cross axis if
|
|
|
|
// unset
|
|
|
|
// - On a node with a measure function aspect ratio works as though the measure function measures
|
|
|
|
// the flex basis
|
|
|
|
// - On a node with flex grow/shrink aspect ratio controls the size of the node in the cross axis if
|
|
|
|
// unset
|
|
|
|
// - Aspect ratio takes min/max dimensions into account
|
|
|
|
YG_NODE_STYLE_PROPERTY(float, AspectRatio, aspectRatio);
|
|
|
|
|
|
|
|
YG_NODE_LAYOUT_PROPERTY(float, Left);
|
|
|
|
YG_NODE_LAYOUT_PROPERTY(float, Top);
|
|
|
|
YG_NODE_LAYOUT_PROPERTY(float, Right);
|
|
|
|
YG_NODE_LAYOUT_PROPERTY(float, Bottom);
|
|
|
|
YG_NODE_LAYOUT_PROPERTY(float, Width);
|
|
|
|
YG_NODE_LAYOUT_PROPERTY(float, Height);
|
|
|
|
YG_NODE_LAYOUT_PROPERTY(YGDirection, Direction);
|
2017-06-30 09:19:33 -07:00
|
|
|
YG_NODE_LAYOUT_PROPERTY(bool, HadOverflow);
|
2018-03-14 08:37:55 -07:00
|
|
|
bool YGNodeLayoutGetDidLegacyStretchFlagAffectLayout(const YGNodeRef node);
|
2016-12-03 04:40:18 -08:00
|
|
|
|
2017-01-26 13:36:38 -08:00
|
|
|
// Get the computed values for these nodes after performing layout. If they were set using
|
2017-02-14 14:26:13 -08:00
|
|
|
// point values then the returned value will be the same as YGNodeStyleGetXXX. However if
|
2017-01-26 13:36:38 -08:00
|
|
|
// they were set using a percentage value then the returned value is the computed value used
|
2017-01-05 12:48:07 -08:00
|
|
|
// during layout.
|
2017-01-26 13:36:38 -08:00
|
|
|
YG_NODE_LAYOUT_EDGE_PROPERTY(float, Margin);
|
|
|
|
YG_NODE_LAYOUT_EDGE_PROPERTY(float, Border);
|
|
|
|
YG_NODE_LAYOUT_EDGE_PROPERTY(float, Padding);
|
2017-01-05 12:48:07 -08:00
|
|
|
|
2017-05-03 09:22:35 -07:00
|
|
|
WIN_EXPORT void YGConfigSetLogger(const YGConfigRef config, YGLogger logger);
|
|
|
|
WIN_EXPORT void YGLog(const YGNodeRef node, YGLogLevel level, const char *message, ...);
|
|
|
|
WIN_EXPORT void YGLogWithConfig(const YGConfigRef config, YGLogLevel level, const char *format, ...);
|
|
|
|
WIN_EXPORT void YGAssert(const bool condition, const char *message);
|
|
|
|
WIN_EXPORT void YGAssertWithNode(const YGNodeRef node, const bool condition, const char *message);
|
|
|
|
WIN_EXPORT void YGAssertWithConfig(const YGConfigRef config,
|
|
|
|
const bool condition,
|
|
|
|
const char *message);
|
2017-02-24 09:45:31 -08:00
|
|
|
// Set this to number of pixels in 1 point to round calculation results
|
|
|
|
// If you want to avoid rounding - set PointScaleFactor to 0
|
2017-03-09 07:21:23 -08:00
|
|
|
WIN_EXPORT void YGConfigSetPointScaleFactor(const YGConfigRef config, const float pixelsInPoint);
|
2018-03-14 08:37:55 -07:00
|
|
|
void YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviour(
|
|
|
|
const YGConfigRef config,
|
|
|
|
const bool shouldDiffLayout);
|
2017-02-24 09:45:31 -08:00
|
|
|
|
2017-05-03 09:22:35 -07:00
|
|
|
// Yoga previously had an error where containers would take the maximum space possible instead of
|
|
|
|
// the minimum
|
|
|
|
// like they are supposed to. In practice this resulted in implicit behaviour similar to align-self:
|
|
|
|
// stretch;
|
|
|
|
// Because this was such a long-standing bug we must allow legacy users to switch back to this
|
|
|
|
// behaviour.
|
|
|
|
WIN_EXPORT void YGConfigSetUseLegacyStretchBehaviour(const YGConfigRef config,
|
|
|
|
const bool useLegacyStretchBehaviour);
|
2017-04-28 06:13:51 -07:00
|
|
|
|
2017-03-01 09:19:55 -08:00
|
|
|
// YGConfig
|
|
|
|
WIN_EXPORT YGConfigRef YGConfigNew(void);
|
|
|
|
WIN_EXPORT void YGConfigFree(const YGConfigRef config);
|
2017-04-26 11:49:26 -07:00
|
|
|
WIN_EXPORT void YGConfigCopy(const YGConfigRef dest, const YGConfigRef src);
|
2017-04-10 14:22:23 -07:00
|
|
|
WIN_EXPORT int32_t YGConfigGetInstanceCount(void);
|
2017-03-01 09:19:55 -08:00
|
|
|
|
|
|
|
WIN_EXPORT void YGConfigSetExperimentalFeatureEnabled(const YGConfigRef config,
|
|
|
|
const YGExperimentalFeature feature,
|
|
|
|
const bool enabled);
|
|
|
|
WIN_EXPORT bool YGConfigIsExperimentalFeatureEnabled(const YGConfigRef config,
|
|
|
|
const YGExperimentalFeature feature);
|
2016-12-03 04:40:18 -08:00
|
|
|
|
2017-03-09 07:21:23 -08:00
|
|
|
// Using the web defaults is the prefered configuration for new projects.
|
2017-03-03 10:47:42 -08:00
|
|
|
// Usage of non web defaults should be considered as legacy.
|
|
|
|
WIN_EXPORT void YGConfigSetUseWebDefaults(const YGConfigRef config, const bool enabled);
|
|
|
|
WIN_EXPORT bool YGConfigGetUseWebDefaults(const YGConfigRef config);
|
|
|
|
|
2018-04-01 18:27:04 -07:00
|
|
|
WIN_EXPORT void YGConfigSetCloneNodeFunc(const YGConfigRef config,
|
|
|
|
const YGCloneNodeFunc callback);
|
Persistent Yoga
Summary:
This is meant to show a possible route format for a persistent form of Yoga. Where previous layouts can remain intact while still taking advantage of incremental layout by reusing previous subtrees.
```c
YGNodeRef YGNodeClone(const YGNodeRef node);
```
The core of this functionality is a new API to clone an existing node. This makes a new detached node with all the same values as the previous one. Conceptually this makes the original node "frozen" from that point on. It's now immutable. (This is not yet enforced at runtime in this PR but something we should add.)
Since the original is frozen, we reuse the children set from the original node. Their parent pointers still point back to the original tree though.
The cloned node is still mutable. It can have its styles updated, and nodes can be inserted or deleted. If an insertion/deletion happens on a cloned node whose children were reused, it'll first shallow clone its children automatically.
As a convenience I also added an API to clear all children:
```c
void YGNodeRemoveAllChildren(const YGNodeRef node);
```
During insert/delete, or as a result of layout a set of reused children may need to be first cloned. A kind of copy-on-write. When that happens, the host may want to respond. E.g. by updating the `context` such as by cloning any wrapper objects and attaching them to the new node.
```c
typedef void (*YGNodeClonedFunc)(YGNodeRef oldNode,
YGNodeRef newNode,
YGNodeRef parent,
int childIndex);
void YGConfigSetNodeClonedFunc(YGConfigRef config,
YGNodeClonedFunc callback);
```
This PR doesn't change any existing semantics for trees that are not first cloned.
It's possible for a single node to exist in two trees at once and be used by multiple threads. Therefore it's not safe to recursively free a whole tree when you use persistence. To solve this, any user of the library has to manually manage ref counting or tracing GC. E.g. by replicating the tree structure in a wrapper.
In a follow up we could consider moving ref counting into Yoga.
Closes https://github.com/facebook/yoga/pull/636
Reviewed By: emilsjolander
Differential Revision: D5941921
Pulled By: sebmarkbage
fbshipit-source-id: c8e93421824c112d09c4773bed4e3141b6491ccf
2017-10-17 01:02:04 -07:00
|
|
|
|
2017-05-03 09:22:35 -07:00
|
|
|
// Export only for C#
|
|
|
|
WIN_EXPORT YGConfigRef YGConfigGetDefault(void);
|
|
|
|
|
|
|
|
WIN_EXPORT void YGConfigSetContext(const YGConfigRef config, void *context);
|
|
|
|
WIN_EXPORT void *YGConfigGetContext(const YGConfigRef config);
|
|
|
|
|
2017-12-06 16:25:26 -08:00
|
|
|
WIN_EXPORT float YGRoundValueToPixelGrid(
|
|
|
|
const float value,
|
|
|
|
const float pointScaleFactor,
|
|
|
|
const bool forceCeil,
|
|
|
|
const bool forceFloor);
|
|
|
|
|
2016-12-03 04:40:18 -08:00
|
|
|
YG_EXTERN_C_END
|
2018-03-25 13:56:13 -07:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
|
|
|
#include <functional>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
// Calls f on each node in the tree including the given node argument.
|
|
|
|
extern void YGTraversePreOrder(YGNodeRef const node, std::function<void(YGNodeRef node)>&& f);
|
|
|
|
|
|
|
|
extern void YGNodeSetChildren(YGNodeRef const parent, const std::vector<YGNodeRef> &children);
|
|
|
|
|
|
|
|
#endif
|