From 0a579a4f09204becd5b97076c94a9bd6edc901ce Mon Sep 17 00:00:00 2001 From: Alec Murphy Date: Tue, 15 Apr 2025 16:21:52 -0400 Subject: [PATCH] System/Libraries/Html/Renderer: Handle italic/oblique text --- System/Libraries/Html/Renderer.HC | 55 ++++++++++++++++++------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/System/Libraries/Html/Renderer.HC b/System/Libraries/Html/Renderer.HC index 6b7d918..a23f701 100644 --- a/System/Libraries/Html/Renderer.HC +++ b/System/Libraries/Html/Renderer.HC @@ -307,6 +307,7 @@ Bool @apply_css_rules_to_node(@html_dom_node* node, HtmlRenderer* renderer) node->fontSize = node->parentNode->fontSize; node->fontWeight = node->parentNode->fontWeight; node->textAlign = node->parentNode->textAlign; + node->italic = node->parentNode->italic; } for (i = 0; i < renderer->css_rules->length; i++) { @@ -464,6 +465,12 @@ Bool @apply_css_rules_to_node(@html_dom_node* node, HtmlRenderer* renderer) } } } + + if (!StrICmp(key->name, "font-style")) { + if (!StrICmp(values->@(0), "italic")) { + node->italic = TRUE; + } + } css_continue_to_next_property: key = key->next; } @@ -720,31 +727,31 @@ Bool @code_point_is_whitespace(I32 code_point) return NULL; } -U8* @resolved_font_weight_for_node(@html_dom_node* node) +U8* @resolved_font_name_for_node(@html_dom_node* node) { - U8 buf[128]; if (!node || !node->fontFamily || !StrLen(node->fontFamily)) - return; - switch (node->fontWeight) { - case 700: - case 800: - case 900: - if (!StrICmp(node->fontFamily + StrLen(node->fontFamily) - 4, "bold")) { - return node->fontFamily; - } else { - StrPrint(buf, "%s Bold", node->fontFamily); - if (Fonts->@(buf)) { - return StrNew(buf, erythros_mem_task); - } else { - // Can't find Bold variant, return Normal - return node->fontFamily; - } + return NULL; + + U8* font_name_with_weight_applied = node->fontFamily; + U8 buf[128]; + + // Handle font weight + if (node->fontWeight >= 700 && StrICmp(node->fontFamily + StrLen(node->fontFamily) - 4, "bold")) { + StrPrint(buf, "%s Bold", node->fontFamily); + if (Fonts->@(buf)) { + font_name_with_weight_applied = StrNew(buf, erythros_mem_task); } - break; - default: - return node->fontFamily; - break; } + + // Handle italic + if (node->italic) { + StrPrint(buf, "%s Italic", font_name_with_weight_applied); + if (Fonts->@(buf)) { + return StrNew(buf, erythros_mem_task); + } + } + + return font_name_with_weight_applied; } U0 @render_node_text(@html_dom_node* node, HtmlRenderer* renderer) @@ -794,7 +801,7 @@ U0 @render_node_text(@html_dom_node* node, HtmlRenderer* renderer) Context2DWidget* fragment_widget; U32 fragment_bounding_box_color = Color(0x00, 0xff, 0x00); - U8* font_name = @resolved_font_weight_for_node(node->parentNode); + U8* font_name = @resolved_font_name_for_node(node->parentNode); for (i = 0; i < fragment_count; i++) { if (fragments[i] && *fragments[i]) { @@ -911,6 +918,10 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer) node->fontWeight = 700; } + if (!StrICmp(node->tagName, "i") || !StrICmp(node->tagName, "em")) { + node->italic = TRUE; + } + if (!StrICmp(node->tagName, "body")) { renderer->background_ctx->width = Display.Width(); renderer->background_ctx->height = Display.Height();