diff options
-rw-r--r-- | libvo/vo_corevideo.m | 4 | ||||
-rw-r--r-- | libvo/vo_direct3d.c | 2 | ||||
-rw-r--r-- | libvo/vo_gl.c | 2 | ||||
-rw-r--r-- | libvo/vo_gl3.c | 2 | ||||
-rw-r--r-- | mplayer.c | 18 | ||||
-rw-r--r-- | sub/sub.c | 28 | ||||
-rw-r--r-- | sub/sub.h | 3 |
7 files changed, 30 insertions, 29 deletions
diff --git a/libvo/vo_corevideo.m b/libvo/vo_corevideo.m index 5f5f3a0705..6e7699ef82 100644 --- a/libvo/vo_corevideo.m +++ b/libvo/vo_corevideo.m @@ -99,7 +99,7 @@ static void resize(struct vo *vo, int width, int height) gl->MatrixMode(GL_MODELVIEW); gl->LoadIdentity(); - vo_osd_changed(OSDTYPE_OSD); + vo_osd_resized(); gl->Clear(GL_COLOR_BUFFER_BIT); vo->want_redraw = true; @@ -232,7 +232,7 @@ static void draw_osd(struct vo *vo, struct osd_state *osd_s) struct osd_p *osd = p->osd; GL *gl = p->mpglctx->gl; - if (vo_osd_changed(0)) { + if (vo_osd_has_changed()) { clearOSD(vo); osd_draw_text_ext(osd_s, vo->dwidth, vo->dheight, 0, 0, 0, 0, p->image_width, p->image_height, create_osd_texture, diff --git a/libvo/vo_direct3d.c b/libvo/vo_direct3d.c index 872fdd376d..9a4f6e1e04 100644 --- a/libvo/vo_direct3d.c +++ b/libvo/vo_direct3d.c @@ -1991,7 +1991,7 @@ static void draw_osd(struct vo *vo, struct osd_state *osd) if (!priv->d3d_device) return; - if (vo_osd_changed(0)) { + if (vo_osd_has_changed()) { struct draw_osd_closure ctx = { priv }; /* clear the OSD */ diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c index 4d98856ea9..d9c0a2dda5 100644 --- a/libvo/vo_gl.c +++ b/libvo/vo_gl.c @@ -785,7 +785,7 @@ static void draw_osd(struct vo *vo, struct osd_state *osd) if (!p->use_osd) return; - if (vo_osd_changed(0)) { + if (vo_osd_has_changed(osd)) { int osd_h, osd_w; clearOSD(vo); osd_w = p->scaled_osd ? p->image_width : vo->dwidth; diff --git a/libvo/vo_gl3.c b/libvo/vo_gl3.c index b61c7847ad..c3b09db695 100644 --- a/libvo/vo_gl3.c +++ b/libvo/vo_gl3.c @@ -1439,7 +1439,7 @@ static void draw_osd(struct vo *vo, struct osd_state *osd) struct gl_priv *p = vo->priv; GL *gl = p->gl; - if (vo_osd_changed(0)) { + if (vo_osd_has_changed(osd)) { clear_osd(p); osd_draw_text_ext(osd, vo->dwidth, vo->dheight, p->border_x, p->border_y, p->border_x, @@ -1457,10 +1457,7 @@ static void update_osd_msg(struct MPContext *mpctx) // Look if we have a msg if ((msg = get_osd_msg(mpctx))) { if (mpctx->sh_video && opts->term_osd != 1) { - if (strcmp(osd->osd_text, msg->msg)) { - osd_set_text(osd, msg->msg); - vo_osd_changed(OSDTYPE_OSD); - } + osd_set_text(osd, msg->msg); } else if (opts->term_osd) { if (strcmp(mpctx->terminal_osd_text, msg->msg)) { talloc_free(mpctx->terminal_osd_text); @@ -1480,10 +1477,7 @@ static void update_osd_msg(struct MPContext *mpctx) if (opts->osd_level >= 2) sadd_osd_status(text, len, mpctx, opts->osd_level == 3); - if (strcmp(osd->osd_text, text)) { - osd_set_text(osd, text); - vo_osd_changed(OSDTYPE_OSD); - } + osd_set_text(osd, text); return; } @@ -3349,16 +3343,14 @@ static void run_playloop(struct MPContext *mpctx) if (sleeptime > 0) { if (!mpctx->sh_video) goto novideo; - int hack = vo_osd_changed(0); - vo_osd_changed(hack); - if (hack || mpctx->video_out->want_redraw) { + if (vo_osd_has_changed(mpctx->osd) || mpctx->video_out->want_redraw) + { if (redraw_osd(mpctx) < 0) { if (mpctx->paused && video_left) add_step_frame(mpctx); else goto novideo; - } else - vo_osd_changed(0); + } } else { novideo: mp_input_get_cmd(mpctx->input, sleeptime * 1000, true); @@ -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() @@ -170,7 +170,8 @@ void osd_draw_text_ext(struct osd_state *osd, int dxs, int dys, struct osd_state *osd_create(struct MPOpts *opts, struct ass_library *asslib); void osd_set_text(struct osd_state *osd, const char *text); int osd_update(struct osd_state *osd, int dxs, int dys); -int vo_osd_changed(int new_value); +void vo_osd_changed(int new_value); +bool vo_osd_has_changed(struct osd_state *osd); void vo_osd_resized(void); int vo_osd_check_range_update(int,int,int,int); void osd_free(struct osd_state *osd); |