diff options
Diffstat (limited to 'video')
-rw-r--r-- | video/out/opengl/osd.c | 32 | ||||
-rw-r--r-- | video/out/opengl/osd.h | 1 | ||||
-rw-r--r-- | video/out/opengl/video.c | 2 |
3 files changed, 25 insertions, 10 deletions
diff --git a/video/out/opengl/osd.c b/video/out/opengl/osd.c index 215c83cbe7..c554425e0f 100644 --- a/video/out/opengl/osd.c +++ b/video/out/opengl/osd.c @@ -92,7 +92,7 @@ struct mpgl_osd { int64_t change_counter; // temporary int stereo_mode; - int display_size[2]; + struct mp_osd_res osd_res; void *scratch; }; @@ -382,8 +382,8 @@ void mpgl_osd_draw_part(struct mpgl_osd *ctx, int vp_w, int vp_h, int index) struct gl_transform t; gl_transform_ortho(&t, 0, vp_w, 0, vp_h); - float a_x = ctx->display_size[0] * x; - float a_y = ctx->display_size[1] * y; + float a_x = ctx->osd_res.w * x; + float a_y = ctx->osd_res.h * y; t.t[0] += a_x * t.m[0][0] + a_y * t.m[1][0]; t.t[1] += a_x * t.m[0][1] + a_y * t.m[1][1]; @@ -403,20 +403,25 @@ struct gl_vao *mpgl_osd_get_vao(struct mpgl_osd *ctx) return &ctx->vao; } +static void set_res(struct mpgl_osd *ctx, struct mp_osd_res res, int stereo_mode) +{ + int div[2]; + get_3d_side_by_side(stereo_mode, div); + + res.w /= div[0]; + res.h /= div[1]; + ctx->osd_res = res; +} + void mpgl_osd_generate(struct mpgl_osd *ctx, struct mp_osd_res res, double pts, int stereo_mode, int draw_flags) { for (int n = 0; n < MAX_OSD_PARTS; n++) ctx->parts[n]->num_subparts = 0; - int div[2]; - get_3d_side_by_side(stereo_mode, div); - - struct mp_osd_res s_res = res; - ctx->display_size[0] = s_res.w = s_res.w / div[0]; - ctx->display_size[1] = s_res.h = s_res.h / div[1]; + set_res(ctx, res, stereo_mode); - osd_draw(ctx->osd, s_res, pts, draw_flags, ctx->formats, gen_osd_cb, ctx); + osd_draw(ctx->osd, ctx->osd_res, pts, draw_flags, ctx->formats, gen_osd_cb, ctx); ctx->stereo_mode = stereo_mode; // Parts going away does not necessarily result in gen_osd_cb() being called @@ -429,6 +434,13 @@ void mpgl_osd_generate(struct mpgl_osd *ctx, struct mp_osd_res res, double pts, } } +// See osd_resize() for remarks. This function is an optional optimization too. +void mpgl_osd_resize(struct mpgl_osd *ctx, struct mp_osd_res res, int stereo_mode) +{ + set_res(ctx, res, stereo_mode); + osd_resize(ctx->osd, ctx->osd_res); +} + int64_t mpgl_get_change_counter(struct mpgl_osd *ctx) { return ctx->change_counter; diff --git a/video/out/opengl/osd.h b/video/out/opengl/osd.h index bd47f71764..34cbf2b383 100644 --- a/video/out/opengl/osd.h +++ b/video/out/opengl/osd.h @@ -14,6 +14,7 @@ void mpgl_osd_set_options(struct mpgl_osd *ctx, bool pbo); void mpgl_osd_generate(struct mpgl_osd *ctx, struct mp_osd_res res, double pts, int stereo_mode, int draw_flags); +void mpgl_osd_resize(struct mpgl_osd *ctx, struct mp_osd_res res, int stereo_mode); enum sub_bitmap_format mpgl_osd_get_part_format(struct mpgl_osd *ctx, int index); struct gl_vao *mpgl_osd_get_vao(struct mpgl_osd *ctx); void mpgl_osd_draw_part(struct mpgl_osd *ctx, int vp_w, int vp_h, int index); diff --git a/video/out/opengl/video.c b/video/out/opengl/video.c index 94e728912d..a1e98bef14 100644 --- a/video/out/opengl/video.c +++ b/video/out/opengl/video.c @@ -2448,6 +2448,8 @@ void gl_video_resize(struct gl_video *p, int vp_w, int vp_h, p->vp_h = vp_h; gl_video_reset_surfaces(p); + + mpgl_osd_resize(p->osd, p->osd_rect, p->image_params.stereo_out); } static bool unmap_image(struct gl_video *p, struct mp_image *mpi) |