1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#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});
|