broadway: Use gdk_texture_save_to_png_bytes()

Instead of using Cairo, save the texture directly.
This commit is contained in:
Benjamin Otte 2021-09-26 00:32:27 +02:00
parent dcba783389
commit 5b47391162

View File

@ -609,56 +609,39 @@ open_shared_memory (void)
return ret; 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 guint32
gdk_broadway_server_upload_texture (GdkBroadwayServer *server, gdk_broadway_server_upload_texture (GdkBroadwayServer *server,
GdkTexture *texture) GdkTexture *texture)
{ {
guint32 id; guint32 id;
cairo_surface_t *surface = gdk_texture_download_surface (texture);
BroadwayRequestUploadTexture msg; BroadwayRequestUploadTexture msg;
PngData data; GBytes *bytes;
const guchar *data;
gsize size;
int fd;
id = server->next_texture_id++; id = server->next_texture_id++;
data.fd = open_shared_memory (); bytes = gdk_texture_save_to_png_bytes (texture);
data.size = 0; fd = open_shared_memory ();
cairo_surface_write_to_png_stream (surface, write_png_cb, &data); data = g_bytes_get_data (bytes, &size);
msg.id = id; while (size)
msg.offset = 0; {
msg.size = data.size; gssize ret = write (fd, data, size);
if (ret <= 0)
break;
size -= ret;
data += ret;
}
g_bytes_unref (bytes);
/* This passes ownership of fd */ /* This passes ownership of fd */
gdk_broadway_server_send_fd_message (server, msg, gdk_broadway_server_send_fd_message (server, msg,
BROADWAY_REQUEST_UPLOAD_TEXTURE, data.fd); BROADWAY_REQUEST_UPLOAD_TEXTURE, fd);
return id; return id;
} }