1
From 8deda13e5f9b5611387dcd1724bfdcac83f07255 Mon Sep 17 00:00:00 2001
2
From: Michael Natterer <mitch@gimp.org>
3
Date: Mon, 28 Jun 2010 10:23:31 +0000
4
Subject: Make cairo code work with newer cairo backends that actually use caching
6
Call cairo_surface_flush() before reading or writing a surface's
7
pixels directly, and use cairo_surface_mark_dirty() after writing
8
pixels directly, so we don't read old pixels, and our written pixels
10
(manually cherry-picked from fad6053643482e222e246c2db828182b4f2a8c7f)
12
diff --git a/app/widgets/gimpviewrenderer.c b/app/widgets/gimpviewrenderer.c
13
index 54bc765..9a91a27 100644
14
--- a/app/widgets/gimpviewrenderer.c
15
+++ b/app/widgets/gimpviewrenderer.c
16
@@ -926,6 +926,16 @@ gimp_view_render_to_surface (TempBuf *temp_buf,
17
g_return_if_fail (temp_buf != NULL);
18
g_return_if_fail (surface != NULL);
20
+ /* In rare cases we can get here while GIMP is exiting, handle that
21
+ * by checking for availability of the buffers
23
+ if (! gimp_render_check_buf ||
24
+ ! gimp_render_empty_buf ||
25
+ ! gimp_render_white_buf)
28
+ cairo_surface_flush (surface);
30
dest = cairo_image_surface_get_data (surface);
31
dest_stride = cairo_image_surface_get_stride (surface);
33
@@ -1078,6 +1088,8 @@ gimp_view_render_to_surface (TempBuf *temp_buf,
38
+ cairo_surface_mark_dirty (surface);
42
diff --git a/app/widgets/gimpviewrenderergradient.c b/app/widgets/gimpviewrenderergradient.c
43
index 563c04d..368f714 100644
44
--- a/app/widgets/gimpviewrenderergradient.c
45
+++ b/app/widgets/gimpviewrenderergradient.c
46
@@ -189,6 +189,8 @@ gimp_view_renderer_gradient_render (GimpViewRenderer *renderer,
50
+ cairo_surface_flush (renderer->surface);
52
dest = cairo_image_surface_get_data (renderer->surface);
53
dest_stride = cairo_image_surface_get_stride (renderer->surface);
55
@@ -197,6 +199,8 @@ gimp_view_renderer_gradient_render (GimpViewRenderer *renderer,
56
memcpy (dest, buf, renderer->width * 4);
59
+ cairo_surface_mark_dirty (renderer->surface);
61
renderer->needs_render = FALSE;
64
diff --git a/app/widgets/gimpviewrendererpalette.c b/app/widgets/gimpviewrendererpalette.c
65
index 9c9eb8b..eeab3f3 100644
66
--- a/app/widgets/gimpviewrendererpalette.c
67
+++ b/app/widgets/gimpviewrendererpalette.c
68
@@ -139,6 +139,8 @@ gimp_view_renderer_palette_render (GimpViewRenderer *renderer,
72
+ cairo_surface_flush (renderer->surface);
74
row = g_new (guchar, renderer->width * 4);
76
dest = cairo_image_surface_get_data (renderer->surface);
77
@@ -202,6 +204,8 @@ gimp_view_renderer_palette_render (GimpViewRenderer *renderer,
81
+ cairo_surface_mark_dirty (renderer->surface);
83
renderer->needs_render = FALSE;
86
diff --git a/libgimpwidgets/gimpcairo-utils.c b/libgimpwidgets/gimpcairo-utils.c
87
index 467c9ce..22cf5cb 100644
88
--- a/libgimpwidgets/gimpcairo-utils.c
89
+++ b/libgimpwidgets/gimpcairo-utils.c
90
@@ -229,6 +229,8 @@ gimp_cairo_surface_create_from_pixbuf (GdkPixbuf *pixbuf)
92
surface = cairo_image_surface_create (format, width, height);
94
+ cairo_surface_flush (surface);
96
src = gdk_pixbuf_get_pixels (pixbuf);
97
src_stride = gdk_pixbuf_get_rowstride (pixbuf);
99
@@ -281,5 +283,7 @@ gimp_cairo_surface_create_from_pixbuf (GdkPixbuf *pixbuf)
103
+ cairo_surface_mark_dirty (surface);