summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configs/sandbox_defconfig1
-rw-r--r--configs/sandbox_flattree_defconfig1
-rw-r--r--drivers/video/video_bmp.c6
-rw-r--r--test/dm/video.c46
-rw-r--r--tools/logos/denx-24bpp.bmp.gzbin0 -> 7137 bytes
5 files changed, 51 insertions, 3 deletions
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 f16d890048f..4d5a73fce09 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 00000000000..95b44d31950
--- /dev/null
+++ b/tools/logos/denx-24bpp.bmp.gz
Binary files differ