mirror of
https://github.com/mpv-player/mpv
synced 2025-01-24 16:43:28 +00:00
7a76b577d8
This is more or less a minimal hack to make _some_ text measurement functionality available to scripts. Since libass does not support such a thing, this simply uses the bounding box of the rendered text. This is far from ideal. Problems include: - using a bitmap bounding box - additional memory waste and/or flushing caches - dependency on window size - odd small deviations with different window sizes (run osd-test.lua and resize the window after each timer update; the bounding boxes aren't adjusted in an overly useful way) - inability to query the size _after_ actual rendering But I guess it's a start. Since I'm aware that it's crap, add a threat to the manpage that this may be changed/removed again. For now, I'm interested whether anyone will have use for it in its current form, as it's an often requested feature.
91 lines
1.8 KiB
C
91 lines
1.8 KiB
C
#ifndef MP_OSD_STATE_H_
|
|
#define MP_OSD_STATE_H_
|
|
|
|
#include <pthread.h>
|
|
|
|
#include "osd.h"
|
|
|
|
enum mp_osdtype {
|
|
OSDTYPE_SUB,
|
|
OSDTYPE_SUB2, // IDs must be numerically successive
|
|
|
|
OSDTYPE_OSD,
|
|
|
|
OSDTYPE_EXTERNAL,
|
|
OSDTYPE_EXTERNAL2,
|
|
|
|
OSDTYPE_COUNT
|
|
};
|
|
|
|
struct ass_state {
|
|
struct mp_log *log;
|
|
struct ass_track *track;
|
|
struct ass_renderer *render;
|
|
struct ass_library *library;
|
|
int res_x, res_y;
|
|
bool changed;
|
|
struct mp_osd_res vo_res; // last known value
|
|
};
|
|
|
|
struct osd_object {
|
|
int type; // OSDTYPE_*
|
|
bool is_sub;
|
|
|
|
// OSDTYPE_OSD
|
|
bool osd_changed;
|
|
char *text;
|
|
struct osd_progbar_state progbar_state;
|
|
|
|
// OSDTYPE_SUB/OSDTYPE_SUB2
|
|
struct dec_sub *sub;
|
|
|
|
// OSDTYPE_EXTERNAL
|
|
struct osd_external **externals;
|
|
int num_externals;
|
|
|
|
// OSDTYPE_EXTERNAL2
|
|
struct sub_bitmaps *external2;
|
|
|
|
// VO cache state
|
|
int vo_change_id;
|
|
struct mp_osd_res vo_res;
|
|
|
|
// Internally used by osd_libass.c
|
|
bool changed;
|
|
struct ass_state ass;
|
|
struct mp_ass_packer *ass_packer;
|
|
struct ass_image **ass_imgs;
|
|
};
|
|
|
|
struct osd_external {
|
|
struct osd_external_ass ov;
|
|
struct ass_state ass;
|
|
};
|
|
|
|
struct osd_state {
|
|
pthread_mutex_t lock;
|
|
|
|
struct osd_object *objs[MAX_OSD_PARTS];
|
|
|
|
bool render_subs_in_filter;
|
|
double force_video_pts;
|
|
|
|
bool want_redraw;
|
|
bool want_redraw_notification;
|
|
|
|
struct m_config_cache *opts_cache;
|
|
struct mp_osd_render_opts *opts;
|
|
struct mpv_global *global;
|
|
struct mp_log *log;
|
|
|
|
struct mp_draw_sub_cache *draw_cache;
|
|
};
|
|
|
|
// defined in osd_libass.c and osd_dummy.c
|
|
void osd_object_get_bitmaps(struct osd_state *osd, struct osd_object *obj,
|
|
int format, struct sub_bitmaps *out_imgs);
|
|
void osd_init_backend(struct osd_state *osd);
|
|
void osd_destroy_backend(struct osd_state *osd);
|
|
|
|
#endif
|