From: Michael Orlitzky Date: Thu, 16 Nov 2023 20:34:37 +0000 (-0500) Subject: src/svgtiny*.{c,h}: move the libcss unit context into the parser state X-Git-Url: http://gitweb.michael.orlitzky.com/?a=commitdiff_plain;h=7b8fc7bb381c266a4f1ecde5b10bb4c09e2f9bc0;p=libsvgtiny.git 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. --- diff --git a/src/svgtiny.c b/src/svgtiny.c index 4c88f6b..a70be0f 100644 --- a/src/svgtiny.c +++ b/src/svgtiny.c @@ -628,7 +628,22 @@ svgtiny_code svgtiny_parse(struct svgtiny_diagram *diagram, dom_element *svg; dom_string *svg_name; lwc_string *svg_name_lwc; - 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, + } + }; float x, y, width, height; svgtiny_code code; @@ -716,6 +731,11 @@ svgtiny_code svgtiny_parse(struct svgtiny_diagram *diagram, 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); + #define SVGTINY_STRING_ACTION2(s,n) \ if (dom_string_create_interned((const uint8_t *) #n, \ strlen(#n), &state.interned_##s) \ diff --git a/src/svgtiny_css.c b/src/svgtiny_css.c index b80d057..3da3c8e 100644 --- a/src/svgtiny_css.c +++ b/src/svgtiny_css.c @@ -73,6 +73,12 @@ 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 +92,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 a7d0499..5ece69d 100644 --- a/src/svgtiny_internal.h +++ b/src/svgtiny_internal.h @@ -54,6 +54,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;