From 859b68e23eb526205b907d43a5e00e1983418545 Mon Sep 17 00:00:00 2001 From: Miguel Freitas Date: Thu, 21 Mar 2002 18:29:51 +0000 Subject: adding new parameters to frame_output_cb CVS patchset: 1606 CVS date: 2002/03/21 18:29:51 --- src/video_out/video_out_syncfb.c | 20 +++++++++++++------- src/video_out/video_out_x11.h | 8 ++++++-- src/video_out/video_out_xshm.c | 41 ++++++++++++++++++++++++++-------------- src/video_out/video_out_xv.c | 22 +++++++++++++-------- 4 files changed, 60 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/video_out/video_out_syncfb.c b/src/video_out/video_out_syncfb.c index 79505c8a5..50241f6d2 100644 --- a/src/video_out/video_out_syncfb.c +++ b/src/video_out/video_out_syncfb.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: video_out_syncfb.c,v 1.57 2002/03/21 16:21:01 miguelfreitas Exp $ + * $Id: video_out_syncfb.c,v 1.58 2002/03/21 18:29:51 miguelfreitas Exp $ * * video_out_syncfb.c, SyncFB (for Matrox G200/G400 cards) interface for xine * @@ -174,6 +174,7 @@ struct syncfb_driver_s { int gui_x, gui_y; int gui_width, gui_height; + int gui_win_x, gui_win_y; /* * "output" size: @@ -200,7 +201,8 @@ struct syncfb_driver_s { void (*frame_output_cb) (void *user_data, int video_width, int video_height, int *dest_x, int *dest_y, - int *dest_height, int *dest_width); + int *dest_height, int *dest_width, + int *win_x, int *win_y); char scratch[256]; @@ -681,8 +683,8 @@ static void syncfb_compute_output_size (syncfb_driver_t *this) { this->syncfb_config.image_width = this->output_width; this->syncfb_config.image_height = (this->deinterlace_enabled) ? (this->output_height-2) : this->output_height; - this->syncfb_config.image_xorg = this->output_xoffset; - this->syncfb_config.image_yorg = this->output_yoffset; + this->syncfb_config.image_xorg = this->output_xoffset + this->gui_win_x; + this->syncfb_config.image_yorg = this->output_yoffset + this->gui_win_y; this->syncfb_config.src_crop_top = this->displayed_yoffset; this->syncfb_config.src_crop_bot = (this->deinterlace_enabled && this->displayed_yoffset == 0) ? 1 : this->displayed_yoffset; @@ -748,20 +750,24 @@ static void syncfb_flush_recent_frames (syncfb_driver_t *this) { static int syncfb_redraw_needed (vo_driver_t *this_gen) { syncfb_driver_t *this = (syncfb_driver_t *) this_gen; - int gui_x, gui_y, gui_width, gui_height; + int gui_x, gui_y, gui_width, gui_height, gui_win_x, gui_win_y; int ret = 0; this->frame_output_cb (this->user_data, this->ideal_width, this->ideal_height, - &gui_x, &gui_y, &gui_width, &gui_height); + &gui_x, &gui_y, &gui_width, &gui_height, + &gui_win_x, &gui_win_y ); if ( (gui_x != this->gui_x) || (gui_y != this->gui_y) - || (gui_width != this->gui_width) || (gui_height != this->gui_height) ) { + || (gui_width != this->gui_width) || (gui_height != this->gui_height) + || (gui_win_x != this->gui_win_x) || (gui_win_y != this->gui_win_y) ) { this->gui_x = gui_x; this->gui_y = gui_y; this->gui_width = gui_width; this->gui_height = gui_height; + this->gui_win_x = gui_win_x; + this->gui_win_y = gui_win_y; syncfb_compute_output_size (this); diff --git a/src/video_out/video_out_x11.h b/src/video_out/video_out_x11.h index 34479867a..16d687277 100644 --- a/src/video_out/video_out_x11.h +++ b/src/video_out/video_out_x11.h @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: video_out_x11.h,v 1.14 2002/02/16 22:43:24 guenter Exp $ + * $Id: video_out_x11.h,v 1.15 2002/03/21 18:29:51 miguelfreitas Exp $ * * structs and defines specific to all x11 related output plugins * (any x11 base xine ui should include this) @@ -81,12 +81,16 @@ typedef struct { * area and the video output driver will do it's best * to adjust the video frames to that size (while * preserving aspect ration and stuff). + * dest_x, dest_y: offset inside window + * dest_width, dest_height: available drawing space + * win_x, win_y: window absolute screen position */ void (*frame_output_cb) (void *user_data, int video_width, int video_height, int *dest_x, int *dest_y, - int *dest_width, int *dest_height); + int *dest_width, int *dest_height, + int *win_x, int *win_y); } x11_visual_t; diff --git a/src/video_out/video_out_xshm.c b/src/video_out/video_out_xshm.c index 9c6bbfb83..9a0be52b7 100644 --- a/src/video_out/video_out_xshm.c +++ b/src/video_out/video_out_xshm.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: video_out_xshm.c,v 1.68 2002/03/21 16:21:01 miguelfreitas Exp $ + * $Id: video_out_xshm.c,v 1.69 2002/03/21 18:29:51 miguelfreitas Exp $ * * video_out_xshm.c, X11 shared memory extension interface for xine * @@ -151,7 +151,9 @@ typedef struct xshm_driver_s { int gui_y; int gui_width; int gui_height; - + int gui_win_x; + int gui_win_y; + /* aspect ratio of pixels on screen */ double display_ratio; @@ -162,7 +164,8 @@ typedef struct xshm_driver_s { void (*frame_output_cb) (void *user_data, int video_width, int video_height, int *dest_x, int *dest_y, - int *dest_height, int *dest_width); + int *dest_height, int *dest_width, + int *win_x, int *win_y); void (*dest_size_cb) (void *user_data, int video_width, int video_height, @@ -787,7 +790,7 @@ static void clean_output_area (xshm_driver_t *this) { XSetForeground (this->display, this->gc, this->black.pixel); XFillRectangle(this->display, this->drawable, this->gc, - 0, 0, + this->gui_x, this->gui_y, this->gui_width, this->gui_height); #if 0 @@ -823,23 +826,28 @@ static void clean_output_area (xshm_driver_t *this) { static int xshm_redraw_needed (vo_driver_t *this_gen) { xshm_driver_t *this = (xshm_driver_t *) this_gen; - int gui_x, gui_y, gui_width, gui_height; + int gui_x, gui_y, gui_width, gui_height, gui_win_x, gui_win_y; int ret = 0; if( this->cur_frame ) { this->frame_output_cb (this->user_data, this->cur_frame->output_width, this->cur_frame->output_height, - &gui_x, &gui_y, &gui_width, &gui_height); + &gui_x, &gui_y, &gui_width, &gui_height, + &gui_win_x, &gui_win_y ); if ( (this->gui_x != gui_x) || (this->gui_y != gui_y) || (this->gui_width != gui_width) - || (this->gui_height != gui_height) ) { + || (this->gui_height != gui_height) + || (this->gui_win_x != gui_win_x) + || (this->gui_win_y != gui_win_y) ) { this->gui_x = gui_x; this->gui_y = gui_y; this->gui_width = gui_width; this->gui_height = gui_height; + this->gui_win_x = gui_win_x; + this->gui_win_y = gui_win_y; clean_output_area (this); ret = 1; @@ -873,7 +881,7 @@ static void xshm_display_frame (vo_driver_t *this_gen, vo_frame_t *frame_gen) { frame->vo_frame.displayed (&frame->vo_frame); } else { - int gui_x, gui_y, gui_width, gui_height; + int gui_x, gui_y, gui_width, gui_height, gui_win_x, gui_win_y; #ifdef LOG printf ("video_out_xshm: about to draw frame %d x %d...\n", @@ -887,16 +895,21 @@ static void xshm_display_frame (vo_driver_t *this_gen, vo_frame_t *frame_gen) { this->frame_output_cb (this->user_data, frame->output_width, frame->output_height, - &gui_x, &gui_y, &gui_width, &gui_height); + &gui_x, &gui_y, &gui_width, &gui_height, + &gui_win_x, &gui_win_y); if ( (this->gui_x != gui_x) || (this->gui_y != gui_y) || (this->gui_width != gui_width) - || (this->gui_height != gui_height) ) { + || (this->gui_height != gui_height) + || (this->gui_win_x != gui_win_x) + || (this->gui_win_y != gui_win_y) ) { this->gui_x = gui_x; this->gui_y = gui_y; this->gui_width = gui_width; this->gui_height = gui_height; + this->gui_win_x = gui_win_x; + this->gui_win_y = gui_win_y; clean_output_area (this); } @@ -912,8 +925,8 @@ static void xshm_display_frame (vo_driver_t *this_gen, vo_frame_t *frame_gen) { this->cur_frame = frame; - xoffset = (this->gui_width - frame->output_width) / 2; - yoffset = (this->gui_height - frame->output_height) / 2; + xoffset = (this->gui_width - frame->output_width) / 2 + this->gui_x; + yoffset = (this->gui_height - frame->output_height) / 2 + this->gui_y; XLockDisplay (this->display); #ifdef LOG @@ -1046,8 +1059,8 @@ static void xshm_translate_gui2video (xshm_driver_t *this, * gui area. This is the case in fullscreen mode, where we often * have black borders on the top/bottom/left/right side. */ - x -= ((this->gui_width - frame->output_width) >> 1); - y -= ((this->gui_height - frame->output_height) >> 1); + x -= ((this->gui_width - frame->output_width) >> 1) + this->gui_x; + y -= ((this->gui_height - frame->output_height) >> 1) + this->gui_y; /* * 2. diff --git a/src/video_out/video_out_xv.c b/src/video_out/video_out_xv.c index f98226b42..1ea74b91b 100644 --- a/src/video_out/video_out_xv.c +++ b/src/video_out/video_out_xv.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: video_out_xv.c,v 1.106 2002/03/21 16:21:02 miguelfreitas Exp $ + * $Id: video_out_xv.c,v 1.107 2002/03/21 18:29:51 miguelfreitas Exp $ * * video_out_xv.c, X11 video extension interface for xine * @@ -161,6 +161,7 @@ struct xv_driver_s { int gui_x, gui_y; int gui_width, gui_height; + int gui_win_x, gui_win_y; /* * "output" size: @@ -187,7 +188,8 @@ struct xv_driver_s { void (*frame_output_cb) (void *user_data, int video_width, int video_height, int *dest_x, int *dest_y, - int *dest_height, int *dest_width); + int *dest_height, int *dest_width, + int *win_x, int *win_y); char scratch[256]; @@ -575,7 +577,7 @@ static void xv_clean_output_area (xv_driver_t *this) { XSetForeground (this->display, this->gc, this->black.pixel); XFillRectangle(this->display, this->drawable, this->gc, - 0, 0, this->gui_width, this->gui_height); + this->gui_x, this->gui_y, this->gui_width, this->gui_height); if (this->use_colorkey) { XSetForeground (this->display, this->gc, this->colorkey); @@ -700,8 +702,8 @@ static void xv_compute_output_size (xv_driver_t *this) { this->output_height = (double) this->ideal_height * y_factor ; } - this->output_xoffset = (this->gui_width - this->output_width) / 2; - this->output_yoffset = (this->gui_height - this->output_height) / 2; + this->output_xoffset = (this->gui_width - this->output_width) / 2 + this->gui_x; + this->output_yoffset = (this->gui_height - this->output_height) / 2 + this->gui_y; #ifdef LOG printf ("video_out_xv: frame source %d x %d => screen output %d x %d\n", @@ -759,20 +761,24 @@ static void xv_flush_recent_frames (xv_driver_t *this) { static int xv_redraw_needed (vo_driver_t *this_gen) { xv_driver_t *this = (xv_driver_t *) this_gen; - int gui_x, gui_y, gui_width, gui_height; + int gui_x, gui_y, gui_width, gui_height, gui_win_x, gui_win_y; int ret = 0; this->frame_output_cb (this->user_data, this->ideal_width, this->ideal_height, - &gui_x, &gui_y, &gui_width, &gui_height); + &gui_x, &gui_y, &gui_width, &gui_height, + &gui_win_x, &gui_win_y ); if ( (gui_x != this->gui_x) || (gui_y != this->gui_y) - || (gui_width != this->gui_width) || (gui_height != this->gui_height) ) { + || (gui_width != this->gui_width) || (gui_height != this->gui_height) + || (gui_win_x != this->gui_win_x) || (gui_win_y != this->gui_win_y) ) { this->gui_x = gui_x; this->gui_y = gui_y; this->gui_width = gui_width; this->gui_height = gui_height; + this->gui_win_x = gui_win_x; + this->gui_win_y = gui_win_y; xv_compute_output_size (this); -- cgit v1.2.3