diff --git a/docs/reference/gdk/gdk4-sections.txt b/docs/reference/gdk/gdk4-sections.txt index c3df377949..2e12c4ed81 100644 --- a/docs/reference/gdk/gdk4-sections.txt +++ b/docs/reference/gdk/gdk4-sections.txt @@ -730,6 +730,7 @@ gdk_texture_new_from_file gdk_texture_get_width gdk_texture_get_height gdk_texture_download +gdk_texture_save_to_png GdkMemoryFormat GDK_MEMORY_FORMAT_DEFAULT gdk_memory_texture_new diff --git a/gdk/gdktexture.c b/gdk/gdktexture.c index c518bac8a4..3e5f0a401a 100644 --- a/gdk/gdktexture.c +++ b/gdk/gdktexture.c @@ -552,3 +552,50 @@ gdk_texture_get_render_data (GdkTexture *self, return self->render_data; } + +/** + * gdk_texture_save_to_png: + * @texture: a #GdkTexture + * @filename: the filename to store to + * + * Store the given @texture to the @filename as a PNG file. + * + * This is a utility function intended for debugging and testing. + * If you want more control over formats, proper error handling or + * want to store to a #GFile or other location, you might want to + * look into using the gdk-pixbuf library. + * + * Returns: %TRUE if saving succeeded, %FALSE on failure. + **/ +gboolean +gdk_texture_save_to_png (GdkTexture *texture, + const char *filename) +{ + cairo_surface_t *surface; + cairo_status_t status; + gboolean result; + + g_return_val_if_fail (GDK_IS_TEXTURE (texture), FALSE); + g_return_val_if_fail (filename != NULL, FALSE); + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + gdk_texture_get_width (texture), + gdk_texture_get_height (texture)); + gdk_texture_download (texture, + cairo_image_surface_get_data (surface), + cairo_image_surface_get_stride (surface)); + cairo_surface_mark_dirty (surface); + + status = cairo_surface_write_to_png (surface, filename); + + if (status != CAIRO_STATUS_SUCCESS || + cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS) + result = FALSE; + else + result = TRUE; + + cairo_surface_destroy (surface); + + return result; +} + diff --git a/gdk/gdktexture.h b/gdk/gdktexture.h index 67c14e1538..be43990a9f 100644 --- a/gdk/gdktexture.h +++ b/gdk/gdktexture.h @@ -59,6 +59,9 @@ GDK_AVAILABLE_IN_ALL void gdk_texture_download (GdkTexture *texture, guchar *data, gsize stride); +GDK_AVAILABLE_IN_ALL +gboolean gdk_texture_save_to_png (GdkTexture *texture, + const char *filename); G_END_DECLS