diff --git a/System/Libraries/Html/Reflow.HC b/System/Libraries/Html/Reflow.HC index 4116f79..76a4a9a 100644 --- a/System/Libraries/Html/Reflow.HC +++ b/System/Libraries/Html/Reflow.HC @@ -140,8 +140,6 @@ Bool @reflow_image_size_will_not_change(Context2DWidget* widget) return (node->resolvedWidth && node->resolvedHeight && widget->width == node->resolvedWidth && widget->height == node->resolvedHeight); } -// renderer->reflow.parent->width, renderer->reflow.parent->height; - U0 @reflow_set_image_widget_dimensions_from_node_width_and_height(Context2DWidget* widget, HtmlRenderer* renderer) { @html_dom_node* node = widget->data; @@ -748,6 +746,16 @@ U0 @reflow_handle_inline_text_align(@window_widgets_list* wl, @html_dom_node* no } } +U0 @reflow_inherit_outer_bounds_if_zero_width(HtmlRenderer* renderer) +{ + I64 i = renderer->reflow_index - 1; + if (renderer->reflow.bounds.x2 == renderer->reflow.bounds.x1) { + renderer->reflow.parent->x = renderer->reflow_stack[i].bounds.x1; + renderer->reflow.bounds.x2 = renderer->reflow_stack[i].bounds.x2; + renderer->reflow.bounds.x1 = renderer->reflow_stack[i].bounds.x1; + } +} + U0 @reflow_inline(@window_widgets_list* wl, Widget* widget, HtmlRenderer* renderer) { @html_dom_node* node = widget->data; @@ -755,8 +763,26 @@ U0 @reflow_inline(@window_widgets_list* wl, Widget* widget, HtmlRenderer* render @reflow_break_line(renderer); return; } + + // FIXME: This terrible hack does the following: + + // - Inherit the parent (outer) block's bounds if our x1/x2 bounds are equal. + // - Retry the reflow if we end up doing a line break. + + // Without this hack, we end up line breaking after every text fragment + // if the containing block width is undefined and has auto margins or + // text-align: center. + + @reflow_inherit_outer_bounds_if_zero_width(renderer); + + Bool continuing_reflow_inline_with_text_align = FALSE; +continue_reflow_inline_with_text_align: @reflow_handle_inline_text_align(wl, node, renderer); @reflow_break_line_if_not_enough_horizontal_space(widget, renderer); + if (!renderer->reflow.inline.x && node->textAlign && !continuing_reflow_inline_with_text_align) { + continuing_reflow_inline_with_text_align = TRUE; + goto continue_reflow_inline_with_text_align; + } @reflow_position_widget(widget, renderer); renderer->reflow.inline.x += widget->width;