FreeRDP
Loading...
Searching...
No Matches
utils/gfx.c
1
22#include <freerdp/utils/gfx.h>
23#include <freerdp/channels/rdpgfx.h>
24
25const char* rdpgfx_get_cmd_id_string(UINT16 cmdId)
26{
27#define EVCASE(x) \
28 case x: \
29 return #x
30 switch (cmdId)
31 {
32 EVCASE(RDPGFX_CMDID_UNUSED_0000);
33 EVCASE(RDPGFX_CMDID_WIRETOSURFACE_1);
34 EVCASE(RDPGFX_CMDID_WIRETOSURFACE_2);
35 EVCASE(RDPGFX_CMDID_DELETEENCODINGCONTEXT);
36 EVCASE(RDPGFX_CMDID_SOLIDFILL);
37 EVCASE(RDPGFX_CMDID_SURFACETOSURFACE);
38 EVCASE(RDPGFX_CMDID_SURFACETOCACHE);
39 EVCASE(RDPGFX_CMDID_CACHETOSURFACE);
40 EVCASE(RDPGFX_CMDID_EVICTCACHEENTRY);
41 EVCASE(RDPGFX_CMDID_CREATESURFACE);
42 EVCASE(RDPGFX_CMDID_DELETESURFACE);
43 EVCASE(RDPGFX_CMDID_STARTFRAME);
44 EVCASE(RDPGFX_CMDID_ENDFRAME);
45 EVCASE(RDPGFX_CMDID_FRAMEACKNOWLEDGE);
46 EVCASE(RDPGFX_CMDID_RESETGRAPHICS);
47 EVCASE(RDPGFX_CMDID_MAPSURFACETOOUTPUT);
48 EVCASE(RDPGFX_CMDID_CACHEIMPORTOFFER);
49 EVCASE(RDPGFX_CMDID_CACHEIMPORTREPLY);
50 EVCASE(RDPGFX_CMDID_CAPSADVERTISE);
51 EVCASE(RDPGFX_CMDID_CAPSCONFIRM);
52 EVCASE(RDPGFX_CMDID_UNUSED_0014);
53 EVCASE(RDPGFX_CMDID_MAPSURFACETOWINDOW);
54 EVCASE(RDPGFX_CMDID_QOEFRAMEACKNOWLEDGE);
55 EVCASE(RDPGFX_CMDID_MAPSURFACETOSCALEDOUTPUT);
56 EVCASE(RDPGFX_CMDID_MAPSURFACETOSCALEDWINDOW);
57 EVCASE(RDPGFX_CMDID_PROTECT_SURFACE);
58 EVCASE(RDPGFX_CMDID_WATERMARK);
59 default:
60 return "RDPGFX_CMDID_UNKNOWN";
61 }
62#undef EVCASE
63}
64
65const char* rdpgfx_get_codec_id_string(UINT16 codecId)
66{
67 switch (codecId)
68 {
69#if defined(WITH_GFX_AV1)
70 case RDPGFX_CODECID_AV1:
71 return "RDPGFX_CODECID_AV1";
72#endif
73
74 case RDPGFX_CODECID_UNCOMPRESSED:
75 return "RDPGFX_CODECID_UNCOMPRESSED";
76
77 case RDPGFX_CODECID_CAVIDEO:
78 return "RDPGFX_CODECID_CAVIDEO";
79
80 case RDPGFX_CODECID_CLEARCODEC:
81 return "RDPGFX_CODECID_CLEARCODEC";
82
83 case RDPGFX_CODECID_PLANAR:
84 return "RDPGFX_CODECID_PLANAR";
85
86 case RDPGFX_CODECID_AVC420:
87 return "RDPGFX_CODECID_AVC420";
88
89 case RDPGFX_CODECID_AVC444:
90 return "RDPGFX_CODECID_AVC444";
91
92 case RDPGFX_CODECID_AVC444v2:
93 return "RDPGFX_CODECID_AVC444v2";
94
95 case RDPGFX_CODECID_ALPHA:
96 return "RDPGFX_CODECID_ALPHA";
97
98 case RDPGFX_CODECID_CAPROGRESSIVE:
99 return "RDPGFX_CODECID_CAPROGRESSIVE";
100
101 case RDPGFX_CODECID_CAPROGRESSIVE_V2:
102 return "RDPGFX_CODECID_CAPROGRESSIVE_V2";
103 default:
104 break;
105 }
106
107 return "RDPGFX_CODECID_UNKNOWN";
108}
109
110const char* rdpgfx_caps_version_str(UINT32 capsVersion)
111{
112#define EVCASE(x) \
113 case x: \
114 return #x
115
116 switch (capsVersion)
117 {
118#if defined(WITH_GFX_AV1)
119 EVCASE(RDPGFX_CAPVERSION_FRDP_1);
120#endif
121 EVCASE(RDPGFX_CAPVERSION_8);
122 EVCASE(RDPGFX_CAPVERSION_81);
123 EVCASE(RDPGFX_CAPVERSION_10);
124 EVCASE(RDPGFX_CAPVERSION_101);
125 EVCASE(RDPGFX_CAPVERSION_102);
126 EVCASE(RDPGFX_CAPVERSION_103);
127 EVCASE(RDPGFX_CAPVERSION_104);
128 EVCASE(RDPGFX_CAPVERSION_105);
129 EVCASE(RDPGFX_CAPVERSION_106);
130 EVCASE(RDPGFX_CAPVERSION_106_ERR);
131 EVCASE(RDPGFX_CAPVERSION_107);
132#if defined(WITH_GFX_AZURE)
133 EVCASE(RDPGFX_CAPVERSION_111);
134 EVCASE(RDPGFX_CAPVERSION_112);
135 EVCASE(RDPGFX_CAPVERSION_113);
136 EVCASE(RDPGFX_CAPVERSION_115);
137#endif
138 default:
139 return "RDPGFX_CAPVERSION_UNKNOWN";
140 }
141
142#undef EVCASE
143}
144
145static const char* rdpgfx_caps_flag_str_int(UINT32 flag)
146{
147#define EVCASE(x) \
148 case x: \
149 return #x
150
151 switch (flag)
152 {
153 EVCASE(RDPGFX_CAPS_FLAG_THINCLIENT);
154 EVCASE(RDPGFX_CAPS_FLAG_SMALL_CACHE);
155 EVCASE(RDPGFX_CAPS_FLAG_AVC420_ENABLED);
156 EVCASE(RDPGFX_CAPS_FLAG_AVC_DISABLED);
157 EVCASE(RDPGFX_CAPS_FLAG_AVC_THINCLIENT);
158 EVCASE(RDPGFX_CAPS_FLAG_SCALEDMAP_DISABLE);
159#if defined(WITH_GFX_AZURE)
160 EVCASE(RDPGFX_CAPS_FLAG_SCP_DISABLE);
161#endif
162#if defined(WITH_GFX_AV1)
163 EVCASE(RDPGFX_CAPS_FLAG_AV1_I444_SUPPORTED);
164 EVCASE(RDPGFX_CAPS_FLAG_AV1_I444_DISABLED);
165#endif
166 default:
167 return "RDPGFX_CAPS_FLAG_UNKNOWN";
168 }
169
170#undef EVCASE
171}
172
173const char* rdpgfx_caps_flag_str(UINT32 flag)
174{
175 const char* val = rdpgfx_caps_flag_str_int(flag);
176 if (!val)
177 return nullptr;
178
179 const char prefix[] = "RDPGFX_CAPS_FLAG_";
180 if (strncmp(val, prefix, sizeof(prefix) - 1) != 0)
181 return val;
182 return &val[sizeof(prefix)];
183}
184
185const char* rdpgfx_caps_flags_str(UINT32 flags, char* buffer, size_t length)
186{
187 if (length < 1)
188 return buffer;
189
190 WINPR_ASSERT(buffer);
191
192 buffer[0] = '{';
193 for (uint32_t x = 0; x < 32; x++)
194 {
195 uint32_t val = 1u << x;
196 if ((flags & val) != 0)
197 {
198 const char* flag = rdpgfx_caps_flag_str(val);
199 winpr_str_append(flag, &buffer[1], length - 1, "|");
200 }
201 }
202
203 char number[16] = WINPR_C_ARRAY_INIT;
204 (void)_snprintf(number, sizeof(number), "[0x%08" PRIx32 "]", flags);
205 winpr_str_append(number, buffer, length, "}");
206
207 return buffer;
208}