--- plymouth-lite-0.6.0/ply-frame-buffer.c 2015-07-02 01:04:37.625076373 +0100 +++ plymouth-lite-0.6.0.patch/ply-frame-buffer.c 2015-07-02 01:04:42.973076293 +0100 @@ -184,6 +184,58 @@ } } +static void +flush_xbgr32 (ply_frame_buffer_t *buffer) +{ + unsigned long x1, y1, x2, y2, x, y; + char *dst, *src; + + x1 = buffer->area_to_flush.x; + y1 = buffer->area_to_flush.y; + x2 = x1 + buffer->area_to_flush.width; + y2 = y1 + buffer->area_to_flush.height; + + for (y = y1; y < y2; y++) + { + dst = &buffer->map_address[(y * buffer->row_stride + x1) * 4]; + src = (char *) &buffer->shadow_buffer[y * buffer->area.width + x1]; + + for (x = x1; x < x2; x++) + { + dst[0] = src[2]; + dst[1] = src[1]; + dst[2] = src[0]; + dst[3] = src[3]; + dst += 4; + src += 4; + } + } +} + +static void +flush_rgb16 (ply_frame_buffer_t *buffer) +{ + unsigned long x1, y1, x2, y2, x, y; + unsigned short *dst; unsigned char *src; + + x1 = buffer->area_to_flush.x; + y1 = buffer->area_to_flush.y; + x2 = x1 + buffer->area_to_flush.width; + y2 = y1 + buffer->area_to_flush.height; + + for (y = y1; y < y2; y++) + { + dst = (unsigned short *)&buffer->map_address[(y * buffer->row_stride + x1) * 2]; + src = (unsigned char *) &buffer->shadow_buffer[y * buffer->area.width + x1]; + + for (x = x1; x < x2; x++) + { + *dst++ = (src[0]>>3) << 0 | (src[1]>>2) << 5 | (src[2]>>3) << 11; + src += 4; + } + } +} + static const char const *p_visual(int visual) { static const char const *visuals[] = @@ -300,6 +352,16 @@ buffer->green_bit_position == 8 && buffer->bits_for_green == 8 && buffer->blue_bit_position == 0 && buffer->bits_for_blue == 8) buffer->flush = flush_xrgb32; + else if (buffer->bytes_per_pixel == 4 && + buffer->red_bit_position == 0 && buffer->bits_for_red == 8 && + buffer->green_bit_position == 8 && buffer->bits_for_green == 8 && + buffer->blue_bit_position == 16 && buffer->bits_for_blue == 8) + buffer->flush = flush_xbgr32; + else if (buffer->bytes_per_pixel == 2 && + buffer->red_bit_position == 11 && buffer->bits_for_red == 5 && + buffer->green_bit_position == 5 && buffer->bits_for_green == 6 && + buffer->blue_bit_position == 0 && buffer->bits_for_blue == 5) + buffer->flush = flush_rgb16; else buffer->flush = flush_generic;