summaryrefslogtreecommitdiff
path: root/src/winfonts
diff options
context:
space:
mode:
authorWerner Lemberg <wl@gnu.org>2015-08-13 15:22:17 +0200
committerWerner Lemberg <wl@gnu.org>2015-08-13 15:22:17 +0200
commit14d6b5d7486c406982989f1cfbef8c9c32dd0379 (patch)
tree54d2ee0dfffce6e7d72c0dd72d9f9eacabb4c98c /src/winfonts
parent4afc0a54ed0183163a5005dfba4d379a1f511be2 (diff)
downloadfreetype2-14d6b5d7486c406982989f1cfbef8c9c32dd0379.tar.gz
[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.
Diffstat (limited to 'src/winfonts')
-rw-r--r--src/winfonts/winfnt.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/winfonts/winfnt.c b/src/winfonts/winfnt.c
index 06f1861af..36e3eb0c2 100644
--- a/src/winfonts/winfnt.c
+++ b/src/winfonts/winfnt.c
@@ -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;
}
}