All Classes Files Functions Variables Typedefs Pages
TerminalLook.hpp
Go to the documentation of this file.
1 #pragma once
2 
11 #include <ostream>
12 
13 #ifdef _WIN32
14  #include <Windows.h>
15 #endif
16 
17 namespace lumina {
18 
19 
20 enum class TerminalLook {
21  // control
22  Reset, // reset all formats and colors
23  ResetText, // reset text color
24  ResetBG, // reset background color
25  ResetWeight, // reset font weight
26  ResetDec, // reset decoration
27 
28  // font weight
29  Bold, // bolder font
30  Thin, // thinner font
31 
32  // decoration
33  Underline, // underlined
34 
35  // text color
36  Black,
37  Red,
38  Green,
39  Yellow,
40  Blue,
41  Magenta,
42  Cyan,
43  White,
44 
45  // background color
46  BlackBG,
47  RedBG,
48  GreenBG,
49  YellowBG,
50  BlueBG,
51  MagentaBG,
52  CyanBG,
53  WhiteBG,
54 };
55 
56 // short typedef
57 using TL = TerminalLook;
58 
65 inline std::ostream& operator<<(std::ostream& out, TL look) {
66 
67 #ifdef _WIN32
68 
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);
73 
74  CONSOLE_SCREEN_BUFFER_INFO csbi;
75  GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
76  WORD att = csbi.wAttributes & 0xFF;
77  switch(look) {
78  case TL::Reset: // white color, black background, thin
79  SET_TCOLOR(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
80  SET_BGCOLOR(0);
81  UNSET_BIT(3);
82  break;
83  case TL::ResetText: // white text
84  SET_TCOLOR(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
85  break;
86  case TL::ResetBG: // black background
87  SET_BGCOLOR(0);
88  break;
89  case TL::ResetWeight: // thin
90  UNSET_BIT(3);
91  break;
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;
112  }
113 #undef SET_BIT
114 #undef UNSET_BIT
115 #undef SET_TCOLOR
116 #undef SET_BGCOLOR
117 
118  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
119  (csbi.wAttributes & 0xFF00) | att);
120 
121 
122 #else
123  // output special ANSI escape code, for more information:
124  // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
125  switch(look) {
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;
150  }
151 #endif
152 
153  return out;
154 }
155 
156 } // namespace lumina