[Spice-devel] [PATCH 2/2] Fix LZ4 supported image formats.
Christophe Fergeau
cfergeau at redhat.com
Wed Jan 21 08:27:01 PST 2015
Hey,
On Thu, Jan 15, 2015 at 12:50:45PM +0100, Javier Celaya wrote:
> - Read the original image format from the LZ4 stream. Only RGB formats
> are supported.
> - Expand 24bit to 32bit image format.
This one would also have deserved to be split in several commits.
> ---
> common/canvas_base.c | 48 +++++++++++++++++++++++++++++++++++++++++++-----
> 1 file changed, 43 insertions(+), 5 deletions(-)
>
> diff --git a/common/canvas_base.c b/common/canvas_base.c
> index bb7a424..d1a714c 100644
> --- a/common/canvas_base.c
> +++ b/common/canvas_base.c
> @@ -554,22 +554,42 @@ static pixman_image_t *canvas_get_lz4(CanvasBase *canvas, SpiceImage *image, int
> int stride;
> int stride_abs;
> uint8_t *dest, *data, *data_end;
> - int width, height, direction;
> + int width, height, top_down;
> LZ4_streamDecode_t *stream;
> + uint8_t spice_format;
> + pixman_format_code_t format;
> + uint32_t * dest32, xrgb;
> + int i32, i24;
These are only used in the '// Expand 24 to 32 bits' block so they can
be declared down there.
>
> spice_chunks_linearize(image->u.lz4.data);
> data = image->u.lz4.data->chunk[0].data;
> data_end = data + image->u.lz4.data->chunk[0].len;
> width = image->descriptor.width;
> height = image->descriptor.height;
> - direction = *(data++);
> + top_down = *(data++);
> + spice_format = *(data++);
> + switch (spice_format) {
> + case SPICE_BITMAP_FMT_16BIT:
> + format = PIXMAN_x1r5g5b5;
> + break;
> + case SPICE_BITMAP_FMT_24BIT:
> + case SPICE_BITMAP_FMT_32BIT:
> + format = PIXMAN_x8r8g8b8;
> + break;
> + case SPICE_BITMAP_FMT_RGBA:
> + format = PIXMAN_a8r8g8b8;
> + break;
> + default:
> + spice_error("Unsupported bitmap format %d with LZ4\n", spice_format);
> + return NULL;
> + }
>
> surface = surface_create(
> #ifdef WIN32
> canvas->dc,
> #endif
> - PIXMAN_a8r8g8b8,
> - width, height, direction == 0);
> + format,
> + width, height, top_down);
> if (surface == NULL) {
> spice_warning("create surface failed");
> return NULL;
> @@ -580,7 +600,7 @@ static pixman_image_t *canvas_get_lz4(CanvasBase *canvas, SpiceImage *image, int
> stride = pixman_image_get_stride(surface);
> stride_abs = abs(stride);
> available = height * stride_abs;
> - if (direction == 1) {
> + if (!top_down) {
> dest -= (stride_abs * (height - 1));
> }
>
> @@ -602,6 +622,24 @@ static pixman_image_t *canvas_get_lz4(CanvasBase *canvas, SpiceImage *image, int
> } while (data < data_end);
>
> LZ4_freeStreamDecode(stream);
> +
> + if (spice_format == SPICE_BITMAP_FMT_24BIT) {
> + // Expand 24 to 32 bits
> + dest = (uint8_t *)pixman_image_get_data(surface);
> + if (!top_down) {
> + dest -= (stride_abs * (height - 1));
> + }
> + dest32 = (uint32_t *)dest;
> + i32 = height * width;
> + i24 = (height * stride_abs * 3) / 4;
> + while (i32 > 0) {
> + xrgb = dest[--i24] << 16; // R
> + xrgb += dest[--i24] << 8; // G
> + xrgb += dest[--i24]; // B
> + dest32[--i32] = xrgb;
> + }
> + }
> +
Do you know why this is not needed for the other compression methods (or
maybe it's hidden in the autogenerated template code)?
Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20150121/a8aff020/attachment.sig>
More information about the Spice-devel
mailing list