diff options
Diffstat (limited to 'sub')
-rw-r--r-- | sub/osd_libass.c | 48 | ||||
-rw-r--r-- | sub/osd_state.h | 1 |
2 files changed, 30 insertions, 19 deletions
diff --git a/sub/osd_libass.c b/sub/osd_libass.c index 44fcf6d269..046007d66b 100644 --- a/sub/osd_libass.c +++ b/sub/osd_libass.c @@ -96,34 +96,40 @@ void osd_destroy_backend(struct osd_state *osd) } } -static void create_ass_track(struct osd_state *osd, struct osd_object *obj, - struct ass_state *ass, int res_x, int res_y) +static void update_playres(struct ass_state *ass, struct mp_osd_res *vo_res) { - create_ass_renderer(osd, ass); - ASS_Track *track = ass->track; - if (!track) - track = ass_new_track(ass->library); - int old_res_x = track->PlayResX; int old_res_y = track->PlayResY; - double aspect = 1.0 * obj->vo_res.w / FFMAX(obj->vo_res.h, 1) / - obj->vo_res.display_par; + double aspect = 1.0 * vo_res->w / MPMAX(vo_res->h, 1); + if (vo_res->display_par > 0) + aspect = aspect / vo_res->display_par; - track->track_type = TRACK_TYPE_ASS; - track->Timer = 100.; - track->PlayResY = res_y ? res_y : MP_ASS_FONT_PLAYRESY; - track->PlayResX = res_x ? res_x : track->PlayResY * aspect; - track->WrapStyle = 1; // end-of-line wrapping instead of smart wrapping - track->Kerning = true; + track->PlayResY = ass->res_y ? ass->res_y : MP_ASS_FONT_PLAYRESY; + track->PlayResX = ass->res_x ? ass->res_x : track->PlayResY * aspect; // Force libass to clear its internal cache - it doesn't check for // PlayRes changes itself. if (old_res_x != track->PlayResX || old_res_y != track->PlayResY) ass_set_frame_size(ass->render, 1, 1); +} - ass->track = track; +static void create_ass_track(struct osd_state *osd, struct osd_object *obj, + struct ass_state *ass) +{ + create_ass_renderer(osd, ass); + + ASS_Track *track = ass->track; + if (!track) + track = ass->track = ass_new_track(ass->library); + + track->track_type = TRACK_TYPE_ASS; + track->Timer = 100.; + track->WrapStyle = 1; // end-of-line wrapping instead of smart wrapping + track->Kerning = true; + + update_playres(ass, &obj->vo_res); } static int find_style(ASS_Track *track, const char *name, int def) @@ -223,7 +229,7 @@ static ASS_Style *prepare_osd_ass(struct osd_state *osd, struct osd_object *obj) { struct MPOpts *opts = osd->opts; - create_ass_track(osd, obj, &obj->ass, 0, 0); + create_ass_track(osd, obj, &obj->ass); struct osd_style_opts font = *opts->osd_style; font.font_size *= opts->osd_scale; @@ -338,7 +344,7 @@ static void get_osd_bar_box(struct osd_state *osd, struct osd_object *obj, { struct MPOpts *opts = osd->opts; - create_ass_track(osd, obj, &obj->ass, 0, 0); + create_ass_track(osd, obj, &obj->ass); ASS_Track *track = obj->ass.track; ASS_Style *style = get_style(&obj->ass, "progbar"); @@ -461,7 +467,9 @@ static void update_external(struct osd_state *osd, struct osd_object *obj, bstr t = bstr0(ext->text); if (!t.len) return; - create_ass_track(osd, obj, &ext->ass, ext->res_x, ext->res_y); + ext->ass.res_x = ext->res_x; + ext->ass.res_y = ext->res_y; + create_ass_track(osd, obj, &ext->ass); clear_ass(&ext->ass); @@ -537,6 +545,8 @@ static void append_ass(struct ass_state *ass, struct mp_osd_res *res, return; } + update_playres(ass, res); + ass_set_frame_size(ass->render, res->w, res->h); ass_set_aspect_ratio(ass->render, res->display_par, 1.0); diff --git a/sub/osd_state.h b/sub/osd_state.h index dc2d6d5b6c..5cb0f1e07c 100644 --- a/sub/osd_state.h +++ b/sub/osd_state.h @@ -22,6 +22,7 @@ struct ass_state { struct ass_track *track; struct ass_renderer *render; struct ass_library *library; + int res_x, res_y; }; struct osd_object { |