]> 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>
Thu, 16 Nov 2023 20:34:37 +0000 (15:34 -0500)
committerMichael Orlitzky <michael@orlitzky.com>
Mon, 20 Nov 2023 16:42:58 +0000 (11:42 -0500)
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 4c88f6b0d757cc9795a3d64674573e8e2ab1021a..a70be0f50643530e86d9639204cc64b4569e3764 100644 (file)
@@ -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) \
index b80d0578b7bd219d8397a2532b23f1b4491e608d..3da3c8e165f34b0d6fb09cdcc04c488ecda3e0f8 100644 (file)
@@ -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,
index a7d0499439b57cc234b851aa2606a415703d58b9..5ece69d42c1ab66cfa52a46321e31d3f9b67fe8e 100644 (file)
@@ -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;