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> 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 (http://altern.org/vii) */ + #include #include #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 (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,