bootsplash: Added support for 16/24/32bpp in one function
Specifically added support for 16 and 32bpp files, in addition to 24bpp. The function bmp_show() in bmp.c has had the hardcoded check for 24bpp replaced with a general bpp check that uses a % to check for remainder, and returns 1 if the remainder is >0. The previous method for adjusting the BMP data (raw_data_format_adjust_24bpp) relied on a preset 3*bytes_per_line_src, this has been changed and the multiplication is now performed in the function's arguments. This change still allows someone else to reuse the same function for 1/2/4bpp support if necessary. The file util.h has been modified to reflect this decision. The changes to raw_data_format_adjust() is based on an abandoned patch by Gert Menke (submitted March 14, 2017), credit to them for that change and the addition of *bpp to bmp_get_info(). Signed-off-by: Joseph S. Pacheco-Corwin <hammersamatom@gmail.com>
This commit is contained in:
parent
34fe8660ec
commit
63d6967466
19
src/bmp.c
19
src/bmp.c
|
@ -56,10 +56,9 @@ typedef struct tagRGBQUAD {
|
|||
* arrange horizontal pixel data, add extra space in the dest buffer
|
||||
* for every line
|
||||
*/
|
||||
static void raw_data_format_adjust_24bpp(u8 *src, u8 *dest, int width,
|
||||
int height, int bytes_per_line_dest)
|
||||
static void raw_data_format_adjust(u8 *src, u8 *dest, int width,
|
||||
int height, int bytes_per_line_src, int bytes_per_line_dest)
|
||||
{
|
||||
int bytes_per_line_src = 3 * width;
|
||||
int i;
|
||||
for (i = 0 ; i < height ; i++) {
|
||||
memcpy(dest + i * bytes_per_line_dest,
|
||||
|
@ -95,22 +94,22 @@ int bmp_decode(struct bmp_decdata *bmp, unsigned char *data, int data_size)
|
|||
}
|
||||
|
||||
/* get bmp properties */
|
||||
void bmp_get_size(struct bmp_decdata *bmp, int *width, int *height)
|
||||
void bmp_get_info(struct bmp_decdata *bmp, int *width, int *height, int *bpp)
|
||||
{
|
||||
*width = bmp->width;
|
||||
*height = bmp->height;
|
||||
*bpp = bmp->bpp;
|
||||
}
|
||||
|
||||
/* flush flat picture data to *pc */
|
||||
int bmp_show(struct bmp_decdata *bmp, unsigned char *pic, int width
|
||||
, int height, int depth, int bytes_per_line_dest)
|
||||
int bmp_show(struct bmp_decdata *bmp, unsigned char *pic, int width,
|
||||
int height, int depth, int bytes_per_line_dest)
|
||||
{
|
||||
if (bmp->datap == pic)
|
||||
return 0;
|
||||
/* now only support 24bpp bmp file */
|
||||
if ((depth == 24) && (bmp->bpp == 24)) {
|
||||
raw_data_format_adjust_24bpp(bmp->datap, pic, width, height,
|
||||
bytes_per_line_dest);
|
||||
if ((depth == bmp->bpp) && (bmp->bpp%8 == 0)) {
|
||||
raw_data_format_adjust(bmp->datap, pic, width, height,
|
||||
(bmp->bpp/8)*width, bytes_per_line_dest);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
|
|
|
@ -172,10 +172,10 @@ enable_bootsplash(void)
|
|||
dprintf(1, "bmp_decode failed with return code %d...\n", ret);
|
||||
goto done;
|
||||
}
|
||||
bmp_get_size(bmp, &width, &height);
|
||||
bpp_require = 24;
|
||||
bmp_get_info(bmp, &width, &height, &bpp_require);
|
||||
}
|
||||
/* jpeg would use 16 or 24 bpp video mode, BMP use 24bpp mode only */
|
||||
|
||||
// jpeg would use 16 or 24 bpp video mode, BMP uses 16/24/32 bpp mode.
|
||||
|
||||
// Try to find a graphics mode with the corresponding dimensions.
|
||||
int videomode = find_videomode(vesa_info, mode_info, width, height,
|
||||
|
|
|
@ -12,7 +12,7 @@ void handle_1553(struct bregs *regs);
|
|||
// bmp.c
|
||||
struct bmp_decdata *bmp_alloc(void);
|
||||
int bmp_decode(struct bmp_decdata *bmp, unsigned char *data, int data_size);
|
||||
void bmp_get_size(struct bmp_decdata *bmp, int *width, int *height);
|
||||
void bmp_get_info(struct bmp_decdata *bmp, int *width, int *height, int *bpp);
|
||||
int bmp_show(struct bmp_decdata *bmp, unsigned char *pic, int width
|
||||
, int height, int depth, int bytes_per_line_dest);
|
||||
|
||||
|
|
Loading…
Reference in New Issue