static int zrle_send_framebuffer_update(VncState *vs, int x, int y,

                                        int w, int h)

{

    bool be = !!(vs->clientds.flags & QEMU_BIG_ENDIAN_FLAG);

    size_t bytes;

    int zywrle_level;



    if (vs->zrle.type == VNC_ENCODING_ZYWRLE) {

        if (!vs->vd->lossy || vs->tight.quality < 0 || vs->tight.quality == 9) {

            zywrle_level = 0;

            vs->zrle.type = VNC_ENCODING_ZRLE;

        } else if (vs->tight.quality < 3) {

            zywrle_level = 3;

        } else if (vs->tight.quality < 6) {

            zywrle_level = 2;

        } else {

            zywrle_level = 1;

        }

    } else {

        zywrle_level = 0;

    }



    vnc_zrle_start(vs);



    switch(vs->clientds.pf.bytes_per_pixel) {

    case 1:

        zrle_encode_8ne(vs, x, y, w, h, zywrle_level);

        break;



    case 2:

        if (vs->clientds.pf.gmax > 0x1F) {

            if (be) {

                zrle_encode_16be(vs, x, y, w, h, zywrle_level);

            } else {

                zrle_encode_16le(vs, x, y, w, h, zywrle_level);

            }

        } else {

            if (be) {

                zrle_encode_15be(vs, x, y, w, h, zywrle_level);

            } else {

                zrle_encode_15le(vs, x, y, w, h, zywrle_level);

            }

        }

        break;



    case 4:

    {

        bool fits_in_ls3bytes;

        bool fits_in_ms3bytes;



        fits_in_ls3bytes =

            ((vs->clientds.pf.rmax << vs->clientds.pf.rshift) < (1 << 24) &&

             (vs->clientds.pf.gmax << vs->clientds.pf.gshift) < (1 << 24) &&

             (vs->clientds.pf.bmax << vs->clientds.pf.bshift) < (1 << 24));



        fits_in_ms3bytes = (vs->clientds.pf.rshift > 7 &&

                            vs->clientds.pf.gshift > 7 &&

                            vs->clientds.pf.bshift > 7);



        if ((fits_in_ls3bytes && !be) || (fits_in_ms3bytes && be)) {

            if (be) {

                zrle_encode_24abe(vs, x, y, w, h, zywrle_level);

            } else {

                zrle_encode_24ale(vs, x, y, w, h, zywrle_level);

          }

        } else if ((fits_in_ls3bytes && be) || (fits_in_ms3bytes && !be)) {

            if (be) {

                zrle_encode_24bbe(vs, x, y, w, h, zywrle_level);

            } else {

                zrle_encode_24ble(vs, x, y, w, h, zywrle_level);

            }

        } else {

            if (be) {

                zrle_encode_32be(vs, x, y, w, h, zywrle_level);

            } else {

                zrle_encode_32le(vs, x, y, w, h, zywrle_level);

            }

        }

    }

    break;

    }



    vnc_zrle_stop(vs);

    bytes = zrle_compress_data(vs, Z_DEFAULT_COMPRESSION);

    vnc_framebuffer_update(vs, x, y, w, h, vs->zrle.type);

    vnc_write_u32(vs, bytes);

    vnc_write(vs, vs->zrle.zlib.buffer, vs->zrle.zlib.offset);

    return 1;

}

static int zrle_send_framebuffer_update(VncState *vs, int x, int y,

                                        int w, int h)

{

    bool be = !!(vs->clientds.flags & QEMU_BIG_ENDIAN_FLAG);

    size_t bytes;

    int zywrle_level;



    if (vs->zrle.type == VNC_ENCODING_ZYWRLE) {

        if (!vs->vd->lossy || vs->tight.quality < 0 || vs->tight.quality == 9) {

            zywrle_level = 0;

            vs->zrle.type = VNC_ENCODING_ZRLE;

        } else if (vs->tight.quality < 3) {

            zywrle_level = 3;

        } else if (vs->tight.quality < 6) {

            zywrle_level = 2;

        } else {

            zywrle_level = 1;

        }

    } else {

        zywrle_level = 0;

    }



    vnc_zrle_start(vs);



    switch(vs->clientds.pf.bytes_per_pixel) {

    case 1:

        zrle_encode_8ne(vs, x, y, w, h, zywrle_level);

        break;



    case 2:

        if (vs->clientds.pf.gmax > 0x1F) {

            if (be) {

                zrle_encode_16be(vs, x, y, w, h, zywrle_level);

            } else {

                zrle_encode_16le(vs, x, y, w, h, zywrle_level);

            }

        } else {

            if (be) {

                zrle_encode_15be(vs, x, y, w, h, zywrle_level);

            } else {

                zrle_encode_15le(vs, x, y, w, h, zywrle_level);

            }

        }

        break;



    case 4:

    {

        bool fits_in_ls3bytes;

        bool fits_in_ms3bytes;



        fits_in_ls3bytes =

            ((vs->clientds.pf.rmax << vs->clientds.pf.rshift) < (1 << 24) &&

             (vs->clientds.pf.gmax << vs->clientds.pf.gshift) < (1 << 24) &&

             (vs->clientds.pf.bmax << vs->clientds.pf.bshift) < (1 << 24));



        fits_in_ms3bytes = (vs->clientds.pf.rshift > 7 &&

                            vs->clientds.pf.gshift > 7 &&

                            vs->clientds.pf.bshift > 7);



        if ((fits_in_ls3bytes && !be) || (fits_in_ms3bytes && be)) {

            if (be) {

                zrle_encode_24abe(vs, x, y, w, h, zywrle_level);

            } else {

                zrle_encode_24ale(vs, x, y, w, h, zywrle_level);

          }

        } else if ((fits_in_ls3bytes && be) || (fits_in_ms3bytes && !be)) {

            if (be) {

                zrle_encode_24bbe(vs, x, y, w, h, zywrle_level);

            } else {

                zrle_encode_24ble(vs, x, y, w, h, zywrle_level);

            }

        } else {

            if (be) {

                zrle_encode_32be(vs, x, y, w, h, zywrle_level);

            } else {

                zrle_encode_32le(vs, x, y, w, h, zywrle_level);

            }

        }

    }

    break;

    }



    vnc_zrle_stop(vs);

    bytes = zrle_compress_data(vs, Z_DEFAULT_COMPRESSION);

    vnc_framebuffer_update(vs, x, y, w, h, vs->zrle.type);

    vnc_write_u32(vs, bytes);

    vnc_write(vs, vs->zrle.zlib.buffer, vs->zrle.zlib.offset);

    return 1;

}

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

                                        int VAR_3, int VAR_4)

{

    bool be = !!(VAR_0->clientds.flags & QEMU_BIG_ENDIAN_FLAG);

    size_t bytes;

    int VAR_5;



    if (VAR_0->zrle.type == VNC_ENCODING_ZYWRLE) {

        if (!VAR_0->vd->lossy || VAR_0->tight.quality < 0 || VAR_0->tight.quality == 9) {

            VAR_5 = 0;

            VAR_0->zrle.type = VNC_ENCODING_ZRLE;

        } else if (VAR_0->tight.quality < 3) {

            VAR_5 = 3;

        } else if (VAR_0->tight.quality < 6) {

            VAR_5 = 2;

        } else {

            VAR_5 = 1;

        }

    } else {

        VAR_5 = 0;

    }



    vnc_zrle_start(VAR_0);



    switch(VAR_0->clientds.pf.bytes_per_pixel) {

    case 1:

        zrle_encode_8ne(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5);

        break;



    case 2:

        if (VAR_0->clientds.pf.gmax > 0x1F) {

            if (be) {

                zrle_encode_16be(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5);

            } else {

                zrle_encode_16le(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5);

            }

        } else {

            if (be) {

                zrle_encode_15be(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5);

            } else {

                zrle_encode_15le(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5);

            }

        }

        break;



    case 4:

    {

        bool fits_in_ls3bytes;

        bool fits_in_ms3bytes;



        fits_in_ls3bytes =

            ((VAR_0->clientds.pf.rmax << VAR_0->clientds.pf.rshift) < (1 << 24) &&

             (VAR_0->clientds.pf.gmax << VAR_0->clientds.pf.gshift) < (1 << 24) &&

             (VAR_0->clientds.pf.bmax << VAR_0->clientds.pf.bshift) < (1 << 24));



        fits_in_ms3bytes = (VAR_0->clientds.pf.rshift > 7 &&

                            VAR_0->clientds.pf.gshift > 7 &&

                            VAR_0->clientds.pf.bshift > 7);



        if ((fits_in_ls3bytes && !be) || (fits_in_ms3bytes && be)) {

            if (be) {

                zrle_encode_24abe(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5);

            } else {

                zrle_encode_24ale(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5);

          }

        } else if ((fits_in_ls3bytes && be) || (fits_in_ms3bytes && !be)) {

            if (be) {

                zrle_encode_24bbe(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5);

            } else {

                zrle_encode_24ble(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5);

            }

        } else {

            if (be) {

                zrle_encode_32be(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5);

            } else {

                zrle_encode_32le(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5);

            }

        }

    }

    break;

    }



    vnc_zrle_stop(VAR_0);

    bytes = zrle_compress_data(VAR_0, Z_DEFAULT_COMPRESSION);

    vnc_framebuffer_update(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_0->zrle.type);

    vnc_write_u32(VAR_0, bytes);

    vnc_write(VAR_0, VAR_0->zrle.zlib.buffer, VAR_0->zrle.zlib.offset);

    return 1;

}

static int FUNC_0(VncState *VAR_0, int VAR_1, int VAR_2,
int VAR_3, int VAR_4)
{ bool be = !!(VAR_0->clientds.flags & QEMU_BIG_ENDIAN_FLAG); size_t bytes; int VAR_5; if (VAR_0->zrle.type == VNC_ENCODING_ZYWRLE) { if (!VAR_0->vd->lossy || VAR_0->tight.quality < 0 || VAR_0->tight.quality == 9) { VAR_5 = 0; VAR_0->zrle.type = VNC_ENCODING_ZRLE; } else if (VAR_0->tight.quality < 3) { VAR_5 = 3; } else if (VAR_0->tight.quality < 6) { VAR_5 = 2; } else { VAR_5 = 1; } } else { VAR_5 = 0; } vnc_zrle_start(VAR_0); switch(VAR_0->clientds.pf.bytes_per_pixel) { case 1:
zrle_encode_8ne(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5); break; case 2:
if (VAR_0->clientds.pf.gmax > 0x1F) { if (be) { zrle_encode_16be(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5); } else { zrle_encode_16le(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5); } } else { if (be) { zrle_encode_15be(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5); } else { zrle_encode_15le(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5); } } break; case 4:
{ bool fits_in_ls3bytes; bool fits_in_ms3bytes; fits_in_ls3bytes =
((VAR_0->clientds.pf.rmax << VAR_0->clientds.pf.rshift) < (1 << 24) &&
(VAR_0->clientds.pf.gmax << VAR_0->clientds.pf.gshift) < (1 << 24) &&
(VAR_0->clientds.pf.bmax << VAR_0->clientds.pf.bshift) < (1 << 24)); fits_in_ms3bytes = (VAR_0->clientds.pf.rshift > 7 &&
VAR_0->clientds.pf.gshift > 7 &&
VAR_0->clientds.pf.bshift > 7); if ((fits_in_ls3bytes && !be) || (fits_in_ms3bytes && be)) { if (be) { zrle_encode_24abe(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5); } else { zrle_encode_24ale(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5); } } else if ((fits_in_ls3bytes && be) || (fits_in_ms3bytes && !be)) { if (be) { zrle_encode_24bbe(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5); } else { zrle_encode_24ble(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5); } } else { if (be) { zrle_encode_32be(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5); } else { zrle_encode_32le(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_5); } } } break; } vnc_zrle_stop(VAR_0); bytes = zrle_compress_data(VAR_0, Z_DEFAULT_COMPRESSION); vnc_framebuffer_update(VAR_0, VAR_1, VAR_2, VAR_3, VAR_4, VAR_0->zrle.type); vnc_write_u32(VAR_0, bytes); vnc_write(VAR_0, VAR_0->zrle.zlib.buffer, VAR_0->zrle.zlib.offset); return 1; }