summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-12-23 01:37:43 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-12-23 01:37:43 +0000
commit725ff339e7093f11e1da39156cf7266dd6582f09 (patch)
treebdbd9ed7cb6e62dfa5798acfa251efab26d4b8a7
parent38c4cdcfc587804cdb2dbb9f980ded0ca2659978 (diff)
downloadmpv-725ff339e7093f11e1da39156cf7266dd6582f09.tar.bz2
mpv-725ff339e7093f11e1da39156cf7266dd6582f09.tar.xz
This patch adds support for vertical subtitle alignment
control. Possible values are top, center, and bottom, with bottom being the default. Alignment is relevant when it comes to positioning subtitles with one line (or fewer lines) of text relative to multi-line subtitles. It is implemented as a new command (sub_alignment) that without an argument cycles the alignment (between top, center, and bottom), or with an argument sets the alignment (0 for top, 1 for center, 2 for bottom). The key 'i' is bound to this command. patch by Oskar Liljeblad (oskar@osk.mine.nu) git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@8535 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--input/input.c2
-rw-r--r--input/input.h1
-rw-r--r--libvo/sub.c23
-rw-r--r--libvo/sub.h1
-rw-r--r--mplayer.c17
5 files changed, 38 insertions, 6 deletions
diff --git a/input/input.c b/input/input.c
index 3b580bd06b..b6b245a0f1 100644
--- a/input/input.c
+++ b/input/input.c
@@ -69,6 +69,7 @@ static mp_cmd_t mp_cmds[] = {
{ MP_CMD_SATURATION, "saturation",1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
{ MP_CMD_FRAMEDROPPING, "frame_drop",0, { { MP_CMD_ARG_INT,{-1} }, {-1,{0}} } },
{ MP_CMD_SUB_POS, "sub_pos", 1, { {MP_CMD_ARG_INT,{0}}, {MP_CMD_ARG_INT,{0}}, {-1,{0}} } },
+ { MP_CMD_SUB_ALIGNMENT, "sub_alignment",0, { {MP_CMD_ARG_INT,{-1}}, {-1,{0}} } },
{ MP_CMD_SUB_VISIBILITY, "sub_visibility", 0, { {-1,{0}} } },
{ MP_CMD_VOBSUB_LANG, "vobsub_lang", 0, { {-1,{0}} } },
{ MP_CMD_GET_PERCENT_POS, "get_percent_pos", 0, { {-1,{0}} } },
@@ -247,6 +248,7 @@ static mp_cmd_bind_t def_cmd_binds[] = {
{ { 'd', 0 }, "frame_drop" },
{ { 'r', 0 }, "sub_pos -1" },
{ { 't', 0 }, "sub_pos +1" },
+ { { 'i', 0 }, "sub_alignment" },
{ { 'v', 0 }, "sub_visibility" },
{ { 'j', 0 }, "vobsub_lang" },
#ifdef USE_EDL
diff --git a/input/input.h b/input/input.h
index b55aaa40cd..bddb5935a1 100644
--- a/input/input.h
+++ b/input/input.h
@@ -41,6 +41,7 @@
#ifdef USE_EDL
#define MP_CMD_EDL_MARK 38
#endif
+#define MP_CMD_SUB_ALIGNMENT 39
#define MP_CMD_GUI_EVENTS 5000
#define MP_CMD_GUI_LOADFILE 5001
diff --git a/libvo/sub.c b/libvo/sub.c
index 1cec860880..89dae2eefa 100644
--- a/libvo/sub.c
+++ b/libvo/sub.c
@@ -37,6 +37,7 @@ unsigned char* vo_osd_text=NULL;
int sub_unicode=0;
int sub_utf8=0;
int sub_pos=100;
+int sub_alignment=2; /* 0=top, 1=center, 2=bottom */
int sub_visibility=1;
// return the real height of a char:
@@ -418,12 +419,22 @@ inline static void vo_update_text_sub(mp_osd_obj_t* obj,int dxs,int dys){
*sfalco*
*/
if(suboverlap_enabled) obj->y -= vo_font->pic_a[vo_font->font[40]]->h - vo_font->height;
- if (obj->y >= (dys * sub_pos / 100)){
- int old=obj->y;
- obj->y = dys * sub_pos /100;
- obj->bbox.y2-=old-obj->y;
- }
-
+
+ h = dys - obj->y;
+ if (sub_alignment == 2)
+ obj->y = dys * sub_pos / 100 - h;
+ else if (sub_alignment == 1)
+ obj->y = dys * sub_pos / 100 - h / 2;
+ else
+ obj->y = dys * sub_pos / 100;
+
+ if (obj->y < 0)
+ obj->y = 0;
+ if (obj->y > dys - h)
+ obj->y = dys - h;
+
+ obj->bbox.y2 = obj->y + h;
+
// calculate bbox:
obj->bbox.x1=xmin;
obj->bbox.x2=xmax;
diff --git a/libvo/sub.h b/libvo/sub.h
index ead5a131ff..5c904c9e1c 100644
--- a/libvo/sub.h
+++ b/libvo/sub.h
@@ -97,6 +97,7 @@ extern int sub_utf8;
extern char *sub_cp;
#endif
extern int sub_pos;
+extern int sub_alignment;
extern int sub_visibility;
extern int suboverlap_enabled;
diff --git a/mplayer.c b/mplayer.c
index 5a2364a0c0..e516316ec8 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -575,6 +575,7 @@ int osd_show_av_delay = 0;
int osd_show_sub_delay = 0;
int osd_show_sub_pos = 0;
int osd_show_sub_visibility = 0;
+int osd_show_sub_alignment = 0;
int osd_show_vobsub_changed = 0;
int rtc_fd=-1;
@@ -2485,6 +2486,16 @@ if (stream->type==STREAMTYPE_DVDNAV && dvd_nav_still)
vo_osd_changed(OSDTYPE_SUBTITLE);
osd_show_sub_pos = 9;
} break;
+ case MP_CMD_SUB_ALIGNMENT:
+ {
+ if (cmd->nargs >= 1)
+ sub_alignment = cmd->args[0].v.i;
+ else
+ sub_alignment = (sub_alignment+1) % 3;
+ osd_show_sub_alignment = 9;
+ vo_osd_changed(OSDTYPE_SUBTITLE);
+ break;
+ }
case MP_CMD_SUB_VISIBILITY:
{
sub_visibility=1-sub_visibility;
@@ -2920,6 +2931,12 @@ if(rel_seek_secs || abs_seek_pos){
sprintf(osd_text_tmp, "Sub position: %d/100", sub_pos);
osd_show_sub_pos--;
} else
+ if (osd_show_sub_alignment) {
+ sprintf(osd_text_tmp, "Sub alignment: %s",
+ (sub_alignment == 2 ? "bottom" :
+ (sub_alignment == 1 ? "center" : "top")));
+ osd_show_sub_alignment--;
+ } else
if (osd_show_av_delay) {
sprintf(osd_text_tmp, "A-V delay: %d ms",(int)(audio_delay*1000));
osd_show_av_delay--;