[vlc-commits] freetype: drop CoreText specific Select in favor of the generic implementation and add family lookup

Felix Paul Kühne git at videolan.org
Sun Nov 22 21:25:34 CET 2015


vlc | branch: master | Felix Paul Kühne <fkuehne at videolan.org> | Sun Nov 22 21:22:14 2015 +0100| [55a47ea3474dd7ba462192cb34bfbf7be92e463b] | committer: Felix Paul Kühne

freetype: drop CoreText specific Select in favor of the generic implementation and add family lookup

No fallback yet

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=55a47ea3474dd7ba462192cb34bfbf7be92e463b
---

 modules/text_renderer/fonts/darwin.c   |   76 +++++++++++++++++++++++++-------
 modules/text_renderer/freetype.c       |    8 +++-
 modules/text_renderer/platform_fonts.h |    9 ++--
 3 files changed, 70 insertions(+), 23 deletions(-)

diff --git a/modules/text_renderer/fonts/darwin.c b/modules/text_renderer/fonts/darwin.c
index a56ee3d..209b241 100644
--- a/modules/text_renderer/fonts/darwin.c
+++ b/modules/text_renderer/fonts/darwin.c
@@ -55,18 +55,33 @@ char* getPathForFontDescription(CTFontDescriptorRef fontDescriptor)
     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 )
+const vlc_family_t *CoreText_GetFamily(filter_t *p_filter, const char *psz_family)
 {
-    VLC_UNUSED( i_idx );
-    VLC_UNUSED( b_bold );
-    VLC_UNUSED( b_italic );
-    VLC_UNUSED( codepoint );
+    filter_sys_t *p_sys = p_filter->p_sys;
 
-    if( psz_fontname == NULL )
+    if (unlikely(psz_family == NULL)) {
         return NULL;
+    }
+
+    char *psz_lc = ToLower(psz_family);
+    if (unlikely(!psz_lc)) {
+        return NULL;
+    }
+
+    /* let's double check if we have parsed this family already */
+    vlc_family_t *p_family = vlc_dictionary_value_for_key(&p_sys->family_map, psz_lc);
+    if (p_family) {
+        free(psz_lc);
+        return p_family;
+    }
+
+    /* create a new family object */
+    p_family = NewFamily(p_filter, psz_lc, &p_sys->p_families, &p_sys->family_map, psz_lc);
+    if (unlikely(!p_family)) {
+        return NULL;
+    }
 
+    /* we search for family name, display name and name to find them all */
     const size_t numberOfAttributes = 3;
     CTFontDescriptorRef coreTextFontDescriptors[numberOfAttributes];
     CFMutableDictionaryRef coreTextAttributes[numberOfAttributes];
@@ -76,12 +91,16 @@ char* CoreText_Select( filter_t *p_filter, const char* psz_fontname,
         kCTFontNameAttribute,
     };
 
-    CFStringRef fontName = CFStringCreateWithCString(kCFAllocatorDefault,
-                                                     psz_fontname,
-                                                     kCFStringEncodingUTF8);
+#ifndef NDEBUG
+    msg_Dbg(p_filter, "Creating new family for '%s'", psz_family);
+#endif
+
+    CFStringRef familyName = CFStringCreateWithCString(kCFAllocatorDefault,
+                                                       psz_family,
+                                                       kCFStringEncodingUTF8);
     for (size_t x = 0; x < numberOfAttributes; x++) {
         coreTextAttributes[x] = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL, NULL);
-        CFDictionaryAddValue(coreTextAttributes[x], attributeNames[x], fontName);
+        CFDictionaryAddValue(coreTextAttributes[x], attributeNames[x], familyName);
         coreTextFontDescriptors[x] = CTFontDescriptorCreateWithAttributes(coreTextAttributes[x]);
     }
 
@@ -94,6 +113,8 @@ char* CoreText_Select( filter_t *p_filter, const char* psz_fontname,
     CFIndex numberOfFoundFontDescriptions = CFArrayGetCount(matchedFontDescriptions);
 
     char *path = NULL;
+    bool b_bold = false;
+    bool b_italic = false;
 
     for (CFIndex i = 0; i < numberOfFoundFontDescriptions; i++) {
         CTFontDescriptorRef iter = CFArrayGetValueAtIndex(matchedFontDescriptions, i);
@@ -107,10 +128,23 @@ char* CoreText_Select( filter_t *p_filter, const char* psz_fontname,
             }
         }
 
-        break;
-    }
+        CFDictionaryRef fontTraits = CTFontDescriptorCopyAttribute(iter, kCTFontTraitsAttribute);
+        CFNumberRef trait = CFDictionaryGetValue(fontTraits, kCTFontWeightTrait);
+        float traitValue = 0.;
+        CFNumberGetValue(trait, kCFNumberFloatType, &traitValue);
+        b_bold = traitValue > 0.23;
+        trait = CFDictionaryGetValue(fontTraits, kCTFontSlantTrait);
+        traitValue = 0.;
+        CFNumberGetValue(trait, kCFNumberFloatType, &traitValue);
+        b_italic = traitValue > 0.03;
+
+#ifndef NDEBUG
+        msg_Dbg(p_filter, "New font for family '%s' bold %i italic %i path '%s'", psz_family, b_bold, b_italic, path);
+#endif
+        NewFont(path, 0, b_bold, b_italic, p_family);
 
-    msg_Dbg( p_filter, "found '%s'", path );
+        CFRelease(fontTraits);
+    }
 
     CFRelease(matchedFontDescriptions);
     CFRelease(coreTextFontCollection);
@@ -121,7 +155,15 @@ char* CoreText_Select( filter_t *p_filter, const char* psz_fontname,
     }
 
     CFRelease(coreTextFontDescriptorsArray);
-    CFRelease(fontName);
+    CFRelease(familyName);
+
+    return p_family;
+}
 
-    return path;
+vlc_family_t *CoreText_GetFallbacks(filter_t *p_filter, const char *psz_family, uni_char_t codepoint)
+{
+    VLC_UNUSED(p_filter);
+    VLC_UNUSED(psz_family);
+    VLC_UNUSED(codepoint);
+    return NULL;
 }
diff --git a/modules/text_renderer/freetype.c b/modules/text_renderer/freetype.c
index 251e841..307c7b4 100644
--- a/modules/text_renderer/freetype.c
+++ b/modules/text_renderer/freetype.c
@@ -1263,7 +1263,13 @@ static int Create( vlc_object_t *p_this )
     p_sys->pf_get_fallbacks = FontConfig_GetFallbacks;
     FontConfig_Prepare( p_filter );
 #elif defined( __APPLE__ )
-    p_sys->pf_select = CoreText_Select;
+    const char *const ppsz_darwin_default[] =
+    { "Helvetica Neue", "Arial", "GungSeo", "Arial Unicode MS", "PingFang SC", "MalayalamMN" };
+    p_sys->pf_select = Generic_Select;
+    p_sys->pf_get_family = CoreText_GetFamily;
+    p_sys->pf_get_fallbacks = CoreText_GetFallbacks;
+    InitDefaultList( p_filter, ppsz_darwin_default,
+                    sizeof( ppsz_darwin_default ) / sizeof( *ppsz_darwin_default ) );
 #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 7c9e051..204ca39 100644
--- a/modules/text_renderer/platform_fonts.h
+++ b/modules/text_renderer/platform_fonts.h
@@ -49,8 +49,8 @@
 
 /* Default fonts */
 #ifdef __APPLE__
-# define SYSTEM_DEFAULT_FONT_FILE "/Library/Fonts/Arial Unicode.ttf"
-# define SYSTEM_DEFAULT_FAMILY "Arial Unicode MS"
+# define SYSTEM_DEFAULT_FONT_FILE "/System/Library/Fonts/HelveticaNeue.dfont"
+# define SYSTEM_DEFAULT_FAMILY "Helvetica Neue"
 # define SYSTEM_DEFAULT_MONOSPACE_FONT_FILE "/System/Library/Fonts/Monaco.dfont"
 # define SYSTEM_DEFAULT_MONOSPACE_FAMILY "Monaco"
 #elif defined( _WIN32 )
@@ -151,9 +151,8 @@ const vlc_family_t *Win32_GetFamily( filter_t *p_filter, const char *psz_family
 #endif /* _WIN32 */
 
 #ifdef __APPLE__
-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_family_t *CoreText_GetFallbacks(filter_t *p_filter, const char *psz_family, uni_char_t codepoint);
+const vlc_family_t *CoreText_GetFamily(filter_t *p_filter, const char *psz_family);
 #endif /* __APPLE__ */
 
 #ifdef __ANDROID__



More information about the vlc-commits mailing list