From nobody Sun Sep 21 23:23:57 2025 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 78.46.105.101 is neither permitted nor denied by domain of seabios.org) client-ip=78.46.105.101; envelope-from=seabios-bounces@seabios.org; helo=coreboot.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 78.46.105.101 is neither permitted nor denied by domain of seabios.org) smtp.mailfrom=seabios-bounces@seabios.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from coreboot.org (coreboot.org [78.46.105.101]) by mx.zohomail.com with SMTPS id 1548440356628302.2070544561825; Fri, 25 Jan 2019 10:19:16 -0800 (PST) Received: from [172.30.0.99] (mailu_mailman-core_1.mailu_default [172.30.0.99]) by coreboot.org (Postfix) with ESMTP id E5A6F1120F5A; Fri, 25 Jan 2019 18:19:13 +0000 (UTC) Received: from cfa51d96e5da (mailu_mailman-web_1.mailu_default [172.30.0.8]) by coreboot.org (Postfix) with ESMTP id B1A0F1120F42 for ; Fri, 25 Jan 2019 18:19:11 +0000 (UTC) MIME-Version: 1.0 From: "Joseph Pacheco-Corwin" To: seabios@seabios.org Date: Fri, 25 Jan 2019 18:19:11 -0000 Message-ID: <154844035172.22.838027367994522728@cfa51d96e5da> User-Agent: HyperKitty on https://mail.coreboot.org/ Message-ID-Hash: BWTGCAE6F6XN2DPCQO46TT4Z573ZRPDX X-Message-ID-Hash: BWTGCAE6F6XN2DPCQO46TT4Z573ZRPDX X-MailFrom: hammersamatom@gmail.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.2.0 Precedence: list Subject: [SeaBIOS] bmp/bootsplash: Added support for 16/24/32bpp in one function List-Id: SeaBIOS mailing list Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable X-Spamd-Bar: / Authentication-Results: coreboot.org Content-Type: text/plain; charset="utf-8" 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 repl= aced with a general=20 bpp check that uses a % to check for remainder, and returns 1 if the remain= der is >0. The previous method for adjusting the BMP data (raw_data_format_adjust_24bp= p) relied on a preset 3*bytes_per_line_src, this has been changed and the multiplicat= ion 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(). Any feedback? I would appreciate it. Signed-off-by: Joseph S. Pacheco-Corwin --- src/bmp.c | 19 +++++++++---------- src/bootsplash.c | 17 +++++++++++++---- src/util.h | 2 +- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/bmp.c b/src/bmp.c index 96a2b3f..fecc295 100644 --- a/src/bmp.c +++ b/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_des= t) +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 =3D 3 * width; int i; for (i =3D 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) } =20 /* 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 *b= pp) { *width =3D bmp->width; *height =3D bmp->height; + *bpp =3D bmp->bpp; } =20 /* 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 =3D=3D pic) return 0; - /* now only support 24bpp bmp file */ - if ((depth =3D=3D 24) && (bmp->bpp =3D=3D 24)) { - raw_data_format_adjust_24bpp(bmp->datap, pic, width, height, - bytes_per_line_dest); + if ((depth =3D=3D bmp->bpp) && (bmp->bpp%8 =3D=3D 0)) { + raw_data_format_adjust(bmp->datap, pic, width, height, + (bmp->bpp/8)*width, bytes_per_line_dest); return 0; } return 1; diff --git a/src/bootsplash.c b/src/bootsplash.c index 165c98d..401c348 100644 --- a/src/bootsplash.c +++ b/src/bootsplash.c @@ -172,10 +172,13 @@ enable_bootsplash(void) dprintf(1, "bmp_decode failed with return code %d...\n", ret); goto done; } - bmp_get_size(bmp, &width, &height); - bpp_require =3D 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 8/16/24/32 bpp mod= e. + * 8bpp for BMP has corrupted colors, and lower than 8bpp fails to dis= play + * or results in a loop. + */ =20 // Try to find a graphics mode with the corresponding dimensions. int videomode =3D find_videomode(vesa_info, mode_info, width, height, @@ -192,7 +195,13 @@ enable_bootsplash(void) dprintf(3, "bytes per scanline: %d\n", mode_info->bytes_per_scanline); dprintf(3, "bits per pixel: %d\n", depth); =20 - // Allocate space for image and decompress it. + // Allocate space for image and decompress it.=20 + /* + * Has a weird issue with low bpp image files, imagesize is not + * consistent. Example: 8bpp images are correct, being essentially + * multiplied/divided by 1, but if you use 4bpp images, width is divid= ed by + * 8, when it should be divided by 2. + */ int imagesize =3D height * mode_info->bytes_per_scanline; picture =3D malloc_tmphigh(imagesize); if (!picture) { diff --git a/src/util.h b/src/util.h index 6dd080f..9c06850 100644 --- a/src/util.h +++ b/src/util.h @@ -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 *b= pp); int bmp_show(struct bmp_decdata *bmp, unsigned char *pic, int width , int height, int depth, int bytes_per_line_dest); =20 --=20 2.20.1 _______________________________________________ SeaBIOS mailing list -- seabios@seabios.org To unsubscribe send an email to seabios-leave@seabios.org