Skip to content

Commit

Permalink
[console] Add concept of a "magic" colour
Browse files Browse the repository at this point in the history
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 <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Dec 9, 2013
1 parent e8b5b50 commit f6dce77
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 4 deletions.
38 changes: 34 additions & 4 deletions src/core/ansicoldef.c
Expand Up @@ -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[] = {
Expand All @@ -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
*
Expand Down Expand Up @@ -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 );
Expand All @@ -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;
}
11 changes: 11 additions & 0 deletions src/include/ipxe/ansicol.h
Expand Up @@ -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

Expand Down Expand Up @@ -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 );
Expand Down

0 comments on commit f6dce77

Please sign in to comment.