]> granicus.if.org Git - libass/commitdiff
fontselect: add fallback and substitution callbacks
authorGrigori Goronzy <greg@chown.ath.cx>
Mon, 8 Jun 2015 23:20:28 +0000 (01:20 +0200)
committerGrigori Goronzy <greg@chown.ath.cx>
Fri, 10 Jul 2015 08:42:41 +0000 (10:42 +0200)
Add callbacks to introduce more sane fallback handling and font
alias substitutions.

libass/ass_coretext.c
libass/ass_fontconfig.c
libass/ass_fontselect.c
libass/ass_types.h

index 5347541b1ccac6e227b914d9ad744a9deda5d762..66277a5bec2fea756508b88938766b4ae2aac58b 100644 (file)
@@ -270,10 +270,12 @@ static ASS_FontProviderFuncs coretext_callbacks = {
     destroy_font,
     NULL,
 #if CT_FONTS_EAGER_LOAD
-    NULL
+    NULL,
 #else
-    match_fonts
+    match_fonts,
 #endif
+    NULL,
+    NULL
 };
 
 ASS_FontProvider *
index 2d3ea3fa15dc07531fc38a665e3869830cf2c07f..c91c07403a30c53bd5eaad9e4465d989797efe58 100644 (file)
@@ -131,6 +131,8 @@ static ASS_FontProviderFuncs fontconfig_callbacks = {
     NULL,
     destroy,
     NULL,
+    NULL,
+    NULL
 };
 
 ASS_FontProvider *
index 174fe1d012bfc8b02f7d0ab545a74f0161be1294..38a1a89d3259e6d8e7e7f5764559a36ebeed9aad 100644 (file)
@@ -195,6 +195,8 @@ static ASS_FontProviderFuncs ft_funcs = {
     destroy_font_ft,
     NULL,
     NULL,
+    NULL,
+    NULL
 };
 
 /**
index c1a14b435029a6f3a9c56b27dc6fec2d08fa2a18..545724daa32ddec00515ffe15b7fd951af609282 100644 (file)
@@ -47,8 +47,8 @@ typedef struct parser_priv ASS_ParserPriv;
 typedef struct ass_library ASS_Library;
 typedef struct font_provider ASS_FontProvider;
 
-
 /* Font Provider */
+typedef struct font_provider_meta_data ASS_FontProviderMetaData;
 
 /**
  * Get font data. This is a stream interface which can be used as an
@@ -104,13 +104,55 @@ typedef void    (*MatchFontsFunc)(ASS_Library *lib,
                                   ASS_FontProvider *provider,
                                   char *name);
 
+/**
+ * Substitute font name by another. This implements generic font family
+ * substitutions (e.g. sans-serif, serif, monospace) as well as font aliases.
+ *
+ * The generic families should map to sensible platform-specific font families.
+ * Aliases are sometimes used to map from common fonts that don't exist on
+ * a particular platform to similar alternatives. For example, a Linux
+ * system with fontconfig may map "Arial" to "Liberation Sans" and Windows
+ * maps "Helvetica" to "Arial".
+ *
+ * This is called by fontselect when a new logical font is created. The font
+ * provider set as default is used.
+ *
+ * \param priv font provider private data
+ * \param name input string for substitution, as specified in the script
+ * \return output string for substitution, allocated with malloc(), must be
+ *         freed by caller, can be NULL if no substitution was done.
+ */
+typedef char   *(*SubstituteFontFunc)(void *priv, const char *name);
+
+/**
+ * Get an appropriate fallback font for a given codepoint.
+ *
+ * This is called by fontselect whenever a glyph is not found in the
+ * physical font list of a logical font. fontselect will try to add the
+ * font family with match_fonts if it does not exist in the font list
+ * add match_fonts is not NULL. Note that the returned font family should
+ * contain the requested codepoint.
+ *
+ * Note that fontselect uses the font provider set as default to determine
+ * fallbacks.
+ *
+ * \param font_priv font private data
+ * \param codepoint Unicode codepoint (UTF-32)
+ * \return output font family, allocated with malloc(), must be freed
+ *         by caller.
+ */
+typedef char   *(*GetFallbackFunc)(void *font_priv,
+                                   ASS_FontProviderMetaData *meta,
+                                   uint32_t codepoint);
+
 typedef struct font_provider_funcs {
-    GetDataFunc     get_data;
-    CheckGlyphFunc  check_glyph;
-    DestroyFontFunc destroy_font;
-    DestroyProviderFunc destroy_provider;
-    MatchFontsFunc  match_fonts;
-    // XXX: add function for alias handling
+    GetDataFunc     get_data;       /* optional/mandatory */
+    CheckGlyphFunc  check_glyph;    /* mandatory */
+    DestroyFontFunc destroy_font;   /* optional */
+    DestroyProviderFunc destroy_provider; /* optional */
+    MatchFontsFunc  match_fonts;    /* optional */
+    SubstituteFontFunc subst_font;  /* optional */
+    GetFallbackFunc fallback_font;  /* optional */
 } ASS_FontProviderFuncs;
 
 /*