summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2022-10-12 09:40:06 +0200
committerSimon Ser <contact@emersion.fr>2022-10-17 12:03:50 +0200
commitffb9375a505700addcea637ddb8aa308bb73ec36 (patch)
tree73025f9aac2bbc294e3478e9479b0f9ca11f8cea
parente08a22dc43f0834a7944fc8cc8bf34d06e6bd095 (diff)
downloaddrm-ffb9375a505700addcea637ddb8aa308bb73ec36.tar.gz
xf86drm: handle DRM_FORMAT_BIG_ENDIAN in drmGetFormatName()
This bit can be added to a DRM format to indicate that it's big endian instead of little endian. Signed-off-by: Simon Ser <contact@emersion.fr>
-rw-r--r--xf86drm.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/xf86drm.c b/xf86drm.c
index 42c1a5d0..0faa5972 100644
--- a/xf86drm.c
+++ b/xf86drm.c
@@ -5117,27 +5117,32 @@ drmGetFormatModifierName(uint64_t modifier)
drm_public char *
drmGetFormatName(uint32_t format)
{
- char *str;
+ char *str, code[5];
+ const char *be;
size_t str_size, i;
- char a, b, c, d;
+
+ be = (format & DRM_FORMAT_BIG_ENDIAN) ? "_BE" : "";
+ format &= ~DRM_FORMAT_BIG_ENDIAN;
if (format == DRM_FORMAT_INVALID)
return strdup("INVALID");
- str_size = 5;
+ code[0] = (char) ((format >> 0) & 0xFF);
+ code[1] = (char) ((format >> 8) & 0xFF);
+ code[2] = (char) ((format >> 16) & 0xFF);
+ code[3] = (char) ((format >> 24) & 0xFF);
+ code[4] = '\0';
+
+ /* Trim spaces at the end */
+ for (i = 3; i > 0 && code[i] == ' '; i--)
+ code[i] = '\0';
+
+ str_size = strlen(code) + strlen(be) + 1;
str = malloc(str_size);
if (!str)
return NULL;
- a = (char) ((format >> 0) & 0xFF);
- b = (char) ((format >> 8) & 0xFF);
- c = (char) ((format >> 16) & 0xFF);
- d = (char) ((format >> 24) & 0xFF);
- snprintf(str, str_size, "%c%c%c%c", a, b, c, d);
-
- /* Trim spaces at the end */
- for (i = 3; i > 0 && str[i] == ' '; i--)
- str[i] = '\0';
+ snprintf(str, str_size, "%s%s", code, be);
return str;
}