2014-10-29 08:01:22 -07:00
|
|
|
/**
|
|
|
|
* Copyright (c) 2014, Facebook, Inc.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* This source code is licensed under the BSD-style license found in the
|
|
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
|
|
*/
|
|
|
|
|
2014-04-18 16:00:53 -07:00
|
|
|
#ifndef __LAYOUT_H
|
|
|
|
#define __LAYOUT_H
|
|
|
|
|
2014-04-28 12:34:04 -07:00
|
|
|
#include <math.h>
|
2015-05-05 18:07:06 +08:00
|
|
|
#ifndef __cplusplus
|
2014-09-11 09:23:30 -07:00
|
|
|
#include <stdbool.h>
|
2015-05-05 18:07:06 +08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
// Not defined in MSVC++
|
|
|
|
#ifndef NAN
|
|
|
|
static const unsigned long __nan[2] = {0xffffffff, 0x7fffffff};
|
|
|
|
#define NAN (*(const float *)__nan)
|
|
|
|
#endif
|
|
|
|
|
2014-04-26 12:16:27 -07:00
|
|
|
#define CSS_UNDEFINED NAN
|
2014-04-18 16:00:53 -07:00
|
|
|
|
2015-05-06 21:22:44 +01:00
|
|
|
typedef enum {
|
|
|
|
CSS_DIRECTION_INHERIT = 0,
|
|
|
|
CSS_DIRECTION_LTR,
|
|
|
|
CSS_DIRECTION_RTL
|
|
|
|
} css_direction_t;
|
|
|
|
|
2014-04-18 16:00:53 -07:00
|
|
|
typedef enum {
|
|
|
|
CSS_FLEX_DIRECTION_COLUMN = 0,
|
2015-05-06 21:22:44 +01:00
|
|
|
CSS_FLEX_DIRECTION_COLUMN_REVERSE,
|
|
|
|
CSS_FLEX_DIRECTION_ROW,
|
|
|
|
CSS_FLEX_DIRECTION_ROW_REVERSE
|
2014-04-18 16:00:53 -07:00
|
|
|
} css_flex_direction_t;
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
CSS_JUSTIFY_FLEX_START = 0,
|
|
|
|
CSS_JUSTIFY_CENTER,
|
|
|
|
CSS_JUSTIFY_FLEX_END,
|
|
|
|
CSS_JUSTIFY_SPACE_BETWEEN,
|
|
|
|
CSS_JUSTIFY_SPACE_AROUND
|
|
|
|
} css_justify_t;
|
|
|
|
|
Alter layout engine to conform closer to W3C spec
The primary goals of this change are:
- Better conformance to the W3C flexbox standard (https://www.w3.org/TR/css-flexbox-1/)
and a clear articulation of the areas where it deviates from the spec.
- Support for flex-shrink.
- Conformance with layout effects of "overflow: hidden".
Specifically, here are the limitations of this implementation as compared to the W3C
flexbox standard (this is also documented in Layout.js):
- Display property is always assumed to be 'flex' except for Text nodes, which
are assumed to be 'inline-flex'.
- The 'zIndex' property (or any form of z ordering) is not supported. Nodes are
stacked in document order.
- The 'order' property is not supported. The order of flex items is always defined
by document order.
- The 'visibility' property is always assumed to be 'visible'. Values of 'collapse'
and 'hidden' are not supported.
- The 'wrap' property supports only 'nowrap' (which is the default) or 'wrap'. The
rarely-used 'wrap-reverse' is not supported.
- Rather than allowing arbitrary combinations of flexGrow, flexShrink and
flexBasis, this algorithm supports only the three most common combinations:
- flex: 0 is equiavlent to flex: 0 0 auto
- flex: n (where n is a positive value) is equivalent to flex: n 0 0
- flex: -1 (or any negative value) is equivalent to flex: 0 1 auto
- Margins cannot be specified as 'auto'. They must be specified in terms of pixel
values, and the default value is 0.
- The 'baseline' value is not supported for alignItems and alignSelf properties.
- Values of width, maxWidth, minWidth, height, maxHeight and minHeight must be
specified as pixel values, not as percentages.
- There is no support for calculation of dimensions based on intrinsic aspect ratios
(e.g. images).
- There is no support for forced breaks.
- It does not support vertical inline directions (top-to-bottom or bottom-to-top text).
And here is how the implementation deviates from the standard (this is also documented in
Layout.js):
- Section 4.5 of the spec indicates that all flex items have a default minimum
main size. For text blocks, for example, this is the width of the widest word.
Calculating the minimum width is expensive, so we forego it and assume a default
minimum main size of 0.
- Min/Max sizes in the main axis are not honored when resolving flexible lengths.
- The spec indicates that the default value for 'flexDirection' is 'row', but
the algorithm below assumes a default of 'column'.
2016-04-26 16:35:46 -07:00
|
|
|
typedef enum {
|
|
|
|
CSS_OVERFLOW_VISIBLE = 0,
|
|
|
|
CSS_OVERFLOW_HIDDEN
|
|
|
|
} css_overflow_t;
|
|
|
|
|
2014-04-18 16:00:53 -07:00
|
|
|
// Note: auto is only a valid value for alignSelf. It is NOT a valid value for
|
|
|
|
// alignItems.
|
|
|
|
typedef enum {
|
|
|
|
CSS_ALIGN_AUTO = 0,
|
|
|
|
CSS_ALIGN_FLEX_START,
|
|
|
|
CSS_ALIGN_CENTER,
|
|
|
|
CSS_ALIGN_FLEX_END,
|
|
|
|
CSS_ALIGN_STRETCH
|
|
|
|
} css_align_t;
|
|
|
|
|
2014-04-22 13:18:05 -07:00
|
|
|
typedef enum {
|
|
|
|
CSS_POSITION_RELATIVE = 0,
|
|
|
|
CSS_POSITION_ABSOLUTE
|
|
|
|
} css_position_type_t;
|
|
|
|
|
2014-12-12 12:03:31 +00:00
|
|
|
typedef enum {
|
|
|
|
CSS_NOWRAP = 0,
|
|
|
|
CSS_WRAP
|
|
|
|
} css_wrap_type_t;
|
|
|
|
|
2014-04-18 16:00:53 -07:00
|
|
|
// Note: left and top are shared between position[2] and position[4], so
|
|
|
|
// they have to be before right and bottom.
|
|
|
|
typedef enum {
|
|
|
|
CSS_LEFT = 0,
|
|
|
|
CSS_TOP,
|
|
|
|
CSS_RIGHT,
|
2014-09-30 13:18:03 -07:00
|
|
|
CSS_BOTTOM,
|
2015-05-11 15:39:02 +01:00
|
|
|
CSS_START,
|
|
|
|
CSS_END,
|
2014-09-30 13:18:03 -07:00
|
|
|
CSS_POSITION_COUNT
|
2014-04-18 16:00:53 -07:00
|
|
|
} css_position_t;
|
|
|
|
|
2016-01-06 16:56:56 +00:00
|
|
|
typedef enum {
|
|
|
|
CSS_MEASURE_MODE_UNDEFINED = 0,
|
|
|
|
CSS_MEASURE_MODE_EXACTLY,
|
Alter layout engine to conform closer to W3C spec
The primary goals of this change are:
- Better conformance to the W3C flexbox standard (https://www.w3.org/TR/css-flexbox-1/)
and a clear articulation of the areas where it deviates from the spec.
- Support for flex-shrink.
- Conformance with layout effects of "overflow: hidden".
Specifically, here are the limitations of this implementation as compared to the W3C
flexbox standard (this is also documented in Layout.js):
- Display property is always assumed to be 'flex' except for Text nodes, which
are assumed to be 'inline-flex'.
- The 'zIndex' property (or any form of z ordering) is not supported. Nodes are
stacked in document order.
- The 'order' property is not supported. The order of flex items is always defined
by document order.
- The 'visibility' property is always assumed to be 'visible'. Values of 'collapse'
and 'hidden' are not supported.
- The 'wrap' property supports only 'nowrap' (which is the default) or 'wrap'. The
rarely-used 'wrap-reverse' is not supported.
- Rather than allowing arbitrary combinations of flexGrow, flexShrink and
flexBasis, this algorithm supports only the three most common combinations:
- flex: 0 is equiavlent to flex: 0 0 auto
- flex: n (where n is a positive value) is equivalent to flex: n 0 0
- flex: -1 (or any negative value) is equivalent to flex: 0 1 auto
- Margins cannot be specified as 'auto'. They must be specified in terms of pixel
values, and the default value is 0.
- The 'baseline' value is not supported for alignItems and alignSelf properties.
- Values of width, maxWidth, minWidth, height, maxHeight and minHeight must be
specified as pixel values, not as percentages.
- There is no support for calculation of dimensions based on intrinsic aspect ratios
(e.g. images).
- There is no support for forced breaks.
- It does not support vertical inline directions (top-to-bottom or bottom-to-top text).
And here is how the implementation deviates from the standard (this is also documented in
Layout.js):
- Section 4.5 of the spec indicates that all flex items have a default minimum
main size. For text blocks, for example, this is the width of the widest word.
Calculating the minimum width is expensive, so we forego it and assume a default
minimum main size of 0.
- Min/Max sizes in the main axis are not honored when resolving flexible lengths.
- The spec indicates that the default value for 'flexDirection' is 'row', but
the algorithm below assumes a default of 'column'.
2016-04-26 16:35:46 -07:00
|
|
|
CSS_MEASURE_MODE_AT_MOST,
|
|
|
|
CSS_MEASURE_MODE_COUNT
|
2016-01-06 16:56:56 +00:00
|
|
|
} css_measure_mode_t;
|
|
|
|
|
2014-04-18 16:00:53 -07:00
|
|
|
typedef enum {
|
|
|
|
CSS_WIDTH = 0,
|
|
|
|
CSS_HEIGHT
|
|
|
|
} css_dimension_t;
|
|
|
|
|
Alter layout engine to conform closer to W3C spec
The primary goals of this change are:
- Better conformance to the W3C flexbox standard (https://www.w3.org/TR/css-flexbox-1/)
and a clear articulation of the areas where it deviates from the spec.
- Support for flex-shrink.
- Conformance with layout effects of "overflow: hidden".
Specifically, here are the limitations of this implementation as compared to the W3C
flexbox standard (this is also documented in Layout.js):
- Display property is always assumed to be 'flex' except for Text nodes, which
are assumed to be 'inline-flex'.
- The 'zIndex' property (or any form of z ordering) is not supported. Nodes are
stacked in document order.
- The 'order' property is not supported. The order of flex items is always defined
by document order.
- The 'visibility' property is always assumed to be 'visible'. Values of 'collapse'
and 'hidden' are not supported.
- The 'wrap' property supports only 'nowrap' (which is the default) or 'wrap'. The
rarely-used 'wrap-reverse' is not supported.
- Rather than allowing arbitrary combinations of flexGrow, flexShrink and
flexBasis, this algorithm supports only the three most common combinations:
- flex: 0 is equiavlent to flex: 0 0 auto
- flex: n (where n is a positive value) is equivalent to flex: n 0 0
- flex: -1 (or any negative value) is equivalent to flex: 0 1 auto
- Margins cannot be specified as 'auto'. They must be specified in terms of pixel
values, and the default value is 0.
- The 'baseline' value is not supported for alignItems and alignSelf properties.
- Values of width, maxWidth, minWidth, height, maxHeight and minHeight must be
specified as pixel values, not as percentages.
- There is no support for calculation of dimensions based on intrinsic aspect ratios
(e.g. images).
- There is no support for forced breaks.
- It does not support vertical inline directions (top-to-bottom or bottom-to-top text).
And here is how the implementation deviates from the standard (this is also documented in
Layout.js):
- Section 4.5 of the spec indicates that all flex items have a default minimum
main size. For text blocks, for example, this is the width of the widest word.
Calculating the minimum width is expensive, so we forego it and assume a default
minimum main size of 0.
- Min/Max sizes in the main axis are not honored when resolving flexible lengths.
- The spec indicates that the default value for 'flexDirection' is 'row', but
the algorithm below assumes a default of 'column'.
2016-04-26 16:35:46 -07:00
|
|
|
typedef struct {
|
|
|
|
float available_width;
|
|
|
|
float available_height;
|
|
|
|
css_measure_mode_t width_measure_mode;
|
|
|
|
css_measure_mode_t height_measure_mode;
|
|
|
|
|
|
|
|
float computed_width;
|
|
|
|
float computed_height;
|
|
|
|
} css_cached_measurement_t;
|
|
|
|
|
|
|
|
enum {
|
|
|
|
// 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.
|
|
|
|
CSS_MAX_CACHED_RESULT_COUNT = 16
|
|
|
|
};
|
|
|
|
|
2014-04-18 16:00:53 -07:00
|
|
|
typedef struct {
|
2015-05-06 21:22:44 +01:00
|
|
|
float position[4];
|
2014-04-18 16:00:53 -07:00
|
|
|
float dimensions[2];
|
2015-05-20 11:12:24 +01:00
|
|
|
css_direction_t direction;
|
2014-09-11 09:23:30 -07:00
|
|
|
|
Alter layout engine to conform closer to W3C spec
The primary goals of this change are:
- Better conformance to the W3C flexbox standard (https://www.w3.org/TR/css-flexbox-1/)
and a clear articulation of the areas where it deviates from the spec.
- Support for flex-shrink.
- Conformance with layout effects of "overflow: hidden".
Specifically, here are the limitations of this implementation as compared to the W3C
flexbox standard (this is also documented in Layout.js):
- Display property is always assumed to be 'flex' except for Text nodes, which
are assumed to be 'inline-flex'.
- The 'zIndex' property (or any form of z ordering) is not supported. Nodes are
stacked in document order.
- The 'order' property is not supported. The order of flex items is always defined
by document order.
- The 'visibility' property is always assumed to be 'visible'. Values of 'collapse'
and 'hidden' are not supported.
- The 'wrap' property supports only 'nowrap' (which is the default) or 'wrap'. The
rarely-used 'wrap-reverse' is not supported.
- Rather than allowing arbitrary combinations of flexGrow, flexShrink and
flexBasis, this algorithm supports only the three most common combinations:
- flex: 0 is equiavlent to flex: 0 0 auto
- flex: n (where n is a positive value) is equivalent to flex: n 0 0
- flex: -1 (or any negative value) is equivalent to flex: 0 1 auto
- Margins cannot be specified as 'auto'. They must be specified in terms of pixel
values, and the default value is 0.
- The 'baseline' value is not supported for alignItems and alignSelf properties.
- Values of width, maxWidth, minWidth, height, maxHeight and minHeight must be
specified as pixel values, not as percentages.
- There is no support for calculation of dimensions based on intrinsic aspect ratios
(e.g. images).
- There is no support for forced breaks.
- It does not support vertical inline directions (top-to-bottom or bottom-to-top text).
And here is how the implementation deviates from the standard (this is also documented in
Layout.js):
- Section 4.5 of the spec indicates that all flex items have a default minimum
main size. For text blocks, for example, this is the width of the widest word.
Calculating the minimum width is expensive, so we forego it and assume a default
minimum main size of 0.
- Min/Max sizes in the main axis are not honored when resolving flexible lengths.
- The spec indicates that the default value for 'flexDirection' is 'row', but
the algorithm below assumes a default of 'column'.
2016-04-26 16:35:46 -07:00
|
|
|
float flex_basis;
|
|
|
|
|
2014-09-11 09:23:30 -07:00
|
|
|
// Instead of recomputing the entire layout every single time, we
|
|
|
|
// cache some information to break early when nothing changed
|
|
|
|
bool should_update;
|
Alter layout engine to conform closer to W3C spec
The primary goals of this change are:
- Better conformance to the W3C flexbox standard (https://www.w3.org/TR/css-flexbox-1/)
and a clear articulation of the areas where it deviates from the spec.
- Support for flex-shrink.
- Conformance with layout effects of "overflow: hidden".
Specifically, here are the limitations of this implementation as compared to the W3C
flexbox standard (this is also documented in Layout.js):
- Display property is always assumed to be 'flex' except for Text nodes, which
are assumed to be 'inline-flex'.
- The 'zIndex' property (or any form of z ordering) is not supported. Nodes are
stacked in document order.
- The 'order' property is not supported. The order of flex items is always defined
by document order.
- The 'visibility' property is always assumed to be 'visible'. Values of 'collapse'
and 'hidden' are not supported.
- The 'wrap' property supports only 'nowrap' (which is the default) or 'wrap'. The
rarely-used 'wrap-reverse' is not supported.
- Rather than allowing arbitrary combinations of flexGrow, flexShrink and
flexBasis, this algorithm supports only the three most common combinations:
- flex: 0 is equiavlent to flex: 0 0 auto
- flex: n (where n is a positive value) is equivalent to flex: n 0 0
- flex: -1 (or any negative value) is equivalent to flex: 0 1 auto
- Margins cannot be specified as 'auto'. They must be specified in terms of pixel
values, and the default value is 0.
- The 'baseline' value is not supported for alignItems and alignSelf properties.
- Values of width, maxWidth, minWidth, height, maxHeight and minHeight must be
specified as pixel values, not as percentages.
- There is no support for calculation of dimensions based on intrinsic aspect ratios
(e.g. images).
- There is no support for forced breaks.
- It does not support vertical inline directions (top-to-bottom or bottom-to-top text).
And here is how the implementation deviates from the standard (this is also documented in
Layout.js):
- Section 4.5 of the spec indicates that all flex items have a default minimum
main size. For text blocks, for example, this is the width of the widest word.
Calculating the minimum width is expensive, so we forego it and assume a default
minimum main size of 0.
- Min/Max sizes in the main axis are not honored when resolving flexible lengths.
- The spec indicates that the default value for 'flexDirection' is 'row', but
the algorithm below assumes a default of 'column'.
2016-04-26 16:35:46 -07:00
|
|
|
int generation_count;
|
|
|
|
css_direction_t last_parent_direction;
|
|
|
|
|
|
|
|
int next_cached_measurements_index;
|
|
|
|
css_cached_measurement_t cached_measurements[CSS_MAX_CACHED_RESULT_COUNT];
|
|
|
|
float measured_dimensions[2];
|
|
|
|
|
|
|
|
css_cached_measurement_t cached_layout;
|
2014-04-18 16:00:53 -07:00
|
|
|
} css_layout_t;
|
|
|
|
|
2014-04-28 12:34:04 -07:00
|
|
|
typedef struct {
|
|
|
|
float dimensions[2];
|
|
|
|
} css_dim_t;
|
|
|
|
|
2014-04-18 16:00:53 -07:00
|
|
|
typedef struct {
|
2015-05-06 21:22:44 +01:00
|
|
|
css_direction_t direction;
|
2014-04-18 16:00:53 -07:00
|
|
|
css_flex_direction_t flex_direction;
|
|
|
|
css_justify_t justify_content;
|
2015-05-06 15:14:57 +08:00
|
|
|
css_align_t align_content;
|
2014-04-18 16:00:53 -07:00
|
|
|
css_align_t align_items;
|
|
|
|
css_align_t align_self;
|
2014-04-22 13:18:05 -07:00
|
|
|
css_position_type_t position_type;
|
2014-12-12 12:03:31 +00:00
|
|
|
css_wrap_type_t flex_wrap;
|
Alter layout engine to conform closer to W3C spec
The primary goals of this change are:
- Better conformance to the W3C flexbox standard (https://www.w3.org/TR/css-flexbox-1/)
and a clear articulation of the areas where it deviates from the spec.
- Support for flex-shrink.
- Conformance with layout effects of "overflow: hidden".
Specifically, here are the limitations of this implementation as compared to the W3C
flexbox standard (this is also documented in Layout.js):
- Display property is always assumed to be 'flex' except for Text nodes, which
are assumed to be 'inline-flex'.
- The 'zIndex' property (or any form of z ordering) is not supported. Nodes are
stacked in document order.
- The 'order' property is not supported. The order of flex items is always defined
by document order.
- The 'visibility' property is always assumed to be 'visible'. Values of 'collapse'
and 'hidden' are not supported.
- The 'wrap' property supports only 'nowrap' (which is the default) or 'wrap'. The
rarely-used 'wrap-reverse' is not supported.
- Rather than allowing arbitrary combinations of flexGrow, flexShrink and
flexBasis, this algorithm supports only the three most common combinations:
- flex: 0 is equiavlent to flex: 0 0 auto
- flex: n (where n is a positive value) is equivalent to flex: n 0 0
- flex: -1 (or any negative value) is equivalent to flex: 0 1 auto
- Margins cannot be specified as 'auto'. They must be specified in terms of pixel
values, and the default value is 0.
- The 'baseline' value is not supported for alignItems and alignSelf properties.
- Values of width, maxWidth, minWidth, height, maxHeight and minHeight must be
specified as pixel values, not as percentages.
- There is no support for calculation of dimensions based on intrinsic aspect ratios
(e.g. images).
- There is no support for forced breaks.
- It does not support vertical inline directions (top-to-bottom or bottom-to-top text).
And here is how the implementation deviates from the standard (this is also documented in
Layout.js):
- Section 4.5 of the spec indicates that all flex items have a default minimum
main size. For text blocks, for example, this is the width of the widest word.
Calculating the minimum width is expensive, so we forego it and assume a default
minimum main size of 0.
- Min/Max sizes in the main axis are not honored when resolving flexible lengths.
- The spec indicates that the default value for 'flexDirection' is 'row', but
the algorithm below assumes a default of 'column'.
2016-04-26 16:35:46 -07:00
|
|
|
css_overflow_t overflow;
|
2014-09-11 09:23:30 -07:00
|
|
|
float flex;
|
2015-05-11 15:39:02 +01:00
|
|
|
float margin[6];
|
2014-04-22 14:59:59 -07:00
|
|
|
float position[4];
|
|
|
|
/**
|
|
|
|
* You should skip all the rules that contain negative values for the
|
|
|
|
* following attributes. For example:
|
|
|
|
* {padding: 10, paddingLeft: -5}
|
|
|
|
* should output:
|
|
|
|
* {left: 10 ...}
|
|
|
|
* the following two are incorrect:
|
|
|
|
* {left: -5 ...}
|
|
|
|
* {left: 0 ...}
|
|
|
|
*/
|
2015-05-11 15:39:02 +01:00
|
|
|
float padding[6];
|
|
|
|
float border[6];
|
2014-04-18 16:00:53 -07:00
|
|
|
float dimensions[2];
|
2015-03-31 17:27:13 +08:00
|
|
|
float minDimensions[2];
|
|
|
|
float maxDimensions[2];
|
2014-04-18 16:00:53 -07:00
|
|
|
} css_style_t;
|
|
|
|
|
2015-09-04 17:37:07 +01:00
|
|
|
typedef struct css_node css_node_t;
|
|
|
|
struct css_node {
|
2014-04-18 16:00:53 -07:00
|
|
|
css_style_t style;
|
|
|
|
css_layout_t layout;
|
|
|
|
int children_count;
|
2015-05-06 15:14:57 +08:00
|
|
|
int line_index;
|
2014-06-11 21:00:57 -07:00
|
|
|
|
Alter layout engine to conform closer to W3C spec
The primary goals of this change are:
- Better conformance to the W3C flexbox standard (https://www.w3.org/TR/css-flexbox-1/)
and a clear articulation of the areas where it deviates from the spec.
- Support for flex-shrink.
- Conformance with layout effects of "overflow: hidden".
Specifically, here are the limitations of this implementation as compared to the W3C
flexbox standard (this is also documented in Layout.js):
- Display property is always assumed to be 'flex' except for Text nodes, which
are assumed to be 'inline-flex'.
- The 'zIndex' property (or any form of z ordering) is not supported. Nodes are
stacked in document order.
- The 'order' property is not supported. The order of flex items is always defined
by document order.
- The 'visibility' property is always assumed to be 'visible'. Values of 'collapse'
and 'hidden' are not supported.
- The 'wrap' property supports only 'nowrap' (which is the default) or 'wrap'. The
rarely-used 'wrap-reverse' is not supported.
- Rather than allowing arbitrary combinations of flexGrow, flexShrink and
flexBasis, this algorithm supports only the three most common combinations:
- flex: 0 is equiavlent to flex: 0 0 auto
- flex: n (where n is a positive value) is equivalent to flex: n 0 0
- flex: -1 (or any negative value) is equivalent to flex: 0 1 auto
- Margins cannot be specified as 'auto'. They must be specified in terms of pixel
values, and the default value is 0.
- The 'baseline' value is not supported for alignItems and alignSelf properties.
- Values of width, maxWidth, minWidth, height, maxHeight and minHeight must be
specified as pixel values, not as percentages.
- There is no support for calculation of dimensions based on intrinsic aspect ratios
(e.g. images).
- There is no support for forced breaks.
- It does not support vertical inline directions (top-to-bottom or bottom-to-top text).
And here is how the implementation deviates from the standard (this is also documented in
Layout.js):
- Section 4.5 of the spec indicates that all flex items have a default minimum
main size. For text blocks, for example, this is the width of the widest word.
Calculating the minimum width is expensive, so we forego it and assume a default
minimum main size of 0.
- Min/Max sizes in the main axis are not honored when resolving flexible lengths.
- The spec indicates that the default value for 'flexDirection' is 'row', but
the algorithm below assumes a default of 'column'.
2016-04-26 16:35:46 -07:00
|
|
|
css_node_t* next_child;
|
2015-09-04 17:37:07 +01:00
|
|
|
|
2016-01-06 16:56:56 +00:00
|
|
|
css_dim_t (*measure)(void *context, float width, css_measure_mode_t widthMode, float height, css_measure_mode_t heightMode);
|
2014-06-11 21:00:57 -07:00
|
|
|
void (*print)(void *context);
|
2014-09-11 09:23:30 -07:00
|
|
|
struct css_node* (*get_child)(void *context, int i);
|
|
|
|
bool (*is_dirty)(void *context);
|
2016-06-03 15:38:08 +01:00
|
|
|
bool (*is_text_node)(void *context);
|
2014-06-11 21:00:57 -07:00
|
|
|
void *context;
|
2015-09-04 17:37:07 +01:00
|
|
|
};
|
2014-04-18 16:00:53 -07:00
|
|
|
|
|
|
|
// Lifecycle of nodes and children
|
2014-05-16 18:04:24 -07:00
|
|
|
css_node_t *new_css_node(void);
|
2014-09-11 09:23:30 -07:00
|
|
|
void init_css_node(css_node_t *node);
|
2014-04-18 16:00:53 -07:00
|
|
|
void free_css_node(css_node_t *node);
|
|
|
|
|
|
|
|
// Print utilities
|
2014-06-04 10:51:23 -07:00
|
|
|
typedef enum {
|
|
|
|
CSS_PRINT_LAYOUT = 1,
|
2014-09-11 09:23:30 -07:00
|
|
|
CSS_PRINT_STYLE = 2,
|
|
|
|
CSS_PRINT_CHILDREN = 4,
|
2014-06-04 10:51:23 -07:00
|
|
|
} css_print_options_t;
|
|
|
|
void print_css_node(css_node_t *node, css_print_options_t options);
|
2014-04-18 16:00:53 -07:00
|
|
|
|
|
|
|
// Function that computes the layout!
|
Alter layout engine to conform closer to W3C spec
The primary goals of this change are:
- Better conformance to the W3C flexbox standard (https://www.w3.org/TR/css-flexbox-1/)
and a clear articulation of the areas where it deviates from the spec.
- Support for flex-shrink.
- Conformance with layout effects of "overflow: hidden".
Specifically, here are the limitations of this implementation as compared to the W3C
flexbox standard (this is also documented in Layout.js):
- Display property is always assumed to be 'flex' except for Text nodes, which
are assumed to be 'inline-flex'.
- The 'zIndex' property (or any form of z ordering) is not supported. Nodes are
stacked in document order.
- The 'order' property is not supported. The order of flex items is always defined
by document order.
- The 'visibility' property is always assumed to be 'visible'. Values of 'collapse'
and 'hidden' are not supported.
- The 'wrap' property supports only 'nowrap' (which is the default) or 'wrap'. The
rarely-used 'wrap-reverse' is not supported.
- Rather than allowing arbitrary combinations of flexGrow, flexShrink and
flexBasis, this algorithm supports only the three most common combinations:
- flex: 0 is equiavlent to flex: 0 0 auto
- flex: n (where n is a positive value) is equivalent to flex: n 0 0
- flex: -1 (or any negative value) is equivalent to flex: 0 1 auto
- Margins cannot be specified as 'auto'. They must be specified in terms of pixel
values, and the default value is 0.
- The 'baseline' value is not supported for alignItems and alignSelf properties.
- Values of width, maxWidth, minWidth, height, maxHeight and minHeight must be
specified as pixel values, not as percentages.
- There is no support for calculation of dimensions based on intrinsic aspect ratios
(e.g. images).
- There is no support for forced breaks.
- It does not support vertical inline directions (top-to-bottom or bottom-to-top text).
And here is how the implementation deviates from the standard (this is also documented in
Layout.js):
- Section 4.5 of the spec indicates that all flex items have a default minimum
main size. For text blocks, for example, this is the width of the widest word.
Calculating the minimum width is expensive, so we forego it and assume a default
minimum main size of 0.
- Min/Max sizes in the main axis are not honored when resolving flexible lengths.
- The spec indicates that the default value for 'flexDirection' is 'row', but
the algorithm below assumes a default of 'column'.
2016-04-26 16:35:46 -07:00
|
|
|
void layoutNode(css_node_t *node, float availableWidth, float availableHeight, css_direction_t parentDirection);
|
|
|
|
bool isUndefined(float value);
|
2014-04-18 16:00:53 -07:00
|
|
|
|
|
|
|
#endif
|