summaryrefslogtreecommitdiff
path: root/payloads
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2015-08-12 18:49:50 -0700
committerPatrick Georgi <pgeorgi@google.com>2015-09-08 11:51:55 +0000
commitccda446e5204c99a98867f93113eea2a71b1c4c4 (patch)
tree69972ac95527a2057f98b5f4a893d38bf3492b24 /payloads
parentabe03d25e2890eec96df5b8e8372a9b5a1ffd1d0 (diff)
downloadcoreboot-ccda446e5204c99a98867f93113eea2a71b1c4c4.tar.xz
video_printf: align text
This change allows video_printf to left/center/right-align text depending on the enum value provided by the caller. This is useful especially because usually the length of formatted string is unknown before calling video_printf. BUG=none BRANCH=smaug TEST=drew fastboot screens on Smaug CQ-DEPEND=CL:296460 Reviewed-on: https://chromium-review.googlesource.com/292929 Reviewed-by: Aaron Durbin <adurbin@chromium.org> (cherry picked from commit 436f05f60c1b88626740a35913e3ad37b5c777a3) Change-Id: If1d50b7d8ddaa86eddc1618946756184cb87bfe1 Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/295413 Reviewed-on: http://review.coreboot.org/11583 Tested-by: build bot (Jenkins)
Diffstat (limited to 'payloads')
-rw-r--r--payloads/libpayload/drivers/video/video.c26
-rw-r--r--payloads/libpayload/include/libpayload.h9
2 files changed, 33 insertions, 2 deletions
diff --git a/payloads/libpayload/drivers/video/video.c b/payloads/libpayload/drivers/video/video.c
index f183517881..71140f06ba 100644
--- a/payloads/libpayload/drivers/video/video.c
+++ b/payloads/libpayload/drivers/video/video.c
@@ -162,7 +162,8 @@ void video_console_putchar(unsigned int ch)
video_console_fixup_cursor();
}
-void video_printf(int foreground, int background, const char *fmt, ...)
+void video_printf(int foreground, int background, enum video_printf_align align,
+ const char *fmt, ...)
{
int i = 0, len;
char str[200];
@@ -174,6 +175,29 @@ void video_printf(int foreground, int background, const char *fmt, ...)
if (len <= 0)
return;
+ /* vsnprintf can return len larger than size. when it happens,
+ * only size-1 characters have been actually written. */
+ if (len >= ARRAY_SIZE(str))
+ len = ARRAY_SIZE(str) - 1;
+
+ if (len > console->columns) {
+ cursorx = 0;
+ } else {
+ switch (align) {
+ case VIDEO_PRINTF_ALIGN_LEFT:
+ cursorx = 0;
+ break;
+ case VIDEO_PRINTF_ALIGN_CENTER:
+ cursorx = (console->columns - len) / 2;
+ break;
+ case VIDEO_PRINTF_ALIGN_RIGHT:
+ cursorx = console->columns - len;
+ break;
+ default:
+ break;
+ }
+ }
+
foreground &= 0xf;
foreground <<= 8;
background &= 0xf;
diff --git a/payloads/libpayload/include/libpayload.h b/payloads/libpayload/include/libpayload.h
index 3ae3590558..470aafab5a 100644
--- a/payloads/libpayload/include/libpayload.h
+++ b/payloads/libpayload/include/libpayload.h
@@ -210,7 +210,14 @@ void video_console_set_cursor(unsigned int cursorx, unsigned int cursory);
* print characters on video console with colors. note that there is a size
* restriction for the internal buffer. so, output string can be truncated.
*/
-void video_printf(int foreground, int background, const char *fmt, ...);
+enum video_printf_align {
+ VIDEO_PRINTF_ALIGN_KEEP = 0,
+ VIDEO_PRINTF_ALIGN_LEFT,
+ VIDEO_PRINTF_ALIGN_CENTER,
+ VIDEO_PRINTF_ALIGN_RIGHT,
+};
+void video_printf(int foreground, int background, enum video_printf_align align,
+ const char *fmt, ...);
/** @} */
/**