shithub: freetype+ttf2subf

Download patch

ref: 523119761a84d433b08d7a9f157f4ad2ae23be5b
parent: be556d5b81f063430f77c0b80f2bbe1ad606c7d3
author: Suzuki, Toshiya (鈴木俊哉) <[email protected]>
date: Wed Jun 21 22:34:27 EDT 2006

* src/base/ftmac.c: Add byteorder workaround for Intel Mac

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2006-06-22  suzuki toshiya  <[email protected]>
+
+	Insert EndianS16_BtoN and EndianS32_BtoN as workaround for
+	Intel Mac. The original patch was written by David Sachitano
+	and Lawrence Coopet, modified by Sean McBride for MPW
+	compatibility. Only required data are converted, unused data
+	are left in big endian.
+
+	* src/base/ftmac.c:
+	Undefine existing OS_INLINE before definition.
+	Include <Endian.h> for byteorder macros for non Mac OS X
+	platforms.
+	(count_faces_sfnt): Insert EndianS16_BtoN to parse the header
+	of FontAssociation table in FOND resource.
+	(count_faces_scalable): Insert EndianS16_BtoN to parse the
+	header and fontSize at each entry of FontAssociation table
+	in FOND resource.
+	(parse_fond): Insert EndianS16_BtoN and EndianS32_BtoN to
+	parse ffStylOff of FamilyRecord header of FOND resource,
+	the header, fontSize, fontID at each entry of FontAssociation
+	table, and StyleMapping table.
+	(count_faces): HUnlock is suspended after all FOND utilization.
+
 2006-06-08  suzuki toshiya  <[email protected]>
 
 	Public API of TrueTypeGX, OpenType, and classic kern table validator
--- a/src/base/ftmac.c
+++ b/src/base/ftmac.c
@@ -64,11 +64,13 @@
   /* This is for Mac OS X.  Without redefinition, OS_INLINE */
   /* expands to `static inline' which doesn't survive the   */
   /* -ansi compilation flag of GCC.                         */
+#undef  OS_INLINE
 #define OS_INLINE   static __inline__
 #include <Carbon/Carbon.h>
 #else
 #include <Resources.h>
 #include <Fonts.h>
+#include <Endian.h>
 #include <Errors.h>
 #include <Files.h>
 #include <TextUtils.h>
@@ -536,7 +538,7 @@
     /* The count is 1 greater than the value in the FOND.  */
     /* Isn't that cute? :-)                                */
 
-    return 1 + *( (short*)( fond_data + sizeof ( FamRec ) ) );
+    return EndianS16_BtoN( *( (short*)( fond_data + sizeof ( FamRec ) ) ) ) + 1;
   }
 
 
@@ -549,13 +551,13 @@
 
 
     fond     = (FamRec*)fond_data;
-    face_all = *( (short *)( fond_data + sizeof ( FamRec ) ) ) + 1;
+    face_all = EndianS16_BtoN( *( (short *)( fond_data + sizeof ( FamRec ) ) ) ) + 1;
     assoc    = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );
     face     = 0;
 
     for ( i = 0; i < face_all; i++ )
     {
-      if ( 0 == assoc[i].fontSize )
+      if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) )
         face++;
     }
     return face;
@@ -597,19 +599,19 @@
 
       /* if the face at this index is not scalable,
          fall back to the first one (old behavior) */
-      if ( assoc->fontSize == 0 )
+      if ( EndianS16_BtoN( assoc->fontSize ) == 0 )
       {
         *have_sfnt = 1;
-        *sfnt_id   = assoc->fontID;
+        *sfnt_id   = EndianS16_BtoN( assoc->fontID );
       }
       else if ( base_assoc->fontSize == 0 )
       {
         *have_sfnt = 1;
-        *sfnt_id   = base_assoc->fontID;
+        *sfnt_id   = EndianS16_BtoN( base_assoc->fontID );
       }
     }
 
-    if ( fond->ffStylOff )
+    if ( EndianS32_BtoN( fond->ffStylOff ) )
     {
       unsigned char*  p = (unsigned char*)fond_data;
       StyleTable*     style;
@@ -619,10 +621,10 @@
       int             i;
 
 
-      p += fond->ffStylOff;
+      p += EndianS32_BtoN( fond->ffStylOff );
       style = (StyleTable*)p;
       p += sizeof ( StyleTable );
-      string_count = *(unsigned short*)(p);
+      string_count = EndianS16_BtoN( *(short*)(p) );
       p += sizeof ( short );
 
       for ( i = 0; i < string_count && i < 64; i++ )
@@ -770,6 +772,7 @@
     Str255    lwfn_file_name;
     UInt8     buff[HFS_MAXPATHLEN];
     FT_Error  err;
+    short     num_faces;
 
 
     have_sfnt = have_lwfn = 0;
@@ -776,7 +779,6 @@
 
     HLock( fond );
     parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 );
-    HUnlock( fond );
 
     if ( lwfn_file_name[0] )
     {
@@ -787,9 +789,12 @@
     }
 
     if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )
-      return 1;
+      num_faces = 1;
     else
-      return count_faces_scalable( *fond );
+      num_faces = count_faces_scalable( *fond );
+
+    HUnlock( fond );
+    return num_faces;
   }