
At present this uses RGB555 format for blitting to a display. Sandbox uses 565 and that seems to be more normal for BMP as well. Update the code accordingly and add a test.
Note that this likely breaks the theadorable board so we may need to discuss supporting both formats.
Signed-off-by: Simon Glass sjg@chromium.org ---
configs/sandbox_defconfig | 1 + configs/sandbox_flattree_defconfig | 1 + drivers/video/video_bmp.c | 6 ++-- test/dm/video.c | 46 +++++++++++++++++++++++++++++ tools/logos/denx-24bpp.bmp.gz | Bin 0 -> 7137 bytes 5 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 tools/logos/denx-24bpp.bmp.gz
diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index 5dffc704bd6..4f413582fb2 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -286,6 +286,7 @@ CONFIG_SANDBOX_OSD=y CONFIG_SPLASH_SCREEN_ALIGN=y CONFIG_VIDEO_BMP_RLE8=y CONFIG_BMP_16BPP=y +CONFIG_BMP_24BPP=y CONFIG_W1=y CONFIG_W1_GPIO=y CONFIG_W1_EEPROM=y diff --git a/configs/sandbox_flattree_defconfig b/configs/sandbox_flattree_defconfig index e879ca40041..ca81df89b32 100644 --- a/configs/sandbox_flattree_defconfig +++ b/configs/sandbox_flattree_defconfig @@ -199,6 +199,7 @@ CONFIG_OSD=y CONFIG_SANDBOX_OSD=y CONFIG_VIDEO_BMP_RLE8=y CONFIG_BMP_16BPP=y +CONFIG_BMP_24BPP=y CONFIG_CMD_DHRYSTONE=y CONFIG_RSA_VERIFY_WITH_PKEY=y CONFIG_TPM=y diff --git a/drivers/video/video_bmp.c b/drivers/video/video_bmp.c index ba36589effb..1c613567657 100644 --- a/drivers/video/video_bmp.c +++ b/drivers/video/video_bmp.c @@ -338,9 +338,9 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y, for (i = 0; i < height; ++i) { for (j = 0; j < width; j++) { if (bpix == 16) { - /* 16bit 555RGB format */ - *(u16 *)fb = ((bmap[2] >> 3) << 10) | - ((bmap[1] >> 3) << 5) | + /* 16bit 565RGB format */ + *(u16 *)fb = ((bmap[2] >> 3) << 11) | + ((bmap[1] >> 2) << 5) | (bmap[0] >> 3); bmap += 3; fb += 2; diff --git a/test/dm/video.c b/test/dm/video.c index c496b05df76..4e76574a913 100644 --- a/test/dm/video.c +++ b/test/dm/video.c @@ -363,6 +363,52 @@ static int dm_test_video_bmp16(struct unit_test_state *uts) } DM_TEST(dm_test_video_bmp16, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
+/* Test drawing a 24bpp bitmap file on a 16bpp display */ +static int dm_test_video_bmp24(struct unit_test_state *uts) +{ + ulong src, src_len = ~0UL; + uint dst_len = ~0U; + struct udevice *dev; + ulong dst = 0x10000; + + ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev)); + ut_assertnonnull(dev); + ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP16)); + + ut_assertok(read_file(uts, "tools/logos/denx-24bpp.bmp.gz", &src)); + ut_assertok(gunzip(map_sysmem(dst, 0), dst_len, map_sysmem(src, 0), + &src_len)); + + ut_assertok(video_bmp_display(dev, dst, 0, 0, false)); + ut_asserteq(3656, compress_frame_buffer(uts, dev)); + + return 0; +} +DM_TEST(dm_test_video_bmp24, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT); + +/* Test drawing a 24bpp bitmap file on a 32bpp display */ +static int dm_test_video_bmp24_32(struct unit_test_state *uts) +{ + ulong src, src_len = ~0UL; + uint dst_len = ~0U; + struct udevice *dev; + ulong dst = 0x10000; + + ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev)); + ut_assertnonnull(dev); + ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP32)); + + ut_assertok(read_file(uts, "tools/logos/denx-24bpp.bmp.gz", &src)); + ut_assertok(gunzip(map_sysmem(dst, 0), dst_len, map_sysmem(src, 0), + &src_len)); + + ut_assertok(video_bmp_display(dev, dst, 0, 0, false)); + ut_asserteq(6827, compress_frame_buffer(uts, dev)); + + return 0; +} +DM_TEST(dm_test_video_bmp24_32, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT); + /* Test drawing a bitmap file on a 32bpp display */ static int dm_test_video_bmp32(struct unit_test_state *uts) { diff --git a/tools/logos/denx-24bpp.bmp.gz b/tools/logos/denx-24bpp.bmp.gz new file mode 100644 index 0000000000000000000000000000000000000000..95b44d31950994a4dc6a5148a4a754d9979e2dc6 GIT binary patch literal 7137 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 XFkhp$qYo(v6l?kesVxqUdMp6|Hsv3k
literal 0 HcmV?d00001