From 660c8305bddf0f45b649b007f267f2c7fa70a340 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Lothar=20Wa=C3=9Fmann?= Date: Thu, 4 Feb 2016 12:00:58 +0100 Subject: [PATCH] lcd: support corner cases for splashpos --- common/lcd.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/common/lcd.c b/common/lcd.c index e8c18aa0d8..0782d5f21c 100644 --- a/common/lcd.c +++ b/common/lcd.c @@ -418,17 +418,18 @@ static inline void lcd_logo_plot(int x, int y) {} static void splash_align_axis(int *axis, unsigned long panel_size, unsigned long picture_size) { - unsigned long panel_picture_delta = panel_size - picture_size; - unsigned long axis_alignment; + int panel_picture_delta = panel_size - picture_size; + int axis_alignment; if (*axis == BMP_ALIGN_CENTER) axis_alignment = panel_picture_delta / 2; + else if (abs(*axis) > (int)panel_size) + axis_alignment = panel_size; else if (*axis < 0) axis_alignment = panel_picture_delta + *axis + 1; else return; - - *axis = max(0, (int)axis_alignment); + *axis = axis_alignment; } #endif @@ -658,11 +659,21 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) #endif /* CONFIG_SPLASH_SCREEN_ALIGN */ bmap = (uchar *)bmp + get_unaligned_le32(&bmp->header.data_offset); - if ((x + width) > pwidth) + if (x < 0) { + width += x; + bmap += -x * bmp_bpix / 8; + x = 0; + } + if ((x + width) > pwidth) { width = pwidth - x; + } + if (y < 0) { + height += y; + y = 0; + } if ((y + height) > panel_info.vl_row) { + bmap += (y + height - panel_info.vl_row) * bmp_bpix / 8 * padded_width; height = panel_info.vl_row - y; - bmap += (panel_info.vl_row - y) * padded_width; } fb = (uchar *)(lcd_base + -- 2.39.2