summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_out/video_out_vidix.c5
-rw-r--r--src/video_out/video_out_xshm.c5
-rw-r--r--src/video_out/video_out_xv.c17
-rw-r--r--src/video_out/x11osd.c384
-rw-r--r--src/video_out/x11osd.h9
5 files changed, 295 insertions, 125 deletions
diff --git a/src/video_out/video_out_vidix.c b/src/video_out/video_out_vidix.c
index d7a58b587..bc25fc102 100644
--- a/src/video_out/video_out_vidix.c
+++ b/src/video_out/video_out_vidix.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_vidix.c,v 1.59 2004/01/07 22:25:22 jstembridge Exp $
+ * $Id: video_out_vidix.c,v 1.60 2004/04/10 15:31:10 miguelfreitas Exp $
*
* video_out_vidix.c
*
@@ -1118,7 +1118,8 @@ static vo_driver_t *vidix_open_plugin (video_driver_class_t *class_gen, const vo
query_fourccs(this);
XLockDisplay (this->display);
- this->xoverlay = x11osd_create (this->xine, this->display, this->screen, this->drawable);
+ this->xoverlay = x11osd_create (this->xine, this->display, this->screen,
+ this->drawable, X11OSD_SHAPED);
XUnlockDisplay (this->display);
if( this->xoverlay )
diff --git a/src/video_out/video_out_xshm.c b/src/video_out/video_out_xshm.c
index fba668713..297a6d7d1 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.128 2004/04/10 03:34:37 miguelfreitas Exp $
+ * $Id: video_out_xshm.c,v 1.129 2004/04/10 15:31:10 miguelfreitas Exp $
*
* video_out_xshm.c, X11 shared memory extension interface for xine
*
@@ -1230,7 +1230,8 @@ static vo_driver_t *xshm_open_plugin (video_driver_class_t *class_gen, const voi
this->yuv2rgb_saturation);
XLockDisplay (this->display);
- this->xoverlay = x11osd_create (this->xine, this->display, this->screen, this->drawable);
+ this->xoverlay = x11osd_create (this->xine, this->display, this->screen,
+ this->drawable, X11OSD_SHAPED);
XUnlockDisplay (this->display);
return &this->vo_driver;
diff --git a/src/video_out/video_out_xv.c b/src/video_out/video_out_xv.c
index 6104c55d9..cf192db6f 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.195 2004/04/09 15:29:33 mroi Exp $
+ * $Id: video_out_xv.c,v 1.196 2004/04/10 15:31:10 miguelfreitas Exp $
*
* video_out_xv.c, X11 video extension interface for xine
*
@@ -1107,8 +1107,11 @@ static void xv_check_capability (xv_driver_t *this,
xv_set_property (&this->vo_driver, property, entry->num_value);
if (strcmp(str_prop, "XV_COLORKEY") == 0) {
- this->use_colorkey = 1;
+ this->use_colorkey |= 1;
this->colorkey = entry->num_value;
+ } else if(strcmp(str_prop, "XV_AUTOPAINT_COLORKEY") == 0) {
+ if(entry->num_value==1)
+ this->use_colorkey |= 2; /* colorkey is autopainted */
}
} else
this->props[property].value = int_default;
@@ -1367,7 +1370,15 @@ static vo_driver_t *open_plugin (video_driver_class_t *class_gen, const void *vi
this->deinterlace_enabled = 0;
XLockDisplay (this->display);
- this->xoverlay = x11osd_create (this->xine, this->display, this->screen, this->drawable);
+ if(this->use_colorkey==1) {
+ this->xoverlay = x11osd_create (this->xine, this->display, this->screen,
+ this->drawable, X11OSD_COLORKEY);
+ if(this->xoverlay)
+ x11osd_colorkey(this->xoverlay, this->colorkey, &this->sc);
+ } else {
+ this->xoverlay = x11osd_create (this->xine, this->display, this->screen,
+ this->drawable, X11OSD_SHAPED);
+ }
XUnlockDisplay (this->display);
if( this->xoverlay )
diff --git a/src/video_out/x11osd.c b/src/video_out/x11osd.c
index d47449434..1385b1a36 100644
--- a/src/video_out/x11osd.c
+++ b/src/video_out/x11osd.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: x11osd.c,v 1.7 2004/03/23 09:29:25 esnel Exp $
+ * $Id: x11osd.c,v 1.8 2004/04/10 15:31:10 miguelfreitas Exp $
*
* x11osd.c, use X11 Nonrectangular Window Shape Extension to draw xine OSD
*
@@ -25,6 +25,8 @@
*
* based on ideas and code of
* xosd Copyright (c) 2000 Andre Renaud (andre@ignavus.net)
+ *
+ * colorkey support by Yann Vernier
*/
#include <stdarg.h>
@@ -52,48 +54,116 @@ struct x11osd
{
Display *display;
int screen;
+ enum x11osd_mode mode;
+
+ union {
+ struct {
+ Window window;
+ Pixmap mask_bitmap;
+ GC mask_gc;
+ GC mask_gc_back;
+ int mapped;
+ } shaped;
+ struct {
+ uint32_t colorkey;
+ vo_scale_t *scaling;
+ int bordercount;
+ XRectangle borders[4];
+ } colorkey;
+ } u;
Window window;
- Window parent_window;
unsigned int depth;
- Pixmap mask_bitmap;
Pixmap bitmap;
Visual *visual;
Colormap cmap;
GC gc;
- GC mask_gc;
- GC mask_gc_back;
int width;
int height;
int x;
int y;
- int clean;
- int mapped;
+ enum {DRAWN, WIPED, UNDEFINED} clean;
xine_t *xine;
};
+static void x11osd_colorkey_compute_borders(x11osd *osd)
+{
+ assert (osd);
+ assert (osd->mode==X11OSD_COLORKEY);
+
+ if(osd->u.colorkey.scaling) {
+ XRectangle *r=osd->u.colorkey.borders;
+ vo_scale_t *scaling=osd->u.colorkey.scaling;
+ int tmp, count=0;
+
+ if(scaling->output_yoffset>0) {
+ r->x=r->y=0;
+ r->width=osd->width;
+ r->height=scaling->output_yoffset;
+ r++;
+ count++;
+ }
+ tmp=osd->height-scaling->output_yoffset-scaling->output_height;
+ if(tmp>0) {
+ r->x=0;
+ r->width=osd->width;
+ r->y=osd->height-tmp;
+ r->height=tmp;
+ r++;
+ count++;
+ }
+ if(scaling->output_xoffset>0) {
+ r->x=0;
+ r->y=scaling->output_yoffset;
+ r->width=scaling->output_xoffset;
+ r->height=scaling->output_height;
+ r++;
+ count++;
+ }
+ tmp=osd->width-scaling->output_xoffset-scaling->output_width;
+ if(tmp>0) {
+ r->x=osd->width-tmp;
+ r->y=scaling->output_yoffset;
+ r->width=tmp;
+ r->height=scaling->output_height;
+ r++;
+ count++;
+ }
+ osd->u.colorkey.bordercount=count;
+ }
+ else
+ osd->u.colorkey.bordercount=0;
+}
+
void
x11osd_expose (x11osd * osd)
{
assert (osd);
- XShapeCombineMask (osd->display, osd->window, ShapeBounding, 0, 0,
- osd->mask_bitmap, ShapeSet);
-
- if( !osd->clean ) {
+ switch (osd->mode) {
+ case X11OSD_SHAPED:
+ XShapeCombineMask (osd->display, osd->u.shaped.window, ShapeBounding, 0, 0,
+ osd->u.shaped.mask_bitmap, ShapeSet);
+ if( osd->clean==DRAWN ) {
- if( !osd->mapped )
- XMapRaised (osd->display, osd->window);
- osd->mapped = 1;
+ if( !osd->u.shaped.mapped )
+ XMapRaised (osd->display, osd->u.shaped.window);
+ osd->u.shaped.mapped = 1;
- XCopyArea (osd->display, osd->bitmap, osd->window, osd->gc, 0, 0,
- osd->width, osd->height, 0, 0);
- } else {
- if( osd->mapped )
- XUnmapWindow (osd->display, osd->window);
- osd->mapped = 0;
+ XCopyArea (osd->display, osd->bitmap, osd->u.shaped.window, osd->gc, 0, 0,
+ osd->width, osd->height, 0, 0);
+ } else {
+ if( osd->u.shaped.mapped )
+ XUnmapWindow (osd->display, osd->u.shaped.window);
+ osd->u.shaped.mapped = 0;
+ }
+ break;
+ case X11OSD_COLORKEY:
+ if( osd->clean!=UNDEFINED )
+ XCopyArea (osd->display, osd->bitmap, osd->window, osd->gc, 0, 0,
+ osd->width, osd->height, 0, 0);
}
}
@@ -102,26 +172,39 @@ void
x11osd_resize (x11osd * osd, int width, int height)
{
assert (osd);
+ osd->clean=UNDEFINED;
+ if(osd->width==width && osd->height==height)
+ return;
osd->width = width;
osd->height = height;
- XResizeWindow (osd->display, osd->window, osd->width, osd->height);
- XFreePixmap (osd->display, osd->mask_bitmap);
- osd->mask_bitmap =
- XCreatePixmap (osd->display, osd->window, osd->width, osd->height,
- 1);
- XFillRectangle (osd->display, osd->mask_bitmap, osd->mask_gc_back,
- 0, 0, osd->width, osd->height);
-
XFreePixmap (osd->display, osd->bitmap);
- osd->bitmap =
- XCreatePixmap (osd->display, osd->window, osd->width,
- osd->height, osd->depth);
+ switch(osd->mode) {
+ case X11OSD_SHAPED:
+ XResizeWindow (osd->display, osd->u.shaped.window, osd->width, osd->height);
+ XFreePixmap (osd->display, osd->u.shaped.mask_bitmap);
+ osd->u.shaped.mask_bitmap =
+ XCreatePixmap (osd->display, osd->u.shaped.window, osd->width, osd->height,
+ 1);
+ XFillRectangle (osd->display, osd->u.shaped.mask_bitmap, osd->u.shaped.mask_gc_back,
+ 0, 0, osd->width, osd->height);
+ osd->bitmap =
+ XCreatePixmap (osd->display, osd->u.shaped.window,
+ osd->width, osd->height, osd->depth);
+ break;
+ case X11OSD_COLORKEY:
+ osd->bitmap =
+ XCreatePixmap (osd->display, osd->window,
+ osd->width, osd->height, osd->depth);
+ break;
+ }
}
void
x11osd_drawable_changed (x11osd * osd, Window window)
{
+ XSetWindowAttributes attr;
+
assert (osd);
/*
@@ -132,40 +215,51 @@ x11osd_drawable_changed (x11osd * osd, Window window)
XFreeGC (osd->display, osd->mask_gc_back);
*/
XFreePixmap (osd->display, osd->bitmap);
- XFreePixmap (osd->display, osd->mask_bitmap);
XFreeColormap (osd->display, osd->cmap);
- XDestroyWindow (osd->display, osd->window);
/* we need to call XSync(), because otherwise, calling XDestroyWindow()
on the parent window could destroy our OSD window twice !! */
XSync (osd->display, False);
- osd->parent_window = window;
- osd->window = XCreateSimpleWindow (osd->display,
- osd->parent_window,
- 0, 0,
- osd->width, osd->height, 1,
- BlackPixel (osd->display, osd->screen),
- BlackPixel (osd->display, osd->screen));
-
- osd->mask_bitmap =
- XCreatePixmap (osd->display, osd->window, osd->width, osd->height,
- 1);
- XFillRectangle (osd->display, osd->mask_bitmap, osd->mask_gc_back,
- 0, 0, osd->width, osd->height);
-
- osd->bitmap =
- XCreatePixmap (osd->display, osd->window, osd->width,
- osd->height, osd->depth);
+ osd->window = window;
- osd->cmap = XCreateColormap(osd->display, osd->window,
+ switch(osd->mode) {
+ case X11OSD_SHAPED:
+ XFreePixmap (osd->display, osd->u.shaped.mask_bitmap);
+ XDestroyWindow (osd->display, osd->u.shaped.window);
+
+ attr.override_redirect = True;
+ attr.background_pixel = BlackPixel (osd->display, osd->screen);
+ osd->u.shaped.window = XCreateWindow(osd->display, osd->window,
+ 0, 0, osd->width, osd->height, 0,
+ CopyFromParent, CopyFromParent, CopyFromParent,
+ CWBackPixel | CWOverrideRedirect, &attr);
+
+ XSelectInput (osd->display, osd->u.shaped.window, ExposureMask);
+ osd->u.shaped.mapped = 0;
+
+ osd->u.shaped.mask_bitmap = XCreatePixmap (osd->display, osd->u.shaped.window,
+ osd->width, osd->height, 1);
+ XFillRectangle (osd->display, osd->u.shaped.mask_bitmap, osd->u.shaped.mask_gc_back,
+ 0, 0, osd->width, osd->height);
+
+ osd->bitmap = XCreatePixmap (osd->display, osd->u.shaped.window, osd->width,
+ osd->height, osd->depth);
+
+ osd->cmap = XCreateColormap(osd->display, osd->u.shaped.window,
+ osd->visual, AllocNone);
+ break;
+ case X11OSD_COLORKEY:
+ osd->bitmap = XCreatePixmap (osd->display, osd->window, osd->width,
+ osd->height, osd->depth);
+ /*x11osd_colorkey_compute_borders(osd);*/
+ osd->cmap = XCreateColormap(osd->display, osd->window,
osd->visual, AllocNone);
- XSelectInput (osd->display, osd->window, ExposureMask);
-
- osd->clean = 0;
- x11osd_clear(osd);
- osd->mapped = 0;
+ break;
+ }
+
+ osd->clean = UNDEFINED;
x11osd_expose(osd);
}
@@ -178,7 +272,7 @@ static int x11_error_handler(Display *dpy, XErrorEvent *error)
}
x11osd *
-x11osd_create (xine_t *xine, Display *display, int screen, Window window)
+x11osd_create (xine_t *xine, Display *display, int screen, Window window, enum x11osd_mode mode)
{
x11osd *osd;
int event_basep, error_basep;
@@ -189,15 +283,11 @@ x11osd_create (xine_t *xine, Display *display, int screen, Window window)
if (!osd)
return NULL;
+ osd->mode = mode;
osd->xine = xine;
osd->display = display;
osd->screen = screen;
- osd->parent_window = window;
-
- if (!XShapeQueryExtension (osd->display, &event_basep, &error_basep)) {
- xprintf(osd->xine, XINE_VERBOSITY_LOG, _("x11osd: XShape extension not available. unscaled overlay disabled.\n"));
- goto error2;
- }
+ osd->window = window;
x11_error = False;
old_handler = XSetErrorHandler(x11_error_handler);
@@ -207,63 +297,87 @@ x11osd_create (xine_t *xine, Display *display, int screen, Window window)
osd->width = XDisplayWidth (osd->display, osd->screen);
osd->height = XDisplayHeight (osd->display, osd->screen);
- attr.override_redirect = True;
- attr.background_pixel = BlackPixel (osd->display, osd->screen);
- osd->window = XCreateWindow(osd->display, osd->parent_window,
+ switch (mode) {
+ case X11OSD_SHAPED:
+ if (!XShapeQueryExtension (osd->display, &event_basep, &error_basep)) {
+ xprintf(osd->xine, XINE_VERBOSITY_LOG, _("x11osd: XShape extension not available. unscaled overlay disabled.\n"));
+ goto error2;
+ }
+
+ attr.override_redirect = True;
+ attr.background_pixel = BlackPixel (osd->display, osd->screen);
+ osd->u.shaped.window = XCreateWindow(osd->display, osd->window,
0, 0, osd->width, osd->height, 0,
CopyFromParent, CopyFromParent, CopyFromParent,
CWBackPixel | CWOverrideRedirect, &attr);
- XSync(osd->display, False);
- if( x11_error ) {
- xprintf(osd->xine, XINE_VERBOSITY_LOG, _("x11osd: error creating window. unscaled overlay disabled.\n"));
- goto error3;
- }
+ XSync(osd->display, False);
+ if( x11_error ) {
+ xprintf(osd->xine, XINE_VERBOSITY_LOG, _("x11osd: error creating window. unscaled overlay disabled.\n"));
+ goto error_window;
+ }
- osd->mask_bitmap =
- XCreatePixmap (osd->display, osd->window, osd->width,
+ osd->u.shaped.mask_bitmap = XCreatePixmap (osd->display, osd->u.shaped.window, osd->width,
osd->height, 1);
- XSync(osd->display, False);
- if( x11_error ) {
- xprintf(osd->xine, XINE_VERBOSITY_LOG, _("x11osd: error creating pixmap. unscaled overlay disabled.\n"));
- goto error4;
- }
+ XSync(osd->display, False);
+ if( x11_error ) {
+ xprintf(osd->xine, XINE_VERBOSITY_LOG, _("x11osd: error creating pixmap. unscaled overlay disabled.\n"));
+ goto error_aftermaskbitmap;
+ }
- osd->bitmap =
- XCreatePixmap (osd->display, osd->window, osd->width,
+ osd->bitmap = XCreatePixmap (osd->display, osd->u.shaped.window, osd->width,
osd->height, osd->depth);
- XSync(osd->display, False);
- if( x11_error ) {
- xprintf(osd->xine, XINE_VERBOSITY_LOG, _("x11osd: error creating pixmap. unscaled overlay disabled.\n"));
- goto error5;
- }
-
- osd->gc = XCreateGC (osd->display, osd->window, 0, NULL);
- osd->mask_gc = XCreateGC (osd->display, osd->mask_bitmap, 0, NULL);
- osd->mask_gc_back = XCreateGC (osd->display, osd->mask_bitmap, 0, NULL);
+ osd->gc = XCreateGC (osd->display, osd->u.shaped.window, 0, NULL);
- XSetForeground (osd->display, osd->mask_gc_back,
- BlackPixel (osd->display, osd->screen));
- XSetBackground (osd->display, osd->mask_gc_back,
+ osd->u.shaped.mask_gc = XCreateGC (osd->display, osd->u.shaped.mask_bitmap, 0, NULL);
+ XSetForeground (osd->display, osd->u.shaped.mask_gc,
WhitePixel (osd->display, osd->screen));
+ XSetBackground (osd->display, osd->u.shaped.mask_gc,
+ BlackPixel (osd->display, osd->screen));
- XSetForeground (osd->display, osd->mask_gc,
- WhitePixel (osd->display, osd->screen));
- XSetBackground (osd->display, osd->mask_gc,
+
+ osd->u.shaped.mask_gc_back = XCreateGC (osd->display, osd->u.shaped.mask_bitmap, 0, NULL);
+ XSetForeground (osd->display, osd->u.shaped.mask_gc_back,
BlackPixel (osd->display, osd->screen));
+ XSetBackground (osd->display, osd->u.shaped.mask_gc_back,
+ WhitePixel (osd->display, osd->screen));
- osd->cmap = XCreateColormap(osd->display, osd->window,
+ XSelectInput (osd->display, osd->u.shaped.window, ExposureMask);
+ osd->u.shaped.mapped = 0;
+ osd->cmap = XCreateColormap(osd->display, osd->u.shaped.window,
+ osd->visual, AllocNone);
+ break;
+ case X11OSD_COLORKEY:
+ osd->bitmap = XCreatePixmap (osd->display, osd->window, osd->width,
+ osd->height, osd->depth);
+ /*x11osd_colorkey_compute_borders(osd); done in x11osd_colorkey */
+ osd->gc = XCreateGC (osd->display, osd->window, 0, NULL);
+ osd->cmap = XCreateColormap(osd->display, osd->window,
osd->visual, AllocNone);
+ /* FIXME: the expose event doesn't seem to happen? */
+ /*XSelectInput (osd->display, osd->window, ExposureMask);*/
+ break;
+ default:
+ goto error2;
+ }
- XSelectInput (osd->display, osd->window, ExposureMask);
+ XSync(osd->display, False);
+ if( x11_error ) {
+ xprintf(osd->xine, XINE_VERBOSITY_LOG, _("x11osd: error creating pixmap. unscaled overlay disabled.\n"));
+ goto error_pixmap;
+ }
- osd->clean = 0;
- x11osd_clear(osd);
- osd->mapped = 0;
- x11osd_expose(osd);
+ osd->clean = UNDEFINED;
+ if(mode==X11OSD_SHAPED) {
+ x11osd_expose(osd);
+ }
XSetErrorHandler(old_handler);
+ xprintf(osd->xine, XINE_VERBOSITY_DEBUG,
+ _("x11osd: unscaled overlay created (%s mode).\n"),
+ (mode==X11OSD_SHAPED) ? "XShape" : "Colorkey" );
+
return osd;
/*
@@ -272,18 +386,32 @@ x11osd_create (xine_t *xine, Display *display, int screen, Window window)
XFreeGC (osd->display, osd->mask_gc_back);
*/
-error5:
+error_pixmap:
XFreePixmap (osd->display, osd->bitmap);
-error4:
- XFreePixmap (osd->display, osd->mask_bitmap);
-error3:
- XDestroyWindow (osd->display, osd->window);
+error_aftermaskbitmap:
+ if(mode==X11OSD_SHAPED)
+ XFreePixmap (osd->display, osd->u.shaped.mask_bitmap);
+error_window:
+ if(mode==X11OSD_SHAPED)
+ XDestroyWindow (osd->display, osd->u.shaped.window);
XSetErrorHandler(old_handler);
error2:
free (osd);
return NULL;
}
+void x11osd_colorkey(x11osd * osd, uint32_t colorkey, vo_scale_t *scaling)
+{
+ assert (osd);
+ assert (osd->mode==X11OSD_COLORKEY);
+
+ osd->u.colorkey.colorkey=colorkey;
+ osd->u.colorkey.scaling=scaling;
+ /*x11osd_colorkey_compute_borders(osd);
+ x11osd_clear(osd); Workaround: we clear on the first blend instead.
+ x11osd_expose(osd);*/
+}
+
void
x11osd_destroy (x11osd * osd)
{
@@ -291,22 +419,43 @@ x11osd_destroy (x11osd * osd)
assert (osd);
XFreeGC (osd->display, osd->gc);
- XFreeGC (osd->display, osd->mask_gc);
- XFreeGC (osd->display, osd->mask_gc_back);
XFreePixmap (osd->display, osd->bitmap);
- XFreePixmap (osd->display, osd->mask_bitmap);
XFreeColormap (osd->display, osd->cmap);
- XDestroyWindow (osd->display, osd->window);
+ if(osd->mode==X11OSD_SHAPED) {
+ XFreeGC (osd->display, osd->u.shaped.mask_gc);
+ XFreeGC (osd->display, osd->u.shaped.mask_gc_back);
+ XFreePixmap (osd->display, osd->u.shaped.mask_bitmap);
+ XDestroyWindow (osd->display, osd->u.shaped.window);
+ }
free (osd);
}
void x11osd_clear(x11osd *osd)
{
- if( !osd->clean )
- XFillRectangle (osd->display, osd->mask_bitmap, osd->mask_gc_back,
- 0, 0, osd->width, osd->height);
- osd->clean = 1;
+ if( osd->clean!=WIPED )
+ switch (osd->mode) {
+ case X11OSD_SHAPED:
+ XFillRectangle (osd->display, osd->u.shaped.mask_bitmap, osd->u.shaped.mask_gc_back,
+ 0, 0, osd->width, osd->height);
+ break;
+ case X11OSD_COLORKEY:
+ XSetForeground(osd->display, osd->gc, osd->u.colorkey.colorkey);
+ if(osd->u.colorkey.scaling) {
+ x11osd_colorkey_compute_borders(osd);
+ XFillRectangle (osd->display, osd->bitmap, osd->gc,
+ osd->u.colorkey.scaling->output_xoffset,
+ osd->u.colorkey.scaling->output_yoffset,
+ osd->u.colorkey.scaling->output_width,
+ osd->u.colorkey.scaling->output_height);
+ XSetForeground(osd->display, osd->gc, BlackPixel(osd->display, osd->screen));
+ XFillRectangles (osd->display, osd->bitmap, osd->gc,
+ osd->u.colorkey.borders, osd->u.colorkey.bordercount);
+ } else
+ XFillRectangle (osd->display, osd->bitmap, osd->gc, 0, 0, osd->width, osd->height);
+ break;
+ }
+ osd->clean = WIPED;
}
#define TRANSPARENT 0xffffffff
@@ -315,6 +464,8 @@ void x11osd_clear(x11osd *osd)
void x11osd_blend(x11osd *osd, vo_overlay_t *overlay)
{
+ if (osd->clean==UNDEFINED)
+ x11osd_clear(osd); /* Workaround. Colorkey mode needs scaling data before the clear. */
if (overlay->rle) {
int i, x, y, len, width;
int use_clip_palette, max_palette_colour[2];
@@ -405,7 +556,8 @@ void x11osd_blend(x11osd *osd, vo_overlay_t *overlay)
if(palette[use_clip_palette][overlay->rle[i].color] != TRANSPARENT) {
XSetForeground(osd->display, osd->gc, palette[use_clip_palette][overlay->rle[i].color]);
XFillRectangle(osd->display, osd->bitmap, osd->gc, overlay->x + x, overlay->y + y, width, 1);
- XFillRectangle(osd->display, osd->mask_bitmap, osd->mask_gc, overlay->x + x, overlay->y + y, width, 1);
+ if(osd->mode==X11OSD_SHAPED)
+ XFillRectangle(osd->display, osd->u.shaped.mask_bitmap, osd->u.shaped.mask_gc, overlay->x + x, overlay->y + y, width, 1);
}
x += width;
@@ -415,7 +567,7 @@ void x11osd_blend(x11osd *osd, vo_overlay_t *overlay)
}
}
}
+ osd->clean = DRAWN;
}
- osd->clean = 0;
}
diff --git a/src/video_out/x11osd.h b/src/video_out/x11osd.h
index 23be5df11..3fae9968d 100644
--- a/src/video_out/x11osd.h
+++ b/src/video_out/x11osd.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: x11osd.h,v 1.3 2003/12/05 15:55:04 f1rmb Exp $
+ * $Id: x11osd.h,v 1.4 2004/04/10 15:31:10 miguelfreitas Exp $
*
* x11osd.h, use X11 Nonrectangular Window Shape Extension to draw xine OSD
*
@@ -30,9 +30,14 @@
#ifndef X11OSD_H
#define X11OSD_H
+#include "vo_scale.h"
+
typedef struct x11osd x11osd;
+enum x11osd_mode {X11OSD_SHAPED, X11OSD_COLORKEY};
+
+x11osd *x11osd_create (xine_t *xine, Display *display, int screen, Window window, enum x11osd_mode mode);
-x11osd *x11osd_create (xine_t *xine, Display *display, int screen, Window window);
+void x11osd_colorkey(x11osd * osd, uint32_t colorkey, vo_scale_t *scaling);
void x11osd_destroy (x11osd * osd);