rpms/gtk2/devel gtk2.spec, 1.115, 1.116 render-avoid-repeat.patch, 1.2, 1.3
fedora-cvs-commits at redhat.com
fedora-cvs-commits at redhat.com
Mon Feb 6 17:34:05 UTC 2006
Author: mclasen
Update of /cvs/dist/rpms/gtk2/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv18488
Modified Files:
gtk2.spec render-avoid-repeat.patch
Log Message:
Sync render fix
Index: gtk2.spec
===================================================================
RCS file: /cvs/dist/rpms/gtk2/devel/gtk2.spec,v
retrieving revision 1.115
retrieving revision 1.116
diff -u -r1.115 -r1.116
--- gtk2.spec 3 Feb 2006 05:28:12 -0000 1.115
+++ gtk2.spec 6 Feb 2006 17:34:01 -0000 1.116
@@ -16,7 +16,7 @@
Summary: The GIMP ToolKit (GTK+), a library for creating GUIs for X.
Name: gtk2
Version: %{base_version}
-Release: 3
+Release: 4
License: LGPL
Group: System Environment/Libraries
Source: gtk+-%{version}.tar.bz2
@@ -28,6 +28,7 @@
Patch1: gtk+-2.8.6-inputmethod.patch
Patch3: gtk+-2.8.10-set-invisible-char-to-bullet.patch
# Workaround for https://bugs.freedesktop.org/show_bug.cgi?id=4320
+# fixed in 2.8.12
Patch4: render-avoid-repeat.patch
BuildPrereq: atk-devel >= %{atk_version}
@@ -262,6 +263,9 @@
%doc tmpdocs/examples
%changelog
+* Mon Feb 6 2006 Matthias Clasen <mclasen at redhat.com> 2.8.11-4
+- Sync render fix with upstream
+
* Fri Feb 3 2006 Matthias Clasen <mclasen at redhat.com> 2.8.11-3
- Avoid a slowpath in XRender
render-avoid-repeat.patch:
gdkwindow.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 102 insertions(+), 25 deletions(-)
Index: render-avoid-repeat.patch
===================================================================
RCS file: /cvs/dist/rpms/gtk2/devel/render-avoid-repeat.patch,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- render-avoid-repeat.patch 3 Feb 2006 05:28:12 -0000 1.2
+++ render-avoid-repeat.patch 6 Feb 2006 17:34:01 -0000 1.3
@@ -1,34 +1,171 @@
--- gtk+-2.8.11/gdk/gdkwindow.c.render-avoid-repeat 2005-09-26 16:28:34.000000000 -0400
-+++ gtk+-2.8.11/gdk/gdkwindow.c 2006-02-03 00:27:26.000000000 -0500
-@@ -1746,6 +1746,10 @@
++++ gtk+-2.8.11/gdk/gdkwindow.c 2006-02-06 12:32:27.000000000 -0500
+@@ -1725,43 +1725,86 @@
+ RESTORE_GC (gc);
+ }
+
++typedef struct {
++ cairo_t *cr; /* if non-null, it means use this cairo context */
++ GdkGC *gc; /* if non-null, it means use this GC instead */
++} BackingRectMethod;
++
+ static void
+-gdk_window_set_bg_pattern (GdkWindow *window,
+- cairo_t *cr,
+- int x_offset,
+- int y_offset)
++setup_backing_rect_method (BackingRectMethod *method, GdkWindow *window, GdkWindowPaint *paint, int x_offset_cairo, int y_offset_cairo)
+ {
+ GdkWindowObject *private = (GdkWindowObject *)window;
+
+ if (private->bg_pixmap == GDK_PARENT_RELATIVE_BG && private->parent)
{
+- x_offset += private->x;
+- y_offset += private->y;
+- gdk_window_set_bg_pattern (GDK_WINDOW (private->parent), cr,
+- x_offset, y_offset);
+- }
+- else if (private->bg_pixmap &&
+- private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
+- private->bg_pixmap != GDK_NO_BG)
+- {
++ GdkWindowPaint tmp_paint;
++
++ tmp_paint = *paint;
++ tmp_paint.x_offset += private->x;
++ tmp_paint.y_offset += private->y;
++
++ x_offset_cairo += private->x;
++ y_offset_cairo += private->y;
++
++ setup_backing_rect_method (method, GDK_WINDOW (private->parent), &tmp_paint, x_offset_cairo, y_offset_cairo);
++ }
++ else if (private->bg_pixmap &&
++ private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
++ private->bg_pixmap != GDK_NO_BG)
++ {
++/* This is a workaround for https://bugs.freedesktop.org/show_bug.cgi?id=4320.
++ * In it, using a pixmap as a repeating pattern in Cairo, and painting it to a
++ * pixmap destination surface, can be very slow (on the order of seconds for a
++ * whole-screen copy). The workaround is to use pretty much the same code that
++ * we used in GTK+ 2.6 (pre-Cairo), which clears the double-buffer pixmap with
++ * a tiled GC XFillRectangle().
++ */
++
++/* Actually computing this flag is left as an exercise for the reader */
++#if defined (G_OS_UNIX)
++# define GDK_CAIRO_REPEAT_IS_FAST 0
++#else
++# define GDK_CAIRO_REPEAT_IS_FAST 1
++#endif
++
++#if GDK_CAIRO_REPEAT_IS_FAST
cairo_surface_t *surface = _gdk_drawable_ref_cairo_surface (private->bg_pixmap);
cairo_pattern_t *pattern = cairo_pattern_create_for_surface (surface);
-+
-+ gint pixmap_width, pixmap_height;
-+ gint window_width, window_height;
-+
cairo_surface_destroy (surface);
- if (x_offset != 0 || y_offset != 0)
-@@ -1755,7 +1759,19 @@
+- if (x_offset != 0 || y_offset != 0)
++ if (x_offset_cairo != 0 || y_offset_cairo != 0)
+ {
+ cairo_matrix_t matrix;
+- cairo_matrix_init_translate (&matrix, x_offset, y_offset);
++ cairo_matrix_init_translate (&matrix, x_offset_cairo, y_offset_cairo);
cairo_pattern_set_matrix (pattern, &matrix);
}
-- cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT);
-+ /* Workaround for a bug in Cairo and/or XRENDER: https://bugs.freedesktop.org/show_bug.cgi?id=4320
-+ *
-+ * Repeat fills with a pixmap pattern and a pixmap destination surface are
-+ * slow. So, we do a lame test for "do we actually need to repeat".
-+ */
-+ gdk_drawable_get_size (GDK_DRAWABLE (private->bg_pixmap),
-+ &pixmap_width, &pixmap_height);
-+ gdk_drawable_get_size (GDK_DRAWABLE (window),
-+ &window_width, &window_height);
-+ if (x_offset != 0 || y_offset != 0 ||
-+ pixmap_width < window_width || pixmap_height < window_height)
-+ cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT);
+ cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT);
+- cairo_set_source (cr, pattern);
+
- cairo_set_source (cr, pattern);
++ method->cr = cairo_create (paint->surface);
++ method->gc = NULL;
++
++ cairo_set_source (method->cr, pattern);
cairo_pattern_destroy (pattern);
++#else
++ guint gc_mask;
++ GdkGCValues gc_values;
++
++ gc_values.fill = GDK_TILED;
++ gc_values.tile = private->bg_pixmap;
++ gc_values.ts_x_origin = -x_offset_cairo;
++ gc_values.ts_y_origin = -y_offset_cairo;
++
++ gc_mask = GDK_GC_FILL | GDK_GC_TILE | GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN;
++
++ method->gc = gdk_gc_new_with_values (paint->pixmap, &gc_values, gc_mask);
++#endif
+ }
+ else
+ {
+- gdk_cairo_set_source_color (cr, &private->bg_color);
++ method->cr = cairo_create (paint->surface);
++
++ gdk_cairo_set_source_color (method->cr, &private->bg_color);
}
+ }
+
+@@ -1774,22 +1817,56 @@
+ {
+ GdkWindowObject *private = (GdkWindowObject *)window;
+ GdkWindowPaint *paint = private->paint_stack->data;
+- cairo_t *cr;
++ BackingRectMethod method;
++#if 0
++ GTimer *timer;
++ double elapsed;
++#endif
+
+ if (GDK_WINDOW_DESTROYED (window))
+ return;
+
+- cr = cairo_create (paint->surface);
++#if 0
++ timer = g_timer_new ();
++#endif
++
++ method.cr = NULL;
++ method.gc = NULL;
++ setup_backing_rect_method (&method, window, paint, 0, 0);
++
++ if (method.cr)
++ {
++ g_assert (method.gc == NULL);
++
++ cairo_rectangle (method.cr, x, y, width, height);
++ cairo_clip (method.cr);
+
+- gdk_window_set_bg_pattern (window, cr, 0, 0);
++ gdk_cairo_region (method.cr, paint->region);
++ cairo_fill (method.cr);
+
+- cairo_rectangle (cr, x, y, width, height);
+- cairo_clip (cr);
++ cairo_destroy (method.cr);
++#if 0
++ elapsed = g_timer_elapsed (timer, NULL);
++ g_print ("Draw the background with Cairo: %fs\n", elapsed);
++#endif
++ }
++ else
++ {
++ g_assert (method.gc != NULL);
+
+- gdk_cairo_region (cr, paint->region);
+- cairo_fill (cr);
++ gdk_gc_set_clip_region (method.gc, paint->region);
++ gdk_draw_rectangle (window, method.gc, TRUE, x, y, width, height);
++ g_object_unref (method.gc);
++
++#if 0
++ elapsed = g_timer_elapsed (timer, NULL);
++ g_print ("Draw the background with GDK: %fs\n", elapsed);
++#endif
++ }
+
+- cairo_destroy (cr);
++#if 0
++ g_timer_destroy (timer);
++#endif
+ }
+
+ /**
More information about the fedora-cvs-commits
mailing list