forked from OSchip/llvm-project
[raw_ostream] When printing color on Windows, use correct bg color.
When using SetConsoleTextAttribute() to set the foreground or background color, if you don't explicitly set both colors, then a default value of black will be chosen for whichever you don't specify a value for. This is annoying when you have a non default console background color, for example, and you try to set the foreground color. This patch gets the existing fg/bg color and when you set one attribute, sets the opposite attribute to its existing color prior to comitting the update. Reviewed by: Aaron Ballman Differential Revision: http://reviews.llvm.org/D7967 llvm-svn: 230859
This commit is contained in:
parent
1b7b56fbcc
commit
9e1ce99d81
|
@ -329,6 +329,16 @@ class DefaultColors
|
|||
};
|
||||
|
||||
DefaultColors defaultColors;
|
||||
|
||||
WORD fg_color(WORD color) {
|
||||
return color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
|
||||
FOREGROUND_INTENSITY | FOREGROUND_RED);
|
||||
}
|
||||
|
||||
WORD bg_color(WORD color) {
|
||||
return color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
|
||||
BACKGROUND_INTENSITY | BACKGROUND_RED);
|
||||
}
|
||||
}
|
||||
|
||||
bool Process::ColorNeedsFlush() {
|
||||
|
@ -350,6 +360,7 @@ const char *Process::OutputBold(bool bg) {
|
|||
const char *Process::OutputColor(char code, bool bold, bool bg) {
|
||||
if (UseANSI) return colorcodes[bg?1:0][bold?1:0][code&7];
|
||||
|
||||
WORD current = DefaultColors::GetCurrentColor();
|
||||
WORD colors;
|
||||
if (bg) {
|
||||
colors = ((code&1) ? BACKGROUND_RED : 0) |
|
||||
|
@ -357,12 +368,14 @@ const char *Process::OutputColor(char code, bool bold, bool bg) {
|
|||
((code&4) ? BACKGROUND_BLUE : 0);
|
||||
if (bold)
|
||||
colors |= BACKGROUND_INTENSITY;
|
||||
colors |= fg_color(current);
|
||||
} else {
|
||||
colors = ((code&1) ? FOREGROUND_RED : 0) |
|
||||
((code&2) ? FOREGROUND_GREEN : 0 ) |
|
||||
((code&4) ? FOREGROUND_BLUE : 0);
|
||||
if (bold)
|
||||
colors |= FOREGROUND_INTENSITY;
|
||||
colors |= bg_color(current);
|
||||
}
|
||||
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colors);
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue