20 enum class TerminalLook {
57 using TL = TerminalLook;
65 inline std::ostream& operator<<(std::ostream& out, TL look) {
69 #define SET_BIT(index_) att |= 1 << index_;
70 #define UNSET_BIT(index_) att &= ~(1 << index_);
71 #define SET_TCOLOR(val_) att = (att & 0xF8) | (val_ & 0x7);
72 #define SET_BGCOLOR(val_) att = (att & 0x8F) | (val_ & 0x70);
74 CONSOLE_SCREEN_BUFFER_INFO csbi;
75 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
76 WORD att = csbi.wAttributes & 0xFF;
79 SET_TCOLOR(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
84 SET_TCOLOR(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
92 case TL::ResetDec:
break;
93 case TL::Bold: SET_BIT(3);
break;
94 case TL::Thin: UNSET_BIT(3);
break;
95 case TL::Underline:
break;
96 case TL::Black: SET_TCOLOR(0);
break;
97 case TL::Red: SET_TCOLOR(FOREGROUND_RED);
break;
98 case TL::Green: SET_TCOLOR(FOREGROUND_GREEN);
break;
99 case TL::Yellow: SET_TCOLOR(FOREGROUND_GREEN | FOREGROUND_RED);
break;
100 case TL::Blue: SET_TCOLOR(FOREGROUND_BLUE);
break;
101 case TL::Magenta: SET_TCOLOR(FOREGROUND_BLUE | FOREGROUND_RED);
break;
102 case TL::Cyan: SET_TCOLOR(FOREGROUND_BLUE | FOREGROUND_GREEN);
break;
103 case TL::White: SET_TCOLOR(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
break;
104 case TL::BlackBG: SET_BGCOLOR(0);
break;
105 case TL::RedBG: SET_BGCOLOR(BACKGROUND_RED);
break;
106 case TL::GreenBG: SET_BGCOLOR(BACKGROUND_GREEN);
break;
107 case TL::YellowBG: SET_BGCOLOR(BACKGROUND_GREEN | BACKGROUND_RED);
break;
108 case TL::BlueBG: SET_BGCOLOR(BACKGROUND_BLUE);
break;
109 case TL::MagentaBG: SET_BGCOLOR(BACKGROUND_BLUE | BACKGROUND_RED);
break;
110 case TL::CyanBG: SET_BGCOLOR(BACKGROUND_BLUE | BACKGROUND_GREEN);
break;
111 case TL::WhiteBG: SET_BGCOLOR(BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE);
break;
118 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
119 (csbi.wAttributes & 0xFF00) | att);
126 case TL::Reset: out <<
"\033[0m";
break;
127 case TL::ResetText: out <<
"\033[39m";
break;
128 case TL::ResetBG: out <<
"\033[49m";
break;
129 case TL::ResetWeight: out <<
"\033[22m";
break;
130 case TL::ResetDec: out <<
"\033[24m";
break;
131 case TL::Bold: out <<
"\033[1m";
break;
132 case TL::Thin: out <<
"\033[2m";
break;
133 case TL::Underline: out <<
"\033[4m";
break;
134 case TL::Black: out <<
"\033[30m";
break;
135 case TL::Red: out <<
"\033[31m";
break;
136 case TL::Green: out <<
"\033[32m";
break;
137 case TL::Yellow: out <<
"\033[33m";
break;
138 case TL::Blue: out <<
"\033[34m";
break;
139 case TL::Magenta: out <<
"\033[35m";
break;
140 case TL::Cyan: out <<
"\033[36m";
break;
141 case TL::White: out <<
"\033[37m";
break;
142 case TL::BlackBG: out <<
"\033[40m";
break;
143 case TL::RedBG: out <<
"\033[41m";
break;
144 case TL::GreenBG: out <<
"\033[42m";
break;
145 case TL::YellowBG: out <<
"\033[43m";
break;
146 case TL::BlueBG: out <<
"\033[44m";
break;
147 case TL::MagentaBG: out <<
"\033[45m";
break;
148 case TL::CyanBG: out <<
"\033[46m";
break;
149 case TL::WhiteBG: out <<
"\033[47m";
break;