1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-25 00:02:13 +00:00

vo_xv: avoid clearing too much on resize

vo_xv set the "use_fs" parameter to vo_x11_clearwindow_part(). This
meant it always used the whole screen size to calculate the area to
clear. I can't see why overriding the vo->dwidth/dheight values would
ever be the right thing to do (if in fullscreen they should be set to
match that), so remove the use_fs parameter and always use the
dwidth/dheight values in the function. Also delete code drawing back
borders in vo_xv_draw colorkey. That should already happen in
vo_x11_clearwindow_part(); if it doesn't then things need to be fixed
anyway because colorkey code only ran in fullscreen mode (but borders
must work in window mode too).
This commit is contained in:
Uoti Urpala 2011-07-06 08:24:20 +03:00
parent 9298acdd60
commit aeafa7a2b4
4 changed files with 6 additions and 32 deletions

View File

@ -103,7 +103,7 @@ static void check_events(void)
vo_x11_clearwindow(mDisplay, vo_window);
else if (ret & VO_EVENT_EXPOSE)
vo_x11_clearwindow_part(mDisplay, vo_window, myximage->width,
myximage->height, 0);
myximage->height);
if (ret & VO_EVENT_EXPOSE && int_pause)
flip_page();
}

View File

@ -187,7 +187,7 @@ static void resize(struct vo *vo)
calc_src_dst_rects(vo, ctx->image_width, ctx->image_height, &ctx->src_rect,
&ctx->dst_rect, NULL, NULL);
struct vo_rect *dst = &ctx->dst_rect;
vo_x11_clearwindow_part(vo, vo->x11->window, dst->width, dst->height, 1);
vo_x11_clearwindow_part(vo, vo->x11->window, dst->width, dst->height);
vo_xv_draw_colorkey(vo, dst->left, dst->top, dst->width, dst->height);
}

View File

@ -1129,18 +1129,17 @@ final:
}
void vo_x11_clearwindow_part(struct vo *vo, Window vo_window,
int img_width, int img_height, int use_fs)
int img_width, int img_height)
{
struct vo_x11_state *x11 = vo->x11;
struct MPOpts *opts = vo->opts;
Display *mDisplay = vo->x11->display;
int u_dheight, u_dwidth, left_ov, left_ov2;
if (x11->f_gc == None)
return;
u_dheight = use_fs ? opts->vo_screenheight : vo->dheight;
u_dwidth = use_fs ? opts->vo_screenwidth : vo->dwidth;
u_dheight = vo->dheight;
u_dwidth = vo->dwidth;
if ((u_dheight <= img_height) && (u_dwidth <= img_width))
return;
@ -2302,7 +2301,6 @@ int vo_xv_init_colorkey(struct vo *vo)
void vo_xv_draw_colorkey(struct vo *vo, int32_t x, int32_t y,
int32_t w, int32_t h)
{
struct MPOpts *opts = vo->opts;
struct vo_x11_state *x11 = vo->x11;
if( x11->xv_ck_info.method == CK_METHOD_MANUALFILL ||
x11->xv_ck_info.method == CK_METHOD_BACKGROUND )//less tearing than XClearWindow()
@ -2312,30 +2310,6 @@ void vo_xv_draw_colorkey(struct vo *vo, int32_t x, int32_t y,
x, y,
w, h );
}
/* draw black bars if needed */
/* TODO! move this to vo_x11_clearwindow_part() */
if ( vo_fs )
{
XSetForeground(x11->display, x11->vo_gc, 0 );
/* making non-overlap fills, requires 8 checks instead of 4 */
if ( y > 0 )
XFillRectangle(x11->display, x11->window, x11->vo_gc,
0, 0,
opts->vo_screenwidth, y);
if (x > 0)
XFillRectangle(x11->display, x11->window, x11->vo_gc,
0, 0,
x, opts->vo_screenheight);
if (x + w < opts->vo_screenwidth)
XFillRectangle(x11->display, x11->window, x11->vo_gc,
x + w, 0,
opts->vo_screenwidth, opts->vo_screenheight);
if (y + h < opts->vo_screenheight)
XFillRectangle(x11->display, x11->window, x11->vo_gc,
0, y + h,
opts->vo_screenwidth, opts->vo_screenheight);
}
}
/** \brief Tests if a valid argument for the ck suboption was given. */

View File

@ -137,7 +137,7 @@ void vo_x11_create_vo_window(struct vo *vo, XVisualInfo *vis,
int x, int y, unsigned int width, unsigned int height, int flags,
Colormap col_map, const char *classname, const char *title);
void vo_x11_clearwindow_part(struct vo *vo, Window vo_window,
int img_width, int img_height, int use_fs);
int img_width, int img_height);
void vo_x11_clearwindow(struct vo *vo, Window vo_window);
void vo_x11_ontop(struct vo *vo);
void vo_x11_border(struct vo *vo);