forked from AuroraMiddleware/gtk
broadway: Use gdk_texture_save_to_png_bytes()
Instead of using Cairo, save the texture directly.
This commit is contained in:
parent
dcba783389
commit
5b47391162
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user