]> granicus.if.org Git - libass/commitdiff
Add -ass-styles option. It allows to load styles from a file and use them
authoreugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Sun, 3 Sep 2006 17:42:31 +0000 (17:42 +0000)
committereugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Sun, 3 Sep 2006 17:42:31 +0000 (17:42 +0000)
for plain text subtitles rendering.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@19658 b3059339-0415-0410-9bf9-f77b7e298cf2

libass/ass.c
libass/ass.h
libass/ass_mp.c
libass/ass_mp.h

index 0425989f0a0b94b63f8ac30aff10d0a518e73831..0107a44e2963398f8df4a60836d4804fb102ef47 100644 (file)
@@ -28,8 +28,10 @@ extern char** ass_force_style_list;
 
 char *get_path(char *);
 
+typedef enum {PST_UNKNOWN = 0, PST_INFO, PST_STYLES, PST_EVENTS, PST_FONTS} parser_state_t;
+
 struct parser_priv_s {
-       enum {PST_UNKNOWN = 0, PST_INFO, PST_STYLES, PST_EVENTS, PST_FONTS} state;
+       parser_state_t state;
        char* fontname;
        char* fontdata;
        int fontdata_size;
@@ -844,18 +846,15 @@ static char* sub_recode(char* data, size_t size)
 #endif // ICONV
 
 /**
- * \brief Read subtitles from file.
- * \param fname file name
- * \return newly allocated track
-*/ 
-ass_track_t* ass_read_file(char* fname)
+ * \brief read file contents into newly allocated buffer, recoding to utf-8
+ */
+static char* read_file(char* fname)
 {
        int res;
        long sz;
        long bytes_read;
        char* buf;
-       ass_track_t* track;
-       
+
        FILE* fp = fopen(fname, "rb");
        if (!fp) {
                mp_msg(MSGT_GLOBAL, MSGL_WARN, "ass_read_file(%s): fopen failed\n", fname);
@@ -899,11 +898,25 @@ ass_track_t* ass_read_file(char* fname)
        if (sub_cp) {
                char* tmpbuf = sub_recode(buf, sz);
                free(buf);
-               if (!tmpbuf)
-                       return 0;
                buf = tmpbuf;
        }
 #endif
+       return buf;
+}
+
+/**
+ * \brief Read subtitles from file.
+ * \param fname file name
+ * \return newly allocated track
+*/ 
+ass_track_t* ass_read_file(char* fname)
+{
+       char* buf;
+       ass_track_t* track;
+       
+       buf = read_file(fname);
+       if (!buf)
+               return 0;
        
        track = ass_new_track();
        track->name = strdup(fname);
@@ -930,6 +943,26 @@ ass_track_t* ass_read_file(char* fname)
        return track;
 }
 
+/**
+ * \brief read styles from file into already initialized track
+ */
+int ass_read_styles(ass_track_t* track, char* fname)
+{
+       char* buf;
+       parser_state_t old_state;
+
+       buf = read_file(fname);
+       if (!buf)
+               return 1;
+
+       old_state = track->parser_priv->state;
+       track->parser_priv->state = PST_STYLES;
+       process_text(track, buf);
+       track->parser_priv->state = old_state;
+
+       return 0;
+}
+
 static char* validate_fname(char* name)
 {
        char* fname;
index a99b7540a6308853bfbb7a835f8cc408f8400ef5..ecf7c1a12900599cc683fa53e757688b7ddbf9af 100644 (file)
@@ -129,6 +129,12 @@ void ass_process_chunk(ass_track_t* track, char *data, int size, long long timec
 */
 ass_track_t* ass_read_file(char* fname);
 
+/**
+ * \brief read styles from file into already initialized track
+ * \return 0 on success
+ */
+int ass_read_styles(ass_track_t* track, char* fname);
+
 /**
  * \brief Process embedded matroska font. Saves it to ~/.mplayer/fonts.
  * \param name attachment name
index ec4994e09672c14569950f7f49091767dff6207e..92b8eb48231317238fdf10051d4c7b1dcf0b4cd7 100644 (file)
@@ -19,6 +19,7 @@ char **ass_force_style_list = NULL;
 int ass_use_margins = 0;
 char* ass_color = NULL;
 char* ass_border_color = NULL;
+char* ass_styles_file = NULL;
 
 extern int font_fontconfig;
 extern char* font_name;
@@ -30,10 +31,6 @@ extern void process_force_style(ass_track_t* track);
 
 ass_track_t* ass_default_track() {
        ass_track_t* track = ass_new_track();
-       ass_style_t* style;
-       int sid;
-       double fs;
-       uint32_t c1, c2;
 
        track->track_type = TRACK_TYPE_ASS;
        track->Timer = 100.;
@@ -41,6 +38,15 @@ ass_track_t* ass_default_track() {
        track->PlayResY = 288;
        track->WrapStyle = 0;
 
+       if (ass_styles_file)
+               ass_read_styles(track, ass_styles_file);
+
+       if (track->n_styles == 0) {
+       ass_style_t* style;
+       int sid;
+       double fs;
+       uint32_t c1, c2;
+
        sid = ass_alloc_style(track);
        style = track->styles + sid;
        style->Name = strdup("Default");
@@ -71,6 +77,7 @@ ass_track_t* ass_default_track() {
        style->MarginV = 20;
        style->ScaleX = 1.;
        style->ScaleY = 1.;
+       }
 
        return track;
 }
index 7ac1e2a3b85dd38133a6435d87afbfb57cb8f80e..8e385de66e24250b61a7e2944377117e18f19dbf 100644 (file)
@@ -13,6 +13,7 @@ extern char **ass_force_style_list;
 extern int ass_use_margins;
 extern char* ass_color;
 extern char* ass_border_color;
+extern char* ass_styles_file;
 
 ass_track_t* ass_default_track();
 int ass_process_subtitle(ass_track_t* track, subtitle* sub);