diff --git a/System/Libraries/Html/Reflow.HC b/System/Libraries/Html/Reflow.HC
index 6f84037..acadc97 100644
--- a/System/Libraries/Html/Reflow.HC
+++ b/System/Libraries/Html/Reflow.HC
@@ -17,8 +17,19 @@ U0 @reflow_break_line(HtmlRenderer* renderer)
U0 @reflow_break_line_if_not_enough_horizontal_space(Widget* widget, HtmlRenderer* renderer)
{
+ if (renderer->reflow.parent) {
+ @html_dom_node* parent_node = renderer->reflow.parent->data;
+ if (parent_node && parent_node->display == CSS_DISPLAY_INLINE_BLOCK && parent_node->widthDistanceType == CSS_DISTANCE_UNDEFINED) {
+ return;
+ }
+ }
+
I32 combined_x = renderer->reflow.bounds.x1 + renderer->reflow.inline.x;
if (combined_x > renderer->reflow.bounds.x2 - widget->width) {
+ if (reflow_debug) {
+ "*** not enough horizontal space, breaking line\n";
+ "tag: %s\n", widget->data(@html_dom_node*)->tagName;
+ }
@reflow_break_line(renderer);
}
}
@@ -282,6 +293,9 @@ U0 @reflow_set_widget_dimensions(Widget* widget, HtmlRenderer* renderer)
node->resolvedWidth = renderer->reflow.bounds.x2 - renderer->reflow.bounds.x1;
}
break;
+ case CSS_DISPLAY_INLINE_BLOCK:
+ node->resolvedWidth = renderer->reflow.inline.x;
+ break;
default:
break;
}
@@ -290,6 +304,7 @@ U0 @reflow_set_widget_dimensions(Widget* widget, HtmlRenderer* renderer)
if (node->heightDistanceType == CSS_DISTANCE_UNDEFINED) {
switch (node->display) {
case CSS_DISPLAY_BLOCK:
+ case CSS_DISPLAY_INLINE_BLOCK:
@reflow_break_line_if_inline_x_is_positive(renderer);
break;
default:
@@ -417,6 +432,7 @@ U0 @reflow_begin_block(Widget* widget, HtmlRenderer* renderer)
U0 @reflow_end_block(Widget* widget, HtmlRenderer* renderer)
{
+ renderer->calculated_page_height = MaxI64(renderer->calculated_page_height, renderer->reflow.bounds.y1 + renderer->reflow.inline.y);
Widget* parent = renderer->reflow.parent;
if (!parent)
return;
@@ -469,6 +485,7 @@ U0 @reflow_end_inline_block(Widget* widget, HtmlRenderer* renderer)
{
// @reflow_end_block(widget, renderer);
+ renderer->calculated_page_height = MaxI64(renderer->calculated_page_height, renderer->reflow.bounds.y1 + renderer->reflow.inline.y);
Widget* parent = renderer->reflow.parent;
@html_dom_node* node = parent->data;
if (reflow_debug) {
@@ -477,6 +494,7 @@ U0 @reflow_end_inline_block(Widget* widget, HtmlRenderer* renderer)
@reflow_set_parent_widget_dimensions(renderer);
@reflow_pop(renderer);
@reflow_apply_widget_width_to_inline(parent, renderer);
+ @reflow_apply_widget_height_to_inline(parent, renderer);
if (reflow_debug) {
"apply widget width to inline: bounds: %d/%d/%d/%d, inline: %d/%d, max_height: %d\n",
@@ -494,23 +512,27 @@ U0 @reflow_break_line(HtmlRenderer* renderer)
renderer->reflow.inline.max_line_height = RENDERER_DEFAULT_MAX_LINE_HEIGHT;
}
-U0 @reflow_break_line_if_not_enough_horizontal_space(Widget* widget, HtmlRenderer* renderer)
-{
- I32 resolved_inline_x = renderer->reflow.bounds.x1 + renderer->reflow.inline.x;
- if (resolved_inline_x > renderer->reflow.bounds.x2 - widget->width) {
- @reflow_break_line(renderer);
- }
-}
-
Bool @reflow_stop_calculating_offset(Widget* widget)
{
@html_dom_node* node = widget->data;
+ if (reflow_debug && @reflow_widget_has_closing_tag(widget)) {
+ "stop: widget has closing tag: %s\n", node->tagName;
+ }
return (!node || node->display == CSS_DISPLAY_BLOCK || !StrICmp(node->tagName, "br") || @reflow_widget_has_closing_tag(widget));
}
I32 @reflow_calculate_text_align_offset(@window_widgets_list* wl, HtmlRenderer* renderer)
{
I32 line_break_width = renderer->reflow.bounds.x2 - renderer->reflow.bounds.x1;
+ if (renderer->reflow.parent) {
+ @html_dom_node* parent_node = renderer->reflow.parent->data;
+ if (parent_node && parent_node->display == CSS_DISPLAY_INLINE_BLOCK && parent_node->widthDistanceType == CSS_DISTANCE_UNDEFINED) {
+ if (reflow_debug) {
+ "set line_break_width to I32_MAX\n";
+ }
+ line_break_width = I32_MAX;
+ }
+ }
I32 offset = wl->widget->width;
wl = wl->next;
while (wl && wl->widget && offset + wl->widget->width < line_break_width) {
@@ -521,6 +543,9 @@ I32 @reflow_calculate_text_align_offset(@window_widgets_list* wl, HtmlRenderer*
wl = wl->next;
}
}
+ if (reflow_debug) {
+ "offset is: %d\n", offset;
+ }
return offset;
}
@@ -628,7 +653,7 @@ U0 @reflow_node_list(HtmlRenderer* renderer)
if (wl->widget && wl->widget->data) {
node = wl->widget->data;
if (!StrICmp(node->tagName, "body")) {
- renderer->calculated_page_height = node->resolvedHeight;
+ renderer->calculated_page_height = MaxI64(node->resolvedHeight, renderer->calculated_page_height);
break;
}
}