diff options
| author | auric <auric7@protonmail.com> | 2025-09-07 16:09:42 -0500 |
|---|---|---|
| committer | auric <auric7@protonmail.com> | 2025-09-07 16:09:42 -0500 |
| commit | b59b8b8e5d16af7f0daccb280a4991e3fe428e41 (patch) | |
| tree | 96ed0e580730ab6315e9322e2bb2933c9f5c8097 /oldresources/breathing-exo-daemon/exo.c | |
Add files
Diffstat (limited to 'oldresources/breathing-exo-daemon/exo.c')
| -rw-r--r-- | oldresources/breathing-exo-daemon/exo.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/oldresources/breathing-exo-daemon/exo.c b/oldresources/breathing-exo-daemon/exo.c new file mode 100644 index 0000000..858cd57 --- /dev/null +++ b/oldresources/breathing-exo-daemon/exo.c @@ -0,0 +1,99 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> +#include <time.h> +#include <unistd.h> + +/* Convert sRGB to Linear RGB */ +double srgb_to_linear(double value) { + if (value <= 0.04045) { + return value / 12.92; + } else { + return pow((value + 0.055) / 1.055, 2.4); + } +} + +/* Convert Linear RGB to sRGB */ +double linear_to_srgb(double value) { + if (value <= 0.0031308) { + return value * 12.92; + } else { + return 1.055 * pow(value, 1.0 / 2.4) - 0.055; + } +} + +/* Interpolate between two colors in Linear RGB space */ +void interpolate_color_linear(const char *color1, const char *color2, double t, char *output) { + unsigned int r1, g1, b1, r2, g2, b2; + sscanf(color1, "#%02x%02x%02x", &r1, &g1, &b1); + sscanf(color2, "#%02x%02x%02x", &r2, &g2, &b2); + + // Convert sRGB to linear RGB + double lr1 = srgb_to_linear(r1 / 255.0); + double lg1 = srgb_to_linear(g1 / 255.0); + double lb1 = srgb_to_linear(b1 / 255.0); + + double lr2 = srgb_to_linear(r2 / 255.0); + double lg2 = srgb_to_linear(g2 / 255.0); + double lb2 = srgb_to_linear(b2 / 255.0); + + // Interpolate in linear RGB space + double lr = lr1 + t * (lr2 - lr1); + double lg = lg1 + t * (lg2 - lg1); + double lb = lb1 + t * (lb2 - lb1); + + // Convert back to sRGB + unsigned int r = (unsigned int)(linear_to_srgb(lr) * 255.0); + unsigned int g = (unsigned int)(linear_to_srgb(lg) * 255.0); + unsigned int b = (unsigned int)(linear_to_srgb(lb) * 255.0); + + // Format as hex output + snprintf(output, 8, "#%02x%02x%02x", r, g, b); +} + +int main() { + /* Define the colors to cycle through */ + const char *breathing_colors[] = { + "#ffe667", // Yellow + "#f27049", // Orange + "#3dd762", // Green + }; + int color_count = sizeof(breathing_colors) / sizeof(breathing_colors[0]); + + int current_index = 0; + double t = 0.0; // Interpolation factor + char current_color[8]; + + struct timespec ts = { 0, 5000000 }; // 5ms sleep + + while (1) { + /* Interpolate the current color */ + interpolate_color_linear( + breathing_colors[current_index], + breathing_colors[(current_index + 1) % color_count], + t, + current_color + ); + + /* Write the current color to a file */ + FILE *f = fopen("/tmp/breathing_color", "w"); + if (f) { + fprintf(f, "%s\n", current_color); + fclose(f); + } + + /* Increment interpolation factor */ + t += 0.005; // Adjust the speed of transition (smaller value = slower transition) + if (t >= 1.0) { + t = 0.0; // Reset interpolation + current_index = (current_index + 1) % color_count; // Move to the next color + } + + /* Sleep for 5ms */ + nanosleep(&ts, NULL); + } + + return 0; +} + |
