diff options
author | Benjamin Otte <otte@redhat.com> | 2018-03-25 22:37:09 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2018-03-25 22:38:42 +0200 |
commit | 6bad307180127f1e4148b0bb0ee4c252686b3937 (patch) | |
tree | 26de81e66d3d425d89ae75813e57bd239eeb4f0a | |
parent | 98a9f2b3c10c33245396c2c03ef77292846d9cd6 (diff) | |
download | gtk+-6bad307180127f1e4148b0bb0ee4c252686b3937.tar.gz |
colorscale: Don't free surface data before surface
When drawing onto a recording surface, source surfaces get cached.
But if we g_free() the surface data after we're done, that cache is
gonna point at invalid data...
-rw-r--r-- | gtk/gtkcolorscale.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/gtk/gtkcolorscale.c b/gtk/gtkcolorscale.c index 928addb165..0683924dd7 100644 --- a/gtk/gtkcolorscale.c +++ b/gtk/gtkcolorscale.c @@ -90,9 +90,10 @@ gtk_color_scale_snapshot_trough (GtkColorScale *scale, gdouble f; int hue_x, hue_y; - stride = cairo_format_stride_for_width (CAIRO_FORMAT_RGB24, width); - - data = g_malloc (height * stride); + tmp = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + width, height); + stride = cairo_image_surface_get_stride (tmp); + data = (guint32* )cairo_image_surface_get_data (tmp); f = 1.0 / (height - 1); for (hue_y = 0; hue_y < height; hue_y++) @@ -105,18 +106,16 @@ gtk_color_scale_snapshot_trough (GtkColorScale *scale, red = CLAMP (r * 255, 0, 255); green = CLAMP (g * 255, 0, 255); blue = CLAMP (b * 255, 0, 255); - p[hue_x] = (red << 16) | (green << 8) | blue; + p[hue_x] = 0xFF000000 | (red << 16) | (green << 8) | blue; } } - tmp = cairo_image_surface_create_for_data ((guchar *)data, CAIRO_FORMAT_RGB24, - width, height, stride); + cairo_surface_mark_dirty (tmp); cairo_set_source_surface (cr, tmp, 0, 0); cairo_paint (cr); cairo_surface_destroy (tmp); - g_free (data); } else if (scale->priv->type == GTK_COLOR_SCALE_ALPHA) { |