summaryrefslogtreecommitdiffstats
path: root/sub/osd_libass.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2017-01-26 18:24:53 +0100
committerwm4 <wm4@nowhere>2017-01-26 18:24:53 +0100
commitabc6d130ace804bfa333955ff2cd402d927959c6 (patch)
tree1b7aba8831e99e438855f776bfa412e3b3e5d7bf /sub/osd_libass.c
parent60452f640fd405133ebf6f7ba773b0e25071fcf1 (diff)
downloadmpv-abc6d130ace804bfa333955ff2cd402d927959c6.tar.bz2
mpv-abc6d130ace804bfa333955ff2cd402d927959c6.tar.xz
command: shorten long playlists on OSD
A hacky, convoluted, half-working mess that attempts to cut off overlong playlists. It does so by relying on the ASS formatting rule that the font size is specified in the virtual PlayResY resolution. This means we can (normally) easily tell how many lines fit on the screen. On the other hand, this does not work if the text is wrapped. This as a kludge until a Betterâ„¢ solution is available.
Diffstat (limited to 'sub/osd_libass.c')
-rw-r--r--sub/osd_libass.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/sub/osd_libass.c b/sub/osd_libass.c
index 454d0387a4..44fcf6d269 100644
--- a/sub/osd_libass.c
+++ b/sub/osd_libass.c
@@ -219,13 +219,10 @@ static ASS_Event *add_osd_ass_event_escaped(ASS_Track *track, const char *style,
return e;
}
-static void update_osd_text(struct osd_state *osd, struct osd_object *obj)
+static ASS_Style *prepare_osd_ass(struct osd_state *osd, struct osd_object *obj)
{
struct MPOpts *opts = osd->opts;
- if (!obj->text[0])
- return;
-
create_ass_track(osd, obj, &obj->ass, 0, 0);
struct osd_style_opts font = *opts->osd_style;
@@ -236,10 +233,31 @@ static void update_osd_text(struct osd_state *osd, struct osd_object *obj)
if (!opts->osd_scale_by_window)
playresy *= 720.0 / obj->vo_res.h;
- mp_ass_set_style(get_style(&obj->ass, "OSD"), playresy, &font);
+ ASS_Style *style = get_style(&obj->ass, "OSD");
+ mp_ass_set_style(style, playresy, &font);
+ return style;
+}
+
+static void update_osd_text(struct osd_state *osd, struct osd_object *obj)
+{
+
+ if (!obj->text[0])
+ return;
+
+ prepare_osd_ass(osd, obj);
add_osd_ass_event_escaped(obj->ass.track, "OSD", obj->text);
}
+void osd_get_text_size(struct osd_state *osd, int *out_screen_h, int *out_font_h)
+{
+ pthread_mutex_lock(&osd->lock);
+ struct osd_object *obj = osd->objs[OSDTYPE_OSD];
+ ASS_Style *style = prepare_osd_ass(osd, obj);
+ *out_screen_h = obj->ass.track->PlayResY - style->MarginV;
+ *out_font_h = style->FontSize;
+ pthread_mutex_unlock(&osd->lock);
+}
+
// align: -1 .. +1
// frame: size of the containing area
// obj: size of the object that should be positioned inside the area