diff options
author | Grigori Goronzy <greg@blackbox> | 2012-04-21 03:52:54 +0200 |
---|---|---|
committer | Grigori Goronzy <greg@blackbox> | 2012-04-21 03:52:54 +0200 |
commit | f1d3d38dc81cc07b432d93bb2346f3b8c24c920a (patch) | |
tree | 74ce0739c906390d62c868550dbaaaafbe70d8a3 /libass/ass_parse.c | |
parent | 2ba300123f7e6e5b9bbc69976ca4017993af694b (diff) | |
download | libass-f1d3d38dc81cc07b432d93bb2346f3b8c24c920a.tar.bz2 libass-f1d3d38dc81cc07b432d93bb2346f3b8c24c920a.tar.xz |
Refactor and fix border generation
Make sure to update the border appropriately in the second pass, after
parsing.
Diffstat (limited to 'libass/ass_parse.c')
-rw-r--r-- | libass/ass_parse.c | 49 |
1 files changed, 30 insertions, 19 deletions
diff --git a/libass/ass_parse.c b/libass/ass_parse.c index d505dd5c..7f1c8f03 100644 --- a/libass/ass_parse.c +++ b/libass/ass_parse.c @@ -105,28 +105,36 @@ void update_font(ASS_Renderer *render_priv) } /** - * \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.style->BorderStyle == 1 || + priv->state.style->BorderStyle == 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; +} + +/** + * \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; - 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 @@ void change_border(ASS_Renderer *render_priv, double border_x, "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; @@ -256,7 +267,7 @@ static char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr) 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 @@ static char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr) 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 @@ static char *parse_tag(ASS_Renderer *render_priv, char *p, double pwr) } 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; |