X-Git-Url: https://git.karo-electronics.de/?a=blobdiff_plain;f=common%2Flcd.c;h=eb37ecd185551de79f1249f177a2a7bb53224f00;hb=3c97c1d9ce78c8cf530974dafebb03be69f7cc0f;hp=e8c18aa0d842330c37e41708e1c7e14e4f069276;hpb=5121b8df014a80499a0d683f668804178daf0bac;p=karo-tx-uboot.git diff --git a/common/lcd.c b/common/lcd.c index e8c18aa0d8..eb37ecd185 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 @@ -636,9 +637,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) * We support displaying 8bpp BMPs on 16bpp LCDs * and displaying 24bpp BMPs on 32bpp LCDs * */ - if (bpix != bmp_bpix && - !(bmp_bpix == 8 && bpix == 16) && - !(bmp_bpix == 24 && bpix == 32)) { + if (bpix < bmp_bpix) { printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n", bpix, get_unaligned_le16(&bmp->header.bit_count)); return 1; @@ -658,11 +657,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 + @@ -689,9 +698,9 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) for (i = 0; i < height; ++i) { WATCHDOG_RESET(); for (j = 0; j < width; j++) { - if (bpix != 16) { + if (bpix == 8) { fb_put_byte(&fb, &bmap); - } else { + } else if (bpix == 16) { struct bmp_color_table_entry *entry; uint val; @@ -704,17 +713,27 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) entry->red >> 3 << 11; } *(uint16_t *)fb = val; - bmap++; fb += sizeof(uint16_t) / sizeof(*fb); + } else if (bpix == 32) { + uint32_t *fb32 = (uint32_t *)fb; + struct bmp_color_table_entry *entry; + uint val; + + if (cmap_base) { + val = cmap_base[*bmap]; + } else { + entry = &palette[*bmap]; + val = entry->blue | + entry->green << 8 | + entry->red << 16; + } + *fb32 = val; + fb += sizeof(uint32_t) / sizeof(*fb); } + bmap++; } - if (bpix > 8) { - bmap += padded_width - width; - fb -= width * bpix / 8 + lcd_line_length; - } else { - bmap += padded_width; - fb -= lcd_line_length; - } + bmap += padded_width - width; + fb -= width * bpix / 8 + lcd_line_length; } break; } @@ -739,6 +758,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) *(fb++) = *(bmap++); *(fb++) = 0; } + bmap += (padded_width - width) * 3; fb -= lcd_line_length + width * (bpix / 8); } break; @@ -759,6 +779,9 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y) } break; #endif /* CONFIG_BMP_32BPP */ + default: + printf("Logo with %ubpp on %ubpp display not supported\n", + bmp_bpix, bpix); }; lcd_sync();