diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2022-10-19 21:31:15 +0100 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2022-10-23 17:25:52 +0100 |
commit | 480b8a0ff0ba40b3cc4364b7cd339fe755710e9c (patch) | |
tree | 8a5ac9a2f8c0b638afec646c5fe1fe67baeaffe6 /content/handlers/html/layout_flex.c | |
parent | 628d6db75932a61ebf9a3f4513f5a9d209bd9515 (diff) | |
download | netsurf-480b8a0ff0ba40b3cc4364b7cd339fe755710e9c.tar.gz netsurf-480b8a0ff0ba40b3cc4364b7cd339fe755710e9c.tar.bz2 |
WIP: Flex
Diffstat (limited to 'content/handlers/html/layout_flex.c')
-rw-r--r-- | content/handlers/html/layout_flex.c | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/content/handlers/html/layout_flex.c b/content/handlers/html/layout_flex.c index 12ecfe603..8b789b820 100644 --- a/content/handlers/html/layout_flex.c +++ b/content/handlers/html/layout_flex.c @@ -183,7 +183,10 @@ static inline bool layout_flex__base_and_main_sizes( int available_width) { struct box *b = item->box; - int delta_outer_main = lh__delta_outer_main(b); + int delta_outer_main = lh__delta_outer_main(ctx->flex, b); + + NSLOG(flex, WARNING, "box %p: delta_outer_main: %i", + b, delta_outer_main); if (item->basis == CSS_FLEX_BASIS_SET) { if (item->basis_unit == CSS_UNIT_PCT) { @@ -206,7 +209,7 @@ static inline bool layout_flex__base_and_main_sizes( if (ctx->horizontal == false) { if (b->width == AUTO) { b->width = min(available_width, b->max_width); - b->width -= lh__delta_outer_cross(b); + b->width -= lh__delta_outer_width(b); } if (!layout_flex_item(ctx, item, available_width)) { @@ -217,7 +220,7 @@ static inline bool layout_flex__base_and_main_sizes( if (item->base_size != AUTO) { layout_handle_box_sizing(ctx->unit_len_ctx, b, - available_width, true, + available_width, ctx->horizontal, &item->base_size); } else { if (ctx->horizontal == false) { @@ -336,14 +339,14 @@ static struct flex_line_data *layout_flex__build_line(struct flex_ctx *ctx, int main; main = ctx->horizontal ? b->max_width : b->height; - main += lh__delta_outer_main(b); + main += lh__delta_outer_main(ctx->flex, b); if (ctx->wrap == CSS_FLEX_WRAP_NOWRAP || - lh__box_is_absolute(item->box) || - main == 0 || main + used_main <= available_main || + lh__box_is_absolute(item->box) || available_main == AUTO || - line->count == 0) { + line->count == 0 || + main == 0) { line->main_size += item->main_size; item->line = ctx->line.count; used_main += main; @@ -379,10 +382,10 @@ static inline int layout_flex__remaining_free_space( struct flex_line_data *line, css_fixed *unfrozen_factor_sum, int initial_free_space, - int available_width, + int available_space, bool grow) { - int remaining_free_space = available_width; + int remaining_free_space = available_space; size_t item_count = line->first + line->count; *unfrozen_factor_sum = 0; @@ -620,13 +623,24 @@ static bool layout_flex__resolve_line( { bool grow = (line->main_size < available_width); size_t item_count = line->first + line->count; - int initial_free_space = available_width; + int available_space = available_width; + int initial_free_space; + + available_space = available_width; + if (ctx->horizontal == false) { + available_space = ctx->flex->height; + if (available_space == AUTO) { + available_space = INT_MAX; + } + } + + initial_free_space = available_space; NSLOG(flex, WARNING, "box %p: line %zu: first: %zu, count: %zu", ctx->flex, line - ctx->line.data, line->first, line->count); - NSLOG(flex, WARNING, "Line main_size: %i, available_width: %i", - line->main_size, available_width); + NSLOG(flex, WARNING, "Line main_size: %i, available_space: %i", + line->main_size, available_space); for (size_t i = line->first; i < item_count; i++) { struct flex_item_data *item = &ctx->item.data[i]; @@ -666,7 +680,7 @@ static bool layout_flex__resolve_line( /* b */ remaining_free_space = layout_flex__remaining_free_space(ctx, line, &unfrozen_factor_sum, initial_free_space, - available_width, grow); + available_space, grow); /* c */ if (remaining_free_space != 0) { @@ -781,15 +795,21 @@ bool layout_flex(struct box *flex, int available_width, calculate_mbp_width(ctx->unit_len_ctx, flex->style, RIGHT, true, true, true, &fixed, &frac); - w -= frac * available_width + fixed; - flex->width = w > 0 ? w : 0; + flex->width = w - frac * available_width - fixed; } - if (flex->width == AUTO) { - flex->width = available_width; + if (max_width > 0 && flex->width > max_width) { + flex->width = max_width; } + if (flex->width < min_width) { + flex->width = min_width; + } + + flex->width = flex->width > 0 ? flex->width : 0; + available_width -= lh__delta_outer_width(flex); + available_width = min(available_width, flex->width); layout_flex_ctx__populate_item_data(ctx, flex, available_width); |