From 480b8a0ff0ba40b3cc4364b7cd339fe755710e9c Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Wed, 19 Oct 2022 21:31:15 +0100 Subject: WIP: Flex --- content/handlers/html/layout.c | 2 +- content/handlers/html/layout_flex.c | 54 ++++++++++++++++++++++----------- content/handlers/html/layout_internal.h | 16 ++++++---- 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/content/handlers/html/layout.c b/content/handlers/html/layout.c index 22763e688..8a8096b8d 100644 --- a/content/handlers/html/layout.c +++ b/content/handlers/html/layout.c @@ -5446,7 +5446,7 @@ bool layout_document(html_content *content, int width, int height) layout_position_absolute(doc, doc, 0, 0, content); layout_position_relative(&content->unit_len_ctx, doc, doc, 0, 0); -// box_dump(stderr, doc, 0, false); + box_dump(stderr, doc, 0, false); layout_calculate_descendant_bboxes(&content->unit_len_ctx, doc); return ret; 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); diff --git a/content/handlers/html/layout_internal.h b/content/handlers/html/layout_internal.h index 2cbd1ee3c..f4a5401d8 100644 --- a/content/handlers/html/layout_internal.h +++ b/content/handlers/html/layout_internal.h @@ -208,21 +208,25 @@ static inline int lh__delta_outer_width(const struct box *b) lh__non_auto_margin(b, RIGHT); } -static inline int lh__delta_outer_main(const struct box *flex) +static inline int lh__delta_outer_main( + const struct box *flex, + const struct box *b) { if (layout_flex__main_is_horizontal(flex)) { - return lh__delta_outer_width(flex); + return lh__delta_outer_width(b); } else { - return lh__delta_outer_height(flex); + return lh__delta_outer_height(b); } } -static inline int lh__delta_outer_cross(const struct box *flex) +static inline int lh__delta_outer_cross( + const struct box *flex, + const struct box *b) { if (layout_flex__main_is_horizontal(flex) == false) { - return lh__delta_outer_width(flex); + return lh__delta_outer_width(b); } else { - return lh__delta_outer_height(flex); + return lh__delta_outer_height(b); } } -- cgit v1.2.3