Valid colours start with an optional '0x' or '#', followed by:
- AARRGGBB
-   RRGGBB
-  A R G B
-    R G B
-   XYXYXY
-   XXXXXX

Signed-off-by: Eric Engestrom <e...@engestrom.ch>
---

I just stumbled back on this discussion from a few months ago, and
decided to give it a go.

Once again, I apologise for length of the lines in the switch, but
I believe they are much less readable when folded.

I feel like there should be a place where the supported colour formats$
are documented, but I couldn't find it?

---
 shared/config-parser.c | 39 +++++++++++++++++++++++++++++++--------
 1 file changed, 31 insertions(+), 8 deletions(-)

diff --git a/shared/config-parser.c b/shared/config-parser.c
index e2b5fa2..a00b2d6 100644
--- a/shared/config-parser.c
+++ b/shared/config-parser.c
@@ -224,6 +224,9 @@ weston_config_section_get_color(struct 
weston_config_section *section,
        struct weston_config_entry *entry;
        int len;
        char *end;
+       const char alpha[] = "FF"; /* Default alpha when unspecified */
+       const char *val;
+       const char *color_string;
 
        entry = config_section_get_entry(section, key);
        if (entry == NULL) {
@@ -232,19 +235,39 @@ weston_config_section_get_color(struct 
weston_config_section *section,
                return -1;
        }
 
+       val = entry->value;
-       len = strlen(entry->value);
+       len = strlen(val);
+
-       if (len == 1 && entry->value[0] == '0') {
+       if (len == 1 && val[0] == '0') {
                *color = 0;
                return 0;
+       }
-       } else if (len != 8 && len != 10) {
-               *color = default_color;
-               errno = EINVAL;
-               return -1;
+
+       if (len > 2 && val[0] == '0' && val[1] == 'x')
+       {
+               val += 2;
+               len -= 2;
+       }
+       else if (len > 1 && val[0] == '#')
+       {
+               val += 1;
+               len -= 1;
+       }
+
+       switch (len) {
+       case 8: color_string = (char[]){   val[0],   val[1], val[2], val[3], 
val[4], val[5], val[6], val[7], '\0' }; break; /* AARRGGBB */
+       case 6: color_string = (char[]){ alpha[0], alpha[1], val[0], val[1], 
val[2], val[3], val[4], val[5], '\0' }; break; /*   RRGGBB */
+       case 4: color_string = (char[]){   val[0],   val[0], val[1], val[1], 
val[2], val[2], val[3], val[3], '\0' }; break; /*  A R G B */
+       case 3: color_string = (char[]){ alpha[0], alpha[1], val[0], val[0], 
val[1], val[1], val[2], val[2], '\0' }; break; /*    R G B */
+       case 2: color_string = (char[]){ alpha[0], alpha[1], val[0], val[1], 
val[0], val[1], val[0], val[1], '\0' }; break; /*   XYXYXY */
+       case 1: color_string = (char[]){ alpha[0], alpha[1], val[0], val[0], 
val[0], val[0], val[0], val[0], '\0' }; break; /*   XXXXXX */
+       default: goto invalid;
        }
 
        errno = 0;
-       *color = strtoul(entry->value, &end, 16);
+       *color = strtoul(color_string, &end, 16);
-       if (errno != 0 || end == entry->value || *end != '\0') {
+       if (errno != 0 || end == color_string || *end != '\0') {
+invalid:
                *color = default_color;
                errno = EINVAL;
                return -1;
-- 
Cheers,
  Eric

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to