Coverage Report

Created: 2026-06-15 06:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/FreeRDP/libfreerdp/utils/gfx.c
Line
Count
Source
1
/**
2
 * FreeRDP: A Remote Desktop Protocol Implementation
3
 *
4
 * GFX Utils - Helper functions converting something to string
5
 *
6
 * Copyright 2022 Armin Novak <armin.novak@thincast.com>
7
 * Copyright 2022 Thincast Technologies GmbH
8
 *
9
 * Licensed under the Apache License, Version 2.0 (the "License");
10
 * you may not use this file except in compliance with the License.
11
 * You may obtain a copy of the License at
12
 *
13
 *     http://www.apache.org/licenses/LICENSE-2.0
14
 *
15
 * Unless required by applicable law or agreed to in writing, software
16
 * distributed under the License is distributed on an "AS IS" BASIS,
17
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
 * See the License for the specific language governing permissions and
19
 * limitations under the License.
20
 */
21
22
#include <freerdp/utils/gfx.h>
23
#include <freerdp/channels/rdpgfx.h>
24
25
const char* rdpgfx_get_cmd_id_string(UINT16 cmdId)
26
0
{
27
0
#define EVCASE(x) \
28
0
  case x:       \
29
0
    return #x
30
0
  switch (cmdId)
31
0
  {
32
0
    EVCASE(RDPGFX_CMDID_UNUSED_0000);
33
0
    EVCASE(RDPGFX_CMDID_WIRETOSURFACE_1);
34
0
    EVCASE(RDPGFX_CMDID_WIRETOSURFACE_2);
35
0
    EVCASE(RDPGFX_CMDID_DELETEENCODINGCONTEXT);
36
0
    EVCASE(RDPGFX_CMDID_SOLIDFILL);
37
0
    EVCASE(RDPGFX_CMDID_SURFACETOSURFACE);
38
0
    EVCASE(RDPGFX_CMDID_SURFACETOCACHE);
39
0
    EVCASE(RDPGFX_CMDID_CACHETOSURFACE);
40
0
    EVCASE(RDPGFX_CMDID_EVICTCACHEENTRY);
41
0
    EVCASE(RDPGFX_CMDID_CREATESURFACE);
42
0
    EVCASE(RDPGFX_CMDID_DELETESURFACE);
43
0
    EVCASE(RDPGFX_CMDID_STARTFRAME);
44
0
    EVCASE(RDPGFX_CMDID_ENDFRAME);
45
0
    EVCASE(RDPGFX_CMDID_FRAMEACKNOWLEDGE);
46
0
    EVCASE(RDPGFX_CMDID_RESETGRAPHICS);
47
0
    EVCASE(RDPGFX_CMDID_MAPSURFACETOOUTPUT);
48
0
    EVCASE(RDPGFX_CMDID_CACHEIMPORTOFFER);
49
0
    EVCASE(RDPGFX_CMDID_CACHEIMPORTREPLY);
50
0
    EVCASE(RDPGFX_CMDID_CAPSADVERTISE);
51
0
    EVCASE(RDPGFX_CMDID_CAPSCONFIRM);
52
0
    EVCASE(RDPGFX_CMDID_UNUSED_0014);
53
0
    EVCASE(RDPGFX_CMDID_MAPSURFACETOWINDOW);
54
0
    EVCASE(RDPGFX_CMDID_QOEFRAMEACKNOWLEDGE);
55
0
    EVCASE(RDPGFX_CMDID_MAPSURFACETOSCALEDOUTPUT);
56
0
    EVCASE(RDPGFX_CMDID_MAPSURFACETOSCALEDWINDOW);
57
0
    EVCASE(RDPGFX_CMDID_PROTECT_SURFACE);
58
0
    EVCASE(RDPGFX_CMDID_WATERMARK);
59
0
    default:
60
0
      return "RDPGFX_CMDID_UNKNOWN";
61
0
  }
62
0
#undef EVCASE
63
0
}
64
65
const char* rdpgfx_get_codec_id_string(UINT16 codecId)
66
0
{
67
0
  switch (codecId)
68
0
  {
69
#if defined(WITH_GFX_AV1)
70
    case RDPGFX_CODECID_AV1:
71
      return "RDPGFX_CODECID_AV1";
72
#endif
73
74
0
    case RDPGFX_CODECID_UNCOMPRESSED:
75
0
      return "RDPGFX_CODECID_UNCOMPRESSED";
76
77
0
    case RDPGFX_CODECID_CAVIDEO:
78
0
      return "RDPGFX_CODECID_CAVIDEO";
79
80
0
    case RDPGFX_CODECID_CLEARCODEC:
81
0
      return "RDPGFX_CODECID_CLEARCODEC";
82
83
0
    case RDPGFX_CODECID_PLANAR:
84
0
      return "RDPGFX_CODECID_PLANAR";
85
86
0
    case RDPGFX_CODECID_AVC420:
87
0
      return "RDPGFX_CODECID_AVC420";
88
89
0
    case RDPGFX_CODECID_AVC444:
90
0
      return "RDPGFX_CODECID_AVC444";
91
92
0
    case RDPGFX_CODECID_AVC444v2:
93
0
      return "RDPGFX_CODECID_AVC444v2";
94
95
0
    case RDPGFX_CODECID_ALPHA:
96
0
      return "RDPGFX_CODECID_ALPHA";
97
98
0
    case RDPGFX_CODECID_CAPROGRESSIVE:
99
0
      return "RDPGFX_CODECID_CAPROGRESSIVE";
100
101
0
    case RDPGFX_CODECID_CAPROGRESSIVE_V2:
102
0
      return "RDPGFX_CODECID_CAPROGRESSIVE_V2";
103
0
    default:
104
0
      break;
105
0
  }
106
107
0
  return "RDPGFX_CODECID_UNKNOWN";
108
0
}
109
110
const char* rdpgfx_caps_version_str(UINT32 capsVersion)
111
0
{
112
0
#define EVCASE(x) \
113
0
  case x:       \
114
0
    return #x
115
116
0
  switch (capsVersion)
117
0
  {
118
#if defined(WITH_GFX_AV1)
119
    EVCASE(RDPGFX_CAPVERSION_FRDP_1);
120
#endif
121
0
    EVCASE(RDPGFX_CAPVERSION_8);
122
0
    EVCASE(RDPGFX_CAPVERSION_81);
123
0
    EVCASE(RDPGFX_CAPVERSION_10);
124
0
    EVCASE(RDPGFX_CAPVERSION_101);
125
0
    EVCASE(RDPGFX_CAPVERSION_102);
126
0
    EVCASE(RDPGFX_CAPVERSION_103);
127
0
    EVCASE(RDPGFX_CAPVERSION_104);
128
0
    EVCASE(RDPGFX_CAPVERSION_105);
129
0
    EVCASE(RDPGFX_CAPVERSION_106);
130
0
    EVCASE(RDPGFX_CAPVERSION_106_ERR);
131
0
    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
#endif
137
0
    default:
138
0
      return "RDPGFX_CAPVERSION_UNKNOWN";
139
0
  }
140
141
0
#undef EVCASE
142
0
}
143
144
static const char* rdpgfx_caps_flag_str_int(UINT32 flag)
145
0
{
146
0
#define EVCASE(x) \
147
0
  case x:       \
148
0
    return #x
149
150
0
  switch (flag)
151
0
  {
152
0
    EVCASE(RDPGFX_CAPS_FLAG_THINCLIENT);
153
0
    EVCASE(RDPGFX_CAPS_FLAG_SMALL_CACHE);
154
0
    EVCASE(RDPGFX_CAPS_FLAG_AVC420_ENABLED);
155
0
    EVCASE(RDPGFX_CAPS_FLAG_AVC_DISABLED);
156
0
    EVCASE(RDPGFX_CAPS_FLAG_AVC_THINCLIENT);
157
0
    EVCASE(RDPGFX_CAPS_FLAG_SCALEDMAP_DISABLE);
158
#if defined(WITH_GFX_AZURE)
159
    EVCASE(RDPGFX_CAPS_FLAG_SCP_DISABLE);
160
#endif
161
#if defined(WITH_GFX_AV1)
162
    EVCASE(RDPGFX_CAPS_FLAG_AV1_I444_SUPPORTED);
163
    EVCASE(RDPGFX_CAPS_FLAG_AV1_I444_DISABLED);
164
#endif
165
0
    default:
166
0
      return "RDPGFX_CAPS_FLAG_UNKNOWN";
167
0
  }
168
169
0
#undef EVCASE
170
0
}
171
172
const char* rdpgfx_caps_flag_str(UINT32 flag)
173
0
{
174
0
  const char* val = rdpgfx_caps_flag_str_int(flag);
175
0
  if (!val)
176
0
    return nullptr;
177
178
0
  const char prefix[] = "RDPGFX_CAPS_FLAG_";
179
0
  if (strncmp(val, prefix, sizeof(prefix) - 1) != 0)
180
0
    return val;
181
0
  return &val[sizeof(prefix)];
182
0
}
183
184
const char* rdpgfx_caps_flags_str(UINT32 flags, char* buffer, size_t length)
185
0
{
186
0
  if (length < 1)
187
0
    return buffer;
188
189
0
  WINPR_ASSERT(buffer);
190
191
0
  buffer[0] = '{';
192
0
  for (uint32_t x = 0; x < 32; x++)
193
0
  {
194
0
    uint32_t val = 1 << x;
195
0
    if ((flags & val) != 0)
196
0
    {
197
0
      const char* flag = rdpgfx_caps_flag_str(val);
198
0
      winpr_str_append(flag, &buffer[1], length - 1, "|");
199
0
    }
200
0
  }
201
202
0
  char number[16] = WINPR_C_ARRAY_INIT;
203
0
  (void)_snprintf(number, sizeof(number), "[0x%08" PRIx32 "]", flags);
204
0
  winpr_str_append(number, buffer, length, "}");
205
206
0
  return buffer;
207
0
}