summaryrefslogtreecommitdiff
path: root/Build/source/libs/freetype2/src/base/ftmac.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/freetype2/src/base/ftmac.c')
-rw-r--r--Build/source/libs/freetype2/src/base/ftmac.c142
1 files changed, 88 insertions, 54 deletions
diff --git a/Build/source/libs/freetype2/src/base/ftmac.c b/Build/source/libs/freetype2/src/base/ftmac.c
index fd6201adb5a..7f059076d66 100644
--- a/Build/source/libs/freetype2/src/base/ftmac.c
+++ b/Build/source/libs/freetype2/src/base/ftmac.c
@@ -8,7 +8,7 @@
/* This file is for Mac OS X only; see builds/mac/ftoldmac.c for */
/* classic platforms built by MPW. */
/* */
-/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */
+/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */
/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -76,12 +76,16 @@
#undef OS_INLINE
#define OS_INLINE static __inline__
#endif
-#include <Carbon/Carbon.h>
-#ifndef HFS_MAXPATHLEN
-#define HFS_MAXPATHLEN 1024
+ /* The ResourceIndex type was only added in the 10.5 SDK */
+#ifndef MAC_OS_X_VERSION_10_5
+typedef short ResourceIndex;
#endif
+#include <CoreServices/CoreServices.h>
+#include <ApplicationServices/ApplicationServices.h>
+#include <sys/syslimits.h> /* PATH_MAX */
+
#define FT_DEPRECATED_ATTRIBUTE
#include FT_MAC_H
@@ -89,7 +93,13 @@
/* undefine blocking-macros in ftmac.h */
#undef FT_GetFile_From_Mac_Name( a, b, c )
#undef FT_GetFile_From_Mac_ATS_Name( a, b, c )
+#undef FT_New_Face_From_FOND( a, b, c, d )
#undef FT_New_Face_From_FSSpec( a, b, c, d )
+#undef FT_New_Face_From_FSRef( a, b, c, d )
+
+#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */
+#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault
+#endif
/* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over
@@ -100,6 +110,7 @@
#endif
+ /* This function is deprecated because FSSpec is deprecated in Mac OS X */
FT_EXPORT_DEF( FT_Error )
FT_GetFile_From_Mac_Name( const char* fontName,
FSSpec* pathSpec,
@@ -115,19 +126,28 @@
/* Private function. */
/* The FSSpec type has been discouraged for a long time, */
- /* but for some reason, there is no FSRef version of */
- /* ATSFontGetFileSpecification(), so we made our own. */
- /* Apple will provide one eventually. */
+ /* unfortunately an FSRef replacement API for */
+ /* ATSFontGetFileSpecification() is only available in */
+ /* Mac OS X 10.5 and later. */
static OSStatus
FT_ATSFontGetFileReference( ATSFontRef ats_font_id,
FSRef* ats_font_ref )
{
-#if __LP64__
+#if defined( MAC_OS_X_VERSION_10_5 ) && \
+ MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
+
+ OSStatus err;
+
+ err = ATSFontGetFileReference( ats_font_id, ats_font_ref );
+
+ return err;
+#elif __LP64__ /* No 64bit Carbon API on legacy platforms */
FT_UNUSED( ats_font_id );
FT_UNUSED( ats_font_ref );
+
return fnfErr;
-#else
+#else /* 32bit Carbon API on legacy platforms */
OSStatus err;
FSSpec spec;
@@ -214,7 +234,8 @@
FSSpec* pathSpec,
FT_Long* face_index )
{
-#if __LP64__
+#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \
+ MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 )
FT_UNUSED( fontName );
FT_UNUSED( pathSpec );
FT_UNUSED( face_index );
@@ -239,8 +260,8 @@
static OSErr
- FT_FSPathMakeRes( const UInt8* pathname,
- short* res )
+ FT_FSPathMakeRes( const UInt8* pathname,
+ ResFileRefNum* res )
{
OSErr err;
FSRef ref;
@@ -357,7 +378,7 @@
static void
parse_fond( char* fond_data,
short* have_sfnt,
- short* sfnt_id,
+ ResID* sfnt_id,
Str255 lwfn_file_name,
short face_index )
{
@@ -374,6 +395,10 @@
assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );
base_assoc = assoc;
+ /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */
+ if ( 47 < face_index )
+ return;
+
/* Let's do a little range checking before we get too excited here */
if ( face_index < count_faces_sfnt( fond_data ) )
{
@@ -425,9 +450,10 @@
ft_memcpy(ps_name, names[0] + 1, ps_name_len);
ps_name[ps_name_len] = 0;
}
- if ( style->indexes[0] > 1 )
+ if ( style->indexes[face_index] > 1 &&
+ style->indexes[face_index] <= FT_MIN( string_count, 64 ) )
{
- unsigned char* suffixes = names[style->indexes[0] - 1];
+ unsigned char* suffixes = names[style->indexes[face_index] - 1];
for ( i = 1; i <= suffixes[0]; i++ )
@@ -463,8 +489,8 @@
UInt8* path_lwfn,
size_t path_size )
{
- FSRef ref, par_ref;
- int dirname_len;
+ FSRef ref, par_ref;
+ size_t dirname_len;
/* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */
@@ -504,10 +530,10 @@
count_faces( Handle fond,
const UInt8* pathname )
{
- short sfnt_id;
+ ResID sfnt_id;
short have_sfnt, have_lwfn;
Str255 lwfn_file_name;
- UInt8 buff[HFS_MAXPATHLEN];
+ UInt8 buff[PATH_MAX];
FT_Error err;
short num_faces;
@@ -539,13 +565,13 @@
chunks are often not organized that way, so we glue chunks
of the same type together. */
static FT_Error
- read_lwfn( FT_Memory memory,
- short res,
- FT_Byte** pfb_data,
- FT_ULong* size )
+ read_lwfn( FT_Memory memory,
+ ResFileRefNum res,
+ FT_Byte** pfb_data,
+ FT_ULong* size )
{
FT_Error error = FT_Err_Ok;
- short res_id;
+ ResID res_id;
unsigned char *buffer, *p, *size_p = NULL;
FT_ULong total_size = 0;
FT_ULong old_total_size = 0;
@@ -563,7 +589,8 @@
for (;;)
{
- post_data = Get1Resource( 'POST', res_id++ );
+ post_data = Get1Resource( FT_MAKE_TAG( 'P', 'O', 'S', 'T' ),
+ res_id++ );
if ( post_data == NULL )
break; /* we are done */
@@ -602,7 +629,8 @@
for (;;)
{
- post_data = Get1Resource( 'POST', res_id++ );
+ post_data = Get1Resource( FT_MAKE_TAG( 'P', 'O', 'S', 'T' ),
+ res_id++ );
if ( post_data == NULL )
break; /* we are done */
@@ -707,12 +735,12 @@
/* Create a new FT_Face given a buffer and a driver name. */
static FT_Error
- open_face_from_buffer( FT_Library library,
- FT_Byte* base,
- FT_ULong size,
- FT_Long face_index,
- char* driver_name,
- FT_Face* aface )
+ open_face_from_buffer( FT_Library library,
+ FT_Byte* base,
+ FT_ULong size,
+ FT_Long face_index,
+ const char* driver_name,
+ FT_Face* aface )
{
FT_Open_Args args;
FT_Error error;
@@ -764,10 +792,10 @@
FT_Long face_index,
FT_Face* aface )
{
- FT_Byte* pfb_data;
- FT_ULong pfb_size;
- FT_Error error;
- short res;
+ FT_Byte* pfb_data;
+ FT_ULong pfb_size;
+ FT_Error error;
+ ResFileRefNum res;
if ( noErr != FT_FSPathMakeRes( pathname, &res ) )
@@ -792,7 +820,7 @@
/* Create a new FT_Face from an SFNT resource, specified by res ID. */
static FT_Error
FT_New_Face_From_SFNT( FT_Library library,
- short sfnt_id,
+ ResID sfnt_id,
FT_Long face_index,
FT_Face* aface )
{
@@ -804,8 +832,8 @@
int is_cff;
- sfnt = GetResource( 'sfnt', sfnt_id );
- if ( ResError() )
+ sfnt = GetResource( FT_MAKE_TAG( 's', 'f', 'n', 't' ), sfnt_id );
+ if ( sfnt == NULL )
return FT_Err_Invalid_Handle;
sfnt_size = (FT_ULong)GetHandleSize( sfnt );
@@ -839,10 +867,11 @@
FT_Long face_index,
FT_Face* aface )
{
- FT_Error error = FT_Err_Cannot_Open_Resource;
- short res_ref, res_index;
- Handle fond;
- short num_faces_in_res, num_faces_in_fond;
+ FT_Error error = FT_Err_Cannot_Open_Resource;
+ ResFileRefNum res_ref;
+ ResourceIndex res_index;
+ Handle fond;
+ short num_faces_in_res, num_faces_in_fond;
if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) )
@@ -855,7 +884,8 @@
num_faces_in_res = 0;
for ( res_index = 1; ; ++res_index )
{
- fond = Get1IndResource( 'FOND', res_index );
+ fond = Get1IndResource( FT_MAKE_TAG( 'F', 'O', 'N', 'D' ),
+ res_index );
if ( ResError() )
break;
@@ -869,7 +899,7 @@
}
CloseResFile( res_ref );
- if ( FT_Err_Ok == error && NULL != aface )
+ if ( FT_Err_Ok == error && NULL != aface && NULL != *aface )
(*aface)->num_faces = num_faces_in_res;
return error;
}
@@ -883,25 +913,25 @@
FT_Long face_index,
FT_Face* aface )
{
- short sfnt_id, have_sfnt, have_lwfn = 0;
- short fond_id;
+ short have_sfnt, have_lwfn = 0;
+ ResID sfnt_id, fond_id;
OSType fond_type;
Str255 fond_name;
Str255 lwfn_file_name;
- UInt8 path_lwfn[HFS_MAXPATHLEN];
+ UInt8 path_lwfn[PATH_MAX];
OSErr err;
FT_Error error = FT_Err_Ok;
GetResInfo( fond, &fond_id, &fond_type, fond_name );
- if ( ResError() != noErr || fond_type != 'FOND' )
+ if ( ResError() != noErr || fond_type != FT_MAKE_TAG( 'F', 'O', 'N', 'D' ) )
return FT_Err_Invalid_File_Format;
parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index );
if ( lwfn_file_name[0] )
{
- short res;
+ ResFileRefNum res;
res = HomeResFile( fond );
@@ -909,7 +939,7 @@
goto found_no_lwfn_file;
{
- UInt8 path_fond[HFS_MAXPATHLEN];
+ UInt8 path_fond[PATH_MAX];
FSRef ref;
@@ -961,7 +991,7 @@
/* LWFN is a (very) specific file format, check for it explicitly */
file_type = get_file_type_from_path( pathname );
- if ( file_type == 'LWFN' )
+ if ( file_type == FT_MAKE_TAG( 'L', 'W', 'F', 'N' ) )
return FT_New_Face_From_LWFN( library, pathname, face_index, aface );
/* Otherwise the file type doesn't matter (there are more than */
@@ -1029,6 +1059,8 @@
/* FT_New_Face_From_FSRef is identical to FT_New_Face except it */
/* accepts an FSRef instead of a path. */
/* */
+ /* This function is deprecated because Carbon data types (FSRef) */
+ /* are not cross-platform, and thus not suitable for the freetype API. */
FT_EXPORT_DEF( FT_Error )
FT_New_Face_From_FSRef( FT_Library library,
const FSRef* ref,
@@ -1038,7 +1070,7 @@
FT_Error error;
FT_Open_Args args;
OSErr err;
- UInt8 pathname[HFS_MAXPATHLEN];
+ UInt8 pathname[PATH_MAX];
if ( !ref )
@@ -1068,13 +1100,15 @@
/* FT_New_Face_From_FSSpec is identical to FT_New_Face except it */
/* accepts an FSSpec instead of a path. */
/* */
+ /* This function is deprecated because FSSpec is deprecated in Mac OS X */
FT_EXPORT_DEF( FT_Error )
FT_New_Face_From_FSSpec( FT_Library library,
const FSSpec* spec,
FT_Long face_index,
FT_Face* aface )
{
-#if __LP64__
+#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \
+ MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 )
FT_UNUSED( library );
FT_UNUSED( spec );
FT_UNUSED( face_index );