support loading SPICE_IMAGE_TYPE_JPEG_ALPHA image types
the alpha layering is not well tested Signed-off-by: Aric Stewart <aric@codeweavers.com>
This commit is contained in:
parent
468869812f
commit
0334423258
88
display.js
88
display.js
@ -207,6 +207,47 @@ SpiceDisplayConn.prototype.process_channel_message = function(msg)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (draw_copy.data.src_bitmap.descriptor.type == SPICE_IMAGE_TYPE_JPEG_ALPHA)
|
||||||
|
{
|
||||||
|
if (! draw_copy.data.src_bitmap.jpeg_alpha)
|
||||||
|
{
|
||||||
|
this.log_warn("FIXME: DrawCopy could not handle this JPEG ALPHA file.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME - how lame is this. Be have it in binary format, and we have
|
||||||
|
// to put it into string to get it back into jpeg. Blech.
|
||||||
|
var tmpstr = "data:image/jpeg,";
|
||||||
|
var img = new Image;
|
||||||
|
var i;
|
||||||
|
var qdv = new Uint8Array(draw_copy.data.src_bitmap.jpeg_alpha.data);
|
||||||
|
for (i = 0; i < qdv.length; i++)
|
||||||
|
{
|
||||||
|
tmpstr += '%';
|
||||||
|
if (qdv[i] < 16)
|
||||||
|
tmpstr += '0';
|
||||||
|
tmpstr += qdv[i].toString(16);
|
||||||
|
}
|
||||||
|
|
||||||
|
img.o =
|
||||||
|
{ base: draw_copy.base,
|
||||||
|
tag: "jpeg." + draw_copy.data.src_bitmap.surface_id,
|
||||||
|
descriptor : draw_copy.data.src_bitmap.descriptor,
|
||||||
|
sc : this,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (this.surfaces[draw_copy.base.surface_id].format == SPICE_SURFACE_FMT_32_ARGB)
|
||||||
|
{
|
||||||
|
|
||||||
|
var canvas = this.surfaces[draw_copy.base.surface_id].canvas;
|
||||||
|
img.alpha_img = convert_spice_lz_to_web(canvas.context,
|
||||||
|
draw_copy.data.src_bitmap.jpeg_alpha.alpha);
|
||||||
|
}
|
||||||
|
img.onload = handle_draw_jpeg_onload;
|
||||||
|
img.src = tmpstr;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else if (draw_copy.data.src_bitmap.descriptor.type == SPICE_IMAGE_TYPE_BITMAP)
|
else if (draw_copy.data.src_bitmap.descriptor.type == SPICE_IMAGE_TYPE_BITMAP)
|
||||||
{
|
{
|
||||||
var canvas = this.surfaces[draw_copy.base.surface_id].canvas;
|
var canvas = this.surfaces[draw_copy.base.surface_id].canvas;
|
||||||
@ -707,18 +748,45 @@ function handle_draw_jpeg_onload()
|
|||||||
else
|
else
|
||||||
context = this.o.sc.surfaces[this.o.base.surface_id].canvas.context;
|
context = this.o.sc.surfaces[this.o.base.surface_id].canvas.context;
|
||||||
|
|
||||||
context.drawImage(this, this.o.base.box.left, this.o.base.box.top);
|
if (this.alpha_img)
|
||||||
|
|
||||||
if (this.o.descriptor &&
|
|
||||||
(this.o.descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_ME))
|
|
||||||
{
|
{
|
||||||
if (! ("cache" in this.o.sc))
|
var c = document.createElement("canvas");
|
||||||
this.o.sc.cache = [];
|
var t = c.getContext("2d");
|
||||||
|
c.setAttribute('width', this.alpha_img.width);
|
||||||
|
c.setAttribute('height', this.alpha_img.height);
|
||||||
|
t.putImageData(this.alpha_img, 0, 0);
|
||||||
|
t.globalCompositeOperation = 'source-in';
|
||||||
|
t.drawImage(this, 0, 0);
|
||||||
|
|
||||||
|
context.drawImage(c, this.o.base.box.left, this.o.base.box.top);
|
||||||
|
|
||||||
this.o.sc.cache[this.o.descriptor.id] =
|
if (this.o.descriptor &&
|
||||||
context.getImageData(this.o.base.box.left, this.o.base.box.top,
|
(this.o.descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_ME))
|
||||||
this.o.base.box.right - this.o.base.box.left,
|
{
|
||||||
this.o.base.box.bottom - this.o.base.box.top);
|
if (! ("cache" in this.o.sc))
|
||||||
|
this.o.sc.cache = [];
|
||||||
|
|
||||||
|
this.o.sc.cache[this.o.descriptor.id] =
|
||||||
|
t.getImageData(0, 0,
|
||||||
|
this.alpha_img.width,
|
||||||
|
this.alpha_img.height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
context.drawImage(this, this.o.base.box.left, this.o.base.box.top);
|
||||||
|
|
||||||
|
if (this.o.descriptor &&
|
||||||
|
(this.o.descriptor.flags & SPICE_IMAGE_FLAGS_CACHE_ME))
|
||||||
|
{
|
||||||
|
if (! ("cache" in this.o.sc))
|
||||||
|
this.o.sc.cache = [];
|
||||||
|
|
||||||
|
this.o.sc.cache[this.o.descriptor.id] =
|
||||||
|
context.getImageData(this.o.base.box.left, this.o.base.box.top,
|
||||||
|
this.o.base.box.right - this.o.base.box.left,
|
||||||
|
this.o.base.box.bottom - this.o.base.box.top);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (temp_canvas == null)
|
if (temp_canvas == null)
|
||||||
|
31
spicetype.js
31
spicetype.js
@ -234,6 +234,37 @@ SpiceImage.prototype =
|
|||||||
at += this.jpeg.data.byteLength;
|
at += this.jpeg.data.byteLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.descriptor.type == SPICE_IMAGE_TYPE_JPEG_ALPHA)
|
||||||
|
{
|
||||||
|
this.jpeg_alpha = new Object;
|
||||||
|
this.jpeg_alpha.flags = dv.getUint8(at, true); at += 1;
|
||||||
|
this.jpeg_alpha.jpeg_size = dv.getUint32(at, true); at += 4;
|
||||||
|
this.jpeg_alpha.data_size = dv.getUint32(at, true); at += 4;
|
||||||
|
this.jpeg_alpha.data = mb.slice(at, this.jpeg_alpha.jpeg_size + at);
|
||||||
|
at += this.jpeg_alpha.data.byteLength;
|
||||||
|
// Alpha channel is an LZ image
|
||||||
|
this.jpeg_alpha.alpha = new Object();
|
||||||
|
this.jpeg_alpha.alpha.length = this.jpeg_alpha.data_size - this.jpeg_alpha.jpeg_size;
|
||||||
|
var initial_at = at;
|
||||||
|
this.jpeg_alpha.alpha.magic = "";
|
||||||
|
for (var i = 3; i >= 0; i--)
|
||||||
|
this.jpeg_alpha.alpha.magic += String.fromCharCode(dv.getUint8(at + i));
|
||||||
|
at += 4;
|
||||||
|
|
||||||
|
// NOTE: The endian change is *correct*
|
||||||
|
this.jpeg_alpha.alpha.version = dv.getUint32(at); at += 4;
|
||||||
|
this.jpeg_alpha.alpha.type = dv.getUint32(at); at += 4;
|
||||||
|
this.jpeg_alpha.alpha.width = dv.getUint32(at); at += 4;
|
||||||
|
this.jpeg_alpha.alpha.height = dv.getUint32(at); at += 4;
|
||||||
|
this.jpeg_alpha.alpha.stride = dv.getUint32(at); at += 4;
|
||||||
|
this.jpeg_alpha.alpha.top_down = dv.getUint32(at); at += 4;
|
||||||
|
|
||||||
|
var header_size = at - initial_at;
|
||||||
|
|
||||||
|
this.jpeg_alpha.alpha.data = mb.slice(at, this.jpeg_alpha.alpha.length + at - header_size);
|
||||||
|
at += this.jpeg_alpha.alpha.data.byteLength;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.descriptor.type == SPICE_IMAGE_TYPE_QUIC)
|
if (this.descriptor.type == SPICE_IMAGE_TYPE_QUIC)
|
||||||
{
|
{
|
||||||
this.quic = new SpiceQuic;
|
this.quic = new SpiceQuic;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user