vlc | branch: master | Felix Paul Kühne <fkue...@videolan.org> | Sun Nov 22 19:12:44 2015 +0100| [8fba7c5840e8270cbe0e0a9f54684114cb4fd929] | committer: Felix Paul Kühne
freetype: replace legacy Mac selector with a re-write based on CoreText This removes a Carbon dependency and adds support for tvOS and iOS > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8fba7c5840e8270cbe0e0a9f54684114cb4fd929 --- modules/text_renderer/Makefile.am | 2 +- modules/text_renderer/fonts/darwin.c | 137 ++++++++++++++++---------------- modules/text_renderer/freetype.c | 4 +- modules/text_renderer/platform_fonts.h | 8 +- 4 files changed, 73 insertions(+), 78 deletions(-) diff --git a/modules/text_renderer/Makefile.am b/modules/text_renderer/Makefile.am index e010f09..53d3501 100644 --- a/modules/text_renderer/Makefile.am +++ b/modules/text_renderer/Makefile.am @@ -28,7 +28,7 @@ libfreetype_plugin_la_SOURCES += text_renderer/fonts/android.c endif if HAVE_DARWIN libfreetype_plugin_la_SOURCES += text_renderer/fonts/darwin.c -libfreetype_plugin_la_LDFLAGS += -Wl,-framework,Carbon +libfreetype_plugin_la_LDFLAGS += -Wl,-framework,CoreFoundation -Wl,-framework,CoreText endif if HAVE_FRIBIDI libfreetype_plugin_la_CPPFLAGS += $(FRIBIDI_CFLAGS) -DHAVE_FRIBIDI diff --git a/modules/text_renderer/fonts/darwin.c b/modules/text_renderer/fonts/darwin.c index 26fb339..a56ee3d 100644 --- a/modules/text_renderer/fonts/darwin.c +++ b/modules/text_renderer/fonts/darwin.c @@ -1,14 +1,11 @@ /***************************************************************************** - * freetype.c : Put text on the video, using freetype2 + * darwin.c : Put text on the video, using freetype2 ***************************************************************************** - * Copyright (C) 2002 - 2015 VLC authors and VideoLAN + * Copyright (C) 2015 VLC authors and VideoLAN * $Id$ * - * Authors: Sigmund Augdal Helberg <dnum...@videolan.org> - * Gildas Bazin <gba...@videolan.org> - * Bernie Purcell <bit...@videolan.org> + * Authors: Felix Paul Kühne <fkue...@videolan.org> * Jean-Baptiste Kempf <j...@videolan.org> - * Felix Paul Kühne <fkue...@videolan.org> * Salah-Eddin Shaban <salshaa...@gmail.com> * * This program is free software; you can redistribute it and/or modify it @@ -37,92 +34,94 @@ #include <vlc_common.h> #include <vlc_filter.h> /* filter_sys_t */ -#include <TargetConditionals.h> -#if !TARGET_OS_IPHONE -# include <Carbon/Carbon.h> -#endif -#include <sys/param.h> /* for MAXPATHLEN */ +#include <CoreFoundation/CoreFoundation.h> +#include <CoreText/CoreText.h> #include "../platform_fonts.h" -#if !TARGET_OS_IPHONE -char* MacLegacy_Select( filter_t *p_filter, const char* psz_fontname, - bool b_bold, bool b_italic, - int *i_idx, uni_char_t codepoint ) +char* getPathForFontDescription(CTFontDescriptorRef fontDescriptor); + +char* getPathForFontDescription(CTFontDescriptorRef fontDescriptor) +{ + CFURLRef url = CTFontDescriptorCopyAttribute(fontDescriptor, kCTFontURLAttribute); + CFStringRef path = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle); + char *cpath = (char *)CFStringGetCStringPtr(path, kCFStringEncodingUTF8); + char *retPath = NULL; + if (cpath) { + retPath = strdup(cpath); + } + CFRelease(path); + CFRelease(url); + return retPath; +} + +char* CoreText_Select( filter_t *p_filter, const char* psz_fontname, + bool b_bold, bool b_italic, + int *i_idx, uni_char_t codepoint ) { + VLC_UNUSED( i_idx ); VLC_UNUSED( b_bold ); VLC_UNUSED( b_italic ); VLC_UNUSED( codepoint ); - FSRef ref; - unsigned char path[MAXPATHLEN]; - char * psz_path; - - CFStringRef cf_fontName; - ATSFontRef ats_font_id; - - *i_idx = 0; if( psz_fontname == NULL ) return NULL; - msg_Dbg( p_filter, "looking for %s", psz_fontname ); - cf_fontName = CFStringCreateWithCString( kCFAllocatorDefault, psz_fontname, kCFStringEncodingUTF8 ); + const size_t numberOfAttributes = 3; + CTFontDescriptorRef coreTextFontDescriptors[numberOfAttributes]; + CFMutableDictionaryRef coreTextAttributes[numberOfAttributes]; + CFStringRef attributeNames[numberOfAttributes] = { + kCTFontFamilyNameAttribute, + kCTFontDisplayNameAttribute, + kCTFontNameAttribute, + }; + + CFStringRef fontName = CFStringCreateWithCString(kCFAllocatorDefault, + psz_fontname, + kCFStringEncodingUTF8); + for (size_t x = 0; x < numberOfAttributes; x++) { + coreTextAttributes[x] = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL, NULL); + CFDictionaryAddValue(coreTextAttributes[x], attributeNames[x], fontName); + coreTextFontDescriptors[x] = CTFontDescriptorCreateWithAttributes(coreTextAttributes[x]); + } + + CFArrayRef coreTextFontDescriptorsArray = CFArrayCreate(kCFAllocatorDefault, (const void **)&coreTextFontDescriptors, numberOfAttributes, NULL); - ats_font_id = ATSFontFindFromName( cf_fontName, kATSOptionFlagsIncludeDisabledMask ); + CTFontCollectionRef coreTextFontCollection = CTFontCollectionCreateWithFontDescriptors(coreTextFontDescriptorsArray, 0); - if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL ) - { - msg_Dbg( p_filter, "ATS couldn't find %s by name, checking family", psz_fontname ); - ats_font_id = ATSFontFamilyFindFromName( cf_fontName, kATSOptionFlagsDefault ); + CFArrayRef matchedFontDescriptions = CTFontCollectionCreateMatchingFontDescriptors(coreTextFontCollection); - if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL ) - { - msg_Dbg( p_filter, "ATS couldn't find either %s nor its family, checking PS name", psz_fontname ); - ats_font_id = ATSFontFindFromPostScriptName( cf_fontName, kATSOptionFlagsDefault ); + CFIndex numberOfFoundFontDescriptions = CFArrayGetCount(matchedFontDescriptions); - if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL ) - { - msg_Err( p_filter, "ATS couldn't find %s (no font name, family or PS name)", psz_fontname ); - CFRelease( cf_fontName ); - return NULL; + char *path = NULL; + + for (CFIndex i = 0; i < numberOfFoundFontDescriptions; i++) { + CTFontDescriptorRef iter = CFArrayGetValueAtIndex(matchedFontDescriptions, i); + path = getPathForFontDescription(iter); + + /* check if the path is empty, which can happen in rare circumstances */ + if (path != NULL) { + if (strcmp("", path) == 0) { + FREENULL(path); + continue; } } - } - CFRelease( cf_fontName ); - if ( noErr != ATSFontGetFileReference( ats_font_id, &ref ) ) - { - msg_Err( p_filter, "ATS couldn't get file ref for %s", psz_fontname ); - return NULL; + break; } - /* i_idx calculation by searching preceding fontIDs */ - /* with same FSRef */ - { - ATSFontRef id2 = ats_font_id - 1; - FSRef ref2; + msg_Dbg( p_filter, "found '%s'", path ); - while ( id2 > 0 ) - { - if ( noErr != ATSFontGetFileReference( id2, &ref2 ) ) - break; - if ( noErr != FSCompareFSRefs( &ref, &ref2 ) ) - break; + CFRelease(matchedFontDescriptions); + CFRelease(coreTextFontCollection); - id2 --; - } - *i_idx = ats_font_id - ( id2 + 1 ); + for (size_t x = 0; x < numberOfAttributes; x++) { + CFRelease(coreTextAttributes[x]); + CFRelease(coreTextFontDescriptors[x]); } - if ( noErr != FSRefMakePath( &ref, path, sizeof(path) ) ) - { - msg_Err( p_filter, "failure when getting path from FSRef" ); - return NULL; - } - msg_Dbg( p_filter, "found %s", path ); + CFRelease(coreTextFontDescriptorsArray); + CFRelease(fontName); - psz_path = strdup( (char *)path ); - - return psz_path; + return path; } -#endif diff --git a/modules/text_renderer/freetype.c b/modules/text_renderer/freetype.c index 057447d..251e841 100644 --- a/modules/text_renderer/freetype.c +++ b/modules/text_renderer/freetype.c @@ -1263,9 +1263,7 @@ static int Create( vlc_object_t *p_this ) p_sys->pf_get_fallbacks = FontConfig_GetFallbacks; FontConfig_Prepare( p_filter ); #elif defined( __APPLE__ ) -#if !TARGET_OS_IPHONE - p_sys->pf_select = MacLegacy_Select; -#endif + p_sys->pf_select = CoreText_Select; #elif defined( _WIN32 ) && defined( HAVE_GET_FONT_BY_FAMILY_NAME ) const char *const ppsz_win32_default[] = { "Tahoma", "FangSong", "SimHei", "KaiTi" }; diff --git a/modules/text_renderer/platform_fonts.h b/modules/text_renderer/platform_fonts.h index abf76c7..7c9e051 100644 --- a/modules/text_renderer/platform_fonts.h +++ b/modules/text_renderer/platform_fonts.h @@ -151,11 +151,9 @@ const vlc_family_t *Win32_GetFamily( filter_t *p_filter, const char *psz_family #endif /* _WIN32 */ #ifdef __APPLE__ -#if !TARGET_OS_IPHONE -char* MacLegacy_Select( filter_t *p_filter, const char* psz_fontname, - bool b_bold, bool b_italic, - int *i_idx, uni_char_t codepoint ); -#endif +char* CoreText_Select( filter_t *p_filter, const char* psz_fontname, + bool b_bold, bool b_italic, + int *i_idx, uni_char_t codepoint ); #endif /* __APPLE__ */ #ifdef __ANDROID__ _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits