Commit 7a7d403d7a0c3bef6e3346a0e3736b69ff4323f9

Suzuki, Toshiya (鈴木俊哉) 2006-12-15T14:47:42

* Improve resource fork handler for POSIX

diff --git a/ChangeLog b/ChangeLog
index 0cd1e63..aa4fe2d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-12-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	* src/base/ftobjs.c: Improvement of resource fork handler for POSIX,
+	http://lists.gnu.org/archive/html/freetype-devel/2006-10/msg00025.html
+	(Mac_Read_sfnt_Resource): Count only `sfnt' resource of suitcase font
+	format or .dfont, to simulate the face index number counted by ftmac.c.
+	(IsMacResource): Return the number of scalable faces correctly.
+
 2006-12-10  Werner Lemberg  <wl@gnu.org>
 
 	* builds/toplevel.mk (version): Protect against `distclean' target.
diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
index 6a26140..e16a19f 100644
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -1371,6 +1371,7 @@
     FT_Long    flag_offset;
     FT_Long    rlen;
     int        is_cff;
+    FT_Long    face_index_in_resource = 0;
 
 
     if ( face_index == -1 )
@@ -1402,7 +1403,7 @@
     error = open_face_from_buffer( library,
                                    sfnt_data,
                                    rlen,
-                                   face_index,
+                                   face_index_in_resource,
                                    is_cff ? "cff" : "truetype",
                                    aface );
 
@@ -1444,6 +1445,8 @@
       error = Mac_Read_POST_Resource( library, stream, data_offsets, count,
                                       face_index, aface );
       FT_FREE( data_offsets );
+      /* POST exists in a LWFN providing single face */
+      (*aface)->num_faces = 1;
       return error;
     }
 
@@ -1453,9 +1456,13 @@
                                         &data_offsets, &count );
     if ( !error )
     {
+      FT_Long face_index_internal = face_index % count;
+
+
       error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count,
-                                      face_index, aface );
+                                      face_index_internal, aface );
       FT_FREE( data_offsets );
+      (*aface)->num_faces = count;
     }
 
     return error;