]> granicus.if.org Git - libass/commitdiff
Remove extra family names from the search pattern after FcFontSort and
authoreugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Thu, 8 May 2008 13:53:56 +0000 (13:53 +0000)
committereugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Thu, 8 May 2008 13:53:56 +0000 (13:53 +0000)
call FcFontRenderPrepare to select the best family name for the font in case
there are several of them.

This does not affect font matching results, but helps to avoid warning about
inexact match.

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

libass/ass_fontconfig.c

index b98b67555f992c71700d6baa946c8f8414288c13..2ae22dab550a48c0cc72e55c527f580d645134ec 100644 (file)
@@ -73,6 +73,7 @@ static char* _select_font(fc_instance_t* priv, const char* family, unsigned bold
        FcFontSet* fset = 0;
        int curf;
        char* retval = 0;
+       int family_cnt;
        
        *index = 0;
 
@@ -93,11 +94,13 @@ static char* _select_font(fc_instance_t* priv, const char* family, unsigned bold
        // precedence in matching.
        // An alternative approach could be to reimplement FcFontSort
        // using FC_FULLNAME instead of FC_FAMILY.
+       family_cnt = 1;
        if (strchr(family, ' ')) {
                char *p, *s = strdup(family);
                while (p = strrchr(s, ' ')) {
                        *p = '\0';
                        FcPatternAddString(pat, FC_FAMILY, (const FcChar8*)s);
+                       ++ family_cnt;
                }
                free(s);
        }
@@ -114,16 +117,16 @@ static char* _select_font(fc_instance_t* priv, const char* family, unsigned bold
        fset = FcFontSort(priv->config, pat, FcTrue, NULL, &result);
 
        for (curf = 0; curf < fset->nfont; ++curf) {
-               rpat = fset->fonts[curf];
-               
-               result = FcPatternGetBool(rpat, FC_OUTLINE, 0, &r_outline);
+               FcPattern* curp = fset->fonts[curf];
+
+               result = FcPatternGetBool(curp, FC_OUTLINE, 0, &r_outline);
                if (result != FcResultMatch)
                        continue;
                if (r_outline != FcTrue)
                        continue;
                if (!code)
                        break;
-               result = FcPatternGetCharSet(rpat, FC_CHARSET, 0, &r_charset);
+               result = FcPatternGetCharSet(curp, FC_CHARSET, 0, &r_charset);
                if (result != FcResultMatch)
                        continue;
                if (FcCharSetHasChar(r_charset, code))
@@ -133,8 +136,16 @@ static char* _select_font(fc_instance_t* priv, const char* family, unsigned bold
        if (curf >= fset->nfont)
                goto error;
 
-       rpat = fset->fonts[curf];
-       
+       // Remove all extra family names from original pattern.
+       // After this, FcFontRenderPrepare will select the most relevant family
+       // name in case there are more than one of them.
+       for (; family_cnt > 1; --family_cnt)
+               FcPatternRemove(pat, FC_FAMILY, family_cnt - 1);
+
+       rpat = FcFontRenderPrepare(priv->config, pat, fset->fonts[curf]);
+       if (!rpat)
+               goto error;
+
        result = FcPatternGetInteger(rpat, FC_INDEX, 0, &r_index);
        if (result != FcResultMatch)
                goto error;
@@ -181,6 +192,7 @@ static char* _select_font(fc_instance_t* priv, const char* family, unsigned bold
 
  error:
        if (pat) FcPatternDestroy(pat);
+       if (rpat) FcPatternDestroy(rpat);
        if (fset) FcFontSetDestroy(fset);
        return retval;
 }