From b55f58ebed4a0955f5926f236721f14f44f82c86 Mon Sep 17 00:00:00 2001 From: Alec Murphy Date: Tue, 29 Apr 2025 11:04:31 -0400 Subject: [PATCH] System/Libraries/Html/Renderer: Use BorderedRectWidget for block_widget instead of Context2DWidget --- System/Libraries/Html/Renderer.HC | 75 ++++++++++++++++++------------- 1 file changed, 45 insertions(+), 30 deletions(-) diff --git a/System/Libraries/Html/Renderer.HC b/System/Libraries/Html/Renderer.HC index 6fedf2a..80acb24 100644 --- a/System/Libraries/Html/Renderer.HC +++ b/System/Libraries/Html/Renderer.HC @@ -1687,38 +1687,58 @@ U0 @render_internal_text_node(@html_dom_node* node, HtmlRenderer* renderer) } } -Context2D* @create_bordered_rect_from_resolved_node(@html_dom_node* node) +U0 @set_bordered_rect_from_resolved_node(@html_dom_node* node, BorderedRectWidget* widget) { - if (!node) - return NULL; + if (!node || !widget || !node->width || !node->height) + return; - I64 rw = node->border.left.value + node->border.right.value; - rw += node->padding.left.value + node->padding.right.value; - rw += node->width; + if (node->widthDistanceType != CSS_DISTANCE_PIXELS || node->heightDistanceType != CSS_DISTANCE_PIXELS) + return; - I64 rh = node->border.top.value + node->border.bottom.value; - rh += node->padding.top.value + node->padding.bottom.value; - rh += node->height; + widget->width = node->width; + widget->height = node->height; + widget->color = node->backgroundColor; - Context2D* ctx = NewContext2D(rw, rh); - ctx->fill(node->backgroundColor); - - // Draw borders - // FIXME: style if (node->border.top.value) { - ctx->fill_rect(0, 0, ctx->width, node->border.top.value, node->border.topColor); + switch (node->border.top.type) { + case CSS_DISTANCE_PIXELS: + widget->top.size = node->border.top.value; + widget->top.color = node->border.topColor; + break; + default: + break; + } } if (node->border.bottom.value) { - ctx->fill_rect(0, ctx->height - node->border.bottom.value, ctx->width, node->border.bottom.value, node->border.bottomColor); + switch (node->border.bottom.type) { + case CSS_DISTANCE_PIXELS: + widget->bottom.size = node->border.bottom.value; + widget->bottom.color = node->border.bottomColor; + break; + default: + break; + } } if (node->border.left.value) { - ctx->fill_rect(0, 0, node->border.left.value, ctx->height, node->border.leftColor); + switch (node->border.left.type) { + case CSS_DISTANCE_PIXELS: + widget->left.size = node->border.left.value; + widget->left.color = node->border.leftColor; + break; + default: + break; + } } if (node->border.right.value) { - ctx->fill_rect(ctx->width - node->border.right.value, 0, node->border.right.value, ctx->height, node->border.rightColor); + switch (node->border.right.type) { + case CSS_DISTANCE_PIXELS: + widget->right.size = node->border.right.value; + widget->right.color = node->border.rightColor; + break; + default: + break; + } } - - return ctx; } U0 @render_image_element(@html_dom_node* node, HtmlRenderer* renderer) @@ -1753,7 +1773,7 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer) @handle_tag_specific_functions(node, renderer); I64 i; - Context2DWidget* block_widget = NULL; + BorderedRectWidget* block_widget = NULL; // If the element is an image, if (!StrICmp(node->tagName, "img")) { @@ -1763,15 +1783,10 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer) @render_form_input_element(node, renderer); // or, if the element has CSS display: block, inline-block, insert a block widget for the element's opening tag } else if (node->display == CSS_DISPLAY_BLOCK || node->display == CSS_DISPLAY_INLINE_BLOCK) { - block_widget = Gui.CreateWidget(renderer->win, WIDGET_TYPE_CONTEXT2D, + block_widget = Gui.CreateWidget(renderer->win, WIDGET_TYPE_BORDERED_RECT, U64_MAX, U64_MAX, 0, 0); - // If we have exact dimensions for the element in pixels, create the rect now - if (node->widthDistanceType == CSS_DISTANCE_PIXELS && node->heightDistanceType == CSS_DISTANCE_PIXELS) { - block_widget->ctx = @create_bordered_rect_from_resolved_node(node); - block_widget->width = block_widget->ctx->width; - block_widget->height = block_widget->ctx->height; - block_widget->fast_copy = TRUE; - } + // Try to set dimensions if we can + @set_bordered_rect_from_resolved_node(node, block_widget); block_widget->data = node; } @@ -1782,7 +1797,7 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer) // if the element has CSS display: block, inline-block, insert a block widget for the element's closing tag if (node->display == CSS_DISPLAY_BLOCK || node->display == CSS_DISPLAY_INLINE_BLOCK || !StrICmp(node->tagName, "br")) { - block_widget = Gui.CreateWidget(renderer->win, WIDGET_TYPE_CONTEXT2D, + block_widget = Gui.CreateWidget(renderer->win, WIDGET_TYPE_BORDERED_RECT, U64_MAX, U64_MAX, 0, 0); if (node->display == CSS_DISPLAY_BLOCK || node->display == CSS_DISPLAY_INLINE_BLOCK) { block_widget->width = -0xbeef;