#include #include #include extern "C" { extern void print_table (void); extern double ComputeRed (double); extern double ComputeGreen (double); extern double ComputeBlue (double); }; union Color { struct _c { uint8_t g, r, b, a; explicit _c (const uint8_t _r, const uint8_t _g, const uint8_t _b) noexcept : g(_g), r(_r), b(_b), a(0u) {} } c; uint32_t number; explicit Color (const uint8_t r, const uint8_t g, const uint8_t b) : c(r, g, b) {} }; #if 0 static Color getColor (const int index) { const double fi = 2.0 * M_PI / 3.0; // úhel posunu argumentu barvy const double ph = M_PI / 128.0; double a1, a2, a3; uint8_t r,g,b; // proměnné barvy // výpočet barvy - duha a1 = (double) index * ph; // argument pro r a2 = a1 + fi; // argument pro g a3 = a2 + fi; // argument pro b r = (int)(127.0 + 127.0*sin(a1)); g = (int)(127.0 + 127.0*sin(a2)); b = (int)(127.0 + 127.0*sin(a3)); Color color(r, g, b); return color; } #else static uint8_t Gauss (const double x, const double x0) { const double sigma = 1.0 / 2048.0, arg = x - x0; double r = 256.0 * exp (-sigma * arg * arg); return uint8_t (r); } static Color getColor (const int index) { uint8_t r=0,g=0,b=0; // proměnné barvy r = Gauss(index, 85.333); g = Gauss(index, 170.67); b = Gauss(index, 0.01) + Gauss(index, 256.0); Color color(r, g, b); return color; } #endif double ComputeRed (double x) { Color c = getColor(x); return double (c.c.r); } double ComputeGreen (double x) { Color c = getColor(x); return double (c.c.g); } double ComputeBlue (double x) { Color c = getColor(x); return double (c.c.b); } void print_table () { FILE * out = fopen("../table.c","w"); if (!out) return; fprintf(out, "const unsigned table [] = {"); for (unsigned n=0u; n<256u; n++) { if ((n%8) == 0u) fprintf(out, "\n"); const Color c = getColor(n); fprintf(out, " 0x%06X,", c.number); } fprintf(out, "\n};\n"); fclose(out); }