<div dir="ltr"><div style>Hi,</div><div style>In order to make spice-html5 working with windows guest and qxl driver, I made a patch to handle non top-down lz_rgb. I don’t know if it is possible to make it more efficient but tests showed the result is responsive enough.</div>

<div style>However I still have glitches in my screen (that I didn’t have without the qxl driver) and cannot find where it comes from. Any idea? Of course I can provide screenshots if needed.</div><br clear="all"><div>Vincent</div>


<div style><br></div><div><br></div><div>--- a/lz.js        2012-11-11 23:31:54.000000000 +0100</div><div>+++ b/lz.js       2013-01-16 15:05:56.000000000 +0100</div><div>@@ -141,6 +141,27 @@</div><div>     return encoder - 1;</div>

<div> }</div><div> </div><div>+function flip_image_data(img)</div><div>+{</div><div>+    var w = img.width;</div><div>+    var h = img.height;</div><div>+    var temp_w = w;</div><div>+    var temp_h = h;</div><div>+    var buff = new Uint8Array(img.width * img.height * 4);</div>

<div>+    while (temp_h--)</div><div>+    {</div><div>+        while (temp_w--)</div><div>+        {</div><div>+            buff[(temp_h * w + temp_w) * 4] = img.data[((h - temp_h - 1) * w + temp_w) * 4];</div><div>+            buff[(temp_h * w + temp_w) * 4 + 1] = img.data[((h - temp_h - 1) * w + temp_w) * 4 + 1];</div>

<div>+            buff[(temp_h * w + temp_w) * 4 + 2] = img.data[((h - temp_h - 1) * w + temp_w) * 4 + 2];</div><div>+            buff[(temp_h * w + temp_w) * 4 + 3] = img.data[((h - temp_h - 1) * w + temp_w) * 4 + 3];</div>

<div>+        }</div><div>+        temp_w = w;</div><div>+    }</div><div>+    img.data.set(buff);</div><div>+}</div><div>+</div><div> function convert_spice_lz_rgb_to_web(context, lz_rgb)</div><div> {</div><div>     var u8 = new Uint8Array(lz_rgb.data);</div>

<div>@@ -151,6 +172,9 @@</div><div>     var ret = context.createImageData(lz_rgb.width, lz_rgb.height);</div><div> </div><div>     at = lz_rgb32_decompress(u8, 0, ret.data, LZ_IMAGE_TYPE_RGB32, lz_rgb.type != LZ_IMAGE_TYPE_RGBA);</div>

<div>+    if (! lz_rgb.top_down)</div><div>+        flip_image_data(ret);</div><div>+</div><div>     if (lz_rgb.type == LZ_IMAGE_TYPE_RGBA)</div><div>         lz_rgb32_decompress(u8, at, ret.data, LZ_IMAGE_TYPE_RGBA, false);</div>

<div><br></div><div><br></div><div><div>--- a/display.js   2012-11-11 23:31:54.000000000 +0100</div><div>+++ b/display.js  2013-01-16 15:48:12.000000000 +0100</div><div>@@ -243,9 +243,6 @@</div><div>                     return false;</div>

<div>                 }</div><div> </div><div>-                if (draw_copy.data.src_bitmap.lz_rgb.top_down != 1)</div><div>-                    this.log_warn("FIXME: Implement non top down support for lz_rgb");</div>

<div>-</div><div>                 var source_img = convert_spice_lz_rgb_to_web(canvas.context,</div><div>                                             draw_copy.data.src_bitmap.lz_rgb);</div><div>                 if (! source_img)</div>

</div><div><br></div>
</div>