[gthumb: 94/129] fixed surface drawing with cairo 1.9 and greater



commit 7477634f5e1c546388d3d89816e17dffc9b51281
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Tue Apr 26 23:27:30 2011 +0200

    fixed surface drawing with cairo 1.9 and greater
    
    surround code that changes the surface data directly with calls
    to flush and mark_dirty.

 extensions/cairo_io/cairo-io-jpeg.c                |    3 +++
 .../file_tools/gth-file-tool-adjust-colors.c       |    2 ++
 extensions/file_tools/gth-file-tool-desaturate.c   |    2 ++
 extensions/file_tools/gth-file-tool-enhance.c      |    2 ++
 extensions/file_tools/gth-file-tool-equalize.c     |    2 ++
 extensions/file_tools/gth-file-tool-negative.c     |    2 ++
 gthumb/cairo-utils.c                               |   18 ++++++++++++++++++
 7 files changed, 31 insertions(+), 0 deletions(-)
---
diff --git a/extensions/cairo_io/cairo-io-jpeg.c b/extensions/cairo_io/cairo-io-jpeg.c
index 823aa4e..f020a99 100644
--- a/extensions/cairo_io/cairo-io-jpeg.c
+++ b/extensions/cairo_io/cairo-io-jpeg.c
@@ -235,6 +235,7 @@ _cairo_image_surface_create_from_jpeg (GthFileData   *file_data,
 #endif
 
 	surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, destination_width, destination_height);
+	cairo_surface_flush (surface);
 	surface_row = cairo_image_surface_get_data (surface) + line_start;
 
 	buffer_stride = srcinfo.output_width * srcinfo.output_components;
@@ -466,6 +467,8 @@ _cairo_image_surface_create_from_jpeg (GthFileData   *file_data,
 	}
 
 	if (! g_cancellable_is_cancelled (cancellable)) {
+		cairo_surface_mark_dirty (surface);
+
 		/* Scale to the requested size */
 
 		if (load_scaled) {
diff --git a/extensions/file_tools/gth-file-tool-adjust-colors.c b/extensions/file_tools/gth-file-tool-adjust-colors.c
index 8fbf371..f3620c8 100644
--- a/extensions/file_tools/gth-file-tool-adjust-colors.c
+++ b/extensions/file_tools/gth-file-tool-adjust-colors.c
@@ -126,6 +126,7 @@ adjust_colors_exec (GthAsyncTask *task,
 	source_stride = cairo_image_surface_get_stride (adjust_data->source);
 
 	adjust_data->destination = cairo_image_surface_create (format, width, height);
+	cairo_surface_flush (adjust_data->destination);
 	destination_stride = cairo_image_surface_get_stride (adjust_data->destination);
 	p_source_line = cairo_image_surface_get_data (adjust_data->source);
 	p_destination_line = cairo_image_surface_get_data (adjust_data->destination);
@@ -200,6 +201,7 @@ adjust_colors_exec (GthAsyncTask *task,
 		p_destination_line += destination_stride;
 	}
 
+	cairo_surface_mark_dirty (adjust_data->destination);
 	terminated = TRUE;
 	gth_async_task_set_data (task, &terminated, NULL, NULL);
 
diff --git a/extensions/file_tools/gth-file-tool-desaturate.c b/extensions/file_tools/gth-file-tool-desaturate.c
index 3f27962..772abb5 100644
--- a/extensions/file_tools/gth-file-tool-desaturate.c
+++ b/extensions/file_tools/gth-file-tool-desaturate.c
@@ -93,6 +93,7 @@ desaturate_exec (GthAsyncTask *task,
 	source_stride = cairo_image_surface_get_stride (desaturate_data->source);
 
 	desaturate_data->destination = cairo_image_surface_create (format, width, height);
+	cairo_surface_flush (desaturate_data->destination);
 	destination_stride = cairo_image_surface_get_stride (desaturate_data->destination);
 	p_source_line = cairo_image_surface_get_data (desaturate_data->source);
 	p_destination_line = cairo_image_surface_get_data (desaturate_data->destination);
@@ -126,6 +127,7 @@ desaturate_exec (GthAsyncTask *task,
 		p_destination_line += destination_stride;
 	}
 
+	cairo_surface_mark_dirty (desaturate_data->destination);
 	terminated = TRUE;
 	gth_async_task_set_data (task, &terminated, NULL, NULL);
 
diff --git a/extensions/file_tools/gth-file-tool-enhance.c b/extensions/file_tools/gth-file-tool-enhance.c
index 590a9d1..f872e15 100644
--- a/extensions/file_tools/gth-file-tool-enhance.c
+++ b/extensions/file_tools/gth-file-tool-enhance.c
@@ -216,6 +216,7 @@ enhance_exec (GthAsyncTask *task,
 	source_stride = cairo_image_surface_get_stride (enhance_data->source);
 
 	enhance_data->destination = cairo_image_surface_create (format, width, height);
+	cairo_surface_flush (enhance_data->destination);
 	destination_stride = cairo_image_surface_get_stride (enhance_data->destination);
 	p_source_line = cairo_image_surface_get_data (enhance_data->source);
 	p_destination_line = cairo_image_surface_get_data (enhance_data->destination);
@@ -243,6 +244,7 @@ enhance_exec (GthAsyncTask *task,
 		p_destination_line += destination_stride;
 	}
 
+	cairo_surface_mark_dirty (enhance_data->destination);
 	terminated = TRUE;
 	gth_async_task_set_data (task, &terminated, NULL, NULL);
 
diff --git a/extensions/file_tools/gth-file-tool-equalize.c b/extensions/file_tools/gth-file-tool-equalize.c
index 6468b07..9a77612 100644
--- a/extensions/file_tools/gth-file-tool-equalize.c
+++ b/extensions/file_tools/gth-file-tool-equalize.c
@@ -135,6 +135,7 @@ equalize_exec (GthAsyncTask *task,
 	source_stride = cairo_image_surface_get_stride (equalize_data->source);
 
 	equalize_data->destination = cairo_image_surface_create (format, width, height);
+	cairo_surface_flush (equalize_data->destination);
 	destination_stride = cairo_image_surface_get_stride (equalize_data->destination);
 	p_source_line = cairo_image_surface_get_data (equalize_data->source);
 	p_destination_line = cairo_image_surface_get_data (equalize_data->destination);
@@ -164,6 +165,7 @@ equalize_exec (GthAsyncTask *task,
 		p_destination_line += destination_stride;
 	}
 
+	cairo_surface_mark_dirty (equalize_data->destination);
 	terminated = TRUE;
 	gth_async_task_set_data (task, &terminated, NULL, NULL);
 
diff --git a/extensions/file_tools/gth-file-tool-negative.c b/extensions/file_tools/gth-file-tool-negative.c
index 90b6dca..898fcc0 100644
--- a/extensions/file_tools/gth-file-tool-negative.c
+++ b/extensions/file_tools/gth-file-tool-negative.c
@@ -92,6 +92,7 @@ negative_exec (GthAsyncTask *task,
 	source_stride = cairo_image_surface_get_stride (negative_data->source);
 
 	negative_data->destination = cairo_image_surface_create (format, width, height);
+	cairo_surface_flush (negative_data->destination);
 	destination_stride = cairo_image_surface_get_stride (negative_data->destination);
 	p_source_line = cairo_image_surface_get_data (negative_data->source);
 	p_destination_line = cairo_image_surface_get_data (negative_data->destination);
@@ -120,6 +121,7 @@ negative_exec (GthAsyncTask *task,
 		p_destination_line += destination_stride;
 	}
 
+	cairo_surface_mark_dirty (negative_data->destination);
 	terminated = TRUE;
 	gth_async_task_set_data (task, &terminated, NULL, NULL);
 
diff --git a/gthumb/cairo-utils.c b/gthumb/cairo-utils.c
index f8a3727..2da9ee4 100644
--- a/gthumb/cairo-utils.c
+++ b/gthumb/cairo-utils.c
@@ -140,6 +140,8 @@ _cairo_image_surface_copy (cairo_surface_t *source)
 		return NULL;
 	}
 
+	cairo_surface_flush (result);
+
 	source_stride = cairo_image_surface_get_stride (source);
 	destination_stride = cairo_image_surface_get_stride (result);
 	p_source = cairo_image_surface_get_data (source);
@@ -152,6 +154,8 @@ _cairo_image_surface_copy (cairo_surface_t *source)
 		p_destination += destination_stride;
 	}
 
+	cairo_surface_mark_dirty (result);
+
 	return result;
 }
 
@@ -183,6 +187,8 @@ _cairo_image_surface_copy_subsurface (cairo_surface_t *source,
 		return NULL;
 	}
 
+	cairo_surface_flush (destination);
+
 	source_stride = cairo_image_surface_get_stride (source);
 	destination_stride = cairo_image_surface_get_stride (destination);
 	p_source = cairo_image_surface_get_data (source) + (src_y * source_stride) + (src_x * 4);
@@ -195,6 +201,8 @@ _cairo_image_surface_copy_subsurface (cairo_surface_t *source,
 		p_destination += destination_stride;
 	}
 
+	cairo_surface_mark_dirty (destination);
+
 	return destination;
 }
 
@@ -224,6 +232,7 @@ _cairo_image_surface_create_from_pixbuf (GdkPixbuf *pixbuf)
 		      "pixels", &p_pixels,
 		      NULL );
 	surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+	cairo_surface_flush (surface);
 	s_stride = cairo_image_surface_get_stride (surface);
 	s_pixels = cairo_image_surface_get_data (surface);
 
@@ -270,6 +279,8 @@ _cairo_image_surface_create_from_pixbuf (GdkPixbuf *pixbuf)
 		}
 	}
 
+	cairo_surface_mark_dirty (surface);
+
 	return surface;
 }
 
@@ -452,6 +463,7 @@ _cairo_image_surface_transform (cairo_surface_t *source,
 						  &pixel_step);
 
 	destination = cairo_image_surface_create (format, destination_width, destination_height);
+	cairo_surface_flush (destination);
 	destination_stride = cairo_image_surface_get_stride (destination);
 	p_source_line = cairo_image_surface_get_data (source);
 	p_destination_line = cairo_image_surface_get_data (destination) + line_start;
@@ -467,6 +479,8 @@ _cairo_image_surface_transform (cairo_surface_t *source,
 		p_destination_line += line_step;
 	}
 
+	cairo_surface_mark_dirty (destination);
+
 	return destination;
 }
 
@@ -494,6 +508,8 @@ _cairo_paint_full_gradient (cairo_surface_t *surface,
 	if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS)
 		return;
 
+	cairo_surface_flush (surface);
+
 	_gdk_color_to_cairo_color_255 (h_color1, &hcolor1);
 	_gdk_color_to_cairo_color_255 (h_color2, &hcolor2);
 	_gdk_color_to_cairo_color_255 (v_color1, &vcolor1);
@@ -527,6 +543,8 @@ _cairo_paint_full_gradient (cairo_surface_t *surface,
 
 		s_pixels += s_stride;
 	}
+
+	cairo_surface_mark_dirty (surface);
 }
 
 



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