diff options
author | eugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-12-03 17:59:13 +0000 |
---|---|---|
committer | eugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-12-03 17:59:13 +0000 |
commit | 7db61d9736e71adcd85ce562ae89861513567d91 (patch) | |
tree | 4012a408a05f63dd4b35eacc763230b9714e1fa7 /libass/ass_fontconfig.c | |
parent | 6d0d8d71f882ed01f1aadecb923d939efa6a4d99 (diff) | |
download | mpv-7db61d9736e71adcd85ce562ae89861513567d91.tar.bz2 mpv-7db61d9736e71adcd85ce562ae89861513567d91.tar.xz |
Keep embedded fonts in ass_library_t and perform actual disk write
in fontconfig initialization. This is required for some fontconfig-related
improvements.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@21474 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libass/ass_fontconfig.c')
-rw-r--r-- | libass/ass_fontconfig.c | 94 |
1 files changed, 92 insertions, 2 deletions
diff --git a/libass/ass_fontconfig.c b/libass/ass_fontconfig.c index 8cb6db205e..c2348fa6d8 100644 --- a/libass/ass_fontconfig.c +++ b/libass/ass_fontconfig.c @@ -28,6 +28,8 @@ #include <sys/stat.h> #include "mputils.h" +#include "ass.h" +#include "ass_library.h" #include "ass_fontconfig.h" #ifdef HAVE_FONTCONFIG @@ -184,6 +186,89 @@ char* fontconfig_select(fc_instance_t* priv, const char* family, unsigned bold, return fontconfig_select_with_charset(priv, family, bold, italic, index, 0); } +static char* validate_fname(char* name) +{ + char* fname; + char* p; + char* q; + unsigned code; + int sz = strlen(name); + + q = fname = malloc(sz + 1); + p = name; + while (*p) { + code = utf8_get_char(&p); + if (code == 0) + break; + if ( (code > 0x7F) || + (code == '\\') || + (code == '/') || + (code == ':') || + (code == '*') || + (code == '?') || + (code == '<') || + (code == '>') || + (code == '|') || + (code == 0)) + { + *q++ = '_'; + } else { + *q++ = code; + } + if (p - name > sz) + break; + } + *q = 0; + return fname; +} + +/** + * \brief Process embedded matroska font. Saves it to ~/.mplayer/fonts. + * \param name attachment name + * \param data binary font data + * \param data_size data size +*/ +static void process_fontdata(fc_instance_t* priv, ass_library_t* library, int idx) +{ + char buf[1000]; + FILE* fp = 0; + int rc; + struct stat st; + char* fname; + const char* name = library->fontdata[idx].name; + const char* data = library->fontdata[idx].data; + int data_size = library->fontdata[idx].size; + const char* fonts_dir = library->fonts_dir; + + if (!fonts_dir) + return; + rc = stat(fonts_dir, &st); + if (rc) { + int res; +#ifndef __MINGW32__ + res = mkdir(fonts_dir, 0700); +#else + res = mkdir(fonts_dir); +#endif + if (res) { + mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FailedToCreateDirectory, fonts_dir); + } + } else if (!S_ISDIR(st.st_mode)) { + mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_NotADirectory, fonts_dir); + } + + fname = validate_fname((char*)name); + + snprintf(buf, 1000, "%s/%s", fonts_dir, fname); + free(fname); + + fp = fopen(buf, "wb"); + if (!fp) return; + + fwrite(data, data_size, 1, fp); + fclose(fp); +} + /** * \brief Init fontconfig. * \param dir additional directoryu for fonts @@ -191,11 +276,13 @@ char* fontconfig_select(fc_instance_t* priv, const char* family, unsigned bold, * \param path default font path * \return pointer to fontconfig private data */ -fc_instance_t* fontconfig_init(const char* dir, const char* family, const char* path) +fc_instance_t* fontconfig_init(ass_library_t* library, const char* family, const char* path) { int rc; struct stat st; fc_instance_t* priv = calloc(1, sizeof(fc_instance_t)); + const char* dir = library->fonts_dir; + int i; rc = FcInit(); assert(rc); @@ -206,6 +293,9 @@ fc_instance_t* fontconfig_init(const char* dir, const char* family, const char* return 0; } + for (i = 0; i < library->num_fontdata; ++i) + process_fontdata(priv, library, i); + if (FcDirCacheValid((const FcChar8 *)dir) == FcFalse) { mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_LIBASS_UpdatingFontCache); @@ -265,7 +355,7 @@ char* fontconfig_select(fc_instance_t* priv, const char* family, unsigned bold, return priv->path_default; } -fc_instance_t* fontconfig_init(const char* dir, const char* family, const char* path) +fc_instance_t* fontconfig_init(ass_library_t* library, const char* family, const char* path) { fc_instance_t* priv; |