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

This commit is contained in:
Suzuki, Toshiya (鈴木俊哉) 2006-06-22 02:34:27 +00:00
parent be556d5b81
commit 523119761a
2 changed files with 40 additions and 12 deletions

View File

@ -1,3 +1,26 @@
2006-06-22 suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
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 <mpsuzuki@hiroshima-u.ac.jp>
Public API of TrueTypeGX, OpenType, and classic kern table validator

View File

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