summaryrefslogtreecommitdiff
path: root/user/apple.c
blob: a0a7e9a1de9d33e13fb88be60a2a511bf82a22d4 (plain)
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <incbin.h>
#include <stdio.h>
#include <unistd.h>

INCBIN(APPLE, "data/apple.bin");

#define APPLE_WIDTH 256
#define APPLE_HEIGHT 144
#define APPLE_FPS 12
#define APPLE_FRAMES 2630

#define MIN(a, b) (((a) < (b)) ? (a) : (b))

// returned from drm
static uint32_t *fb;
static int width, height, bpp, scale;

// meta
static size_t frame = 0;
static size_t frame_size;
static size_t ticks_off;

#define PIXEL(x, y)                                         \
	gAPPLEData[offset +                                     \
			   (((x + APPLE_WIDTH % APPLE_WIDTH) / scale) + \
				((y + APPLE_HEIGHT % APPLE_HEIGHT) / scale) * APPLE_WIDTH)]

static void draw_frame(void)
{
	size_t offset = frame_size * frame;

	for (int y = 0; y < APPLE_HEIGHT * scale; y++) {
		for (int x = 0; x < APPLE_WIDTH * scale; x++) {
			uint8_t colors[9];
			colors[0] = PIXEL(x, y);
			colors[1] = PIXEL(x - 1, y);
			colors[2] = PIXEL(x + 1, y);
			colors[3] = PIXEL(x, y - 1);
			colors[4] = PIXEL(x - 1, y - 1);
			colors[5] = PIXEL(x + 1, y - 1);
			colors[6] = PIXEL(x, y + 1);
			colors[7] = PIXEL(x - 1, y + 1);
			colors[8] = PIXEL(x + 1, y + 1);

			// anti aliasing
			uint8_t color = (colors[0] + colors[0] + colors[0] + colors[0] +
							 colors[1] + colors[2] + colors[3] + colors[4] +
							 colors[5] + colors[6] + colors[7] + colors[8]) /
							12;

			fb[x + y * width] = (color << 16) | (color << 8) | (color << 0);
		}
	}

	frame = ((ticks() - ticks_off) / (1000 / APPLE_FPS));

	if (frame >= APPLE_FRAMES)
		exit(0);
}

int main(void)
{
	printf("all your apple belong to bad\n");

	if (drm((void **)&fb, &width, &height, &bpp)) {
		fprintf(stderr, "failure!\n");
		return 1;
	}

	ticks_off = ticks();
	frame_size = APPLE_WIDTH * APPLE_HEIGHT;
	scale = MIN(width / APPLE_WIDTH, height / APPLE_HEIGHT);

	while (1)
		draw_frame();

	return 0;
}