static int send_png_rect(VncState *vs, int x, int y, int w, int h,

                         QDict *palette)

{

    png_byte color_type;

    png_structp png_ptr;

    png_infop info_ptr;

    png_colorp png_palette = NULL;

    size_t offset;

    int level = tight_conf[vs->tight_compression].raw_zlib_level;

    uint8_t *buf;

    int dy;



    png_ptr = png_create_write_struct_2(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL,

                                        NULL, vnc_png_malloc, vnc_png_free);



    if (png_ptr == NULL)

        return -1;



    info_ptr = png_create_info_struct(png_ptr);



    if (info_ptr == NULL) {

        png_destroy_write_struct(&png_ptr, NULL);

        return -1;

    }



    png_set_write_fn(png_ptr, (void *) vs, png_write_data, png_flush_data);

    png_set_compression_level(png_ptr, level);



    if (palette) {

        color_type = PNG_COLOR_TYPE_PALETTE;

    } else {

        color_type = PNG_COLOR_TYPE_RGB;

    }



    png_set_IHDR(png_ptr, info_ptr, w, h,

                 8, color_type, PNG_INTERLACE_NONE,

                 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);



    if (color_type == PNG_COLOR_TYPE_PALETTE) {

        struct palette_cb_priv priv;



        png_palette = png_malloc(png_ptr, sizeof(*png_palette) *

                                 qdict_size(palette));



        priv.vs = vs;

        priv.png_palette = png_palette;

        qdict_iter(palette, write_png_palette, &priv);



        png_set_PLTE(png_ptr, info_ptr, png_palette, qdict_size(palette));



        offset = vs->tight.offset;

        if (vs->clientds.pf.bytes_per_pixel == 4) {

            tight_encode_indexed_rect32(vs->tight.buffer, w * h, palette);

        } else {

            tight_encode_indexed_rect16(vs->tight.buffer, w * h, palette);

        }

    }



    png_write_info(png_ptr, info_ptr);



    buffer_reserve(&vs->tight_png, 2048);

    buf = qemu_malloc(w * 3);

    for (dy = 0; dy < h; dy++)

    {

        if (color_type == PNG_COLOR_TYPE_PALETTE) {

            memcpy(buf, vs->tight.buffer + (dy * w), w);

        } else {

            rgb_prepare_row(vs, buf, x, y + dy, w);

        }

        png_write_row(png_ptr, buf);

    }

    qemu_free(buf);



    png_write_end(png_ptr, NULL);



    if (color_type == PNG_COLOR_TYPE_PALETTE) {

        png_free(png_ptr, png_palette);

    }



    png_destroy_write_struct(&png_ptr, &info_ptr);



    vnc_write_u8(vs, VNC_TIGHT_PNG << 4);



    tight_send_compact_size(vs, vs->tight_png.offset);

    vnc_write(vs, vs->tight_png.buffer, vs->tight_png.offset);

    buffer_reset(&vs->tight_png);

    return 1;

}

static int send_png_rect(VncState *vs, int x, int y, int w, int h,

                         QDict *palette)

{

    png_byte color_type;

    png_structp png_ptr;

    png_infop info_ptr;

    png_colorp png_palette = NULL;

    size_t offset;

    int level = tight_conf[vs->tight_compression].raw_zlib_level;

    uint8_t *buf;

    int dy;



    png_ptr = png_create_write_struct_2(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL,

                                        NULL, vnc_png_malloc, vnc_png_free);



    if (png_ptr == NULL)

        return -1;



    info_ptr = png_create_info_struct(png_ptr);



    if (info_ptr == NULL) {

        png_destroy_write_struct(&png_ptr, NULL);

        return -1;

    }



    png_set_write_fn(png_ptr, (void *) vs, png_write_data, png_flush_data);

    png_set_compression_level(png_ptr, level);



    if (palette) {

        color_type = PNG_COLOR_TYPE_PALETTE;

    } else {

        color_type = PNG_COLOR_TYPE_RGB;

    }



    png_set_IHDR(png_ptr, info_ptr, w, h,

                 8, color_type, PNG_INTERLACE_NONE,

                 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);



    if (color_type == PNG_COLOR_TYPE_PALETTE) {

        struct palette_cb_priv priv;



        png_palette = png_malloc(png_ptr, sizeof(*png_palette) *

                                 qdict_size(palette));



        priv.vs = vs;

        priv.png_palette = png_palette;

        qdict_iter(palette, write_png_palette, &priv);



        png_set_PLTE(png_ptr, info_ptr, png_palette, qdict_size(palette));



        offset = vs->tight.offset;

        if (vs->clientds.pf.bytes_per_pixel == 4) {

            tight_encode_indexed_rect32(vs->tight.buffer, w * h, palette);

        } else {

            tight_encode_indexed_rect16(vs->tight.buffer, w * h, palette);

        }

    }



    png_write_info(png_ptr, info_ptr);



    buffer_reserve(&vs->tight_png, 2048);

    buf = qemu_malloc(w * 3);

    for (dy = 0; dy < h; dy++)

    {

        if (color_type == PNG_COLOR_TYPE_PALETTE) {

            memcpy(buf, vs->tight.buffer + (dy * w), w);

        } else {

            rgb_prepare_row(vs, buf, x, y + dy, w);

        }

        png_write_row(png_ptr, buf);

    }

    qemu_free(buf);



    png_write_end(png_ptr, NULL);



    if (color_type == PNG_COLOR_TYPE_PALETTE) {

        png_free(png_ptr, png_palette);

    }



    png_destroy_write_struct(&png_ptr, &info_ptr);



    vnc_write_u8(vs, VNC_TIGHT_PNG << 4);



    tight_send_compact_size(vs, vs->tight_png.offset);

    vnc_write(vs, vs->tight_png.buffer, vs->tight_png.offset);

    buffer_reset(&vs->tight_png);

    return 1;

}

static int FUNC_0(VncState *VAR_0, int VAR_1, int VAR_2, int VAR_3, int VAR_4,

                         QDict *VAR_5)

{

    png_byte color_type;

    png_structp png_ptr;

    png_infop info_ptr;

    png_colorp png_palette = NULL;

    size_t offset;

    int VAR_6 = tight_conf[VAR_0->tight_compression].raw_zlib_level;

    uint8_t *buf;

    int VAR_7;



    png_ptr = png_create_write_struct_2(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL,

                                        NULL, vnc_png_malloc, vnc_png_free);



    if (png_ptr == NULL)

        return -1;



    info_ptr = png_create_info_struct(png_ptr);



    if (info_ptr == NULL) {

        png_destroy_write_struct(&png_ptr, NULL);

        return -1;

    }



    png_set_write_fn(png_ptr, (void *) VAR_0, png_write_data, png_flush_data);

    png_set_compression_level(png_ptr, VAR_6);



    if (VAR_5) {

        color_type = PNG_COLOR_TYPE_PALETTE;

    } else {

        color_type = PNG_COLOR_TYPE_RGB;

    }



    png_set_IHDR(png_ptr, info_ptr, VAR_3, VAR_4,

                 8, color_type, PNG_INTERLACE_NONE,

                 PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);



    if (color_type == PNG_COLOR_TYPE_PALETTE) {

        struct palette_cb_priv VAR_8;



        png_palette = png_malloc(png_ptr, sizeof(*png_palette) *

                                 qdict_size(VAR_5));



        VAR_8.VAR_0 = VAR_0;

        VAR_8.png_palette = png_palette;

        qdict_iter(VAR_5, write_png_palette, &VAR_8);



        png_set_PLTE(png_ptr, info_ptr, png_palette, qdict_size(VAR_5));



        offset = VAR_0->tight.offset;

        if (VAR_0->clientds.pf.bytes_per_pixel == 4) {

            tight_encode_indexed_rect32(VAR_0->tight.buffer, VAR_3 * VAR_4, VAR_5);

        } else {

            tight_encode_indexed_rect16(VAR_0->tight.buffer, VAR_3 * VAR_4, VAR_5);

        }

    }



    png_write_info(png_ptr, info_ptr);



    buffer_reserve(&VAR_0->tight_png, 2048);

    buf = qemu_malloc(VAR_3 * 3);

    for (VAR_7 = 0; VAR_7 < VAR_4; VAR_7++)

    {

        if (color_type == PNG_COLOR_TYPE_PALETTE) {

            memcpy(buf, VAR_0->tight.buffer + (VAR_7 * VAR_3), VAR_3);

        } else {

            rgb_prepare_row(VAR_0, buf, VAR_1, VAR_2 + VAR_7, VAR_3);

        }

        png_write_row(png_ptr, buf);

    }

    qemu_free(buf);



    png_write_end(png_ptr, NULL);



    if (color_type == PNG_COLOR_TYPE_PALETTE) {

        png_free(png_ptr, png_palette);

    }



    png_destroy_write_struct(&png_ptr, &info_ptr);



    vnc_write_u8(VAR_0, VNC_TIGHT_PNG << 4);



    tight_send_compact_size(VAR_0, VAR_0->tight_png.offset);

    vnc_write(VAR_0, VAR_0->tight_png.buffer, VAR_0->tight_png.offset);

    buffer_reset(&VAR_0->tight_png);

    return 1;

}

static int FUNC_0(VncState *VAR_0, int VAR_1, int VAR_2, int VAR_3, int VAR_4,
QDict *VAR_5)
{ png_byte color_type; png_structp png_ptr; png_infop info_ptr; png_colorp png_palette = NULL; size_t offset; int VAR_6 = tight_conf[VAR_0->tight_compression].raw_zlib_level; uint8_t *buf; int VAR_7; png_ptr = png_create_write_struct_2(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL,
NULL, vnc_png_malloc, vnc_png_free); if (png_ptr == NULL)
return -1; info_ptr = png_create_info_struct(png_ptr); if (info_ptr == NULL) { png_destroy_write_struct(&png_ptr, NULL); return -1; } png_set_write_fn(png_ptr, (void *) VAR_0, png_write_data, png_flush_data); png_set_compression_level(png_ptr, VAR_6); if (VAR_5) { color_type = PNG_COLOR_TYPE_PALETTE; } else { color_type = PNG_COLOR_TYPE_RGB; } png_set_IHDR(png_ptr, info_ptr, VAR_3, VAR_4,
8, color_type, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); if (color_type == PNG_COLOR_TYPE_PALETTE) { struct palette_cb_priv VAR_8; png_palette = png_malloc(png_ptr, sizeof(*png_palette) *
qdict_size(VAR_5)); VAR_8.VAR_0 = VAR_0; VAR_8.png_palette = png_palette; qdict_iter(VAR_5, write_png_palette, &VAR_8); png_set_PLTE(png_ptr, info_ptr, png_palette, qdict_size(VAR_5)); offset = VAR_0->tight.offset; if (VAR_0->clientds.pf.bytes_per_pixel == 4) { tight_encode_indexed_rect32(VAR_0->tight.buffer, VAR_3 * VAR_4, VAR_5); } else { tight_encode_indexed_rect16(VAR_0->tight.buffer, VAR_3 * VAR_4, VAR_5); } } png_write_info(png_ptr, info_ptr); buffer_reserve(&VAR_0->tight_png, 2048); buf = qemu_malloc(VAR_3 * 3); for (VAR_7 = 0; VAR_7 < VAR_4; VAR_7++) { if (color_type == PNG_COLOR_TYPE_PALETTE) { memcpy(buf, VAR_0->tight.buffer + (VAR_7 * VAR_3), VAR_3); } else { rgb_prepare_row(VAR_0, buf, VAR_1, VAR_2 + VAR_7, VAR_3); } png_write_row(png_ptr, buf); } qemu_free(buf); png_write_end(png_ptr, NULL); if (color_type == PNG_COLOR_TYPE_PALETTE) { png_free(png_ptr, png_palette); } png_destroy_write_struct(&png_ptr, &info_ptr); vnc_write_u8(VAR_0, VNC_TIGHT_PNG << 4); tight_send_compact_size(VAR_0, VAR_0->tight_png.offset); vnc_write(VAR_0, VAR_0->tight_png.buffer, VAR_0->tight_png.offset); buffer_reset(&VAR_0->tight_png); return 1; }