diff --git a/System/Libraries/Html/Renderer.HC b/System/Libraries/Html/Renderer.HC index 8673fd1..b90273c 100644 --- a/System/Libraries/Html/Renderer.HC +++ b/System/Libraries/Html/Renderer.HC @@ -227,7 +227,7 @@ U32 @css_resolve_color_from_rrggbb(U8* str) } } -Bool @render_css_for_node(@html_dom_node* node, HtmlRenderer* renderer) +Bool @apply_css_rules_to_node(@html_dom_node* node, HtmlRenderer* renderer) { I64 i, j, k; JsonObject* rule = NULL; @@ -585,7 +585,7 @@ U0 @render_form_element(@html_dom_node* node, HtmlRenderer* renderer) } JsonArray* parent_nodes_excluded_from_text_rendering = Json.Parse("[\"option\",\"script\",\"style\",\"title\"]", erythros_mem_task); -JsonArray* block_level_element_tag_names = Json.Parse("[\"address\",\"article\",\"aside\",\"blockquote\",\"br\",\"canvas\",\"dd\",\"div\",\"dl\",\"dt\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"hr\",\"li\",\"main\",\"nav\",\"noscript\",\"ol\",\"p\",\"pre\",\"section\",\"table\",\"tfoot\",\"ul\",\"video\"]", erythros_mem_task); +JsonArray* block_level_element_tag_names = Json.Parse("[\"address\",\"article\",\"aside\",\"blockquote\",\"canvas\",\"dd\",\"div\",\"dl\",\"dt\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"hr\",\"li\",\"main\",\"nav\",\"noscript\",\"ol\",\"p\",\"pre\",\"section\",\"table\",\"tfoot\",\"ul\",\"video\"]", erythros_mem_task); #define ADD_BYTE_TO_CODE_POINT_VALUE code_point = ((code_point << 6) | text[++i] & 0x3f); #define ADD_TWO_BYTES_TO_CODE_POINT_VALUE ADD_BYTE_TO_CODE_POINT_VALUE ADD_BYTE_TO_CODE_POINT_VALUE @@ -723,21 +723,11 @@ U0 @renderer_append_image(HtmlRenderer* renderer, Context2DWidget* widget) } } -U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer) +U0 @apply_attribute_values_to_node(@html_dom_node* node) { - if (!node || !renderer) + if (!node) return; - I64 i; - U8 buf[HTML_WORK_BUFFER_SIZE]; - - I64 margin_top = 32; // FIXME: Derive these - I64 margin_bottom = 32; - - if (StrICmp(node->tagName, "InternalTextNode")) - if (!@render_css_for_node(node, renderer)) - return; - if (node->attributes->@("bgcolor")) { if (@css_named_colors->@(node->attributes->@("bgcolor"))) { node->backgroundColor = @css_resolve_color_from_rrggbb(@css_named_colors->@(node->attributes->@("bgcolor"))); @@ -745,6 +735,7 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer) node->backgroundColor = @css_resolve_color_from_rrggbb(node->attributes->@("bgcolor")); } } + if (node->attributes->@("color")) { if (@css_named_colors->@(node->attributes->@("color"))) { node->color = @css_resolve_color_from_rrggbb(@css_named_colors->@(node->attributes->@("color"))); @@ -762,8 +753,32 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer) if (!StrICmp(node->tagName, "center")) node->textAlign = CSS_TEXT_ALIGN_CENTER; +} + +U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer) +{ + if (!node || !renderer) + return; + + I64 i; + U8 buf[HTML_WORK_BUFFER_SIZE]; + + Context2DWidget* block_widget; + Context2DWidget* img_widget; + + // FIXME: Resolve if display: block is set + if (block_level_element_tag_names->contains(node->tagName)) { + node->display_block = TRUE; + } + + if (StrICmp(node->tagName, "InternalTextNode")) + if (!@apply_css_rules_to_node(node, renderer)) + return; ++renderer->indent; + + @apply_attribute_values_to_node(node); + if (renderer->debug && StrICmp(node->tagName, "InternalTextNode")) { for (i = 0; i < renderer->indent; i++) " "; @@ -771,13 +786,7 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer) node->tagName, node->textAlign, node->width, node->height, node->backgroundColor, node->color, node->fontFamily, node->fontSize, node->display_block; } - Context2DWidget* block_widget; - - // FIXME: Resolve if display: block is set - if (block_level_element_tag_names->contains(node->tagName)) { - node->display_block = TRUE; - } - + // Insert a block widget for the element's opening tag if (node->display_block) { block_widget = Gui.CreateWidget(renderer->win, WIDGET_TYPE_CONTEXT2D, U64_MAX, U64_MAX, 0, 0); @@ -790,8 +799,6 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer) renderer->background_widget->ctx->fill(@image_pixel_flip_rgb_bgr(node->backgroundColor)); } - Context2DWidget* img_widget; - if (!StrICmp(node->tagName, "form")) @create_form_from_node(renderer, node); @@ -828,11 +835,13 @@ U0 @render_node_list(@html_dom_node* node, HtmlRenderer* renderer) @render_node_list(node->children->@(i), renderer); } + // Insert a block widget for the element's closing tag if (node->display_block) { block_widget = Gui.CreateWidget(renderer->win, WIDGET_TYPE_CONTEXT2D, U64_MAX, U64_MAX, 0, 0); block_widget->data = node; } + --renderer->indent; }