From f6dce77b15e34e105b48116bde5f405537898aaf Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 9 Dec 2013 15:30:59 +0000 Subject: [PATCH] [console] Add concept of a "magic" colour The magic basic colour can be remapped at runtime from COLOR_NORMAL_BG (usually blue) to COLOR_DEFAULT (which will be transparent as a background colour on the framebuffer console). Signed-off-by: Michael Brown --- src/core/ansicoldef.c | 38 ++++++++++++++++++++++++++++++++++---- src/include/ipxe/ansicol.h | 11 +++++++++++ 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/core/ansicoldef.c b/src/core/ansicoldef.c index 561356114..dd89f3b70 100644 --- a/src/core/ansicoldef.c +++ b/src/core/ansicoldef.c @@ -86,9 +86,14 @@ FILE_LICENCE ( GPL2_OR_LATER ); * @v basic Basic colour * @ret ansicol ANSI colour definition * - * Colours default to being just a basic colour. + * Colours default to being just a basic colour. If the colour + * matches the normal UI text background colour, then its basic colour + * value is set to @c ANSICOL_MAGIC. */ -#define ANSICOL_DEFAULT( basic ) ANSICOL_DEFINE ( (basic), ANSICOL_NO_RGB ) +#define ANSICOL_DEFAULT( basic ) \ + ANSICOL_DEFINE ( ( ( (basic) == COLOR_NORMAL_BG ) ? \ + ANSICOL_MAGIC : (basic) ), \ + ANSICOL_NO_RGB ) /** ANSI colour definitions */ static uint32_t ansicols[] = { @@ -102,6 +107,9 @@ static uint32_t ansicols[] = { [COLOR_WHITE] = ANSICOL_DEFAULT ( COLOR_WHITE ), }; +/** Magic basic colour */ +static uint8_t ansicol_magic = COLOR_NORMAL_BG; + /** * Define ANSI colour * @@ -145,10 +153,10 @@ void ansicol_set ( unsigned int colour, unsigned int which ) { ansicol = ANSICOL_DEFINE ( COLOUR_DEFAULT, ANSICOL_NO_RGB ); } - /* If basic colour is out of range, use the default colour */ + /* If basic colour is out of range, use the magic colour */ basic = ANSICOL_BASIC ( ansicol ); if ( basic >= 10 ) - basic = COLOR_DEFAULT; + basic = ansicol_magic; /* Set basic colour first */ printf ( CSI "%c%dm", which, basic ); @@ -159,3 +167,25 @@ void ansicol_set ( unsigned int colour, unsigned int which ) { ANSICOL_GREEN ( ansicol ), ANSICOL_BLUE ( ansicol ) ); } } + +/** + * Reset magic colour + * + */ +void ansicol_reset_magic ( void ) { + + /* Set to the compile-time default background colour */ + ansicol_magic = COLOR_NORMAL_BG; +} + +/** + * Set magic colour to transparent + * + */ +void ansicol_set_magic_transparent ( void ) { + + /* Set to the console default colour (which will give a + * transparent background on the framebuffer console). + */ + ansicol_magic = COLOR_DEFAULT; +} diff --git a/src/include/ipxe/ansicol.h b/src/include/ipxe/ansicol.h index 2fa084626..707d1599d 100644 --- a/src/include/ipxe/ansicol.h +++ b/src/include/ipxe/ansicol.h @@ -16,6 +16,15 @@ FILE_LICENCE ( GPL2_OR_LATER ); #define COLOUR_DEFAULT 9 #define COLOR_DEFAULT COLOUR_DEFAULT +/** Magic colour + * + * The magic basic colour is automatically remapped to the colour + * stored in @c ansicol_magic. This is used to allow the UI + * background to automatically become transparent when a background + * picture is used. + */ +#define ANSICOL_MAGIC 15 + /** RGB value for "not defined" */ #define ANSICOL_NO_RGB 0x01000000 @@ -66,6 +75,8 @@ extern int ansicol_define_pair ( unsigned int cpair, unsigned int foreground, /* ansicoldef.c */ extern int ansicol_define ( unsigned int colour, unsigned int ansi, uint32_t rgb ); +extern void ansicol_reset_magic ( void ); +extern void ansicol_set_magic_transparent ( void ); /* Function provided by ansicol.c but overridden by ansicoldef.c, if present */ extern void ansicol_set ( unsigned int colour, unsigned int which );