[truetype] Introduce named instance access to GX fonts.

For functions querying a face, bits 16-30 of the face index can hold
the named instance index if we have a GX font.  The indices start
with value 1; value 0 indicates font access without GX variation
data.

* include/freetype/freetype.h (FT_FaceRec): Update documentation.
* include/freetype/internal/sfnt.h: Ditto.

* src/sfnt/sfobjs.c (sfnt_init_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Get number of named instances and
do argument checks.
(sfnt_load_face): Updated.

* src/truetype/ttobjs.c (tt_face_init)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Use named instance, overwriting
the style name.

* src/base/ftobjs.c (open_face_from_buffer,
open_face_PS_from_sfnt_stream): Updated.
* src/bdf/bdfdrivr.c (BDF_Face_Init): Updated.
* src/cff/cffload.c (cff_font_load): Updated.

* src/cff/cffobjs.c (cff_face_init): Make function exit early for
pure CFF fonts if `font_index < 0'.
Updated.

* src/cid/cidobjs.c (cid_face_init): Updated.
* src/pcf/pcfdrivr.c (PCF_Face_Init): Updated.
* src/pfr/pfrobjs.c (pfr_face_init): Updated.
* src/type1/t1objs.c (T1_Face_Init): Updated.
* src/type42/t42objs.c (T42_Face_Init): Updated.
* src/winfonts/winfnt.c (fnt_face_get_dll_font, FNT_Face_Init):
Updated.

* docs/CHANGES: Updated.
This commit is contained in:
Werner Lemberg 2015-08-13 15:22:17 +02:00
parent 4afc0a54ed
commit 14d6b5d748
17 changed files with 349 additions and 74 deletions

View File

@ -1,3 +1,43 @@
2015-08-13 Werner Lemberg <wl@gnu.org>
[truetype] Introduce named instance access to GX fonts.
For functions querying a face, bits 16-30 of the face index can hold
the named instance index if we have a GX font. The indices start
with value 1; value 0 indicates font access without GX variation
data.
* include/freetype/freetype.h (FT_FaceRec): Update documentation.
* include/freetype/internal/sfnt.h: Ditto.
* src/sfnt/sfobjs.c (sfnt_init_face)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Get number of named instances and
do argument checks.
(sfnt_load_face): Updated.
* src/truetype/ttobjs.c (tt_face_init)
[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Use named instance, overwriting
the style name.
* src/base/ftobjs.c (open_face_from_buffer,
open_face_PS_from_sfnt_stream): Updated.
* src/bdf/bdfdrivr.c (BDF_Face_Init): Updated.
* src/cff/cffload.c (cff_font_load): Updated.
* src/cff/cffobjs.c (cff_face_init): Make function exit early for
pure CFF fonts if `font_index < 0'.
Updated.
* src/cid/cidobjs.c (cid_face_init): Updated.
* src/pcf/pcfdrivr.c (PCF_Face_Init): Updated.
* src/pfr/pfrobjs.c (pfr_face_init): Updated.
* src/type1/t1objs.c (T1_Face_Init): Updated.
* src/type42/t42objs.c (T42_Face_Init): Updated.
* src/winfonts/winfnt.c (fnt_face_get_dll_font, FNT_Face_Init):
Updated.
* docs/CHANGES: Updated.
2015-08-12 Alexei Podtelezhnikov <apodtele@gmail.com>
[type1,cff,cid] Streamline font matrix application.

View File

@ -33,6 +33,19 @@ CHANGES BETWEEN 2.6 and 2.6.1
don't need any change to the source code.
- Simple access to named instances in GX variation fonts is now
available (in addition to the previous method via FreeType's MM
interface). In the FT_Face structure, bits 16-30 of the
`face_index' field hold the current named instance index for the
given face index, and bits 16-30 of `style_flags' contain the
number of instances for the given face index. `FT_Open_Face'
and friends also understand the extended bits of the face index
parameter.
You need to enable TT_CONFIG_OPTION_GX_VAR_SUPPORT for this new
feature. Otherwise, bits 16-30 of the two fields are zero (or
are ignored).
III. MISCELLANEOUS

View File

@ -876,17 +876,36 @@ FT_BEGIN_HEADER
/* font formats can have multiple faces in */
/* a font file. */
/* */
/* face_index :: The index of the face in the font file. It */
/* is set to~0 if there is only one face in */
/* face_index :: This field holds two different values. */
/* Bits 0-15 are the index of the face in the */
/* font file (starting with value~0). They */
/* are set to~0 if there is only one face in */
/* the font file. */
/* */
/* Bits 16-30 are relevant to GX variation */
/* fonts only, holding the named instance */
/* index for the current face index (starting */
/* with value~1; value~0 indicates font access */
/* without GX variation data). For non-GX */
/* fonts, bits 16-30 are ignored. If we have */
/* the third named instance of face~4, say, */
/* `face_index' is set to 0x00030004. */
/* */
/* Bit 31 is always zero (this is, */
/* `face_index' is always a positive value). */
/* */
/* face_flags :: A set of bit flags that give important */
/* information about the face; see */
/* @FT_FACE_FLAG_XXX for the details. */
/* */
/* style_flags :: A set of bit flags indicating the style of */
/* the face; see @FT_STYLE_FLAG_XXX for the */
/* details. */
/* style_flags :: The lower 16~bits contain a set of bit */
/* flags indicating the style of the face; see */
/* @FT_STYLE_FLAG_XXX for the details. Bits */
/* 16-30 hold the number of named instances */
/* available for the current face if we have a */
/* GX variation (sub)font. Bit 31 is always */
/* zero (this is, `style_flags' is always a */
/* positive value). */
/* */
/* num_glyphs :: The number of glyphs in the face. If the */
/* face is scalable and has sbits (see */
@ -1392,7 +1411,7 @@ FT_BEGIN_HEADER
/* FT_STYLE_FLAG_XXX */
/* */
/* <Description> */
/* A list of bit-flags used to indicate the style of a given face. */
/* A list of bit flags used to indicate the style of a given face. */
/* These are used in the `style_flags' field of @FT_FaceRec. */
/* */
/* <Values> */
@ -1824,7 +1843,7 @@ FT_BEGIN_HEADER
/* FT_OPEN_XXX */
/* */
/* <Description> */
/* A list of bit-field constants used within the `flags' field of the */
/* A list of bit field constants used within the `flags' field of the */
/* @FT_Open_Args structure. */
/* */
/* <Values> */
@ -1971,13 +1990,12 @@ FT_BEGIN_HEADER
/* <Input> */
/* pathname :: A path to the font file. */
/* */
/* face_index :: The index of the face within the font. The first */
/* face has index~0. */
/* face_index :: See @FT_Open_Face for a detailed description of this */
/* parameter. */
/* */
/* <Output> */
/* aface :: A handle to a new face object. If `face_index' is */
/* greater than or equal to zero, it must be non-NULL. */
/* See @FT_Open_Face for more details. */
/* */
/* <Return> */
/* FreeType error code. 0~means success. */
@ -2010,13 +2028,12 @@ FT_BEGIN_HEADER
/* */
/* file_size :: The size of the memory chunk used by the font data. */
/* */
/* face_index :: The index of the face within the font. The first */
/* face has index~0. */
/* face_index :: See @FT_Open_Face for a detailed description of this */
/* parameter. */
/* */
/* <Output> */
/* aface :: A handle to a new face object. If `face_index' is */
/* greater than or equal to zero, it must be non-NULL. */
/* See @FT_Open_Face for more details. */
/* */
/* <Return> */
/* FreeType error code. 0~means success. */
@ -2048,13 +2065,43 @@ FT_BEGIN_HEADER
/* args :: A pointer to an `FT_Open_Args' structure that must */
/* be filled by the caller. */
/* */
/* face_index :: The index of the face within the font. The first */
/* face has index~0. */
/* face_index :: This field holds two different values. Bits 0-15 */
/* are the index of the face in the font file (starting */
/* with value~0). Set it to~0 if there is only one */
/* face in the font file. */
/* */
/* Bits 16-30 are relevant to GX variation fonts only, */
/* specifying the named instance index for the current */
/* face index (starting with value~1; value~0 makes */
/* FreeType ignore named instances). For non-GX fonts, */
/* bits 16-30 are ignored. Assuming that you want to */
/* access the third named instance in face~4, */
/* `face_index' should be set to 0x00030004. If you */
/* want to access face~4 without GX variation handling, */
/* simply set `face_index' to value~4. */
/* */
/* FT_Open_Face and its siblings can be used to quickly */
/* check whether the font format of a given font */
/* resource is supported by FreeType. In general, if */
/* the `face_index' argument is negative, the */
/* function's return value is~0 if the font format is */
/* recognized, or non-zero otherwise. The function */
/* allocates a more or less empty face handle in */
/* `*aface' (if `aface' isn't NULL); the only two */
/* useful fields in this special case are */
/* `face->num_faces' and `face->style_flags'. For any */
/* negative value of `face_index', `face->num_faces' */
/* gives the number of faces within the font file. For */
/* the negative value `-(N+1)' (with `N' a 16-bit */
/* value), bits 16-30 in `face->style_flags' give the */
/* number of named instances in face `N' if we have a */
/* GX variation font (or zero otherwise). After */
/* examination, the returned @FT_Face structure should */
/* be deallocated with a call to @FT_Done_Face. */
/* */
/* <Output> */
/* aface :: A handle to a new face object. If `face_index' is */
/* greater than or equal to zero, it must be non-NULL. */
/* See note below. */
/* */
/* <Return> */
/* FreeType error code. 0~means success. */
@ -2064,16 +2111,6 @@ FT_BEGIN_HEADER
/* slot for the face object that can be accessed directly through */
/* `face->glyph'. */
/* */
/* FT_Open_Face can be used to quickly check whether the font */
/* format of a given font resource is supported by FreeType. If the */
/* `face_index' field is negative, the function's return value is~0 */
/* if the font format is recognized, or non-zero otherwise; */
/* the function returns a more or less empty face handle in `*aface' */
/* (if `aface' isn't NULL). The only useful field in this special */
/* case is `face->num_faces' that gives the number of faces within */
/* the font file. After examination, the returned @FT_Face structure */
/* should be deallocated with a call to @FT_Done_Face. */
/* */
/* Each new face object created with this function also owns a */
/* default @FT_Size object, accessible as `face->size'. */
/* */
@ -2084,6 +2121,74 @@ FT_BEGIN_HEADER
/* See the discussion of reference counters in the description of */
/* @FT_Reference_Face. */
/* */
/* To loop over all faces, use code similar to the following snippet */
/* (omitting the error handling). */
/* */
/* { */
/* ... */
/* FT_Face face; */
/* FT_Long i, num_faces; */
/* */
/* */
/* error = FT_Open_Face( library, args, -1, &face ); */
/* if ( error ) { ... } */
/* */
/* num_faces = face->num_faces; */
/* FT_Done_Face( face ); */
/* */
/* for ( i = 0; i < num_faces; i++ ) */
/* { */
/* ... */
/* error = FT_Open_Face( library, args, i, &face ); */
/* ... */
/* FT_Done_Face( face ); */
/* ... */
/* } */
/* } */
/* */
/* To loop over all valid values for `face_index', use something */
/* similar to the following snippet, again without error handling. */
/* The code accesses all faces immediately (thus only a single call */
/* of `FT_Open_Face' within the do-loop), with and without named */
/* instances. */
/* */
/* { */
/* ... */
/* FT_Face face; */
/* */
/* FT_Long num_faces = 0; */
/* FT_Long num_instances = 0; */
/* */
/* FT_Long face_idx = 0; */
/* FT_Long instance_idx = 0; */
/* */
/* */
/* do */
/* { */
/* FT_Long id = ( instance_idx << 16 ) + face_idx; */
/* */
/* */
/* error = FT_Open_Face( library, args, id, &face ); */
/* if ( error ) { ... } */
/* */
/* num_faces = face->num_faces; */
/* num_instances = face->style_flags >> 16; */
/* */
/* ... */
/* */
/* FT_Done_Face( face ); */
/* */
/* if ( instance_idx < num_instances ) */
/* instance_idx++; */
/* else */
/* { */
/* face_idx++; */
/* instance_idx = 0; */
/* } */
/* */
/* } while ( face_idx < num_faces ) */
/* } */
/* */
FT_EXPORT( FT_Error )
FT_Open_Face( FT_Library library,
const FT_Open_Args* args,
@ -2521,7 +2626,7 @@ FT_BEGIN_HEADER
* FT_LOAD_XXX
*
* @description:
* A list of bit-field constants used with @FT_Load_Glyph to indicate
* A list of bit field constants used with @FT_Load_Glyph to indicate
* what kind of operations to perform during glyph loading.
*
* @values:

View File

@ -44,7 +44,9 @@ FT_BEGIN_HEADER
/* face :: A handle to the target face object. */
/* */
/* face_index :: The index of the TrueType font, if we are opening a */
/* collection. */
/* collection, in bits 0-15. The numbered instance */
/* index~+~1 of a GX (sub)font, if applicable, in bits */
/* 16-30. */
/* */
/* num_params :: The number of additional parameters. */
/* */
@ -87,7 +89,9 @@ FT_BEGIN_HEADER
/* face :: A handle to the target face object. */
/* */
/* face_index :: The index of the TrueType font, if we are opening a */
/* collection. */
/* collection, in bits 0-15. The numbered instance */
/* index~+~1 of a GX (sub)font, if applicable, in bits */
/* 16-30. */
/* */
/* num_params :: The number of additional parameters. */
/* */

View File

@ -1375,13 +1375,13 @@
}
#ifdef FT_MACINTOSH
/* At this point, face_index has served its purpose; */
/* At this point, the face index has served its purpose; */
/* whoever calls this function has already used it to */
/* locate the correct font data. We should not propagate */
/* this index to FT_Open_Face() (unless it is negative). */
if ( face_index > 0 )
face_index = 0;
face_index &= 0x7FFF0000L; /* retain GX data */
#endif
error = FT_Open_Face( library, &args, face_index, aface );
@ -1495,6 +1495,10 @@
FT_UNUSED( params );
/* ignore GX stuff */
if ( face_index > 0 )
face_index &= 0xFFFFL;
pos = FT_STREAM_POS();
error = ft_lookup_PS_in_sfnt_stream( stream,
@ -1737,7 +1741,7 @@
/* The resource header says we've got resource_cnt `sfnt' */
/* (TrueType/OpenType) resources in this file. Look through */
/* them for the one indicated by face_index, load it into mem, */
/* pass it on the the truetype driver and return it. */
/* pass it on to the truetype driver, and return it. */
/* */
static FT_Error
Mac_Read_sfnt_Resource( FT_Library library,

View File

@ -379,7 +379,8 @@ THE SOFTWARE.
* an invalid argument error when the font could be
* opened by the specified driver.
*/
if ( face_index > 0 ) {
if ( face_index > 0 && ( face_index & 0xFFFF ) > 0 )
{
FT_ERROR(( "BDF_Face_Init: invalid face index\n" ));
BDF_Face_Done( bdfface );
return FT_THROW( Invalid_Argument );

View File

@ -1495,9 +1495,9 @@
if ( pure_cff )
{
/* well, we don't really forget the `disabled' fonts... */
subfont_index = (FT_UInt)face_index;
subfont_index = (FT_UInt)( face_index & 0xFFFF );
if ( subfont_index >= font->name_index.count )
if ( face_index > 0 && subfont_index >= font->name_index.count )
{
FT_ERROR(( "cff_font_load:"
" invalid subfont index for pure CFF font (%d)\n",

View File

@ -583,10 +583,15 @@
if ( error )
goto Exit;
/* if we are performing a simple font format check, exit immediately */
/* (this is here for pure CFF) */
if ( face_index < 0 )
return FT_Err_Ok;
cff->pshinter = pshinter;
cff->psnames = psnames;
cffface->face_index = face_index;
cffface->face_index = face_index & 0xFFFF;
/* Complement the root flags with some interesting information. */
/* Note that this is only necessary for pure CFF and CEF fonts; */
@ -765,8 +770,9 @@
(FT_Short)( dict->underline_thickness >> 16 );
/* retrieve font family & style name */
cffface->family_name = cff_index_get_name( cff,
(FT_UInt)face_index );
cffface->family_name = cff_index_get_name(
cff,
(FT_UInt)( face_index & 0xFFFF ) );
if ( cffface->family_name )
{
char* full = cff_index_get_sid_string( cff,

View File

@ -334,7 +334,7 @@
/* check the face index */
/* XXX: handle CID fonts with more than a single face */
if ( face_index != 0 )
if ( ( face_index & 0xFFFF ) != 0 )
{
FT_ERROR(( "cid_face_init: invalid face index\n" ));
error = FT_THROW( Invalid_Argument );
@ -354,7 +354,7 @@
cidface->num_glyphs = (FT_Long)cid->cid_count;
cidface->num_charmaps = 0;
cidface->face_index = face_index;
cidface->face_index = face_index & 0xFFFF;
cidface->face_flags |= FT_FACE_FLAG_SCALABLE | /* scalable outlines */
FT_FACE_FLAG_HORIZONTAL | /* horizontal data */

View File

@ -345,13 +345,14 @@ THE SOFTWARE.
#endif
}
/* PCF could not have multiple face in single font file.
* XXX: non-zero face_index is already invalid argument, but
* Type1, Type42 driver has a convention to return
/* PCF cannot have multiple faces in a single font file.
* XXX: A non-zero face_index is already an invalid argument, but
* Type1, Type42 drivers have a convention to return
* an invalid argument error when the font could be
* opened by the specified driver.
*/
if ( face_index > 0 ) {
if ( face_index > 0 && ( face_index & 0xFFFF ) > 0 )
{
FT_ERROR(( "PCF_Face_Init: invalid face index\n" ));
PCF_Face_Done( pcfface );
return FT_THROW( Invalid_Argument );

View File

@ -109,7 +109,7 @@
if ( face_index < 0 )
goto Exit;
if ( face_index >= pfrface->num_faces )
if ( ( face_index & 0xFFFF ) >= pfrface->num_faces )
{
FT_ERROR(( "pfr_face_init: invalid face index\n" ));
error = FT_THROW( Invalid_Argument );
@ -118,7 +118,7 @@
/* load the face */
error = pfr_log_font_load(
&face->log_font, stream, (FT_UInt)face_index,
&face->log_font, stream, (FT_UInt)( face_index & 0xFFFF ),
face->header.log_dir_offset,
FT_BOOL( face->header.phy_font_max_size_high != 0 ) );
if ( error )
@ -136,7 +136,7 @@
PFR_PhyFont phy_font = &face->phy_font;
pfrface->face_index = face_index;
pfrface->face_index = face_index & 0xFFFF;
pfrface->num_glyphs = (FT_Long)phy_font->num_chars + 1;
pfrface->face_flags |= FT_FACE_FLAG_SCALABLE;

View File

@ -821,13 +821,14 @@
FT_LOCAL_DEF( FT_Error )
sfnt_init_face( FT_Stream stream,
TT_Face face,
FT_Int face_index,
FT_Int face_instance_index,
FT_Int num_params,
FT_Parameter* params )
{
FT_Error error;
FT_Library library = face->root.driver->root.library;
SFNT_Service sfnt;
FT_Int face_index;
/* for now, parameters are unused */
@ -860,22 +861,65 @@
/* Stream may have changed in sfnt_open_font. */
stream = face->root.stream;
FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_index ));
FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_instance_index ));
if ( face_index < 0 )
face_index = 0;
face_index = FT_ABS( face_instance_index ) & 0xFFFF;
if ( face_index >= face->ttc_header.count )
{
if ( face_instance_index >= 0 )
return FT_THROW( Invalid_Argument );
else
face_index = 0;
}
if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) )
return error;
/* check that we have a valid TrueType file */
/* check whether we have a valid TrueType file */
error = sfnt->load_font_dir( face, stream );
if ( error )
return error;
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
{
FT_ULong fvar_len;
FT_UShort num_instances;
FT_Int instance_index;
instance_index = FT_ABS( face_instance_index ) >> 16;
/* test whether current face is a GX font with named instances */
if ( face->goto_table( face, TTAG_fvar, stream, &fvar_len ) ||
fvar_len < 20 ||
FT_STREAM_SKIP( 12 ) ||
FT_READ_USHORT( num_instances ) )
num_instances = 0;
/* we support at most 2^15 - 1 instances */
if ( num_instances >= ( 1U << 15 ) - 1 )
{
if ( face_instance_index >= 0 )
return FT_THROW( Invalid_Argument );
else
num_instances = 0;
}
/* instance indices in `face_instance_index' start with index 1, */
/* thus `>' and not `>=' */
if ( instance_index > num_instances )
{
if ( face_instance_index >= 0 )
return FT_THROW( Invalid_Argument );
else
num_instances = 0;
}
face->root.style_flags = (FT_Long)num_instances << 16;
}
#endif
face->root.num_faces = face->ttc_header.count;
face->root.face_index = face_index;
@ -928,7 +972,7 @@
FT_LOCAL_DEF( FT_Error )
sfnt_load_face( FT_Stream stream,
TT_Face face,
FT_Int face_index,
FT_Int face_instance_index,
FT_Int num_params,
FT_Parameter* params )
{
@ -944,7 +988,7 @@
SFNT_Service sfnt = (SFNT_Service)face->sfnt;
FT_UNUSED( face_index );
FT_UNUSED( face_instance_index );
/* Check parameters */
@ -1266,7 +1310,7 @@
flags |= FT_STYLE_FLAG_ITALIC;
}
root->style_flags = flags;
root->style_flags |= flags;
/*********************************************************************/
/* */

View File

@ -31,14 +31,14 @@ FT_BEGIN_HEADER
FT_LOCAL( FT_Error )
sfnt_init_face( FT_Stream stream,
TT_Face face,
FT_Int face_index,
FT_Int face_instance_index,
FT_Int num_params,
FT_Parameter* params );
FT_LOCAL( FT_Error )
sfnt_load_face( FT_Stream stream,
TT_Face face,
FT_Int face_index,
FT_Int face_instance_index,
FT_Int num_params,
FT_Parameter* params );

View File

@ -490,7 +490,10 @@
/* <Input> */
/* stream :: The source font stream. */
/* */
/* face_index :: The index of the font face in the resource. */
/* face_index :: The index of the TrueType font, if we are opening a */
/* collection, in bits 0-15. The numbered instance */
/* index~+~1 of a GX (sub)font, if applicable, in bits */
/* 16-30. */
/* */
/* num_params :: Number of additional generic parameters. Ignored. */
/* */
@ -599,7 +602,7 @@
ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;
}
#else
#else /* !FT_CONFIG_OPTION_INCREMENTAL */
if ( !error )
error = tt_face_load_loca( face, stream );
@ -623,10 +626,56 @@
ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;
}
#endif
#endif /* !FT_CONFIG_OPTION_INCREMENTAL */
}
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
{
FT_Int instance_index = face_index >> 16;
if ( FT_HAS_MULTIPLE_MASTERS( ttface ) &&
instance_index > 0 )
{
error = TT_Get_MM_Var( face, NULL );
if ( error )
goto Exit;
if ( face->blend->mmvar->namedstyle )
{
FT_Memory memory = ttface->memory;
FT_Var_Named_Style* named_style;
FT_String* style_name;
/* in `face_index', the instance index starts with value 1 */
named_style = face->blend->mmvar->namedstyle + instance_index - 1;
error = sfnt->get_name( face,
(FT_UShort)named_style->strid,
&style_name );
if ( error )
goto Exit;
/* set style name; if already set, replace it */
if ( face->root.style_name )
FT_FREE( face->root.style_name );
face->root.style_name = style_name;
/* finally, select the named instance */
error = TT_Set_Var_Design( face,
face->blend->mmvar->num_axis,
named_style->coords );
if ( error )
goto Exit;
}
}
}
#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \
!defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )

View File

@ -345,7 +345,7 @@
goto Exit;
/* check the face index */
if ( face_index > 0 )
if ( ( face_index & 0xFFFF ) > 0 )
{
FT_ERROR(( "T1_Face_Init: invalid face index\n" ));
error = FT_THROW( Invalid_Argument );

View File

@ -208,7 +208,7 @@
goto Exit;
/* check the face index */
if ( face_index > 0 )
if ( ( face_index & 0xFFFF ) > 0 )
{
FT_ERROR(( "T42_Face_Init: invalid face index\n" ));
error = FT_THROW( Invalid_Argument );

View File

@ -269,16 +269,19 @@
static FT_Error
fnt_face_get_dll_font( FNT_Face face,
FT_Int face_index )
FT_Int face_instance_index )
{
FT_Error error;
FT_Stream stream = FT_FACE( face )->stream;
FT_Memory memory = FT_FACE( face )->memory;
WinMZ_HeaderRec mz_header;
FT_Long face_index;
face->font = NULL;
face_index = FT_ABS( face_instance_index ) & 0xFFFF;
/* does it begin with an MZ header? */
if ( FT_STREAM_SEEK( 0 ) ||
FT_STREAM_READ_FIELDS( winmz_header_fields, &mz_header ) )
@ -359,13 +362,14 @@
face->root.num_faces = font_count;
if ( face_instance_index < 0 )
goto Exit;
if ( face_index >= font_count )
{
error = FT_THROW( Invalid_Argument );
goto Exit;
}
else if ( face_index < 0 )
goto Exit;
if ( FT_NEW( face->font ) )
goto Exit;
@ -689,13 +693,14 @@
static FT_Error
FNT_Face_Init( FT_Stream stream,
FT_Face fntface, /* FNT_Face */
FT_Int face_index,
FT_Int face_instance_index,
FT_Int num_params,
FT_Parameter* params )
{
FNT_Face face = (FNT_Face)fntface;
FT_Error error;
FT_Memory memory = FT_FACE_MEMORY( face );
FT_Int face_index;
FT_UNUSED( num_params );
FT_UNUSED( params );
@ -703,9 +708,11 @@
FT_TRACE2(( "Windows FNT driver\n" ));
face_index = FT_ABS( face_instance_index ) & 0xFFFF;
/* try to load font from a DLL */
error = fnt_face_get_dll_font( face, face_index );
if ( !error && face_index < 0 )
error = fnt_face_get_dll_font( face, face_instance_index );
if ( !error && face_instance_index < 0 )
goto Exit;
if ( FT_ERR_EQ( error, Unknown_File_Format ) )
@ -726,10 +733,11 @@
if ( !error )
{
if ( face_instance_index < 0 )
goto Exit;
if ( face_index > 0 )
error = FT_THROW( Invalid_Argument );
else if ( face_index < 0 )
goto Exit;
}
}