15 # define FMT_DEPRECATED_NONMSVC 17 # define FMT_DEPRECATED_NONMSVC FMT_DEPRECATED 21 FMT_MODULE_EXPORT_BEGIN
23 enum class color : uint32_t {
24 alice_blue = 0xF0F8FF,
25 antique_white = 0xFAEBD7,
27 aquamarine = 0x7FFFD4,
32 blanched_almond = 0xFFEBCD,
34 blue_violet = 0x8A2BE2,
36 burly_wood = 0xDEB887,
37 cadet_blue = 0x5F9EA0,
38 chartreuse = 0x7FFF00,
41 cornflower_blue = 0x6495ED,
47 dark_golden_rod = 0xB8860B,
49 dark_green = 0x006400,
50 dark_khaki = 0xBDB76B,
51 dark_magenta = 0x8B008B,
52 dark_olive_green = 0x556B2F,
53 dark_orange = 0xFF8C00,
54 dark_orchid = 0x9932CC,
56 dark_salmon = 0xE9967A,
57 dark_sea_green = 0x8FBC8F,
58 dark_slate_blue = 0x483D8B,
59 dark_slate_gray = 0x2F4F4F,
60 dark_turquoise = 0x00CED1,
61 dark_violet = 0x9400D3,
63 deep_sky_blue = 0x00BFFF,
65 dodger_blue = 0x1E90FF,
66 fire_brick = 0xB22222,
67 floral_white = 0xFFFAF0,
68 forest_green = 0x228B22,
71 ghost_white = 0xF8F8FF,
73 golden_rod = 0xDAA520,
76 green_yellow = 0xADFF2F,
79 indian_red = 0xCD5C5C,
84 lavender_blush = 0xFFF0F5,
85 lawn_green = 0x7CFC00,
86 lemon_chiffon = 0xFFFACD,
87 light_blue = 0xADD8E6,
88 light_coral = 0xF08080,
89 light_cyan = 0xE0FFFF,
90 light_golden_rod_yellow = 0xFAFAD2,
91 light_gray = 0xD3D3D3,
92 light_green = 0x90EE90,
93 light_pink = 0xFFB6C1,
94 light_salmon = 0xFFA07A,
95 light_sea_green = 0x20B2AA,
96 light_sky_blue = 0x87CEFA,
97 light_slate_gray = 0x778899,
98 light_steel_blue = 0xB0C4DE,
99 light_yellow = 0xFFFFE0,
101 lime_green = 0x32CD32,
105 medium_aquamarine = 0x66CDAA,
106 medium_blue = 0x0000CD,
107 medium_orchid = 0xBA55D3,
108 medium_purple = 0x9370DB,
109 medium_sea_green = 0x3CB371,
110 medium_slate_blue = 0x7B68EE,
111 medium_spring_green = 0x00FA9A,
112 medium_turquoise = 0x48D1CC,
113 medium_violet_red = 0xC71585,
114 midnight_blue = 0x191970,
115 mint_cream = 0xF5FFFA,
116 misty_rose = 0xFFE4E1,
118 navajo_white = 0xFFDEAD,
122 olive_drab = 0x6B8E23,
124 orange_red = 0xFF4500,
126 pale_golden_rod = 0xEEE8AA,
127 pale_green = 0x98FB98,
128 pale_turquoise = 0xAFEEEE,
129 pale_violet_red = 0xDB7093,
130 papaya_whip = 0xFFEFD5,
131 peach_puff = 0xFFDAB9,
135 powder_blue = 0xB0E0E6,
137 rebecca_purple = 0x663399,
139 rosy_brown = 0xBC8F8F,
140 royal_blue = 0x4169E1,
141 saddle_brown = 0x8B4513,
143 sandy_brown = 0xF4A460,
144 sea_green = 0x2E8B57,
145 sea_shell = 0xFFF5EE,
149 slate_blue = 0x6A5ACD,
150 slate_gray = 0x708090,
152 spring_green = 0x00FF7F,
153 steel_blue = 0x4682B4,
158 turquoise = 0x40E0D0,
162 white_smoke = 0xF5F5F5,
164 yellow_green = 0x9ACD32
167 enum class terminal_color : uint8_t {
186 enum class emphasis : uint8_t {
194 strikethrough = 1 << 7,
200 FMT_CONSTEXPR
rgb() : r(0), g(0), b(0) {}
201 FMT_CONSTEXPR rgb(uint8_t r_, uint8_t g_, uint8_t b_) : r(r_), g(g_), b(b_) {}
202 FMT_CONSTEXPR rgb(uint32_t hex)
203 : r((hex >> 16) & 0xFF), g((hex >> 8) & 0xFF), b(hex & 0xFF) {}
204 FMT_CONSTEXPR rgb(
color hex)
205 : r((uint32_t(hex) >> 16) & 0xFF),
206 g((uint32_t(hex) >> 8) & 0xFF),
207 b(uint32_t(hex) & 0xFF) {}
213 FMT_BEGIN_DETAIL_NAMESPACE
220 value.rgb_color =
static_cast<uint32_t
>(rgb_color);
223 value.rgb_color = (
static_cast<uint32_t
>(rgb_color.r) << 16) |
224 (
static_cast<uint32_t
>(rgb_color.g) << 8) | rgb_color.b;
226 FMT_CONSTEXPR
color_type(terminal_color term_color) FMT_NOEXCEPT : is_rgb(),
228 value.term_color =
static_cast<uint8_t
>(term_color);
237 FMT_END_DETAIL_NAMESPACE
242 FMT_CONSTEXPR
text_style(emphasis em = emphasis()) FMT_NOEXCEPT
243 : set_foreground_color(),
244 set_background_color(),
248 if (!set_foreground_color) {
249 set_foreground_color = rhs.set_foreground_color;
250 foreground_color = rhs.foreground_color;
251 }
else if (rhs.set_foreground_color) {
252 if (!foreground_color.is_rgb || !rhs.foreground_color.is_rgb)
254 foreground_color.value.rgb_color |= rhs.foreground_color.value.rgb_color;
257 if (!set_background_color) {
258 set_background_color = rhs.set_background_color;
259 background_color = rhs.background_color;
260 }
else if (rhs.set_background_color) {
261 if (!background_color.is_rgb || !rhs.background_color.is_rgb)
263 background_color.value.rgb_color |= rhs.background_color.value.rgb_color;
266 ems =
static_cast<emphasis
>(
static_cast<uint8_t
>(ems) |
267 static_cast<uint8_t>(rhs.ems));
276 FMT_DEPRECATED_NONMSVC FMT_CONSTEXPR
text_style& operator&=(
278 return and_assign(rhs);
281 FMT_DEPRECATED_NONMSVC
friend FMT_CONSTEXPR
text_style 283 return lhs.and_assign(rhs);
286 FMT_CONSTEXPR
bool has_foreground()
const FMT_NOEXCEPT {
287 return set_foreground_color;
289 FMT_CONSTEXPR
bool has_background()
const FMT_NOEXCEPT {
290 return set_background_color;
292 FMT_CONSTEXPR
bool has_emphasis()
const FMT_NOEXCEPT {
293 return static_cast<uint8_t
>(ems) != 0;
295 FMT_CONSTEXPR detail::color_type get_foreground()
const FMT_NOEXCEPT {
296 FMT_ASSERT(has_foreground(),
"no foreground specified for this style");
297 return foreground_color;
299 FMT_CONSTEXPR detail::color_type get_background()
const FMT_NOEXCEPT {
300 FMT_ASSERT(has_background(),
"no background specified for this style");
301 return background_color;
303 FMT_CONSTEXPR emphasis get_emphasis()
const FMT_NOEXCEPT {
304 FMT_ASSERT(has_emphasis(),
"no emphasis specified for this style");
310 detail::color_type text_color) FMT_NOEXCEPT
311 : set_foreground_color(),
312 set_background_color(),
315 foreground_color = text_color;
316 set_foreground_color =
true;
318 background_color = text_color;
319 set_background_color =
true;
325 if (!set_foreground_color) {
326 set_foreground_color = rhs.set_foreground_color;
327 foreground_color = rhs.foreground_color;
328 }
else if (rhs.set_foreground_color) {
329 if (!foreground_color.is_rgb || !rhs.foreground_color.is_rgb)
331 foreground_color.value.rgb_color &= rhs.foreground_color.value.rgb_color;
334 if (!set_background_color) {
335 set_background_color = rhs.set_background_color;
336 background_color = rhs.background_color;
337 }
else if (rhs.set_background_color) {
338 if (!background_color.is_rgb || !rhs.background_color.is_rgb)
340 background_color.value.rgb_color &= rhs.background_color.value.rgb_color;
343 ems =
static_cast<emphasis
>(
static_cast<uint8_t
>(ems) &
344 static_cast<uint8_t>(rhs.ems));
348 friend FMT_CONSTEXPR_DECL
text_style fg(detail::color_type foreground)
351 friend FMT_CONSTEXPR_DECL
text_style bg(detail::color_type background)
354 detail::color_type foreground_color;
355 detail::color_type background_color;
356 bool set_foreground_color;
357 bool set_background_color;
362 FMT_CONSTEXPR
inline text_style fg(detail::color_type foreground) FMT_NOEXCEPT {
367 FMT_CONSTEXPR
inline text_style bg(detail::color_type background) FMT_NOEXCEPT {
371 FMT_CONSTEXPR
inline text_style operator|(emphasis lhs,
372 emphasis rhs) FMT_NOEXCEPT {
376 FMT_BEGIN_DETAIL_NAMESPACE
380 const char* esc) FMT_NOEXCEPT {
383 if (!text_color.is_rgb) {
384 bool is_background = esc ==
string_view(
"\x1b[48;2;");
385 uint32_t
value = text_color.value.term_color;
388 if (is_background) value += 10u;
391 buffer[index++] =
static_cast<Char
>(
'\x1b');
392 buffer[index++] =
static_cast<Char
>(
'[');
395 buffer[index++] =
static_cast<Char
>(
'1');
398 buffer[index++] =
static_cast<Char
>(
'0' + value / 10u);
399 buffer[index++] =
static_cast<Char
>(
'0' + value % 10u);
401 buffer[index++] =
static_cast<Char
>(
'm');
402 buffer[index++] =
static_cast<Char
>(
'\0');
406 for (
int i = 0; i < 7; i++) {
407 buffer[i] =
static_cast<Char
>(esc[i]);
409 rgb color(text_color.value.rgb_color);
410 to_esc(color.r,
buffer + 7,
';');
411 to_esc(color.g,
buffer + 11,
';');
412 to_esc(color.b,
buffer + 15,
'm');
413 buffer[19] =
static_cast<Char
>(0);
416 uint8_t em_codes[num_emphases] = {};
417 if (has_emphasis(em, emphasis::bold)) em_codes[0] = 1;
418 if (has_emphasis(em, emphasis::faint)) em_codes[1] = 2;
419 if (has_emphasis(em, emphasis::italic)) em_codes[2] = 3;
420 if (has_emphasis(em, emphasis::underline)) em_codes[3] = 4;
421 if (has_emphasis(em, emphasis::blink)) em_codes[4] = 5;
422 if (has_emphasis(em, emphasis::reverse)) em_codes[5] = 7;
423 if (has_emphasis(em, emphasis::conceal)) em_codes[6] = 8;
424 if (has_emphasis(em, emphasis::strikethrough)) em_codes[7] = 9;
427 for (
size_t i = 0; i < num_emphases; ++i) {
428 if (!em_codes[i])
continue;
429 buffer[index++] =
static_cast<Char
>(
'\x1b');
430 buffer[index++] =
static_cast<Char
>(
'[');
431 buffer[index++] =
static_cast<Char
>(
'0' + em_codes[i]);
432 buffer[index++] =
static_cast<Char
>(
'm');
434 buffer[index++] =
static_cast<Char
>(0);
436 FMT_CONSTEXPR
operator const Char*()
const FMT_NOEXCEPT {
return buffer; }
438 FMT_CONSTEXPR
const Char* begin()
const FMT_NOEXCEPT {
return buffer; }
439 FMT_CONSTEXPR_CHAR_TRAITS
const Char* end()
const FMT_NOEXCEPT {
444 static constexpr
size_t num_emphases = 8;
445 Char
buffer[7u + 3u * num_emphases + 1u];
447 static FMT_CONSTEXPR
void to_esc(uint8_t c, Char* out,
448 char delimiter) FMT_NOEXCEPT {
449 out[0] =
static_cast<Char
>(
'0' + c / 100);
450 out[1] =
static_cast<Char
>(
'0' + c / 10 % 10);
451 out[2] =
static_cast<Char
>(
'0' + c % 10);
452 out[3] =
static_cast<Char
>(delimiter);
454 static FMT_CONSTEXPR
bool has_emphasis(emphasis em,
455 emphasis mask) FMT_NOEXCEPT {
456 return static_cast<uint8_t
>(em) & static_cast<uint8_t>(mask);
460 template <
typename Char>
462 detail::color_type foreground) FMT_NOEXCEPT {
466 template <
typename Char>
468 detail::color_type background) FMT_NOEXCEPT {
472 template <
typename Char>
477 template <
typename Char>
478 inline void fputs(
const Char* chars, FILE* stream) FMT_NOEXCEPT {
479 std::fputs(chars, stream);
483 inline void fputs<wchar_t>(
const wchar_t* chars, FILE* stream) FMT_NOEXCEPT {
484 std::fputws(chars, stream);
487 template <
typename Char>
inline void reset_color(FILE* stream) FMT_NOEXCEPT {
488 fputs(
"\x1b[0m", stream);
491 template <>
inline void reset_color<wchar_t>(FILE* stream) FMT_NOEXCEPT {
492 fputs(L
"\x1b[0m", stream);
495 template <
typename Char>
498 buffer.
append(reset_color.begin(), reset_color.end());
501 template <
typename Char>
505 bool has_style =
false;
506 if (ts.has_emphasis()) {
508 auto emphasis = detail::make_emphasis<Char>(ts.get_emphasis());
509 buf.
append(emphasis.begin(), emphasis.end());
511 if (ts.has_foreground()) {
513 auto foreground = detail::make_foreground_color<Char>(ts.get_foreground());
514 buf.
append(foreground.begin(), foreground.end());
516 if (ts.has_background()) {
518 auto background = detail::make_background_color<Char>(ts.get_background());
519 buf.
append(background.begin(), background.end());
521 detail::vformat_to(buf, format_str, args, {});
522 if (has_style) detail::reset_color<Char>(buf);
525 FMT_END_DETAIL_NAMESPACE
527 template <
typename S,
typename Char =
char_t<S>>
528 void vprint(std::FILE* f,
const text_style& ts,
const S& format,
531 detail::vformat_to(buf, ts, to_string_view(format), args);
532 buf.push_back(Char(0));
533 detail::fputs(buf.data(), f);
547 template <
typename S,
typename... Args,
548 FMT_ENABLE_IF(detail::is_string<S>::value)>
549 void print(std::FILE* f,
const text_style& ts,
const S& format_str,
550 const Args&... args) {
551 vprint(f, ts, format_str,
552 fmt::make_args_checked<Args...>(format_str, args...));
566 template <
typename S,
typename... Args,
567 FMT_ENABLE_IF(detail::is_string<S>::value)>
568 void print(
const text_style& ts,
const S& format_str,
const Args&... args) {
569 return print(stdout, ts, format_str, args...);
572 template <
typename S,
typename Char =
char_t<S>>
573 inline std::basic_string<Char> vformat(
577 detail::vformat_to(buf, ts, to_string_view(format_str), args);
578 return fmt::to_string(buf);
593 template <
typename S,
typename... Args,
typename Char = char_t<S>>
594 inline std::basic_string<Char> format(
const text_style& ts,
const S& format_str,
595 const Args&... args) {
596 return fmt::vformat(ts, to_string_view(format_str),
597 fmt::make_args_checked<Args...>(format_str, args...));
603 template <
typename OutputIt,
typename Char,
604 FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, Char>::value)>
608 auto&& buf = detail::get_buffer<Char>(out);
609 detail::vformat_to(buf, ts, format_str, args);
610 return detail::get_iterator(buf);
625 template <
typename OutputIt,
typename S,
typename... Args,
626 bool enable = detail::is_output_iterator<OutputIt, char_t<S>>
::value&&
627 detail::is_string<S>::value>
628 inline auto format_to(OutputIt out,
const text_style& ts,
const S& format_str,
630 typename std::enable_if<enable, OutputIt>::type {
631 return vformat_to(out, ts, to_string_view(format_str),
632 fmt::make_args_checked<Args...>(format_str, args...));
635 FMT_MODULE_EXPORT_END
638 #endif // FMT_COLOR_H_ A dynamically growing memory buffer for trivially copyable/constructible types with the first SIZE el...
Definition: format.h:677
void append(const U *begin, const U *end)
Appends data to the end of the buffer.
A contiguous memory buffer with an optional growing ability.
Definition: core.h:778
A text style consisting of foreground and background colors and emphasis.
Definition: color.h:240