From 523119761a84d433b08d7a9f157f4ad2ae23be5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Suzuki=2C=20Toshiya=20=28=E9=88=B4=E6=9C=A8=E4=BF=8A?= =?UTF-8?q?=E5=93=89=29?= Date: Thu, 22 Jun 2006 02:34:27 +0000 Subject: [PATCH] * src/base/ftmac.c: Add byteorder workaround for Intel Mac --- ChangeLog | 23 +++++++++++++++++++++++ src/base/ftmac.c | 29 +++++++++++++++++------------ 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 24aea14fa..ea53ece2b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2006-06-22 suzuki toshiya + + 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 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 Public API of TrueTypeGX, OpenType, and classic kern table validator diff --git a/src/base/ftmac.c b/src/base/ftmac.c index e8c24d81e..d08cac827 100644 --- 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 #else #include #include +#include #include #include #include @@ -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,13 +772,13 @@ Str255 lwfn_file_name; UInt8 buff[HFS_MAXPATHLEN]; FT_Error err; + short num_faces; have_sfnt = have_lwfn = 0; 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; }