diff --git a/System/Libraries/Html/Reflow.HC b/System/Libraries/Html/Reflow.HC
index acadc97..d4a7865 100644
--- a/System/Libraries/Html/Reflow.HC
+++ b/System/Libraries/Html/Reflow.HC
@@ -60,12 +60,24 @@ U0 @reflow_resolve_css_side(@html_dom_node* node, @css_side* parent_resolved_sid
}
}
-U0 @reflow_resolve_dynamic_margins(@html_dom_node* node)
+U0 @reflow_collapse_margin_top(@html_dom_node* node, HtmlRenderer* renderer)
+{
+ if (!node->display == CSS_DISPLAY_BLOCK) {
+ return;
+ }
+ @html_dom_node* prev_node = renderer->reflow_previous_node;
+ if (prev_node && prev_node->resolvedMargin.bottom.value > 0 && node->resolvedMargin.top.value > 0) {
+ node->resolvedMargin.top.value = MaxI64(0, ToI64(node->resolvedMargin.top.value - prev_node->resolvedMargin.bottom.value));
+ }
+}
+
+U0 @reflow_resolve_dynamic_margins(@html_dom_node* node, HtmlRenderer* renderer)
{
@reflow_resolve_css_side(node, &node->parentNode->resolvedMargin.top, &node->resolvedMargin.top, &node->margin.top);
@reflow_resolve_css_side(node, &node->parentNode->resolvedMargin.right, &node->resolvedMargin.right, &node->margin.right);
@reflow_resolve_css_side(node, &node->parentNode->resolvedMargin.bottom, &node->resolvedMargin.bottom, &node->margin.bottom);
@reflow_resolve_css_side(node, &node->parentNode->resolvedMargin.left, &node->resolvedMargin.left, &node->margin.left);
+ @reflow_collapse_margin_top(node, renderer);
}
U0 @reflow_resolve_dynamic_borders(@html_dom_node* node)
@@ -104,7 +116,7 @@ U0 @reflow_resolve_dynamic_width_and_height(@html_dom_node* node)
node->resolvedHeight = @reflow_resolve_css_distance(node->parentNode->height, node->height, node->heightDistanceType);
}
-U0 @reflow_resolve_dimensions_for_widget(Widget* widget)
+U0 @reflow_resolve_dimensions_for_widget(Widget* widget, HtmlRenderer* renderer)
{
@html_dom_node* node = widget->data;
@@ -136,7 +148,7 @@ U0 @reflow_resolve_dimensions_for_widget(Widget* widget)
}
@reflow_resolve_dynamic_width_and_height(node);
- @reflow_resolve_dynamic_margins(node);
+ @reflow_resolve_dynamic_margins(node, renderer);
@reflow_resolve_dynamic_borders(node);
@reflow_resolve_dynamic_padding(node);
}
@@ -185,6 +197,7 @@ U0 @reflow_set_initial_values(HtmlRenderer* renderer)
renderer->reflow.inline.max_line_height = RENDERER_DEFAULT_MAX_LINE_HEIGHT;
renderer->reflow.parent = NULL;
renderer->reflow_index = -1;
+ renderer->reflow_previous_node = NULL;
}
U0 @reflow_update_vertical_scrollbar(HtmlRenderer* renderer)
@@ -282,6 +295,16 @@ U0 @reflow_reset_inline_position(HtmlRenderer* renderer)
renderer->reflow.inline.y = 0;
}
+U0 @reflow_set_previous_node(@html_dom_node* node, HtmlRenderer* renderer)
+{
+ renderer->reflow_previous_node = node;
+}
+
+U0 @reflow_clear_previous_node(HtmlRenderer* renderer)
+{
+ renderer->reflow_previous_node = NULL;
+}
+
U0 @reflow_set_widget_dimensions(Widget* widget, HtmlRenderer* renderer)
{
@html_dom_node* node = widget->data;
@@ -428,6 +451,7 @@ U0 @reflow_begin_block(Widget* widget, HtmlRenderer* renderer)
@reflow_position_widget(widget, renderer);
@reflow_apply_border_and_padding_to_bounds(widget, renderer);
@reflow_apply_width_and_height_to_bounds(widget, renderer);
+ @reflow_clear_previous_node(renderer);
}
U0 @reflow_end_block(Widget* widget, HtmlRenderer* renderer)
@@ -451,6 +475,7 @@ U0 @reflow_end_block(Widget* widget, HtmlRenderer* renderer)
renderer->reflow.inline.x, renderer->reflow.inline.y,
renderer->reflow.inline.max_line_height;
}
+ @reflow_set_previous_node(node, renderer);
}
U0 @reflow_begin_inline_block(Widget* widget, HtmlRenderer* renderer)
@@ -479,6 +504,7 @@ U0 @reflow_begin_inline_block(Widget* widget, HtmlRenderer* renderer)
@reflow_position_widget(widget, renderer);
@reflow_apply_border_and_padding_to_bounds(widget, renderer);
@reflow_apply_width_and_height_to_bounds(widget, renderer);
+ @reflow_clear_previous_node(renderer);
}
U0 @reflow_end_inline_block(Widget* widget, HtmlRenderer* renderer)
@@ -503,6 +529,7 @@ U0 @reflow_end_inline_block(Widget* widget, HtmlRenderer* renderer)
renderer->reflow.inline.x, renderer->reflow.inline.y,
renderer->reflow.inline.max_line_height;
}
+ @reflow_clear_previous_node(renderer);
}
U0 @reflow_break_line(HtmlRenderer* renderer)
@@ -582,6 +609,7 @@ U0 @reflow_inline(@window_widgets_list* wl, Widget* widget, HtmlRenderer* render
renderer->reflow.inline.x += widget->width;
renderer->reflow.inline.max_line_height = MaxI64(widget->height, renderer->reflow.inline.max_line_height);
+ @reflow_clear_previous_node(renderer);
}
U0 @reflow_set_hyperlink_if_needed(Widget* widget, HtmlRenderer* renderer)
@@ -620,7 +648,7 @@ U0 @reflow_node_list(HtmlRenderer* renderer)
node = widget->data;
if (!@reflow_widget_has_closing_tag(widget)) {
- @reflow_resolve_dimensions_for_widget(widget);
+ @reflow_resolve_dimensions_for_widget(widget, renderer);
@reflow_set_hyperlink_if_needed(widget, renderer);
}
diff --git a/System/Libraries/Html/Renderer.HC b/System/Libraries/Html/Renderer.HC
index 53cbc70..c9dc576 100644
--- a/System/Libraries/Html/Renderer.HC
+++ b/System/Libraries/Html/Renderer.HC
@@ -110,6 +110,7 @@ class @html_renderer
U64 link_callback;
U64 form_submit_callback;
U64 (*image_load_callback)(U64);
+ @html_dom_node* reflow_previous_node;
@renderer_reflow reflow_stack[128];
@renderer_reflow reflow;
I64 reflow_index;