changeset 1177:c38ec904b6d3

Fixed dw_pixmap_bitblt() on printing context pixmaps in GTK3. Implemented dw_pixmap_bitblt() for cairo surfaces in GTK2. Which also fixes bitblt for priting on GTK2 as well.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 19 Sep 2011 21:09:58 +0000
parents 408ea33b19cf
children 0a48149e93b9
files gtk/dw.c gtk3/dw.c
diffstat 2 files changed, 49 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/gtk/dw.c	Mon Sep 19 19:48:23 2011 +0000
+++ b/gtk/dw.c	Mon Sep 19 21:09:58 2011 +0000
@@ -8452,6 +8452,46 @@
    DW_MUTEX_UNLOCK;
 }
 
+#if GTK_CHECK_VERSION(2,10,0)
+/* Cairo version of dw_pixmap_bitblt() from GTK3, use if either pixmap is a cairo surface */
+void _cairo_pixmap_bitblt(HWND dest, HPIXMAP destp, int xdest, int ydest, int width, int height, HWND src, HPIXMAP srcp, int xsrc, int ysrc)
+{
+   int _locked_by_me = FALSE;
+   cairo_t *cr = NULL;
+
+   if((!dest && (!destp || !destp->image)) || (!src && (!srcp || !srcp->image)))
+      return;
+
+   DW_MUTEX_LOCK;
+   if(dest)
+   {
+      GdkWindow *window = gtk_widget_get_window(dest);
+      /* Safety check for non-existant windows */
+      if(!window || !GDK_IS_WINDOW(window))
+      {
+         DW_MUTEX_UNLOCK;
+         return;
+      }
+      cr = gdk_cairo_create(window);
+   }
+   else if(destp)
+      cr = cairo_create(destp->image);
+
+   if(cr)
+   {
+      if(src)
+         gdk_cairo_set_source_window (cr, gtk_widget_get_window(src), xdest -xsrc, ydest - ysrc);
+      else if(srcp)
+         cairo_set_source_surface (cr, srcp->image, xdest - xsrc, ydest - ysrc);
+
+      cairo_rectangle(cr, xdest, ydest, width, height);
+      cairo_fill(cr);
+      cairo_destroy(cr);
+   }
+   DW_MUTEX_UNLOCK;
+}
+#endif
+
 /*
  * Copies from one item to another.
  * Parameters:
@@ -8476,6 +8516,14 @@
    int _locked_by_me = FALSE;
    GdkGC *gc = NULL;
 
+#if GTK_CHECK_VERSION(2,10,0)
+   if((destp && destp->image) || (srcp && srcp->image))
+   {
+      _cairo_pixmap_bitblt(dest, destp, xdest, ydest, width, height, src, srcp, xsrc, ysrc);
+      return;
+   }
+#endif
+   
    if((!dest && (!destp || !destp->pixmap)) || (!src && (!srcp || !srcp->pixmap)))
       return;
 
--- a/gtk3/dw.c	Mon Sep 19 19:48:23 2011 +0000
+++ b/gtk3/dw.c	Mon Sep 19 21:09:58 2011 +0000
@@ -7223,7 +7223,7 @@
    int _locked_by_me = FALSE;
    cairo_t *cr = NULL;
 
-   if((!dest && (!destp || !destp->pixbuf)) || (!src && (!srcp || !srcp->pixbuf)))
+   if((!dest && (!destp || !destp->image)) || (!src && (!srcp || !srcp->image)))
       return;
 
    DW_MUTEX_LOCK;