diff options
author | Vincent Desprez <vincent.desprez@gmail.com> | 2017-01-10 22:54:56 +0100 |
---|---|---|
committer | Jeremy White <jwhite@codeweavers.com> | 2017-03-07 15:11:15 -0600 |
commit | bfa85a7117fcf28ff19f2507f61db4620da2e828 (patch) | |
tree | f758595753b1ae33a168f39681299f541b32db6b | |
parent | 2fa7c65144c0eece5bb6d359266f951ed6a37a56 (diff) |
Handling non-topdown lz_rgb
Signed-off-by: Vincent Desprez <vincent.desprez@apwise.com>
-rw-r--r-- | display.js | 3 | ||||
-rw-r--r-- | lz.js | 16 |
2 files changed, 16 insertions, 3 deletions
@@ -288,9 +288,6 @@ SpiceDisplayConn.prototype.process_channel_message = function(msg) return false; } - if (draw_copy.data.src_bitmap.lz_rgb.top_down != 1) - this.log_warn("FIXME: Implement non top down support for lz_rgb"); - var source_img = convert_spice_lz_to_web(canvas.context, draw_copy.data.src_bitmap.lz_rgb); if (! source_img) @@ -141,6 +141,19 @@ function lz_rgb32_decompress(in_buf, at, out_buf, type, default_alpha) return encoder - 1; } +function flip_image_data(img) +{ + var wb = img.width * 4; + var h = img.height; + var temp_h = h; + var buff = new Uint8Array(img.width * img.height * 4); + while (temp_h--) + { + buff.set(img.data.subarray(temp_h * wb, (temp_h + 1) * wb), (h - temp_h - 1) * wb); + } + img.data.set(buff); +} + function convert_spice_lz_to_web(context, lz_image) { var at; @@ -150,6 +163,9 @@ function convert_spice_lz_to_web(context, lz_image) var ret = context.createImageData(lz_image.width, lz_image.height); at = lz_rgb32_decompress(u8, 0, ret.data, LZ_IMAGE_TYPE_RGB32, lz_image.type != LZ_IMAGE_TYPE_RGBA); + if (!lz_image.top_down) + flip_image_data(ret); + if (lz_image.type == LZ_IMAGE_TYPE_RGBA) lz_rgb32_decompress(u8, at, ret.data, LZ_IMAGE_TYPE_RGBA, false); } |