diff options
-rw-r--r-- | input/input.c | 2 | ||||
-rw-r--r-- | input/input.h | 1 | ||||
-rw-r--r-- | libvo/sub.c | 23 | ||||
-rw-r--r-- | libvo/sub.h | 1 | ||||
-rw-r--r-- | mplayer.c | 17 |
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; @@ -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--; |