[U-Boot] [PATCH 0/2] Fix BMP decode when BMP size is bigger than framebuffer

This series is fixing 2 issues found when trying to decode BMP bigger than the framebuffer: - video_splash_align_axis() must calculate the absolute value of difference between panel_size and picture_size. - Don't rely on BMP's width and height but in width and height value computed by video_bmp_display().
Patrice Chotard (2): video: bmp: Fix video_splash_align_axis() video: bmp: Fix video_display_rle8_bitmap()
drivers/video/video_bmp.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)

In case the panel_size is smaller than picture_size, we must insure that panel_picture_delta stores the absolute value of difference between panel_size and picture_size.
Signed-off-by: Patrice Chotard patrice.chotard@st.com CC: Yannick Fertré yannick.fertre@st.com ---
drivers/video/video_bmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/video/video_bmp.c b/drivers/video/video_bmp.c index 193f37d275..dc6258ce78 100644 --- a/drivers/video/video_bmp.c +++ b/drivers/video/video_bmp.c @@ -157,7 +157,7 @@ __weak void fb_put_word(uchar **fb, uchar **from) static void video_splash_align_axis(int *axis, unsigned long panel_size, unsigned long picture_size) { - unsigned long panel_picture_delta = panel_size - picture_size; + unsigned long panel_picture_delta = abs(panel_size - picture_size); unsigned long axis_alignment;
if (*axis == BMP_ALIGN_CENTER)

Hi,
From: Patrice CHOTARD patrice.chotard@st.com Sent: mercredi 20 novembre 2019 11:44
In case the panel_size is smaller than picture_size, we must insure that panel_picture_delta stores the absolute value of difference between panel_size and picture_size.
Signed-off-by: Patrice Chotard patrice.chotard@st.com CC: Yannick Fertré yannick.fertre@st.com
drivers/video/video_bmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/video/video_bmp.c b/drivers/video/video_bmp.c index 193f37d275..dc6258ce78 100644 --- a/drivers/video/video_bmp.c +++ b/drivers/video/video_bmp.c @@ -157,7 +157,7 @@ __weak void fb_put_word(uchar **fb, uchar **from) static void video_splash_align_axis(int *axis, unsigned long panel_size, unsigned long picture_size) {
- unsigned long panel_picture_delta = panel_size - picture_size;
- unsigned long panel_picture_delta = abs(panel_size - picture_size);
I think this patch cause alignment issue if picture_size > panel_size. (not alligne a the left/up corner).
I think it is beeter to change type:
+ long panel_picture_delta = panel_size - picture_size;
As value is cropped to 0 in the next lines:
*axis = max(0, (int)axis_alignment);
unsigned long axis_alignment;
if (*axis == BMP_ALIGN_CENTER)
2.17.1
Regards
Patrick

On 11/20/19 12:06 PM, Patrick DELAUNAY wrote:
Hi,
From: Patrice CHOTARD patrice.chotard@st.com Sent: mercredi 20 novembre 2019 11:44
In case the panel_size is smaller than picture_size, we must insure that panel_picture_delta stores the absolute value of difference between panel_size and picture_size.
Signed-off-by: Patrice Chotard patrice.chotard@st.com CC: Yannick Fertré yannick.fertre@st.com
drivers/video/video_bmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/video/video_bmp.c b/drivers/video/video_bmp.c index 193f37d275..dc6258ce78 100644 --- a/drivers/video/video_bmp.c +++ b/drivers/video/video_bmp.c @@ -157,7 +157,7 @@ __weak void fb_put_word(uchar **fb, uchar **from) static void video_splash_align_axis(int *axis, unsigned long panel_size, unsigned long picture_size) {
- unsigned long panel_picture_delta = panel_size - picture_size;
- unsigned long panel_picture_delta = abs(panel_size - picture_size);
I think this patch cause alignment issue if picture_size > panel_size. (not alligne a the left/up corner).
I think it is beeter to change type:
- long panel_picture_delta = panel_size - picture_size;
As value is cropped to 0 in the next lines:
*axis = max(0, (int)axis_alignment);
Agree, i will update this in V2
Thanks
unsigned long axis_alignment;
if (*axis == BMP_ALIGN_CENTER)
2.17.1
Regards
Patrick

In case the BMP size is bigger than the frame buffer, don't use the BMP's width and height in video_display_rle8_bitmap, but the one's checked in video_bmp_display() as parameters to video_display_rle8_bitmap().
Signed-off-by: Patrice Chotard patrice.chotard@st.com CC: Yannick Fertré yannick.fertre@st.com
---
drivers/video/video_bmp.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/drivers/video/video_bmp.c b/drivers/video/video_bmp.c index dc6258ce78..f3a6d04682 100644 --- a/drivers/video/video_bmp.c +++ b/drivers/video/video_bmp.c @@ -40,18 +40,16 @@ static void draw_encoded_bitmap(ushort **fbp, ushort col, int cnt)
static void video_display_rle8_bitmap(struct udevice *dev, struct bmp_image *bmp, ushort *cmap, - uchar *fb, int x_off, int y_off) + uchar *fb, int x_off, int y_off, + ulong width, ulong height) { struct video_priv *priv = dev_get_uclass_priv(dev); uchar *bmap; - ulong width, height; ulong cnt, runlen; int x, y; int decode = 1;
debug("%s\n", __func__); - width = get_unaligned_le32(&bmp->header.width); - height = get_unaligned_le32(&bmp->header.height); bmap = (uchar *)bmp + get_unaligned_le32(&bmp->header.data_offset);
x = 0; @@ -277,7 +275,7 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y, return -EPROTONOSUPPORT; } video_display_rle8_bitmap(dev, bmp, cmap_base, fb, x, - y); + y, width, height); break; } #endif
participants (3)
-
Patrice CHOTARD
-
Patrice Chotard
-
Patrick DELAUNAY