]> git.lizzy.rs Git - nothing.git/blobdiff - src/color.c
(#523) Remove show-label
[nothing.git] / src / color.c
index e87ed05c86f88d3ec69cccb41da572f696e1d7f6..768ef0ff9689cf9cfe52f68f1377d286126a5a24 100644 (file)
@@ -1,10 +1,11 @@
 #include <SDL2/SDL.h>
+#include <string.h>
 
-#include "./color.h"
+#include "color.h"
 
-color_t color(float r, float g, float b, float a)
+Color rgba(float r, float g, float b, float a)
 {
-    const color_t result = {
+    const Color result = {
         .r = r,
         .g = g,
         .b = b,
@@ -14,7 +15,42 @@ color_t color(float r, float g, float b, float a)
     return result;
 }
 
-SDL_Color color_for_sdl(color_t color)
+static Uint8 hex2dec_digit(char c)
+{
+    if (c >= '0' && c <= '9') {
+        return (Uint8) (c - '0');
+    }
+
+    if (c >= 'A' && c <= 'F') {
+        return (Uint8) (10 + c - 'A');
+    }
+
+    if (c >= 'a' && c <= 'f') {
+        return (Uint8) (10 + c - 'a');
+    }
+
+    return 0;
+}
+
+static Uint8 parse_color_component(const char *component)
+{
+    return (Uint8) (hex2dec_digit(component[0]) * 16 + hex2dec_digit(component[1]));
+}
+
+Color hexstr(const char *hexstr)
+{
+    if (strlen(hexstr) != 6) {
+        return rgba(0.0f, 0.0f, 0.0f, 1.0f);
+    }
+
+    return rgba(
+        parse_color_component(hexstr) / 255.0f,
+        parse_color_component(hexstr + 2) / 255.0f,
+        parse_color_component(hexstr + 4) / 255.0f,
+        1.0f);
+}
+
+SDL_Color color_for_sdl(Color color)
 {
     const SDL_Color result = {
         .r = (Uint8)roundf(color.r * 255.0f),
@@ -25,3 +61,17 @@ SDL_Color color_for_sdl(color_t color)
 
     return result;
 }
+
+Color color_desaturate(Color c)
+{
+    const float k = (c.r + c.g + c.b) / 3.0f;
+    return rgba(k, k, k, c.a);
+}
+
+Color color_darker(Color c, float d)
+{
+    return rgba(fmaxf(c.r - d, 0.0f),
+                fmaxf(c.g - d, 0.0f),
+                fmaxf(c.b - d, 0.0f),
+                c.a);
+}