Restore Cairo PNG support.
This commit is contained in:
parent
b4ad24ccd6
commit
d2523c062c
@ -113,6 +113,70 @@ typedef struct __guac_socket_write_png_data {
|
|||||||
|
|
||||||
} __guac_socket_write_png_data;
|
} __guac_socket_write_png_data;
|
||||||
|
|
||||||
|
cairo_status_t __guac_socket_write_png_cairo(void* closure, const unsigned char* data, unsigned int length) {
|
||||||
|
|
||||||
|
__guac_socket_write_png_data* png_data = (__guac_socket_write_png_data*) closure;
|
||||||
|
|
||||||
|
/* Calculate next buffer size */
|
||||||
|
int next_size = png_data->data_size + length;
|
||||||
|
|
||||||
|
/* If need resizing, double buffer size until big enough */
|
||||||
|
if (next_size > png_data->buffer_size) {
|
||||||
|
|
||||||
|
char* new_buffer;
|
||||||
|
|
||||||
|
do {
|
||||||
|
png_data->buffer_size <<= 1;
|
||||||
|
} while (next_size > png_data->buffer_size);
|
||||||
|
|
||||||
|
/* Resize buffer */
|
||||||
|
new_buffer = realloc(png_data->buffer, png_data->buffer_size);
|
||||||
|
png_data->buffer = new_buffer;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Append data to buffer */
|
||||||
|
memcpy(png_data->buffer + png_data->data_size, data, length);
|
||||||
|
png_data->data_size += length;
|
||||||
|
|
||||||
|
return CAIRO_STATUS_SUCCESS;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int __guac_socket_write_length_png_cairo(guac_socket* socket, cairo_surface_t* surface) {
|
||||||
|
|
||||||
|
__guac_socket_write_png_data png_data;
|
||||||
|
int base64_length;
|
||||||
|
|
||||||
|
/* Write surface */
|
||||||
|
|
||||||
|
png_data.socket = socket;
|
||||||
|
png_data.buffer_size = 8192;
|
||||||
|
png_data.buffer = malloc(png_data.buffer_size);
|
||||||
|
png_data.data_size = 0;
|
||||||
|
|
||||||
|
if (cairo_surface_write_to_png_stream(surface, __guac_socket_write_png_cairo, &png_data) != CAIRO_STATUS_SUCCESS) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
base64_length = (png_data.data_size + 2) / 3 * 4;
|
||||||
|
|
||||||
|
/* Write length and data */
|
||||||
|
if (
|
||||||
|
guac_socket_write_int(socket, base64_length)
|
||||||
|
|| guac_socket_write_string(socket, ".")
|
||||||
|
|| guac_socket_write_base64(socket, png_data.buffer, png_data.data_size)
|
||||||
|
|| guac_socket_flush_base64(socket)) {
|
||||||
|
free(png_data.buffer);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(png_data.buffer);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void __guac_socket_write_png(png_structp png,
|
void __guac_socket_write_png(png_structp png,
|
||||||
png_bytep data, png_size_t length) {
|
png_bytep data, png_size_t length) {
|
||||||
|
|
||||||
@ -152,13 +216,6 @@ void __guac_socket_flush_png(png_structp png) {
|
|||||||
/* Dummy function */
|
/* Dummy function */
|
||||||
}
|
}
|
||||||
|
|
||||||
int __guac_socket_write_length_png_cairo(guac_socket* socket, cairo_surface_t* surface) {
|
|
||||||
|
|
||||||
/* STUB */
|
|
||||||
return guac_socket_write_string(socket, "0.");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int __guac_socket_write_length_png(guac_socket* socket, cairo_surface_t* surface) {
|
int __guac_socket_write_length_png(guac_socket* socket, cairo_surface_t* surface) {
|
||||||
|
|
||||||
png_structp png;
|
png_structp png;
|
||||||
|
Loading…
Reference in New Issue
Block a user