summaryrefslogtreecommitdiffstats
path: root/libass
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
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')
-rw-r--r--libass/ass.c80
-rw-r--r--libass/ass.h2
-rw-r--r--libass/ass_cache.c1
-rw-r--r--libass/ass_font.c2
-rw-r--r--libass/ass_fontconfig.c94
-rw-r--r--libass/ass_fontconfig.h2
-rw-r--r--libass/ass_library.c16
-rw-r--r--libass/ass_library.h9
-rw-r--r--libass/ass_render.c2
9 files changed, 123 insertions, 85 deletions
diff --git a/libass/ass.c b/libass/ass.c
index c1568f07fd..d2c9523c7e 100644
--- a/libass/ass.c
+++ b/libass/ass.c
@@ -1046,86 +1046,6 @@ int ass_read_styles(ass_track_t* track, char* fname, char* codepage)
return 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 Add a memory font.
- * \param name attachment name
- * \param data binary font data
- * \param data_size data size
-*/
-void ass_add_font(ass_library_t* library, const char* name, char* data, int data_size)
-{
- char buf[1000];
- FILE* fp = 0;
- int rc;
- struct stat st;
- char* fname;
- 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);
-}
-
long long ass_step_sub(ass_track_t* track, long long now, int movement) {
int i;
diff --git a/libass/ass.h b/libass/ass.h
index 639b8cb40c..ba9a41104b 100644
--- a/libass/ass.h
+++ b/libass/ass.h
@@ -182,7 +182,7 @@ int ass_read_styles(ass_track_t* track, char* fname, char* codepage);
* \param data binary font data
* \param data_size data size
*/
-void ass_add_font(ass_library_t* library, const char* name, char* data, int data_size);
+void ass_add_font(ass_library_t* library, char* name, char* data, int data_size);
/**
* \brief Calculates timeshift from now to the start of some other subtitle event, depending on movement parameter
diff --git a/libass/ass_cache.c b/libass/ass_cache.c
index ef81fa9728..338b2b42fd 100644
--- a/libass/ass_cache.c
+++ b/libass/ass_cache.c
@@ -27,6 +27,7 @@
#include <assert.h>
#include "mputils.h"
+#include "ass.h"
#include "ass_fontconfig.h"
#include "ass_font.h"
#include "ass_bitmap.h"
diff --git a/libass/ass_font.c b/libass/ass_font.c
index 2a44c9fc2c..176dbed6ba 100644
--- a/libass/ass_font.c
+++ b/libass/ass_font.c
@@ -26,6 +26,8 @@
#include FT_SYNTHESIS_H
#include FT_GLYPH_H
+#include "ass.h"
+#include "ass_library.h"
#include "ass_font.h"
#include "ass_bitmap.h"
#include "ass_cache.h"
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;
diff --git a/libass/ass_fontconfig.h b/libass/ass_fontconfig.h
index 9aa1746908..c36d67be46 100644
--- a/libass/ass_fontconfig.h
+++ b/libass/ass_fontconfig.h
@@ -27,7 +27,7 @@
typedef struct fc_instance_s fc_instance_t;
-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);
char* fontconfig_select(fc_instance_t* priv, const char* family, unsigned bold, unsigned italic, int* index);
void fontconfig_done(fc_instance_t* priv);
diff --git a/libass/ass_library.c b/libass/ass_library.c
index 1928e4361c..cb8152e9ba 100644
--- a/libass/ass_library.c
+++ b/libass/ass_library.c
@@ -71,3 +71,19 @@ void ass_set_style_overrides(ass_library_t* priv, char** list)
*q = strdup(*p);
priv->style_overrides[cnt] = NULL;
}
+
+static void grow_array(void **array, int nelem, size_t elsize)
+{
+ if (!(nelem & 31))
+ *array = realloc(*array, (nelem + 32) * elsize);
+}
+
+void ass_add_font(ass_library_t* priv, char* name, char* data, int size)
+{
+ grow_array((void**)&priv->fontdata, priv->num_fontdata, sizeof(*priv->fontdata));
+ priv->fontdata[priv->num_fontdata].name = name;
+ priv->fontdata[priv->num_fontdata].data = data;
+ priv->fontdata[priv->num_fontdata].size = size;
+ priv->num_fontdata ++;
+}
+
diff --git a/libass/ass_library.h b/libass/ass_library.h
index 7a16b5b8f4..34a8b7a034 100644
--- a/libass/ass_library.h
+++ b/libass/ass_library.h
@@ -21,10 +21,19 @@
#ifndef __ASS_LIBRARY_H__
#define __ASS_LIBRARY_H__
+typedef struct ass_fontdata_s {
+ char* name;
+ char* data;
+ int size;
+} ass_fontdata_t;
+
struct ass_library_s {
char* fonts_dir;
int extract_fonts;
char** style_overrides;
+
+ ass_fontdata_t* fontdata;
+ int num_fontdata;
};
#endif
diff --git a/libass/ass_render.c b/libass/ass_render.c
index b273b0f107..ef9a5f7bcb 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -1928,7 +1928,7 @@ int ass_set_fonts(ass_renderer_t* priv, const char* default_font, const char* de
if (priv->fontconfig_priv)
fontconfig_done(priv->fontconfig_priv);
- priv->fontconfig_priv = fontconfig_init(priv->library->fonts_dir, default_family, default_font);
+ priv->fontconfig_priv = fontconfig_init(priv->library, default_family, default_font);
return !!priv->fontconfig_priv;
}