static void qemu_spice_create_update(SimpleSpiceDisplay *ssd)

{

    static const int blksize = 32;

    int blocks = (surface_width(ssd->ds) + blksize - 1) / blksize;

    int dirty_top[blocks];

    int y, yoff, x, xoff, blk, bw;

    int bpp = surface_bytes_per_pixel(ssd->ds);

    uint8_t *guest, *mirror;



    if (qemu_spice_rect_is_empty(&ssd->dirty)) {

        return;

    };



    for (blk = 0; blk < blocks; blk++) {

        dirty_top[blk] = -1;

    }



    guest = surface_data(ssd->ds);

    mirror = (void *)pixman_image_get_data(ssd->mirror);

    for (y = ssd->dirty.top; y < ssd->dirty.bottom; y++) {

        yoff = y * surface_stride(ssd->ds);

        for (x = ssd->dirty.left; x < ssd->dirty.right; x += blksize) {

            xoff = x * bpp;

            blk = x / blksize;

            bw = MIN(blksize, ssd->dirty.right - x);

            if (memcmp(guest + yoff + xoff,

                       mirror + yoff + xoff,

                       bw * bpp) == 0) {

                if (dirty_top[blk] != -1) {

                    QXLRect update = {

                        .top    = dirty_top[blk],

                        .bottom = y,

                        .left   = x,

                        .right  = x + bw,

                    };

                    qemu_spice_create_one_update(ssd, &update);

                    dirty_top[blk] = -1;

                }

            } else {

                if (dirty_top[blk] == -1) {

                    dirty_top[blk] = y;

                }

            }

        }

    }



    for (x = ssd->dirty.left; x < ssd->dirty.right; x += blksize) {

        blk = x / blksize;

        bw = MIN(blksize, ssd->dirty.right - x);

        if (dirty_top[blk] != -1) {

            QXLRect update = {

                .top    = dirty_top[blk],

                .bottom = ssd->dirty.bottom,

                .left   = x,

                .right  = x + bw,

            };

            qemu_spice_create_one_update(ssd, &update);

            dirty_top[blk] = -1;

        }

    }



    memset(&ssd->dirty, 0, sizeof(ssd->dirty));

}

static void qemu_spice_create_update(SimpleSpiceDisplay *ssd)

{

    static const int blksize = 32;

    int blocks = (surface_width(ssd->ds) + blksize - 1) / blksize;

    int dirty_top[blocks];

    int y, yoff, x, xoff, blk, bw;

    int bpp = surface_bytes_per_pixel(ssd->ds);

    uint8_t *guest, *mirror;



    if (qemu_spice_rect_is_empty(&ssd->dirty)) {

        return;

    };



    for (blk = 0; blk < blocks; blk++) {

        dirty_top[blk] = -1;

    }



    guest = surface_data(ssd->ds);

    mirror = (void *)pixman_image_get_data(ssd->mirror);

    for (y = ssd->dirty.top; y < ssd->dirty.bottom; y++) {

        yoff = y * surface_stride(ssd->ds);

        for (x = ssd->dirty.left; x < ssd->dirty.right; x += blksize) {

            xoff = x * bpp;

            blk = x / blksize;

            bw = MIN(blksize, ssd->dirty.right - x);

            if (memcmp(guest + yoff + xoff,

                       mirror + yoff + xoff,

                       bw * bpp) == 0) {

                if (dirty_top[blk] != -1) {

                    QXLRect update = {

                        .top    = dirty_top[blk],

                        .bottom = y,

                        .left   = x,

                        .right  = x + bw,

                    };

                    qemu_spice_create_one_update(ssd, &update);

                    dirty_top[blk] = -1;

                }

            } else {

                if (dirty_top[blk] == -1) {

                    dirty_top[blk] = y;

                }

            }

        }

    }



    for (x = ssd->dirty.left; x < ssd->dirty.right; x += blksize) {

        blk = x / blksize;

        bw = MIN(blksize, ssd->dirty.right - x);

        if (dirty_top[blk] != -1) {

            QXLRect update = {

                .top    = dirty_top[blk],

                .bottom = ssd->dirty.bottom,

                .left   = x,

                .right  = x + bw,

            };

            qemu_spice_create_one_update(ssd, &update);

            dirty_top[blk] = -1;

        }

    }



    memset(&ssd->dirty, 0, sizeof(ssd->dirty));

}

static void FUNC_0(SimpleSpiceDisplay *VAR_0)

{

    static const int VAR_1 = 32;

    int VAR_2 = (surface_width(VAR_0->ds) + VAR_1 - 1) / VAR_1;

    int VAR_3[VAR_2];

    int VAR_4, VAR_5, VAR_6, VAR_7, VAR_8, VAR_9;

    int VAR_10 = surface_bytes_per_pixel(VAR_0->ds);

    uint8_t *guest, *mirror;



    if (qemu_spice_rect_is_empty(&VAR_0->dirty)) {

        return;

    };



    for (VAR_8 = 0; VAR_8 < VAR_2; VAR_8++) {

        VAR_3[VAR_8] = -1;

    }



    guest = surface_data(VAR_0->ds);

    mirror = (void *)pixman_image_get_data(VAR_0->mirror);

    for (VAR_4 = VAR_0->dirty.top; VAR_4 < VAR_0->dirty.bottom; VAR_4++) {

        VAR_5 = VAR_4 * surface_stride(VAR_0->ds);

        for (VAR_6 = VAR_0->dirty.left; VAR_6 < VAR_0->dirty.right; VAR_6 += VAR_1) {

            VAR_7 = VAR_6 * VAR_10;

            VAR_8 = VAR_6 / VAR_1;

            VAR_9 = MIN(VAR_1, VAR_0->dirty.right - VAR_6);

            if (memcmp(guest + VAR_5 + VAR_7,

                       mirror + VAR_5 + VAR_7,

                       VAR_9 * VAR_10) == 0) {

                if (VAR_3[VAR_8] != -1) {

                    QXLRect update = {

                        .top    = VAR_3[VAR_8],

                        .bottom = VAR_4,

                        .left   = VAR_6,

                        .right  = VAR_6 + VAR_9,

                    };

                    qemu_spice_create_one_update(VAR_0, &update);

                    VAR_3[VAR_8] = -1;

                }

            } else {

                if (VAR_3[VAR_8] == -1) {

                    VAR_3[VAR_8] = VAR_4;

                }

            }

        }

    }



    for (VAR_6 = VAR_0->dirty.left; VAR_6 < VAR_0->dirty.right; VAR_6 += VAR_1) {

        VAR_8 = VAR_6 / VAR_1;

        VAR_9 = MIN(VAR_1, VAR_0->dirty.right - VAR_6);

        if (VAR_3[VAR_8] != -1) {

            QXLRect update = {

                .top    = VAR_3[VAR_8],

                .bottom = VAR_0->dirty.bottom,

                .left   = VAR_6,

                .right  = VAR_6 + VAR_9,

            };

            qemu_spice_create_one_update(VAR_0, &update);

            VAR_3[VAR_8] = -1;

        }

    }



    memset(&VAR_0->dirty, 0, sizeof(VAR_0->dirty));

}

static void FUNC_0(SimpleSpiceDisplay *VAR_0)
{ static const int VAR_1 = 32; int VAR_2 = (surface_width(VAR_0->ds) + VAR_1 - 1) / VAR_1; int VAR_3[VAR_2]; int VAR_4, VAR_5, VAR_6, VAR_7, VAR_8, VAR_9; int VAR_10 = surface_bytes_per_pixel(VAR_0->ds); uint8_t *guest, *mirror; if (qemu_spice_rect_is_empty(&VAR_0->dirty)) { return; }; for (VAR_8 = 0; VAR_8 < VAR_2; VAR_8++) { VAR_3[VAR_8] = -1; } guest = surface_data(VAR_0->ds); mirror = (void *)pixman_image_get_data(VAR_0->mirror); for (VAR_4 = VAR_0->dirty.top; VAR_4 < VAR_0->dirty.bottom; VAR_4++) { VAR_5 = VAR_4 * surface_stride(VAR_0->ds); for (VAR_6 = VAR_0->dirty.left; VAR_6 < VAR_0->dirty.right; VAR_6 += VAR_1) { VAR_7 = VAR_6 * VAR_10; VAR_8 = VAR_6 / VAR_1; VAR_9 = MIN(VAR_1, VAR_0->dirty.right - VAR_6); if (memcmp(guest + VAR_5 + VAR_7,
mirror + VAR_5 + VAR_7,
VAR_9 * VAR_10) == 0) { if (VAR_3[VAR_8] != -1) { QXLRect update = { .top    = VAR_3[VAR_8],
.bottom = VAR_4,
.left   = VAR_6,
.right  = VAR_6 + VAR_9,
}; qemu_spice_create_one_update(VAR_0, &update); VAR_3[VAR_8] = -1; } } else { if (VAR_3[VAR_8] == -1) { VAR_3[VAR_8] = VAR_4; } } } } for (VAR_6 = VAR_0->dirty.left; VAR_6 < VAR_0->dirty.right; VAR_6 += VAR_1) { VAR_8 = VAR_6 / VAR_1; VAR_9 = MIN(VAR_1, VAR_0->dirty.right - VAR_6); if (VAR_3[VAR_8] != -1) { QXLRect update = { .top    = VAR_3[VAR_8],
.bottom = VAR_0->dirty.bottom,
.left   = VAR_6,
.right  = VAR_6 + VAR_9,
}; qemu_spice_create_one_update(VAR_0, &update); VAR_3[VAR_8] = -1; } } memset(&VAR_0->dirty, 0, sizeof(VAR_0->dirty)); }