summaryrefslogtreecommitdiff
path: root/src/color.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/color.c')
-rw-r--r--src/color.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/color.c b/src/color.c
new file mode 100644
index 0000000..f6b3275
--- /dev/null
+++ b/src/color.c
@@ -0,0 +1,48 @@
+#include <stdlib.h>
+#include <string.h>
+#include "color.h"
+#include "log.h"
+
+struct color hex_to_color(const char *hex)
+{
+ if (hex[0] == '#') {
+ hex++;
+ }
+
+ uint32_t val = 0;
+ size_t len = strlen(hex);
+
+ if (len == 3) {
+ char str[] = {
+ hex[0], hex[0],
+ hex[1], hex[1],
+ hex[2], hex[2],
+ '\0'};
+ val = strtol(str, NULL, 16);
+ val <<= 8;
+ val |= 0xFFu;
+ } else if (len == 4) {
+ char str[] = {
+ hex[0], hex[0],
+ hex[1], hex[1],
+ hex[2], hex[2],
+ hex[3], hex[3],
+ '\0'};
+ val = strtol(str, NULL, 16);
+ } else if (len == 6) {
+ val = strtol(hex, NULL, 16);
+ val <<= 8;
+ val |= 0xFFu;
+ } else if (len == 8) {
+ val = strtol(hex, NULL, 16);
+ } else {
+ log_error("Invalid hex color %s\n", hex);
+ }
+
+ return (struct color) {
+ .r = ((val & 0xFF000000u) >> 24) / 255.0f,
+ .g = ((val & 0x00FF0000u) >> 16) / 255.0f,
+ .b = ((val & 0x0000FF00u) >> 8) / 255.0f,
+ .a = ((val & 0x000000FFu) >> 0) / 255.0f,
+ };
+}