From 5b473911627f3e2d6c6ced90665922743b7286be Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 26 Sep 2021 00:32:27 +0200 Subject: [PATCH] broadway: Use gdk_texture_save_to_png_bytes() Instead of using Cairo, save the texture directly. --- gdk/broadway/gdkbroadway-server.c | 57 +++++++++++-------------------- 1 file changed, 20 insertions(+), 37 deletions(-) diff --git a/gdk/broadway/gdkbroadway-server.c b/gdk/broadway/gdkbroadway-server.c index e6b96ff0b9..4ce17727cd 100644 --- a/gdk/broadway/gdkbroadway-server.c +++ b/gdk/broadway/gdkbroadway-server.c @@ -609,56 +609,39 @@ open_shared_memory (void) return ret; } -typedef struct { - int fd; - gsize size; -} PngData; - -static cairo_status_t -write_png_cb (void *closure, - const guchar *data, - unsigned int length) -{ - PngData *png_data = closure; - int fd = png_data->fd; - - while (length) - { - gssize ret = write (fd, data, length); - - if (ret <= 0) - return CAIRO_STATUS_WRITE_ERROR; - - png_data->size += ret; - length -= ret; - data += ret; - } - - return CAIRO_STATUS_SUCCESS; -} - guint32 gdk_broadway_server_upload_texture (GdkBroadwayServer *server, GdkTexture *texture) { guint32 id; - cairo_surface_t *surface = gdk_texture_download_surface (texture); BroadwayRequestUploadTexture msg; - PngData data; + GBytes *bytes; + const guchar *data; + gsize size; + int fd; id = server->next_texture_id++; - data.fd = open_shared_memory (); - data.size = 0; - cairo_surface_write_to_png_stream (surface, write_png_cb, &data); + bytes = gdk_texture_save_to_png_bytes (texture); + fd = open_shared_memory (); + data = g_bytes_get_data (bytes, &size); - msg.id = id; - msg.offset = 0; - msg.size = data.size; + while (size) + { + gssize ret = write (fd, data, size); + + if (ret <= 0) + break; + + size -= ret; + data += ret; + } + + g_bytes_unref (bytes); /* This passes ownership of fd */ gdk_broadway_server_send_fd_message (server, msg, - BROADWAY_REQUEST_UPLOAD_TEXTURE, data.fd); + BROADWAY_REQUEST_UPLOAD_TEXTURE, fd); return id; }