]> git.sur5r.net Git - u-boot/commitdiff
video: fix bug in cfb_console.c code
authorAnatolij Gustschin <agust@denx.de>
Thu, 23 Apr 2009 10:35:22 +0000 (12:35 +0200)
committerAnatolij Gustschin <agust@denx.de>
Tue, 28 Apr 2009 08:55:13 +0000 (10:55 +0200)
Fix bug in drawing long version/info strings:
U-Boot version string like
"U-Boot 2009.03-05647-g7c51e06 (Apr 23 2009 - 12:40:00) MPC83XX"
is long and doesn't wrap around correctly while drawing
beside the logo. Such long strings partially overwrite
the logo. This patch is an attempt to fix it.

Signed-off-by: Anatolij Gustschin <agust@denx.de>
drivers/video/cfb_console.c

index 779aa4b53e49da3b7eea4814dce0feeef9d48f14..5ee2314f3cd5e83c05bb8c3c53cedb08a8018c7b 100644 (file)
@@ -1181,6 +1181,7 @@ static void *video_logo (void)
 {
        char info[128];
        extern char version_string;
+       int space, len, y_off = 0;
 
 #ifdef CONFIG_SPLASH_SCREEN
        char *s;
@@ -1198,7 +1199,19 @@ static void *video_logo (void)
        logo_plot (video_fb_address, VIDEO_COLS, 0, 0);
 
        sprintf (info, " %s", &version_string);
-       video_drawstring (VIDEO_INFO_X, VIDEO_INFO_Y, (uchar *)info);
+
+       space = (VIDEO_LINE_LEN / 2 - VIDEO_INFO_X) / VIDEO_FONT_WIDTH;
+       len = strlen(info);
+
+       if (len > space) {
+               video_drawchars (VIDEO_INFO_X, VIDEO_INFO_Y,
+                                (uchar *)info, space);
+               video_drawchars (VIDEO_INFO_X + VIDEO_FONT_WIDTH,
+                                VIDEO_INFO_Y + VIDEO_FONT_HEIGHT,
+                                (uchar *)info + space, len - space);
+               y_off = 1;
+       } else
+               video_drawstring (VIDEO_INFO_X, VIDEO_INFO_Y, (uchar *)info);
 
 #ifdef CONFIG_CONSOLE_EXTRA_INFO
        {
@@ -1206,10 +1219,27 @@ static void *video_logo (void)
 
                for (i = 1; i < n; i++) {
                        video_get_info_str (i, info);
-                       if (*info)
+                       if (!*info)
+                               continue;
+
+                       len = strlen(info);
+                       if (len > space) {
+                               video_drawchars (VIDEO_INFO_X,
+                                                VIDEO_INFO_Y +
+                                                (i + y_off) * VIDEO_FONT_HEIGHT,
+                                                (uchar *)info, space);
+                               y_off++;
+                               video_drawchars (VIDEO_INFO_X + VIDEO_FONT_WIDTH,
+                                                VIDEO_INFO_Y +
+                                                (i + y_off) * VIDEO_FONT_HEIGHT,
+                                                (uchar *)info + space,
+                                                len - space);
+                       } else {
                                video_drawstring (VIDEO_INFO_X,
-                                                 VIDEO_INFO_Y + i * VIDEO_FONT_HEIGHT,
+                                                 VIDEO_INFO_Y +
+                                                 (i + y_off) * VIDEO_FONT_HEIGHT,
                                                  (uchar *)info);
+                       }
                }
        }
 #endif