aboutsummaryrefslogtreecommitdiff
path: root/src/patterns/candycane.c
blob: 42a9ad73afe4a0bfc2e447f11dc869dc5f4959b0 (plain) (blame)
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});