From 370c219cf58f122c84bb435b4004b43bdd209bc3 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Sat, 7 Jun 2025 11:39:59 -0400 Subject: [PATCH] src/svgtiny*.{c,h}: move the libcss unit context into the parser state This will make it easier to use the same unit context for style composition that we do for style computation. --- src/svgtiny.c | 22 +++++++++++++++++++++- src/svgtiny_css.c | 28 +++++++++------------------- src/svgtiny_internal.h | 5 +++++ 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/svgtiny.c b/src/svgtiny.c index 1cc003e..0f47df9 100644 --- a/src/svgtiny.c +++ b/src/svgtiny.c @@ -1404,6 +1404,11 @@ initialise_parse_state(struct svgtiny_parse_state *state, return svgtiny_LIBCSS_ERROR; } + /* ...and the unit context, whose other fields were + * initialized along with the parser state itself */ + state->unit_ctx.viewport_width = FLTTOFIX(viewport_width); + state->unit_ctx.viewport_height = FLTTOFIX(viewport_height); + return svgtiny_OK; } @@ -1606,7 +1611,22 @@ svgtiny_code svgtiny_parse(struct svgtiny_diagram *diagram, { dom_document *document; dom_element *svg; - struct svgtiny_parse_state state; + struct svgtiny_parse_state state = { + /* Initialize the unit context here because it has a + * const member and doing it any other way subverts + * the type system. The magic numbers below were taken + * from the libcss example program without much + * thought, because at the moment we don't support any + * properties with units. */ + .unit_ctx = { + .font_size_default = FLTTOFIX(16.0), + .font_size_minimum = FLTTOFIX(6.0), + .device_dpi = FLTTOFIX(96.0), + .root_style = NULL, + .pw = NULL, + .measure = NULL, + } + }; svgtiny_code code; assert(diagram); diff --git a/src/svgtiny_css.c b/src/svgtiny_css.c index 3ac078a..d827688 100644 --- a/src/svgtiny_css.c +++ b/src/svgtiny_css.c @@ -73,6 +73,14 @@ static css_error get_libcss_node_data(void *pw, void *node, static struct css_select_handler svgtiny_select_handler; +/* Every call to svgtiny_select_style() needs this, so let's only make + * one copy. */ +static const css_media media_all = { + .type = CSS_MEDIA_ALL, +}; + + + /** * Convenient wrapper around css_select_style() * @@ -86,27 +94,9 @@ css_error svgtiny_select_style(struct svgtiny_parse_state *state, const css_stylesheet *inline_sheet, css_select_results **result) { - const css_media media_all = { - .type = CSS_MEDIA_ALL, - }; - - /* These magic numbers below were taken from the libcss - * example program without much thought, because at the moment - * we don't support any properties with units. */ - const css_unit_ctx unitctx = { - .viewport_width = FLTTOFIX(state->viewport_width), - .viewport_height = FLTTOFIX(state->viewport_height), - .font_size_default = FLTTOFIX(16.0), - .font_size_minimum = FLTTOFIX(6.0), - .device_dpi = FLTTOFIX(96.0), - .root_style = NULL, - .pw = NULL, - .measure = NULL, - }; - return css_select_style(state->select_ctx, node, - &unitctx, + &state->unit_ctx, &media_all, inline_sheet, &svgtiny_select_handler, diff --git a/src/svgtiny_internal.h b/src/svgtiny_internal.h index 00595dd..89524ab 100644 --- a/src/svgtiny_internal.h +++ b/src/svgtiny_internal.h @@ -61,6 +61,11 @@ struct svgtiny_parse_state { * precede it. */ css_select_ctx *select_ctx; + /* A libcss unit context. This is used to compute and compose + * styles, and is convenient to create once and pass along + * with the rest of the state. */ + css_unit_ctx unit_ctx; + /* Keep track of the parent element's computed style so that * we can compose its children's computed styles with it. */ css_computed_style *parent_style; -- 2.49.0