]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - common/lcd.c
lcd: support corner cases for splashpos
[karo-tx-uboot.git] / common / lcd.c
index 23c502106cba1cea78c9feb156c84741350ec4fc..0782d5f21c2427661efa0909ac619c58e45ee0b9 100644 (file)
@@ -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
 
@@ -621,7 +622,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
        hdr_size = get_unaligned_le16(&bmp->header.size);
        debug("hdr_size=%d, bmp_bpix=%d\n", hdr_size, bmp_bpix);
 
-       colors = 1 << bmp_bpix;
+       colors = 1ULL << bmp_bpix;
 
        bpix = NBITS(panel_info.vl_bpix);
 
@@ -644,8 +645,8 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
                return 1;
        }
 
-       debug("Display-bmp: %lu x %lu  with %llu colors, display %d\n",
-               width, height, colors, NBITS(bmp_bpix));
+       debug("Display-bmp: %lu x %lu  with %llu colors, display %llu\n",
+               width, height, colors, 1ULL << bpix);
 
        if (bmp_bpix == 8)
                lcd_set_cmap(bmp, colors);
@@ -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 +
@@ -730,7 +741,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
                }
                break;
 #endif /* CONFIG_BMP_16BPP */
-#if defined(CONFIG_BMP_24BMP)
+#if defined(CONFIG_BMP_24BPP)
        case 24:
                for (i = 0; i < height; ++i) {
                        for (j = 0; j < width; j++) {