System/Libraries/Html/Reflow: Some hacks for inline-block and page height
This commit is contained in:
parent
a5f0b0b4ee
commit
84ffabf7b7
1 changed files with 34 additions and 9 deletions
|
@ -17,8 +17,19 @@ U0 @reflow_break_line(HtmlRenderer* renderer)
|
||||||
|
|
||||||
U0 @reflow_break_line_if_not_enough_horizontal_space(Widget* widget, 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;
|
I32 combined_x = renderer->reflow.bounds.x1 + renderer->reflow.inline.x;
|
||||||
if (combined_x > renderer->reflow.bounds.x2 - widget->width) {
|
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);
|
@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;
|
node->resolvedWidth = renderer->reflow.bounds.x2 - renderer->reflow.bounds.x1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case CSS_DISPLAY_INLINE_BLOCK:
|
||||||
|
node->resolvedWidth = renderer->reflow.inline.x;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -290,6 +304,7 @@ U0 @reflow_set_widget_dimensions(Widget* widget, HtmlRenderer* renderer)
|
||||||
if (node->heightDistanceType == CSS_DISTANCE_UNDEFINED) {
|
if (node->heightDistanceType == CSS_DISTANCE_UNDEFINED) {
|
||||||
switch (node->display) {
|
switch (node->display) {
|
||||||
case CSS_DISPLAY_BLOCK:
|
case CSS_DISPLAY_BLOCK:
|
||||||
|
case CSS_DISPLAY_INLINE_BLOCK:
|
||||||
@reflow_break_line_if_inline_x_is_positive(renderer);
|
@reflow_break_line_if_inline_x_is_positive(renderer);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -417,6 +432,7 @@ U0 @reflow_begin_block(Widget* widget, HtmlRenderer* renderer)
|
||||||
|
|
||||||
U0 @reflow_end_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;
|
Widget* parent = renderer->reflow.parent;
|
||||||
if (!parent)
|
if (!parent)
|
||||||
return;
|
return;
|
||||||
|
@ -469,6 +485,7 @@ U0 @reflow_end_inline_block(Widget* widget, HtmlRenderer* renderer)
|
||||||
{
|
{
|
||||||
// @reflow_end_block(widget, 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;
|
Widget* parent = renderer->reflow.parent;
|
||||||
@html_dom_node* node = parent->data;
|
@html_dom_node* node = parent->data;
|
||||||
if (reflow_debug) {
|
if (reflow_debug) {
|
||||||
|
@ -477,6 +494,7 @@ U0 @reflow_end_inline_block(Widget* widget, HtmlRenderer* renderer)
|
||||||
@reflow_set_parent_widget_dimensions(renderer);
|
@reflow_set_parent_widget_dimensions(renderer);
|
||||||
@reflow_pop(renderer);
|
@reflow_pop(renderer);
|
||||||
@reflow_apply_widget_width_to_inline(parent, renderer);
|
@reflow_apply_widget_width_to_inline(parent, renderer);
|
||||||
|
@reflow_apply_widget_height_to_inline(parent, renderer);
|
||||||
|
|
||||||
if (reflow_debug) {
|
if (reflow_debug) {
|
||||||
"apply widget width to inline: bounds: %d/%d/%d/%d, inline: %d/%d, max_height: %d\n",
|
"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;
|
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)
|
Bool @reflow_stop_calculating_offset(Widget* widget)
|
||||||
{
|
{
|
||||||
@html_dom_node* node = widget->data;
|
@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));
|
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 @reflow_calculate_text_align_offset(@window_widgets_list* wl, HtmlRenderer* renderer)
|
||||||
{
|
{
|
||||||
I32 line_break_width = renderer->reflow.bounds.x2 - renderer->reflow.bounds.x1;
|
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;
|
I32 offset = wl->widget->width;
|
||||||
wl = wl->next;
|
wl = wl->next;
|
||||||
while (wl && wl->widget && offset + wl->widget->width < line_break_width) {
|
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;
|
wl = wl->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (reflow_debug) {
|
||||||
|
"offset is: %d\n", offset;
|
||||||
|
}
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -628,7 +653,7 @@ U0 @reflow_node_list(HtmlRenderer* renderer)
|
||||||
if (wl->widget && wl->widget->data) {
|
if (wl->widget && wl->widget->data) {
|
||||||
node = wl->widget->data;
|
node = wl->widget->data;
|
||||||
if (!StrICmp(node->tagName, "body")) {
|
if (!StrICmp(node->tagName, "body")) {
|
||||||
renderer->calculated_page_height = node->resolvedHeight;
|
renderer->calculated_page_height = MaxI64(node->resolvedHeight, renderer->calculated_page_height);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue