From ccda446e5204c99a98867f93113eea2a71b1c4c4 Mon Sep 17 00:00:00 2001 From: Daisuke Nojiri Date: Wed, 12 Aug 2015 18:49:50 -0700 Subject: 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 (cherry picked from commit 436f05f60c1b88626740a35913e3ad37b5c777a3) Change-Id: If1d50b7d8ddaa86eddc1618946756184cb87bfe1 Signed-off-by: Daisuke Nojiri Reviewed-on: https://chromium-review.googlesource.com/295413 Reviewed-on: http://review.coreboot.org/11583 Tested-by: build bot (Jenkins) --- payloads/libpayload/drivers/video/video.c | 26 +++++++++++++++++++++++++- payloads/libpayload/include/libpayload.h | 9 ++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) (limited to 'payloads') 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, ...); /** @} */ /** -- cgit v1.2.3