shithub: freetype+ttf2subf

Download patch

ref: 1ad384d8818e0b0da95b069d5874da6f7ec51558
parent: 66043b1c4fdfe971348ef619e0fd8d85284034f4
author: Werner Lemberg <[email protected]>
date: Thu Dec 25 18:52:00 EST 2008

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.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-12-26  Werner Lemberg  <[email protected]>
+
+	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. 
--- 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
 
--- 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;
       }
@@ -514,6 +513,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; */
--- 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" ));
--- 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;
   }
--- 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  |
--- 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  |
--- 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;