Revision 0e2487bd

b/hw/qxl-render.c
28 28
    int len, i;
29 29

  
30 30
    src += (qxl->guest_primary.surface.height - rect->top - 1) *
31
        qxl->guest_primary.stride;
32
    dst += rect->top  * qxl->guest_primary.stride;
31
        qxl->guest_primary.abs_stride;
32
    dst += rect->top  * qxl->guest_primary.abs_stride;
33 33
    src += rect->left * qxl->guest_primary.bytes_pp;
34 34
    dst += rect->left * qxl->guest_primary.bytes_pp;
35 35
    len  = (rect->right - rect->left) * qxl->guest_primary.bytes_pp;
36 36

  
37 37
    for (i = rect->top; i < rect->bottom; i++) {
38 38
        memcpy(dst, src, len);
39
        dst += qxl->guest_primary.stride;
40
        src -= qxl->guest_primary.stride;
39
        dst += qxl->guest_primary.abs_stride;
40
        src -= qxl->guest_primary.abs_stride;
41 41
    }
42 42
}
43 43

  
......
45 45
{
46 46
    QXLSurfaceCreate *sc = &qxl->guest_primary.surface;
47 47

  
48
    qxl->guest_primary.stride = sc->stride;
48
    qxl->guest_primary.qxl_stride = sc->stride;
49
    qxl->guest_primary.abs_stride = abs(sc->stride);
49 50
    qxl->guest_primary.resized++;
50 51
    switch (sc->format) {
51 52
    case SPICE_SURFACE_FMT_16_555:
......
87 88
        qemu_free_displaysurface(vga->ds);
88 89

  
89 90
        qxl->guest_primary.data = memory_region_get_ram_ptr(&qxl->vga.vram);
90
        if (qxl->guest_primary.stride < 0) {
91
        if (qxl->guest_primary.qxl_stride < 0) {
91 92
            /* spice surface is upside down -> need extra buffer to flip */
92
            qxl->guest_primary.stride = -qxl->guest_primary.stride;
93
            qxl->guest_primary.flipped = g_malloc(qxl->guest_primary.surface.width *
94
                                                     qxl->guest_primary.stride);
93
            qxl->guest_primary.flipped =
94
                g_malloc(qxl->guest_primary.surface.width *
95
                         qxl->guest_primary.abs_stride);
95 96
            ptr = qxl->guest_primary.flipped;
96 97
        } else {
97 98
            ptr = qxl->guest_primary.data;
......
100 101
               __FUNCTION__,
101 102
               qxl->guest_primary.surface.width,
102 103
               qxl->guest_primary.surface.height,
103
               qxl->guest_primary.stride,
104
               qxl->guest_primary.qxl_stride,
104 105
               qxl->guest_primary.bytes_pp,
105 106
               qxl->guest_primary.bits_pp,
106 107
               qxl->guest_primary.flipped ? "yes" : "no");
......
108 109
            qemu_create_displaysurface_from(qxl->guest_primary.surface.width,
109 110
                                            qxl->guest_primary.surface.height,
110 111
                                            qxl->guest_primary.bits_pp,
111
                                            qxl->guest_primary.stride,
112
                                            qxl->guest_primary.abs_stride,
112 113
                                            ptr);
113 114
        dpy_resize(vga->ds);
114 115
    }
b/hw/qxl.h
48 48
        QXLSurfaceCreate surface;
49 49
        uint32_t       commands;
50 50
        uint32_t       resized;
51
        int32_t        stride;
51
        int32_t        qxl_stride;
52
        uint32_t       abs_stride;
52 53
        uint32_t       bits_pp;
53 54
        uint32_t       bytes_pp;
54 55
        uint8_t        *data, *flipped;

Also available in: Unified diff