diff --git a/ChangeLog b/ChangeLog index f720b4edb..47fb0a9a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1173,7 +1173,7 @@ ---------------------------------------------------------------------------- -Copyright 2005 by +Copyright 2005, 2006 by David Turner, Robert Wilhelm, and Werner Lemberg. This file is part of the FreeType project, and may only be used, modified, diff --git a/builds/unix/configure.ac b/builds/unix/configure.ac index a1dab41ae..e0a70fe17 100644 --- a/builds/unix/configure.ac +++ b/builds/unix/configure.ac @@ -2,7 +2,7 @@ # # Process this file with autoconf to produce a configure script. # -# Copyright 2001, 2002, 2003, 2004, 2005 by +# Copyright 2001, 2002, 2003, 2004, 2005, 2006 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, @@ -133,7 +133,7 @@ if test x$with_zlib != xno && test -n "$LIBZ"; then fi -# Whether to use Mac OS resource-based fonts or not +# Whether to use Mac OS resource-based fonts. AC_ARG_WITH([old-mac-fonts], dnl don't quote AS_HELP_STRING! @@ -147,7 +147,7 @@ else fi -# Whether to use FileManager which is deprecated since Mac OS X 10.4 +# Whether to use FileManager which is deprecated since Mac OS X 10.4. AC_ARG_WITH([fsspec], AS_HELP_STRING([--with-fsspec], @@ -157,6 +157,7 @@ if test x$with_fsspec = xno; then elif test x$with_old_mac_fonts = xyes; then AC_MSG_CHECKING([FSSpec-based FileManager]) AC_TRY_LINK([ + #if defined(__GNUC__) && defined(__APPLE_CC__) # include # include @@ -164,27 +165,30 @@ elif test x$with_old_mac_fonts = xyes; then # include # include #endif - ], [ - FCBPBPtr paramBlock; - short vRefNum; - long dirID; - ConstStr255Param fileName; - FSSpec* spec; + + ], + [ + + FCBPBPtr paramBlock; + short vRefNum; + long dirID; + ConstStr255Param fileName; + FSSpec* spec; + /* FSSpec functions: deprecated sicne Mac OS X 10.4 */ PBGetFCBInfoSync( paramBlock ); FSMakeFSSpec( vRefNum, dirID, fileName, spec ); - ], [ - AC_MSG_RESULT([ok]) - CFLAGS="$CFLAGS -DHAVE_FSSPEC=1" - ], [ - AC_MSG_RESULT([not found]) - CFLAGS="$CFLAGS -DHAVE_FSSPEC=0" - ]) + ], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_FSSPEC=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_FSSPEC=0"]) fi -# Whether to use FileManager in Carbon since MacOS 9.x + +# Whether to use FileManager in Carbon since MacOS 9.x. AC_ARG_WITH([fsref], AS_HELP_STRING([--with-fsref], @@ -199,6 +203,7 @@ if test x$with_fsref = xno; then elif test x$with_old_mac_fonts = xyes; then AC_MSG_CHECKING([FSRef-based FileManager]) AC_TRY_LINK([ + #if defined(__GNUC__) && defined(__APPLE_CC__) # include # include @@ -206,7 +211,10 @@ elif test x$with_old_mac_fonts = xyes; then # include # include #endif - ], [ + + ], + [ + FCBPBPtr paramBlock; short vRefNum; long dirID; @@ -235,16 +243,15 @@ elif test x$with_old_mac_fonts = xyes; then outForkName, spec, ref ); FSPathMakeRef( path, ref, isDirectory ); - ], [ - AC_MSG_RESULT([ok]) - CFLAGS="$CFLAGS -DHAVE_FSREF=1" - ], [ - AC_MSG_RESULT([not found]) - CFLAGS="$CFLAGS -DHAVE_FSREF=0" - ]) + ], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_FSREF=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_FSREF=0"]) fi -# Whether to use QuickDraw API in ToolBox which is deprecated since Mac OS X 10.4 + +# Whether to use QuickDraw API in ToolBox which is deprecated since Mac OS X 10.4. AC_ARG_WITH([quickdraw-toolbox], AS_HELP_STRING([--with-quickdraw-toolbox], @@ -254,6 +261,7 @@ if test x$with_quickdraw_toolbox = xno; then elif test x$with_old_mac_fonts = xyes; then AC_MSG_CHECKING([QuickDraw FontManager functions in ToolBox]) AC_TRY_LINK([ + #if defined(__GNUC__) && defined(__APPLE_CC__) # include # include @@ -261,7 +269,10 @@ elif test x$with_old_mac_fonts = xyes; then # include # include #endif - ], [ + + ], + [ + Str255 familyName; SInt16 familyID = 0; FMInput* fmIn = NULL; @@ -272,17 +283,15 @@ elif test x$with_old_mac_fonts = xyes; then GetFNum( familyName, &familyID ); fmOut = FMSwapFont( fmIn ); - ], [ - AC_MSG_RESULT([ok]) - CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=1" - ], [ - AC_MSG_RESULT([not found]) - CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0" - ]) + ], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0"]) fi -# Whether to use QuickDraw API in Carbon which is deprecated since Mac OS X 10.4 +# Whether to use QuickDraw API in Carbon which is deprecated since Mac OS X 10.4. AC_ARG_WITH([quickdraw-carbon], AS_HELP_STRING([--with-quickdraw-carbon], @@ -292,6 +301,7 @@ if test x$with_quickdraw_carbon = xno; then elif test x$with_old_mac_fonts = xyes; then AC_MSG_CHECKING([QuickDraw FontManager functions in Carbon]) AC_TRY_LINK([ + #if defined(__GNUC__) && defined(__APPLE_CC__) # include # include @@ -299,7 +309,10 @@ elif test x$with_old_mac_fonts = xyes; then # include # include #endif - ], [ + + ], + [ + FMFontFamilyIterator famIter; FMFontFamily family; Str255 famNameStr; @@ -318,17 +331,17 @@ elif test x$with_old_mac_fonts = xyes; then FMDisposeFontFamilyInstanceIterator( &instIter ); FMDisposeFontFamilyIterator( &famIter ); FMGetFontContainer( font, pathSpec ); - ], [ - AC_MSG_RESULT([ok]) - CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=1" - ], [ - AC_MSG_RESULT([not found]) - CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0" - ]) + + ], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0"]) fi -# Whether to use AppleTypeService since Mac OS X +# Whether to use AppleTypeService since Mac OS X. + AC_ARG_WITH([ats], dnl don't quote AS_HELP_STRING! AS_HELP_STRING([--with-ats], @@ -338,22 +351,24 @@ if test x$with_ats = xno; then elif test x$with_old_mac_fonts = xyes; then AC_MSG_CHECKING([AppleTypeService functions]) AC_TRY_LINK([ + #include - ], [ + + ], + [ + FSSpec* pathSpec; ATSFontFindFromName( NULL, kATSOptionFlagsUnRestrictedScope ); ATSFontGetFileSpecification( 0, pathSpec ); - ], [ - AC_MSG_RESULT([ok]) - CFLAGS="$CFLAGS -DHAVE_ATS=1" - ], [ - AC_MSG_RESULT([not found]) - CFLAGS="$CFLAGS -DHAVE_ATS=0" - ]) -fi + ], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_ATS=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_ATS=0"]) +fi AC_SUBST([LIBZ]) diff --git a/docs/CHANGES b/docs/CHANGES index 7a55d7787..fd6345121 100644 --- a/docs/CHANGES +++ b/docs/CHANGES @@ -12,6 +12,7 @@ LATEST CHANGES BETWEEN 2.2.0 and 2.1.10 - If FreeType was compiled without hinters, all font formats based on PS outlines weren't scaled correctly. + II. IMPORTANT CHANGES - The LIGHT hinting algorithm produces more pleasant results. @@ -45,11 +46,12 @@ LATEST CHANGES BETWEEN 2.2.0 and 2.1.10 Note that this doesn't affect binary backwards compatibility. - - On MacOS, new APIs are added as replacements for legacy APIs: - `FT_New_Face_From_FSRef' for FT_New_Face_From_FSSpec, and - `FT_GetFile_From_Mac_ATS_Name' for FT_GetFile_From_Mac_Name. - Legacy APIs are still available, if FreeType is built without - disabling them. + - On MacOS, new APIs have been added as replacements for legacy + APIs: `FT_New_Face_From_FSRef' for `FT_New_Face_From_FSSpec', + and `FT_GetFile_From_Mac_ATS_Name' for + `FT_GetFile_From_Mac_Name'. Legacy APIs are still available, if + FreeType is built without disabling them. + III. MISCELLANEOUS @@ -63,14 +65,16 @@ LATEST CHANGES BETWEEN 2.2.0 and 2.1.10 returns the number of available faces via face->num_faces. Unsupported bitmap faces (fbit, NFNT) are ignored. - - builds/unix/configure is improved for MacOS X. It automatically - checks available functions in Carbon library, and prepare to use - newest functions by default. Also options to specify dependency - of each Carbon APIs (FSSpec, FSRef, old/new QuickDraw, ATS) are - available. By manual disabling of all QuickDraw, FreeType can be - built without "deprecated function" warning on MacOS 10.4.x, but - FT_GetFile_Mac_Name in ftmac.c is changed to dummy function, and - returns unimplemented error. For detail, see builds/mac/README. + - builds/unix/configure has been improved for MacOS X. It now + automatically checks available functions in Carbon library, and + prepare to use newest functions by default. Options to specify + the dependencies of each Carbon APIs (FSSpec, FSRef, old/new + QuickDraw, ATS) are available too. By manual disabling of all + QuickDraw functionality, FreeType can be built without + `deprecated function' warnings on MacOS 10.4.x, but + FT_GetFile_Mac_Name in ftmac.c then is changed to a dummy + function, and returns an `unimplemented' error. For details see + builds/mac/README. - SFNT cmap handling has been improved, mainly to run faster. diff --git a/src/base/ftmac.c b/src/base/ftmac.c index 8506377a4..3be12cffc 100644 --- a/src/base/ftmac.c +++ b/src/base/ftmac.c @@ -5,7 +5,7 @@ /* Mac FOND support. Written by just@letterror.com. */ /* Heavily Fixed by mpsuzuki, George Williams and Sean McBride */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004, 2005 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */ /* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -24,35 +24,35 @@ support this I use the face_index argument of FT_(Open|New)_Face() functions, and pretend the suitcase file is a collection. - Warning: fbit and NFNT bitmap resources are not supported yet. - In old sfnt fonts, bitmap glyph data for each size is stored in - each NFNT resources, instead of bdat table in sfnt resource. - Therefore, face->num_fixed_sizes is set to 0, because bitmap - data in NFNT resource is unavailable at present. + Warning: fbit and NFNT bitmap resources are not supported yet. In old + sfnt fonts, bitmap glyph data for each size is stored in each `NFNT' + resources instead of the `bdat' table in the sfnt resource. Therefore, + face->num_fixed_sizes is set to 0, because bitmap data in `NFNT' + resource is unavailable at present. The Mac FOND support works roughly like this: - - Check whether the offered stream points to a Mac suitcase file. - This is done by checking the file type: it has to be 'FFIL' or 'tfil'. - The stream that gets passed to our init_face() routine is a stdio - stream, which isn't usable for us, since the FOND resources live - in the resource fork. So we just grab the stream->pathname field. + - Check whether the offered stream points to a Mac suitcase file. This + is done by checking the file type: it has to be 'FFIL' or 'tfil'. The + stream that gets passed to our init_face() routine is a stdio stream, + which isn't usable for us, since the FOND resources live in the + resource fork. So we just grab the stream->pathname field. - - Read the FOND resource into memory, then check whether there is - a TrueType font and/or(!) a Type 1 font available. + - Read the FOND resource into memory, then check whether there is a + TrueType font and/or(!) a Type 1 font available. - - If there is a Type 1 font available (as a separate 'LWFN' file), - read its data into memory, massage it slightly so it becomes - PFB data, wrap it into a memory stream, load the Type 1 driver - and delegate the rest of the work to it by calling FT_Open_Face(). - (XXX TODO: after this has been done, the kerning data from the FOND - resource should be appended to the face: On the Mac there are usually - no AFM files available. However, this is tricky since we need to map - Mac char codes to ps glyph names to glyph ID's...) + - If there is a Type 1 font available (as a separate `LWFN' file), read + its data into memory, massage it slightly so it becomes PFB data, wrap + it into a memory stream, load the Type 1 driver and delegate the rest + of the work to it by calling FT_Open_Face(). (XXX TODO: after this + has been done, the kerning data from the FOND resource should be + appended to the face: On the Mac there are usually no AFM files + available. However, this is tricky since we need to map Mac char + codes to ps glyph names to glyph ID's...) - - If there is a TrueType font (an 'sfnt' resource), read it into - memory, wrap it into a memory stream, load the TrueType driver - and delegate the rest of the work to it, by calling FT_Open_Face(). + - If there is a TrueType font (an `sfnt' resource), read it into memory, + wrap it into a memory stream, load the TrueType driver and delegate + the rest of the work to it, by calling FT_Open_Face(). */ @@ -64,7 +64,7 @@ /* This is for Mac OS X. Without redefinition, OS_INLINE */ /* expands to `static inline' which doesn't survive the */ /* -ansi compilation flag of GCC. */ -#define OS_INLINE static __inline__ +#define OS_INLINE static __inline__ #include #else #include @@ -81,44 +81,44 @@ #include FT_MAC_H - /* FSSpec functions are depricated since Mac OS X 10.4 */ + /* FSSpec functions are deprecated since Mac OS X 10.4 */ #ifndef HAVE_FSSPEC #if TARGET_API_MAC_OS8 || TARGET_API_MAC_CARBON -#define HAVE_FSSPEC 1 +#define HAVE_FSSPEC 1 #else -#define HAVE_FSSPEC 0 +#define HAVE_FSSPEC 0 #endif #endif /* most FSRef functions were introduced since Mac OS 9 */ #ifndef HAVE_FSREF #if TARGET_API_MAC_OSX -#define HAVE_FSREF 1 +#define HAVE_FSREF 1 #else -#define HAVE_FSREF 0 +#define HAVE_FSREF 0 #endif #endif #ifndef HFS_MAXPATHLEN -#define HFS_MAXPATHLEN 1024 +#define HFS_MAXPATHLEN 1024 #endif - /* QuickDraw is depricated since Mac OS X 10.4 */ + /* QuickDraw is deprecated since Mac OS X 10.4 */ #ifndef HAVE_QUICKDRAW_CARBON #if TARGET_API_MAC_OS8 || TARGET_API_MAC_CARBON -#define HAVE_QUICKDRAW_CARBON 1 +#define HAVE_QUICKDRAW_CARBON 1 #else -#define HAVE_QUICKDRAW_CARBON 0 +#define HAVE_QUICKDRAW_CARBON 0 #endif #endif /* AppleTypeService is available since Mac OS X */ #ifndef HAVE_ATS #if TARGET_API_MAC_OSX -#define HAVE_ATS 1 +#define HAVE_ATS 1 #else -#define HAVE_ATS 0 +#define HAVE_ATS 0 #endif #endif @@ -126,11 +126,12 @@ TrueType in case *both* are available (this is not common, but it *is* possible). */ #ifndef PREFER_LWFN -#define PREFER_LWFN 1 +#define PREFER_LWFN 1 #endif #if !HAVE_QUICKDRAW_CARBON /* QuickDraw is deprecated since Mac OS X 10.4 */ + FT_EXPORT_DEF( FT_Error ) FT_GetFile_From_Mac_Name( const char* fontName, FSSpec* pathSpec, @@ -138,7 +139,9 @@ { return FT_Err_Unimplemented_Feature; } + #else + FT_EXPORT_DEF( FT_Error ) FT_GetFile_From_Mac_Name( const char* fontName, FSSpec* pathSpec, @@ -174,7 +177,8 @@ FMCreateFontFamilyInstanceIterator( family, &instIter ); *face_index = 0; - stat2 = 0; + stat2 = 0; + while ( stat2 == 0 && !the_font ) { FMFontStyle style; @@ -221,10 +225,12 @@ else return FT_Err_Unknown_File_Format; } -#endif + +#endif /* HAVE_QUICKDRAW_CARBON */ #if !HAVE_ATS + FT_EXPORT_DEF( FT_Error ) FT_GetFile_From_Mac_ATS_Name( const char* fontName, FSSpec* pathSpec, @@ -232,7 +238,9 @@ { return FT_Err_Unimplemented_Feature; } + #else + FT_EXPORT_DEF( FT_Error ) FT_GetFile_From_Mac_ATS_Name( const char* fontName, FSSpec* pathSpec, @@ -240,24 +248,28 @@ { CFStringRef cf_fontName; ATSFontRef ats_font_id; - + + *face_index = 0; - - cf_fontName = CFStringCreateWithCString( NULL, fontName, kCFStringEncodingMacRoman ); - ats_font_id = ATSFontFindFromName( cf_fontName, kATSOptionFlagsUnRestrictedScope ); - - if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFF ) + + cf_fontName = CFStringCreateWithCString( NULL, fontName, + kCFStringEncodingMacRoman ); + ats_font_id = ATSFontFindFromName( cf_fontName, + kATSOptionFlagsUnRestrictedScope ); + + if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL ) return FT_Err_Unknown_File_Format; - - if ( 0 != ATSFontGetFileSpecification( ats_font_id, pathSpec )) + + if ( 0 != ATSFontGetFileSpecification( ats_font_id, pathSpec ) ) return FT_Err_Unknown_File_Format; - - /* face_index calculation by searching preceding fontIDs with same FSRef */ + + /* face_index calculation by searching preceding fontIDs */ + /* with same FSRef */ { int i; FSSpec f; - - + + for ( i = 1; i < ats_font_id; i++ ) { if ( 0 != ATSFontGetFileSpecification( ats_font_id - i, @@ -274,7 +286,8 @@ } return FT_Err_Ok; } -#endif + +#endif /* HAVE_ATS */ #if defined( __MWERKS__ ) && !TARGET_RT_MAC_MACHO @@ -313,10 +326,11 @@ #if HAVE_FSSPEC && !HAVE_FSREF + static OSErr - FT_FSPathMakeSpec( const UInt8* pathname, - FSSpec* spec_p, - Boolean isDirectory ) + FT_FSPathMakeSpec( const UInt8* pathname, + FSSpec* spec_p, + Boolean isDirectory ) { const char *p, *q; short vRefNum; @@ -330,10 +344,10 @@ vRefNum = 0; while ( 1 ) - { + { q = p + FT_MIN( 255, ft_strlen( p ) ); - if ( q == p ) + if ( q == p ) return 0; if ( 255 < ft_strlen( (char *)pathname ) ) @@ -388,7 +402,7 @@ FT_MEM_MOVE( path + node_namelen + 1, path, child_namelen ); FT_MEM_COPY( path, node_name, node_namelen ); if ( child_namelen > 0 ) - path[ node_namelen ] = ':'; + path[node_namelen] = ':'; vRefNum = spec.vRefNum; dirID = spec.parID; @@ -399,21 +413,25 @@ } return noErr; } -#endif + +#endif /* HAVE_FSSPEC && !HAVE_FSREF */ static OSErr FT_FSPathMakeRes( const UInt8* pathname, short* res ) { + #if HAVE_FSREF + OSErr err; FSRef ref; + if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) return FT_Err_Cannot_Open_Resource; - /* at present, so support for dfont format */ + /* at present, no support for dfont format */ err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res ); if ( noErr == err ) return err; @@ -421,18 +439,23 @@ /* fallback to original resource-fork font */ *res = FSOpenResFile( &ref, fsRdPerm ); err = ResError(); + #else - OSErr err; + + OSErr err; FSSpec spec; + if ( noErr != FT_FSPathMakeSpec( pathname, &spec, FALSE ) ) return FT_Err_Cannot_Open_Resource; - /* at present, so support for dfont format without FSRef */ - /* (see above), try original resource-fork font */ + /* at present, no support for dfont format without FSRef */ + /* (see above), try original resource-fork font */ *res = FSpOpenResFile( &spec, fsRdPerm ); err = ResError(); -#endif + +#endif /* HAVE_FSREF */ + return err; } @@ -441,7 +464,9 @@ static OSType get_file_type_from_path( const UInt8* pathname ) { + #if HAVE_FSREF + FSRef ref; FSCatalogInfo info; @@ -453,8 +478,10 @@ NULL, NULL, NULL ) ) return ( OSType ) 0; - return ((FInfo *) (info.finderInfo))->fdType; + return ((FInfo *)(info.finderInfo))->fdType; + #else + FSSpec spec; FInfo finfo; @@ -466,7 +493,9 @@ return ( OSType ) 0; return finfo.fdType; -#endif + +#endif /* HAVE_FSREF */ + } @@ -519,10 +548,10 @@ short i, face, face_all; - fond = (FamRec*)fond_data; - face_all = *( (short *)( fond_data + sizeof ( FamRec ) ) ) + 1; - assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); - face = 0; + fond = (FamRec*)fond_data; + face_all = *( (short *)( fond_data + sizeof ( FamRec ) ) ) + 1; + assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); + face = 0; for ( i = 0; i < face_all; i++ ) { @@ -596,10 +625,10 @@ string_count = *(unsigned short*)(p); p += sizeof ( short ); - for ( i = 0 ; i < string_count && i < 64; i++ ) + for ( i = 0; i < string_count && i < 64; i++ ) { names[i] = p; - p += names[i][0]; + p += names[i][0]; p++; } @@ -647,16 +676,18 @@ static FT_Error lookup_lwfn_by_fond( const UInt8* path_fond, const StringPtr base_lwfn, - UInt8* path_lwfn, + UInt8* path_lwfn, int path_size ) { + #if HAVE_FSREF + FSRef ref, par_ref; int dirname_len; - /* pathname for FSRef can be various format: HFS, HFS+ and POSIX. */ - /* we should not extract parent directory by string manipulation */ + /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */ + /* We should not extract parent directory by string manipulation. */ if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) ) return FT_Err_Invalid_Argument; @@ -679,9 +710,8 @@ dirname_len = ft_strlen( (char *)path_lwfn ); ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 ); - path_lwfn[ dirname_len + base_lwfn[0] ] = '\0'; + path_lwfn[dirname_len + base_lwfn[0]] = '\0'; - if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) ) return FT_Err_Cannot_Open_Resource; @@ -690,7 +720,9 @@ return FT_Err_Cannot_Open_Resource; return FT_Err_Ok; + #else + int i; FSSpec spec; @@ -703,7 +735,7 @@ i = ft_strlen( (char *)path_lwfn ) - 1; while ( i > 0 && ':' != path_lwfn[i] ) - i-- ; + i--; if ( i + 1 + base_lwfn[0] > path_size ) return FT_Err_Invalid_Argument; @@ -711,20 +743,21 @@ if ( ':' == path_lwfn[i] ) { ft_strcpy( (char *)path_lwfn + i + 1, (char *)base_lwfn + 1 ); - path_lwfn[ i + 1 + base_lwfn[0] ] = '\0'; + path_lwfn[i + 1 + base_lwfn[0]] = '\0'; } else { ft_strcpy( (char *)path_lwfn, (char *)base_lwfn + 1 ); - path_lwfn[ base_lwfn[0] ] = '\0'; + path_lwfn[base_lwfn[0]] = '\0'; } - if ( noErr != FT_FSPathMakeSpec( path_lwfn, &spec, FALSE ) ) return FT_Err_Cannot_Open_Resource; return FT_Err_Ok; -#endif + +#endif /* HAVE_FSREF */ + } @@ -734,9 +767,9 @@ { short sfnt_id; short have_sfnt, have_lwfn; - Str255 lwfn_file_name; + Str255 lwfn_file_name; UInt8 buff[HFS_MAXPATHLEN]; - FT_Error err; + FT_Error err; have_sfnt = have_lwfn = 0; @@ -748,7 +781,7 @@ if ( lwfn_file_name[0] ) { err = lookup_lwfn_by_fond( pathname, lwfn_file_name, - buff, sizeof( buff ) ); + buff, sizeof ( buff ) ); if ( FT_Err_Ok == err ) have_lwfn = 1; } @@ -761,9 +794,9 @@ /* Read Type 1 data from the POST resources inside the LWFN file, - return a PFB buffer. This is somewhat convoluted because the FT2 + return a PFB buffer. This is somewhat convoluted because the FT2 PFB parser wants the ASCII header as one chunk, and the LWFN - chunks are often not organized that way, so we'll glue chunks + chunks are often not organized that way, so we glue chunks of the same type together. */ static FT_Error read_lwfn( FT_Memory memory, @@ -791,7 +824,7 @@ { post_data = Get1Resource( 'POST', res_id++ ); if ( post_data == NULL ) - break; /* we're done */ + break; /* we are done */ code = (*post_data)[0]; @@ -821,7 +854,7 @@ { post_data = Get1Resource( 'POST', res_id++ ); if ( post_data == NULL ) - break; /* we're done */ + break; /* we are done */ post_size = (FT_ULong)GetHandleSize( post_data ) - 2; code = (*post_data)[0]; @@ -830,7 +863,7 @@ { if ( last_code != -1 ) { - /* we're done adding a chunk, fill in the size field */ + /* we are done adding a chunk, fill in the size field */ if ( size_p != NULL ) { *size_p++ = (FT_Byte)( pfb_chunk_size & 0xFF ); @@ -948,11 +981,11 @@ return error; } - args.flags = FT_OPEN_STREAM; + args.flags = FT_OPEN_STREAM; args.stream = stream; if ( driver_name ) { - args.flags = args.flags | FT_OPEN_DRIVER; + args.flags = args.flags | FT_OPEN_DRIVER; args.driver = FT_Get_Module( library, driver_name ); } @@ -974,9 +1007,9 @@ /* Create a new FT_Face from a file spec to an LWFN file. */ static FT_Error - FT_New_Face_From_LWFN( FT_Library library, + FT_New_Face_From_LWFN( FT_Library library, const UInt8* pathname, - FT_Long face_index, + FT_Long face_index, FT_Face* aface ) { FT_Byte* pfb_data; @@ -1014,7 +1047,7 @@ Handle sfnt = NULL; FT_Byte* sfnt_data; size_t sfnt_size; - FT_Error error = 0; + FT_Error error = FT_Err_Ok; FT_Memory memory = library->memory; int is_cff; @@ -1051,9 +1084,9 @@ /* Create a new FT_Face from a file spec to a suitcase file. */ static FT_Error - FT_New_Face_From_Suitcase( FT_Library library, + FT_New_Face_From_Suitcase( FT_Library library, const UInt8* pathname, - FT_Long face_index, + FT_Long face_index, FT_Face* aface ) { FT_Error error = FT_Err_Cannot_Open_Resource; @@ -1081,7 +1114,7 @@ if ( 0 <= face_index && face_index < num_faces_in_fond && error ) error = FT_New_Face_From_FOND( library, fond, face_index, aface ); - + face_index -= num_faces_in_fond; } @@ -1100,10 +1133,10 @@ FT_Long face_index, FT_Face* aface ) { - short sfnt_id, have_sfnt, have_lwfn = 0; - short fond_id; - OSType fond_type; - Str255 fond_name; + short sfnt_id, have_sfnt, have_lwfn = 0; + short fond_id; + OSType fond_type; + Str255 fond_name; Str255 lwfn_file_name; UInt8 path_lwfn[HFS_MAXPATHLEN]; OSErr err; @@ -1128,34 +1161,39 @@ goto found_no_lwfn_file; #if HAVE_FSREF - { + + { UInt8 path_fond[HFS_MAXPATHLEN]; FSRef ref; + err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum, NULL, NULL, NULL, &ref, NULL ); if ( noErr != err ) goto found_no_lwfn_file; - err = FSRefMakePath( &ref, path_fond, sizeof( path_fond ) ); + err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) ); if ( noErr != err ) goto found_no_lwfn_file; error = lookup_lwfn_by_fond( path_fond, lwfn_file_name, - path_lwfn, sizeof( path_lwfn ) ); + path_lwfn, sizeof ( path_lwfn ) ); if ( FT_Err_Ok == error ) have_lwfn = 1; } + #elif HAVE_FSSPEC - { + + { UInt8 path_fond[HFS_MAXPATHLEN]; FCBPBRec pb; Str255 fond_file_name; FSSpec spec; - FT_MEM_SET( &spec, 0, sizeof( FSSpec ) ); - FT_MEM_SET( &pb, 0, sizeof( FCBPBRec ) ); + FT_MEM_SET( &spec, 0, sizeof ( FSSpec ) ); + FT_MEM_SET( &pb, 0, sizeof ( FCBPBRec ) ); + pb.ioNamePtr = fond_file_name; pb.ioVRefNum = 0; pb.ioRefNum = res; @@ -1165,21 +1203,24 @@ if ( noErr != err ) goto found_no_lwfn_file; - err = FSMakeFSSpec( pb.ioFCBVRefNum, pb.ioFCBParID, fond_file_name, &spec ); + err = FSMakeFSSpec( pb.ioFCBVRefNum, pb.ioFCBParID, + fond_file_name, &spec ); if ( noErr != err ) goto found_no_lwfn_file; - err = FT_FSpMakePath( &spec, path_fond, sizeof( path_fond ) ); + err = FT_FSpMakePath( &spec, path_fond, sizeof ( path_fond ) ); if ( noErr != err ) goto found_no_lwfn_file; error = lookup_lwfn_by_fond( path_fond, lwfn_file_name, - path_lwfn, sizeof( path_lwfn ) ); + path_lwfn, sizeof ( path_lwfn ) ); if ( FT_Err_Ok == error ) have_lwfn = 1; - } -#endif - } + } + +#endif /* HAVE_FSREF, HAVE_FSSPEC */ + + } if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) return FT_New_Face_From_LWFN( library, @@ -1187,40 +1228,40 @@ face_index, aface ); -found_no_lwfn_file: + found_no_lwfn_file: if ( have_sfnt ) return FT_New_Face_From_SFNT( library, sfnt_id, face_index, aface ); - return FT_Err_Unknown_File_Format; + return FT_Err_Unknown_File_Format; } /* Common function to load a new FT_Face from a resource file. */ static FT_Error - FT_New_Face_From_Resource( FT_Library library, + FT_New_Face_From_Resource( FT_Library library, const UInt8* pathname, - FT_Long face_index, + FT_Long face_index, FT_Face* aface ) { OSType file_type; FT_Error error; - /* LWFN is a (very) specific file format, check for it explicitly */ + /* 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 == 'LWFN' ) return FT_New_Face_From_LWFN( library, pathname, face_index, aface ); - - /* Otherwise the file type doesn't matter (there are more than */ - /* `FFIL' and `tfil'). Just try opening it as a font suitcase; */ - /* if it works, fine. */ + + /* Otherwise the file type doesn't matter (there are more than */ + /* `FFIL' and `tfil'). Just try opening it as a font suitcase; */ + /* if it works, fine. */ error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface ); - if ( error == 0 ) - return error; + if ( error == 0 ) + return error; /* let it fall through to normal loader (.ttf, .otf, etc.); */ /* we signal this by returning no error and no FT_Face */ @@ -1254,11 +1295,12 @@ found_no_lwfn_file: if ( !pathname ) return FT_Err_Invalid_Argument; - error = 0; + error = FT_Err_Ok; *aface = NULL; /* try resourcefork based font: LWFN, FFIL */ - error = FT_New_Face_From_Resource( library, (UInt8 *)pathname, face_index, aface ); + error = FT_New_Face_From_Resource( library, (UInt8 *)pathname, + face_index, aface ); if ( error != 0 || *aface != NULL ) return error; @@ -1281,12 +1323,16 @@ found_no_lwfn_file: FT_EXPORT_DEF( FT_Error ) FT_New_Face_From_FSRef( FT_Library library, const FSRef* ref, - FT_Long face_index, + FT_Long face_index, FT_Face* aface ) { + #if !HAVE_FSREF + return FT_Err_Unimplemented_Feature; + #else + FT_Error error; FT_Open_Args args; OSErr err; @@ -1308,7 +1354,9 @@ found_no_lwfn_file: args.flags = FT_OPEN_PATHNAME; args.pathname = (char*)pathname; return FT_Open_Face( library, &args, face_index, aface ); -#endif + +#endif /* HAVE_FSREF */ + } @@ -1326,41 +1374,48 @@ found_no_lwfn_file: const FSSpec* spec, FT_Long face_index, FT_Face* aface ) - { + { + #if HAVE_FSREF - FSRef ref; + + FSRef ref; if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr ) return FT_Err_Invalid_Argument; else return FT_New_Face_From_FSRef( library, &ref, face_index, aface ); + #elif HAVE_FSSPEC + FT_Error error; FT_Open_Args args; - OSErr err; - UInt8 pathname[HFS_MAXPATHLEN]; + OSErr err; + UInt8 pathname[HFS_MAXPATHLEN]; if ( !spec ) return FT_Err_Invalid_Argument; err = FT_FSpMakePath( spec, pathname, sizeof ( pathname ) ); - if ( err ) - error = FT_Err_Cannot_Open_Resource; + if ( err ) + error = FT_Err_Cannot_Open_Resource; error = FT_New_Face_From_Resource( library, pathname, face_index, aface ); if ( error != 0 || *aface != NULL ) - return error; - + return error; /* fallback to datafork font */ args.flags = FT_OPEN_PATHNAME; args.pathname = (char*)pathname; return FT_Open_Face( library, &args, face_index, aface ); + #else + return FT_Err_Unimplemented_Feature; -#endif + +#endif /* HAVE_FSREF, HAVE_FSSPEC */ + }