summaryrefslogtreecommitdiffstats
path: root/sub/sub.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2012-08-01 18:23:28 +0200
committerwm4 <wm4@nowhere>2012-08-01 18:23:28 +0200
commit168293e0ae6f08dd82f0a1e6696c25233e2ce298 (patch)
tree9342a94f4bf94933ee403f697d932c41c08119cb /sub/sub.c
parent59b938c8aa7d903e849748b737d45ccd949ef419 (diff)
downloadmpv-168293e0ae6f08dd82f0a1e6696c25233e2ce298.tar.bz2
mpv-168293e0ae6f08dd82f0a1e6696c25233e2ce298.tar.xz
osd: minor simplification of vo_osd_changed()
vo_osd_changed() was a weird function: it was used both to query and mutate state, which is a bad combination. The VOs used it to query and reset the state, and the mplayer frontend mostly used it to set the state. In some cases, the frontend did both (that code used a variable "int hack" to backup the state and set it again). Simplify it and make the VOs use a vo_osd_has_changed() function to query whether the OSD bitmaps have to be recreated. vo_osd_changed() on the other hand is now used to update state only. The OSD change state is reset when osd_draw_text() is called. Update vo_corevideo.m to use vo_osd_resized() as well (forgotten change from libass-OSD merge). Simplify osd_set_text() and its usages.
Diffstat (limited to 'sub/sub.c')
-rw-r--r--sub/sub.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/sub/sub.c b/sub/sub.c
index 933a53e37d..492c59f7d8 100644
--- a/sub/sub.c
+++ b/sub/sub.c
@@ -332,17 +332,20 @@ struct osd_state *osd_create(struct MPOpts *opts, struct ass_library *asslib)
#endif
new_osd_obj(OSDTYPE_TELETEXT);
osd_font_invalidate();
- osd_set_text(osd, NULL);
+ osd->osd_text = talloc_strdup(osd, "");
osd_init_backend(osd);
return osd;
}
-void osd_set_text(struct osd_state *osd, const char *text) {
- talloc_free(osd->osd_text);
- //osd->text must never be NULL
+void osd_set_text(struct osd_state *osd, const char *text)
+{
if (!text)
text = "";
+ if (strcmp(osd->osd_text, text) == 0)
+ return;
+ talloc_free(osd->osd_text);
osd->osd_text = talloc_strdup(osd, text);
+ vo_osd_changed(OSDTYPE_OSD);
}
void osd_draw_text_ext(struct osd_state *osd, int dxs, int dys,
@@ -390,20 +393,25 @@ void osd_draw_text(struct osd_state *osd, int dxs, int dys,
osd_draw_text_ext(osd, dxs, dys, 0, 0, 0, 0, dxs, dys, draw_alpha, ctx);
}
-static int vo_osd_changed_status = 0;
-
-int vo_osd_changed(int new_value)
+void vo_osd_changed(int new_value)
{
mp_osd_obj_t* obj=vo_osd_list;
- int ret = vo_osd_changed_status;
- vo_osd_changed_status = new_value;
while(obj){
if(obj->type==new_value) obj->flags|=OSDFLAG_FORCE_UPDATE;
obj=obj->next;
}
+}
- return ret;
+bool vo_osd_has_changed(struct osd_state *osd)
+{
+ mp_osd_obj_t* obj = vo_osd_list;
+ while (obj) {
+ if (obj->flags & OSDFLAG_FORCE_UPDATE)
+ return true;
+ obj = obj->next;
+ }
+ return false;
}
void vo_osd_resized()