# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1316471784 0 # Node ID ebe0d27f6705f8113a0f99efba1aefa910167cc1 # Parent 0a48149e93b98980ab1c582825dcffa591ee3413 Attempt at implementing clip mask for transparency in GTK2 for Cairo. diff -r 0a48149e93b9 -r ebe0d27f6705 gtk/dw.c --- a/gtk/dw.c Mon Sep 19 21:31:36 2011 +0000 +++ b/gtk/dw.c Mon Sep 19 22:36:24 2011 +0000 @@ -8486,8 +8486,24 @@ #endif if(srcp && srcp->image) cairo_set_source_surface (cr, srcp->image, xdest - xsrc, ydest - ysrc); - else if(srcp && srcp->pixmap) + else if(srcp && srcp->pixmap && !srcp->mask) gdk_cairo_set_source_pixmap (cr, srcp->pixmap, xdest - xsrc, ydest - ysrc); + else if(srcp && srcp->pixmap && srcp->mask) + { + cairo_pattern_t *mask_pattern; + + /* hack to get the mask pattern */ + gdk_cairo_set_source_pixmap(cr, srcp->mask, xdest, ydest); + mask_pattern = cairo_get_source(cr); + cairo_pattern_reference(mask_pattern); + + gdk_cairo_set_source_pixmap(cr, srcp->pixmap, xdest - xsrc, ydest - ysrc); + cairo_rectangle(cr, xdest, ydest, width, height); + cairo_clip(cr); + cairo_mask(cr, mask_pattern); + cairo_destroy(cr); + DW_MUTEX_UNLOCK; + } cairo_rectangle(cr, xdest, ydest, width, height); cairo_fill(cr);