]> granicus.if.org Git - libass/commitdiff
fontselect: don't find fonts with PostScript outlines by full name
authorOleg Oshmyan <chortos@inbox.lv>
Thu, 22 Oct 2015 22:55:06 +0000 (01:55 +0300)
committerOleg Oshmyan <chortos@inbox.lv>
Thu, 22 Oct 2015 23:47:00 +0000 (02:47 +0300)
Related to commit e00691e8096cc69e5651480155ebc61d9e079290:
it turns out that GDI (and hence VSFilter) does not check full names of
fonts that have PostScript outlines when searching for a font by name.

To summarize the resulting behavior:
  * Fonts with PostScript outlines can be found by family name
    and by PostScript name.
  * Fonts without PostScript outlines can be found by family name
    and by full name.

libass/ass_fontselect.c

index e179ed92f11f95d7fca0f31b5a52510c6bda48aa..ce24f7edf707f7f3cbdb9d9f872da1278db80801 100644 (file)
@@ -419,25 +419,21 @@ static bool matches_family_name(ASS_FontInfo *f, const char *family)
 }
 
 /**
- * \brief Return whether the given font has the given fullname.
+ * \brief Return whether the given font has the given fullname or
+ * PostScript name depending on whether it has PostScript outlines.
  */
-static bool matches_fullname(ASS_FontInfo *f, const char *fullname)
+static bool matches_full_or_postscript_name(ASS_FontInfo *f,
+                                            const char *fullname)
 {
-    for (int i = 0; i < f->n_fullname; i++) {
-        if (ass_strcasecmp(f->fullnames[i], fullname) == 0)
-            return true;
-    }
-    return false;
-}
-
-/**
- * \brief Return whether the given font has the given PostScript name.
- */
-static bool matches_postscript_name(ASS_FontInfo *f, const char *name)
-{
-    if (f->is_postscript && f->postscript_name) {
-        if (ass_strcasecmp(f->postscript_name, name) == 0)
+    if (f->is_postscript) {
+        if (f->postscript_name != NULL &&
+            ass_strcasecmp(f->postscript_name, fullname) == 0)
             return true;
+    } else {
+        for (int i = 0; i < f->n_fullname; i++) {
+            if (ass_strcasecmp(f->fullnames[i], fullname) == 0)
+                return true;
+        }
     }
     return false;
 }
@@ -527,8 +523,7 @@ find_font(ASS_FontSelector *priv, ASS_Library *library,
                 // to determine best match in that particular family
                 score = font_attributes_similarity(font, &req);
                 *name_match = true;
-            } else if (matches_fullname(font, fullname) ||
-                       matches_postscript_name(font, fullname)) {
+            } else if (matches_full_or_postscript_name(font, fullname)) {
                 // If we don't have any match, compare fullnames against request
                 // if there is a match now, assign lowest score possible. This means
                 // the font should be chosen instantly, without further search.