diff --git a/include/freerdp/codec/color.h b/include/freerdp/codec/color.h index 0dffe947b..79200bee1 100644 --- a/include/freerdp/codec/color.h +++ b/include/freerdp/codec/color.h @@ -134,6 +134,15 @@ typedef struct gdi_palette gdiPalette; #endif FREERDP_API const char* FreeRDPGetColorFormatName(UINT32 format); + /** @brief convert a string to a \ref PIXEL_FORMAT + * + * @param name The string representing the format + * + * @return the \ref PIXEL_FORMAT value or \b 0 for failure + * @since version 3.18.0 + */ + FREERDP_API uint32_t FreeRDPGetColorFromatFromName(const char* name); + /*** * * Converts a pixel color in internal representation to its red, green, blue diff --git a/libfreerdp/codec/color.c b/libfreerdp/codec/color.c index c8913aa1a..24dbe99a6 100644 --- a/libfreerdp/codec/color.c +++ b/libfreerdp/codec/color.c @@ -1284,80 +1284,73 @@ DWORD FreeRDPAreColorFormatsEqualNoAlpha(DWORD first, DWORD second) const char* FreeRDPGetColorFormatName(UINT32 format) { +#define ENTRY(x) \ + case x: \ + return #x; + switch (format) { - /* 32bpp formats */ - case PIXEL_FORMAT_ARGB32: - return "PIXEL_FORMAT_ARGB32"; - - case PIXEL_FORMAT_XRGB32: - return "PIXEL_FORMAT_XRGB32"; - - case PIXEL_FORMAT_ABGR32: - return "PIXEL_FORMAT_ABGR32"; - - case PIXEL_FORMAT_XBGR32: - return "PIXEL_FORMAT_XBGR32"; - - case PIXEL_FORMAT_BGRA32: - return "PIXEL_FORMAT_BGRA32"; - - case PIXEL_FORMAT_BGRX32: - return "PIXEL_FORMAT_BGRX32"; - - case PIXEL_FORMAT_RGBA32: - return "PIXEL_FORMAT_RGBA32"; - - case PIXEL_FORMAT_RGBX32: - return "PIXEL_FORMAT_RGBX32"; - - case PIXEL_FORMAT_BGRX32_DEPTH30: - return "PIXEL_FORMAT_BGRX32_DEPTH30"; - - case PIXEL_FORMAT_RGBX32_DEPTH30: - return "PIXEL_FORMAT_RGBX32_DEPTH30"; - - /* 24bpp formats */ - case PIXEL_FORMAT_RGB24: - return "PIXEL_FORMAT_RGB24"; - - case PIXEL_FORMAT_BGR24: - return "PIXEL_FORMAT_BGR24"; - - /* 16bpp formats */ - case PIXEL_FORMAT_RGB16: - return "PIXEL_FORMAT_RGB16"; - - case PIXEL_FORMAT_BGR16: - return "PIXEL_FORMAT_BGR16"; - - case PIXEL_FORMAT_ARGB15: - return "PIXEL_FORMAT_ARGB15"; - - case PIXEL_FORMAT_RGB15: - return "PIXEL_FORMAT_RGB15"; - - case PIXEL_FORMAT_ABGR15: - return "PIXEL_FORMAT_ABGR15"; - - case PIXEL_FORMAT_BGR15: - return "PIXEL_FORMAT_BGR15"; - - /* 8bpp formats */ - case PIXEL_FORMAT_RGB8: - return "PIXEL_FORMAT_RGB8"; - - /* 4 bpp formats */ - case PIXEL_FORMAT_A4: - return "PIXEL_FORMAT_A4"; - - /* 1bpp formats */ - case PIXEL_FORMAT_MONO: - return "PIXEL_FORMAT_MONO"; + ENTRY(PIXEL_FORMAT_ARGB32) + ENTRY(PIXEL_FORMAT_XRGB32) + ENTRY(PIXEL_FORMAT_ABGR32) + ENTRY(PIXEL_FORMAT_XBGR32) + ENTRY(PIXEL_FORMAT_BGRA32) + ENTRY(PIXEL_FORMAT_BGRX32) + ENTRY(PIXEL_FORMAT_RGBA32) + ENTRY(PIXEL_FORMAT_RGBX32) + ENTRY(PIXEL_FORMAT_BGRX32_DEPTH30) + ENTRY(PIXEL_FORMAT_RGBX32_DEPTH30) + ENTRY(PIXEL_FORMAT_RGB24) + ENTRY(PIXEL_FORMAT_BGR24) + ENTRY(PIXEL_FORMAT_RGB16) + ENTRY(PIXEL_FORMAT_BGR16) + ENTRY(PIXEL_FORMAT_ARGB15) + ENTRY(PIXEL_FORMAT_RGB15) + ENTRY(PIXEL_FORMAT_ABGR15) + ENTRY(PIXEL_FORMAT_BGR15) + ENTRY(PIXEL_FORMAT_RGB8) + ENTRY(PIXEL_FORMAT_A4) + ENTRY(PIXEL_FORMAT_MONO) default: return "UNKNOWN"; } +#undef ENTRY +} + +uint32_t FreeRDPGetColorFromatFromName(const char* name) +{ +#define ENTRY(x) \ + if (strcmp(name, #x) == 0) \ + return x; + + if (!name) + return 0; + + ENTRY(PIXEL_FORMAT_ARGB32) + ENTRY(PIXEL_FORMAT_XRGB32) + ENTRY(PIXEL_FORMAT_ABGR32) + ENTRY(PIXEL_FORMAT_XBGR32) + ENTRY(PIXEL_FORMAT_BGRA32) + ENTRY(PIXEL_FORMAT_BGRX32) + ENTRY(PIXEL_FORMAT_RGBA32) + ENTRY(PIXEL_FORMAT_RGBX32) + ENTRY(PIXEL_FORMAT_BGRX32_DEPTH30) + ENTRY(PIXEL_FORMAT_RGBX32_DEPTH30) + ENTRY(PIXEL_FORMAT_RGB24) + ENTRY(PIXEL_FORMAT_BGR24) + ENTRY(PIXEL_FORMAT_RGB16) + ENTRY(PIXEL_FORMAT_BGR16) + ENTRY(PIXEL_FORMAT_ARGB15) + ENTRY(PIXEL_FORMAT_RGB15) + ENTRY(PIXEL_FORMAT_ABGR15) + ENTRY(PIXEL_FORMAT_BGR15) + ENTRY(PIXEL_FORMAT_RGB8) + ENTRY(PIXEL_FORMAT_A4) + ENTRY(PIXEL_FORMAT_MONO) + + return 0; +#undef ENTRY } void FreeRDPSplitColor(UINT32 color, UINT32 format, BYTE* _r, BYTE* _g, BYTE* _b, BYTE* _a, diff --git a/libfreerdp/codec/test/CMakeLists.txt b/libfreerdp/codec/test/CMakeLists.txt index feccefa0d..aab39bc56 100644 --- a/libfreerdp/codec/test/CMakeLists.txt +++ b/libfreerdp/codec/test/CMakeLists.txt @@ -7,6 +7,7 @@ set(DRIVER ${MODULE_NAME}.c) set(TESTS TestFreeRDPRegion.c + TestFreeRDPCodecColor.c TestFreeRDPCodecZGfx.c TestFreeRDPCodecPlanar.c TestFreeRDPCodecCopy.c diff --git a/libfreerdp/codec/test/TestFreeRDPCodecColor.c b/libfreerdp/codec/test/TestFreeRDPCodecColor.c new file mode 100644 index 000000000..74603c931 --- /dev/null +++ b/libfreerdp/codec/test/TestFreeRDPCodecColor.c @@ -0,0 +1,74 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * + * Copyright 2025 Thincast Technologies GmbH + * Copyright 2025 Armin Novak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +typedef struct +{ + uint32_t val; + const char* str; +} test_t; + +#define XSTR(s) STR(s) +#define STR(x) #x +#define ENTRY(x) { x, #x } +static const test_t testcases[] = { ENTRY(PIXEL_FORMAT_ARGB32), + ENTRY(PIXEL_FORMAT_XRGB32), + ENTRY(PIXEL_FORMAT_ABGR32), + ENTRY(PIXEL_FORMAT_XBGR32), + ENTRY(PIXEL_FORMAT_BGRA32), + ENTRY(PIXEL_FORMAT_BGRX32), + ENTRY(PIXEL_FORMAT_RGBA32), + ENTRY(PIXEL_FORMAT_RGBX32), + ENTRY(PIXEL_FORMAT_BGRX32_DEPTH30), + ENTRY(PIXEL_FORMAT_RGBX32_DEPTH30), + ENTRY(PIXEL_FORMAT_RGB24), + ENTRY(PIXEL_FORMAT_BGR24), + ENTRY(PIXEL_FORMAT_RGB16), + ENTRY(PIXEL_FORMAT_BGR16), + ENTRY(PIXEL_FORMAT_ARGB15), + ENTRY(PIXEL_FORMAT_RGB15), + ENTRY(PIXEL_FORMAT_ABGR15), + ENTRY(PIXEL_FORMAT_BGR15), + ENTRY(PIXEL_FORMAT_RGB8), + ENTRY(PIXEL_FORMAT_A4), + ENTRY(PIXEL_FORMAT_MONO) }; +#undef ENTRY +#undef STR + +int TestFreeRDPCodecColor(WINPR_ATTR_UNUSED int argc, WINPR_ATTR_UNUSED char* argv[]) +{ + const size_t count = ARRAYSIZE(testcases); + for (size_t x = 0; x < count; x++) + { + const test_t* cur = &testcases[x]; + + const char* cmp = cur->str; + const uint32_t val = FreeRDPGetColorFromatFromName(cmp); + if (val != cur->val) + return -1; + + const char* str = FreeRDPGetColorFormatName(cur->val); + if (!str || (strcmp(str, cmp) != 0)) + return -2; + } + + return 0; +}