Mercurial > mplayer.hg
changeset 8202:a90ecaca3989
This patch fixes the OSD flickering problem with vo_dfbmga.
Ville Syrj¸«£l¸«£ <syrjala@sci.fi>
author | arpi |
---|---|
date | Sat, 16 Nov 2002 03:02:23 +0000 |
parents | 31bda85aeb11 |
children | 3af4919d9c5f |
files | libvo/vo_dfbmga.c |
diffstat | 1 files changed, 23 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/libvo/vo_dfbmga.c Sat Nov 16 02:54:26 2002 +0000 +++ b/libvo/vo_dfbmga.c Sat Nov 16 03:02:23 2002 +0000 @@ -105,6 +105,8 @@ static int use_spic = 1; static int osd_changed; +static int osd_dirty; +static int osd_current; /****************************** * vo_directfb * @@ -436,6 +438,9 @@ if (use_spic) spic->SetOpacity( spic, 0xFF ); + osd_dirty = 0; + osd_current = 1; + return 0; } @@ -497,8 +502,17 @@ void *dst; int pitch; - if (use_spic && !osd_changed) - return; + if (use_spic) { + if (!osd_changed) + return; + osd_dirty |= osd_current; + } else if (use_crtc2) { + if (x0 < drect.x || + y0 < drect.y || + x0 + w > drect.x + drect.w || + y0 + h > drect.y + drect.h) + osd_dirty |= osd_current; + } if (subframe->Lock( subframe, DSLF_WRITE, &dst, &pitch ) != DFB_OK) return; @@ -608,7 +622,7 @@ osd_changed = vo_osd_changed( 0 ); - if (osd_changed) { + if (osd_dirty & osd_current) { if (use_spic) { subframe->Clear( subframe, 0, 0, 0, 0 ); } else if (use_crtc2) { @@ -627,6 +641,7 @@ drect.x + drect.w, drect.y, drect.x, drect.h ); } + osd_dirty &= ~osd_current; } if (use_crtc2) { @@ -644,8 +659,10 @@ vo_draw_text( sub_width, sub_height, draw_alpha ); - if (use_spic) + if (use_spic && osd_changed) { subframe->Flip( subframe, NULL, 0 ); + osd_current ^= 3; + } } static void @@ -657,6 +674,8 @@ } else { /* Flip CRTC2 */ c2frame->Flip( c2frame, NULL, vo_vsync ? DSFLIP_WAITFORSYNC : 0 ); + if (!use_spic) + osd_current ^= 3; } current_buf = 0;