changeset 1179:ebe0d27f6705

Attempt at implementing clip mask for transparency in GTK2 for Cairo.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 19 Sep 2011 22:36:24 +0000
parents 0a48149e93b9
children 4c20df806370
files gtk/dw.c
diffstat 1 files changed, 17 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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);