diff options
| author | Graeme Gregory <dp@xora.org.uk> | 2008-01-24 09:50:12 +0000 |
|---|---|---|
| committer | Graeme Gregory <dp@xora.org.uk> | 2008-01-24 09:50:12 +0000 |
| commit | 2cce07bb173c6459a142c5e66855de8c1b6daa44 (patch) | |
| tree | 8a429cf8c013869212f5b144ec706ef8d84144c7 | |
| parent | b370c2f42b70872caba6f025b19236da97411376 (diff) | |
gtk+_2.12.3.bb : latest gtk+, re-enabled cups plugin as its been
bugfixed.
| -rw-r--r-- | packages/gtk+/gtk+-2.12.3/.mtn2git_empty | 0 | ||||
| -rw-r--r-- | packages/gtk+/gtk+-2.12.3/cellrenderer-cairo.patch | 32 | ||||
| -rw-r--r-- | packages/gtk+/gtk+-2.12.3/combo-arrow-size.patch | 67 | ||||
| -rw-r--r-- | packages/gtk+/gtk+-2.12.3/disable-print.patch | 26 | ||||
| -rw-r--r-- | packages/gtk+/gtk+-2.12.3/entry-cairo.patch | 103 | ||||
| -rw-r--r-- | packages/gtk+/gtk+-2.12.3/gtklabel-resize-patch | 10 | ||||
| -rw-r--r-- | packages/gtk+/gtk+-2.12.3/hardcoded_libtool.patch | 29 | ||||
| -rw-r--r-- | packages/gtk+/gtk+-2.12.3/menu-deactivate.patch | 51 | ||||
| -rw-r--r-- | packages/gtk+/gtk+-2.12.3/no-demos.patch | 10 | ||||
| -rw-r--r-- | packages/gtk+/gtk+-2.12.3/pangoxft2.10.6.diff | 2456 | ||||
| -rw-r--r-- | packages/gtk+/gtk+-2.12.3/range-no-redraw.patch | 127 | ||||
| -rw-r--r-- | packages/gtk+/gtk+-2.12.3/run-iconcache.patch | 19 | ||||
| -rw-r--r-- | packages/gtk+/gtk+-2.12.3/scrolled-placement.patch | 22 | ||||
| -rw-r--r-- | packages/gtk+/gtk+-2.12.3/toggle-font.diff | 100 | ||||
| -rw-r--r-- | packages/gtk+/gtk+-2.12.3/xsettings.patch | 16 | ||||
| -rw-r--r-- | packages/gtk+/gtk+_2.12.3.bb | 48 |
16 files changed, 3116 insertions, 0 deletions
diff --git a/packages/gtk+/gtk+-2.12.3/.mtn2git_empty b/packages/gtk+/gtk+-2.12.3/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/gtk+/gtk+-2.12.3/.mtn2git_empty diff --git a/packages/gtk+/gtk+-2.12.3/cellrenderer-cairo.patch b/packages/gtk+/gtk+-2.12.3/cellrenderer-cairo.patch new file mode 100644 index 0000000000..4439e69fb6 --- /dev/null +++ b/packages/gtk+/gtk+-2.12.3/cellrenderer-cairo.patch @@ -0,0 +1,32 @@ +Index: gtk/gtkcellrenderer.c +=================================================================== +RCS file: /cvs/gnome/gtk+/gtk/gtkcellrenderer.c,v +retrieving revision 1.55 +diff -u -r1.55 gtkcellrenderer.c +--- gtk/gtkcellrenderer.c 14 May 2006 04:25:28 -0000 1.55 ++++ gtk/gtkcellrenderer.c 30 Jun 2006 10:57:43 -0000 +@@ -551,6 +551,7 @@ + + if (cell->cell_background_set && !selected) + { ++#ifdef USE_CAIRO_INTERNALLY + cairo_t *cr = gdk_cairo_create (window); + + gdk_cairo_rectangle (cr, background_area); +@@ -558,6 +559,16 @@ + cairo_fill (cr); + + cairo_destroy (cr); ++#else ++ GdkGC *gc; ++ ++ gc = gdk_gc_new (window); ++ gdk_gc_set_rgb_fg_color (gc, &priv->cell_background); ++ gdk_draw_rectangle (window, gc, TRUE, ++ background_area->x, background_area->y, ++ background_area->width, background_area->height); ++ g_object_unref (gc); ++#endif + } + + GTK_CELL_RENDERER_GET_CLASS (cell)->render (cell, diff --git a/packages/gtk+/gtk+-2.12.3/combo-arrow-size.patch b/packages/gtk+/gtk+-2.12.3/combo-arrow-size.patch new file mode 100644 index 0000000000..d44c454ce3 --- /dev/null +++ b/packages/gtk+/gtk+-2.12.3/combo-arrow-size.patch @@ -0,0 +1,67 @@ +Index: gtk/gtkcombobox.c +=================================================================== +RCS file: /cvs/gnome/gtk+/gtk/gtkcombobox.c,v +retrieving revision 1.185 +diff -u -p -r1.185 gtkcombobox.c +--- gtk/gtkcombobox.c 12 Oct 2006 13:48:07 -0000 1.185 ++++ gtk/gtkcombobox.c 1 Nov 2006 19:01:09 -0000 +@@ -756,6 +756,25 @@ gtk_combo_box_class_init (GtkComboBoxCla + FALSE, + GTK_PARAM_READABLE)); + ++ /** ++ * GtkComboBox:arrow-size: ++ * ++ * Sets the minimum size of the arrow in the combo box. Note ++ * that the arrow size is coupled to the font size, so in case ++ * a larger font is used, the arrow will be larger than set ++ * by arrow size. ++ * ++ * Since: 2.12 ++ */ ++ gtk_widget_class_install_style_property (widget_class, ++ g_param_spec_int ("arrow-size", ++ P_("Arrow Size"), ++ P_("The minimum size of the arrow in the combo box"), ++ 0, ++ G_MAXINT, ++ 15, ++ GTK_PARAM_READABLE)); ++ + g_type_class_add_private (object_class, sizeof (GtkComboBoxPrivate)); + } + +@@ -1897,7 +1916,12 @@ gtk_combo_box_size_request (GtkWidget + { + gint width, height; + gint focus_width, focus_pad; ++ gint font_size; ++ gint arrow_size; + GtkRequisition bin_req; ++ PangoContext *context; ++ PangoFontMetrics *metrics; ++ PangoFontDescription *font_desc; + + GtkComboBox *combo_box = GTK_COMBO_BOX (widget); + +@@ -1910,7 +1934,20 @@ gtk_combo_box_size_request (GtkWidget + gtk_widget_style_get (GTK_WIDGET (widget), + "focus-line-width", &focus_width, + "focus-padding", &focus_pad, ++ "arrow-size", &arrow_size, + NULL); ++ ++ font_desc = GTK_BIN (widget)->child->style->font_desc; ++ context = gtk_widget_get_pango_context (widget); ++ metrics = pango_context_get_metrics (context, font_desc, ++ pango_context_get_language (context)); ++ font_size = PANGO_PIXELS (pango_font_metrics_get_ascent (metrics) + ++ pango_font_metrics_get_descent (metrics)); ++ pango_font_metrics_unref (metrics); ++ ++ arrow_size = MAX (arrow_size, font_size); ++ ++ gtk_widget_set_size_request (combo_box->priv->arrow, arrow_size, arrow_size); + + if (!combo_box->priv->tree_view) + { diff --git a/packages/gtk+/gtk+-2.12.3/disable-print.patch b/packages/gtk+/gtk+-2.12.3/disable-print.patch new file mode 100644 index 0000000000..21a4be4da8 --- /dev/null +++ b/packages/gtk+/gtk+-2.12.3/disable-print.patch @@ -0,0 +1,26 @@ +--- gtk+-2.12.0/configure.in~ 2006-07-05 18:11:44.000000000 +0200 ++++ gtk+-2.12.0/configure.in 2006-07-05 18:11:44.000000000 +0200 +@@ -1554,22 +1554 @@ +-AC_PATH_PROG(CUPS_CONFIG, cups-config, no) +-if test "x$CUPS_CONFIG" != "xno"; then +- CUPS_CFLAGS=`cups-config --cflags | sed 's/-O[0-9]*//' | sed 's/-m[^\t]*//g'` +- CUPS_LIBS=`cups-config --libs` +- +- CUPS_API_VERSION=`cups-config --api-version` +- CUPS_API_MAJOR=`echo -n $CUPS_API_VERSION | awk -F. '{print $1}'` +- CUPS_API_MINOR=`echo -n $CUPS_API_VERSION | awk -F. '{print $2}'` +- +- if test $CUPS_API_MAJOR -gt 1 -o \ +- $CUPS_API_MAJOR -eq 1 -a $CUPS_API_MINOR -ge 2; then +- AC_DEFINE(HAVE_CUPS_API_1_2) +- fi +- +- AC_SUBST(CUPS_API_MAJOR) +- AC_SUBST(CUPS_API_MINOR) +- AC_SUBST(CUPS_CFLAGS) +- AC_SUBST(CUPS_LIBS) +- +- AC_CHECK_HEADER(cups/cups.h,,AC_MSG_ERROR([[*** Sorry, cups-config present but cups/cups.h missing.]])) +-fi +-AM_CONDITIONAL(HAVE_CUPS, test "x$CUPS_CONFIG" != "xno") ++AM_CONDITIONAL(HAVE_CUPS, false) diff --git a/packages/gtk+/gtk+-2.12.3/entry-cairo.patch b/packages/gtk+/gtk+-2.12.3/entry-cairo.patch new file mode 100644 index 0000000000..3313e7f132 --- /dev/null +++ b/packages/gtk+/gtk+-2.12.3/entry-cairo.patch @@ -0,0 +1,103 @@ +Index: gtk/gtkentry.c +=================================================================== +RCS file: /cvs/gnome/gtk+/gtk/gtkentry.c,v +retrieving revision 1.317 +diff -u -r1.317 gtkentry.c +--- gtk/gtkentry.c 29 Jun 2006 09:18:05 -0000 1.317 ++++ gtk/gtkentry.c 2 Jul 2006 14:14:24 -0000 +@@ -3337,7 +3337,9 @@ + if (GTK_WIDGET_DRAWABLE (entry)) + { + PangoLayout *layout = gtk_entry_ensure_layout (entry, TRUE); ++#ifdef USE_CAIRO_INTERNALLY + cairo_t *cr; ++#endif + gint x, y; + gint start_pos, end_pos; + +@@ -3345,23 +3347,35 @@ + + get_layout_position (entry, &x, &y); + ++#ifdef USE_CAIRO_INTERNALLY + cr = gdk_cairo_create (entry->text_area); + + cairo_move_to (cr, x, y); + gdk_cairo_set_source_color (cr, &widget->style->text [widget->state]); + pango_cairo_show_layout (cr, layout); ++#else ++ gdk_draw_layout (entry->text_area, widget->style->text_gc [widget->state], ++ x, y, ++ layout); ++#endif + + if (gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &start_pos, &end_pos)) + { + gint *ranges; + gint n_ranges, i; + PangoRectangle logical_rect; +- GdkColor *selection_color, *text_color; + GtkBorder inner_border; ++#ifdef USE_CAIRO_INTERNALLY ++ GdkColor *selection_color, *text_color; ++#else ++ GdkGC *selection_gc, *text_gc; ++ GdkRegion *clip_region; ++#endif + + pango_layout_get_pixel_extents (layout, NULL, &logical_rect); + gtk_entry_get_pixel_ranges (entry, &ranges, &n_ranges); + ++#ifdef USE_CAIRO_INTERNALLY + if (GTK_WIDGET_HAS_FOCUS (entry)) + { + selection_color = &widget->style->base [GTK_STATE_SELECTED]; +@@ -3390,11 +3404,46 @@ + cairo_move_to (cr, x, y); + gdk_cairo_set_source_color (cr, text_color); + pango_cairo_show_layout (cr, layout); +- ++#else ++ if (GTK_WIDGET_HAS_FOCUS (entry)) ++ { ++ selection_gc = widget->style->base_gc [GTK_STATE_SELECTED]; ++ text_gc = widget->style->text_gc [GTK_STATE_SELECTED]; ++ } ++ else ++ { ++ selection_gc = widget->style->base_gc [GTK_STATE_ACTIVE]; ++ text_gc = widget->style->text_gc [GTK_STATE_ACTIVE]; ++ } ++ ++ clip_region = gdk_region_new (); ++ for (i = 0; i < n_ranges; ++i) ++ { ++ GdkRectangle rect; ++ ++ rect.x = inner_border.left - entry->scroll_offset + ranges[2 * i]; ++ rect.y = y; ++ rect.width = ranges[2 * i + 1]; ++ rect.height = logical_rect.height; ++ ++ gdk_draw_rectangle (entry->text_area, selection_gc, TRUE, ++ rect.x, rect.y, rect.width, rect.height); ++ ++ gdk_region_union_with_rect (clip_region, &rect); ++ } ++ ++ gdk_gc_set_clip_region (text_gc, clip_region); ++ gdk_draw_layout (entry->text_area, text_gc, ++ x, y, ++ layout); ++ gdk_gc_set_clip_region (text_gc, NULL); ++ gdk_region_destroy (clip_region); ++#endif + g_free (ranges); + } +- ++#ifdef USE_CAIRO_INTERNALLY + cairo_destroy (cr); ++#endif + } + } + diff --git a/packages/gtk+/gtk+-2.12.3/gtklabel-resize-patch b/packages/gtk+/gtk+-2.12.3/gtklabel-resize-patch new file mode 100644 index 0000000000..df29656343 --- /dev/null +++ b/packages/gtk+/gtk+-2.12.3/gtklabel-resize-patch @@ -0,0 +1,10 @@ +--- gtk+-2.4.3/gtk/gtklabel.c~ 2004-06-11 13:50:34.000000000 +0100 ++++ gtk+-2.4.3/gtk/gtklabel.c 2004-07-05 13:33:57.000000000 +0100 +@@ -1623,6 +1623,7 @@ + + /* We have to clear the layout, fonts etc. may have changed */ + gtk_label_clear_layout (label); ++ gtk_widget_queue_resize (GTK_WIDGET (label)); + } + + static void diff --git a/packages/gtk+/gtk+-2.12.3/hardcoded_libtool.patch b/packages/gtk+/gtk+-2.12.3/hardcoded_libtool.patch new file mode 100644 index 0000000000..6adb0cfef6 --- /dev/null +++ b/packages/gtk+/gtk+-2.12.3/hardcoded_libtool.patch @@ -0,0 +1,29 @@ +--- /tmp/configure.in 2007-01-08 17:50:49.000000000 +0100 ++++ gtk+-2.10.7/configure.in 2007-01-08 17:52:33.495251000 +0100 +@@ -371,7 +371,7 @@ + case $enable_explicit_deps in + auto) + export SED +- deplibs_check_method=`(./libtool --config; echo 'eval echo $deplibs_check_method') | sh` ++ deplibs_check_method=`(./$host_alias-libtool --config; echo 'eval echo $deplibs_check_method') | sh` + if test "x$deplibs_check_method" '!=' xpass_all || test "x$enable_static" = xyes ; then + enable_explicit_deps=yes + else +@@ -773,7 +773,7 @@ + dnl Now we check to see if our libtool supports shared lib deps + dnl (in a rather ugly way even) + if $dynworks; then +- pixbuf_libtool_config="${CONFIG_SHELL-/bin/sh} ./libtool --config" ++ pixbuf_libtool_config="${CONFIG_SHELL-/bin/sh} ./$host_alias-libtool --config" + pixbuf_deplibs_check=`$pixbuf_libtool_config | \ + grep '^[[a-z_]]*check[[a-z_]]*_method=[['\''"]]' | \ + sed 's/.*[['\''"]]\(.*\)[['\''"]]$/\1/'` +@@ -1611,7 +1611,7 @@ + # We are using gmodule-no-export now, but I'm leaving the stripping + # code in place for now, since pango and atk still require gmodule. + export SED +-export_dynamic=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh` ++export_dynamic=`(./$host_alias-libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh` + if test -n "$export_dynamic"; then + GDK_PIXBUF_DEP_LIBS=`echo $GDK_PIXBUF_DEP_LIBS | sed -e "s/$export_dynamic//"` + GDK_PIXBUF_XLIB_DEP_LIBS=`echo $GDK_PIXBUF_XLIB_DEP_LIBS | sed -e "s/$export_dynamic//"` diff --git a/packages/gtk+/gtk+-2.12.3/menu-deactivate.patch b/packages/gtk+/gtk+-2.12.3/menu-deactivate.patch new file mode 100644 index 0000000000..cfb8849e9f --- /dev/null +++ b/packages/gtk+/gtk+-2.12.3/menu-deactivate.patch @@ -0,0 +1,51 @@ +--- gtk+-2.10.0/gtk/gtkmenushell.c.orig 2006-07-05 17:17:34.000000000 +0200 ++++ gtk+-2.10.0/gtk/gtkmenushell.c 2006-07-05 17:19:01.000000000 +0200 +@@ -42,7 +42,7 @@ + #include "gtkintl.h" + #include "gtkalias.h" + +-#define MENU_SHELL_TIMEOUT 500 ++#define MENU_SHELL_TIMEOUT 2000 + + #define PACK_DIRECTION(m) \ + (GTK_IS_MENU_BAR (m) \ +@@ -203,6 +203,8 @@ + + G_DEFINE_TYPE (GtkMenuShell, gtk_menu_shell, GTK_TYPE_CONTAINER) + ++static int last_crossing_time; ++ + static void + gtk_menu_shell_class_init (GtkMenuShellClass *klass) + { +@@ -517,6 +519,7 @@ + gtk_grab_add (GTK_WIDGET (menu_shell)); + menu_shell->have_grab = TRUE; + menu_shell->active = TRUE; ++ last_crossing_time = 0; + } + } + +@@ -669,6 +672,13 @@ + menu_shell->activate_time = 0; + deactivate = FALSE; + } ++ ++ if (last_crossing_time != 0 ++ && ((event->time - last_crossing_time) < 500)) ++ { ++ last_crossing_time = 0; ++ deactivate = FALSE; ++ } + + if (deactivate) + { +@@ -716,6 +726,8 @@ + { + menu_item = gtk_get_event_widget ((GdkEvent*) event); + ++ last_crossing_time = event->time; ++ + if (!menu_item || + (GTK_IS_MENU_ITEM (menu_item) && + !_gtk_menu_item_is_selectable (menu_item))) diff --git a/packages/gtk+/gtk+-2.12.3/no-demos.patch b/packages/gtk+/gtk+-2.12.3/no-demos.patch new file mode 100644 index 0000000000..0fc4c48d1a --- /dev/null +++ b/packages/gtk+/gtk+-2.12.3/no-demos.patch @@ -0,0 +1,10 @@ +--- gtk+-2.10.1/Makefile.am.orig 2006-08-08 12:37:30.000000000 +0100 ++++ gtk+-2.10.1/Makefile.am 2006-08-08 12:37:48.000000000 +0100 +@@ -1,6 +1,6 @@ + ## Makefile.am for GTK+ + +-SRC_SUBDIRS = gdk-pixbuf gdk gtk modules demos tests perf contrib ++SRC_SUBDIRS = gdk-pixbuf gdk gtk modules tests perf contrib + SUBDIRS = po po-properties $(SRC_SUBDIRS) docs m4macros + + # require automake 1.4 diff --git a/packages/gtk+/gtk+-2.12.3/pangoxft2.10.6.diff b/packages/gtk+/gtk+-2.12.3/pangoxft2.10.6.diff new file mode 100644 index 0000000000..63828cec63 --- /dev/null +++ b/packages/gtk+/gtk+-2.12.3/pangoxft2.10.6.diff @@ -0,0 +1,2456 @@ +http://mail.gnome.org/archives/performance-list/2006-October/msg00063.html + +From: Xan Lópe +To: ext Matt Hoosier +Cc: performance-list gnome org +Subject: Re: [patch] Remove pangocairo from Gtk+ 2.8.20 +Date: Mon, 30 Oct 2006 14:31:56 +0200 +Hi, + +I've upgraded your patch against GTK+ 2.10.6, and we are getting great +performance figures compared to GTK+ 2.10.6 with pangocairo too +(basically at the level of GTK+ 2.6.10 again). Right now I'm working on +a python/cairo script to get some nice graphics from a torture test +session with several GTK+s, hope to get it ready soon. + +Index: gtk+-2.10.6/configure.in +=================================================================== +--- gtk+-2.10.6.orig/configure.in 2006-10-30 12:59:28.000000000 +0000 ++++ gtk+-2.10.6/configure.in 2006-10-30 12:59:30.000000000 +0000 +@@ -1435,7 +1435,7 @@ + if test "x$gdktarget" = "xwin32"; then + PANGO_PACKAGES="pangowin32 pangocairo" + else +- PANGO_PACKAGES="pango pangocairo" ++ PANGO_PACKAGES="pango pangocairo pangoxft" + fi + + AC_MSG_CHECKING(Pango flags) +Index: gtk+-2.10.6/gdk/gdkaliasdef.c +=================================================================== +--- gtk+-2.10.6.orig/gdk/gdkaliasdef.c 2006-10-30 12:58:29.000000000 +0000 ++++ gtk+-2.10.6/gdk/gdkaliasdef.c 2006-10-30 12:59:30.000000000 +0000 +@@ -1799,9 +1799,6 @@ + #undef gdk_pango_context_get + extern __typeof (gdk_pango_context_get) gdk_pango_context_get __attribute((alias("IA__gdk_pango_context_get"), visibility("default"))); + +-#undef gdk_pango_context_get_for_screen +-extern __typeof (gdk_pango_context_get_for_screen) gdk_pango_context_get_for_screen __attribute((alias("IA__gdk_pango_context_get_for_screen"), visibility("default"))); +- + #ifndef GDK_DISABLE_DEPRECATED + #undef gdk_pango_context_set_colormap + extern __typeof (gdk_pango_context_set_colormap) gdk_pango_context_set_colormap __attribute((alias("IA__gdk_pango_context_set_colormap"), visibility("default"))); +@@ -1836,6 +1833,13 @@ + + #endif + #endif ++#if IN_HEADER(__GDK_PANGO_H__) ++#if IN_FILE(__GDK_PANGO_X11_C__) ++#undef gdk_pango_context_get_for_screen ++extern __typeof (gdk_pango_context_get_for_screen) gdk_pango_context_get_for_screen __attribute((alias("IA__gdk_pango_context_get_for_screen"), visibility("default"))); ++ ++#endif ++#endif + #if IN_HEADER(__GDK_PIXBUF_H__) + #if IN_FILE(__GDK_PIXBUF_DRAWABLE_C__) + #undef gdk_pixbuf_get_from_drawable +Index: gtk+-2.10.6/gdk/gdkalias.h +=================================================================== +--- gtk+-2.10.6.orig/gdk/gdkalias.h 2006-10-30 12:58:29.000000000 +0000 ++++ gtk+-2.10.6/gdk/gdkalias.h 2006-10-30 12:59:30.000000000 +0000 +@@ -1796,9 +1796,6 @@ + extern __typeof (gdk_pango_context_get) IA__gdk_pango_context_get __attribute((visibility("hidden"))); + #define gdk_pango_context_get IA__gdk_pango_context_get + +-extern __typeof (gdk_pango_context_get_for_screen) IA__gdk_pango_context_get_for_screen __attribute((visibility("hidden"))); +-#define gdk_pango_context_get_for_screen IA__gdk_pango_context_get_for_screen +- + #ifndef GDK_DISABLE_DEPRECATED + extern __typeof (gdk_pango_context_set_colormap) IA__gdk_pango_context_set_colormap __attribute((visibility("hidden"))); + #define gdk_pango_context_set_colormap IA__gdk_pango_context_set_colormap +@@ -1833,6 +1830,13 @@ + + #endif + #endif ++#if IN_HEADER(__GDK_PANGO_H__) ++#if IN_FILE(__GDK_PANGO_X11_C__) ++extern __typeof (gdk_pango_context_get_for_screen) IA__gdk_pango_context_get_for_screen __attribute((visibility("hidden"))); ++#define gdk_pango_context_get_for_screen IA__gdk_pango_context_get_for_screen ++ ++#endif ++#endif + #if IN_HEADER(__GDK_PIXBUF_H__) + #if IN_FILE(__GDK_PIXBUF_DRAWABLE_C__) + extern __typeof (gdk_pixbuf_get_from_drawable) IA__gdk_pixbuf_get_from_drawable __attribute((visibility("hidden"))); +Index: gtk+-2.10.6/gdk/gdkdraw.c +=================================================================== +--- gtk+-2.10.6.orig/gdk/gdkdraw.c 2006-10-30 12:58:29.000000000 +0000 ++++ gtk+-2.10.6/gdk/gdkdraw.c 2006-10-30 12:59:30.000000000 +0000 +@@ -909,9 +909,9 @@ + { + g_return_if_fail (GDK_IS_DRAWABLE (drawable)); + g_return_if_fail (GDK_IS_GC (gc)); +- +- real_draw_glyphs (drawable, gc, NULL, font, +- x, y, glyphs); ++ ++ ++ GDK_DRAWABLE_GET_CLASS (drawable)->draw_glyphs (drawable, gc, font, x, y, glyphs); + } + + /** +@@ -949,8 +949,9 @@ + g_return_if_fail (GDK_IS_DRAWABLE (drawable)); + g_return_if_fail (GDK_IS_GC (gc)); + +- real_draw_glyphs (drawable, gc, matrix, font, +- x / PANGO_SCALE, y / PANGO_SCALE, glyphs); ++ if (GDK_DRAWABLE_GET_CLASS (drawable)->draw_glyphs_transformed) ++ GDK_DRAWABLE_GET_CLASS (drawable)->draw_glyphs_transformed (drawable, gc, matrix, ++ font, x, y, glyphs); + } + + /** +@@ -974,28 +975,12 @@ + GdkTrapezoid *trapezoids, + gint n_trapezoids) + { +- cairo_t *cr; +- int i; +- + g_return_if_fail (GDK_IS_DRAWABLE (drawable)); + g_return_if_fail (GDK_IS_GC (gc)); + g_return_if_fail (n_trapezoids == 0 || trapezoids != NULL); + +- cr = gdk_cairo_create (drawable); +- _gdk_gc_update_context (gc, cr, NULL, NULL, TRUE); +- +- for (i = 0; i < n_trapezoids; i++) +- { +- cairo_move_to (cr, trapezoids[i].x11, trapezoids[i].y1); +- cairo_line_to (cr, trapezoids[i].x21, trapezoids[i].y1); +- cairo_line_to (cr, trapezoids[i].x22, trapezoids[i].y2); +- cairo_line_to (cr, trapezoids[i].x21, trapezoids[i].y2); +- cairo_close_path (cr); +- } +- +- cairo_fill (cr); +- +- cairo_destroy (cr); ++ GDK_DRAWABLE_GET_CLASS (drawable)->draw_trapezoids (drawable, gc, ++ trapezoids, n_trapezoids); + } + + /** +Index: gtk+-2.10.6/gdk/gdkpango.c +=================================================================== +--- gtk+-2.10.6.orig/gdk/gdkpango.c 2006-10-30 12:58:29.000000000 +0000 ++++ gtk+-2.10.6/gdk/gdkpango.c 2006-10-30 12:59:30.000000000 +0000 +@@ -50,19 +50,34 @@ + GdkBitmap *stipple[MAX_RENDER_PART + 1]; + gboolean embossed; + +- cairo_t *cr; +- PangoRenderPart last_part; ++ /* When switching between the normal and shadow copies when ++ * drawing shadows we can get unexpected recursion into the ++ * drawing functions; the 'in_emboss' flag guards against that. ++ */ ++ gboolean in_emboss; + + /* Current target */ + GdkDrawable *drawable; + GdkGC *base_gc; + + gboolean gc_changed; ++ ++ /* Cached GC, derived from base_gc */ ++ GdkGC *gc; ++ PangoColor gc_color; ++ gboolean gc_color_set; ++ GdkBitmap *gc_stipple; ++ ++ /* we accumulate trapezoids for the same PangoRenderPart */ ++ GArray *trapezoids; ++ PangoRenderPart trapezoid_part; + }; + + static PangoAttrType gdk_pango_attr_stipple_type; + static PangoAttrType gdk_pango_attr_embossed_type; + ++static void flush_trapezoids (GdkPangoRenderer *gdk_renderer); ++ + enum { + PROP_0, + PROP_SCREEN +@@ -77,6 +92,10 @@ + GdkPangoRendererPrivate *priv = gdk_renderer->priv; + int i; + ++ if (priv->gc) ++ g_object_unref (priv->gc); ++ if (priv->gc_stipple) ++ g_object_unref (priv->gc_stipple); + if (priv->base_gc) + g_object_unref (priv->base_gc); + if (priv->drawable) +@@ -86,6 +105,8 @@ + if (priv->stipple[i]) + g_object_unref (priv->stipple[i]); + ++ g_array_free (priv->trapezoids, TRUE); ++ + G_OBJECT_CLASS (gdk_pango_renderer_parent_class)->finalize (object); + } + +@@ -112,25 +133,6 @@ + return object; + } + +-/* Adjusts matrix and color for the renderer to draw the secondary +- * "shadow" copy for embossed text */ +-static void +-emboss_context (cairo_t *cr) +-{ +- cairo_matrix_t tmp_matrix; +- +- /* The gymnastics here to adjust the matrix are because we want +- * to offset by +1,+1 in device-space, not in user-space, +- * so we can't just draw the layout at x + 1, y + 1 +- */ +- cairo_get_matrix (cr, &tmp_matrix); +- tmp_matrix.x0 += 1.0; +- tmp_matrix.y0 += 1.0; +- cairo_set_matrix (cr, &tmp_matrix); +- +- cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); +-} +- + static inline gboolean + color_equal (PangoColor *c1, PangoColor *c2) + { +@@ -146,74 +148,154 @@ + return FALSE; + } + +-static cairo_t * +-get_cairo_context (GdkPangoRenderer *gdk_renderer, +- PangoRenderPart part) ++/* Adjusts matrix and color for the renderer to draw the secondar ++ * "shadow" copy for embossed text */ ++static void ++emboss_renderer (PangoRenderer *renderer, ++ PangoRenderPart part, ++ PangoMatrix **save_matrix, ++ PangoColor **save_color) ++{ ++ GdkPangoRendererPrivate *priv = GDK_PANGO_RENDERER(renderer)->priv; ++ static const PangoColor white = { 0xffff, 0xffff, 0xffff }; ++ PangoMatrix tmp_matrix = PANGO_MATRIX_INIT; ++ ++ priv->in_emboss = TRUE; ++ ++ *save_color = pango_renderer_get_color (renderer, part); ++ if (*save_color) ++ *save_color = pango_color_copy (*save_color); ++ ++ *save_matrix = renderer->matrix; ++ if (*save_matrix) ++ { ++ *save_matrix = pango_matrix_copy (*save_matrix); ++ tmp_matrix = **save_matrix; ++ } ++ ++ /* The gymnastics here to adjust the matrix are because we want ++ * to offset by +1,+1 in device-space, not in user-space, ++ * so we can't just draw the layout at x + 1, y + 1 ++ */ ++ tmp_matrix.x0 += 1; ++ tmp_matrix.y0 += 1; ++ ++ pango_renderer_set_matrix (renderer, &tmp_matrix); ++ pango_renderer_set_color (renderer, part, &white); ++} ++ ++/* Restores from emboss_renderer() */ ++static void ++unemboss_renderer (PangoRenderer *renderer, ++ PangoRenderPart part, ++ PangoMatrix **save_matrix, ++ PangoColor **save_color) ++{ ++ GdkPangoRendererPrivate *priv = GDK_PANGO_RENDERER(renderer)->priv; ++ pango_renderer_set_matrix (renderer, *save_matrix); ++ pango_renderer_set_color (renderer, part, *save_color); ++ ++ if (*save_matrix) ++ pango_matrix_free (*save_matrix); ++ if (*save_color) ++ pango_color_free (*save_color); ++ ++ priv->in_emboss = FALSE; ++} ++ ++/* Gets the GC for drawing @part. This make involve copying the base GC ++ * for the renderer, in which case we keep a one-GC cache. */ ++static GdkGC * ++get_gc (GdkPangoRenderer *gdk_renderer, ++ PangoRenderPart part) + { + PangoRenderer *renderer = PANGO_RENDERER (gdk_renderer); ++ PangoColor *color; ++ GdkBitmap *stipple; + GdkPangoRendererPrivate *priv = gdk_renderer->priv; + +- if (!priv->cr) ++ color = pango_renderer_get_color (renderer, part); ++ ++ if (part <= MAX_RENDER_PART) ++ stipple = priv->stipple[part]; ++ else ++ stipple = NULL; ++ ++ if (!color && !stipple) /* nothing override, use base_gc */ ++ return priv->base_gc; ++ else + { +- const PangoMatrix *matrix; ++ gboolean new_stipple = FALSE; ++ gboolean new_color = FALSE; + +- priv->cr = gdk_cairo_create (priv->drawable); ++ if (stipple != priv->gc_stipple) ++ new_stipple = TRUE; + +- matrix = pango_renderer_get_matrix (renderer); +- if (matrix) ++ if ((priv->gc_color_set && !color) || ++ (!priv->gc_color_set && color) || ++ priv->gc_color.red != color->red || ++ priv->gc_color.green != color->green || ++ priv->gc_color.blue != color->blue) ++ new_color = TRUE; ++ ++ if (!priv->gc) + { +- cairo_matrix_t cairo_matrix; +- +- cairo_matrix_init (&cairo_matrix, +- matrix->xx, matrix->yx, +- matrix->xy, matrix->yy, +- matrix->x0, matrix->y0); +- cairo_set_matrix (priv->cr, &cairo_matrix); ++ priv->gc = gdk_gc_new (priv->drawable); ++ gdk_gc_copy (priv->gc, priv->base_gc); ++ } ++ else if (new_color && priv->gc_color_set && !color) ++ { ++ /* We have to recopy the original GC onto the cached GC ++ * to get the default color */ ++ new_stipple = TRUE; ++ gdk_gc_copy (priv->gc, priv->base_gc); ++ } ++ else if (new_stipple && priv->gc_stipple && !stipple) ++ { ++ /* Similarly, we need to make a new copy to restore to the ++ * default stipple state (the caller may have set a stipple ++ * on the GC, and even if not, gdk_gc_set_stipple (gc, NULL) ++ * doesn't work currently to restore to the default X stipple) */ ++ new_color = TRUE; ++ gdk_gc_copy (priv->gc, priv->base_gc); + } +- } +- +- if (part != priv->last_part) +- { +- PangoColor *pango_color; +- GdkColor *color; +- GdkColor tmp_color; +- gboolean changed; + +- pango_color = pango_renderer_get_color (renderer, part); +- +- if (priv->last_part != -1) +- changed = priv->gc_changed || +- priv->stipple[priv->last_part] != priv->stipple[part] || +- !color_equal (pango_color, +- pango_renderer_get_color (renderer, priv->last_part)); +- else +- changed = TRUE; +- +- if (changed) ++ if (new_color) + { +- if (pango_color) ++ if (color) + { +- tmp_color.red = pango_color->red; +- tmp_color.green = pango_color->green; +- tmp_color.blue = pango_color->blue; ++ GdkColor gdk_color; ++ ++ gdk_color.red = color->red; ++ gdk_color.green = color->green; ++ gdk_color.blue = color->blue; + +- color = &tmp_color; ++ gdk_gc_set_rgb_fg_color (priv->gc, &gdk_color); ++ ++ priv->gc_color = *color; ++ priv->gc_color_set = TRUE; + } + else +- color = NULL; ++ priv->gc_color_set = FALSE; ++ } + +- _gdk_gc_update_context (priv->base_gc, +- priv->cr, +- color, +- priv->stipple[part], +- priv->gc_changed); ++ if (new_stipple) ++ { ++ if (priv->gc_stipple) ++ g_object_unref (priv->gc_stipple); ++ ++ if (stipple) ++ { ++ gdk_gc_set_stipple (priv->gc, stipple); ++ gdk_gc_set_fill (priv->gc, GDK_STIPPLED); ++ priv->gc_stipple = g_object_ref (stipple); ++ } ++ else ++ priv->gc_stipple = NULL; + } + +- priv->last_part = part; +- priv->gc_changed = FALSE; ++ return priv->gc; + } +- +- return priv->cr; + } + + static void +@@ -225,133 +307,78 @@ + { + GdkPangoRenderer *gdk_renderer = GDK_PANGO_RENDERER (renderer); + GdkPangoRendererPrivate *priv = gdk_renderer->priv; +- cairo_t *cr; + +- cr = get_cairo_context (gdk_renderer, +- PANGO_RENDER_PART_FOREGROUND); ++ flush_trapezoids (gdk_renderer); + +- if (priv->embossed) ++ if (!priv->in_emboss && priv->embossed) + { +- cairo_save (cr); +- emboss_context (cr); +- cairo_move_to (cr, (double)x / PANGO_SCALE, (double)y / PANGO_SCALE); +- pango_cairo_show_glyph_string (cr, font, glyphs); +- cairo_restore (cr); +- } +- +- cairo_move_to (cr, (double)x / PANGO_SCALE, (double)y / PANGO_SCALE); +- pango_cairo_show_glyph_string (cr, font, glyphs); +-} +- +-/* Draws an error underline that looks like one of: +- * H E H +- * /\ /\ /\ /\ /\ - +- * A/ \ / \ / \ A/ \ / \ | +- * \ \ / \ / /D \ \ / \ | +- * \ \/ C \/ / \ \/ C \ | height = HEIGHT_SQUARES * square +- * \ /\ F / \ F /\ \ | +- * \ / \ / \ / \ \G | +- * \ / \ / \ / \ / | +- * \/ \/ \/ \/ - +- * B B +- * |----| +- * unit_width = (HEIGHT_SQUARES - 1) * square +- * +- * The x, y, width, height passed in give the desired bounding box; +- * x/width are adjusted to make the underline a integer number of units +- * wide. +- */ +-#define HEIGHT_SQUARES 2.5 ++ PangoMatrix *save_matrix; ++ PangoColor *save_color; + +-/* Cut-and-pasted between here and pango/pango/pangocairo-render.c */ ++ emboss_renderer (renderer, PANGO_RENDER_PART_FOREGROUND, &save_matrix, &save_color); ++ gdk_draw_glyphs_transformed (priv->drawable, ++ get_gc (gdk_renderer, PANGO_RENDER_PART_FOREGROUND), ++ renderer->matrix, font, x, y, glyphs); ++ unemboss_renderer (renderer, PANGO_RENDER_PART_FOREGROUND, &save_matrix, &save_color); ++ } ++ ++ gdk_draw_glyphs_transformed (priv->drawable, ++ get_gc (gdk_renderer, PANGO_RENDER_PART_FOREGROUND), ++ renderer->matrix, font, x, y, glyphs); ++} ++ ++/* Outputs any pending trapezoids, we do this when the part or ++ * part color changes, when we are about to draw text, etc. */ + static void +-draw_error_underline (cairo_t *cr, +- double x, +- double y, +- double width, +- double height) +-{ +- double square = height / HEIGHT_SQUARES; +- double unit_width = (HEIGHT_SQUARES - 1) * square; +- int width_units = (width + unit_width / 2) / unit_width; +- double y_top, y_bottom; +- int i; ++flush_trapezoids (GdkPangoRenderer *gdk_renderer) ++{ ++ GdkPangoRendererPrivate *priv = gdk_renderer->priv; + +- x += (width - width_units * unit_width) / 2; +- |
