Mercurial > mplayer.hg
diff libass/ass_parse.c @ 35262:49fc594fda43
Updated libass to 0.10.1
This closes #2099
author | SubJunk |
---|---|
date | Tue, 06 Nov 2012 05:41:14 +0000 |
parents | 6e7f60f6f9d4 |
children | c7866af24567 |
line wrap: on
line diff
--- a/libass/ass_parse.c Mon Nov 05 21:41:39 2012 +0000 +++ b/libass/ass_parse.c Tue Nov 06 05:41:14 2012 +0000 @@ -105,28 +105,36 @@ } /** - * \brief Change border width - * negative value resets border to style value + * \brief Calculate valid border size. Makes sure the border sizes make sense. + * + * \param priv renderer state object + * \param border_x requested x border size + * \param border_y requested y border size */ -void change_border(ASS_Renderer *render_priv, double border_x, - double border_y) +void calc_border(ASS_Renderer *priv, double border_x, double border_y) { - int bord; - if (!render_priv->state.font) - return; - if (border_x < 0 && border_y < 0) { - if (render_priv->state.style->BorderStyle == 1 || - render_priv->state.style->BorderStyle == 3) - border_x = border_y = render_priv->state.style->Outline; + if (priv->state.border_style == 1 || + priv->state.border_style == 3) + border_x = border_y = priv->state.style->Outline; else border_x = border_y = 1.; } - render_priv->state.border_x = border_x; - render_priv->state.border_y = border_y; + priv->state.border_x = border_x; + priv->state.border_y = border_y; +} - bord = 64 * border_x * render_priv->border_scale; +/** + * \brief Change border width + * + * \param render_priv renderer state object + * \param info glyph state object + */ +void change_border(ASS_Renderer *render_priv, double border_x, double border_y) +{ + int bord = 64 * border_x * render_priv->border_scale; + if (bord > 0 && border_x == border_y) { if (!render_priv->state.stroker) { int error; @@ -138,11 +146,14 @@ "failed to get stroker"); render_priv->state.stroker = 0; } + render_priv->state.stroker_radius = -1.0; } - if (render_priv->state.stroker) + if (render_priv->state.stroker && render_priv->state.stroker_radius != bord) { FT_Stroker_Set(render_priv->state.stroker, bord, FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0); + render_priv->state.stroker_radius = bord; + } } else { FT_Stroker_Done(render_priv->state.stroker); render_priv->state.stroker = 0; @@ -242,7 +253,7 @@ * \param p string to parse * \param pwr multiplier for some tag effects (comes from \t tags) */ -static char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr) +char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr) { skip_to('\\'); skip('\\'); @@ -256,7 +267,7 @@ val = render_priv->state.border_x * (1 - pwr) + val * pwr; else val = -1.; - change_border(render_priv, val, render_priv->state.border_y); + calc_border(render_priv, val, render_priv->state.border_y); render_priv->state.bm_run_id++; } else if (mystrcmp(&p, "ybord")) { double val; @@ -264,7 +275,8 @@ val = render_priv->state.border_y * (1 - pwr) + val * pwr; else val = -1.; - change_border(render_priv, render_priv->state.border_x, val); + calc_border(render_priv, render_priv->state.border_x, val); + render_priv->state.bm_run_id++; } else if (mystrcmp(&p, "xshad")) { double val; if (mystrtod(&p, &val)) @@ -388,11 +400,10 @@ } else if (mystrcmp(&p, "bord")) { double val; if (mystrtod(&p, &val)) { - if (render_priv->state.border_x == render_priv->state.border_y) val = render_priv->state.border_x * (1 - pwr) + val * pwr; } else val = -1.; // reset to default - change_border(render_priv, val, val); + calc_border(render_priv, val, val); render_priv->state.bm_run_id++; } else if (mystrcmp(&p, "move")) { double x1, x2, y1, y2; @@ -730,7 +741,18 @@ ass_msg(render_priv->library, MSGL_DBG2, "single c/a at %f: %c%c = %X", pwr, n, cmd, render_priv->state.c[cidx]); } else if (mystrcmp(&p, "r")) { - reset_render_context(render_priv); + char *start = p; + char *style; + skip_to('\\'); + if (p > start) { + style = malloc(p - start + 1); + strncpy(style, start, p - start); + style[p - start] = '\0'; + reset_render_context(render_priv, + render_priv->track->styles + lookup_style(render_priv->track, style)); + free(style); + } else + reset_render_context(render_priv, NULL); } else if (mystrcmp(&p, "be")) { int val; if (mystrtoi(&p, &val)) { @@ -977,7 +999,7 @@ /** - * \brief Get next ucs4 char from string, parsing and executing style overrides + * \brief Get next ucs4 char from string, parsing UTF-8 and escapes * \param str string pointer * \return ucs4 code of the next char * On return str points to the unparsed part of the string @@ -986,24 +1008,6 @@ { char *p = *str; unsigned chr; - if (*p == '{') { // '\0' goes here - p++; - while (1) { - p = parse_tag(render_priv, p, 1.); - if (*p == '}') { // end of tag - p++; - if (*p == '{') { - p++; - continue; - } else - break; - } else if (*p != '\\') - ass_msg(render_priv->library, MSGL_V, - "Unable to parse: '%.30s'", p); - if (*p == 0) - break; - } - } if (*p == '\t') { ++p; *str = p;