Make `FT_FACE_FLAG_VARIATION' work.
* include/freetype/internal/tttypes.h (TT_Face): Remove `is_default_instance'; this can be replaced with a combination of `FT_IS_VARIATION' and `FT_IS_INSTANCE'. * src/cff/cffdrivr.c (cff_get_advances): Updated. * src/sfnt/sfdriver.c (sfnt_get_ps_name), src/sfnt/sfobjs.c (sfnt_init_face): Updated. * src/truetype/ttdriver.c (tt_get_advances), src/truetype/ttgload.c (TT_Process_Simple_Glyph, load_truetype_glyph, IS_DEFAULT_INSTANCE), src/truetype/ttgxvar.c (tt_set_mm_blend): Updated. * src/truetype/ttgxvar.c (TT_Set_MM_Blend, TT_Set_Var_Design): Handle `FT_FACE_FLAG_VARIATION'. * src/type1/t1load.c (T1_Set_MM_Blend, T1_Set_MM_Design): Handle `FT_FACE_FLAG_VARIATION'.
This commit is contained in:
parent
dd8539ef82
commit
8c92f7622c
22
ChangeLog
22
ChangeLog
|
@ -1,3 +1,25 @@
|
|||
2017-10-07 Werner Lemberg <wl@gnu.org>
|
||||
|
||||
Make `FT_FACE_FLAG_VARIATION' work.
|
||||
|
||||
* include/freetype/internal/tttypes.h (TT_Face): Remove
|
||||
`is_default_instance'; this can be replaced with a combination of
|
||||
`FT_IS_VARIATION' and `FT_IS_INSTANCE'.
|
||||
|
||||
* src/cff/cffdrivr.c (cff_get_advances): Updated.
|
||||
|
||||
* src/sfnt/sfdriver.c (sfnt_get_ps_name), src/sfnt/sfobjs.c
|
||||
(sfnt_init_face): Updated.
|
||||
|
||||
* src/truetype/ttdriver.c (tt_get_advances), src/truetype/ttgload.c
|
||||
(TT_Process_Simple_Glyph, load_truetype_glyph, IS_DEFAULT_INSTANCE),
|
||||
src/truetype/ttgxvar.c (tt_set_mm_blend): Updated.
|
||||
* src/truetype/ttgxvar.c (TT_Set_MM_Blend, TT_Set_Var_Design):
|
||||
Handle `FT_FACE_FLAG_VARIATION'.
|
||||
|
||||
* src/type1/t1load.c (T1_Set_MM_Blend, T1_Set_MM_Design): Handle
|
||||
`FT_FACE_FLAG_VARIATION'.
|
||||
|
||||
2017-10-07 Werner Lemberg <wl@gnu.org>
|
||||
|
||||
New function `FT_Set_Named_Instance'.
|
||||
|
|
|
@ -1299,10 +1299,6 @@ FT_BEGIN_HEADER
|
|||
/* variation tables (rather like Multiple */
|
||||
/* Master data). */
|
||||
/* */
|
||||
/* is_default_instance :: Set if the glyph outlines can be used */
|
||||
/* unmodified (i.e., without applying glyph */
|
||||
/* variation deltas). */
|
||||
/* */
|
||||
/* variation_support :: Flags that indicate which OpenType */
|
||||
/* functionality related to font variation */
|
||||
/* support is present, valid, and usable. */
|
||||
|
@ -1512,7 +1508,6 @@ FT_BEGIN_HEADER
|
|||
FT_Bool doblend;
|
||||
GX_Blend blend;
|
||||
|
||||
FT_Bool is_default_instance; /* since 2.7.1 */
|
||||
FT_UInt32 variation_support; /* since 2.7.1 */
|
||||
|
||||
const char* var_postscript_prefix; /* since 2.7.2 */
|
||||
|
|
|
@ -217,8 +217,8 @@
|
|||
{
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
/* no fast retrieval for blended MM fonts without VVAR table */
|
||||
if ( !ttface->is_default_instance &&
|
||||
!( ttface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
|
||||
if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
|
||||
!( ttface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
|
||||
return FT_THROW( Unimplemented_Feature );
|
||||
#endif
|
||||
|
||||
|
@ -249,8 +249,8 @@
|
|||
{
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
/* no fast retrieval for blended MM fonts without HVAR table */
|
||||
if ( !ttface->is_default_instance &&
|
||||
!( ttface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
|
||||
if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
|
||||
!( ttface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
|
||||
return FT_THROW( Unimplemented_Feature );
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1029,7 +1029,9 @@
|
|||
return face->postscript_name;
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
if ( face->blend && !face->is_default_instance )
|
||||
if ( face->blend &&
|
||||
( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ||
|
||||
FT_IS_VARIATION( FT_FACE( face ) ) ) )
|
||||
{
|
||||
face->postscript_name = sfnt_get_var_ps_name( face );
|
||||
return face->postscript_name;
|
||||
|
|
|
@ -962,8 +962,6 @@
|
|||
FT_Byte* instance_values = NULL;
|
||||
|
||||
|
||||
face->is_default_instance = 1;
|
||||
|
||||
instance_index = FT_ABS( face_instance_index ) >> 16;
|
||||
|
||||
/* test whether current face is a GX font with named instances */
|
||||
|
|
|
@ -233,8 +233,8 @@
|
|||
{
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
/* no fast retrieval for blended MM fonts without VVAR table */
|
||||
if ( !face->is_default_instance &&
|
||||
!( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
|
||||
if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) &&
|
||||
!( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
|
||||
return FT_THROW( Unimplemented_Feature );
|
||||
#endif
|
||||
|
||||
|
@ -253,8 +253,8 @@
|
|||
{
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
/* no fast retrieval for blended MM fonts without HVAR table */
|
||||
if ( !face->is_default_instance &&
|
||||
!( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
|
||||
if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) &&
|
||||
!( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
|
||||
return FT_THROW( Unimplemented_Feature );
|
||||
#endif
|
||||
|
||||
|
|
|
@ -889,7 +889,8 @@
|
|||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
|
||||
if ( !loader->face->is_default_instance )
|
||||
if ( FT_IS_NAMED_INSTANCE( FT_FACE( loader->face ) ) ||
|
||||
FT_IS_VARIATION( FT_FACE( loader->face ) ) )
|
||||
{
|
||||
/* Deltas apply to the unscaled data. */
|
||||
error = TT_Vary_Apply_Glyph_Deltas( loader->face,
|
||||
|
@ -1577,7 +1578,8 @@
|
|||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
|
||||
if ( !loader->face->is_default_instance )
|
||||
if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ||
|
||||
FT_IS_VARIATION( FT_FACE( face ) ) )
|
||||
{
|
||||
/* a small outline structure with four elements for */
|
||||
/* communication with `TT_Vary_Apply_Glyph_Deltas' */
|
||||
|
@ -1751,7 +1753,8 @@
|
|||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
|
||||
if ( !face->is_default_instance )
|
||||
if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ||
|
||||
FT_IS_VARIATION( FT_FACE( face ) ) )
|
||||
{
|
||||
short i, limit;
|
||||
FT_SubGlyph subglyph;
|
||||
|
@ -2609,7 +2612,8 @@
|
|||
TT_LoaderRec loader;
|
||||
|
||||
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
||||
#define IS_DEFAULT_INSTANCE ( ( (TT_Face)glyph->face )->is_default_instance )
|
||||
#define IS_DEFAULT_INSTANCE ( !( FT_IS_NAMED_INSTANCE( glyph->face ) || \
|
||||
FT_IS_VARIATION( glyph->face ) ) )
|
||||
#else
|
||||
#define IS_DEFAULT_INSTANCE 1
|
||||
#endif
|
||||
|
|
|
@ -2350,8 +2350,7 @@
|
|||
FT_MM_Var* mmvar;
|
||||
FT_UInt i, j;
|
||||
|
||||
FT_Bool is_default_instance = TRUE;
|
||||
FT_Bool all_design_coords = FALSE;
|
||||
FT_Bool all_design_coords = FALSE;
|
||||
|
||||
FT_Memory memory = face->root.memory;
|
||||
|
||||
|
@ -2396,9 +2395,6 @@
|
|||
error = FT_THROW( Invalid_Argument );
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if ( coords[i] != 0 )
|
||||
is_default_instance = FALSE;
|
||||
}
|
||||
|
||||
FT_TRACE5(( "\n" ));
|
||||
|
@ -2517,8 +2513,6 @@
|
|||
if ( i < blend->mmvar->num_namedstyles )
|
||||
face->root.face_index |= ( i + 1 ) << 16;
|
||||
|
||||
face->is_default_instance = is_default_instance;
|
||||
|
||||
/* enforce recomputation of the PostScript name; */
|
||||
FT_FREE( face->postscript_name );
|
||||
face->postscript_name = NULL;
|
||||
|
@ -2558,7 +2552,19 @@
|
|||
FT_UInt num_coords,
|
||||
FT_Fixed* coords )
|
||||
{
|
||||
return tt_set_mm_blend( face, num_coords, coords, 1 );
|
||||
FT_Error error;
|
||||
|
||||
|
||||
error = tt_set_mm_blend( face, num_coords, coords, 1 );
|
||||
if ( error )
|
||||
return error;
|
||||
|
||||
if ( num_coords )
|
||||
face->root.face_flags |= FT_FACE_FLAG_VARIATION;
|
||||
else
|
||||
face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
|
||||
|
||||
return FT_Err_Ok;
|
||||
}
|
||||
|
||||
|
||||
|
@ -2721,6 +2727,13 @@
|
|||
ft_var_to_normalized( face, num_coords, blend->coords, normalized );
|
||||
|
||||
error = tt_set_mm_blend( face, mmvar->num_axis, normalized, 0 );
|
||||
if ( error )
|
||||
goto Exit;
|
||||
|
||||
if ( num_coords )
|
||||
face->root.face_flags |= FT_FACE_FLAG_VARIATION;
|
||||
else
|
||||
face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
|
||||
|
||||
Exit:
|
||||
FT_FREE( normalized );
|
||||
|
|
|
@ -417,7 +417,19 @@
|
|||
FT_UInt num_coords,
|
||||
FT_Fixed* coords )
|
||||
{
|
||||
return t1_set_mm_blend( face, num_coords, coords );
|
||||
FT_Error error;
|
||||
|
||||
|
||||
error = t1_set_mm_blend( face, num_coords, coords );
|
||||
if ( error )
|
||||
return error;
|
||||
|
||||
if ( num_coords )
|
||||
face->root.face_flags |= FT_FACE_FLAG_VARIATION;
|
||||
else
|
||||
face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
|
||||
|
||||
return FT_Err_Ok;
|
||||
}
|
||||
|
||||
|
||||
|
@ -461,6 +473,7 @@
|
|||
FT_UInt num_coords,
|
||||
FT_Long* coords )
|
||||
{
|
||||
FT_Error error;
|
||||
PS_Blend blend = face->blend;
|
||||
FT_UInt n, p;
|
||||
FT_Fixed final_blends[T1_MAX_MM_DESIGNS];
|
||||
|
@ -527,7 +540,16 @@
|
|||
final_blends[n] = the_blend;
|
||||
}
|
||||
|
||||
return t1_set_mm_blend( face, blend->num_axis, final_blends );
|
||||
error = t1_set_mm_blend( face, blend->num_axis, final_blends );
|
||||
if ( error )
|
||||
return error;
|
||||
|
||||
if ( num_coords )
|
||||
face->root.face_flags |= FT_FACE_FLAG_VARIATION;
|
||||
else
|
||||
face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
|
||||
|
||||
return FT_Err_Ok;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue