gtk-font-hack patch



This patch adds font smoothing to the GDK. I would appreciate
feedback!

I've attached a patch against 1.2.6. 

http://altern.org/vii/programs/linux/gtk-font-hack/

Now no longer core dumps on me (so I'm calling it beta).

Problems now:

x For some reason fonts are not smudged in gnome-o-terminal
  programs (e.g. gnome-terminal, gnome-genius, gnome-chess), though 
  the size allowed for them is halved. I guess this gadget bypasses 
  the GDK in some way (??).
x The right part of GHex's left display window with the hex
  in it is missing inexplicably.
x When the GTK draws the same text twice in the same place
  without clearing, the edges are darkened. I guess this is done in
  too many places to fix quickly.

Help!

-- 

	john fremlin vii
	http://altern.org/vii
diff --recursive --new-file --unified gtk+-1.2.6.clean/gdk/gdk.h gtk+-1.2.6.font-hack/gdk/gdk.h
--- gtk+-1.2.6.clean/gdk/gdk.h	Sat Jan 22 15:29:17 2000
+++ gtk+-1.2.6.font-hack/gdk/gdk.h	Sat Jan 22 15:27:28 2000
@@ -517,6 +517,16 @@
 				gint	      y,
 				gint	      width,
 				gint	      height);
+void
+gdk_image_get_subimage (GdkImage* image,
+			GdkWindow *window,
+			gint x,
+			gint y,
+			gint width,
+			gint height,
+			gint dest_x,
+			gint dest_y
+			);
 void	   gdk_image_put_pixel (GdkImage     *image,
 				gint	      x,
 				gint	      y,
diff --recursive --new-file --unified gtk+-1.2.6.clean/gdk/gdkdraw.c gtk+-1.2.6.font-hack/gdk/gdkdraw.c
--- gtk+-1.2.6.clean/gdk/gdkdraw.c	Sat Jan 22 15:29:17 2000
+++ gtk+-1.2.6.font-hack/gdk/gdkdraw.c	Mon Jan 24 01:01:03 2000
@@ -29,6 +29,96 @@
 #include "gdk.h"
 #include "gdkprivate.h"
 
+#include "gdkfonthack.h"
+
+#if defined GTK_FONT_HACK
+
+static
+GdkPixmap*
+explode_image( GdkImage* source,
+	       guint orig_width,
+	       guint orig_height,
+	       GdkDrawable* drawable );
+
+static
+GdkImage*
+fetch_image_from( GdkDrawable* drawable, gint x, gint y, guint width, guint height );
+
+static
+void
+condense_pixmap( GdkPixmap* exploded_pixmap,
+		 guint condensed_width, guint condensed_height,
+		 GdkImage* condensed_image );
+
+
+
+#define FONT_HACK_INIT_VARS  gint width, ascent, descent; \
+  GdkDrawable* real_drawable = drawable; \
+  guint exploded_width, exploded_height; \
+  GdkImage* saved; \
+  guint saved_height, saved_width; \
+  gint saved_x, saved_y;
+
+
+#define FONT_HACK_CALC_DIMS \
+  saved_width = scale_down(width); \
+  saved_height = scale_down(ascent+descent); \
+  exploded_width = saved_width * scale;\
+  exploded_height = saved_height * scale;\
+  saved_x = x; \
+  saved_y = y - scale_down(ascent);
+
+#define FONT_HACK_FETCH_IMAGE \
+  saved = fetch_image_from( real_drawable, \
+                            saved_x, saved_y, \
+                            saved_width, saved_height ); \
+  if ( saved ) \
+    { \
+      /* This is really, really bad and shouldn't be done */ \
+      gdk_gc_set_clip_mask( gc, 0 ); \
+      drawable = explode_image( saved, saved_width, saved_height, drawable ); \
+      drawable_private = (GdkWindowPrivate*)drawable; \
+      x = 0; \
+      y = ascent; \
+    } \
+  else \
+    { \
+      font_hack_warning( "can't smudge this one." ); \
+    } 
+
+
+#define FONT_HACK_CALC_DIMS_AND_FETCH_IMAGE \
+      FONT_HACK_CALC_DIMS ; \
+      FONT_HACK_FETCH_IMAGE
+
+#define FONT_HACK_DRAW_IMAGE \
+  if ( saved ) \
+    { \
+      GdkGC* clean_gc = gdk_gc_new(drawable); \
+\
+      condense_pixmap( drawable, saved_width, saved_height, saved ); \
+      gdk_pixmap_unref( drawable ); \
+      gdk_draw_image(real_drawable, \
+		     clean_gc, \
+		     saved, \
+		     0, \
+		     0, \
+		     saved_x, \
+		     saved_y, \
+		     saved_width, \
+		     saved_height ); \
+      gdk_gc_destroy( clean_gc ); \
+      gdk_image_destroy(saved); \
+    } 
+#else
+
+#define FONT_HACK_INIT_VARS
+#define FONT_HACK_CALC_DIMS
+#define FONT_HACK_CALC_DIMS_AND_FETCH_IMAGE
+#define FONT_HACK_FETCH_IMAGE
+#define FONT_HACK_DRAW_IMAGE
+
+#endif
 
 void
 gdk_draw_point (GdkDrawable *drawable,
@@ -209,6 +299,12 @@
   GdkFontPrivate *font_private;
   GdkGCPrivate *gc_private;
 
+#if defined GTK_FONT_HACK
+  gint text_length = strlen(string);
+#endif  
+  
+  FONT_HACK_INIT_VARS;
+  
   g_return_if_fail (drawable != NULL);
   g_return_if_fail (font != NULL);
   g_return_if_fail (gc != NULL);
@@ -219,7 +315,14 @@
     return;
   gc_private = (GdkGCPrivate*) gc;
   font_private = (GdkFontPrivate*) font;
-
+  
+#if defined GTK_FONT_HACK
+  gdk_text_extents_unscaled( font, string, text_length, 0, 0,
+			     &width, &ascent, &descent );
+#endif
+  
+  FONT_HACK_CALC_DIMS_AND_FETCH_IMAGE;
+  
   if (font->type == GDK_FONT_FONT)
     {
       XFontStruct *xfont = (XFontStruct *) font_private->xfont;
@@ -244,6 +347,8 @@
     }
   else
     g_error("undefined font type\n");
+
+  FONT_HACK_DRAW_IMAGE;
 }
 
 /* gdk_draw_text
@@ -265,6 +370,8 @@
   GdkFontPrivate *font_private;
   GdkGCPrivate *gc_private;
 
+  FONT_HACK_INIT_VARS;
+  
   g_return_if_fail (drawable != NULL);
   g_return_if_fail (font != NULL);
   g_return_if_fail (gc != NULL);
@@ -276,6 +383,15 @@
   gc_private = (GdkGCPrivate*) gc;
   font_private = (GdkFontPrivate*) font;
 
+#if defined GTK_FONT_HACK
+
+  gdk_text_extents_unscaled( font, text, text_length, 0, 0,
+			     &width, &ascent, &descent );
+
+#endif
+
+  FONT_HACK_CALC_DIMS_AND_FETCH_IMAGE;
+  
   if (font->type == GDK_FONT_FONT)
     {
       XFontStruct *xfont = (XFontStruct *) font_private->xfont;
@@ -299,6 +415,8 @@
     }
   else
     g_error("undefined font type\n");
+
+  FONT_HACK_DRAW_IMAGE;
 }
 
 void
@@ -313,6 +431,8 @@
   GdkWindowPrivate *drawable_private;
   GdkFontPrivate *font_private;
   GdkGCPrivate *gc_private;
+  
+  FONT_HACK_INIT_VARS;
 
   g_return_if_fail (drawable != NULL);
   g_return_if_fail (font != NULL);
@@ -325,6 +445,15 @@
   gc_private = (GdkGCPrivate*) gc;
   font_private = (GdkFontPrivate*) font;
 
+#if defined GTK_FONT_HACK
+
+  gdk_text_extents_wc_unscaled( font, text, text_length, 0, 0,
+				&width, &ascent, &descent );
+  
+#endif
+  
+  FONT_HACK_CALC_DIMS_AND_FETCH_IMAGE;
+  
   if (font->type == GDK_FONT_FONT)
     {
       XFontStruct *xfont = (XFontStruct *) font_private->xfont;
@@ -359,6 +488,8 @@
     }
   else
     g_error("undefined font type\n");
+
+  FONT_HACK_DRAW_IMAGE;
 }
 
 void
@@ -512,3 +643,238 @@
 	      npoints,
 	      CoordModeOrigin);
 }
+
+#if defined GTK_FONT_HACK
+
+GdkImage*
+fetch_image_from( GdkDrawable* drawable, gint x, gint y, guint width, guint height )
+{
+  guint window_height;
+  guint window_width;
+  gint offset_x = 0;
+  gint offset_y = 0;
+  gint error;
+  
+  GdkImage* image;
+  GdkVisual* visual;
+  
+  g_return_val_if_fail( width != 0, NULL );
+  g_return_val_if_fail( height != 0, NULL );
+  g_return_val_if_fail( drawable != NULL, NULL );
+
+  visual = gdk_window_get_visual(drawable);
+  if ( !visual )
+    {
+      visual = gdk_window_get_visual( (GdkWindow*)&gdk_root_parent );
+    }
+  
+  gdk_window_get_size( drawable, &window_width, &window_height );
+  
+  
+  image = gdk_image_new( GDK_IMAGE_FASTEST,
+			 visual,
+			 width, height );
+
+  if ( !image )
+    {
+      g_error( "null from gdk_image_new!" );
+      return 0;
+    }
+  if ( x < 0  )
+    {
+      // font_hack_warning( "x subzero" );
+      offset_x = -x;
+      x = 0;
+    }
+  
+  if ( y < 0  )
+    {
+      // font_hack_warning( "y subzero" );
+      
+      y = 0;
+      offset_y = -y;
+    }
+  
+  
+  if ( x >= window_width )
+    {
+      // font_hack_warning( "x low out of bounds" );
+      return image;
+    }
+  if ( y >= window_height )
+    {
+      // font_hack_warning( "y low out of bounds" );
+      return image;
+    }
+
+  
+  if ( (x+width) >= window_width )
+    {
+      //font_hack_warning( "x high out of bounds" );
+      width = window_width - x;
+    }
+  
+  if ( (y+height) >= window_height )
+    {
+      //      font_hack_warning( "y high out of bounds" );
+      height = window_height - y;
+    }
+
+	  
+  gdk_error_trap_push();
+
+  gdk_image_get_subimage( image,
+			  drawable,
+			  x,
+			  y,
+			  width,
+			  height,
+			  offset_x,offset_y);
+  //  gdk_draw_rectangle( drawable, gdk_gc_new(drawable), 1, x,y, width, height );
+  //XSync( ((GdkWindowPrivate*)drawable)->xdisplay,0 );
+  //sleep(1);
+  
+  if ( (error = gdk_error_trap_pop()) != 0 )
+    {
+      char buf[64];
+	  
+      XGetErrorText ( ((GdkWindowPrivate*)drawable)->xdisplay, error, buf, 63);
+
+      font_hack_warning( "X error: dump follows" );
+      
+      g_print( "X error %d:%s\n", error, buf );
+      g_print( "x:%d y:%d width:%u height:%u\n",
+	       x,y, width, height );
+      g_print( "win width:%u win height:%u\n", window_width, window_height );
+      g_print( "rectangle (%d,%d) (%d,%d)\n", x,y, x+width, y+height );
+      
+      font_hack_warning( "X error trapped (don't panic!)" );
+      return 0;
+    }
+  
+  return image;
+}
+
+
+GdkPixmap*
+explode_image( GdkImage* source,
+	       guint orig_width,
+	       guint orig_height,
+	       GdkDrawable* drawable )
+{
+  GdkPixmap* exploded_pixmap;
+  GdkImage* exploded_image;
+
+  guint i,j;
+  guint little_x,little_y;
+  guint32 pixel;
+  GdkGC* gc;
+  GdkVisual* visual;
+  
+  guint exploded_width, exploded_height;
+
+  visual = gdk_window_get_visual(drawable);
+  if ( !visual )
+    {
+      visual = gdk_window_get_visual( (GdkWindow*)&gdk_root_parent );
+    }
+  exploded_width = orig_width*scale;
+  exploded_height = orig_height*scale*scale;
+  
+  exploded_pixmap = gdk_pixmap_new( drawable, exploded_width,
+				    exploded_height, visual->depth );
+
+	  
+  exploded_image = gdk_image_new( GDK_IMAGE_FASTEST,
+				  visual,
+				  exploded_width, exploded_height );
+
+
+  for( i=0; i<orig_width; i++ )
+    for( j=0; j<orig_height; j++ )
+      {
+		
+	pixel = gdk_image_get_pixel( source, i, j );
+		
+	for( little_y = 0; little_y < scale; little_y++ )
+	  for( little_x = 0; little_x < scale; little_x++ )
+	    {
+	      gdk_image_put_pixel( exploded_image,
+				   (i*scale)+little_x,
+				   (j*scale)+little_y, pixel );
+	    }
+      }
+
+  gc = gdk_gc_new( drawable );
+	  
+  gdk_draw_image(exploded_pixmap,
+		 gc,
+		 exploded_image,
+		 0,
+		 0,
+		 0,
+		 0,
+		 exploded_width,
+		 exploded_height );
+
+  gdk_gc_destroy( gc );
+  gdk_image_destroy( exploded_image );
+
+  return exploded_pixmap;
+}
+
+void
+condense_pixmap( GdkPixmap* exploded_pixmap,
+		 guint condensed_width, guint condensed_height,
+		 GdkImage* condensed_image )
+{
+  GdkImage* exploded_image;
+  guint j,i;
+  guint red,green,blue;
+  guint32 pixel;
+  guint little_x,little_y;
+  
+  guint exploded_width, exploded_height;
+
+  exploded_width = condensed_width * scale;
+  exploded_height = condensed_height * scale;
+
+  exploded_image = gdk_image_get( exploded_pixmap, 0,0, exploded_width,
+				  exploded_height );
+  
+  for( j=0; j < condensed_height; j++ )
+    {
+      for( i=0; i < condensed_width; i++ )
+	{
+	  red = 0;
+	  green = 0;
+	  blue = 0;
+		  
+	  for( little_y = 0; little_y < scale; little_y ++ )
+	    for( little_x = 0; little_x < scale; little_x ++ )
+	      {
+			
+		pixel = gdk_image_get_pixel( exploded_image,
+					     (i*scale)+little_x,
+					     (j*scale)+little_y );
+		red += ((pixel >> 16) & 0xff);
+		green += ((pixel >> 8) & 0xff);
+		blue += (pixel & 0xff);
+	      }
+
+	  red /= (scale*scale);
+	  green /= (scale*scale);
+	  blue /= (scale*scale);
+		  
+	  pixel = ((red << 16)
+		   | (green << 8 )
+		   | blue );
+		  
+	  gdk_image_put_pixel( condensed_image, i, j, pixel );
+	}
+    }
+
+  gdk_image_destroy( exploded_image );
+}
+
+#endif
diff --recursive --new-file --unified gtk+-1.2.6.clean/gdk/gdkfont.c gtk+-1.2.6.font-hack/gdk/gdkfont.c
--- gtk+-1.2.6.clean/gdk/gdkfont.c	Sat Jan 22 15:29:17 2000
+++ gtk+-1.2.6.font-hack/gdk/gdkfont.c	Mon Jan 24 00:58:54 2000
@@ -24,11 +24,15 @@
  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
  */
 
+/* Font smooth hack: by John Fremlin <vii@altern.org> (http://altern.org/vii) */
+
 #include <X11/Xlib.h>
 #include <X11/Xos.h>
 #include "gdk.h"
 #include "gdkprivate.h"
 
+#include "gdkfonthack.h"
+
 static GHashTable *font_name_hash = NULL;
 static GHashTable *fontset_name_hash = NULL;
 
@@ -122,8 +126,9 @@
  
       font = (GdkFont*) private;
       font->type = GDK_FONT_FONT;
-      font->ascent =  xfont->ascent;
-      font->descent = xfont->descent;
+
+      font->ascent =  scale_down(xfont->ascent);
+      font->descent = scale_down(xfont->descent);
 
       gdk_xid_table_insert (&xfont->fid, font);
     }
@@ -295,6 +300,13 @@
 gdk_string_width (GdkFont     *font,
 		  const gchar *string)
 {
+  return scale_down( gdk_string_width_unscaled(font,string) );
+}
+
+gint
+gdk_string_width_unscaled (GdkFont     *font,
+		  const gchar *string)
+{
   GdkFontPrivate *font_private;
   gint width;
   XFontStruct *xfont;
@@ -329,11 +341,21 @@
   return width;
 }
 
+
 gint
 gdk_text_width (GdkFont      *font,
 		const gchar  *text,
 		gint          text_length)
 {
+  return scale_down( gdk_text_width_unscaled(font, text, text_length) );
+}
+
+
+gint
+gdk_text_width_unscaled (GdkFont      *font,
+		const gchar  *text,
+		gint          text_length)
+{
   GdkFontPrivate *private;
   gint width;
   XFontStruct *xfont;
@@ -367,11 +389,21 @@
   return width;
 }
 
+
 gint
 gdk_text_width_wc (GdkFont	  *font,
 		   const GdkWChar *text,
 		   gint		   text_length)
 {
+  return scale_down( gdk_text_width_wc_unscaled( font, text, text_length ) );
+}
+
+
+gint
+gdk_text_width_wc_unscaled (GdkFont	  *font,
+		   const GdkWChar *text,
+		   gint		   text_length)
+{
   GdkFontPrivate *private;
   gint width;
   XFontStruct *xfont;
@@ -428,6 +460,13 @@
 gdk_char_width (GdkFont *font,
 		gchar    character)
 {
+  return scale_down( gdk_char_width_unscaled( font, character ) );
+}
+
+gint
+gdk_char_width_unscaled (GdkFont *font,
+		gchar    character)
+{
   GdkFontPrivate *private;
   XCharStruct *chars;
   gint width;
@@ -470,10 +509,18 @@
   return width;
 }
 
+
 gint
 gdk_char_width_wc (GdkFont *font,
 		   GdkWChar character)
 {
+  return scale_down( gdk_char_width_wc_unscaled( font, character ));
+}
+
+gint
+gdk_char_width_wc_unscaled (GdkFont *font,
+			    GdkWChar character)
+{
   GdkFontPrivate *private;
   XCharStruct *chars;
   gint width;
@@ -520,18 +567,27 @@
   return width;
 }
 
-gint
-gdk_string_measure (GdkFont     *font,
-                    const gchar *string)
+void
+gdk_text_extents (GdkFont     *font,
+                  const gchar *text,
+                  gint         text_length,
+		  gint        *lbearing,
+		  gint        *rbearing,
+		  gint        *width,
+		  gint        *ascent,
+		  gint        *descent)
 {
-  g_return_val_if_fail (font != NULL, -1);
-  g_return_val_if_fail (string != NULL, -1);
-
-  return gdk_text_measure (font, string, strlen (string));
+  gdk_text_extents_unscaled( font, text, text_length, lbearing, rbearing,
+			     width, ascent, descent );
+  scale_down_ptr( width );
+  scale_down_ptr( ascent );
+  scale_down_ptr( descent );
+  scale_down_ptr( lbearing );
+  scale_down_ptr( rbearing );
 }
 
 void
-gdk_text_extents (GdkFont     *font,
+gdk_text_extents_unscaled (GdkFont     *font,
                   const gchar *text,
                   gint         text_length,
 		  gint        *lbearing,
@@ -609,6 +665,28 @@
 		     gint           *ascent,
 		     gint           *descent)
 {
+  gdk_text_extents_wc_unscaled( font,
+		       text, text_length,
+		       lbearing, rbearing, width, ascent, descent );
+
+  scale_down_ptr( width );
+  scale_down_ptr( ascent );
+  scale_down_ptr( descent );
+  scale_down_ptr( lbearing );
+  scale_down_ptr( rbearing );
+}
+
+
+void
+gdk_text_extents_wc_unscaled (GdkFont        *font,
+		     const GdkWChar *text,
+		     gint            text_length,
+		     gint           *lbearing,
+		     gint           *rbearing,
+		     gint           *width,
+		     gint           *ascent,
+		     gint           *descent)
+{
   GdkFontPrivate *private;
   XCharStruct overall;
   XFontStruct *xfont;
@@ -707,6 +785,14 @@
                   const gchar *text,
                   gint         text_length)
 {
+  return gdk_text_measure_unscaled( font,text,text_length );
+}
+
+gint
+gdk_text_measure_unscaled (GdkFont     *font,
+                  const gchar *text,
+                  gint         text_length)
+{
   GdkFontPrivate *private;
   XCharStruct overall;
   XFontStruct *xfont;
@@ -770,11 +856,21 @@
   return gdk_text_height (font, string, strlen (string));
 }
 
+
 gint
 gdk_text_height (GdkFont     *font,
 		 const gchar *text,
 		 gint         text_length)
 {
+  return scale_down( gdk_text_height_unscaled( font, text, text_length ) );
+}
+
+
+gint
+gdk_text_height_unscaled (GdkFont     *font,
+		 const gchar *text,
+		 gint         text_length)
+{
   GdkFontPrivate *private;
   XCharStruct overall;
   XFontStruct *xfont;
@@ -827,3 +923,14 @@
 
   return gdk_text_height (font, &character, 1);
 }
+
+gint
+gdk_string_measure (GdkFont     *font,
+                    const gchar *string)
+{
+  g_return_val_if_fail (font != NULL, -1);
+  g_return_val_if_fail (string != NULL, -1);
+
+  return gdk_text_measure (font, string, strlen (string));
+}
+
diff --recursive --new-file --unified gtk+-1.2.6.clean/gdk/gdkfonthack.h gtk+-1.2.6.font-hack/gdk/gdkfonthack.h
--- gtk+-1.2.6.clean/gdk/gdkfonthack.h	Thu Jan  1 01:00:00 1970
+++ gtk+-1.2.6.font-hack/gdk/gdkfonthack.h	Mon Jan 24 01:00:22 2000
@@ -0,0 +1,99 @@
+/* Font smooth hack: by John Fremlin <vii@altern.org> (http://altern.org/vii) */
+
+#ifndef __GDK_FONTHACK_H__
+#define __GDK_FONTHACK_H__
+
+#include "gdk.h"
+
+#ifdef HAVE_CONFIG_H
+#include "config.h" /* for inline */
+#endif
+
+#define GTK_FONT_HACK
+
+#if defined GTK_FONT_HACK
+
+#define font_hack_warning(string)   g_warning( "gdk font hack:%s:%u: %s", __FILE__, __LINE__, (string) )
+
+static const unsigned scale = 2;
+
+gint
+gdk_string_width_unscaled (GdkFont     *font,
+		       const gchar *string);
+
+gint
+gdk_text_width_unscaled (GdkFont      *font,
+		     const gchar  *text,
+		     gint          text_length);
+
+
+gint
+gdk_text_width_wc_unscaled (GdkFont	  *font,
+			const GdkWChar *text,
+			gint		   text_length);
+
+gint
+gdk_char_width_unscaled (GdkFont *font,
+		     gchar    character);
+
+gint
+gdk_char_width_wc_unscaled (GdkFont *font,
+			GdkWChar character);
+
+void
+gdk_text_extents_unscaled (GdkFont     *font,
+		       const gchar *text,
+		       gint         text_length,
+		       gint        *lbearing,
+		       gint        *rbearing,
+		       gint        *width,
+		       gint        *ascent,
+		       gint        *descent);
+
+void
+gdk_text_extents_wc_unscaled (GdkFont        *font,
+			  const GdkWChar *text,
+			  gint            text_length,
+			  gint           *lbearing,
+			  gint           *rbearing,
+			  gint           *width,
+			  gint           *ascent,
+			  gint           *descent);
+
+gint
+gdk_text_measure_unscaled (GdkFont     *font,
+		       const gchar *text,
+		       gint         text_length);
+
+gint
+gdk_text_height_unscaled (GdkFont     *font,
+		      const gchar *text,
+		      gint         text_length);
+
+
+inline
+static
+gint
+scale_down( gint length )
+{
+  return ((length+scale/2)/scale)+1;
+}
+
+inline
+static
+void
+scale_down_ptr( gint* length )
+{
+  if ( length )
+    *length = scale_down( *length );
+}
+#else
+
+#define scale_down(x) (x)
+#define scale_down_ptr(x)
+
+#define font_hack_warning(string)
+
+#endif //GTK_FONT_HACK
+
+#endif
diff --recursive --new-file --unified gtk+-1.2.6.clean/gdk/gdkimage.c gtk+-1.2.6.font-hack/gdk/gdkimage.c
--- gtk+-1.2.6.clean/gdk/gdkimage.c	Sat Jan 22 15:29:17 2000
+++ gtk+-1.2.6.font-hack/gdk/gdkimage.c	Sat Jan 22 15:27:28 2000
@@ -347,6 +347,8 @@
 			       win_private->xwindow,
 			       x, y, width, height,
 			       AllPlanes, ZPixmap);
+  if( !private->ximage )
+    return NULL;
 
   image->type = GDK_IMAGE_NORMAL;
   image->visual = gdk_window_get_visual (window);
@@ -361,6 +363,39 @@
 
   return image;
 }
+
+void
+gdk_image_get_subimage (GdkImage* image,
+			GdkWindow *window,
+			gint x,
+			gint y,
+			gint width,
+			gint height,
+			gint dest_x,
+			gint dest_y
+			)
+{
+  GdkImagePrivate *private;
+  GdkWindowPrivate *win_private;
+
+  g_return_if_fail (window != NULL);
+  g_return_if_fail (image != NULL);
+
+  win_private = (GdkWindowPrivate *) window;
+  if (win_private->destroyed)
+    return;
+
+  private = (GdkImagePrivate*)image;
+
+   XGetSubImage
+    (private->xdisplay,
+     win_private->xwindow,
+     x, y, width, height,
+     AllPlanes, ZPixmap,
+     private->ximage, dest_x,
+     dest_y );
+}
+
 
 guint32
 gdk_image_get_pixel (GdkImage *image,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]