summaryrefslogtreecommitdiffstats
path: root/libass/ass_fontconfig.c
diff options
context:
space:
mode:
authoreugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-12-03 17:59:13 +0000
committereugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-12-03 17:59:13 +0000
commit7db61d9736e71adcd85ce562ae89861513567d91 (patch)
tree4012a408a05f63dd4b35eacc763230b9714e1fa7 /libass/ass_fontconfig.c
parent6d0d8d71f882ed01f1aadecb923d939efa6a4d99 (diff)
downloadmpv-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.c94
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;