System/Libraries/Html/Reflow: Resolve CSS_DISTANCE_AUTO for node width/height

This commit is contained in:
Alec Murphy 2025-05-04 09:15:27 -04:00
parent 5a492d647c
commit a411e8a352

View file

@ -96,15 +96,43 @@ U0 @reflow_resolve_dynamic_padding(@html_dom_node* node)
@reflow_resolve_css_side(node, &node->parentNode->resolvedPadding.left, &node->resolvedPadding.left, &node->padding.left); @reflow_resolve_css_side(node, &node->parentNode->resolvedPadding.left, &node->resolvedPadding.left, &node->padding.left);
} }
I64 @reflow_resolve_css_distance(F64 parent_distance, F64 distance, I64 type) I64 @reflow_resolve_css_width_for_node(@html_dom_node* node)
{ {
switch (type) { I64 resolved_width = 0;
switch (node->widthDistanceType) {
case CSS_DISTANCE_AUTO:
while (!resolved_width) {
node = node->parentNode;
resolved_width = node->resolvedWidth;
}
return resolved_width;
case CSS_DISTANCE_PIXELS: case CSS_DISTANCE_PIXELS:
return ToI64(distance); return ToI64(node->width);
case CSS_DISTANCE_EM: case CSS_DISTANCE_EM:
return ToI64(distance * RENDERER_DEFAULT_MAX_LINE_HEIGHT); return ToI64(node->width * RENDERER_DEFAULT_MAX_LINE_HEIGHT);
case CSS_DISTANCE_PERCENT: case CSS_DISTANCE_PERCENT:
return ToI64(parent_distance * (100 / distance)); return ToI64(node->parentNode->resolvedWidth * (100 / node->width));
default:
return 0;
}
}
I64 @reflow_resolve_css_height_for_node(@html_dom_node* node)
{
I64 resolved_height = 0;
switch (node->heightDistanceType) {
case CSS_DISTANCE_AUTO:
while (!resolved_height) {
node = node->parentNode;
resolved_height = node->resolvedHeight;
}
return resolved_height;
case CSS_DISTANCE_PIXELS:
return ToI64(node->height);
case CSS_DISTANCE_EM:
return ToI64(node->height * RENDERER_DEFAULT_MAX_LINE_HEIGHT);
case CSS_DISTANCE_PERCENT:
return ToI64(node->parentNode->resolvedHeight * (100 / node->height));
default: default:
return 0; return 0;
} }
@ -112,8 +140,8 @@ I64 @reflow_resolve_css_distance(F64 parent_distance, F64 distance, I64 type)
U0 @reflow_resolve_dynamic_width_and_height(@html_dom_node* node) U0 @reflow_resolve_dynamic_width_and_height(@html_dom_node* node)
{ {
node->resolvedWidth = @reflow_resolve_css_distance(node->parentNode->width, node->width, node->widthDistanceType); node->resolvedWidth = @reflow_resolve_css_width_for_node(node);
node->resolvedHeight = @reflow_resolve_css_distance(node->parentNode->height, node->height, node->heightDistanceType); node->resolvedHeight = @reflow_resolve_css_height_for_node(node);
} }
U0 @reflow_set_image_widget_dimensions_from_base(Context2DWidget* widget) U0 @reflow_set_image_widget_dimensions_from_base(Context2DWidget* widget)