Set `face_index' field in FT_Face for all font formats.
* cff/cffobjs.c (cff_face_init), winfonts/winfnt.c (FNT_Face_Init),
sfnt/sfobjs.c (sfnt_init_face): Do it.
* docs/CHANGES: Document it.
diff --git a/ChangeLog b/ChangeLog
index e8591b7..ad844b7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-12-26 Werner Lemberg <wl@gnu.org>
+
+ Set `face_index' field in FT_Face for all font formats.
+
+ * cff/cffobjs.c (cff_face_init), winfonts/winfnt.c (FNT_Face_Init),
+ sfnt/sfobjs.c (sfnt_init_face): Do it.
+
+ * docs/CHANGES: Document it.
+
2008-12-22 Steve Grubb
* builds/unix/ftsystem.c (FT_Stream_Open): Reject zero-length files.
diff --git a/docs/CHANGES b/docs/CHANGES
index 5ac53f5..76242cd 100644
--- a/docs/CHANGES
+++ b/docs/CHANGES
@@ -14,6 +14,11 @@
configuration macros TT_CONFIG_OPTION_BYTECODE_INTERPRETER and
TT_CONFIG_OPTION_UNPATENTED_HINTING were defined.
+ - The `face_index' field in the `FT_Face' structure wasn't
+ initialized properly after calling FT_Open_Face and friends with
+ a positive face index for CFFs, WinFNTs, and, most importantly,
+ for TrueType Collections (TTCs).
+
II. IMPORTANT CHANGES
diff --git a/src/cff/cffobjs.c b/src/cff/cffobjs.c
index c80cb82..3525ea3 100644
--- a/src/cff/cffobjs.c
+++ b/src/cff/cffobjs.c
@@ -465,8 +465,7 @@
pure_cff = 0;
/* load font directory */
- error = sfnt->load_face( stream, face,
- face_index, num_params, params );
+ error = sfnt->load_face( stream, face, 0, num_params, params );
if ( error )
goto Exit;
}
@@ -515,6 +514,8 @@
cff->pshinter = pshinter;
cff->psnames = (void*)psnames;
+ cffface->face_index = face_index;
+
/* Complement the root flags with some interesting information. */
/* Note that this is only necessary for pure CFF and CEF fonts; */
/* SFNT based fonts use the `name' table instead. */
diff --git a/src/cid/cidobjs.c b/src/cid/cidobjs.c
index 5d54591..9647d87 100644
--- a/src/cid/cidobjs.c
+++ b/src/cid/cidobjs.c
@@ -324,6 +324,7 @@
goto Exit;
/* check the face index */
+ /* XXX: handle CID fonts with more than a single face */
if ( face_index != 0 )
{
FT_ERROR(( "cid_face_init: invalid face index\n" ));
diff --git a/src/sfnt/sfobjs.c b/src/sfnt/sfobjs.c
index 2f9a3b8..021ec5a 100644
--- a/src/sfnt/sfobjs.c
+++ b/src/sfnt/sfobjs.c
@@ -468,7 +468,8 @@
if ( error )
return error;
- face->root.num_faces = face->ttc_header.count;
+ face->root.num_faces = face->ttc_header.count;
+ face->root.face_index = face_index;
return error;
}
diff --git a/src/type1/t1objs.c b/src/type1/t1objs.c
index ed49d6e..2f90dd6 100644
--- a/src/type1/t1objs.c
+++ b/src/type1/t1objs.c
@@ -326,7 +326,7 @@
goto Exit;
/* check the face index */
- if ( face_index != 0 )
+ if ( face_index > 0 )
{
FT_ERROR(( "T1_Face_Init: invalid face index\n" ));
error = T1_Err_Invalid_Argument;
@@ -343,7 +343,7 @@
root->num_glyphs = type1->num_glyphs;
- root->face_index = face_index;
+ root->face_index = 0;
root->face_flags = FT_FACE_FLAG_SCALABLE |
FT_FACE_FLAG_HORIZONTAL |
diff --git a/src/type42/t42objs.c b/src/type42/t42objs.c
index ad895aa..16e9809 100644
--- a/src/type42/t42objs.c
+++ b/src/type42/t42objs.c
@@ -188,7 +188,7 @@
goto Exit;
/* check the face index */
- if ( face_index != 0 )
+ if ( face_index > 0 )
{
FT_ERROR(( "T42_Face_Init: invalid face index\n" ));
error = T42_Err_Invalid_Argument;
@@ -202,7 +202,7 @@
root->num_glyphs = type1->num_glyphs;
root->num_charmaps = 0;
- root->face_index = face_index;
+ root->face_index = 0;
root->face_flags = FT_FACE_FLAG_SCALABLE |
FT_FACE_FLAG_HORIZONTAL |
diff --git a/src/winfonts/winfnt.c b/src/winfonts/winfnt.c
index cb6b035..f6e9859 100644
--- a/src/winfonts/winfnt.c
+++ b/src/winfonts/winfnt.c
@@ -736,6 +736,8 @@
FT_PtrDist family_size;
+ root->face_index = face_index;
+
root->face_flags = FT_FACE_FLAG_FIXED_SIZES |
FT_FACE_FLAG_HORIZONTAL;