From 0594b9fcb5952448dee7eaa3646f7b1281ae8f80 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sat, 29 Sep 2012 22:24:01 +0200 Subject: 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. --- configure.ac | 2 +- libass/ass.h | 10 +++++++++- libass/ass_render.c | 15 ++++++++++++--- libass/ass_render.h | 1 + libass/ass_render_api.c | 8 ++++++++ libass/libass.sym | 1 + 6 files changed, 32 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index 35548c6..a9f9071 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT(libass, 0.10.0) +AC_INIT(libass, 0.10.1) AM_INIT_AUTOMAKE AC_CONFIG_MACRO_DIR([m4]) # Disable C++/Fortran checks diff --git a/libass/ass.h b/libass/ass.h index 5aef92e..2d767f7 100644 --- a/libass/ass.h +++ b/libass/ass.h @@ -23,7 +23,7 @@ #include #include "ass_types.h" -#define LIBASS_VERSION 0x01000000 +#define LIBASS_VERSION 0x01010000 /* * A linked list of images produced by an ass renderer. @@ -213,6 +213,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 diff --git a/libass/ass_render.c b/libass/ass_render.c index c7ebef5..f8b7987 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 ad72a74..d0d9aa3 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 8bf9e5d..e70e5ed 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 f8fa145..32fd94f 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 -- cgit v1.2.3