]> granicus.if.org Git - libass/commitdiff
Allow inexact font family matching.
authoreugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Thu, 1 May 2008 00:34:26 +0000 (00:34 +0000)
committereugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Thu, 1 May 2008 00:34:26 +0000 (00:34 +0000)
In SSA/ASS fonts are sometimes referenced by their "full name",
which is usually a concatenation of family name and font
style (ex. Ottawa Bold). Full name is available from
FontConfig pattern element FC_FULLNAME, but it is never
used for font matching.
Therefore, I'm removing words from the end of the name one
by one, and adding shortened names to the pattern. It seems
that the first value (full name in this case) has
precedence in matching.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@26623 b3059339-0415-0410-9bf9-f77b7e298cf2

libass/ass_fontconfig.c

index b9a8f42c4519b8f4deb4e20bda3986a89f528a8d..48b24ad9792ce9b697dc230efadb3da4c6f8fdc6 100644 (file)
@@ -81,6 +81,26 @@ static char* _select_font(fc_instance_t* priv, const char* family, unsigned bold
                goto error;
        
        FcPatternAddString(pat, FC_FAMILY, (const FcChar8*)family);
+
+       // In SSA/ASS fonts are sometimes referenced by their "full name",
+       // which is usually a concatenation of family name and font
+       // style (ex. Ottawa Bold). Full name is available from
+       // FontConfig pattern element FC_FULLNAME, but it is never
+       // used for font matching.
+       // Therefore, I'm removing words from the end of the name one
+       // by one, and adding shortened names to the pattern. It seems
+       // that the first value (full name in this case) has
+       // precedence in matching.
+       // An alternative approach could be to reimplement FcFontSort
+       // using FC_FULLNAME instead of FC_FAMILY.
+       if (strchr(family, ' ')) {
+               char *p, *s = strdup(family);
+               while (p = strrchr(s, ' ')) {
+                       *p = '\0';
+                       FcPatternAddString(pat, FC_FAMILY, (const FcChar8*)s);
+               }
+               free(s);
+       }
        FcPatternAddBool(pat, FC_OUTLINE, FcTrue);
        FcPatternAddInteger(pat, FC_SLANT, italic);
        FcPatternAddInteger(pat, FC_WEIGHT, bold);