diff options
author | wm4 <wm4@nowhere> | 2012-09-29 22:24:01 +0200 |
---|---|---|
committer | Grigori Goronzy <greg@blackbox> | 2012-10-01 15:41:13 +0200 |
commit | 0594b9fcb5952448dee7eaa3646f7b1281ae8f80 (patch) | |
tree | 8f57557cdb6dacee13a490ca6282ac6db8d34902 /libass | |
parent | 758b15ecd437137bb9e794884fa8483430a0fee6 (diff) | |
download | libass-0594b9fcb5952448dee7eaa3646f7b1281ae8f80.tar.bz2 libass-0594b9fcb5952448dee7eaa3646f7b1281ae8f80.tar.xz |
Add ass_set_line_position() API function for subtitle position
This allows users to change the vertical position of normal subtitles.
MPlayer has such a feature as -sub-pos option using its internal
subtitle renderer.
Bump LIBASS_VERSION to indicate the API addition.
Diffstat (limited to 'libass')
-rw-r--r-- | libass/ass.h | 10 | ||||
-rw-r--r-- | libass/ass_render.c | 15 | ||||
-rw-r--r-- | libass/ass_render.h | 1 | ||||
-rw-r--r-- | libass/ass_render_api.c | 8 | ||||
-rw-r--r-- | libass/libass.sym | 1 |
5 files changed, 31 insertions, 4 deletions
diff --git a/libass/ass.h b/libass/ass.h index 5aef92e3..2d767f72 100644 --- a/libass/ass.h +++ b/libass/ass.h @@ -23,7 +23,7 @@ #include <stdarg.h> #include "ass_types.h" -#define LIBASS_VERSION 0x01000000 +#define LIBASS_VERSION 0x01010000 /* * A linked list of images produced by an ass renderer. @@ -214,6 +214,14 @@ void ass_set_hinting(ASS_Renderer *priv, ASS_Hinting ht); void ass_set_line_spacing(ASS_Renderer *priv, double line_spacing); /** + * \brief Set vertical line position. + * \param priv renderer handle + * \param line_position vertical line position of subtitles in percent + * (0-100: 0 = on the bottom (default), 100 = on top) + */ +void ass_set_line_position(ASS_Renderer *priv, double line_position); + +/** * \brief Set font lookup defaults. * \param default_font path to default font to use. Must be supplied if * fontconfig is disabled or unavailable. diff --git a/libass/ass_render.c b/libass/ass_render.c index c7ebef59..f8b7987d 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -2032,16 +2032,25 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event, y2scr(render_priv, render_priv->track->PlayResY / 2.0); device_y = scr_y - (bbox.yMax + bbox.yMin) / 2.0; } else { // subtitle - double scr_y; + double scr_top, scr_bottom, scr_y0; if (valign != VALIGN_SUB) ass_msg(render_priv->library, MSGL_V, "Invalid valign, assuming 0 (subtitle)"); - scr_y = + scr_bottom = y2scr_sub(render_priv, render_priv->track->PlayResY - MarginV); - device_y = scr_y; + scr_top = y2scr_top(render_priv, 0); //xxx not always 0? + device_y = scr_bottom + (scr_top - scr_bottom) * + render_priv->settings.line_position / 100.0; device_y -= text_info->height; device_y += text_info->lines[0].asc; + // clip to top to avoid confusion if line_position is very high, + // turning the subtitle into a toptitle + // also, don't change behavior if line_position is not used + scr_y0 = scr_top + text_info->lines[0].asc; + if (device_y < scr_y0 && render_priv->settings.line_position > 0) { + device_y = scr_y0; + } } } else if (render_priv->state.evt_type == EVENT_VSCROLL) { if (render_priv->state.scroll_direction == SCROLL_TB) diff --git a/libass/ass_render.h b/libass/ass_render.h index ad72a740..d0d9aa38 100644 --- a/libass/ass_render.h +++ b/libass/ass_render.h @@ -67,6 +67,7 @@ typedef struct { int frame_height; double font_size_coeff; // font size multiplier double line_spacing; // additional line spacing (in frame pixels) + double line_position; // vertical position for subtitles, 0-100 (0 = no change) int top_margin; // height of top margin. Everything except toptitles is shifted down by top_margin. int bottom_margin; // height of bottom margin. (frame_height - top_margin - bottom_margin) is original video height. int left_margin; diff --git a/libass/ass_render_api.c b/libass/ass_render_api.c index 8bf9e5db..e70e5ed1 100644 --- a/libass/ass_render_api.c +++ b/libass/ass_render_api.c @@ -116,6 +116,14 @@ void ass_set_line_spacing(ASS_Renderer *priv, double line_spacing) priv->settings.line_spacing = line_spacing; } +void ass_set_line_position(ASS_Renderer *priv, double line_position) +{ + if (priv->settings.line_position != line_position) { + priv->settings.line_position = line_position; + ass_reconfigure(priv); + } +} + void ass_set_fonts(ASS_Renderer *priv, const char *default_font, const char *default_family, int fc, const char *config, int update) diff --git a/libass/libass.sym b/libass/libass.sym index f8fa1458..32fd94fd 100644 --- a/libass/libass.sym +++ b/libass/libass.sym @@ -35,3 +35,4 @@ ass_fonts_update ass_set_cache_limits ass_flush_events ass_set_shaper +ass_set_line_position |