From 588e38e0707a427b940d61de0d6dbfbae88629e9 Mon Sep 17 00:00:00 2001 From: Werner Lemberg Date: Sat, 4 Mar 2017 11:04:24 +0100 Subject: [PATCH] [truetype] Make `TT_Set_MM_Blend' set named instance index. * src/truetype/ttgxvar.h (GX_Blend): New array `normalized_stylecoords'. * src/truetype/ttgxvar.c (TT_Get_MM_Var): Allocate and fill `normalized_stylecoords'. (TT_Set_MM_Blend): Check instance tuple and adjust `face_index' accordingly. --- ChangeLog | 12 ++++++++++ src/truetype/ttgxvar.c | 50 +++++++++++++++++++++++++++++++++++++++--- src/truetype/ttgxvar.h | 3 +++ 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index d1003b372..af5b3439a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2017-03-04 Werner Lemberg + + [truetype] Make `TT_Set_MM_Blend' set named instance index. + + * src/truetype/ttgxvar.h (GX_Blend): New array + `normalized_stylecoords'. + + * src/truetype/ttgxvar.c (TT_Get_MM_Var): Allocate and fill + `normalized_stylecoords'. + (TT_Set_MM_Blend): Check instance tuple and adjust `face_index' + accordingly. + 2017-03-02 Werner Lemberg [truetype] Split off designer/normalized conversion routines. diff --git a/src/truetype/ttgxvar.c b/src/truetype/ttgxvar.c index 22297df50..50da2ea90 100644 --- a/src/truetype/ttgxvar.c +++ b/src/truetype/ttgxvar.c @@ -1933,6 +1933,7 @@ FT_Int i, j; FT_MM_Var* mmvar = NULL; FT_Fixed* next_coords; + FT_Fixed* nsc; FT_String* next_name; FT_Var_Axis* a; FT_Var_Named_Style* ns; @@ -2018,7 +2019,7 @@ if ( FT_NEW( face->blend ) ) goto Exit; - /* cannot overflow 32-bit arithmetic because of limits above */ + /* cannot overflow 32-bit arithmetic because of the validity check */ face->blend->mmvar_len = sizeof ( FT_MM_Var ) + fvar_head.axisCount * sizeof ( FT_Var_Axis ) + @@ -2108,7 +2109,20 @@ FT_TRACE5(( "\n" )); - ns = mmvar->namedstyle; + if ( fvar_head.instanceCount ) + { + /* named instance coordinates are stored as design coordinates; */ + /* we have to convert them to normalized coordinates also */ + if ( FT_NEW_ARRAY( face->blend->normalized_stylecoords, + fvar_head.axisCount * fvar_head.instanceCount ) ) + goto Exit; + + if ( !face->blend->avar_checked ) + ft_var_load_avar( face ); + } + + ns = mmvar->namedstyle; + nsc = face->blend->normalized_stylecoords; for ( i = 0; i < fvar_head.instanceCount; i++, ns++ ) { /* PostScript names add 2 bytes to the instance record size */ @@ -2125,6 +2139,12 @@ if ( usePsName ) ns->psid = FT_GET_USHORT(); + ft_var_to_normalized( face, + fvar_head.axisCount, + ns->coords, + nsc ); + nsc += fvar_head.axisCount; + FT_FRAME_EXIT(); } @@ -2216,7 +2236,7 @@ FT_Error error = FT_Err_Ok; GX_Blend blend; FT_MM_Var* mmvar; - FT_UInt i; + FT_UInt i, j; FT_Bool is_default_instance = 1; FT_Memory memory = face->root.memory; @@ -2342,6 +2362,30 @@ } } + /* check whether the current variation tuple coincides */ + /* with a named instance */ + + for ( i = 0; i < blend->mmvar->num_namedstyles; i++ ) + { + FT_Fixed* nsc = blend->normalized_stylecoords + i * blend->num_axis; + FT_Fixed* ns = blend->normalizedcoords; + + + for ( j = 0; j < blend->num_axis; j++, nsc++, ns++ ) + { + if ( *nsc != *ns ) + break; + } + + if ( j == blend->num_axis ) + break; + } + + /* adjust named instance index */ + face->root.face_index &= 0xFFFF; + if ( i < blend->mmvar->num_namedstyles ) + face->root.face_index |= ( i + 1 ) << 16; + face->is_default_instance = is_default_instance; Exit: diff --git a/src/truetype/ttgxvar.h b/src/truetype/ttgxvar.h index e431983b7..c59d52809 100644 --- a/src/truetype/ttgxvar.h +++ b/src/truetype/ttgxvar.h @@ -232,6 +232,9 @@ FT_BEGIN_HEADER FT_MM_Var* mmvar; FT_Offset mmvar_len; + FT_Fixed* normalized_stylecoords; + /* normalized_stylecoords[num_namedstyles][num_axis] */ + FT_Bool avar_checked; GX_AVarSegment avar_segment;