# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1319433689 0 # Node ID 28c2c7e6671c85f3d358577bf615589c5a99ac1f # Parent 575663435272a55a19e53ff7bdfcbb6aca0e55eb On GTK2 save the original pixbuf that is loaded so we can use it to store the alpha channel for use later when doing stretched bitblts... only negative is when drawing to pixmaps it won't modify the alpha mask. diff -r 575663435272 -r 28c2c7e6671c dw.h --- a/dw.h Mon Oct 24 03:44:24 2011 +0000 +++ b/dw.h Mon Oct 24 05:21:29 2011 +0000 @@ -1260,8 +1260,10 @@ unsigned long width, height; HWND handle; char *font; +#if GTK_MAJOR_VERSION > 1 + GdkPixbuf *pixbuf; /* the actual image */ +#endif #if GTK_MAJOR_VERSION > 2 - GdkPixbuf *pixbuf; /* the actual image */ cairo_surface_t *image; /* Going to have dual storage for now */ #else GdkPixmap *pixmap; /* the actual image */ diff -r 575663435272 -r 28c2c7e6671c gtk/dw.c --- a/gtk/dw.c Mon Oct 24 03:44:24 2011 +0000 +++ b/gtk/dw.c Mon Oct 24 05:21:29 2011 +0000 @@ -8354,9 +8354,7 @@ { int _locked_by_me = FALSE; HPIXMAP pixmap; -#if GTK_MAJOR_VERSION > 1 - GdkPixbuf *pixbuf; -#elif defined(USE_IMLIB) +#ifdef USE_IMLIB GdkImlibImage *image; #endif char *file = alloca(strlen(filename) + 5); @@ -8391,11 +8389,10 @@ DW_MUTEX_LOCK; #if GTK_MAJOR_VERSION > 1 - pixbuf = gdk_pixbuf_new_from_file(file, NULL); - pixmap->width = gdk_pixbuf_get_width(pixbuf); - pixmap->height = gdk_pixbuf_get_height(pixbuf); - gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap->pixmap, &pixmap->bitmap, 1); - g_object_unref(pixbuf); + pixmap->pixbuf = gdk_pixbuf_new_from_file(file, NULL); + pixmap->width = gdk_pixbuf_get_width(pixmap->pixbuf); + pixmap->height = gdk_pixbuf_get_height(pixmap->pixbuf); + gdk_pixbuf_render_pixmap_and_mask(pixmap->pixbuf, &pixmap->pixmap, &pixmap->bitmap, 1); #elif defined(USE_IMLIB) image = gdk_imlib_load_image(file); @@ -8582,6 +8579,8 @@ gdk_pixmap_unref(pixmap->pixmap); if(pixmap->font) free(pixmap->font); + if(pixmap->pixbuf) + g_object_unref(pixmap->pixbuf); free(pixmap); DW_MUTEX_UNLOCK; } @@ -8737,19 +8736,18 @@ /* Now that with have a pixbuf with alpha, copy from the drawable to create the source */ gdk_pixbuf_get_from_drawable(pbsrc, src ? src->window : srcp->pixmap, NULL, xsrc, ysrc, 0, 0, srcwidth, srcheight); - /* If the pixmap has an associated alpha mask, include that in the pixbuf */ - //if( srcp && srcp->bitmap ) - // Need to apply the mask to the pixmap if possible here /* Scale the pixbuf to the desired size */ pbdst = gdk_pixbuf_scale_simple(pbsrc, width, height, GDK_INTERP_BILINEAR); /* Create a new clipping mask from the scaled pixbuf */ - if( srcp && srcp->bitmap ) + if( srcp && srcp->bitmap && srcp->pixbuf ) { GdkBitmap *bitmap = gdk_pixmap_new(NULL, width, height, 1); - gdk_pixbuf_render_threshold_alpha(pbdst, bitmap, 0, 0, 0, 0, width, height, 1); + GdkPixbuf *pborig = gdk_pixbuf_scale_simple(srcp->pixbuf, width, height, GDK_INTERP_BILINEAR); + gdk_pixbuf_render_threshold_alpha(pborig, bitmap, 0, 0, 0, 0, width, height, 1); gdk_gc_set_clip_mask( gc, bitmap ); gdk_gc_set_clip_origin( gc, xdest, ydest ); gdk_bitmap_unref(bitmap); + gdk_pixbuf_unref(pborig); } /* Draw the final pixbuf onto the destination drawable */ gdk_draw_pixbuf(dest ? dest->window : destp->pixmap, gc, pbdst, 0, 0, xdest, ydest, width, height, GDK_RGB_DITHER_NONE, 0, 0);