summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-09-29 22:24:01 +0200
committerGrigori Goronzy <greg@blackbox>2012-10-01 15:41:13 +0200
commit0594b9fcb5952448dee7eaa3646f7b1281ae8f80 (patch)
tree8f57557cdb6dacee13a490ca6282ac6db8d34902
parent758b15ecd437137bb9e794884fa8483430a0fee6 (diff)
downloadlibass-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.
-rw-r--r--configure.ac2
-rw-r--r--libass/ass.h10
-rw-r--r--libass/ass_render.c15
-rw-r--r--libass/ass_render.h1
-rw-r--r--libass/ass_render_api.c8
-rw-r--r--libass/libass.sym1
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 <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 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