[base, truetype] New function `FT_Get_Var_Axis_Flags'.
The reserved `flags' field got a value in OpenType version 1.8.2; unfortunately, the public `FT_Var_Axis' structure misses the corresponding element. Since we can't add a new field, we add an access function. * src/base/ftmm.c (FT_Get_Var_Axis_Flags): New function. * include/freetype/ftmm.h (FT_VAR_AXIS_FLAG_HIDDEN): New macro. Updated. * src/truetype/ttgxvar.c (TT_Get_MM_Var): Increase allocated memory of `mmvar' to hold axis flags. Fill the axis flags array. * docs/CHANGES: Updated.
This commit is contained in:
parent
24e256ab00
commit
f43b3094ef
20
ChangeLog
20
ChangeLog
|
@ -1,3 +1,23 @@
|
||||||
|
2017-08-05 Werner Lemberg <wl@gnu.org>
|
||||||
|
|
||||||
|
[base, truetype] New function `FT_Get_Var_Axis_Flags'.
|
||||||
|
|
||||||
|
The reserved `flags' field got a value in OpenType version 1.8.2;
|
||||||
|
unfortunately, the public `FT_Var_Axis' structure misses the
|
||||||
|
corresponding element. Since we can't add a new field, we add an
|
||||||
|
access function.
|
||||||
|
|
||||||
|
* src/base/ftmm.c (FT_Get_Var_Axis_Flags): New function.
|
||||||
|
|
||||||
|
* include/freetype/ftmm.h (FT_VAR_AXIS_FLAG_HIDDEN): New macro.
|
||||||
|
Updated.
|
||||||
|
|
||||||
|
* src/truetype/ttgxvar.c (TT_Get_MM_Var): Increase allocated memory
|
||||||
|
of `mmvar' to hold axis flags.
|
||||||
|
Fill the axis flags array.
|
||||||
|
|
||||||
|
* docs/CHANGES: Updated.
|
||||||
|
|
||||||
2017-08-03 Nikolaus Waxweiler <madigens@gmail.com>
|
2017-08-03 Nikolaus Waxweiler <madigens@gmail.com>
|
||||||
|
|
||||||
[truetype] Fix metrics of B/W hinting in v40 mode.
|
[truetype] Fix metrics of B/W hinting in v40 mode.
|
||||||
|
|
|
@ -12,6 +12,10 @@ CHANGES BETWEEN 2.8 and 2.8.1
|
||||||
|
|
||||||
II. MISCELLANEOUS
|
II. MISCELLANEOUS
|
||||||
|
|
||||||
|
- Using the new function `FT_Get_Var_Axis_Flags', an application
|
||||||
|
can access the `flags' field of a variation axis (introduced in
|
||||||
|
OpenType version 1.8.2)
|
||||||
|
|
||||||
- More sanity checks.
|
- More sanity checks.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -196,7 +196,7 @@ FT_BEGIN_HEADER
|
||||||
/* FT_MM_Var */
|
/* FT_MM_Var */
|
||||||
/* */
|
/* */
|
||||||
/* <Description> */
|
/* <Description> */
|
||||||
/* A structure to model the axes and space of a Adobe MM, TrueType */
|
/* A structure to model the axes and space of an Adobe MM, TrueType */
|
||||||
/* GX, or OpenType variation font. */
|
/* GX, or OpenType variation font. */
|
||||||
/* */
|
/* */
|
||||||
/* Some fields are specific to one format and not to the others. */
|
/* Some fields are specific to one format and not to the others. */
|
||||||
|
@ -480,6 +480,50 @@ FT_BEGIN_HEADER
|
||||||
FT_UInt num_coords,
|
FT_UInt num_coords,
|
||||||
FT_Fixed* coords );
|
FT_Fixed* coords );
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* <Enum> */
|
||||||
|
/* FT_VAR_AXIS_FLAG_XXX */
|
||||||
|
/* */
|
||||||
|
/* <Description> */
|
||||||
|
/* A list of bit flags used in the return value of */
|
||||||
|
/* @FT_Get_Var_Axis_Flags. */
|
||||||
|
/* */
|
||||||
|
/* <Values> */
|
||||||
|
/* FT_VAR_AXIS_FLAG_HIDDEN :: */
|
||||||
|
/* The variation axis should not be exposed to user interfaces. */
|
||||||
|
/* */
|
||||||
|
#define FT_VAR_AXIS_FLAG_HIDDEN 1
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* <Function> */
|
||||||
|
/* FT_Get_Var_Axis_Flags */
|
||||||
|
/* */
|
||||||
|
/* <Description> */
|
||||||
|
/* Get the `flags' field of an OpenType Variation Axis Record. */
|
||||||
|
/* */
|
||||||
|
/* Not meaningful for Adobe MM fonts (`*flags' is always zero). */
|
||||||
|
/* */
|
||||||
|
/* <Input> */
|
||||||
|
/* master :: The variation descriptor. */
|
||||||
|
/* */
|
||||||
|
/* axis_index :: The index of the requested variation axis. */
|
||||||
|
/* */
|
||||||
|
/* <Output> */
|
||||||
|
/* flags :: The `flags' field. See @FT_VAR_AXIS_FLAG_XXX for */
|
||||||
|
/* possible values. */
|
||||||
|
/* */
|
||||||
|
/* <Return> */
|
||||||
|
/* FreeType error code. 0~means success. */
|
||||||
|
/* */
|
||||||
|
FT_EXPORT( FT_Error )
|
||||||
|
FT_Get_Var_Axis_Flags( FT_MM_Var* master,
|
||||||
|
FT_UInt axis_index,
|
||||||
|
FT_UInt* flags );
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -402,4 +402,28 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* documentation is in ftmm.h */
|
||||||
|
|
||||||
|
FT_EXPORT_DEF( FT_Error )
|
||||||
|
FT_Get_Var_Axis_Flags( FT_MM_Var* master,
|
||||||
|
FT_UInt axis_index,
|
||||||
|
FT_UInt* flags )
|
||||||
|
{
|
||||||
|
FT_UShort* axis_flags;
|
||||||
|
|
||||||
|
|
||||||
|
if ( !master || !flags )
|
||||||
|
return FT_THROW( Invalid_Argument );
|
||||||
|
|
||||||
|
if ( axis_index >= master->num_axis )
|
||||||
|
return FT_THROW( Invalid_Argument );
|
||||||
|
|
||||||
|
/* the axis flags array immediately follows the data of `master' */
|
||||||
|
axis_flags = (FT_UShort*)&( master[1] );
|
||||||
|
*flags = axis_flags[axis_index];
|
||||||
|
|
||||||
|
return FT_Err_Ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* END */
|
/* END */
|
||||||
|
|
|
@ -395,14 +395,14 @@
|
||||||
|
|
||||||
|
|
||||||
/* some macros we need */
|
/* some macros we need */
|
||||||
#define FT_FIXED_ONE ( (FT_Fixed)0x10000 )
|
#define FT_FIXED_ONE ( (FT_Fixed)0x10000 )
|
||||||
|
|
||||||
#define FT_fdot14ToFixed( x ) \
|
#define FT_fdot14ToFixed( x ) \
|
||||||
( (FT_Fixed)( (FT_ULong)(x) << 2 ) )
|
( (FT_Fixed)( (FT_ULong)(x) << 2 ) )
|
||||||
#define FT_intToFixed( i ) \
|
#define FT_intToFixed( i ) \
|
||||||
( (FT_Fixed)( (FT_ULong)(i) << 16 ) )
|
( (FT_Fixed)( (FT_ULong)(i) << 16 ) )
|
||||||
#define FT_fixedToInt( x ) \
|
#define FT_fixedToInt( x ) \
|
||||||
( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) )
|
( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) )
|
||||||
|
|
||||||
|
|
||||||
static FT_Error
|
static FT_Error
|
||||||
|
@ -1956,6 +1956,7 @@
|
||||||
GX_FVar_Head fvar_head;
|
GX_FVar_Head fvar_head;
|
||||||
FT_Bool usePsName;
|
FT_Bool usePsName;
|
||||||
FT_UInt num_instances;
|
FT_UInt num_instances;
|
||||||
|
FT_UShort* axis_flags;
|
||||||
|
|
||||||
static const FT_Frame_Field fvar_fields[] =
|
static const FT_Frame_Field fvar_fields[] =
|
||||||
{
|
{
|
||||||
|
@ -2041,14 +2042,16 @@
|
||||||
/* in fvar's table of named instances */
|
/* in fvar's table of named instances */
|
||||||
num_instances = face->root.style_flags >> 16;
|
num_instances = face->root.style_flags >> 16;
|
||||||
|
|
||||||
/* cannot overflow 32-bit arithmetic because of the size limits */
|
/* prepare storage area for MM data; this cannot overflow */
|
||||||
/* used in the `fvar' table validity check in `sfnt_init_face' */
|
/* 32-bit arithmetic because of the size limits used in the */
|
||||||
|
/* `fvar' table validity check in `sfnt_init_face' */
|
||||||
face->blend->mmvar_len =
|
face->blend->mmvar_len =
|
||||||
sizeof ( FT_MM_Var ) +
|
sizeof ( FT_MM_Var ) +
|
||||||
|
fvar_head.axisCount * sizeof ( FT_UShort ) +
|
||||||
fvar_head.axisCount * sizeof ( FT_Var_Axis ) +
|
fvar_head.axisCount * sizeof ( FT_Var_Axis ) +
|
||||||
num_instances * sizeof ( FT_Var_Named_Style ) +
|
num_instances * sizeof ( FT_Var_Named_Style ) +
|
||||||
num_instances * fvar_head.axisCount * sizeof ( FT_Fixed ) +
|
num_instances * fvar_head.axisCount * sizeof ( FT_Fixed ) +
|
||||||
5 * fvar_head.axisCount;
|
fvar_head.axisCount * 5;
|
||||||
|
|
||||||
if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )
|
if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )
|
||||||
goto Exit;
|
goto Exit;
|
||||||
|
@ -2065,8 +2068,12 @@
|
||||||
/* (or tuples, as called by Apple) */
|
/* (or tuples, as called by Apple) */
|
||||||
mmvar->num_namedstyles =
|
mmvar->num_namedstyles =
|
||||||
num_instances;
|
num_instances;
|
||||||
|
|
||||||
|
/* alas, no public field in `FT_Var_Axis' for axis flags */
|
||||||
|
axis_flags =
|
||||||
|
(FT_UShort*)&( mmvar[1] );
|
||||||
mmvar->axis =
|
mmvar->axis =
|
||||||
(FT_Var_Axis*)&( mmvar[1] );
|
(FT_Var_Axis*)&( axis_flags[fvar_head.axisCount] );
|
||||||
mmvar->namedstyle =
|
mmvar->namedstyle =
|
||||||
(FT_Var_Named_Style*)&( mmvar->axis[fvar_head.axisCount] );
|
(FT_Var_Named_Style*)&( mmvar->axis[fvar_head.axisCount] );
|
||||||
|
|
||||||
|
@ -2110,6 +2117,8 @@
|
||||||
a->name[3] = (FT_String)( ( a->tag ) & 0xFF );
|
a->name[3] = (FT_String)( ( a->tag ) & 0xFF );
|
||||||
a->name[4] = '\0';
|
a->name[4] = '\0';
|
||||||
|
|
||||||
|
*axis_flags = axis_rec.flags;
|
||||||
|
|
||||||
if ( a->minimum > a->def ||
|
if ( a->minimum > a->def ||
|
||||||
a->def > a->maximum )
|
a->def > a->maximum )
|
||||||
{
|
{
|
||||||
|
@ -2121,13 +2130,17 @@
|
||||||
a->maximum = a->def;
|
a->maximum = a->def;
|
||||||
}
|
}
|
||||||
|
|
||||||
FT_TRACE5(( " \"%s\": minimum=%.5f, default=%.5f, maximum=%.5f\n",
|
FT_TRACE5(( " \"%s\":"
|
||||||
|
" minimum=%.5f, default=%.5f, maximum=%.5f,"
|
||||||
|
" flags=0x%04X\n",
|
||||||
a->name,
|
a->name,
|
||||||
a->minimum / 65536.0,
|
a->minimum / 65536.0,
|
||||||
a->def / 65536.0,
|
a->def / 65536.0,
|
||||||
a->maximum / 65536.0 ));
|
a->maximum / 65536.0,
|
||||||
|
*axis_flags ));
|
||||||
|
|
||||||
a++;
|
a++;
|
||||||
|
axis_flags++;
|
||||||
}
|
}
|
||||||
|
|
||||||
FT_TRACE5(( "\n" ));
|
FT_TRACE5(( "\n" ));
|
||||||
|
@ -2244,13 +2257,15 @@
|
||||||
goto Exit;
|
goto Exit;
|
||||||
FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len );
|
FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len );
|
||||||
|
|
||||||
|
axis_flags =
|
||||||
|
(FT_UShort*)&( mmvar[1] );
|
||||||
mmvar->axis =
|
mmvar->axis =
|
||||||
(FT_Var_Axis*)&( mmvar[1] );
|
(FT_Var_Axis*)&( axis_flags[mmvar->num_axis] );
|
||||||
mmvar->namedstyle =
|
mmvar->namedstyle =
|
||||||
(FT_Var_Named_Style*)&( mmvar->axis[mmvar->num_axis] );
|
(FT_Var_Named_Style*)&( mmvar->axis[mmvar->num_axis] );
|
||||||
|
|
||||||
next_coords =
|
next_coords =
|
||||||
(FT_Fixed*)&( mmvar->namedstyle[mmvar->num_namedstyles] );
|
(FT_Fixed*)&( mmvar->namedstyle[mmvar->num_namedstyles] );
|
||||||
|
|
||||||
for ( n = 0; n < mmvar->num_namedstyles; n++ )
|
for ( n = 0; n < mmvar->num_namedstyles; n++ )
|
||||||
{
|
{
|
||||||
mmvar->namedstyle[n].coords = next_coords;
|
mmvar->namedstyle[n].coords = next_coords;
|
||||||
|
|
Loading…
Reference in New Issue