summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2022-10-19 21:31:15 +0100
committerMichael Drake <tlsa@netsurf-browser.org>2022-10-23 17:25:52 +0100
commit480b8a0ff0ba40b3cc4364b7cd339fe755710e9c (patch)
tree8a5ac9a2f8c0b638afec646c5fe1fe67baeaffe6
parent628d6db75932a61ebf9a3f4513f5a9d209bd9515 (diff)
downloadnetsurf-480b8a0ff0ba40b3cc4364b7cd339fe755710e9c.tar.gz
netsurf-480b8a0ff0ba40b3cc4364b7cd339fe755710e9c.tar.bz2
WIP: Flex
-rw-r--r--content/handlers/html/layout.c2
-rw-r--r--content/handlers/html/layout_flex.c54
-rw-r--r--content/handlers/html/layout_internal.h16
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);
}
}