iOS: do not dependent yoga, include its source directly
This commit is contained in:
parent
d89b0a7bbb
commit
ef070e0e6f
@ -21,6 +21,4 @@ Doric iOS SDK for cross platform develpment
|
|||||||
}
|
}
|
||||||
|
|
||||||
s.public_header_files = 'doric-iOS/Pod/Classes/**/*.h'
|
s.public_header_files = 'doric-iOS/Pod/Classes/**/*.h'
|
||||||
s.dependency 'YogaKit/Core'
|
|
||||||
s.dependency 'Yoga'
|
|
||||||
end
|
end
|
||||||
|
@ -17,10 +17,9 @@
|
|||||||
// Created by pengfei.zhou on 2020/4/9.
|
// Created by pengfei.zhou on 2020/4/9.
|
||||||
//
|
//
|
||||||
|
|
||||||
#import <YogaKit/UIView+Yoga.h>
|
#import "UIView+Yoga.h"
|
||||||
#import "DoricFlexNode.h"
|
#import "DoricFlexNode.h"
|
||||||
#import "DoricExtensions.h"
|
#import "DoricExtensions.h"
|
||||||
#import <YogaKit/UIView+Yoga.h>
|
|
||||||
#import "DoricUIView.h"
|
#import "DoricUIView.h"
|
||||||
|
|
||||||
@interface DoricFlexView : DoricUIView
|
@interface DoricFlexView : DoricUIView
|
||||||
|
@ -21,9 +21,9 @@
|
|||||||
#import <objc/runtime.h>
|
#import <objc/runtime.h>
|
||||||
#import "UIView+Doric.h"
|
#import "UIView+Doric.h"
|
||||||
#import "DoricExtensions.h"
|
#import "DoricExtensions.h"
|
||||||
#import <YogaKit/UIView+Yoga.h>
|
#import "UIView+Yoga.h"
|
||||||
#import <QuartzCore/QuartzCore.h>
|
#import <QuartzCore/QuartzCore.h>
|
||||||
#import <yoga/Yoga.h>
|
#import "Yoga.h"
|
||||||
|
|
||||||
@interface YGLayout ()
|
@interface YGLayout ()
|
||||||
@property(nonatomic, assign, readonly) YGNodeRef node;
|
@property(nonatomic, assign, readonly) YGNodeRef node;
|
||||||
|
36
doric-iOS/Pod/Classes/Yoga/YogaKit/UIView+Yoga.h
Normal file
36
doric-iOS/Pod/Classes/Yoga/YogaKit/UIView+Yoga.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "YGLayout.h"
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
typedef void (^YGLayoutConfigurationBlock)(YGLayout *layout);
|
||||||
|
|
||||||
|
@interface UIView (Yoga)
|
||||||
|
|
||||||
|
/**
|
||||||
|
The YGLayout that is attached to this view. It is lazily created.
|
||||||
|
*/
|
||||||
|
@property (nonatomic, readonly, strong) YGLayout *yoga;
|
||||||
|
/**
|
||||||
|
Indicates whether or not Yoga is enabled
|
||||||
|
*/
|
||||||
|
@property (nonatomic, readonly, assign) BOOL isYogaEnabled;
|
||||||
|
|
||||||
|
/**
|
||||||
|
In ObjC land, every time you access `view.yoga.*` you are adding another `objc_msgSend`
|
||||||
|
to your code. If you plan on making multiple changes to YGLayout, it's more performant
|
||||||
|
to use this method, which uses a single objc_msgSend call.
|
||||||
|
*/
|
||||||
|
- (void)configureLayoutWithBlock:(YGLayoutConfigurationBlock)block
|
||||||
|
NS_SWIFT_NAME(configureLayout(block:));
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
39
doric-iOS/Pod/Classes/Yoga/YogaKit/UIView+Yoga.m
Normal file
39
doric-iOS/Pod/Classes/Yoga/YogaKit/UIView+Yoga.m
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "UIView+Yoga.h"
|
||||||
|
#import "YGLayout+Private.h"
|
||||||
|
#import <objc/runtime.h>
|
||||||
|
|
||||||
|
static const void *kYGYogaAssociatedKey = &kYGYogaAssociatedKey;
|
||||||
|
|
||||||
|
@implementation UIView (YogaKit)
|
||||||
|
|
||||||
|
- (YGLayout *)yoga
|
||||||
|
{
|
||||||
|
YGLayout *yoga = objc_getAssociatedObject(self, kYGYogaAssociatedKey);
|
||||||
|
if (!yoga) {
|
||||||
|
yoga = [[YGLayout alloc] initWithView:self];
|
||||||
|
objc_setAssociatedObject(self, kYGYogaAssociatedKey, yoga, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return yoga;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)isYogaEnabled
|
||||||
|
{
|
||||||
|
return objc_getAssociatedObject(self, kYGYogaAssociatedKey) != nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)configureLayoutWithBlock:(YGLayoutConfigurationBlock)block
|
||||||
|
{
|
||||||
|
if (block != nil) {
|
||||||
|
block(self.yoga);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
17
doric-iOS/Pod/Classes/Yoga/YogaKit/YGLayout+Private.h
Normal file
17
doric-iOS/Pod/Classes/Yoga/YogaKit/YGLayout+Private.h
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "YGLayout.h"
|
||||||
|
#import "Yoga.h"
|
||||||
|
|
||||||
|
@interface YGLayout ()
|
||||||
|
|
||||||
|
@property (nonatomic, assign, readonly) YGNodeRef node;
|
||||||
|
|
||||||
|
- (instancetype)initWithView:(UIView *)view;
|
||||||
|
|
||||||
|
@end
|
170
doric-iOS/Pod/Classes/Yoga/YogaKit/YGLayout.h
Normal file
170
doric-iOS/Pod/Classes/Yoga/YogaKit/YGLayout.h
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
#import "YGEnums.h"
|
||||||
|
#import "Yoga.h"
|
||||||
|
#import "YGMacros.h"
|
||||||
|
|
||||||
|
YG_EXTERN_C_BEGIN
|
||||||
|
|
||||||
|
extern YGValue YGPointValue(CGFloat value)
|
||||||
|
NS_SWIFT_UNAVAILABLE("Use the swift Int and FloatingPoint extensions instead");
|
||||||
|
extern YGValue YGPercentValue(CGFloat value)
|
||||||
|
NS_SWIFT_UNAVAILABLE("Use the swift Int and FloatingPoint extensions instead");
|
||||||
|
|
||||||
|
YG_EXTERN_C_END
|
||||||
|
|
||||||
|
typedef NS_OPTIONS(NSInteger, YGDimensionFlexibility) {
|
||||||
|
YGDimensionFlexibilityFlexibleWidth = 1 << 0,
|
||||||
|
YGDimensionFlexibilityFlexibleHeight = 1 << 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
@interface YGLayout : NSObject
|
||||||
|
|
||||||
|
/**
|
||||||
|
Make default init unavailable, as it will not initialise YGNode which is
|
||||||
|
required for the setters and getters of YGLayout's properties to work properly.
|
||||||
|
*/
|
||||||
|
- (instancetype)init
|
||||||
|
__attribute__((unavailable("you are not meant to initialise YGLayout")));
|
||||||
|
|
||||||
|
/**
|
||||||
|
Make default init unavailable, as it will not initialise YGNode which is
|
||||||
|
required for the setters and getters of YGLayout's properties to work properly.
|
||||||
|
*/
|
||||||
|
+ (instancetype)new
|
||||||
|
__attribute__((unavailable("you are not meant to initialise YGLayout")));
|
||||||
|
|
||||||
|
/**
|
||||||
|
The property that decides if we should include this view when calculating
|
||||||
|
layout. Defaults to YES.
|
||||||
|
*/
|
||||||
|
@property (nonatomic, readwrite, assign, setter=setIncludedInLayout:) BOOL isIncludedInLayout;
|
||||||
|
|
||||||
|
/**
|
||||||
|
The property that decides during layout/sizing whether or not styling properties should be applied.
|
||||||
|
Defaults to NO.
|
||||||
|
*/
|
||||||
|
@property (nonatomic, readwrite, assign, setter=setEnabled:) BOOL isEnabled;
|
||||||
|
|
||||||
|
@property (nonatomic, readwrite, assign) YGDirection direction;
|
||||||
|
@property (nonatomic, readwrite, assign) YGFlexDirection flexDirection;
|
||||||
|
@property (nonatomic, readwrite, assign) YGJustify justifyContent;
|
||||||
|
@property (nonatomic, readwrite, assign) YGAlign alignContent;
|
||||||
|
@property (nonatomic, readwrite, assign) YGAlign alignItems;
|
||||||
|
@property (nonatomic, readwrite, assign) YGAlign alignSelf;
|
||||||
|
@property (nonatomic, readwrite, assign) YGPositionType position;
|
||||||
|
@property (nonatomic, readwrite, assign) YGWrap flexWrap;
|
||||||
|
@property (nonatomic, readwrite, assign) YGOverflow overflow;
|
||||||
|
@property (nonatomic, readwrite, assign) YGDisplay display;
|
||||||
|
|
||||||
|
@property (nonatomic, readwrite, assign) CGFloat flex;
|
||||||
|
@property (nonatomic, readwrite, assign) CGFloat flexGrow;
|
||||||
|
@property (nonatomic, readwrite, assign) CGFloat flexShrink;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue flexBasis;
|
||||||
|
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue left;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue top;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue right;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue bottom;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue start;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue end;
|
||||||
|
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue marginLeft;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue marginTop;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue marginRight;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue marginBottom;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue marginStart;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue marginEnd;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue marginHorizontal;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue marginVertical;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue margin;
|
||||||
|
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue paddingLeft;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue paddingTop;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue paddingRight;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue paddingBottom;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue paddingStart;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue paddingEnd;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue paddingHorizontal;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue paddingVertical;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue padding;
|
||||||
|
|
||||||
|
@property (nonatomic, readwrite, assign) CGFloat borderLeftWidth;
|
||||||
|
@property (nonatomic, readwrite, assign) CGFloat borderTopWidth;
|
||||||
|
@property (nonatomic, readwrite, assign) CGFloat borderRightWidth;
|
||||||
|
@property (nonatomic, readwrite, assign) CGFloat borderBottomWidth;
|
||||||
|
@property (nonatomic, readwrite, assign) CGFloat borderStartWidth;
|
||||||
|
@property (nonatomic, readwrite, assign) CGFloat borderEndWidth;
|
||||||
|
@property (nonatomic, readwrite, assign) CGFloat borderWidth;
|
||||||
|
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue width;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue height;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue minWidth;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue minHeight;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue maxWidth;
|
||||||
|
@property (nonatomic, readwrite, assign) YGValue maxHeight;
|
||||||
|
|
||||||
|
// Yoga specific properties, not compatible with flexbox specification
|
||||||
|
@property (nonatomic, readwrite, assign) CGFloat aspectRatio;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Get the resolved direction of this node. This won't be YGDirectionInherit
|
||||||
|
*/
|
||||||
|
@property (nonatomic, readonly, assign) YGDirection resolvedDirection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Perform a layout calculation and update the frames of the views in the hierarchy with the results.
|
||||||
|
If the origin is not preserved, the root view's layout results will applied from {0,0}.
|
||||||
|
*/
|
||||||
|
- (void)applyLayoutPreservingOrigin:(BOOL)preserveOrigin
|
||||||
|
NS_SWIFT_NAME(applyLayout(preservingOrigin:));
|
||||||
|
|
||||||
|
/**
|
||||||
|
Perform a layout calculation and update the frames of the views in the hierarchy with the results.
|
||||||
|
If the origin is not preserved, the root view's layout results will applied from {0,0}.
|
||||||
|
*/
|
||||||
|
- (void)applyLayoutPreservingOrigin:(BOOL)preserveOrigin
|
||||||
|
dimensionFlexibility:(YGDimensionFlexibility)dimensionFlexibility
|
||||||
|
NS_SWIFT_NAME(applyLayout(preservingOrigin:dimensionFlexibility:));
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns the size of the view if no constraints were given. This could equivalent to calling [self
|
||||||
|
sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)];
|
||||||
|
*/
|
||||||
|
@property (nonatomic, readonly, assign) CGSize intrinsicSize;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns the size of the view based on provided constraints. Pass NaN for an unconstrained dimension.
|
||||||
|
*/
|
||||||
|
- (CGSize)calculateLayoutWithSize:(CGSize)size
|
||||||
|
NS_SWIFT_NAME(calculateLayout(with:));
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns the number of children that are using Flexbox.
|
||||||
|
*/
|
||||||
|
@property (nonatomic, readonly, assign) NSUInteger numberOfChildren;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Return a BOOL indiciating whether or not we this node contains any subviews that are included in
|
||||||
|
Yoga's layout.
|
||||||
|
*/
|
||||||
|
@property (nonatomic, readonly, assign) BOOL isLeaf;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Return's a BOOL indicating if a view is dirty. When a node is dirty
|
||||||
|
it usually indicates that it will be remeasured on the next layout pass.
|
||||||
|
*/
|
||||||
|
@property (nonatomic, readonly, assign) BOOL isDirty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Mark that a view's layout needs to be recalculated. Only works for leaf views.
|
||||||
|
*/
|
||||||
|
- (void)markDirty;
|
||||||
|
|
||||||
|
@end
|
482
doric-iOS/Pod/Classes/Yoga/YogaKit/YGLayout.m
Normal file
482
doric-iOS/Pod/Classes/Yoga/YogaKit/YGLayout.m
Normal file
@ -0,0 +1,482 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "YGLayout+Private.h"
|
||||||
|
#import "UIView+Yoga.h"
|
||||||
|
|
||||||
|
#define YG_PROPERTY(type, lowercased_name, capitalized_name) \
|
||||||
|
- (type)lowercased_name \
|
||||||
|
{ \
|
||||||
|
return YGNodeStyleGet##capitalized_name(self.node); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
- (void)set##capitalized_name:(type)lowercased_name \
|
||||||
|
{ \
|
||||||
|
YGNodeStyleSet##capitalized_name(self.node, lowercased_name); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define YG_VALUE_PROPERTY(lowercased_name, capitalized_name) \
|
||||||
|
- (YGValue)lowercased_name \
|
||||||
|
{ \
|
||||||
|
return YGNodeStyleGet##capitalized_name(self.node); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
- (void)set##capitalized_name:(YGValue)lowercased_name \
|
||||||
|
{ \
|
||||||
|
switch (lowercased_name.unit) { \
|
||||||
|
case YGUnitUndefined: \
|
||||||
|
YGNodeStyleSet##capitalized_name(self.node, lowercased_name.value); \
|
||||||
|
break; \
|
||||||
|
case YGUnitPoint: \
|
||||||
|
YGNodeStyleSet##capitalized_name(self.node, lowercased_name.value); \
|
||||||
|
break; \
|
||||||
|
case YGUnitPercent: \
|
||||||
|
YGNodeStyleSet##capitalized_name##Percent(self.node, lowercased_name.value); \
|
||||||
|
break; \
|
||||||
|
default: \
|
||||||
|
NSAssert(NO, @"Not implemented"); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define YG_AUTO_VALUE_PROPERTY(lowercased_name, capitalized_name) \
|
||||||
|
- (YGValue)lowercased_name \
|
||||||
|
{ \
|
||||||
|
return YGNodeStyleGet##capitalized_name(self.node); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
- (void)set##capitalized_name:(YGValue)lowercased_name \
|
||||||
|
{ \
|
||||||
|
switch (lowercased_name.unit) { \
|
||||||
|
case YGUnitPoint: \
|
||||||
|
YGNodeStyleSet##capitalized_name(self.node, lowercased_name.value); \
|
||||||
|
break; \
|
||||||
|
case YGUnitPercent: \
|
||||||
|
YGNodeStyleSet##capitalized_name##Percent(self.node, lowercased_name.value); \
|
||||||
|
break; \
|
||||||
|
case YGUnitAuto: \
|
||||||
|
YGNodeStyleSet##capitalized_name##Auto(self.node); \
|
||||||
|
break; \
|
||||||
|
default: \
|
||||||
|
NSAssert(NO, @"Not implemented"); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define YG_EDGE_PROPERTY_GETTER(type, lowercased_name, capitalized_name, property, edge) \
|
||||||
|
- (type)lowercased_name \
|
||||||
|
{ \
|
||||||
|
return YGNodeStyleGet##property(self.node, edge); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define YG_EDGE_PROPERTY_SETTER(lowercased_name, capitalized_name, property, edge) \
|
||||||
|
- (void)set##capitalized_name:(CGFloat)lowercased_name \
|
||||||
|
{ \
|
||||||
|
YGNodeStyleSet##property(self.node, edge, lowercased_name); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define YG_EDGE_PROPERTY(lowercased_name, capitalized_name, property, edge) \
|
||||||
|
YG_EDGE_PROPERTY_GETTER(CGFloat, lowercased_name, capitalized_name, property, edge) \
|
||||||
|
YG_EDGE_PROPERTY_SETTER(lowercased_name, capitalized_name, property, edge)
|
||||||
|
|
||||||
|
#define YG_VALUE_EDGE_PROPERTY_SETTER(objc_lowercased_name, objc_capitalized_name, c_name, edge) \
|
||||||
|
- (void)set##objc_capitalized_name:(YGValue)objc_lowercased_name \
|
||||||
|
{ \
|
||||||
|
switch (objc_lowercased_name.unit) { \
|
||||||
|
case YGUnitUndefined: \
|
||||||
|
YGNodeStyleSet##c_name(self.node, edge, objc_lowercased_name.value); \
|
||||||
|
break; \
|
||||||
|
case YGUnitPoint: \
|
||||||
|
YGNodeStyleSet##c_name(self.node, edge, objc_lowercased_name.value); \
|
||||||
|
break; \
|
||||||
|
case YGUnitPercent: \
|
||||||
|
YGNodeStyleSet##c_name##Percent(self.node, edge, objc_lowercased_name.value); \
|
||||||
|
break; \
|
||||||
|
default: \
|
||||||
|
NSAssert(NO, @"Not implemented"); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define YG_VALUE_EDGE_PROPERTY(lowercased_name, capitalized_name, property, edge) \
|
||||||
|
YG_EDGE_PROPERTY_GETTER(YGValue, lowercased_name, capitalized_name, property, edge) \
|
||||||
|
YG_VALUE_EDGE_PROPERTY_SETTER(lowercased_name, capitalized_name, property, edge)
|
||||||
|
|
||||||
|
#define YG_VALUE_EDGES_PROPERTIES(lowercased_name, capitalized_name) \
|
||||||
|
YG_VALUE_EDGE_PROPERTY(lowercased_name##Left, capitalized_name##Left, capitalized_name, YGEdgeLeft) \
|
||||||
|
YG_VALUE_EDGE_PROPERTY(lowercased_name##Top, capitalized_name##Top, capitalized_name, YGEdgeTop) \
|
||||||
|
YG_VALUE_EDGE_PROPERTY(lowercased_name##Right, capitalized_name##Right, capitalized_name, YGEdgeRight) \
|
||||||
|
YG_VALUE_EDGE_PROPERTY(lowercased_name##Bottom, capitalized_name##Bottom, capitalized_name, YGEdgeBottom) \
|
||||||
|
YG_VALUE_EDGE_PROPERTY(lowercased_name##Start, capitalized_name##Start, capitalized_name, YGEdgeStart) \
|
||||||
|
YG_VALUE_EDGE_PROPERTY(lowercased_name##End, capitalized_name##End, capitalized_name, YGEdgeEnd) \
|
||||||
|
YG_VALUE_EDGE_PROPERTY(lowercased_name##Horizontal, capitalized_name##Horizontal, capitalized_name, YGEdgeHorizontal) \
|
||||||
|
YG_VALUE_EDGE_PROPERTY(lowercased_name##Vertical, capitalized_name##Vertical, capitalized_name, YGEdgeVertical) \
|
||||||
|
YG_VALUE_EDGE_PROPERTY(lowercased_name, capitalized_name, capitalized_name, YGEdgeAll)
|
||||||
|
|
||||||
|
YGValue YGPointValue(CGFloat value)
|
||||||
|
{
|
||||||
|
return (YGValue) { .value = value, .unit = YGUnitPoint };
|
||||||
|
}
|
||||||
|
|
||||||
|
YGValue YGPercentValue(CGFloat value)
|
||||||
|
{
|
||||||
|
return (YGValue) { .value = value, .unit = YGUnitPercent };
|
||||||
|
}
|
||||||
|
|
||||||
|
static YGConfigRef globalConfig;
|
||||||
|
|
||||||
|
@interface YGLayout ()
|
||||||
|
|
||||||
|
@property (nonatomic, weak, readonly) UIView *view;
|
||||||
|
@property(nonatomic, assign, readonly) BOOL isUIView;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation YGLayout
|
||||||
|
|
||||||
|
@synthesize isEnabled=_isEnabled;
|
||||||
|
@synthesize isIncludedInLayout=_isIncludedInLayout;
|
||||||
|
@synthesize node=_node;
|
||||||
|
|
||||||
|
+ (void)initialize
|
||||||
|
{
|
||||||
|
globalConfig = YGConfigNew();
|
||||||
|
YGConfigSetExperimentalFeatureEnabled(globalConfig, YGExperimentalFeatureWebFlexBasis, true);
|
||||||
|
YGConfigSetPointScaleFactor(globalConfig, [UIScreen mainScreen].scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)initWithView:(UIView*)view
|
||||||
|
{
|
||||||
|
if (self = [super init]) {
|
||||||
|
_view = view;
|
||||||
|
_node = YGNodeNewWithConfig(globalConfig);
|
||||||
|
YGNodeSetContext(_node, (__bridge void *) view);
|
||||||
|
_isEnabled = NO;
|
||||||
|
_isIncludedInLayout = YES;
|
||||||
|
_isUIView = [view isMemberOfClass:[UIView class]];
|
||||||
|
}
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)dealloc
|
||||||
|
{
|
||||||
|
YGNodeFree(self.node);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)isDirty
|
||||||
|
{
|
||||||
|
return YGNodeIsDirty(self.node);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)markDirty
|
||||||
|
{
|
||||||
|
if (self.isDirty || !self.isLeaf) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Yoga is not happy if we try to mark a node as "dirty" before we have set
|
||||||
|
// the measure function. Since we already know that this is a leaf,
|
||||||
|
// this *should* be fine. Forgive me Hack Gods.
|
||||||
|
const YGNodeRef node = self.node;
|
||||||
|
if (!YGNodeHasMeasureFunc(node)) {
|
||||||
|
YGNodeSetMeasureFunc(node, YGMeasureView);
|
||||||
|
}
|
||||||
|
|
||||||
|
YGNodeMarkDirty(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSUInteger)numberOfChildren
|
||||||
|
{
|
||||||
|
return YGNodeGetChildCount(self.node);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)isLeaf
|
||||||
|
{
|
||||||
|
NSAssert([NSThread isMainThread], @"This method must be called on the main thread.");
|
||||||
|
if (self.isEnabled) {
|
||||||
|
for (UIView *subview in self.view.subviews) {
|
||||||
|
YGLayout *const yoga = subview.yoga;
|
||||||
|
if (yoga.isEnabled && yoga.isIncludedInLayout) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Style
|
||||||
|
|
||||||
|
- (YGPositionType)position
|
||||||
|
{
|
||||||
|
return YGNodeStyleGetPositionType(self.node);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setPosition:(YGPositionType)position
|
||||||
|
{
|
||||||
|
YGNodeStyleSetPositionType(self.node, position);
|
||||||
|
}
|
||||||
|
|
||||||
|
YG_PROPERTY(YGDirection, direction, Direction)
|
||||||
|
YG_PROPERTY(YGFlexDirection, flexDirection, FlexDirection)
|
||||||
|
YG_PROPERTY(YGJustify, justifyContent, JustifyContent)
|
||||||
|
YG_PROPERTY(YGAlign, alignContent, AlignContent)
|
||||||
|
YG_PROPERTY(YGAlign, alignItems, AlignItems)
|
||||||
|
YG_PROPERTY(YGAlign, alignSelf, AlignSelf)
|
||||||
|
YG_PROPERTY(YGWrap, flexWrap, FlexWrap)
|
||||||
|
YG_PROPERTY(YGOverflow, overflow, Overflow)
|
||||||
|
YG_PROPERTY(YGDisplay, display, Display)
|
||||||
|
|
||||||
|
YG_PROPERTY(CGFloat, flex, Flex)
|
||||||
|
YG_PROPERTY(CGFloat, flexGrow, FlexGrow)
|
||||||
|
YG_PROPERTY(CGFloat, flexShrink, FlexShrink)
|
||||||
|
YG_AUTO_VALUE_PROPERTY(flexBasis, FlexBasis)
|
||||||
|
|
||||||
|
YG_VALUE_EDGE_PROPERTY(left, Left, Position, YGEdgeLeft)
|
||||||
|
YG_VALUE_EDGE_PROPERTY(top, Top, Position, YGEdgeTop)
|
||||||
|
YG_VALUE_EDGE_PROPERTY(right, Right, Position, YGEdgeRight)
|
||||||
|
YG_VALUE_EDGE_PROPERTY(bottom, Bottom, Position, YGEdgeBottom)
|
||||||
|
YG_VALUE_EDGE_PROPERTY(start, Start, Position, YGEdgeStart)
|
||||||
|
YG_VALUE_EDGE_PROPERTY(end, End, Position, YGEdgeEnd)
|
||||||
|
YG_VALUE_EDGES_PROPERTIES(margin, Margin)
|
||||||
|
YG_VALUE_EDGES_PROPERTIES(padding, Padding)
|
||||||
|
|
||||||
|
YG_EDGE_PROPERTY(borderLeftWidth, BorderLeftWidth, Border, YGEdgeLeft)
|
||||||
|
YG_EDGE_PROPERTY(borderTopWidth, BorderTopWidth, Border, YGEdgeTop)
|
||||||
|
YG_EDGE_PROPERTY(borderRightWidth, BorderRightWidth, Border, YGEdgeRight)
|
||||||
|
YG_EDGE_PROPERTY(borderBottomWidth, BorderBottomWidth, Border, YGEdgeBottom)
|
||||||
|
YG_EDGE_PROPERTY(borderStartWidth, BorderStartWidth, Border, YGEdgeStart)
|
||||||
|
YG_EDGE_PROPERTY(borderEndWidth, BorderEndWidth, Border, YGEdgeEnd)
|
||||||
|
YG_EDGE_PROPERTY(borderWidth, BorderWidth, Border, YGEdgeAll)
|
||||||
|
|
||||||
|
YG_AUTO_VALUE_PROPERTY(width, Width)
|
||||||
|
YG_AUTO_VALUE_PROPERTY(height, Height)
|
||||||
|
YG_VALUE_PROPERTY(minWidth, MinWidth)
|
||||||
|
YG_VALUE_PROPERTY(minHeight, MinHeight)
|
||||||
|
YG_VALUE_PROPERTY(maxWidth, MaxWidth)
|
||||||
|
YG_VALUE_PROPERTY(maxHeight, MaxHeight)
|
||||||
|
YG_PROPERTY(CGFloat, aspectRatio, AspectRatio)
|
||||||
|
|
||||||
|
#pragma mark - Layout and Sizing
|
||||||
|
|
||||||
|
- (YGDirection)resolvedDirection
|
||||||
|
{
|
||||||
|
return YGNodeLayoutGetDirection(self.node);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)applyLayout
|
||||||
|
{
|
||||||
|
[self calculateLayoutWithSize:self.view.bounds.size];
|
||||||
|
YGApplyLayoutToViewHierarchy(self.view, NO);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)applyLayoutPreservingOrigin:(BOOL)preserveOrigin
|
||||||
|
{
|
||||||
|
[self calculateLayoutWithSize:self.view.bounds.size];
|
||||||
|
YGApplyLayoutToViewHierarchy(self.view, preserveOrigin);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)applyLayoutPreservingOrigin:(BOOL)preserveOrigin dimensionFlexibility:(YGDimensionFlexibility)dimensionFlexibility
|
||||||
|
{
|
||||||
|
CGSize size = self.view.bounds.size;
|
||||||
|
if (dimensionFlexibility & YGDimensionFlexibilityFlexibleWidth) {
|
||||||
|
size.width = YGUndefined;
|
||||||
|
}
|
||||||
|
if (dimensionFlexibility & YGDimensionFlexibilityFlexibleHeight) {
|
||||||
|
size.height = YGUndefined;
|
||||||
|
}
|
||||||
|
[self calculateLayoutWithSize:size];
|
||||||
|
YGApplyLayoutToViewHierarchy(self.view, preserveOrigin);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (CGSize)intrinsicSize
|
||||||
|
{
|
||||||
|
const CGSize constrainedSize = {
|
||||||
|
.width = YGUndefined,
|
||||||
|
.height = YGUndefined,
|
||||||
|
};
|
||||||
|
return [self calculateLayoutWithSize:constrainedSize];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (CGSize)calculateLayoutWithSize:(CGSize)size
|
||||||
|
{
|
||||||
|
NSAssert([NSThread isMainThread], @"Yoga calculation must be done on main.");
|
||||||
|
NSAssert(self.isEnabled, @"Yoga is not enabled for this view.");
|
||||||
|
|
||||||
|
YGAttachNodesFromViewHierachy(self.view);
|
||||||
|
|
||||||
|
const YGNodeRef node = self.node;
|
||||||
|
YGNodeCalculateLayout(
|
||||||
|
node,
|
||||||
|
size.width,
|
||||||
|
size.height,
|
||||||
|
YGNodeStyleGetDirection(node));
|
||||||
|
|
||||||
|
return (CGSize) {
|
||||||
|
.width = YGNodeLayoutGetWidth(node),
|
||||||
|
.height = YGNodeLayoutGetHeight(node),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Private
|
||||||
|
|
||||||
|
static YGSize YGMeasureView(
|
||||||
|
YGNodeRef node,
|
||||||
|
float width,
|
||||||
|
YGMeasureMode widthMode,
|
||||||
|
float height,
|
||||||
|
YGMeasureMode heightMode)
|
||||||
|
{
|
||||||
|
const CGFloat constrainedWidth = (widthMode == YGMeasureModeUndefined) ? CGFLOAT_MAX : width;
|
||||||
|
const CGFloat constrainedHeight = (heightMode == YGMeasureModeUndefined) ? CGFLOAT_MAX: height;
|
||||||
|
|
||||||
|
UIView *view = (__bridge UIView*) YGNodeGetContext(node);
|
||||||
|
CGSize sizeThatFits = CGSizeZero;
|
||||||
|
|
||||||
|
// The default implementation of sizeThatFits: returns the existing size of
|
||||||
|
// the view. That means that if we want to layout an empty UIView, which
|
||||||
|
// already has got a frame set, its measured size should be CGSizeZero, but
|
||||||
|
// UIKit returns the existing size.
|
||||||
|
//
|
||||||
|
// See https://github.com/facebook/yoga/issues/606 for more information.
|
||||||
|
if (!view.yoga.isUIView || [view.subviews count] > 0) {
|
||||||
|
sizeThatFits = [view sizeThatFits:(CGSize){
|
||||||
|
.width = constrainedWidth,
|
||||||
|
.height = constrainedHeight,
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
return (YGSize) {
|
||||||
|
.width = YGSanitizeMeasurement(constrainedWidth, sizeThatFits.width, widthMode),
|
||||||
|
.height = YGSanitizeMeasurement(constrainedHeight, sizeThatFits.height, heightMode),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static CGFloat YGSanitizeMeasurement(
|
||||||
|
CGFloat constrainedSize,
|
||||||
|
CGFloat measuredSize,
|
||||||
|
YGMeasureMode measureMode)
|
||||||
|
{
|
||||||
|
CGFloat result;
|
||||||
|
if (measureMode == YGMeasureModeExactly) {
|
||||||
|
result = constrainedSize;
|
||||||
|
} else if (measureMode == YGMeasureModeAtMost) {
|
||||||
|
result = MIN(constrainedSize, measuredSize);
|
||||||
|
} else {
|
||||||
|
result = measuredSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL YGNodeHasExactSameChildren(const YGNodeRef node, NSArray<UIView *> *subviews)
|
||||||
|
{
|
||||||
|
if (YGNodeGetChildCount(node) != subviews.count) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i=0; i<subviews.count; i++) {
|
||||||
|
if (YGNodeGetChild(node, i) != subviews[i].yoga.node) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void YGAttachNodesFromViewHierachy(UIView *const view)
|
||||||
|
{
|
||||||
|
YGLayout *const yoga = view.yoga;
|
||||||
|
const YGNodeRef node = yoga.node;
|
||||||
|
|
||||||
|
// Only leaf nodes should have a measure function
|
||||||
|
if (yoga.isLeaf) {
|
||||||
|
YGRemoveAllChildren(node);
|
||||||
|
YGNodeSetMeasureFunc(node, YGMeasureView);
|
||||||
|
} else {
|
||||||
|
YGNodeSetMeasureFunc(node, NULL);
|
||||||
|
|
||||||
|
NSMutableArray<UIView *> *subviewsToInclude = [[NSMutableArray alloc] initWithCapacity:view.subviews.count];
|
||||||
|
for (UIView *subview in view.subviews) {
|
||||||
|
if (subview.yoga.isEnabled && subview.yoga.isIncludedInLayout) {
|
||||||
|
[subviewsToInclude addObject:subview];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!YGNodeHasExactSameChildren(node, subviewsToInclude)) {
|
||||||
|
YGRemoveAllChildren(node);
|
||||||
|
for (int i=0; i<subviewsToInclude.count; i++) {
|
||||||
|
YGNodeInsertChild(node, subviewsToInclude[i].yoga.node, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (UIView *const subview in subviewsToInclude) {
|
||||||
|
YGAttachNodesFromViewHierachy(subview);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void YGRemoveAllChildren(const YGNodeRef node)
|
||||||
|
{
|
||||||
|
if (node == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
YGNodeRemoveAllChildren(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
static CGFloat YGRoundPixelValue(CGFloat value)
|
||||||
|
{
|
||||||
|
static CGFloat scale;
|
||||||
|
static dispatch_once_t onceToken;
|
||||||
|
dispatch_once(&onceToken, ^(){
|
||||||
|
scale = [UIScreen mainScreen].scale;
|
||||||
|
});
|
||||||
|
|
||||||
|
return roundf(value * scale) / scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void YGApplyLayoutToViewHierarchy(UIView *view, BOOL preserveOrigin)
|
||||||
|
{
|
||||||
|
NSCAssert([NSThread isMainThread], @"Framesetting should only be done on the main thread.");
|
||||||
|
|
||||||
|
const YGLayout *yoga = view.yoga;
|
||||||
|
|
||||||
|
if (!yoga.isIncludedInLayout) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
YGNodeRef node = yoga.node;
|
||||||
|
const CGPoint topLeft = {
|
||||||
|
YGNodeLayoutGetLeft(node),
|
||||||
|
YGNodeLayoutGetTop(node),
|
||||||
|
};
|
||||||
|
|
||||||
|
const CGPoint bottomRight = {
|
||||||
|
topLeft.x + YGNodeLayoutGetWidth(node),
|
||||||
|
topLeft.y + YGNodeLayoutGetHeight(node),
|
||||||
|
};
|
||||||
|
|
||||||
|
const CGPoint origin = preserveOrigin ? view.frame.origin : CGPointZero;
|
||||||
|
view.frame = (CGRect) {
|
||||||
|
.origin = {
|
||||||
|
.x = YGRoundPixelValue(topLeft.x + origin.x),
|
||||||
|
.y = YGRoundPixelValue(topLeft.y + origin.y),
|
||||||
|
},
|
||||||
|
.size = {
|
||||||
|
.width = YGRoundPixelValue(bottomRight.x) - YGRoundPixelValue(topLeft.x),
|
||||||
|
.height = YGRoundPixelValue(bottomRight.y) - YGRoundPixelValue(topLeft.y),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!yoga.isLeaf) {
|
||||||
|
for (NSUInteger i=0; i<view.subviews.count; i++) {
|
||||||
|
YGApplyLayoutToViewHierarchy(view.subviews[i], NO);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
187
doric-iOS/Pod/Classes/Yoga/yoga/CompactValue.h
Normal file
187
doric-iOS/Pod/Classes/Yoga/yoga/CompactValue.h
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "YGValue.h"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
static_assert(
|
||||||
|
std::numeric_limits<float>::is_iec559,
|
||||||
|
"facebook::yoga::detail::CompactValue only works with IEEE754 floats");
|
||||||
|
|
||||||
|
#ifdef YOGA_COMPACT_VALUE_TEST
|
||||||
|
#define VISIBLE_FOR_TESTING public:
|
||||||
|
#else
|
||||||
|
#define VISIBLE_FOR_TESTING private:
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace facebook {
|
||||||
|
namespace yoga {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
// This class stores YGValue in 32 bits.
|
||||||
|
// - The value does not matter for Undefined and Auto. NaNs are used for their
|
||||||
|
// representation.
|
||||||
|
// - To differentiate between Point and Percent, one exponent bit is used.
|
||||||
|
// Supported the range [0x40, 0xbf] (0xbf is inclusive for point, but
|
||||||
|
// exclusive for percent).
|
||||||
|
// - Value ranges:
|
||||||
|
// points: 1.08420217e-19f to 36893485948395847680
|
||||||
|
// 0x00000000 0x3fffffff
|
||||||
|
// percent: 1.08420217e-19f to 18446742974197923840
|
||||||
|
// 0x40000000 0x7f7fffff
|
||||||
|
// - Zero is supported, negative zero is not
|
||||||
|
// - values outside of the representable range are clamped
|
||||||
|
class CompactValue {
|
||||||
|
friend constexpr bool operator==(CompactValue, CompactValue) noexcept;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static constexpr auto LOWER_BOUND = 1.08420217e-19f;
|
||||||
|
static constexpr auto UPPER_BOUND_POINT = 36893485948395847680.0f;
|
||||||
|
static constexpr auto UPPER_BOUND_PERCENT = 18446742974197923840.0f;
|
||||||
|
|
||||||
|
template <YGUnit Unit>
|
||||||
|
static CompactValue of(float value) noexcept {
|
||||||
|
if (value == 0.0f || (value < LOWER_BOUND && value > -LOWER_BOUND)) {
|
||||||
|
constexpr auto zero =
|
||||||
|
Unit == YGUnitPercent ? ZERO_BITS_PERCENT : ZERO_BITS_POINT;
|
||||||
|
return {Payload{zero}};
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr auto upperBound =
|
||||||
|
Unit == YGUnitPercent ? UPPER_BOUND_PERCENT : UPPER_BOUND_POINT;
|
||||||
|
if (value > upperBound || value < -upperBound) {
|
||||||
|
value = copysignf(upperBound, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t unitBit = Unit == YGUnitPercent ? PERCENT_BIT : 0;
|
||||||
|
auto data = Payload{value};
|
||||||
|
data.repr -= BIAS;
|
||||||
|
data.repr |= unitBit;
|
||||||
|
return {data};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <YGUnit Unit>
|
||||||
|
static CompactValue ofMaybe(float value) noexcept {
|
||||||
|
return std::isnan(value) || std::isinf(value) ? ofUndefined()
|
||||||
|
: of<Unit>(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr CompactValue ofZero() noexcept {
|
||||||
|
return CompactValue{Payload{ZERO_BITS_POINT}};
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr CompactValue ofUndefined() noexcept {
|
||||||
|
return CompactValue{};
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr CompactValue ofAuto() noexcept {
|
||||||
|
return CompactValue{Payload{AUTO_BITS}};
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr CompactValue() noexcept
|
||||||
|
: payload_(std::numeric_limits<float>::quiet_NaN()) {}
|
||||||
|
|
||||||
|
CompactValue(const YGValue& x) noexcept : payload_(uint32_t{0}) {
|
||||||
|
switch (x.unit) {
|
||||||
|
case YGUnitUndefined:
|
||||||
|
*this = ofUndefined();
|
||||||
|
break;
|
||||||
|
case YGUnitAuto:
|
||||||
|
*this = ofAuto();
|
||||||
|
break;
|
||||||
|
case YGUnitPoint:
|
||||||
|
*this = of<YGUnitPoint>(x.value);
|
||||||
|
break;
|
||||||
|
case YGUnitPercent:
|
||||||
|
*this = of<YGUnitPercent>(x.value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
operator YGValue() const noexcept {
|
||||||
|
switch (payload_.repr) {
|
||||||
|
case AUTO_BITS:
|
||||||
|
return YGValueAuto;
|
||||||
|
case ZERO_BITS_POINT:
|
||||||
|
return YGValue{0.0f, YGUnitPoint};
|
||||||
|
case ZERO_BITS_PERCENT:
|
||||||
|
return YGValue{0.0f, YGUnitPercent};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (std::isnan(payload_.value)) {
|
||||||
|
return YGValueUndefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto data = payload_;
|
||||||
|
data.repr &= ~PERCENT_BIT;
|
||||||
|
data.repr += BIAS;
|
||||||
|
|
||||||
|
return YGValue{data.value,
|
||||||
|
payload_.repr & 0x40000000 ? YGUnitPercent : YGUnitPoint};
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isUndefined() const noexcept {
|
||||||
|
return (
|
||||||
|
payload_.repr != AUTO_BITS && payload_.repr != ZERO_BITS_POINT &&
|
||||||
|
payload_.repr != ZERO_BITS_PERCENT && std::isnan(payload_.value));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isAuto() const noexcept {
|
||||||
|
return payload_.repr == AUTO_BITS;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
union Payload {
|
||||||
|
float value;
|
||||||
|
uint32_t repr;
|
||||||
|
Payload() = delete;
|
||||||
|
constexpr Payload(uint32_t r) : repr(r) {}
|
||||||
|
constexpr Payload(float v) : value(v) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
static constexpr uint32_t BIAS = 0x20000000;
|
||||||
|
static constexpr uint32_t PERCENT_BIT = 0x40000000;
|
||||||
|
|
||||||
|
// these are signaling NaNs with specific bit pattern as payload they will be
|
||||||
|
// silenced whenever going through an FPU operation on ARM + x86
|
||||||
|
static constexpr uint32_t AUTO_BITS = 0x7faaaaaa;
|
||||||
|
static constexpr uint32_t ZERO_BITS_POINT = 0x7f8f0f0f;
|
||||||
|
static constexpr uint32_t ZERO_BITS_PERCENT = 0x7f80f0f0;
|
||||||
|
|
||||||
|
constexpr CompactValue(Payload data) noexcept : payload_(data) {}
|
||||||
|
|
||||||
|
Payload payload_;
|
||||||
|
|
||||||
|
VISIBLE_FOR_TESTING uint32_t repr() {
|
||||||
|
return payload_.repr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
CompactValue CompactValue::of<YGUnitUndefined>(float) noexcept = delete;
|
||||||
|
template <>
|
||||||
|
CompactValue CompactValue::of<YGUnitAuto>(float) noexcept = delete;
|
||||||
|
template <>
|
||||||
|
CompactValue CompactValue::ofMaybe<YGUnitUndefined>(float) noexcept = delete;
|
||||||
|
template <>
|
||||||
|
CompactValue CompactValue::ofMaybe<YGUnitAuto>(float) noexcept = delete;
|
||||||
|
|
||||||
|
constexpr bool operator==(CompactValue a, CompactValue b) noexcept {
|
||||||
|
return a.payload_.repr == b.payload_.repr;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr bool operator!=(CompactValue a, CompactValue b) noexcept {
|
||||||
|
return !(a == b);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace yoga
|
||||||
|
} // namespace facebook
|
66
doric-iOS/Pod/Classes/Yoga/yoga/Utils.cpp
Normal file
66
doric-iOS/Pod/Classes/Yoga/yoga/Utils.cpp
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#include "Utils.h"
|
||||||
|
|
||||||
|
using namespace facebook;
|
||||||
|
|
||||||
|
YGFlexDirection YGFlexDirectionCross(
|
||||||
|
const YGFlexDirection flexDirection,
|
||||||
|
const YGDirection direction) {
|
||||||
|
return YGFlexDirectionIsColumn(flexDirection)
|
||||||
|
? YGResolveFlexDirection(YGFlexDirectionRow, direction)
|
||||||
|
: YGFlexDirectionColumn;
|
||||||
|
}
|
||||||
|
|
||||||
|
float YGFloatMax(const float a, const float b) {
|
||||||
|
if (!yoga::isUndefined(a) && !yoga::isUndefined(b)) {
|
||||||
|
return fmaxf(a, b);
|
||||||
|
}
|
||||||
|
return yoga::isUndefined(a) ? b : a;
|
||||||
|
}
|
||||||
|
|
||||||
|
float YGFloatMin(const float a, const float b) {
|
||||||
|
if (!yoga::isUndefined(a) && !yoga::isUndefined(b)) {
|
||||||
|
return fminf(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
return yoga::isUndefined(a) ? b : a;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool YGValueEqual(const YGValue& a, const YGValue& b) {
|
||||||
|
if (a.unit != b.unit) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a.unit == YGUnitUndefined ||
|
||||||
|
(yoga::isUndefined(a.value) && yoga::isUndefined(b.value))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fabs(a.value - b.value) < 0.0001f;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool YGFloatsEqual(const float a, const float b) {
|
||||||
|
if (!yoga::isUndefined(a) && !yoga::isUndefined(b)) {
|
||||||
|
return fabs(a - b) < 0.0001f;
|
||||||
|
}
|
||||||
|
return yoga::isUndefined(a) && yoga::isUndefined(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
float YGFloatSanitize(const float val) {
|
||||||
|
return yoga::isUndefined(val) ? 0 : val;
|
||||||
|
}
|
||||||
|
|
||||||
|
YGFloatOptional YGFloatOptionalMax(YGFloatOptional op1, YGFloatOptional op2) {
|
||||||
|
if (op1 >= op2) {
|
||||||
|
return op1;
|
||||||
|
}
|
||||||
|
if (op2 > op1) {
|
||||||
|
return op2;
|
||||||
|
}
|
||||||
|
return op1.isUndefined() ? op2 : op1;
|
||||||
|
}
|
142
doric-iOS/Pod/Classes/Yoga/yoga/Utils.h
Normal file
142
doric-iOS/Pod/Classes/Yoga/yoga/Utils.h
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include "YGNode.h"
|
||||||
|
#include "Yoga-internal.h"
|
||||||
|
#include "CompactValue.h"
|
||||||
|
|
||||||
|
// This struct is an helper model to hold the data for step 4 of flexbox algo,
|
||||||
|
// which is collecting the flex items in a line.
|
||||||
|
//
|
||||||
|
// - itemsOnLine: Number of items which can fit in a line considering the
|
||||||
|
// available Inner dimension, the flex items computed flexbasis and their
|
||||||
|
// margin. It may be different than the difference between start and end
|
||||||
|
// indicates because we skip over absolute-positioned items.
|
||||||
|
//
|
||||||
|
// - sizeConsumedOnCurrentLine: It is accumulation of the dimensions and margin
|
||||||
|
// of all the children on the current line. This will be used in order to
|
||||||
|
// either set the dimensions of the node if none already exist or to compute
|
||||||
|
// the remaining space left for the flexible children.
|
||||||
|
//
|
||||||
|
// - totalFlexGrowFactors: total flex grow factors of flex items which are to be
|
||||||
|
// layed in the current line
|
||||||
|
//
|
||||||
|
// - totalFlexShrinkFactors: total flex shrink factors of flex items which are
|
||||||
|
// to be layed in the current line
|
||||||
|
//
|
||||||
|
// - endOfLineIndex: Its the end index of the last flex item which was examined
|
||||||
|
// and it may or may not be part of the current line(as it may be absolutely
|
||||||
|
// positioned or inculding it may have caused to overshoot availableInnerDim)
|
||||||
|
//
|
||||||
|
// - relativeChildren: Maintain a vector of the child nodes that can shrink
|
||||||
|
// and/or grow.
|
||||||
|
|
||||||
|
struct YGCollectFlexItemsRowValues {
|
||||||
|
uint32_t itemsOnLine;
|
||||||
|
float sizeConsumedOnCurrentLine;
|
||||||
|
float totalFlexGrowFactors;
|
||||||
|
float totalFlexShrinkScaledFactors;
|
||||||
|
uint32_t endOfLineIndex;
|
||||||
|
std::vector<YGNodeRef> relativeChildren;
|
||||||
|
float remainingFreeSpace;
|
||||||
|
// The size of the mainDim for the row after considering size, padding, margin
|
||||||
|
// and border of flex items. This is used to calculate maxLineDim after going
|
||||||
|
// through all the rows to decide on the main axis size of owner.
|
||||||
|
float mainDim;
|
||||||
|
// The size of the crossDim for the row after considering size, padding,
|
||||||
|
// margin and border of flex items. Used for calculating containers crossSize.
|
||||||
|
float crossDim;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool YGValueEqual(const YGValue& a, const YGValue& b);
|
||||||
|
inline bool YGValueEqual(
|
||||||
|
facebook::yoga::detail::CompactValue a,
|
||||||
|
facebook::yoga::detail::CompactValue b) {
|
||||||
|
return YGValueEqual((YGValue) a, (YGValue) b);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This custom float equality function returns true if either absolute
|
||||||
|
// difference between two floats is less than 0.0001f or both are undefined.
|
||||||
|
bool YGFloatsEqual(const float a, const float b);
|
||||||
|
|
||||||
|
float YGFloatMax(const float a, const float b);
|
||||||
|
|
||||||
|
YGFloatOptional YGFloatOptionalMax(
|
||||||
|
const YGFloatOptional op1,
|
||||||
|
const YGFloatOptional op2);
|
||||||
|
|
||||||
|
float YGFloatMin(const float a, const float b);
|
||||||
|
|
||||||
|
// This custom float comparision function compares the array of float with
|
||||||
|
// YGFloatsEqual, as the default float comparision operator will not work(Look
|
||||||
|
// at the comments of YGFloatsEqual function).
|
||||||
|
template <std::size_t size>
|
||||||
|
bool YGFloatArrayEqual(
|
||||||
|
const std::array<float, size>& val1,
|
||||||
|
const std::array<float, size>& val2) {
|
||||||
|
bool areEqual = true;
|
||||||
|
for (std::size_t i = 0; i < size && areEqual; ++i) {
|
||||||
|
areEqual = YGFloatsEqual(val1[i], val2[i]);
|
||||||
|
}
|
||||||
|
return areEqual;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function returns 0 if YGFloatIsUndefined(val) is true and val otherwise
|
||||||
|
float YGFloatSanitize(const float val);
|
||||||
|
|
||||||
|
YGFlexDirection YGFlexDirectionCross(
|
||||||
|
const YGFlexDirection flexDirection,
|
||||||
|
const YGDirection direction);
|
||||||
|
|
||||||
|
inline bool YGFlexDirectionIsRow(const YGFlexDirection flexDirection) {
|
||||||
|
return flexDirection == YGFlexDirectionRow ||
|
||||||
|
flexDirection == YGFlexDirectionRowReverse;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline YGFloatOptional YGResolveValue(
|
||||||
|
const YGValue value,
|
||||||
|
const float ownerSize) {
|
||||||
|
switch (value.unit) {
|
||||||
|
case YGUnitPoint:
|
||||||
|
return YGFloatOptional{value.value};
|
||||||
|
case YGUnitPercent:
|
||||||
|
return YGFloatOptional{value.value * ownerSize * 0.01f};
|
||||||
|
default:
|
||||||
|
return YGFloatOptional{};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline YGFloatOptional YGResolveValue(
|
||||||
|
yoga::detail::CompactValue value,
|
||||||
|
float ownerSize) {
|
||||||
|
return YGResolveValue((YGValue) value, ownerSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool YGFlexDirectionIsColumn(const YGFlexDirection flexDirection) {
|
||||||
|
return flexDirection == YGFlexDirectionColumn ||
|
||||||
|
flexDirection == YGFlexDirectionColumnReverse;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline YGFlexDirection YGResolveFlexDirection(
|
||||||
|
const YGFlexDirection flexDirection,
|
||||||
|
const YGDirection direction) {
|
||||||
|
if (direction == YGDirectionRTL) {
|
||||||
|
if (flexDirection == YGFlexDirectionRow) {
|
||||||
|
return YGFlexDirectionRowReverse;
|
||||||
|
} else if (flexDirection == YGFlexDirectionRowReverse) {
|
||||||
|
return YGFlexDirectionRow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return flexDirection;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline YGFloatOptional YGResolveValueMargin(
|
||||||
|
yoga::detail::CompactValue value,
|
||||||
|
const float ownerSize) {
|
||||||
|
return value.isAuto() ? YGFloatOptional{0} : YGResolveValue(value, ownerSize);
|
||||||
|
}
|
43
doric-iOS/Pod/Classes/Yoga/yoga/YGConfig.cpp
Normal file
43
doric-iOS/Pod/Classes/Yoga/yoga/YGConfig.cpp
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#include "YGConfig.h"
|
||||||
|
|
||||||
|
YGConfig::YGConfig(YGLogger logger) : cloneNodeCallback_{nullptr} {
|
||||||
|
logger_.noContext = logger;
|
||||||
|
loggerUsesContext_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGConfig::log(
|
||||||
|
YGConfig* config,
|
||||||
|
YGNode* node,
|
||||||
|
YGLogLevel logLevel,
|
||||||
|
void* logContext,
|
||||||
|
const char* format,
|
||||||
|
va_list args) {
|
||||||
|
if (loggerUsesContext_) {
|
||||||
|
logger_.withContext(config, node, logLevel, logContext, format, args);
|
||||||
|
} else {
|
||||||
|
logger_.noContext(config, node, logLevel, format, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
YGNodeRef YGConfig::cloneNode(
|
||||||
|
YGNodeRef node,
|
||||||
|
YGNodeRef owner,
|
||||||
|
int childIndex,
|
||||||
|
void* cloneContext) {
|
||||||
|
YGNodeRef clone = nullptr;
|
||||||
|
if (cloneNodeCallback_.noContext != nullptr) {
|
||||||
|
clone = cloneNodeUsesContext_
|
||||||
|
? cloneNodeCallback_.withContext(node, owner, childIndex, cloneContext)
|
||||||
|
: cloneNodeCallback_.noContext(node, owner, childIndex);
|
||||||
|
}
|
||||||
|
if (clone == nullptr) {
|
||||||
|
clone = YGNodeClone(node);
|
||||||
|
}
|
||||||
|
return clone;
|
||||||
|
}
|
79
doric-iOS/Pod/Classes/Yoga/yoga/YGConfig.h
Normal file
79
doric-iOS/Pod/Classes/Yoga/yoga/YGConfig.h
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include "YGMarker.h"
|
||||||
|
#include "Yoga-internal.h"
|
||||||
|
#include "Yoga.h"
|
||||||
|
|
||||||
|
struct YGConfig {
|
||||||
|
using LogWithContextFn = int (*)(
|
||||||
|
YGConfigRef config,
|
||||||
|
YGNodeRef node,
|
||||||
|
YGLogLevel level,
|
||||||
|
void* context,
|
||||||
|
const char* format,
|
||||||
|
va_list args);
|
||||||
|
using CloneWithContextFn = YGNodeRef (*)(
|
||||||
|
YGNodeRef node,
|
||||||
|
YGNodeRef owner,
|
||||||
|
int childIndex,
|
||||||
|
void* cloneContext);
|
||||||
|
|
||||||
|
private:
|
||||||
|
union {
|
||||||
|
CloneWithContextFn withContext;
|
||||||
|
YGCloneNodeFunc noContext;
|
||||||
|
} cloneNodeCallback_;
|
||||||
|
union {
|
||||||
|
LogWithContextFn withContext;
|
||||||
|
YGLogger noContext;
|
||||||
|
} logger_;
|
||||||
|
bool cloneNodeUsesContext_;
|
||||||
|
bool loggerUsesContext_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool useWebDefaults = false;
|
||||||
|
bool useLegacyStretchBehaviour = false;
|
||||||
|
bool shouldDiffLayoutWithoutLegacyStretchBehaviour = false;
|
||||||
|
bool printTree = false;
|
||||||
|
float pointScaleFactor = 1.0f;
|
||||||
|
std::array<bool, facebook::yoga::enums::count<YGExperimentalFeature>()>
|
||||||
|
experimentalFeatures = {};
|
||||||
|
void* context = nullptr;
|
||||||
|
YGMarkerCallbacks markerCallbacks = {nullptr, nullptr};
|
||||||
|
|
||||||
|
YGConfig(YGLogger logger);
|
||||||
|
void log(YGConfig*, YGNode*, YGLogLevel, void*, const char*, va_list);
|
||||||
|
void setLogger(YGLogger logger) {
|
||||||
|
logger_.noContext = logger;
|
||||||
|
loggerUsesContext_ = false;
|
||||||
|
}
|
||||||
|
void setLogger(LogWithContextFn logger) {
|
||||||
|
logger_.withContext = logger;
|
||||||
|
loggerUsesContext_ = true;
|
||||||
|
}
|
||||||
|
void setLogger(std::nullptr_t) {
|
||||||
|
setLogger(YGLogger{nullptr});
|
||||||
|
}
|
||||||
|
|
||||||
|
YGNodeRef cloneNode(
|
||||||
|
YGNodeRef node,
|
||||||
|
YGNodeRef owner,
|
||||||
|
int childIndex,
|
||||||
|
void* cloneContext);
|
||||||
|
void setCloneNodeCallback(YGCloneNodeFunc cloneNode) {
|
||||||
|
cloneNodeCallback_.noContext = cloneNode;
|
||||||
|
cloneNodeUsesContext_ = false;
|
||||||
|
}
|
||||||
|
void setCloneNodeCallback(CloneWithContextFn cloneNode) {
|
||||||
|
cloneNodeCallback_.withContext = cloneNode;
|
||||||
|
cloneNodeUsesContext_ = true;
|
||||||
|
}
|
||||||
|
void setCloneNodeCallback(std::nullptr_t) {
|
||||||
|
setCloneNodeCallback(YGCloneNodeFunc{nullptr});
|
||||||
|
}
|
||||||
|
};
|
225
doric-iOS/Pod/Classes/Yoga/yoga/YGEnums.cpp
Normal file
225
doric-iOS/Pod/Classes/Yoga/yoga/YGEnums.cpp
Normal file
@ -0,0 +1,225 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#include "YGEnums.h"
|
||||||
|
|
||||||
|
const char* YGAlignToString(const YGAlign value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGAlignAuto:
|
||||||
|
return "auto";
|
||||||
|
case YGAlignFlexStart:
|
||||||
|
return "flex-start";
|
||||||
|
case YGAlignCenter:
|
||||||
|
return "center";
|
||||||
|
case YGAlignFlexEnd:
|
||||||
|
return "flex-end";
|
||||||
|
case YGAlignStretch:
|
||||||
|
return "stretch";
|
||||||
|
case YGAlignBaseline:
|
||||||
|
return "baseline";
|
||||||
|
case YGAlignSpaceBetween:
|
||||||
|
return "space-between";
|
||||||
|
case YGAlignSpaceAround:
|
||||||
|
return "space-around";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* YGDimensionToString(const YGDimension value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGDimensionWidth:
|
||||||
|
return "width";
|
||||||
|
case YGDimensionHeight:
|
||||||
|
return "height";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* YGDirectionToString(const YGDirection value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGDirectionInherit:
|
||||||
|
return "inherit";
|
||||||
|
case YGDirectionLTR:
|
||||||
|
return "ltr";
|
||||||
|
case YGDirectionRTL:
|
||||||
|
return "rtl";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* YGDisplayToString(const YGDisplay value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGDisplayFlex:
|
||||||
|
return "flex";
|
||||||
|
case YGDisplayNone:
|
||||||
|
return "none";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* YGEdgeToString(const YGEdge value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGEdgeLeft:
|
||||||
|
return "left";
|
||||||
|
case YGEdgeTop:
|
||||||
|
return "top";
|
||||||
|
case YGEdgeRight:
|
||||||
|
return "right";
|
||||||
|
case YGEdgeBottom:
|
||||||
|
return "bottom";
|
||||||
|
case YGEdgeStart:
|
||||||
|
return "start";
|
||||||
|
case YGEdgeEnd:
|
||||||
|
return "end";
|
||||||
|
case YGEdgeHorizontal:
|
||||||
|
return "horizontal";
|
||||||
|
case YGEdgeVertical:
|
||||||
|
return "vertical";
|
||||||
|
case YGEdgeAll:
|
||||||
|
return "all";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* YGExperimentalFeatureToString(const YGExperimentalFeature value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGExperimentalFeatureWebFlexBasis:
|
||||||
|
return "web-flex-basis";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* YGFlexDirectionToString(const YGFlexDirection value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGFlexDirectionColumn:
|
||||||
|
return "column";
|
||||||
|
case YGFlexDirectionColumnReverse:
|
||||||
|
return "column-reverse";
|
||||||
|
case YGFlexDirectionRow:
|
||||||
|
return "row";
|
||||||
|
case YGFlexDirectionRowReverse:
|
||||||
|
return "row-reverse";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* YGJustifyToString(const YGJustify value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGJustifyFlexStart:
|
||||||
|
return "flex-start";
|
||||||
|
case YGJustifyCenter:
|
||||||
|
return "center";
|
||||||
|
case YGJustifyFlexEnd:
|
||||||
|
return "flex-end";
|
||||||
|
case YGJustifySpaceBetween:
|
||||||
|
return "space-between";
|
||||||
|
case YGJustifySpaceAround:
|
||||||
|
return "space-around";
|
||||||
|
case YGJustifySpaceEvenly:
|
||||||
|
return "space-evenly";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* YGLogLevelToString(const YGLogLevel value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGLogLevelError:
|
||||||
|
return "error";
|
||||||
|
case YGLogLevelWarn:
|
||||||
|
return "warn";
|
||||||
|
case YGLogLevelInfo:
|
||||||
|
return "info";
|
||||||
|
case YGLogLevelDebug:
|
||||||
|
return "debug";
|
||||||
|
case YGLogLevelVerbose:
|
||||||
|
return "verbose";
|
||||||
|
case YGLogLevelFatal:
|
||||||
|
return "fatal";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* YGMeasureModeToString(const YGMeasureMode value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGMeasureModeUndefined:
|
||||||
|
return "undefined";
|
||||||
|
case YGMeasureModeExactly:
|
||||||
|
return "exactly";
|
||||||
|
case YGMeasureModeAtMost:
|
||||||
|
return "at-most";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* YGNodeTypeToString(const YGNodeType value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGNodeTypeDefault:
|
||||||
|
return "default";
|
||||||
|
case YGNodeTypeText:
|
||||||
|
return "text";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* YGOverflowToString(const YGOverflow value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGOverflowVisible:
|
||||||
|
return "visible";
|
||||||
|
case YGOverflowHidden:
|
||||||
|
return "hidden";
|
||||||
|
case YGOverflowScroll:
|
||||||
|
return "scroll";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* YGPositionTypeToString(const YGPositionType value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGPositionTypeRelative:
|
||||||
|
return "relative";
|
||||||
|
case YGPositionTypeAbsolute:
|
||||||
|
return "absolute";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* YGPrintOptionsToString(const YGPrintOptions value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGPrintOptionsLayout:
|
||||||
|
return "layout";
|
||||||
|
case YGPrintOptionsStyle:
|
||||||
|
return "style";
|
||||||
|
case YGPrintOptionsChildren:
|
||||||
|
return "children";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* YGUnitToString(const YGUnit value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGUnitUndefined:
|
||||||
|
return "undefined";
|
||||||
|
case YGUnitPoint:
|
||||||
|
return "point";
|
||||||
|
case YGUnitPercent:
|
||||||
|
return "percent";
|
||||||
|
case YGUnitAuto:
|
||||||
|
return "auto";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* YGWrapToString(const YGWrap value) {
|
||||||
|
switch (value) {
|
||||||
|
case YGWrapNoWrap:
|
||||||
|
return "no-wrap";
|
||||||
|
case YGWrapWrap:
|
||||||
|
return "wrap";
|
||||||
|
case YGWrapWrapReverse:
|
||||||
|
return "wrap-reverse";
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
150
doric-iOS/Pod/Classes/Yoga/yoga/YGEnums.h
Normal file
150
doric-iOS/Pod/Classes/Yoga/yoga/YGEnums.h
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "YGMacros.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
namespace facebook {
|
||||||
|
namespace yoga {
|
||||||
|
namespace enums {
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
constexpr int count(); // can't use `= delete` due to a defect in clang < 3.9
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
template <int... xs>
|
||||||
|
constexpr int n() {
|
||||||
|
return sizeof...(xs);
|
||||||
|
}
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
} // namespace enums
|
||||||
|
} // namespace yoga
|
||||||
|
} // namespace facebook
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define YG_ENUM_DECL(NAME, ...) \
|
||||||
|
typedef YG_ENUM_BEGIN(NAME){__VA_ARGS__} YG_ENUM_END(NAME); \
|
||||||
|
WIN_EXPORT const char* NAME##ToString(NAME);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define YG_ENUM_SEQ_DECL(NAME, ...) \
|
||||||
|
YG_ENUM_DECL(NAME, __VA_ARGS__) \
|
||||||
|
YG_EXTERN_C_END \
|
||||||
|
namespace facebook { \
|
||||||
|
namespace yoga { \
|
||||||
|
namespace enums { \
|
||||||
|
template <> \
|
||||||
|
constexpr int count<NAME>() { \
|
||||||
|
return detail::n<__VA_ARGS__>(); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
YG_EXTERN_C_BEGIN
|
||||||
|
#else
|
||||||
|
#define YG_ENUM_SEQ_DECL YG_ENUM_DECL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
YG_EXTERN_C_BEGIN
|
||||||
|
|
||||||
|
YG_ENUM_SEQ_DECL(
|
||||||
|
YGAlign,
|
||||||
|
YGAlignAuto,
|
||||||
|
YGAlignFlexStart,
|
||||||
|
YGAlignCenter,
|
||||||
|
YGAlignFlexEnd,
|
||||||
|
YGAlignStretch,
|
||||||
|
YGAlignBaseline,
|
||||||
|
YGAlignSpaceBetween,
|
||||||
|
YGAlignSpaceAround);
|
||||||
|
|
||||||
|
YG_ENUM_SEQ_DECL(YGDimension, YGDimensionWidth, YGDimensionHeight)
|
||||||
|
|
||||||
|
YG_ENUM_SEQ_DECL(
|
||||||
|
YGDirection,
|
||||||
|
YGDirectionInherit,
|
||||||
|
YGDirectionLTR,
|
||||||
|
YGDirectionRTL)
|
||||||
|
|
||||||
|
YG_ENUM_SEQ_DECL(YGDisplay, YGDisplayFlex, YGDisplayNone)
|
||||||
|
|
||||||
|
YG_ENUM_SEQ_DECL(
|
||||||
|
YGEdge,
|
||||||
|
YGEdgeLeft,
|
||||||
|
YGEdgeTop,
|
||||||
|
YGEdgeRight,
|
||||||
|
YGEdgeBottom,
|
||||||
|
YGEdgeStart,
|
||||||
|
YGEdgeEnd,
|
||||||
|
YGEdgeHorizontal,
|
||||||
|
YGEdgeVertical,
|
||||||
|
YGEdgeAll)
|
||||||
|
|
||||||
|
YG_ENUM_SEQ_DECL(YGExperimentalFeature, YGExperimentalFeatureWebFlexBasis)
|
||||||
|
|
||||||
|
YG_ENUM_SEQ_DECL(
|
||||||
|
YGFlexDirection,
|
||||||
|
YGFlexDirectionColumn,
|
||||||
|
YGFlexDirectionColumnReverse,
|
||||||
|
YGFlexDirectionRow,
|
||||||
|
YGFlexDirectionRowReverse)
|
||||||
|
|
||||||
|
YG_ENUM_SEQ_DECL(
|
||||||
|
YGJustify,
|
||||||
|
YGJustifyFlexStart,
|
||||||
|
YGJustifyCenter,
|
||||||
|
YGJustifyFlexEnd,
|
||||||
|
YGJustifySpaceBetween,
|
||||||
|
YGJustifySpaceAround,
|
||||||
|
YGJustifySpaceEvenly)
|
||||||
|
|
||||||
|
YG_ENUM_SEQ_DECL(
|
||||||
|
YGLogLevel,
|
||||||
|
YGLogLevelError,
|
||||||
|
YGLogLevelWarn,
|
||||||
|
YGLogLevelInfo,
|
||||||
|
YGLogLevelDebug,
|
||||||
|
YGLogLevelVerbose,
|
||||||
|
YGLogLevelFatal)
|
||||||
|
|
||||||
|
YG_ENUM_SEQ_DECL(
|
||||||
|
YGMeasureMode,
|
||||||
|
YGMeasureModeUndefined,
|
||||||
|
YGMeasureModeExactly,
|
||||||
|
YGMeasureModeAtMost)
|
||||||
|
|
||||||
|
YG_ENUM_SEQ_DECL(YGNodeType, YGNodeTypeDefault, YGNodeTypeText)
|
||||||
|
|
||||||
|
YG_ENUM_SEQ_DECL(
|
||||||
|
YGOverflow,
|
||||||
|
YGOverflowVisible,
|
||||||
|
YGOverflowHidden,
|
||||||
|
YGOverflowScroll)
|
||||||
|
|
||||||
|
YG_ENUM_SEQ_DECL(YGPositionType, YGPositionTypeRelative, YGPositionTypeAbsolute)
|
||||||
|
|
||||||
|
YG_ENUM_DECL(
|
||||||
|
YGPrintOptions,
|
||||||
|
YGPrintOptionsLayout = 1,
|
||||||
|
YGPrintOptionsStyle = 2,
|
||||||
|
YGPrintOptionsChildren = 4)
|
||||||
|
|
||||||
|
YG_ENUM_SEQ_DECL(
|
||||||
|
YGUnit,
|
||||||
|
YGUnitUndefined,
|
||||||
|
YGUnitPoint,
|
||||||
|
YGUnitPercent,
|
||||||
|
YGUnitAuto)
|
||||||
|
|
||||||
|
YG_ENUM_SEQ_DECL(YGWrap, YGWrapNoWrap, YGWrapWrap, YGWrapWrapReverse)
|
||||||
|
|
||||||
|
YG_EXTERN_C_END
|
||||||
|
|
||||||
|
#undef YG_ENUM_DECL
|
||||||
|
#undef YG_ENUM_SEQ_DECL
|
58
doric-iOS/Pod/Classes/Yoga/yoga/YGFloatOptional.h
Normal file
58
doric-iOS/Pod/Classes/Yoga/yoga/YGFloatOptional.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
#include <limits>
|
||||||
|
#include "Yoga-internal.h"
|
||||||
|
|
||||||
|
struct YGFloatOptional {
|
||||||
|
private:
|
||||||
|
float value_ = std::numeric_limits<float>::quiet_NaN();
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit constexpr YGFloatOptional(float value) : value_(value) {}
|
||||||
|
constexpr YGFloatOptional() = default;
|
||||||
|
|
||||||
|
// returns the wrapped value, or a value x with YGIsUndefined(x) == true
|
||||||
|
constexpr float unwrap() const {
|
||||||
|
return value_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isUndefined() const {
|
||||||
|
return std::isnan(value_);
|
||||||
|
}
|
||||||
|
|
||||||
|
YGFloatOptional operator+(YGFloatOptional op) const {
|
||||||
|
return YGFloatOptional{value_ + op.value_};
|
||||||
|
}
|
||||||
|
bool operator>(YGFloatOptional op) const {
|
||||||
|
return value_ > op.value_;
|
||||||
|
}
|
||||||
|
bool operator<(YGFloatOptional op) const {
|
||||||
|
return value_ < op.value_;
|
||||||
|
}
|
||||||
|
bool operator>=(YGFloatOptional op) const {
|
||||||
|
return *this > op || *this == op;
|
||||||
|
}
|
||||||
|
bool operator<=(YGFloatOptional op) const {
|
||||||
|
return *this < op || *this == op;
|
||||||
|
}
|
||||||
|
bool operator==(YGFloatOptional op) const {
|
||||||
|
return value_ == op.value_ || (isUndefined() && op.isUndefined());
|
||||||
|
}
|
||||||
|
bool operator!=(YGFloatOptional op) const {
|
||||||
|
return !(*this == op);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(float val) const {
|
||||||
|
return value_ == val || (isUndefined() && yoga::isUndefined(val));
|
||||||
|
}
|
||||||
|
bool operator!=(float val) const {
|
||||||
|
return !(*this == val);
|
||||||
|
}
|
||||||
|
};
|
40
doric-iOS/Pod/Classes/Yoga/yoga/YGLayout.cpp
Normal file
40
doric-iOS/Pod/Classes/Yoga/yoga/YGLayout.cpp
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#include "YGLayout.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
|
||||||
|
using namespace facebook;
|
||||||
|
|
||||||
|
bool YGLayout::operator==(YGLayout layout) const {
|
||||||
|
bool isEqual = YGFloatArrayEqual(position, layout.position) &&
|
||||||
|
YGFloatArrayEqual(dimensions, layout.dimensions) &&
|
||||||
|
YGFloatArrayEqual(margin, layout.margin) &&
|
||||||
|
YGFloatArrayEqual(border, layout.border) &&
|
||||||
|
YGFloatArrayEqual(padding, layout.padding) &&
|
||||||
|
direction == layout.direction && hadOverflow == layout.hadOverflow &&
|
||||||
|
lastOwnerDirection == layout.lastOwnerDirection &&
|
||||||
|
nextCachedMeasurementsIndex == layout.nextCachedMeasurementsIndex &&
|
||||||
|
cachedLayout == layout.cachedLayout &&
|
||||||
|
computedFlexBasis == layout.computedFlexBasis;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < YG_MAX_CACHED_RESULT_COUNT && isEqual; ++i) {
|
||||||
|
isEqual = isEqual && cachedMeasurements[i] == layout.cachedMeasurements[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!yoga::isUndefined(measuredDimensions[0]) ||
|
||||||
|
!yoga::isUndefined(layout.measuredDimensions[0])) {
|
||||||
|
isEqual =
|
||||||
|
isEqual && (measuredDimensions[0] == layout.measuredDimensions[0]);
|
||||||
|
}
|
||||||
|
if (!yoga::isUndefined(measuredDimensions[1]) ||
|
||||||
|
!yoga::isUndefined(layout.measuredDimensions[1])) {
|
||||||
|
isEqual =
|
||||||
|
isEqual && (measuredDimensions[1] == layout.measuredDimensions[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return isEqual;
|
||||||
|
}
|
50
doric-iOS/Pod/Classes/Yoga/yoga/YGLayout.h
Normal file
50
doric-iOS/Pod/Classes/Yoga/yoga/YGLayout.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include "YGFloatOptional.h"
|
||||||
|
#include "Yoga-internal.h"
|
||||||
|
|
||||||
|
constexpr std::array<float, 2> kYGDefaultDimensionValues = {
|
||||||
|
{YGUndefined, YGUndefined}};
|
||||||
|
|
||||||
|
struct YGLayout {
|
||||||
|
std::array<float, 4> position = {};
|
||||||
|
std::array<float, 2> dimensions = kYGDefaultDimensionValues;
|
||||||
|
std::array<float, 6> margin = {};
|
||||||
|
std::array<float, 6> border = {};
|
||||||
|
std::array<float, 6> padding = {};
|
||||||
|
YGDirection direction : 2;
|
||||||
|
bool didUseLegacyFlag : 1;
|
||||||
|
bool doesLegacyStretchFlagAffectsLayout : 1;
|
||||||
|
bool hadOverflow : 1;
|
||||||
|
|
||||||
|
uint32_t computedFlexBasisGeneration = 0;
|
||||||
|
YGFloatOptional computedFlexBasis = {};
|
||||||
|
|
||||||
|
// Instead of recomputing the entire layout every single time, we cache some
|
||||||
|
// information to break early when nothing changed
|
||||||
|
uint32_t generationCount = 0;
|
||||||
|
YGDirection lastOwnerDirection = (YGDirection) -1;
|
||||||
|
|
||||||
|
uint32_t nextCachedMeasurementsIndex = 0;
|
||||||
|
std::array<YGCachedMeasurement, YG_MAX_CACHED_RESULT_COUNT>
|
||||||
|
cachedMeasurements = {};
|
||||||
|
std::array<float, 2> measuredDimensions = kYGDefaultDimensionValues;
|
||||||
|
|
||||||
|
YGCachedMeasurement cachedLayout = YGCachedMeasurement();
|
||||||
|
|
||||||
|
YGLayout()
|
||||||
|
: direction(YGDirectionInherit),
|
||||||
|
didUseLegacyFlag(false),
|
||||||
|
doesLegacyStretchFlagAffectsLayout(false),
|
||||||
|
hadOverflow(false) {}
|
||||||
|
|
||||||
|
bool operator==(YGLayout layout) const;
|
||||||
|
bool operator!=(YGLayout layout) const {
|
||||||
|
return !(*this == layout);
|
||||||
|
}
|
||||||
|
};
|
32
doric-iOS/Pod/Classes/Yoga/yoga/YGMacros.h
Normal file
32
doric-iOS/Pod/Classes/Yoga/yoga/YGMacros.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define YG_EXTERN_C_BEGIN extern "C" {
|
||||||
|
#define YG_EXTERN_C_END }
|
||||||
|
#else
|
||||||
|
#define YG_EXTERN_C_BEGIN
|
||||||
|
#define YG_EXTERN_C_END
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WINDLL
|
||||||
|
#define WIN_EXPORT __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define WIN_EXPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef NS_ENUM
|
||||||
|
// Cannot use NSInteger as NSInteger has a different size than int (which is the
|
||||||
|
// default type of a enum). Therefor when linking the Yoga C library into obj-c
|
||||||
|
// the header is a missmatch for the Yoga ABI.
|
||||||
|
#define YG_ENUM_BEGIN(name) NS_ENUM(int, name)
|
||||||
|
#define YG_ENUM_END(name)
|
||||||
|
#else
|
||||||
|
#define YG_ENUM_BEGIN(name) enum name
|
||||||
|
#define YG_ENUM_END(name) name
|
||||||
|
#endif
|
14
doric-iOS/Pod/Classes/Yoga/yoga/YGMarker.cpp
Normal file
14
doric-iOS/Pod/Classes/Yoga/yoga/YGMarker.cpp
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#include "YGMarker.h"
|
||||||
|
#include "YGConfig.h"
|
||||||
|
|
||||||
|
void YGConfigSetMarkerCallbacks(
|
||||||
|
YGConfigRef config,
|
||||||
|
YGMarkerCallbacks markerCallbacks) {
|
||||||
|
config->markerCallbacks = markerCallbacks;
|
||||||
|
}
|
94
doric-iOS/Pod/Classes/Yoga/yoga/YGMarker.h
Normal file
94
doric-iOS/Pod/Classes/Yoga/yoga/YGMarker.h
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "YGMacros.h"
|
||||||
|
|
||||||
|
YG_EXTERN_C_BEGIN
|
||||||
|
|
||||||
|
typedef struct YGNode* YGNodeRef;
|
||||||
|
typedef struct YGConfig* YGConfigRef;
|
||||||
|
|
||||||
|
typedef YG_ENUM_BEGIN(YGMarker){
|
||||||
|
YGMarkerLayout,
|
||||||
|
YGMarkerMeasure,
|
||||||
|
YGMarkerBaselineFn,
|
||||||
|
} YG_ENUM_END(YGMarker);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int layouts;
|
||||||
|
int measures;
|
||||||
|
int maxMeasureCache;
|
||||||
|
int cachedLayouts;
|
||||||
|
int cachedMeasures;
|
||||||
|
} YGMarkerLayoutData;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
bool _unused;
|
||||||
|
} YGMarkerNoData;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
YGMarkerLayoutData* layout;
|
||||||
|
YGMarkerNoData* noData;
|
||||||
|
} YGMarkerData;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
// accepts marker type, a node ref, and marker data (depends on marker type)
|
||||||
|
// can return a handle or id that Yoga will pass to endMarker
|
||||||
|
void* (*startMarker)(YGMarker, YGNodeRef, YGMarkerData);
|
||||||
|
// accepts marker type, a node ref, marker data, and marker id as returned by
|
||||||
|
// startMarker
|
||||||
|
void (*endMarker)(YGMarker, YGNodeRef, YGMarkerData, void* id);
|
||||||
|
} YGMarkerCallbacks;
|
||||||
|
|
||||||
|
void YGConfigSetMarkerCallbacks(YGConfigRef, YGMarkerCallbacks);
|
||||||
|
|
||||||
|
YG_EXTERN_C_END
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
|
||||||
|
namespace facebook {
|
||||||
|
namespace yoga {
|
||||||
|
namespace marker {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
template <YGMarker M>
|
||||||
|
struct MarkerData;
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct MarkerData<YGMarkerLayout> {
|
||||||
|
using type = YGMarkerLayoutData;
|
||||||
|
static type*& get(YGMarkerData& d) {
|
||||||
|
return d.layout;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct NoMarkerData {
|
||||||
|
using type = YGMarkerNoData;
|
||||||
|
static type*& get(YGMarkerData& d) {
|
||||||
|
return d.noData;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct MarkerData<YGMarkerMeasure> : NoMarkerData {};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct MarkerData<YGMarkerBaselineFn> : NoMarkerData {};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
template <YGMarker M>
|
||||||
|
typename detail::MarkerData<M>::type* data(YGMarkerData d) {
|
||||||
|
return detail::MarkerData<M>::get(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace marker
|
||||||
|
} // namespace yoga
|
||||||
|
} // namespace facebook
|
||||||
|
|
||||||
|
#endif // __cplusplus
|
587
doric-iOS/Pod/Classes/Yoga/yoga/YGNode.cpp
Normal file
587
doric-iOS/Pod/Classes/Yoga/yoga/YGNode.cpp
Normal file
@ -0,0 +1,587 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#include "YGNode.h"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
#include "CompactValue.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
|
||||||
|
using namespace facebook;
|
||||||
|
using facebook::yoga::detail::CompactValue;
|
||||||
|
|
||||||
|
YGNode::YGNode(YGNode&& node) {
|
||||||
|
context_ = node.context_;
|
||||||
|
hasNewLayout_ = node.hasNewLayout_;
|
||||||
|
isReferenceBaseline_ = node.isReferenceBaseline_;
|
||||||
|
isDirty_ = node.isDirty_;
|
||||||
|
nodeType_ = node.nodeType_;
|
||||||
|
measureUsesContext_ = node.measureUsesContext_;
|
||||||
|
baselineUsesContext_ = node.baselineUsesContext_;
|
||||||
|
printUsesContext_ = node.printUsesContext_;
|
||||||
|
measure_ = node.measure_;
|
||||||
|
baseline_ = node.baseline_;
|
||||||
|
print_ = node.print_;
|
||||||
|
dirtied_ = node.dirtied_;
|
||||||
|
style_ = node.style_;
|
||||||
|
layout_ = node.layout_;
|
||||||
|
lineIndex_ = node.lineIndex_;
|
||||||
|
owner_ = node.owner_;
|
||||||
|
children_ = std::move(node.children_);
|
||||||
|
config_ = node.config_;
|
||||||
|
resolvedDimensions_ = node.resolvedDimensions_;
|
||||||
|
for (auto c : children_) {
|
||||||
|
c->setOwner(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::print(void* printContext) {
|
||||||
|
if (print_.noContext != nullptr) {
|
||||||
|
if (printUsesContext_) {
|
||||||
|
print_.withContext(this, printContext);
|
||||||
|
} else {
|
||||||
|
print_.noContext(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
YGFloatOptional YGNode::getLeadingPosition(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float axisSize) const {
|
||||||
|
if (YGFlexDirectionIsRow(axis)) {
|
||||||
|
auto leadingPosition = YGComputedEdgeValue(
|
||||||
|
style_.position, YGEdgeStart, CompactValue::ofUndefined());
|
||||||
|
if (!leadingPosition.isUndefined()) {
|
||||||
|
return YGResolveValue(leadingPosition, axisSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto leadingPosition = YGComputedEdgeValue(
|
||||||
|
style_.position, leading[axis], CompactValue::ofUndefined());
|
||||||
|
|
||||||
|
return leadingPosition.isUndefined()
|
||||||
|
? YGFloatOptional{0}
|
||||||
|
: YGResolveValue(leadingPosition, axisSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
YGFloatOptional YGNode::getTrailingPosition(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float axisSize) const {
|
||||||
|
if (YGFlexDirectionIsRow(axis)) {
|
||||||
|
auto trailingPosition = YGComputedEdgeValue(
|
||||||
|
style_.position, YGEdgeEnd, CompactValue::ofUndefined());
|
||||||
|
if (!trailingPosition.isUndefined()) {
|
||||||
|
return YGResolveValue(trailingPosition, axisSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto trailingPosition = YGComputedEdgeValue(
|
||||||
|
style_.position, trailing[axis], CompactValue::ofUndefined());
|
||||||
|
|
||||||
|
return trailingPosition.isUndefined()
|
||||||
|
? YGFloatOptional{0}
|
||||||
|
: YGResolveValue(trailingPosition, axisSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool YGNode::isLeadingPositionDefined(const YGFlexDirection axis) const {
|
||||||
|
return (YGFlexDirectionIsRow(axis) &&
|
||||||
|
!YGComputedEdgeValue(
|
||||||
|
style_.position, YGEdgeStart, CompactValue::ofUndefined())
|
||||||
|
.isUndefined()) ||
|
||||||
|
!YGComputedEdgeValue(
|
||||||
|
style_.position, leading[axis], CompactValue::ofUndefined())
|
||||||
|
.isUndefined();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool YGNode::isTrailingPosDefined(const YGFlexDirection axis) const {
|
||||||
|
return (YGFlexDirectionIsRow(axis) &&
|
||||||
|
!YGComputedEdgeValue(
|
||||||
|
style_.position, YGEdgeEnd, CompactValue::ofUndefined())
|
||||||
|
.isUndefined()) ||
|
||||||
|
!YGComputedEdgeValue(
|
||||||
|
style_.position, trailing[axis], CompactValue::ofUndefined())
|
||||||
|
.isUndefined();
|
||||||
|
}
|
||||||
|
|
||||||
|
YGFloatOptional YGNode::getLeadingMargin(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float widthSize) const {
|
||||||
|
if (YGFlexDirectionIsRow(axis) && !style_.margin[YGEdgeStart].isUndefined()) {
|
||||||
|
return YGResolveValueMargin(style_.margin[YGEdgeStart], widthSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
return YGResolveValueMargin(
|
||||||
|
YGComputedEdgeValue(style_.margin, leading[axis], CompactValue::ofZero()),
|
||||||
|
widthSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
YGFloatOptional YGNode::getTrailingMargin(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float widthSize) const {
|
||||||
|
if (YGFlexDirectionIsRow(axis) && !style_.margin[YGEdgeEnd].isUndefined()) {
|
||||||
|
return YGResolveValueMargin(style_.margin[YGEdgeEnd], widthSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
return YGResolveValueMargin(
|
||||||
|
YGComputedEdgeValue(
|
||||||
|
style_.margin, trailing[axis], CompactValue::ofZero()),
|
||||||
|
widthSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
YGFloatOptional YGNode::getMarginForAxis(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float widthSize) const {
|
||||||
|
return getLeadingMargin(axis, widthSize) + getTrailingMargin(axis, widthSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
YGSize YGNode::measure(
|
||||||
|
float width,
|
||||||
|
YGMeasureMode widthMode,
|
||||||
|
float height,
|
||||||
|
YGMeasureMode heightMode,
|
||||||
|
void* layoutContext) {
|
||||||
|
|
||||||
|
return measureUsesContext_
|
||||||
|
? measure_.withContext(
|
||||||
|
this, width, widthMode, height, heightMode, layoutContext)
|
||||||
|
: measure_.noContext(this, width, widthMode, height, heightMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
float YGNode::baseline(float width, float height, void* layoutContext) {
|
||||||
|
return baselineUsesContext_
|
||||||
|
? baseline_.withContext(this, width, height, layoutContext)
|
||||||
|
: baseline_.noContext(this, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setters
|
||||||
|
|
||||||
|
void YGNode::setMeasureFunc(decltype(YGNode::measure_) measureFunc) {
|
||||||
|
if (measureFunc.noContext == nullptr) {
|
||||||
|
// TODO: t18095186 Move nodeType to opt-in function and mark appropriate
|
||||||
|
// places in Litho
|
||||||
|
nodeType_ = YGNodeTypeDefault;
|
||||||
|
} else {
|
||||||
|
YGAssertWithNode(
|
||||||
|
this,
|
||||||
|
children_.size() == 0,
|
||||||
|
"Cannot set measure function: Nodes with measure functions cannot have "
|
||||||
|
"children.");
|
||||||
|
// TODO: t18095186 Move nodeType to opt-in function and mark appropriate
|
||||||
|
// places in Litho
|
||||||
|
setNodeType(YGNodeTypeText);
|
||||||
|
}
|
||||||
|
|
||||||
|
measure_ = measureFunc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setMeasureFunc(YGMeasureFunc measureFunc) {
|
||||||
|
measureUsesContext_ = false;
|
||||||
|
decltype(YGNode::measure_) m;
|
||||||
|
m.noContext = measureFunc;
|
||||||
|
setMeasureFunc(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setMeasureFunc(MeasureWithContextFn measureFunc) {
|
||||||
|
measureUsesContext_ = true;
|
||||||
|
decltype(YGNode::measure_) m;
|
||||||
|
m.withContext = measureFunc;
|
||||||
|
setMeasureFunc(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::replaceChild(YGNodeRef child, uint32_t index) {
|
||||||
|
children_[index] = child;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::replaceChild(YGNodeRef oldChild, YGNodeRef newChild) {
|
||||||
|
std::replace(children_.begin(), children_.end(), oldChild, newChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::insertChild(YGNodeRef child, uint32_t index) {
|
||||||
|
children_.insert(children_.begin() + index, child);
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setDirty(bool isDirty) {
|
||||||
|
if (isDirty == isDirty_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
isDirty_ = isDirty;
|
||||||
|
if (isDirty && dirtied_) {
|
||||||
|
dirtied_(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool YGNode::removeChild(YGNodeRef child) {
|
||||||
|
std::vector<YGNodeRef>::iterator p =
|
||||||
|
std::find(children_.begin(), children_.end(), child);
|
||||||
|
if (p != children_.end()) {
|
||||||
|
children_.erase(p);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::removeChild(uint32_t index) {
|
||||||
|
children_.erase(children_.begin() + index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setLayoutDirection(YGDirection direction) {
|
||||||
|
layout_.direction = direction;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setLayoutMargin(float margin, int index) {
|
||||||
|
layout_.margin[index] = margin;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setLayoutBorder(float border, int index) {
|
||||||
|
layout_.border[index] = border;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setLayoutPadding(float padding, int index) {
|
||||||
|
layout_.padding[index] = padding;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setLayoutLastOwnerDirection(YGDirection direction) {
|
||||||
|
layout_.lastOwnerDirection = direction;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setLayoutComputedFlexBasis(
|
||||||
|
const YGFloatOptional computedFlexBasis) {
|
||||||
|
layout_.computedFlexBasis = computedFlexBasis;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setLayoutPosition(float position, int index) {
|
||||||
|
layout_.position[index] = position;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setLayoutComputedFlexBasisGeneration(
|
||||||
|
uint32_t computedFlexBasisGeneration) {
|
||||||
|
layout_.computedFlexBasisGeneration = computedFlexBasisGeneration;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setLayoutMeasuredDimension(float measuredDimension, int index) {
|
||||||
|
layout_.measuredDimensions[index] = measuredDimension;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setLayoutHadOverflow(bool hadOverflow) {
|
||||||
|
layout_.hadOverflow = hadOverflow;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setLayoutDimension(float dimension, int index) {
|
||||||
|
layout_.dimensions[index] = dimension;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If both left and right are defined, then use left. Otherwise return +left or
|
||||||
|
// -right depending on which is defined.
|
||||||
|
YGFloatOptional YGNode::relativePosition(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float axisSize) const {
|
||||||
|
if (isLeadingPositionDefined(axis)) {
|
||||||
|
return getLeadingPosition(axis, axisSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
YGFloatOptional trailingPosition = getTrailingPosition(axis, axisSize);
|
||||||
|
if (!trailingPosition.isUndefined()) {
|
||||||
|
trailingPosition = YGFloatOptional{-1 * trailingPosition.unwrap()};
|
||||||
|
}
|
||||||
|
return trailingPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setPosition(
|
||||||
|
const YGDirection direction,
|
||||||
|
const float mainSize,
|
||||||
|
const float crossSize,
|
||||||
|
const float ownerWidth) {
|
||||||
|
/* Root nodes should be always layouted as LTR, so we don't return negative
|
||||||
|
* values. */
|
||||||
|
const YGDirection directionRespectingRoot =
|
||||||
|
owner_ != nullptr ? direction : YGDirectionLTR;
|
||||||
|
const YGFlexDirection mainAxis =
|
||||||
|
YGResolveFlexDirection(style_.flexDirection, directionRespectingRoot);
|
||||||
|
const YGFlexDirection crossAxis =
|
||||||
|
YGFlexDirectionCross(mainAxis, directionRespectingRoot);
|
||||||
|
|
||||||
|
const YGFloatOptional relativePositionMain =
|
||||||
|
relativePosition(mainAxis, mainSize);
|
||||||
|
const YGFloatOptional relativePositionCross =
|
||||||
|
relativePosition(crossAxis, crossSize);
|
||||||
|
|
||||||
|
setLayoutPosition(
|
||||||
|
(getLeadingMargin(mainAxis, ownerWidth) + relativePositionMain).unwrap(),
|
||||||
|
leading[mainAxis]);
|
||||||
|
setLayoutPosition(
|
||||||
|
(getTrailingMargin(mainAxis, ownerWidth) + relativePositionMain).unwrap(),
|
||||||
|
trailing[mainAxis]);
|
||||||
|
setLayoutPosition(
|
||||||
|
(getLeadingMargin(crossAxis, ownerWidth) + relativePositionCross)
|
||||||
|
.unwrap(),
|
||||||
|
leading[crossAxis]);
|
||||||
|
setLayoutPosition(
|
||||||
|
(getTrailingMargin(crossAxis, ownerWidth) + relativePositionCross)
|
||||||
|
.unwrap(),
|
||||||
|
trailing[crossAxis]);
|
||||||
|
}
|
||||||
|
|
||||||
|
YGValue YGNode::marginLeadingValue(const YGFlexDirection axis) const {
|
||||||
|
if (YGFlexDirectionIsRow(axis) && !style_.margin[YGEdgeStart].isUndefined()) {
|
||||||
|
return style_.margin[YGEdgeStart];
|
||||||
|
} else {
|
||||||
|
return style_.margin[leading[axis]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
YGValue YGNode::marginTrailingValue(const YGFlexDirection axis) const {
|
||||||
|
if (YGFlexDirectionIsRow(axis) && !style_.margin[YGEdgeEnd].isUndefined()) {
|
||||||
|
return style_.margin[YGEdgeEnd];
|
||||||
|
} else {
|
||||||
|
return style_.margin[trailing[axis]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
YGValue YGNode::resolveFlexBasisPtr() const {
|
||||||
|
YGValue flexBasis = style_.flexBasis;
|
||||||
|
if (flexBasis.unit != YGUnitAuto && flexBasis.unit != YGUnitUndefined) {
|
||||||
|
return flexBasis;
|
||||||
|
}
|
||||||
|
if (!style_.flex.isUndefined() && style_.flex.unwrap() > 0.0f) {
|
||||||
|
return config_->useWebDefaults ? YGValueAuto : YGValueZero;
|
||||||
|
}
|
||||||
|
return YGValueAuto;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::resolveDimension() {
|
||||||
|
using namespace yoga;
|
||||||
|
for (int dim = YGDimensionWidth; dim < enums::count<YGDimension>(); dim++) {
|
||||||
|
if (!getStyle().maxDimensions[dim].isUndefined() &&
|
||||||
|
YGValueEqual(
|
||||||
|
getStyle().maxDimensions[dim], style_.minDimensions[dim])) {
|
||||||
|
resolvedDimensions_[dim] = style_.maxDimensions[dim];
|
||||||
|
} else {
|
||||||
|
resolvedDimensions_[dim] = style_.dimensions[dim];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
YGDirection YGNode::resolveDirection(const YGDirection ownerDirection) {
|
||||||
|
if (style_.direction == YGDirectionInherit) {
|
||||||
|
return ownerDirection > YGDirectionInherit ? ownerDirection
|
||||||
|
: YGDirectionLTR;
|
||||||
|
} else {
|
||||||
|
return style_.direction;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::clearChildren() {
|
||||||
|
children_.clear();
|
||||||
|
children_.shrink_to_fit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Other Methods
|
||||||
|
|
||||||
|
void YGNode::cloneChildrenIfNeeded(void* cloneContext) {
|
||||||
|
iterChildrenAfterCloningIfNeeded([](YGNodeRef, void*) {}, cloneContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::markDirtyAndPropogate() {
|
||||||
|
if (!isDirty_) {
|
||||||
|
setDirty(true);
|
||||||
|
setLayoutComputedFlexBasis(YGFloatOptional());
|
||||||
|
if (owner_) {
|
||||||
|
owner_->markDirtyAndPropogate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::markDirtyAndPropogateDownwards() {
|
||||||
|
isDirty_ = true;
|
||||||
|
for_each(children_.begin(), children_.end(), [](YGNodeRef childNode) {
|
||||||
|
childNode->markDirtyAndPropogateDownwards();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
float YGNode::resolveFlexGrow() {
|
||||||
|
// Root nodes flexGrow should always be 0
|
||||||
|
if (owner_ == nullptr) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
if (!style_.flexGrow.isUndefined()) {
|
||||||
|
return style_.flexGrow.unwrap();
|
||||||
|
}
|
||||||
|
if (!style_.flex.isUndefined() && style_.flex.unwrap() > 0.0f) {
|
||||||
|
return style_.flex.unwrap();
|
||||||
|
}
|
||||||
|
return kDefaultFlexGrow;
|
||||||
|
}
|
||||||
|
|
||||||
|
float YGNode::resolveFlexShrink() {
|
||||||
|
if (owner_ == nullptr) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
if (!style_.flexShrink.isUndefined()) {
|
||||||
|
return style_.flexShrink.unwrap();
|
||||||
|
}
|
||||||
|
if (!config_->useWebDefaults && !style_.flex.isUndefined() &&
|
||||||
|
style_.flex.unwrap() < 0.0f) {
|
||||||
|
return -style_.flex.unwrap();
|
||||||
|
}
|
||||||
|
return config_->useWebDefaults ? kWebDefaultFlexShrink : kDefaultFlexShrink;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool YGNode::isNodeFlexible() {
|
||||||
|
return (
|
||||||
|
(style_.positionType == YGPositionTypeRelative) &&
|
||||||
|
(resolveFlexGrow() != 0 || resolveFlexShrink() != 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
float YGNode::getLeadingBorder(const YGFlexDirection axis) const {
|
||||||
|
YGValue leadingBorder;
|
||||||
|
if (YGFlexDirectionIsRow(axis) && !style_.border[YGEdgeStart].isUndefined()) {
|
||||||
|
leadingBorder = style_.border[YGEdgeStart];
|
||||||
|
if (leadingBorder.value >= 0) {
|
||||||
|
return leadingBorder.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
leadingBorder =
|
||||||
|
YGComputedEdgeValue(style_.border, leading[axis], CompactValue::ofZero());
|
||||||
|
return YGFloatMax(leadingBorder.value, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
float YGNode::getTrailingBorder(const YGFlexDirection flexDirection) const {
|
||||||
|
YGValue trailingBorder;
|
||||||
|
if (YGFlexDirectionIsRow(flexDirection) &&
|
||||||
|
!style_.border[YGEdgeEnd].isUndefined()) {
|
||||||
|
trailingBorder = style_.border[YGEdgeEnd];
|
||||||
|
if (trailingBorder.value >= 0.0f) {
|
||||||
|
return trailingBorder.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
trailingBorder = YGComputedEdgeValue(
|
||||||
|
style_.border, trailing[flexDirection], CompactValue::ofZero());
|
||||||
|
return YGFloatMax(trailingBorder.value, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
YGFloatOptional YGNode::getLeadingPadding(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float widthSize) const {
|
||||||
|
const YGFloatOptional paddingEdgeStart =
|
||||||
|
YGResolveValue(style_.padding[YGEdgeStart], widthSize);
|
||||||
|
if (YGFlexDirectionIsRow(axis) &&
|
||||||
|
!style_.padding[YGEdgeStart].isUndefined() &&
|
||||||
|
!paddingEdgeStart.isUndefined() && paddingEdgeStart.unwrap() >= 0.0f) {
|
||||||
|
return paddingEdgeStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
YGFloatOptional resolvedValue = YGResolveValue(
|
||||||
|
YGComputedEdgeValue(
|
||||||
|
style_.padding, leading[axis], CompactValue::ofZero()),
|
||||||
|
widthSize);
|
||||||
|
return YGFloatOptionalMax(resolvedValue, YGFloatOptional(0.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
YGFloatOptional YGNode::getTrailingPadding(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float widthSize) const {
|
||||||
|
const YGFloatOptional paddingEdgeEnd =
|
||||||
|
YGResolveValue(style_.padding[YGEdgeEnd], widthSize);
|
||||||
|
if (YGFlexDirectionIsRow(axis) && paddingEdgeEnd >= YGFloatOptional{0.0f}) {
|
||||||
|
return paddingEdgeEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
YGFloatOptional resolvedValue = YGResolveValue(
|
||||||
|
YGComputedEdgeValue(
|
||||||
|
style_.padding, trailing[axis], CompactValue::ofZero()),
|
||||||
|
widthSize);
|
||||||
|
|
||||||
|
return YGFloatOptionalMax(resolvedValue, YGFloatOptional(0.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
YGFloatOptional YGNode::getLeadingPaddingAndBorder(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float widthSize) const {
|
||||||
|
return getLeadingPadding(axis, widthSize) +
|
||||||
|
YGFloatOptional(getLeadingBorder(axis));
|
||||||
|
}
|
||||||
|
|
||||||
|
YGFloatOptional YGNode::getTrailingPaddingAndBorder(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float widthSize) const {
|
||||||
|
return getTrailingPadding(axis, widthSize) +
|
||||||
|
YGFloatOptional(getTrailingBorder(axis));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool YGNode::didUseLegacyFlag() {
|
||||||
|
bool didUseLegacyFlag = layout_.didUseLegacyFlag;
|
||||||
|
if (didUseLegacyFlag) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (const auto& child : children_) {
|
||||||
|
if (child->layout_.didUseLegacyFlag) {
|
||||||
|
didUseLegacyFlag = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return didUseLegacyFlag;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setAndPropogateUseLegacyFlag(bool useLegacyFlag) {
|
||||||
|
config_->useLegacyStretchBehaviour = useLegacyFlag;
|
||||||
|
for_each(children_.begin(), children_.end(), [=](YGNodeRef childNode) {
|
||||||
|
childNode->getConfig()->useLegacyStretchBehaviour = useLegacyFlag;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setLayoutDoesLegacyFlagAffectsLayout(
|
||||||
|
bool doesLegacyFlagAffectsLayout) {
|
||||||
|
layout_.doesLegacyStretchFlagAffectsLayout = doesLegacyFlagAffectsLayout;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::setLayoutDidUseLegacyFlag(bool didUseLegacyFlag) {
|
||||||
|
layout_.didUseLegacyFlag = didUseLegacyFlag;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool YGNode::isLayoutTreeEqualToNode(const YGNode& node) const {
|
||||||
|
if (children_.size() != node.children_.size()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (layout_ != node.layout_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (children_.size() == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isLayoutTreeEqual = true;
|
||||||
|
YGNodeRef otherNodeChildren = nullptr;
|
||||||
|
for (std::vector<YGNodeRef>::size_type i = 0; i < children_.size(); ++i) {
|
||||||
|
otherNodeChildren = node.children_[i];
|
||||||
|
isLayoutTreeEqual =
|
||||||
|
children_[i]->isLayoutTreeEqualToNode(*otherNodeChildren);
|
||||||
|
if (!isLayoutTreeEqual) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return isLayoutTreeEqual;
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNode::reset() {
|
||||||
|
YGAssertWithNode(
|
||||||
|
this,
|
||||||
|
children_.size() == 0,
|
||||||
|
"Cannot reset a node which still has children attached");
|
||||||
|
YGAssertWithNode(
|
||||||
|
this, owner_ == nullptr, "Cannot reset a node still attached to a owner");
|
||||||
|
|
||||||
|
clearChildren();
|
||||||
|
|
||||||
|
auto config = getConfig();
|
||||||
|
*this = YGNode{};
|
||||||
|
if (config->useWebDefaults) {
|
||||||
|
setStyleFlexDirection(YGFlexDirectionRow);
|
||||||
|
setStyleAlignContent(YGAlignStretch);
|
||||||
|
}
|
||||||
|
setConfig(config);
|
||||||
|
}
|
361
doric-iOS/Pod/Classes/Yoga/yoga/YGNode.h
Normal file
361
doric-iOS/Pod/Classes/Yoga/yoga/YGNode.h
Normal file
@ -0,0 +1,361 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "YGConfig.h"
|
||||||
|
#include "YGLayout.h"
|
||||||
|
#include "YGStyle.h"
|
||||||
|
#include "Yoga-internal.h"
|
||||||
|
|
||||||
|
struct YGNode {
|
||||||
|
using MeasureWithContextFn =
|
||||||
|
YGSize (*)(YGNode*, float, YGMeasureMode, float, YGMeasureMode, void*);
|
||||||
|
using BaselineWithContextFn = float (*)(YGNode*, float, float, void*);
|
||||||
|
using PrintWithContextFn = void (*)(YGNode*, void*);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void* context_ = nullptr;
|
||||||
|
bool hasNewLayout_ : 1;
|
||||||
|
bool isReferenceBaseline_ : 1;
|
||||||
|
bool isDirty_ : 1;
|
||||||
|
YGNodeType nodeType_ : 1;
|
||||||
|
bool measureUsesContext_ : 1;
|
||||||
|
bool baselineUsesContext_ : 1;
|
||||||
|
bool printUsesContext_ : 1;
|
||||||
|
union {
|
||||||
|
YGMeasureFunc noContext;
|
||||||
|
MeasureWithContextFn withContext;
|
||||||
|
} measure_ = {nullptr};
|
||||||
|
union {
|
||||||
|
YGBaselineFunc noContext;
|
||||||
|
BaselineWithContextFn withContext;
|
||||||
|
} baseline_ = {nullptr};
|
||||||
|
union {
|
||||||
|
YGPrintFunc noContext;
|
||||||
|
PrintWithContextFn withContext;
|
||||||
|
} print_ = {nullptr};
|
||||||
|
YGDirtiedFunc dirtied_ = nullptr;
|
||||||
|
YGStyle style_ = {};
|
||||||
|
YGLayout layout_ = {};
|
||||||
|
uint32_t lineIndex_ = 0;
|
||||||
|
YGNodeRef owner_ = nullptr;
|
||||||
|
YGVector children_ = {};
|
||||||
|
YGConfigRef config_ = nullptr;
|
||||||
|
std::array<YGValue, 2> resolvedDimensions_ = {
|
||||||
|
{YGValueUndefined, YGValueUndefined}};
|
||||||
|
|
||||||
|
YGFloatOptional relativePosition(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float axisSize) const;
|
||||||
|
|
||||||
|
void setMeasureFunc(decltype(measure_));
|
||||||
|
void setBaselineFunc(decltype(baseline_));
|
||||||
|
|
||||||
|
// DANGER DANGER DANGER!
|
||||||
|
// If the the node assigned to has children, we'd either have to deallocate
|
||||||
|
// them (potentially incorrect) or ignore them (danger of leaks). Only ever
|
||||||
|
// use this after checking that there are no children.
|
||||||
|
// DO NOT CHANGE THE VISIBILITY OF THIS METHOD!
|
||||||
|
YGNode& operator=(YGNode&&) = default;
|
||||||
|
|
||||||
|
public:
|
||||||
|
YGNode()
|
||||||
|
: hasNewLayout_{true},
|
||||||
|
isReferenceBaseline_{false},
|
||||||
|
isDirty_{false},
|
||||||
|
nodeType_{YGNodeTypeDefault},
|
||||||
|
measureUsesContext_{false},
|
||||||
|
baselineUsesContext_{false},
|
||||||
|
printUsesContext_{false} {}
|
||||||
|
~YGNode() = default; // cleanup of owner/children relationships in YGNodeFree
|
||||||
|
explicit YGNode(const YGConfigRef newConfig) : config_(newConfig){};
|
||||||
|
|
||||||
|
YGNode(YGNode&&);
|
||||||
|
|
||||||
|
// Does not expose true value semantics, as children are not cloned eagerly.
|
||||||
|
// Should we remove this?
|
||||||
|
YGNode(const YGNode& node) = default;
|
||||||
|
|
||||||
|
// assignment means potential leaks of existing children, or alternatively
|
||||||
|
// freeing unowned memory, double free, or freeing stack memory.
|
||||||
|
YGNode& operator=(const YGNode&) = delete;
|
||||||
|
|
||||||
|
// Getters
|
||||||
|
void* getContext() const {
|
||||||
|
return context_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void print(void*);
|
||||||
|
|
||||||
|
bool getHasNewLayout() const {
|
||||||
|
return hasNewLayout_;
|
||||||
|
}
|
||||||
|
|
||||||
|
YGNodeType getNodeType() const {
|
||||||
|
return nodeType_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool hasMeasureFunc() const noexcept {
|
||||||
|
return measure_.noContext != nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
YGSize measure(float, YGMeasureMode, float, YGMeasureMode, void*);
|
||||||
|
|
||||||
|
bool hasBaselineFunc() const noexcept {
|
||||||
|
return baseline_.noContext != nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
float baseline(float width, float height, void* layoutContext);
|
||||||
|
|
||||||
|
YGDirtiedFunc getDirtied() const {
|
||||||
|
return dirtied_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// For Performance reasons passing as reference.
|
||||||
|
YGStyle& getStyle() {
|
||||||
|
return style_;
|
||||||
|
}
|
||||||
|
|
||||||
|
const YGStyle& getStyle() const {
|
||||||
|
return style_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// For Performance reasons passing as reference.
|
||||||
|
YGLayout& getLayout() {
|
||||||
|
return layout_;
|
||||||
|
}
|
||||||
|
|
||||||
|
const YGLayout& getLayout() const {
|
||||||
|
return layout_;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t getLineIndex() const {
|
||||||
|
return lineIndex_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isReferenceBaseline() {
|
||||||
|
return isReferenceBaseline_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns the YGNodeRef that owns this YGNode. An owner is used to identify
|
||||||
|
// the YogaTree that a YGNode belongs to. 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 YogaTrees.
|
||||||
|
YGNodeRef getOwner() const {
|
||||||
|
return owner_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated, use getOwner() instead.
|
||||||
|
YGNodeRef getParent() const {
|
||||||
|
return getOwner();
|
||||||
|
}
|
||||||
|
|
||||||
|
const YGVector& getChildren() const {
|
||||||
|
return children_;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Applies a callback to all children, after cloning them if they are not
|
||||||
|
// owned.
|
||||||
|
template <typename T>
|
||||||
|
void iterChildrenAfterCloningIfNeeded(T callback, void* cloneContext) {
|
||||||
|
int i = 0;
|
||||||
|
for (YGNodeRef& child : children_) {
|
||||||
|
if (child->getOwner() != this) {
|
||||||
|
child = config_->cloneNode(child, this, i, cloneContext);
|
||||||
|
child->setOwner(this);
|
||||||
|
}
|
||||||
|
i += 1;
|
||||||
|
|
||||||
|
callback(child, cloneContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
YGFloatOptional getLeadingPosition(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float axisSize) const;
|
||||||
|
bool isLeadingPositionDefined(const YGFlexDirection axis) const;
|
||||||
|
bool isTrailingPosDefined(const YGFlexDirection axis) const;
|
||||||
|
YGFloatOptional getTrailingPosition(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float axisSize) const;
|
||||||
|
YGFloatOptional getLeadingMargin(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float widthSize) const;
|
||||||
|
YGFloatOptional getTrailingMargin(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float widthSize) const;
|
||||||
|
float getLeadingBorder(const YGFlexDirection flexDirection) const;
|
||||||
|
float getTrailingBorder(const YGFlexDirection flexDirection) const;
|
||||||
|
YGFloatOptional getLeadingPadding(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float widthSize) const;
|
||||||
|
YGFloatOptional getTrailingPadding(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float widthSize) const;
|
||||||
|
YGFloatOptional getLeadingPaddingAndBorder(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float widthSize) const;
|
||||||
|
YGFloatOptional getTrailingPaddingAndBorder(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float widthSize) const;
|
||||||
|
YGFloatOptional getMarginForAxis(
|
||||||
|
const YGFlexDirection axis,
|
||||||
|
const float widthSize) const;
|
||||||
|
// Setters
|
||||||
|
|
||||||
|
void setContext(void* context) {
|
||||||
|
context_ = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setPrintFunc(YGPrintFunc printFunc) {
|
||||||
|
print_.noContext = printFunc;
|
||||||
|
printUsesContext_ = false;
|
||||||
|
}
|
||||||
|
void setPrintFunc(PrintWithContextFn printFunc) {
|
||||||
|
print_.withContext = printFunc;
|
||||||
|
printUsesContext_ = true;
|
||||||
|
}
|
||||||
|
void setPrintFunc(std::nullptr_t) {
|
||||||
|
setPrintFunc(YGPrintFunc{nullptr});
|
||||||
|
}
|
||||||
|
|
||||||
|
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(MeasureWithContextFn);
|
||||||
|
void setMeasureFunc(std::nullptr_t) {
|
||||||
|
return setMeasureFunc(YGMeasureFunc{nullptr});
|
||||||
|
}
|
||||||
|
|
||||||
|
void setBaselineFunc(YGBaselineFunc baseLineFunc) {
|
||||||
|
baselineUsesContext_ = false;
|
||||||
|
baseline_.noContext = baseLineFunc;
|
||||||
|
}
|
||||||
|
void setBaselineFunc(BaselineWithContextFn baseLineFunc) {
|
||||||
|
baselineUsesContext_ = true;
|
||||||
|
baseline_.withContext = baseLineFunc;
|
||||||
|
}
|
||||||
|
void setBaselineFunc(std::nullptr_t) {
|
||||||
|
return setBaselineFunc(YGBaselineFunc{nullptr});
|
||||||
|
}
|
||||||
|
|
||||||
|
void setDirtiedFunc(YGDirtiedFunc dirtiedFunc) {
|
||||||
|
dirtied_ = dirtiedFunc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setStyle(const YGStyle& style) {
|
||||||
|
style_ = style;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setLayout(const YGLayout& layout) {
|
||||||
|
layout_ = layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setLineIndex(uint32_t lineIndex) {
|
||||||
|
lineIndex_ = lineIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setIsReferenceBaseline(bool isReferenceBaseline) {
|
||||||
|
isReferenceBaseline_ = isReferenceBaseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 setLayoutLastOwnerDirection(YGDirection direction);
|
||||||
|
void setLayoutComputedFlexBasis(const YGFloatOptional computedFlexBasis);
|
||||||
|
void setLayoutComputedFlexBasisGeneration(
|
||||||
|
uint32_t computedFlexBasisGeneration);
|
||||||
|
void setLayoutMeasuredDimension(float measuredDimension, int index);
|
||||||
|
void setLayoutHadOverflow(bool hadOverflow);
|
||||||
|
void setLayoutDimension(float dimension, int index);
|
||||||
|
void setLayoutDirection(YGDirection direction);
|
||||||
|
void setLayoutMargin(float margin, int index);
|
||||||
|
void setLayoutBorder(float border, int index);
|
||||||
|
void setLayoutPadding(float padding, int index);
|
||||||
|
void setLayoutPosition(float position, int index);
|
||||||
|
void setPosition(
|
||||||
|
const YGDirection direction,
|
||||||
|
const float mainSize,
|
||||||
|
const float crossSize,
|
||||||
|
const float ownerWidth);
|
||||||
|
void setAndPropogateUseLegacyFlag(bool useLegacyFlag);
|
||||||
|
void setLayoutDoesLegacyFlagAffectsLayout(bool doesLegacyFlagAffectsLayout);
|
||||||
|
void setLayoutDidUseLegacyFlag(bool didUseLegacyFlag);
|
||||||
|
void markDirtyAndPropogateDownwards();
|
||||||
|
|
||||||
|
// Other methods
|
||||||
|
YGValue marginLeadingValue(const YGFlexDirection axis) const;
|
||||||
|
YGValue marginTrailingValue(const YGFlexDirection axis) const;
|
||||||
|
YGValue resolveFlexBasisPtr() const;
|
||||||
|
void resolveDimension();
|
||||||
|
YGDirection resolveDirection(const YGDirection ownerDirection);
|
||||||
|
void clearChildren();
|
||||||
|
/// Replaces the occurrences of oldChild with newChild
|
||||||
|
void replaceChild(YGNodeRef oldChild, YGNodeRef newChild);
|
||||||
|
void replaceChild(YGNodeRef child, uint32_t index);
|
||||||
|
void insertChild(YGNodeRef child, uint32_t index);
|
||||||
|
/// Removes the first occurrence of child
|
||||||
|
bool removeChild(YGNodeRef child);
|
||||||
|
void removeChild(uint32_t index);
|
||||||
|
|
||||||
|
void cloneChildrenIfNeeded(void*);
|
||||||
|
void markDirtyAndPropogate();
|
||||||
|
float resolveFlexGrow();
|
||||||
|
float resolveFlexShrink();
|
||||||
|
bool isNodeFlexible();
|
||||||
|
bool didUseLegacyFlag();
|
||||||
|
bool isLayoutTreeEqualToNode(const YGNode& node) const;
|
||||||
|
void reset();
|
||||||
|
};
|
235
doric-iOS/Pod/Classes/Yoga/yoga/YGNodePrint.cpp
Normal file
235
doric-iOS/Pod/Classes/Yoga/yoga/YGNodePrint.cpp
Normal file
@ -0,0 +1,235 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#ifdef DEBUG
|
||||||
|
#include "YGNodePrint.h"
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include "YGEnums.h"
|
||||||
|
#include "YGNode.h"
|
||||||
|
#include "Yoga-internal.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
|
||||||
|
namespace facebook {
|
||||||
|
namespace yoga {
|
||||||
|
typedef std::string string;
|
||||||
|
|
||||||
|
static void indent(string& base, uint32_t level) {
|
||||||
|
for (uint32_t i = 0; i < level; ++i) {
|
||||||
|
base.append(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool areFourValuesEqual(const YGStyle::Edges& four) {
|
||||||
|
return YGValueEqual(four[0], four[1]) && YGValueEqual(four[0], four[2]) &&
|
||||||
|
YGValueEqual(four[0], four[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void appendFormatedString(string& str, const char* fmt, ...) {
|
||||||
|
va_list args;
|
||||||
|
va_start(args, fmt);
|
||||||
|
va_list argsCopy;
|
||||||
|
va_copy(argsCopy, args);
|
||||||
|
std::vector<char> buf(1 + vsnprintf(NULL, 0, fmt, args));
|
||||||
|
va_end(args);
|
||||||
|
vsnprintf(buf.data(), buf.size(), fmt, argsCopy);
|
||||||
|
va_end(argsCopy);
|
||||||
|
string result = string(buf.begin(), buf.end() - 1);
|
||||||
|
str.append(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void appendFloatOptionalIfDefined(
|
||||||
|
string& base,
|
||||||
|
const string key,
|
||||||
|
const YGFloatOptional num) {
|
||||||
|
if (!num.isUndefined()) {
|
||||||
|
appendFormatedString(base, "%s: %g; ", key.c_str(), num.unwrap());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void appendNumberIfNotUndefined(
|
||||||
|
string& base,
|
||||||
|
const string key,
|
||||||
|
const YGValue number) {
|
||||||
|
if (number.unit != YGUnitUndefined) {
|
||||||
|
if (number.unit == YGUnitAuto) {
|
||||||
|
base.append(key + ": auto; ");
|
||||||
|
} else {
|
||||||
|
string unit = number.unit == YGUnitPoint ? "px" : "%%";
|
||||||
|
appendFormatedString(
|
||||||
|
base, "%s: %g%s; ", key.c_str(), number.value, unit.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void appendNumberIfNotAuto(
|
||||||
|
string& base,
|
||||||
|
const string& key,
|
||||||
|
const YGValue number) {
|
||||||
|
if (number.unit != YGUnitAuto) {
|
||||||
|
appendNumberIfNotUndefined(base, key, number);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void appendNumberIfNotZero(
|
||||||
|
string& base,
|
||||||
|
const string& str,
|
||||||
|
const YGValue number) {
|
||||||
|
if (number.unit == YGUnitAuto) {
|
||||||
|
base.append(str + ": auto; ");
|
||||||
|
} else if (!YGFloatsEqual(number.value, 0)) {
|
||||||
|
appendNumberIfNotUndefined(base, str, number);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void appendEdges(
|
||||||
|
string& base,
|
||||||
|
const string& key,
|
||||||
|
const YGStyle::Edges& edges) {
|
||||||
|
if (areFourValuesEqual(edges)) {
|
||||||
|
appendNumberIfNotZero(base, key, edges[YGEdgeLeft]);
|
||||||
|
} else {
|
||||||
|
for (int edge = YGEdgeLeft; edge != YGEdgeAll; ++edge) {
|
||||||
|
string str = key + "-" + YGEdgeToString(static_cast<YGEdge>(edge));
|
||||||
|
appendNumberIfNotZero(base, str, edges[edge]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void appendEdgeIfNotUndefined(
|
||||||
|
string& base,
|
||||||
|
const string& str,
|
||||||
|
const YGStyle::Edges& edges,
|
||||||
|
const YGEdge edge) {
|
||||||
|
appendNumberIfNotUndefined(
|
||||||
|
base,
|
||||||
|
str,
|
||||||
|
YGComputedEdgeValue(edges, edge, detail::CompactValue::ofUndefined()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void YGNodeToString(
|
||||||
|
std::string& str,
|
||||||
|
YGNodeRef node,
|
||||||
|
YGPrintOptions options,
|
||||||
|
uint32_t level) {
|
||||||
|
indent(str, level);
|
||||||
|
appendFormatedString(str, "<div ");
|
||||||
|
|
||||||
|
if (options & YGPrintOptionsLayout) {
|
||||||
|
appendFormatedString(str, "layout=\"");
|
||||||
|
appendFormatedString(
|
||||||
|
str, "width: %g; ", node->getLayout().dimensions[YGDimensionWidth]);
|
||||||
|
appendFormatedString(
|
||||||
|
str, "height: %g; ", node->getLayout().dimensions[YGDimensionHeight]);
|
||||||
|
appendFormatedString(
|
||||||
|
str, "top: %g; ", node->getLayout().position[YGEdgeTop]);
|
||||||
|
appendFormatedString(
|
||||||
|
str, "left: %g;", node->getLayout().position[YGEdgeLeft]);
|
||||||
|
appendFormatedString(str, "\" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options & YGPrintOptionsStyle) {
|
||||||
|
appendFormatedString(str, "style=\"");
|
||||||
|
if (node->getStyle().flexDirection != YGNode().getStyle().flexDirection) {
|
||||||
|
appendFormatedString(
|
||||||
|
str,
|
||||||
|
"flex-direction: %s; ",
|
||||||
|
YGFlexDirectionToString(node->getStyle().flexDirection));
|
||||||
|
}
|
||||||
|
if (node->getStyle().justifyContent != YGNode().getStyle().justifyContent) {
|
||||||
|
appendFormatedString(
|
||||||
|
str,
|
||||||
|
"justify-content: %s; ",
|
||||||
|
YGJustifyToString(node->getStyle().justifyContent));
|
||||||
|
}
|
||||||
|
if (node->getStyle().alignItems != YGNode().getStyle().alignItems) {
|
||||||
|
appendFormatedString(
|
||||||
|
str,
|
||||||
|
"align-items: %s; ",
|
||||||
|
YGAlignToString(node->getStyle().alignItems));
|
||||||
|
}
|
||||||
|
if (node->getStyle().alignContent != YGNode().getStyle().alignContent) {
|
||||||
|
appendFormatedString(
|
||||||
|
str,
|
||||||
|
"align-content: %s; ",
|
||||||
|
YGAlignToString(node->getStyle().alignContent));
|
||||||
|
}
|
||||||
|
if (node->getStyle().alignSelf != YGNode().getStyle().alignSelf) {
|
||||||
|
appendFormatedString(
|
||||||
|
str, "align-self: %s; ", YGAlignToString(node->getStyle().alignSelf));
|
||||||
|
}
|
||||||
|
appendFloatOptionalIfDefined(str, "flex-grow", node->getStyle().flexGrow);
|
||||||
|
appendFloatOptionalIfDefined(
|
||||||
|
str, "flex-shrink", node->getStyle().flexShrink);
|
||||||
|
appendNumberIfNotAuto(str, "flex-basis", node->getStyle().flexBasis);
|
||||||
|
appendFloatOptionalIfDefined(str, "flex", node->getStyle().flex);
|
||||||
|
|
||||||
|
if (node->getStyle().flexWrap != YGNode().getStyle().flexWrap) {
|
||||||
|
appendFormatedString(
|
||||||
|
str, "flex-wrap: %s; ", YGWrapToString(node->getStyle().flexWrap));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node->getStyle().overflow != YGNode().getStyle().overflow) {
|
||||||
|
appendFormatedString(
|
||||||
|
str, "overflow: %s; ", YGOverflowToString(node->getStyle().overflow));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node->getStyle().display != YGNode().getStyle().display) {
|
||||||
|
appendFormatedString(
|
||||||
|
str, "display: %s; ", YGDisplayToString(node->getStyle().display));
|
||||||
|
}
|
||||||
|
appendEdges(str, "margin", node->getStyle().margin);
|
||||||
|
appendEdges(str, "padding", node->getStyle().padding);
|
||||||
|
appendEdges(str, "border", node->getStyle().border);
|
||||||
|
|
||||||
|
appendNumberIfNotAuto(
|
||||||
|
str, "width", node->getStyle().dimensions[YGDimensionWidth]);
|
||||||
|
appendNumberIfNotAuto(
|
||||||
|
str, "height", node->getStyle().dimensions[YGDimensionHeight]);
|
||||||
|
appendNumberIfNotAuto(
|
||||||
|
str, "max-width", node->getStyle().maxDimensions[YGDimensionWidth]);
|
||||||
|
appendNumberIfNotAuto(
|
||||||
|
str, "max-height", node->getStyle().maxDimensions[YGDimensionHeight]);
|
||||||
|
appendNumberIfNotAuto(
|
||||||
|
str, "min-width", node->getStyle().minDimensions[YGDimensionWidth]);
|
||||||
|
appendNumberIfNotAuto(
|
||||||
|
str, "min-height", node->getStyle().minDimensions[YGDimensionHeight]);
|
||||||
|
|
||||||
|
if (node->getStyle().positionType != YGNode().getStyle().positionType) {
|
||||||
|
appendFormatedString(
|
||||||
|
str,
|
||||||
|
"position: %s; ",
|
||||||
|
YGPositionTypeToString(node->getStyle().positionType));
|
||||||
|
}
|
||||||
|
|
||||||
|
appendEdgeIfNotUndefined(
|
||||||
|
str, "left", node->getStyle().position, YGEdgeLeft);
|
||||||
|
appendEdgeIfNotUndefined(
|
||||||
|
str, "right", node->getStyle().position, YGEdgeRight);
|
||||||
|
appendEdgeIfNotUndefined(str, "top", node->getStyle().position, YGEdgeTop);
|
||||||
|
appendEdgeIfNotUndefined(
|
||||||
|
str, "bottom", node->getStyle().position, YGEdgeBottom);
|
||||||
|
appendFormatedString(str, "\" ");
|
||||||
|
|
||||||
|
if (node->hasMeasureFunc()) {
|
||||||
|
appendFormatedString(str, "has-custom-measure=\"true\"");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
appendFormatedString(str, ">");
|
||||||
|
|
||||||
|
const uint32_t childCount = static_cast<uint32_t>(node->getChildren().size());
|
||||||
|
if (options & YGPrintOptionsChildren && childCount > 0) {
|
||||||
|
for (uint32_t i = 0; i < childCount; i++) {
|
||||||
|
appendFormatedString(str, "\n");
|
||||||
|
YGNodeToString(str, YGNodeGetChild(node, i), options, level + 1);
|
||||||
|
}
|
||||||
|
appendFormatedString(str, "\n");
|
||||||
|
indent(str, level);
|
||||||
|
}
|
||||||
|
appendFormatedString(str, "</div>");
|
||||||
|
}
|
||||||
|
} // namespace yoga
|
||||||
|
} // namespace facebook
|
||||||
|
#endif
|
24
doric-iOS/Pod/Classes/Yoga/yoga/YGNodePrint.h
Normal file
24
doric-iOS/Pod/Classes/Yoga/yoga/YGNodePrint.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#ifdef DEBUG
|
||||||
|
#pragma once
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "Yoga.h"
|
||||||
|
|
||||||
|
namespace facebook {
|
||||||
|
namespace yoga {
|
||||||
|
|
||||||
|
void YGNodeToString(
|
||||||
|
std::string& str,
|
||||||
|
YGNodeRef node,
|
||||||
|
YGPrintOptions options,
|
||||||
|
uint32_t level);
|
||||||
|
|
||||||
|
} // namespace yoga
|
||||||
|
} // namespace facebook
|
||||||
|
#endif
|
52
doric-iOS/Pod/Classes/Yoga/yoga/YGStyle.cpp
Normal file
52
doric-iOS/Pod/Classes/Yoga/yoga/YGStyle.cpp
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#include "YGStyle.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
|
||||||
|
// Yoga specific properties, not compatible with flexbox specification
|
||||||
|
bool operator==(const YGStyle& lhs, const YGStyle& rhs) {
|
||||||
|
bool areNonFloatValuesEqual = lhs.direction == rhs.direction &&
|
||||||
|
lhs.flexDirection == rhs.flexDirection &&
|
||||||
|
lhs.justifyContent == rhs.justifyContent &&
|
||||||
|
lhs.alignContent == rhs.alignContent &&
|
||||||
|
lhs.alignItems == rhs.alignItems && lhs.alignSelf == rhs.alignSelf &&
|
||||||
|
lhs.positionType == rhs.positionType && lhs.flexWrap == rhs.flexWrap &&
|
||||||
|
lhs.overflow == rhs.overflow && lhs.display == rhs.display &&
|
||||||
|
YGValueEqual(lhs.flexBasis, rhs.flexBasis) && lhs.margin == rhs.margin &&
|
||||||
|
lhs.position == rhs.position && lhs.padding == rhs.padding &&
|
||||||
|
lhs.border == rhs.border && lhs.dimensions == rhs.dimensions &&
|
||||||
|
lhs.minDimensions == rhs.minDimensions &&
|
||||||
|
lhs.maxDimensions == rhs.maxDimensions;
|
||||||
|
|
||||||
|
areNonFloatValuesEqual = areNonFloatValuesEqual &&
|
||||||
|
lhs.flex.isUndefined() == rhs.flex.isUndefined();
|
||||||
|
if (areNonFloatValuesEqual && !lhs.flex.isUndefined() &&
|
||||||
|
!rhs.flex.isUndefined()) {
|
||||||
|
areNonFloatValuesEqual = areNonFloatValuesEqual && lhs.flex == rhs.flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
areNonFloatValuesEqual = areNonFloatValuesEqual &&
|
||||||
|
lhs.flexGrow.isUndefined() == rhs.flexGrow.isUndefined();
|
||||||
|
if (areNonFloatValuesEqual && !lhs.flexGrow.isUndefined()) {
|
||||||
|
areNonFloatValuesEqual =
|
||||||
|
areNonFloatValuesEqual && lhs.flexGrow == rhs.flexGrow;
|
||||||
|
}
|
||||||
|
|
||||||
|
areNonFloatValuesEqual = areNonFloatValuesEqual &&
|
||||||
|
lhs.flexShrink.isUndefined() == rhs.flexShrink.isUndefined();
|
||||||
|
if (areNonFloatValuesEqual && !rhs.flexShrink.isUndefined()) {
|
||||||
|
areNonFloatValuesEqual =
|
||||||
|
areNonFloatValuesEqual && lhs.flexShrink == rhs.flexShrink;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(lhs.aspectRatio.isUndefined() && rhs.aspectRatio.isUndefined())) {
|
||||||
|
areNonFloatValuesEqual =
|
||||||
|
areNonFloatValuesEqual && lhs.aspectRatio == rhs.aspectRatio;
|
||||||
|
}
|
||||||
|
|
||||||
|
return areNonFloatValuesEqual;
|
||||||
|
}
|
75
doric-iOS/Pod/Classes/Yoga/yoga/YGStyle.h
Normal file
75
doric-iOS/Pod/Classes/Yoga/yoga/YGStyle.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <algorithm>
|
||||||
|
#include <array>
|
||||||
|
#include <initializer_list>
|
||||||
|
#include "CompactValue.h"
|
||||||
|
#include "YGEnums.h"
|
||||||
|
#include "YGFloatOptional.h"
|
||||||
|
#include "Yoga-internal.h"
|
||||||
|
#include "Yoga.h"
|
||||||
|
|
||||||
|
#if !defined(ENUM_BITFIELDS_NOT_SUPPORTED)
|
||||||
|
#define BITFIELD_ENUM_SIZED(num) : num
|
||||||
|
#else
|
||||||
|
#define BITFIELD_ENUM_SIZED(num)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct YGStyle {
|
||||||
|
private:
|
||||||
|
using CompactValue = facebook::yoga::detail::CompactValue;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using Dimensions = facebook::yoga::detail::Values<2>;
|
||||||
|
using Edges =
|
||||||
|
facebook::yoga::detail::Values<facebook::yoga::enums::count<YGEdge>()>;
|
||||||
|
|
||||||
|
/* Some platforms don't support enum bitfields,
|
||||||
|
so please use BITFIELD_ENUM_SIZED(BITS_COUNT) */
|
||||||
|
YGDirection direction BITFIELD_ENUM_SIZED(2);
|
||||||
|
YGFlexDirection flexDirection BITFIELD_ENUM_SIZED(2);
|
||||||
|
YGJustify justifyContent BITFIELD_ENUM_SIZED(3);
|
||||||
|
YGAlign alignContent BITFIELD_ENUM_SIZED(3);
|
||||||
|
YGAlign alignItems BITFIELD_ENUM_SIZED(3);
|
||||||
|
YGAlign alignSelf BITFIELD_ENUM_SIZED(3);
|
||||||
|
YGPositionType positionType BITFIELD_ENUM_SIZED(1);
|
||||||
|
YGWrap flexWrap BITFIELD_ENUM_SIZED(2);
|
||||||
|
YGOverflow overflow BITFIELD_ENUM_SIZED(2);
|
||||||
|
YGDisplay display BITFIELD_ENUM_SIZED(1);
|
||||||
|
YGFloatOptional flex = {};
|
||||||
|
YGFloatOptional flexGrow = {};
|
||||||
|
YGFloatOptional flexShrink = {};
|
||||||
|
CompactValue flexBasis = CompactValue::ofAuto();
|
||||||
|
Edges margin = {};
|
||||||
|
Edges position = {};
|
||||||
|
Edges padding = {};
|
||||||
|
Edges border = {};
|
||||||
|
Dimensions dimensions{CompactValue::ofAuto()};
|
||||||
|
Dimensions minDimensions = {};
|
||||||
|
Dimensions maxDimensions = {};
|
||||||
|
// Yoga specific properties, not compatible with flexbox specification
|
||||||
|
YGFloatOptional aspectRatio = {};
|
||||||
|
|
||||||
|
YGStyle()
|
||||||
|
: direction(YGDirectionInherit),
|
||||||
|
flexDirection(YGFlexDirectionColumn),
|
||||||
|
justifyContent(YGJustifyFlexStart),
|
||||||
|
alignContent(YGAlignFlexStart),
|
||||||
|
alignItems(YGAlignStretch),
|
||||||
|
alignSelf(YGAlignAuto),
|
||||||
|
positionType(YGPositionTypeRelative),
|
||||||
|
flexWrap(YGWrapNoWrap),
|
||||||
|
overflow(YGOverflowVisible),
|
||||||
|
display(YGDisplayFlex) {}
|
||||||
|
~YGStyle() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator==(const YGStyle& lhs, const YGStyle& rhs);
|
||||||
|
inline bool operator!=(const YGStyle& lhs, const YGStyle& rhs) {
|
||||||
|
return !(lhs == rhs);
|
||||||
|
}
|
11
doric-iOS/Pod/Classes/Yoga/yoga/YGValue.cpp
Normal file
11
doric-iOS/Pod/Classes/Yoga/yoga/YGValue.cpp
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#include "YGValue.h"
|
||||||
|
|
||||||
|
const YGValue YGValueZero = {0, YGUnitPoint};
|
||||||
|
const YGValue YGValueUndefined = {YGUndefined, YGUnitUndefined};
|
||||||
|
const YGValue YGValueAuto = {YGUndefined, YGUnitAuto};
|
83
doric-iOS/Pod/Classes/Yoga/yoga/YGValue.h
Normal file
83
doric-iOS/Pod/Classes/Yoga/yoga/YGValue.h
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include "YGEnums.h"
|
||||||
|
#include "YGMacros.h"
|
||||||
|
|
||||||
|
YG_EXTERN_C_BEGIN
|
||||||
|
|
||||||
|
// Not defined in MSVC++
|
||||||
|
#ifndef NAN
|
||||||
|
static const uint32_t __nan = 0x7fc00000;
|
||||||
|
#define NAN (*(const float*) __nan)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define YGUndefined NAN
|
||||||
|
|
||||||
|
typedef struct YGValue {
|
||||||
|
float value;
|
||||||
|
YGUnit unit;
|
||||||
|
} YGValue;
|
||||||
|
|
||||||
|
extern const YGValue YGValueAuto;
|
||||||
|
extern const YGValue YGValueUndefined;
|
||||||
|
extern const YGValue YGValueZero;
|
||||||
|
|
||||||
|
YG_EXTERN_C_END
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
|
||||||
|
inline bool operator==(const YGValue& lhs, const YGValue& rhs) {
|
||||||
|
if (lhs.unit != rhs.unit) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (lhs.unit) {
|
||||||
|
case YGUnitUndefined:
|
||||||
|
case YGUnitAuto:
|
||||||
|
return true;
|
||||||
|
case YGUnitPoint:
|
||||||
|
case YGUnitPercent:
|
||||||
|
return lhs.value == rhs.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator!=(const YGValue& lhs, const YGValue& rhs) {
|
||||||
|
return !(lhs == rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline YGValue operator-(const YGValue& value) {
|
||||||
|
return {-value.value, value.unit};
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace facebook {
|
||||||
|
namespace yoga {
|
||||||
|
namespace literals {
|
||||||
|
|
||||||
|
inline YGValue operator"" _pt(long double value) {
|
||||||
|
return YGValue{static_cast<float>(value), YGUnitPoint};
|
||||||
|
}
|
||||||
|
inline YGValue operator"" _pt(unsigned long long value) {
|
||||||
|
return operator"" _pt(static_cast<long double>(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline YGValue operator"" _percent(long double value) {
|
||||||
|
return YGValue{static_cast<float>(value), YGUnitPercent};
|
||||||
|
}
|
||||||
|
inline YGValue operator"" _percent(unsigned long long value) {
|
||||||
|
return operator"" _percent(static_cast<long double>(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace literals
|
||||||
|
} // namespace yoga
|
||||||
|
} // namespace facebook
|
||||||
|
|
||||||
|
#endif
|
162
doric-iOS/Pod/Classes/Yoga/yoga/Yoga-internal.h
Normal file
162
doric-iOS/Pod/Classes/Yoga/yoga/Yoga-internal.h
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <algorithm>
|
||||||
|
#include <array>
|
||||||
|
#include <cmath>
|
||||||
|
#include <vector>
|
||||||
|
#include "CompactValue.h"
|
||||||
|
#include "Yoga.h"
|
||||||
|
|
||||||
|
using YGVector = std::vector<YGNodeRef>;
|
||||||
|
|
||||||
|
YG_EXTERN_C_BEGIN
|
||||||
|
|
||||||
|
WIN_EXPORT float YGRoundValueToPixelGrid(
|
||||||
|
const float value,
|
||||||
|
const float pointScaleFactor,
|
||||||
|
const bool forceCeil,
|
||||||
|
const bool forceFloor);
|
||||||
|
|
||||||
|
void YGNodeCalculateLayoutWithContext(
|
||||||
|
YGNodeRef node,
|
||||||
|
float availableWidth,
|
||||||
|
float availableHeight,
|
||||||
|
YGDirection ownerDirection,
|
||||||
|
void* layoutContext);
|
||||||
|
|
||||||
|
void YGSetUsedCachedEntries(size_t);
|
||||||
|
|
||||||
|
YG_EXTERN_C_END
|
||||||
|
|
||||||
|
namespace facebook {
|
||||||
|
namespace yoga {
|
||||||
|
|
||||||
|
inline bool isUndefined(float value) {
|
||||||
|
return std::isnan(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace yoga
|
||||||
|
} // namespace facebook
|
||||||
|
|
||||||
|
using namespace facebook;
|
||||||
|
|
||||||
|
extern const std::array<YGEdge, 4> trailing;
|
||||||
|
extern const std::array<YGEdge, 4> leading;
|
||||||
|
extern const YGValue YGValueUndefined;
|
||||||
|
extern const YGValue YGValueAuto;
|
||||||
|
extern const YGValue YGValueZero;
|
||||||
|
|
||||||
|
struct YGCachedMeasurement {
|
||||||
|
float availableWidth;
|
||||||
|
float availableHeight;
|
||||||
|
YGMeasureMode widthMeasureMode;
|
||||||
|
YGMeasureMode heightMeasureMode;
|
||||||
|
|
||||||
|
float computedWidth;
|
||||||
|
float computedHeight;
|
||||||
|
|
||||||
|
YGCachedMeasurement()
|
||||||
|
: availableWidth(0),
|
||||||
|
availableHeight(0),
|
||||||
|
widthMeasureMode((YGMeasureMode) -1),
|
||||||
|
heightMeasureMode((YGMeasureMode) -1),
|
||||||
|
computedWidth(-1),
|
||||||
|
computedHeight(-1) {}
|
||||||
|
|
||||||
|
bool operator==(YGCachedMeasurement measurement) const {
|
||||||
|
bool isEqual = widthMeasureMode == measurement.widthMeasureMode &&
|
||||||
|
heightMeasureMode == measurement.heightMeasureMode;
|
||||||
|
|
||||||
|
if (!yoga::isUndefined(availableWidth) ||
|
||||||
|
!yoga::isUndefined(measurement.availableWidth)) {
|
||||||
|
isEqual = isEqual && availableWidth == measurement.availableWidth;
|
||||||
|
}
|
||||||
|
if (!yoga::isUndefined(availableHeight) ||
|
||||||
|
!yoga::isUndefined(measurement.availableHeight)) {
|
||||||
|
isEqual = isEqual && availableHeight == measurement.availableHeight;
|
||||||
|
}
|
||||||
|
if (!yoga::isUndefined(computedWidth) ||
|
||||||
|
!yoga::isUndefined(measurement.computedWidth)) {
|
||||||
|
isEqual = isEqual && computedWidth == measurement.computedWidth;
|
||||||
|
}
|
||||||
|
if (!yoga::isUndefined(computedHeight) ||
|
||||||
|
!yoga::isUndefined(measurement.computedHeight)) {
|
||||||
|
isEqual = isEqual && computedHeight == measurement.computedHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isEqual;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// This value was chosen based on empiracle data. Even the most complicated
|
||||||
|
// layouts should not require more than 16 entries to fit within the cache.
|
||||||
|
#define YG_MAX_CACHED_RESULT_COUNT 16
|
||||||
|
|
||||||
|
namespace facebook {
|
||||||
|
namespace yoga {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
template <size_t Size>
|
||||||
|
class Values {
|
||||||
|
private:
|
||||||
|
std::array<CompactValue, Size> values_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Values() = default;
|
||||||
|
explicit Values(const YGValue& defaultValue) noexcept {
|
||||||
|
values_.fill(defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
const CompactValue& operator[](size_t i) const noexcept {
|
||||||
|
return values_[i];
|
||||||
|
}
|
||||||
|
CompactValue& operator[](size_t i) noexcept {
|
||||||
|
return values_[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
template <size_t I>
|
||||||
|
YGValue get() const noexcept {
|
||||||
|
return std::get<I>(values_);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <size_t I>
|
||||||
|
void set(YGValue& value) noexcept {
|
||||||
|
std::get<I>(values_) = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <size_t I>
|
||||||
|
void set(YGValue&& value) noexcept {
|
||||||
|
set<I>(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const Values& other) const noexcept {
|
||||||
|
for (size_t i = 0; i < Size; ++i) {
|
||||||
|
if (values_[i] != other.values_[i]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Values& operator=(const Values& other) = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace yoga
|
||||||
|
} // namespace facebook
|
||||||
|
|
||||||
|
static const float kDefaultFlexGrow = 0.0f;
|
||||||
|
static const float kDefaultFlexShrink = 0.0f;
|
||||||
|
static const float kWebDefaultFlexShrink = 1.0f;
|
||||||
|
|
||||||
|
extern bool YGFloatsEqual(const float a, const float b);
|
||||||
|
extern facebook::yoga::detail::CompactValue YGComputedEdgeValue(
|
||||||
|
const facebook::yoga::detail::Values<
|
||||||
|
facebook::yoga::enums::count<YGEdge>()>& edges,
|
||||||
|
YGEdge edge,
|
||||||
|
facebook::yoga::detail::CompactValue defaultValue);
|
4285
doric-iOS/Pod/Classes/Yoga/yoga/Yoga.cpp
Normal file
4285
doric-iOS/Pod/Classes/Yoga/yoga/Yoga.cpp
Normal file
File diff suppressed because it is too large
Load Diff
430
doric-iOS/Pod/Classes/Yoga/yoga/Yoga.h
Normal file
430
doric-iOS/Pod/Classes/Yoga/yoga/Yoga.h
Normal file
@ -0,0 +1,430 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#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
|
||||||
|
|
||||||
|
#include "YGEnums.h"
|
||||||
|
#include "YGMacros.h"
|
||||||
|
#include "YGValue.h"
|
||||||
|
|
||||||
|
YG_EXTERN_C_BEGIN
|
||||||
|
|
||||||
|
typedef struct YGSize {
|
||||||
|
float width;
|
||||||
|
float height;
|
||||||
|
} YGSize;
|
||||||
|
|
||||||
|
typedef struct YGConfig* YGConfigRef;
|
||||||
|
|
||||||
|
typedef struct YGNode* YGNodeRef;
|
||||||
|
|
||||||
|
typedef YGSize (*YGMeasureFunc)(
|
||||||
|
YGNodeRef node,
|
||||||
|
float width,
|
||||||
|
YGMeasureMode widthMode,
|
||||||
|
float height,
|
||||||
|
YGMeasureMode heightMode);
|
||||||
|
typedef float (
|
||||||
|
*YGBaselineFunc)(YGNodeRef node, const float width, const float height);
|
||||||
|
typedef void (*YGDirtiedFunc)(YGNodeRef node);
|
||||||
|
typedef void (*YGPrintFunc)(YGNodeRef node);
|
||||||
|
typedef void (*YGNodeCleanupFunc)(YGNodeRef node);
|
||||||
|
typedef int (*YGLogger)(
|
||||||
|
const YGConfigRef config,
|
||||||
|
const YGNodeRef node,
|
||||||
|
YGLogLevel level,
|
||||||
|
const char* format,
|
||||||
|
va_list args);
|
||||||
|
typedef YGNodeRef (
|
||||||
|
*YGCloneNodeFunc)(YGNodeRef oldNode, YGNodeRef owner, int childIndex);
|
||||||
|
|
||||||
|
// YGNode
|
||||||
|
WIN_EXPORT YGNodeRef YGNodeNew(void);
|
||||||
|
WIN_EXPORT YGNodeRef YGNodeNewWithConfig(const YGConfigRef config);
|
||||||
|
WIN_EXPORT YGNodeRef YGNodeClone(const YGNodeRef node);
|
||||||
|
WIN_EXPORT void YGNodeFree(const YGNodeRef node);
|
||||||
|
WIN_EXPORT void YGNodeFreeRecursiveWithCleanupFunc(
|
||||||
|
const YGNodeRef node,
|
||||||
|
YGNodeCleanupFunc cleanup);
|
||||||
|
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);
|
||||||
|
WIN_EXPORT void YGNodeRemoveAllChildren(const YGNodeRef node);
|
||||||
|
WIN_EXPORT YGNodeRef YGNodeGetChild(const YGNodeRef node, const uint32_t index);
|
||||||
|
WIN_EXPORT YGNodeRef YGNodeGetOwner(const YGNodeRef node);
|
||||||
|
WIN_EXPORT YGNodeRef YGNodeGetParent(const YGNodeRef node);
|
||||||
|
WIN_EXPORT uint32_t YGNodeGetChildCount(const YGNodeRef node);
|
||||||
|
WIN_EXPORT void YGNodeSetChildren(
|
||||||
|
YGNodeRef const owner,
|
||||||
|
const YGNodeRef children[],
|
||||||
|
const uint32_t count);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeSetIsReferenceBaseline(
|
||||||
|
YGNodeRef node,
|
||||||
|
bool isReferenceBaseline);
|
||||||
|
|
||||||
|
WIN_EXPORT bool YGNodeIsReferenceBaseline(YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeCalculateLayout(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float availableWidth,
|
||||||
|
const float availableHeight,
|
||||||
|
const YGDirection ownerDirection);
|
||||||
|
|
||||||
|
// Mark a node as dirty. Only valid for nodes with a custom measure function
|
||||||
|
// set.
|
||||||
|
//
|
||||||
|
// Yoga knows when to mark all other nodes as dirty but because nodes with
|
||||||
|
// measure functions depend on information not known to Yoga they must perform
|
||||||
|
// this dirty marking manually.
|
||||||
|
WIN_EXPORT void YGNodeMarkDirty(const YGNodeRef node);
|
||||||
|
|
||||||
|
// Marks the current node and all its descendants as dirty.
|
||||||
|
//
|
||||||
|
// Intended to be used for Uoga benchmarks. Don't use in production, as calling
|
||||||
|
// `YGCalculateLayout` will cause the recalculation of each and every node.
|
||||||
|
WIN_EXPORT void YGNodeMarkDirtyAndPropogateToDescendants(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodePrint(const YGNodeRef node, const YGPrintOptions options);
|
||||||
|
|
||||||
|
WIN_EXPORT bool YGFloatIsUndefined(const float value);
|
||||||
|
|
||||||
|
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,
|
||||||
|
const float marginColumn,
|
||||||
|
const YGConfigRef config);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeCopyStyle(
|
||||||
|
const YGNodeRef dstNode,
|
||||||
|
const YGNodeRef srcNode);
|
||||||
|
|
||||||
|
WIN_EXPORT void* YGNodeGetContext(YGNodeRef node);
|
||||||
|
WIN_EXPORT void YGNodeSetContext(YGNodeRef node, void* context);
|
||||||
|
void YGConfigSetPrintTreeFlag(YGConfigRef config, bool enabled);
|
||||||
|
bool YGNodeHasMeasureFunc(YGNodeRef node);
|
||||||
|
WIN_EXPORT void YGNodeSetMeasureFunc(YGNodeRef node, YGMeasureFunc measureFunc);
|
||||||
|
bool YGNodeHasBaselineFunc(YGNodeRef node);
|
||||||
|
void YGNodeSetBaselineFunc(YGNodeRef node, YGBaselineFunc baselineFunc);
|
||||||
|
YGDirtiedFunc YGNodeGetDirtiedFunc(YGNodeRef node);
|
||||||
|
void YGNodeSetDirtiedFunc(YGNodeRef node, YGDirtiedFunc dirtiedFunc);
|
||||||
|
void YGNodeSetPrintFunc(YGNodeRef node, YGPrintFunc printFunc);
|
||||||
|
WIN_EXPORT bool YGNodeGetHasNewLayout(YGNodeRef node);
|
||||||
|
WIN_EXPORT void YGNodeSetHasNewLayout(YGNodeRef node, bool hasNewLayout);
|
||||||
|
YGNodeType YGNodeGetNodeType(YGNodeRef node);
|
||||||
|
void YGNodeSetNodeType(YGNodeRef node, YGNodeType nodeType);
|
||||||
|
WIN_EXPORT bool YGNodeIsDirty(YGNodeRef node);
|
||||||
|
bool YGNodeLayoutGetDidUseLegacyFlag(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetDirection(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGDirection direction);
|
||||||
|
WIN_EXPORT YGDirection YGNodeStyleGetDirection(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetFlexDirection(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGFlexDirection flexDirection);
|
||||||
|
WIN_EXPORT YGFlexDirection YGNodeStyleGetFlexDirection(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetJustifyContent(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGJustify justifyContent);
|
||||||
|
WIN_EXPORT YGJustify YGNodeStyleGetJustifyContent(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetAlignContent(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGAlign alignContent);
|
||||||
|
WIN_EXPORT YGAlign YGNodeStyleGetAlignContent(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetAlignItems(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGAlign alignItems);
|
||||||
|
WIN_EXPORT YGAlign YGNodeStyleGetAlignItems(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetAlignSelf(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGAlign alignSelf);
|
||||||
|
WIN_EXPORT YGAlign YGNodeStyleGetAlignSelf(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetPositionType(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGPositionType positionType);
|
||||||
|
WIN_EXPORT YGPositionType YGNodeStyleGetPositionType(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetFlexWrap(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGWrap flexWrap);
|
||||||
|
WIN_EXPORT YGWrap YGNodeStyleGetFlexWrap(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetOverflow(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGOverflow overflow);
|
||||||
|
WIN_EXPORT YGOverflow YGNodeStyleGetOverflow(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetDisplay(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGDisplay display);
|
||||||
|
WIN_EXPORT YGDisplay YGNodeStyleGetDisplay(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetFlex(const YGNodeRef node, const float flex);
|
||||||
|
WIN_EXPORT float YGNodeStyleGetFlex(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetFlexGrow(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float flexGrow);
|
||||||
|
WIN_EXPORT float YGNodeStyleGetFlexGrow(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetFlexShrink(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float flexShrink);
|
||||||
|
WIN_EXPORT float YGNodeStyleGetFlexShrink(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetFlexBasis(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float flexBasis);
|
||||||
|
WIN_EXPORT void YGNodeStyleSetFlexBasisPercent(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float flexBasis);
|
||||||
|
WIN_EXPORT void YGNodeStyleSetFlexBasisAuto(const YGNodeRef node);
|
||||||
|
WIN_EXPORT YGValue YGNodeStyleGetFlexBasis(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetPosition(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGEdge edge,
|
||||||
|
const float position);
|
||||||
|
WIN_EXPORT void YGNodeStyleSetPositionPercent(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGEdge edge,
|
||||||
|
const float position);
|
||||||
|
WIN_EXPORT YGValue
|
||||||
|
YGNodeStyleGetPosition(const YGNodeRef node, const YGEdge edge);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetMargin(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGEdge edge,
|
||||||
|
const float margin);
|
||||||
|
WIN_EXPORT void YGNodeStyleSetMarginPercent(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGEdge edge,
|
||||||
|
const float margin);
|
||||||
|
WIN_EXPORT void YGNodeStyleSetMarginAuto(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGEdge edge);
|
||||||
|
WIN_EXPORT YGValue
|
||||||
|
YGNodeStyleGetMargin(const YGNodeRef node, const YGEdge edge);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetPadding(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGEdge edge,
|
||||||
|
const float padding);
|
||||||
|
WIN_EXPORT void YGNodeStyleSetPaddingPercent(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGEdge edge,
|
||||||
|
const float padding);
|
||||||
|
WIN_EXPORT YGValue
|
||||||
|
YGNodeStyleGetPadding(const YGNodeRef node, const YGEdge edge);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetBorder(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGEdge edge,
|
||||||
|
const float border);
|
||||||
|
WIN_EXPORT float YGNodeStyleGetBorder(const YGNodeRef node, const YGEdge edge);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetWidth(const YGNodeRef node, const float width);
|
||||||
|
WIN_EXPORT void YGNodeStyleSetWidthPercent(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float width);
|
||||||
|
WIN_EXPORT void YGNodeStyleSetWidthAuto(const YGNodeRef node);
|
||||||
|
WIN_EXPORT YGValue YGNodeStyleGetWidth(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetHeight(const YGNodeRef node, const float height);
|
||||||
|
WIN_EXPORT void YGNodeStyleSetHeightPercent(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float height);
|
||||||
|
WIN_EXPORT void YGNodeStyleSetHeightAuto(const YGNodeRef node);
|
||||||
|
WIN_EXPORT YGValue YGNodeStyleGetHeight(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetMinWidth(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float minWidth);
|
||||||
|
WIN_EXPORT void YGNodeStyleSetMinWidthPercent(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float minWidth);
|
||||||
|
WIN_EXPORT YGValue YGNodeStyleGetMinWidth(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetMinHeight(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float minHeight);
|
||||||
|
WIN_EXPORT void YGNodeStyleSetMinHeightPercent(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float minHeight);
|
||||||
|
WIN_EXPORT YGValue YGNodeStyleGetMinHeight(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetMaxWidth(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float maxWidth);
|
||||||
|
WIN_EXPORT void YGNodeStyleSetMaxWidthPercent(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float maxWidth);
|
||||||
|
WIN_EXPORT YGValue YGNodeStyleGetMaxWidth(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGNodeStyleSetMaxHeight(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float maxHeight);
|
||||||
|
WIN_EXPORT void YGNodeStyleSetMaxHeightPercent(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float maxHeight);
|
||||||
|
WIN_EXPORT YGValue YGNodeStyleGetMaxHeight(const YGNodeRef node);
|
||||||
|
|
||||||
|
// Yoga specific properties, not compatible with flexbox specification Aspect
|
||||||
|
// ratio control the size of the undefined dimension of a node. 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.
|
||||||
|
//
|
||||||
|
// - 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
|
||||||
|
WIN_EXPORT void YGNodeStyleSetAspectRatio(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const float aspectRatio);
|
||||||
|
WIN_EXPORT float YGNodeStyleGetAspectRatio(const YGNodeRef node);
|
||||||
|
|
||||||
|
WIN_EXPORT float YGNodeLayoutGetLeft(const YGNodeRef node);
|
||||||
|
WIN_EXPORT float YGNodeLayoutGetTop(const YGNodeRef node);
|
||||||
|
WIN_EXPORT float YGNodeLayoutGetRight(const YGNodeRef node);
|
||||||
|
WIN_EXPORT float YGNodeLayoutGetBottom(const YGNodeRef node);
|
||||||
|
WIN_EXPORT float YGNodeLayoutGetWidth(const YGNodeRef node);
|
||||||
|
WIN_EXPORT float YGNodeLayoutGetHeight(const YGNodeRef node);
|
||||||
|
WIN_EXPORT YGDirection YGNodeLayoutGetDirection(const YGNodeRef node);
|
||||||
|
WIN_EXPORT bool YGNodeLayoutGetHadOverflow(const YGNodeRef node);
|
||||||
|
bool YGNodeLayoutGetDidLegacyStretchFlagAffectLayout(const YGNodeRef node);
|
||||||
|
|
||||||
|
// Get the computed values for these nodes after performing layout. If they were
|
||||||
|
// set using point values then the returned value will be the same as
|
||||||
|
// YGNodeStyleGetXXX. However if they were set using a percentage value then the
|
||||||
|
// returned value is the computed value used during layout.
|
||||||
|
WIN_EXPORT float YGNodeLayoutGetMargin(const YGNodeRef node, const YGEdge edge);
|
||||||
|
WIN_EXPORT float YGNodeLayoutGetBorder(const YGNodeRef node, const YGEdge edge);
|
||||||
|
WIN_EXPORT float YGNodeLayoutGetPadding(
|
||||||
|
const YGNodeRef node,
|
||||||
|
const YGEdge edge);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGConfigSetLogger(const YGConfigRef config, YGLogger logger);
|
||||||
|
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);
|
||||||
|
// Set this to number of pixels in 1 point to round calculation results If you
|
||||||
|
// want to avoid rounding - set PointScaleFactor to 0
|
||||||
|
WIN_EXPORT void YGConfigSetPointScaleFactor(
|
||||||
|
const YGConfigRef config,
|
||||||
|
const float pixelsInPoint);
|
||||||
|
void YGConfigSetShouldDiffLayoutWithoutLegacyStretchBehaviour(
|
||||||
|
const YGConfigRef config,
|
||||||
|
const bool shouldDiffLayout);
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
|
||||||
|
// YGConfig
|
||||||
|
WIN_EXPORT YGConfigRef YGConfigNew(void);
|
||||||
|
WIN_EXPORT void YGConfigFree(const YGConfigRef config);
|
||||||
|
WIN_EXPORT void YGConfigCopy(const YGConfigRef dest, const YGConfigRef src);
|
||||||
|
WIN_EXPORT int32_t YGConfigGetInstanceCount(void);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGConfigSetExperimentalFeatureEnabled(
|
||||||
|
const YGConfigRef config,
|
||||||
|
const YGExperimentalFeature feature,
|
||||||
|
const bool enabled);
|
||||||
|
WIN_EXPORT bool YGConfigIsExperimentalFeatureEnabled(
|
||||||
|
const YGConfigRef config,
|
||||||
|
const YGExperimentalFeature feature);
|
||||||
|
|
||||||
|
// Using the web defaults is the prefered configuration for new projects. 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);
|
||||||
|
|
||||||
|
WIN_EXPORT void YGConfigSetCloneNodeFunc(
|
||||||
|
const YGConfigRef config,
|
||||||
|
const YGCloneNodeFunc callback);
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
|
||||||
|
WIN_EXPORT float YGRoundValueToPixelGrid(
|
||||||
|
const float value,
|
||||||
|
const float pointScaleFactor,
|
||||||
|
const bool forceCeil,
|
||||||
|
const bool forceFloor);
|
||||||
|
|
||||||
|
YG_EXTERN_C_END
|
||||||
|
|
||||||
|
#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 owner,
|
||||||
|
const std::vector<YGNodeRef>& children);
|
||||||
|
|
||||||
|
#endif
|
63
doric-iOS/Pod/Classes/Yoga/yoga/instrumentation.h
Normal file
63
doric-iOS/Pod/Classes/Yoga/yoga/instrumentation.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#include "YGConfig.h"
|
||||||
|
#include "YGMarker.h"
|
||||||
|
#include "YGNode.h"
|
||||||
|
|
||||||
|
namespace facebook {
|
||||||
|
namespace yoga {
|
||||||
|
namespace marker {
|
||||||
|
|
||||||
|
template <YGMarker MarkerType>
|
||||||
|
class MarkerSection {
|
||||||
|
private:
|
||||||
|
using Data = detail::MarkerData<MarkerType>;
|
||||||
|
|
||||||
|
public:
|
||||||
|
MarkerSection(YGNodeRef node) : MarkerSection{node, node->getConfig()} {}
|
||||||
|
~MarkerSection() {
|
||||||
|
if (endMarker_) {
|
||||||
|
endMarker_(MarkerType, node_, markerData(&data), userData_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
typename Data::type data = {};
|
||||||
|
|
||||||
|
template <typename Ret, typename... Args>
|
||||||
|
static Ret wrap(
|
||||||
|
YGNodeRef node,
|
||||||
|
Ret (YGNode::*method)(Args...),
|
||||||
|
Args... args) {
|
||||||
|
MarkerSection<MarkerType> section{node};
|
||||||
|
return (node->*method)(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
decltype(YGMarkerCallbacks{}.endMarker) endMarker_;
|
||||||
|
YGNodeRef node_;
|
||||||
|
void* userData_;
|
||||||
|
|
||||||
|
MarkerSection(YGNodeRef node, YGConfigRef config)
|
||||||
|
: MarkerSection{node, config ? &config->markerCallbacks : nullptr} {}
|
||||||
|
MarkerSection(YGNodeRef node, YGMarkerCallbacks* callbacks)
|
||||||
|
: endMarker_{callbacks ? callbacks->endMarker : nullptr},
|
||||||
|
node_{node},
|
||||||
|
userData_{
|
||||||
|
callbacks && callbacks->startMarker
|
||||||
|
? callbacks->startMarker(MarkerType, node, markerData(&data))
|
||||||
|
: nullptr} {}
|
||||||
|
|
||||||
|
static YGMarkerData markerData(typename Data::type* d) {
|
||||||
|
YGMarkerData markerData = {};
|
||||||
|
Data::get(markerData) = d;
|
||||||
|
return markerData;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace marker
|
||||||
|
} // namespace yoga
|
||||||
|
} // namespace facebook
|
67
doric-iOS/Pod/Classes/Yoga/yoga/log.cpp
Normal file
67
doric-iOS/Pod/Classes/Yoga/yoga/log.cpp
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
|
#include "Yoga.h"
|
||||||
|
#include "YGConfig.h"
|
||||||
|
#include "YGNode.h"
|
||||||
|
|
||||||
|
namespace facebook {
|
||||||
|
namespace yoga {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
void vlog(
|
||||||
|
YGConfig* config,
|
||||||
|
YGNode* node,
|
||||||
|
YGLogLevel level,
|
||||||
|
void* context,
|
||||||
|
const char* format,
|
||||||
|
va_list args) {
|
||||||
|
YGConfig* logConfig = config != nullptr ? config : YGConfigGetDefault();
|
||||||
|
logConfig->log(logConfig, node, level, context, format, args);
|
||||||
|
|
||||||
|
if (level == YGLogLevelFatal) {
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
void Log::log(
|
||||||
|
YGNode* node,
|
||||||
|
YGLogLevel level,
|
||||||
|
void* context,
|
||||||
|
const char* format,
|
||||||
|
...) noexcept {
|
||||||
|
va_list args;
|
||||||
|
va_start(args, format);
|
||||||
|
vlog(
|
||||||
|
node == nullptr ? nullptr : node->getConfig(),
|
||||||
|
node,
|
||||||
|
level,
|
||||||
|
context,
|
||||||
|
format,
|
||||||
|
args);
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Log::log(
|
||||||
|
YGConfig* config,
|
||||||
|
YGLogLevel level,
|
||||||
|
void* context,
|
||||||
|
const char* format,
|
||||||
|
...) noexcept {
|
||||||
|
va_list args;
|
||||||
|
va_start(args, format);
|
||||||
|
vlog(config, nullptr, level, context, format, args);
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace yoga
|
||||||
|
} // namespace facebook
|
37
doric-iOS/Pod/Classes/Yoga/yoga/log.h
Normal file
37
doric-iOS/Pod/Classes/Yoga/yoga/log.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "YGEnums.h"
|
||||||
|
|
||||||
|
struct YGNode;
|
||||||
|
struct YGConfig;
|
||||||
|
|
||||||
|
namespace facebook {
|
||||||
|
namespace yoga {
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
struct Log {
|
||||||
|
static void log(
|
||||||
|
YGNode* node,
|
||||||
|
YGLogLevel level,
|
||||||
|
void*,
|
||||||
|
const char* message,
|
||||||
|
...) noexcept;
|
||||||
|
|
||||||
|
static void log(
|
||||||
|
YGConfig* config,
|
||||||
|
YGLogLevel level,
|
||||||
|
void*,
|
||||||
|
const char* format,
|
||||||
|
...) noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace yoga
|
||||||
|
} // namespace facebook
|
Reference in New Issue
Block a user