I was trying to get a JPG splash screen working and found a problem displaying the image correctly. I'm going to bypass the arguments around including a splash screen inside a product that completes before the monitor can even sync; this is simply about code.
Anyway, the code as written was finding the first video mode of the correct width/height and using that. Unfortunately, the mode was a 5-5-5 while the JPG was being decoded as 5-6-5 (bits per RGB channel). The patch below add a check for the proper bits-per-channel value before accepting/using the mode. I'm not a JPG expert, so I don't know if this will work for all situations but I thought I'd submit it for review.
-- Steve G.
diff --git a/src/bootsplash.c b/src/bootsplash.c index 76b72c1..69ba018 100644 --- a/src/bootsplash.c +++ b/src/bootsplash.c @@ -53,7 +53,8 @@ static int find_videomode(struct vbe_info *vesa_info, struct vbe_mode_info *mode_info , int width, int height, int bpp_req) { - dprintf(3, "Finding vesa mode with dimensions %d/%d\n", width, height); + dprintf(3, "Finding vesa mode with dimensions %d x %d (%d bpp)\n", + width, height, bpp_req); u16 *videomodes = SEGOFF_TO_FLATPTR(vesa_info->video_mode); for (;; videomodes++) { u16 videomode = *videomodes; @@ -84,6 +85,12 @@ find_videomode(struct vbe_info *vesa_info, struct vbe_mode_info *mode_info if (depth != bpp_req) continue; } + // if this is 16 bits per pixel but R:G:B is not 5:6:5 format, continue + if ((depth == 16) && + ((mode_info->red_size != 5) || + (mode_info->green_size != 6) || + (mode_info->blue_size != 5))) + continue; return videomode; } }