From ad6fad2888bd99685e4c03bd2c7d44734c608fdc Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Thu, 27 Apr 2023 23:06:51 +0200 Subject: [truetype] Fix style name handling for variation fonts. * include/freetype/internal/tttypes.h (TT_FaceRec): New field `non_var_style_name`. * src/sfnt/sfobjs.c (sfnt_load_face): Initialize `non_var_style_name`. (sfnt_done_face): Free `non_var_style_name`. * src/truetype/ttgxvar.c (TT_Set_Named_Instance): Restore non-VF style name if switching back to non-VF mode. --- include/freetype/internal/tttypes.h | 5 +++++ src/sfnt/sfobjs.c | 11 +++++++++++ src/truetype/ttgxvar.c | 11 +++++++++-- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/include/freetype/internal/tttypes.h b/include/freetype/internal/tttypes.h index 10af061b9..984121a0e 100644 --- a/include/freetype/internal/tttypes.h +++ b/include/freetype/internal/tttypes.h @@ -1318,6 +1318,9 @@ FT_BEGIN_HEADER * var_default_named_instance :: * The index of the default named instance. * + * non_var_style_name :: + * The non-variation style name, used as a backup. + * * horz_metrics_size :: * The size of the 'hmtx' table. * @@ -1556,6 +1559,8 @@ FT_BEGIN_HEADER FT_UInt var_postscript_prefix_len; /* since 2.7.2 */ FT_UInt var_default_named_instance; /* since 2.13.1 */ + + const char* non_var_style_name; /* since 2.13.1 */ #endif /* since version 2.2 */ diff --git a/src/sfnt/sfobjs.c b/src/sfnt/sfobjs.c index 1574c353d..f5d66ef84 100644 --- a/src/sfnt/sfobjs.c +++ b/src/sfnt/sfobjs.c @@ -1063,6 +1063,16 @@ GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); } +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + { + FT_Memory memory = face->root.memory; + + + if ( FT_STRDUP( face->non_var_style_name, face->root.style_name ) ) + goto Exit; + } +#endif + /* now set up root fields */ { FT_Face root = &face->root; @@ -1509,6 +1519,7 @@ #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT FT_FREE( face->var_postscript_prefix ); + FT_FREE( face->non_var_style_name ); #endif /* freeing glyph color palette data */ diff --git a/src/truetype/ttgxvar.c b/src/truetype/ttgxvar.c index aec43c851..249ef316a 100644 --- a/src/truetype/ttgxvar.c +++ b/src/truetype/ttgxvar.c @@ -3306,6 +3306,8 @@ GX_Blend blend; FT_MM_Var* mmvar; + FT_Memory memory = face->root.memory; + FT_UInt num_instances; @@ -3329,8 +3331,7 @@ if ( instance_index > 0 ) { - FT_Memory memory = face->root.memory; - SFNT_Service sfnt = (SFNT_Service)face->sfnt; + SFNT_Service sfnt = (SFNT_Service)face->sfnt; FT_Var_Named_Style* named_style; FT_String* style_name; @@ -3354,7 +3355,13 @@ named_style->coords ); } else + { + /* restore non-VF style name */ + FT_FREE( face->root.style_name ); + if ( FT_STRDUP( face->root.style_name, face->non_var_style_name ) ) + goto Exit; error = TT_Set_Var_Design( face, 0, NULL ); + } Exit: return error; -- cgit v1.2.1