diff options
Diffstat (limited to 'libass/ass_fontselect.h')
-rw-r--r-- | libass/ass_fontselect.h | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/libass/ass_fontselect.h b/libass/ass_fontselect.h index 267b6fe..2c03a16 100644 --- a/libass/ass_fontselect.h +++ b/libass/ass_fontselect.h @@ -31,6 +31,151 @@ typedef struct font_info ASS_FontInfo; #include "ass.h" #include "ass_font.h" +typedef struct font_provider ASS_FontProvider; + +/* Font Provider */ +typedef struct ass_font_provider_meta_data ASS_FontProviderMetaData; + +/** + * Get font data. This is a stream interface which can be used as an + * alternative to providing a font path (which may not be available). + * + * This is called by fontselect if a given font was added without a + * font path (i.e. the path was set to NULL). + * + * \param font_priv font private data + * \param output buffer; set to NULL to query stream size + * \param offset stream offset + * \param len bytes to read into output buffer from stream + * \return actual number of bytes read, or stream size if data == NULL + */ +typedef size_t (*GetDataFunc)(void *font_priv, unsigned char *data, + size_t offset, size_t len); + +/** + * Check if a glyph is supported by a font. + * + * \param font_priv font private data + * \param codepont Unicode codepoint (UTF-32) + * \return non-zero value if codepoint is supported by the font + */ +typedef int (*CheckGlyphFunc)(void *font_priv, uint32_t codepoint); + +/** + * Destroy a font's private data. + * + * \param font_priv font private data + */ +typedef void (*DestroyFontFunc)(void *font_priv); + +/** + * Destroy a font provider's private data. + * + * \param priv font provider private data + */ +typedef void (*DestroyProviderFunc)(void *priv); + +/** + * Add fonts for a given font name; this should add all fonts matching the + * given name to the fontselect database. + * + * This is called by fontselect whenever a new logical font is created. The + * font provider set as default is used. + * + * \param lib ASS_Library instance + * \param provider font provider instance + * \param name font name (as specified in script) + */ +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 + * \param meta metadata (fullnames and n_fullname) to be filled in + */ +typedef void (*SubstituteFontFunc)(void *priv, const char *name, + ASS_FontProviderMetaData *meta); + +/** + * 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; /* 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; + +/* + * Basic font metadata. All strings must be encoded with UTF-8. + * At minimum one family is required. + */ +struct ass_font_provider_meta_data { + + /** + * List of localized font family names, e.g. "Arial". + */ + char **families; + + /** + * List of localized full names, e.g. "Arial Bold". + * The English name should be listed first to speed up typical matching. + */ + char **fullnames; + int n_family; // Number of localized family names + int n_fullname; // Number of localized full names + + int slant; // Font slant value from FONT_SLANT_* + int weight; // Font weight in TrueType scale, 100-900 + // See FONT_WEIGHT_* + int width; // Font weight in percent, normally 100 + // See FONT_WIDTH_* +}; + +typedef struct ass_font_stream ASS_FontStream; + +struct ass_font_stream { + // GetDataFunc + size_t (*func)(void *font_priv, unsigned char *data, + size_t offset, size_t len); + void *priv; +}; + ASS_FontSelector * ass_fontselect_init(ASS_Library *library, FT_Library ftlibrary, const char *family, @@ -45,4 +190,39 @@ void ass_fontselect_free(ASS_FontSelector *priv); ASS_FontProvider *ass_font_provider_new(ASS_FontSelector *selector, ASS_FontProviderFuncs *funcs, void *data); +/** + * \brief Create an empty font provider. A font provider can be used to + * provide additional fonts to libass. + * \param priv parent renderer + * \param funcs callback functions + * \param private data for provider callbacks + * + */ +ASS_FontProvider * +ass_create_font_provider(ASS_Renderer *priv, ASS_FontProviderFuncs *funcs, + void *data); + +/** + * \brief Add a font to a font provider. + * \param provider the font provider + * \param meta font metadata. See struct definition for more information. + * \param path absolute path to font, or NULL for memory-based fonts + * \param index index inside a font collection file + * \param psname PostScript name of the face (overrides index if present) + * \param data private data for font callbacks + * \return success + * + */ +int +ass_font_provider_add_font(ASS_FontProvider *provider, + ASS_FontProviderMetaData *meta, const char *path, + unsigned int index, const char *psname, void *data); + +/** + * \brief Free font provider and associated fonts. + * \param provider the font provider + * + */ +void ass_font_provider_free(ASS_FontProvider *provider); + #endif /* LIBASS_FONTCONFIG_H */ |