[codec,color] Add from string method for PIXEL_FORMAT

* Add FreeRDPGetColorFromatFromName to get a PIXEL_FORMAT from a given
  string.
* Add a unit test to ensure FreeRDPGetColorFromatFromName and
  FreeRDPGetColorFormatName work as expected
This commit is contained in:
Armin Novak
2025-09-30 12:46:12 +02:00
parent e3ae9c472b
commit 4aceae4666
4 changed files with 145 additions and 68 deletions

View File

@@ -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

View File

@@ -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,

View File

@@ -7,6 +7,7 @@ set(DRIVER ${MODULE_NAME}.c)
set(TESTS
TestFreeRDPRegion.c
TestFreeRDPCodecColor.c
TestFreeRDPCodecZGfx.c
TestFreeRDPCodecPlanar.c
TestFreeRDPCodecCopy.c

View File

@@ -0,0 +1,74 @@
/**
* FreeRDP: A Remote Desktop Protocol Implementation
*
* Copyright 2025 Thincast Technologies GmbH
* Copyright 2025 Armin Novak <anovak@thincast.com>
*
* 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 <winpr/wtypes.h>
#include <freerdp/codec/color.h>
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;
}