#include #include #include "palettes.h" #include "logging.h" #ifndef M_PI #define M_PI 3.14159265358979323846 #endif static inline Uint8 cycle_palettes_cosine_channel(Uint8, Uint8, double); static inline Uint8 cycle_palettes_linear_channel(Uint8, Uint8, double); SDL_Palette * cycle_palettes_cosine(Uint32 t, Uint32 t_max, SDL_Palette *pal_start, SDL_Palette *pal_end, SDL_Palette *pal_step) { double x; int col_i; if (pal_start->ncolors != pal_end->ncolors) { return NULL; } if (pal_start->ncolors != pal_step->ncolors) { return NULL; } x = (double) (t % t_max) / (double) t_max * M_PI; for (col_i = 0; col_i < pal_step->ncolors; ++col_i) { pal_step->colors[col_i].r = cycle_palettes_cosine_channel( pal_start->colors[col_i].r, pal_end->colors[col_i].r, x); pal_step->colors[col_i].g = cycle_palettes_cosine_channel( pal_start->colors[col_i].g, pal_end->colors[col_i].g, x); pal_step->colors[col_i].b = cycle_palettes_cosine_channel( pal_start->colors[col_i].b, pal_end->colors[col_i].b, x); } return pal_step; } SDL_Palette * cycle_palettes_linear(Uint32 t, Uint32 t_max, SDL_Palette *pal_start, SDL_Palette *pal_end, SDL_Palette *pal_step) { double x; int col_i; if (pal_start->ncolors != pal_end->ncolors) { return NULL; } if (pal_start->ncolors != pal_step->ncolors) { return NULL; } x = (double) (t % t_max) / (double) t_max; for (col_i = 0; col_i < pal_step->ncolors; ++col_i) { pal_step->colors[col_i].r = cycle_palettes_linear_channel( pal_start->colors[col_i].r, pal_end->colors[col_i].r, x); pal_step->colors[col_i].g = cycle_palettes_linear_channel( pal_start->colors[col_i].g, pal_end->colors[col_i].g, x); pal_step->colors[col_i].b = cycle_palettes_linear_channel( pal_start->colors[col_i].b, pal_end->colors[col_i].b, x); } return pal_step; } static inline Uint8 cycle_palettes_cosine_channel(Uint8 y_start, Uint8 y_end, double x) { double m; Uint8 b; Uint8 y; m = y_end - y_start; b = y_start; y = m * ((cos(x) / -2.0) + 0.5) + b; return y; } static inline Uint8 cycle_palettes_linear_channel(Uint8 y_start, Uint8 y_end, double x) { double m; Uint8 b; Uint8 y; m = y_end - y_start; b = y_start; y = m * x + b; return y; }