#include "byte_math.h" #include "pattern.h" static rgb_t white(uint32_t time, size_t x) { int w = calc_w((time & 0xff) + x * 4); rgb_t color; color.color = 0x00ffffff; color.a = 255 - w; return color; } static rgb_t candycane_bg(uint32_t time, size_t x) { int r = 0, g = 0, b = 0; uint8_t time8 = time & 0xff; r = 0xff; g = byte_scale(byte_sin(time8 + x * 2), 0x90); b = byte_scale(byte_sin(time8 + x * 2), 0x20); rgb_t bg; bg.color = 0; bg.r = r; bg.g = byte_scale(g, AS_BYTE(0.75)); bg.b = byte_scale(b, AS_BYTE(0.75)); return blend(white(time, x), bg); } static rgb_t candycane_twinkle(uint32_t time, size_t x) { rgb_t twink = more_twinkle(time / 4, x); int a = twink.a; if (time & 0x3) { // Linear interpolate. int amt = time % 4; a = (a * (4 - amt) + more_twinkle((time / 4) + 1, x).a * amt) / 4; } rgb_t bg = candycane_bg(time, x); bg.a = a; return bg; } static void reset(void) { } __attribute__((__section__(".patterns"))) volatile static pattern_t pat = ((pattern_t){.get_rgb = candycane_bg, .name = "CandyCane", .reset = reset}); __attribute__((__section__(".patterns"))) volatile static pattern_t naked_pat = ((pattern_t){.get_rgb = white, .name = "Naked White", .reset = reset}); __attribute__(( __section__(".patterns"))) volatile static pattern_t candycane_twinkle_pat = ((pattern_t){.get_rgb = candycane_twinkle, .name = "Candycane Twinkle", .reset = reset});