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
--- 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;
}