summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdrian Johnson <ajohnson@redneon.com>2023-02-08 20:09:15 +1030
committerAdrian Johnson <ajohnson@redneon.com>2023-02-08 20:09:15 +1030
commite85c242f0a4306f829b9587233dd366f2443a620 (patch)
treeee5ebacd6add423a3538056b60efadae32e8ca29 /src
parent4fbc2ea3869a5148529ee59161d78952b64bb697 (diff)
downloadcairo-e85c242f0a4306f829b9587233dd366f2443a620.tar.gz
Implement a font options compare function and use it in gstate
Valgrind is not happy with the memcmp() to compare font options and it won't work correctly with variations and custom_palette.
Diffstat (limited to 'src')
-rw-r--r--src/cairo-font-options.c35
-rw-r--r--src/cairo-gstate.c2
-rw-r--r--src/cairoint.h4
3 files changed, 40 insertions, 1 deletions
diff --git a/src/cairo-font-options.c b/src/cairo-font-options.c
index 361882ae5..8876d9265 100644
--- a/src/cairo-font-options.c
+++ b/src/cairo-font-options.c
@@ -105,6 +105,41 @@ _cairo_font_options_init_copy (cairo_font_options_t *options,
}
}
+cairo_bool_t
+_cairo_font_options_compare (const cairo_font_options_t *a,
+ const cairo_font_options_t *b)
+{
+ if (a->antialias != b->antialias ||
+ a->subpixel_order != b->subpixel_order ||
+ a->lcd_filter != b->lcd_filter ||
+ a->hint_style != b->hint_style ||
+ a->hint_metrics != b->hint_metrics ||
+ a->round_glyph_positions != b->round_glyph_positions ||
+ a->color_mode != b->color_mode ||
+ a->palette_index != b->palette_index ||
+ a->custom_palette_size != b->custom_palette_size)
+ {
+ return FALSE;
+ }
+
+ if (a->variations && b->variations && strcmp (a->variations, b->variations) != 0)
+ return FALSE;
+ else if (a->variations != b->variations)
+ return FALSE;
+
+ if (a->custom_palette && b->custom_palette &&
+ memcmp (a->custom_palette, b->custom_palette, sizeof (cairo_palette_color_t) * a->custom_palette_size) != 0)
+ {
+ return FALSE;
+ }
+ else if (a->custom_palette != b->custom_palette)
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
/**
* cairo_font_options_create:
*
diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c
index 0f4fd541a..8a253468d 100644
--- a/src/cairo-gstate.c
+++ b/src/cairo-gstate.c
@@ -1748,7 +1748,7 @@ void
_cairo_gstate_set_font_options (cairo_gstate_t *gstate,
const cairo_font_options_t *options)
{
- if (memcmp (options, &gstate->font_options, sizeof (cairo_font_options_t)) == 0)
+ if (_cairo_font_options_compare (options, &gstate->font_options))
return;
_cairo_gstate_unset_scaled_font (gstate);
diff --git a/src/cairoint.h b/src/cairoint.h
index 5ce747ee4..6682e4b30 100644
--- a/src/cairoint.h
+++ b/src/cairoint.h
@@ -897,6 +897,10 @@ cairo_private void
_cairo_font_options_init_copy (cairo_font_options_t *options,
const cairo_font_options_t *other);
+cairo_private cairo_bool_t
+_cairo_font_options_compare (const cairo_font_options_t *a,
+ const cairo_font_options_t *b);
+
cairo_private void
_cairo_font_options_fini (cairo_font_options_t *options);