6#ifndef SPDLOG_HEADER_ONLY
18template<
typename ConsoleMutex>
20 : out_handle_(out_handle)
21 , mutex_(ConsoleMutex::mutex())
33 BACKGROUND_RED | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY;
37template<
typename ConsoleMutex>
44template<
typename ConsoleMutex>
48 colors_[level] =
color;
51template<
typename ConsoleMutex>
54 if (out_handle_ ==
nullptr || out_handle_ == INVALID_HANDLE_VALUE)
63 formatter_->format(msg, formatted);
69 auto orig_attribs =
static_cast<WORD
>(set_foreground_color_(colors_[msg.
level]));
72 ::SetConsoleTextAttribute(
static_cast<HANDLE
>(out_handle_), orig_attribs);
77 write_to_file_(formatted);
81template<
typename ConsoleMutex>
87template<
typename ConsoleMutex>
94template<
typename ConsoleMutex>
98 formatter_ = std::move(sink_formatter);
101template<
typename ConsoleMutex>
105 set_color_mode_impl(mode);
108template<
typename ConsoleMutex>
115 bool in_console = ::GetConsoleMode(
static_cast<HANDLE
>(out_handle_), &console_mode) != 0;
116 should_do_colors_ = in_console;
125template<
typename ConsoleMutex>
128 CONSOLE_SCREEN_BUFFER_INFO orig_buffer_info;
129 if (!::GetConsoleScreenBufferInfo(
static_cast<HANDLE
>(out_handle_), &orig_buffer_info))
132 return FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
136 auto new_attribs =
static_cast<WORD
>(attribs) | (orig_buffer_info.wAttributes & 0xfff0);
137 auto ignored = ::SetConsoleTextAttribute(
static_cast<HANDLE
>(out_handle_),
static_cast<WORD
>(new_attribs));
139 return static_cast<std::uint16_t>(orig_buffer_info.wAttributes);
143template<
typename ConsoleMutex>
148 auto size =
static_cast<DWORD
>(end - start);
149 auto ignored = ::WriteConsoleA(
static_cast<HANDLE
>(out_handle_), formatted.data() + start, size,
nullptr,
nullptr);
154template<
typename ConsoleMutex>
157 auto size =
static_cast<DWORD
>(formatted.size());
158 DWORD bytes_written = 0;
159 auto ignored = ::WriteFile(
static_cast<HANDLE
>(out_handle_), formatted.data(), size, &bytes_written,
nullptr);
164template<
typename ConsoleMutex>
166 :
wincolor_sink<ConsoleMutex>(::GetStdHandle(STD_OUTPUT_HANDLE), mode)
170template<
typename ConsoleMutex>
172 :
wincolor_sink<ConsoleMutex>(::GetStdHandle(STD_ERROR_HANDLE), mode)
void flush() final override
std::array< std::uint16_t, level::n_levels > colors_
void log(const details::log_msg &msg) final override
void write_to_file_(const memory_buf_t &formatted)
void set_color_mode_impl(color_mode mode)
void print_range_(const memory_buf_t &formatted, size_t start, size_t end)
void set_formatter(std::unique_ptr< spdlog::formatter > sink_formatter) override final
~wincolor_sink() override
std::uint16_t set_foreground_color_(std::uint16_t attribs)
void set_pattern(const std::string &pattern) override final
void set_color_mode(color_mode mode)
wincolor_sink(void *out_handle, color_mode mode)
void set_color(level::level_enum level, std::uint16_t color)
wincolor_stderr_sink(color_mode mode=color_mode::automatic)
wincolor_stdout_sink(color_mode mode=color_mode::automatic)
fmt::basic_memory_buffer< char, 250 > memory_buf_t