[Spice-devel] [PATCH 5/6] LZ4: Fix the row alignment when it is not on a 32bit boundary
Christophe Fergeau
cfergeau at redhat.com
Mon Jan 26 06:13:57 PST 2015
Hey,
On Thu, Jan 22, 2015 at 05:21:23PM +0100, Javier Celaya wrote:
> ---
> common/canvas_base.c | 25 +++++++++++++++++++++++--
> 1 file changed, 23 insertions(+), 2 deletions(-)
>
> diff --git a/common/canvas_base.c b/common/canvas_base.c
> index c45d535..170def1 100644
> --- a/common/canvas_base.c
> +++ b/common/canvas_base.c
> @@ -563,8 +563,7 @@ static pixman_image_t *canvas_get_lz4(CanvasBase *canvas, SpiceImage *image, int
> {
> pixman_image_t *surface = NULL;
> int dec_size, enc_size, available;
> - int stride;
> - int stride_abs;
> + int stride, stride_abs, stride_encoded;
> uint8_t *dest, *data, *data_end;
> int width, height, top_down;
> LZ4_streamDecode_t *stream;
> @@ -575,19 +574,23 @@ static pixman_image_t *canvas_get_lz4(CanvasBase *canvas, SpiceImage *image, int
> data = image->u.lz4.data->chunk[0].data;
> data_end = data + image->u.lz4.data->chunk[0].len;
> width = image->descriptor.width;
> + stride_encoded = width;
> height = image->descriptor.height;
> top_down = *(data++);
> spice_format = *(data++);
> switch (spice_format) {
> case SPICE_BITMAP_FMT_16BIT:
> format = PIXMAN_x1r5g5b5;
> + stride_encoded *= 2;
> break;
> case SPICE_BITMAP_FMT_24BIT:
> case SPICE_BITMAP_FMT_32BIT:
> format = PIXMAN_x8r8g8b8;
> + stride_encoded *= 4;
> break;
> case SPICE_BITMAP_FMT_RGBA:
> format = PIXMAN_a8r8g8b8;
> + stride_encoded *= 4;
> break;
> default:
> spice_warning("Unsupported bitmap format %d with LZ4\n", spice_format);
> @@ -631,6 +634,24 @@ static pixman_image_t *canvas_get_lz4(CanvasBase *canvas, SpiceImage *image, int
> data += enc_size;
> } while (data < data_end);
>
> + if (stride_abs > stride_encoded) {
My understanding is that this will only trigger in the 24bpp case when
the next commit adds
case SPICE_BITMAP_FMT_24BIT:
stride_encoded *= 3;
?
If so, it should be mentioned in the commit log that this only add some
helper code which will be used when 24bpp support is added or something
like this.
> + // Fix the row alignment
> + int row, col;
> + uint32_t *dest_aligned, *dest_misaligned;
> + dest = (uint8_t *)pixman_image_get_data(surface);
> + if (!top_down) {
> + dest -= (stride_abs * (height - 1));
> + }
> + stride_abs /= 4;
> + dest_aligned = (uint32_t *)dest + stride_abs*height - 1;
> + for (row = height - 1; row > 0; --row) {
> + dest_misaligned = (uint32_t*)(dest + stride_encoded*row) + stride_abs - 1;
> + for (col = 0; col < stride_abs; ++col) {
> + *dest_aligned-- = *dest_misaligned--;
> + }
Couldn't it be handled with a bunch of memmove?
for (row = height - 1; row > 0; --row) {
dest_aligned = (uint32_t *)(dest + stride_abs*row)
dest_misaligned = (uint32_t*)(dest + stride_encoded*row);
memmove(dest_aligned, dest_misaligned, stride_encoded*sizeof(uint32_t));
/* set the padding bytes to 0 if needed */
}
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/20150126/bfc1f759/attachment.sig>
More information about the Spice-devel
mailing list