]> gitweb.michael.orlitzky.com - libsvgtiny.git/commitdiff
src/svgtiny*.{c,h}: move the libcss unit context into the parser state
authorMichael Orlitzky <michael@orlitzky.com>
Sat, 7 Jun 2025 15:39:59 +0000 (11:39 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Mon, 9 Jun 2025 01:13:07 +0000 (21:13 -0400)
This will make it easier to use the same unit context for style
composition that we do for style computation.

src/svgtiny.c
src/svgtiny_css.c
src/svgtiny_internal.h

index 1cc003ecfa7fda763ea5f8c28fe1027934fef65b..0f47df92da59bd68521fde01bf293b1d7046fa59 100644 (file)
@@ -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);
index 3ac078a9ae0e252e087b9c79d366e711e8182a39..d827688e9be8490e6c5e71889f8c745ddc2ce7ba 100644 (file)
@@ -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,
index 00595dd42a0477e242eca93c430e909c294b1f34..89524ab00af6b390dfabc7983189ad8898d1392c 100644 (file)
@@ -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;