From ef2f51090206ecb0c69a3bd5836b38ba2d0bddb8 Mon Sep 17 00:00:00 2001 From: Remotion Date: Sat, 9 Jun 2018 00:33:39 +0200 Subject: [PATCH 1/3] Renamed enum color to colors. Added enum colors conversion to rgb struct. Added colors_test.cpp. --- include/fmt/colors.h | 10 +++++++--- test/CMakeLists.txt | 1 + test/colors_test.cc | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 test/colors_test.cc diff --git a/include/fmt/colors.h b/include/fmt/colors.h index 665958ae..36a3fbb3 100644 --- a/include/fmt/colors.h +++ b/include/fmt/colors.h @@ -16,6 +16,8 @@ FMT_BEGIN_NAMESPACE +enum class colors : uint32_t; + // rgb is a struct for red, green and blue colors. // We use rgb as name because some editors will show it as color direct in the // editor. @@ -25,6 +27,8 @@ struct rgb { : r(r_), g(g_), b(b_) {} FMT_CONSTEXPR_DECL rgb(uint32_t hex) : r((hex >> 16) & 0xFF), g((hex >> 8) & 0xFF), b((hex) & 0xFF) {} + FMT_CONSTEXPR_DECL rgb(colors hex) + : r((uint32_t(hex) >> 16) & 0xFF), g((uint32_t(hex) >> 8) & 0xFF), b(uint32_t(hex) & 0xFF) {} uint8_t r; uint8_t g; uint8_t b; @@ -40,7 +44,7 @@ FMT_CONSTEXPR inline void to_esc(uint8_t c, char out[], int offset) { } // namespace internal -FMT_FUNC void vprint_rgb(rgb fd, string_view format, format_args args) { +inline void vprint_rgb(rgb fd, string_view format, format_args args) { char escape_fd[] = "\x1b[38;2;000;000;000m"; static FMT_CONSTEXPR_DECL const char RESET_COLOR[] = "\x1b[0m"; internal::to_esc(fd.r, escape_fd, 7); @@ -52,7 +56,7 @@ FMT_FUNC void vprint_rgb(rgb fd, string_view format, format_args args) { std::fputs(RESET_COLOR, stdout); } -FMT_FUNC void vprint_rgb(rgb fd, rgb bg, string_view format, format_args args) { +inline void vprint_rgb(rgb fd, rgb bg, string_view format, format_args args) { char escape_fd[] = "\x1b[38;2;000;000;000m"; // foreground color char escape_bg[] = "\x1b[48;2;000;000;000m"; // background color static FMT_CONSTEXPR_DECL const char RESET_COLOR[] = "\x1b[0m"; @@ -87,7 +91,7 @@ inline void print(rgb fd, rgb bg, string_view format_str, const Args & ... args) vprint_rgb(fd, bg, format_str, make_format_args(args...)); } -enum class color : uint32_t { +enum class colors : uint32_t { alice_blue = 0xF0F8FF, // rgb(240,248,255) antique_white = 0xFAEBD7, // rgb(250,235,215) aqua = 0x00FFFF, // rgb(0,255,255) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 1a8c900a..aefaa7fd 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -94,6 +94,7 @@ add_fmt_test(time-test) add_fmt_test(util-test mock-allocator.h) add_fmt_test(custom-formatter-test) add_fmt_test(ranges-test) +add_fmt_test(colors_test) if (HAVE_OPEN) add_fmt_executable(posix-mock-test diff --git a/test/colors_test.cc b/test/colors_test.cc new file mode 100644 index 00000000..b8da20d9 --- /dev/null +++ b/test/colors_test.cc @@ -0,0 +1,38 @@ +// Formatting library for C++ - the core API +// +// Copyright (c) 2012 - present, Victor Zverovich +// All rights reserved. +// +// For the license information refer to format.h. +// +// Copyright (c) 2018 - present, Remotion (Igor Schulz) +// All Rights Reserved +// {fmt} support for rgb color output. + +#include "gtest.h" +#include "gtest-extra.h" + +#include "fmt/colors.h" +#include "fmt/printf.h" + +#include +#include +#include +#include + +TEST(ColorsTest, RgbTest) { + fmt::print(fmt::rgb(10,20,30), "rgb(10,20,30) \n"); // \x1b[38;2;010;020;030mrgb(10,20,30) \n\x1b[0m + fmt::print(fmt::rgb(255,20,30), "rgb(255,20,30) \n"); // \x1b[38;2;255;020;030mrgb(255,20,30) \n\x1b[0m + fmt::print(fmt::rgb(30,255,30), "rgb(30,255,30) \n"); // \x1b[38;2;030;255;030mrgb(30,255,30) \n\x1b[0m + fmt::print(fmt::rgb(30,30,255), "rgb(30,30,255) \n"); // \x1b[38;2;030;030;255mrgb(30,30,255) \n\x1b[0m + + EXPECT_WRITE(stdout, fmt::print(fmt::rgb(255,20,30), "rgb(255,20,30)"), "\x1b[38;2;255;020;030mrgb(255,20,30)\x1b[0m"); +} + +TEST(ColorsTest, Colors) { + fmt::print(fmt::colors::blue,"blue \n"); // \x1b[38;2;000;000;255mblue \n\x1b[0m + fmt::print(fmt::colors::medium_spring_green,"medium_spring_green \n"); // \x1b[38;2;000;250;154mmedium_spring_green \n\x1b[0m + fmt::print(fmt::colors::light_golden_rod_yellow,"light_golden_rod_yellow \n"); // \x1b[38;2;250;250;210mlight_golden_rod_yellow \n\x1b[0m + + EXPECT_WRITE(stdout, fmt::print(fmt::colors::blue,"blue"), "\x1b[38;2;000;000;255mblue\x1b[0m"); +} From 74107c9bd8c1df2b74d3cb4c0d98f0dcc60813d7 Mon Sep 17 00:00:00 2001 From: Remotion Date: Sat, 9 Jun 2018 15:13:02 +0200 Subject: [PATCH 2/3] Removed print_colored. Renamed enum colors back to color. --- include/fmt/colors.h | 28 ++++++++++++++++++++++------ include/fmt/core.h | 23 ----------------------- include/fmt/format-inl.h | 16 ---------------- test/colors_test.cc | 8 ++++---- test/format-test.cc | 7 ------- 5 files changed, 26 insertions(+), 56 deletions(-) diff --git a/include/fmt/colors.h b/include/fmt/colors.h index 36a3fbb3..becd11aa 100644 --- a/include/fmt/colors.h +++ b/include/fmt/colors.h @@ -16,7 +16,7 @@ FMT_BEGIN_NAMESPACE -enum class colors : uint32_t; +enum class color : uint32_t; // rgb is a struct for red, green and blue colors. // We use rgb as name because some editors will show it as color direct in the @@ -27,7 +27,7 @@ struct rgb { : r(r_), g(g_), b(b_) {} FMT_CONSTEXPR_DECL rgb(uint32_t hex) : r((hex >> 16) & 0xFF), g((hex >> 8) & 0xFF), b((hex) & 0xFF) {} - FMT_CONSTEXPR_DECL rgb(colors hex) + FMT_CONSTEXPR_DECL rgb(color hex) : r((uint32_t(hex) >> 16) & 0xFF), g((uint32_t(hex) >> 8) & 0xFF), b(uint32_t(hex) & 0xFF) {} uint8_t r; uint8_t g; @@ -74,24 +74,40 @@ inline void vprint_rgb(rgb fd, rgb bg, string_view format, format_args args) { std::fputs(RESET_COLOR, stdout); } +/** + Formats a string and prints it to stdout using ANSI escape sequences to + specify foreground color 'fd'. + Example: + fmt::print_rgb(fmt::color::red, "Elapsed time: {0:.2f} seconds", 1.23); + */ template inline void print_rgb(rgb fd, string_view format_str, const Args & ... args) { vprint_rgb(fd, format_str, make_format_args(args...)); } -// rgb foreground color +/** + Formats a string and prints it to stdout using ANSI escape sequences to + specify foreground color 'fd'. + Example: + fmt::print(fmt::color::red, "Elapsed time: {0:.2f} seconds", 1.23); + */ template inline void print(rgb fd, string_view format_str, const Args & ... args) { vprint_rgb(fd, format_str, make_format_args(args...)); } -// rgb foreground color and background color +/** + Formats a string and prints it to stdout using ANSI escape sequences to + specify foreground color 'fd' and background color 'bg'. + Example: + fmt::print(fmt::color::red, fmt::color::black, "Elapsed time: {0:.2f} seconds", 1.23); + */ template inline void print(rgb fd, rgb bg, string_view format_str, const Args & ... args) { vprint_rgb(fd, bg, format_str, make_format_args(args...)); } -enum class colors : uint32_t { +enum class color : uint32_t { alice_blue = 0xF0F8FF, // rgb(240,248,255) antique_white = 0xFAEBD7, // rgb(250,235,215) aqua = 0x00FFFF, // rgb(0,255,255) @@ -233,7 +249,7 @@ enum class colors : uint32_t { white_smoke = 0xF5F5F5, // rgb(245,245,245) yellow = 0xFFFF00, // rgb(255,255,0) yellow_green = 0x9ACD32, // rgb(154,205,50) -}; // enum class colors +}; // enum class color FMT_END_NAMESPACE diff --git a/include/fmt/core.h b/include/fmt/core.h index cf87bce8..7568007b 100644 --- a/include/fmt/core.h +++ b/include/fmt/core.h @@ -1181,29 +1181,6 @@ inline internal::named_arg arg(wstring_view name, const T &arg) { template void arg(S, internal::named_arg) FMT_DELETED; -enum color { black, red, green, yellow, blue, magenta, cyan, white }; - -FMT_API void vprint_colored(color c, string_view format, format_args args); -FMT_API void vprint_colored(color c, wstring_view format, wformat_args args); - -/** - Formats a string and prints it to stdout using ANSI escape sequences to - specify color (experimental). - Example: - fmt::print_colored(fmt::RED, "Elapsed time: {0:.2f} seconds", 1.23); - */ -template -inline void print_colored(color c, string_view format_str, - const Args & ... args) { - vprint_colored(c, format_str, make_format_args(args...)); -} - -template -inline void print_colored(color c, wstring_view format_str, - const Args & ... args) { - vprint_colored(c, format_str, make_format_args(args...)); -} - format_context::iterator vformat_to( internal::buffer &buf, string_view format_str, format_args args); wformat_context::iterator vformat_to( diff --git a/include/fmt/format-inl.h b/include/fmt/format-inl.h index ac61d93a..c5578894 100644 --- a/include/fmt/format-inl.h +++ b/include/fmt/format-inl.h @@ -499,22 +499,6 @@ FMT_FUNC void vprint(wstring_view format_str, wformat_args args) { vprint(stdout, format_str, args); } -FMT_FUNC void vprint_colored(color c, string_view format, format_args args) { - char escape[] = "\x1b[30m"; - escape[3] = static_cast('0' + c); - std::fputs(escape, stdout); - vprint(format, args); - std::fputs(RESET_COLOR, stdout); -} - -FMT_FUNC void vprint_colored(color c, wstring_view format, wformat_args args) { - wchar_t escape[] = L"\x1b[30m"; - escape[3] = static_cast('0' + c); - std::fputws(escape, stdout); - vprint(format, args); - std::fputws(WRESET_COLOR, stdout); -} - FMT_FUNC locale locale_provider::locale() { return fmt::locale(); } FMT_END_NAMESPACE diff --git a/test/colors_test.cc b/test/colors_test.cc index b8da20d9..b2f9c08d 100644 --- a/test/colors_test.cc +++ b/test/colors_test.cc @@ -30,9 +30,9 @@ TEST(ColorsTest, RgbTest) { } TEST(ColorsTest, Colors) { - fmt::print(fmt::colors::blue,"blue \n"); // \x1b[38;2;000;000;255mblue \n\x1b[0m - fmt::print(fmt::colors::medium_spring_green,"medium_spring_green \n"); // \x1b[38;2;000;250;154mmedium_spring_green \n\x1b[0m - fmt::print(fmt::colors::light_golden_rod_yellow,"light_golden_rod_yellow \n"); // \x1b[38;2;250;250;210mlight_golden_rod_yellow \n\x1b[0m + fmt::print(fmt::color::blue,"blue \n"); // \x1b[38;2;000;000;255mblue \n\x1b[0m + fmt::print(fmt::color::medium_spring_green,"medium_spring_green \n"); // \x1b[38;2;000;250;154mmedium_spring_green \n\x1b[0m + fmt::print(fmt::color::light_golden_rod_yellow,"light_golden_rod_yellow \n"); // \x1b[38;2;250;250;210mlight_golden_rod_yellow \n\x1b[0m - EXPECT_WRITE(stdout, fmt::print(fmt::colors::blue,"blue"), "\x1b[38;2;000;000;255mblue\x1b[0m"); + EXPECT_WRITE(stdout, fmt::print(fmt::color::blue,"blue"), "\x1b[38;2;000;000;255mblue\x1b[0m"); } diff --git a/test/format-test.cc b/test/format-test.cc index e0cddd14..e0f3febb 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -1266,13 +1266,6 @@ TEST(FormatTest, Print) { #endif } -#if FMT_USE_FILE_DESCRIPTORS -TEST(FormatTest, PrintColored) { - EXPECT_WRITE(stdout, fmt::print_colored(fmt::red, "Hello, {}!\n", "world"), - "\x1b[31mHello, world!\n\x1b[0m"); -} -#endif - TEST(FormatTest, Variadic) { EXPECT_EQ("abc1", format("{}c{}", "ab", 1)); EXPECT_EQ(L"abc1", format(L"{}c{}", L"ab", 1)); From 8692deb773de627099d47372d20559d7f484a380 Mon Sep 17 00:00:00 2001 From: Remotion Date: Thu, 21 Jun 2018 14:40:24 +0200 Subject: [PATCH 3/3] Removed unnecessary inline keyword. Removed print_rgb. --- include/fmt/colors.h | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/include/fmt/colors.h b/include/fmt/colors.h index becd11aa..9aba21a6 100644 --- a/include/fmt/colors.h +++ b/include/fmt/colors.h @@ -36,7 +36,7 @@ struct rgb { namespace internal { -FMT_CONSTEXPR inline void to_esc(uint8_t c, char out[], int offset) { +FMT_CONSTEXPR void to_esc(uint8_t c, char out[], int offset) { out[offset + 0] = static_cast('0' + c / 100); out[offset + 1] = static_cast('0' + c / 10 % 10); out[offset + 2] = static_cast('0' + c % 10); @@ -74,17 +74,6 @@ inline void vprint_rgb(rgb fd, rgb bg, string_view format, format_args args) { std::fputs(RESET_COLOR, stdout); } -/** - Formats a string and prints it to stdout using ANSI escape sequences to - specify foreground color 'fd'. - Example: - fmt::print_rgb(fmt::color::red, "Elapsed time: {0:.2f} seconds", 1.23); - */ -template -inline void print_rgb(rgb fd, string_view format_str, const Args & ... args) { - vprint_rgb(fd, format_str, make_format_args(args...)); -} - /** Formats a string and prints it to stdout using ANSI escape sequences to specify foreground color 'fd'.