diff options
author | Oleg Oshmyan <chortos@inbox.lv> | 2014-05-29 23:10:30 +0100 |
---|---|---|
committer | Oleg Oshmyan <chortos@inbox.lv> | 2014-06-06 15:10:06 +0100 |
commit | 3199a876dd5da0463fd6c6c231db7c3bb223c2ef (patch) | |
tree | dd585ffd1b6fa1edacc3983a11790487575a1318 /libass/ass_render.c | |
parent | 0908a56be261915f9155e771bca6593645418da8 (diff) | |
download | libass-3199a876dd5da0463fd6c6c231db7c3bb223c2ef.tar.bz2 libass-3199a876dd5da0463fd6c6c231db7c3bb223c2ef.tar.xz |
Require closing '}' for override tags
Like VSFilter. '{' without a following '}' is just text, though
in vector drawing mode it still delimits individual drawings.
This also lets us nicely avoid '\0' hacks
in the \t override tag handler in parse_tag.
Diffstat (limited to 'libass/ass_render.c')
-rw-r--r-- | libass/ass_render.c | 25 |
1 files changed, 10 insertions, 15 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c index 625a77d..89c914c 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -1888,7 +1888,7 @@ static int ass_render_event(ASS_Renderer *render_priv, ASS_Event *event, EventImages *event_images) { - char *p; + char *p, *tag_end; FT_Vector pen; unsigned code; DBBox bbox; @@ -1916,8 +1916,7 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event, drawing = render_priv->state.drawing; text_info->length = 0; p = event->Text; - - int in_tag = 0; + tag_end = NULL; // Event parsing. while (1) { @@ -1925,9 +1924,8 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event, // this affects render_context do { code = 0; - if (!in_tag && *p == '{') { // '\0' goes here - p++; - in_tag = 1; + if (!tag_end && *p == '{') { + tag_end = strchr(p, '}'); if (drawing->i) { // A drawing definition has just ended. // Exit and create the drawing now lest we @@ -1937,15 +1935,12 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event, break; } } - if (in_tag) { - p = parse_tag(render_priv, p, 1.); - if (*p == '}') { // end of tag - p++; - in_tag = 0; - } else if (*p != '\\') { - ass_msg(render_priv->library, MSGL_V, - "Unable to parse: '%.30s'", p); - } + if (tag_end) { + while (p < tag_end) + p = parse_tag(render_priv, p, tag_end, 1.); + assert(*p == '}'); + p++; + tag_end = NULL; } else { code = get_next_char(render_priv, &p); if (code && render_priv->state.drawing_scale) { |