From e85c242f0a4306f829b9587233dd366f2443a620 Mon Sep 17 00:00:00 2001 From: Adrian Johnson Date: Wed, 8 Feb 2023 20:09:15 +1030 Subject: 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. --- src/cairo-font-options.c | 35 +++++++++++++++++++++++++++++++++++ src/cairo-gstate.c | 2 +- src/cairoint.h | 4 ++++ 3 files changed, 40 insertions(+), 1 deletion(-) (limited to 'src') 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); -- cgit v1.2.1