| Index: src/third_party/ply-image/src/ply-frame-buffer.c
|
| diff --git a/src/third_party/ply-image/src/ply-frame-buffer.c b/src/third_party/ply-image/src/ply-frame-buffer.c
|
| old mode 100644
|
| new mode 100755
|
| index 88d6804f46e88bd87af2281ee3b40731d4fecf73..b0c64b7a0fd386b9e978839c1df3632cdc67516d
|
| --- a/src/third_party/ply-image/src/ply-frame-buffer.c
|
| +++ b/src/third_party/ply-image/src/ply-frame-buffer.c
|
| @@ -534,6 +534,7 @@ ply_frame_buffer_fill (ply_frame_buffer_t *buffer,
|
| {
|
| char *dst, *src;
|
| int hdiff, vdiff;
|
| + int lines, width;
|
|
|
| assert (buffer != NULL);
|
| assert (ply_frame_buffer_device_is_open (buffer));
|
| @@ -542,13 +543,16 @@ ply_frame_buffer_fill (ply_frame_buffer_t *buffer,
|
| hdiff = area->width - buffer->area.width;
|
| vdiff = area->height - buffer->area.height;
|
|
|
| + lines = vdiff > 0 ? buffer->area.height : area->height;
|
| + width = hdiff > 0 ? buffer->area.width : area->width;
|
| +
|
| if (hdiff >= 0)
|
| {
|
| /* image is wider than buffer */
|
| dst = &buffer->map_address[0];
|
| src = (char *) (data + hdiff / 2);
|
| } else {
|
| - dst = &buffer->map_address[(-hdiff / 2) * sizeof(*data)];
|
| + dst = &buffer->map_address[(-hdiff / 2) * buffer->bytes_per_pixel];
|
| src = (char *) data;
|
| }
|
|
|
| @@ -559,19 +563,57 @@ ply_frame_buffer_fill (ply_frame_buffer_t *buffer,
|
| }
|
| else
|
| {
|
| - dst += (-vdiff / 2) * buffer->row_stride * sizeof(*data);
|
| + dst += (-vdiff / 2) * buffer->row_stride * buffer->bytes_per_pixel;
|
| }
|
|
|
| - if (area->width == buffer->row_stride)
|
| + if (buffer->bytes_per_pixel != sizeof(*data))
|
| + {
|
| + uint16_t *src_16 = 0, *src_16_end;
|
| + int line;
|
| +
|
| + /* Handle the 16 bpp case (specifically RGB 565 case) */
|
| + if (buffer->bytes_per_pixel != 2)
|
| + return 0;
|
| +
|
| + /* Allocate temporary row pixel data storage for 16 bpp displays */
|
| + src_16 = (uint16_t *) malloc (width * sizeof(*src_16));
|
| +
|
| + if (!src_16)
|
| + return 0;
|
| +
|
| + src_16_end = src_16 + width;
|
| +
|
| + for (line = 0; line < lines; line++) {
|
| + uint32_t *src_32_temp;
|
| + uint16_t *src_16_temp;
|
| +
|
| + for (src_32_temp = (uint32_t *)src, src_16_temp = src_16;
|
| + src_16_temp != src_16_end;
|
| + src_16_temp++)
|
| + {
|
| + uint32_t src_32_value = *src_32_temp++;
|
| + *src_16_temp = (uint16_t)(
|
| + ((src_32_value & 0x00F80000) >> 8) | \
|
| + ((src_32_value & 0x0000FC00) >> 5) | \
|
| + ((src_32_value & 0x000000F8) >> 3)
|
| + );
|
| + }
|
| + memcpy (dst, src_16, width * buffer->bytes_per_pixel);
|
| +
|
| + dst += buffer->row_stride * buffer->bytes_per_pixel;
|
| + src += area->width * sizeof(*data);
|
| + }
|
| +
|
| + free (src_16);
|
| + }
|
| + else if (area->width == buffer->row_stride)
|
| {
|
| memcpy (dst, src, area->width * area->height * sizeof(*data));
|
| }
|
| else
|
| {
|
| int line;
|
| - int lines = vdiff > 0 ? buffer->area.height : area->height;
|
| - int width = hdiff > 0 ? buffer->area.width : area->width;
|
| -
|
| +
|
| for (line = 0; line < lines; line++) {
|
| memcpy (dst, src, width * sizeof(*data));
|
| dst += buffer->row_stride * sizeof(*data);
|
|
|