xf86drm: handle DRM_FORMAT_BIG_ENDIAN in drmGetFormatName()
authorSimon Ser <contact@emersion.fr>
Wed, 12 Oct 2022 07:40:06 +0000 (09:40 +0200)
committerSimon Ser <contact@emersion.fr>
Mon, 17 Oct 2022 10:03:50 +0000 (12:03 +0200)
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>
xf86drm.c

index 42c1a5d..0faa597 100644 (file)
--- 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;
 }