#ifndef DISPLAY_MATRIX_COMMON_H #define DISPLAY_MATRIX_COMMON_H #include #define _ false #define X true #define countof(a) (sizeof(a)/sizeof(a[0])) struct RGBA { uint8_t r; uint8_t g; uint8_t b; uint8_t a; static RGBA gray(const uint8_t brightness) { return gray(brightness, 255); } static RGBA gray(const uint8_t brightness, const uint8_t alpha) { return {brightness, brightness, brightness, alpha}; } static RGBA rnd() { return rnd(255); } static RGBA rnd(const uint8_t alpha) { return {static_cast(random(255)), static_cast(random(255)), static_cast(random(255)), alpha}; } RGBA factor(const double factor) const { return { limit(r * factor), limit(g * factor), limit(b * factor), a }; } protected: static uint8_t limit(const double newValue) { return static_cast(round(max(0.0, min(255.0, newValue)))); } }; struct RGB { uint8_t r; uint8_t g; uint8_t b; RGB &operator =(const RGBA& color) { r = color.r; g = color.g; b = color.b; // blend(&this->r, color.r, color.a); // blend(&this->g, color.g, color.a); // blend(&this->b, color.b, color.a); return *this; } protected: static uint8_t limit(const double newValue) { return static_cast(round(max(0.0, min(255.0, newValue)))); } static void blend(uint8_t *target, const uint8_t color, const uint8_t alpha) { const auto factor = alpha / 255.0; const auto newValue = (*target * (1 - factor) + color * factor) / 2.0; *target = limit(newValue); } }; extern const RGBA Transparent; extern const RGBA Black; extern const RGBA Red; extern const RGBA Yellow; extern const RGBA Green; extern const RGBA Cyan; extern const RGBA Blue; extern const RGBA Magenta; extern const RGBA Violet; extern const RGBA Gray; extern const RGBA White; #endif