summaryrefslogtreecommitdiff
path: root/src/modules/pixbounce/pixbounce.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/pixbounce/pixbounce.c')
-rw-r--r--src/modules/pixbounce/pixbounce.c172
1 files changed, 172 insertions, 0 deletions
diff --git a/src/modules/pixbounce/pixbounce.c b/src/modules/pixbounce/pixbounce.c
new file mode 100644
index 0000000..764f559
--- /dev/null
+++ b/src/modules/pixbounce/pixbounce.c
@@ -0,0 +1,172 @@
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "draw.h"
+#include "rototiller.h"
+
+/* Copyright (C) 2018 Philip J. Freeman <elektron@halo.nu> */
+
+int pix_width = 16;
+int pix_height = 16;
+int num_pix = 4;
+
+char pix_map[][16*16] = {
+
+ {
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,
+ 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,
+ 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ },
+
+ {
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ },
+
+ {
+ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+ 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
+ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
+ 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+ },
+
+ {
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0,
+ 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0,
+ 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0,
+ 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1,
+ 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1,
+ 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1,
+ 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1,
+ 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0,
+ 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0,
+ 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ },
+};
+
+/* randomly pick another pixmap from the list, excluding the current one. */
+static int pick_pix(int num_pics, int last_pic)
+{
+ int pix_num = last_pic;
+
+ while(pix_num == last_pic)
+ pix_num = rand() % num_pics;
+
+ return pix_num;
+}
+
+static void pixbounce_render_fragment(void *context, fb_fragment_t *fragment)
+{
+ static int initialized=0;
+ static int x, y, multiplier;
+ static int x_dir, y_dir;
+ static int pix_num;
+
+ int width = fragment->width, height = fragment->height;
+
+ if(!initialized) {
+ srand(time(NULL) + getpid());
+ int multiplier_x = width / pix_width;
+ int multiplier_y = height / pix_height;
+ if(multiplier_x>multiplier_y) {
+ multiplier = multiplier_y * 77 / 100;
+ } else if(multiplier_y>multiplier_x) {
+ multiplier = multiplier_x * 77 / 100;
+ }
+ x = rand()%(width - (pix_width * multiplier));
+ y = rand()%(height - (pix_height * multiplier));
+ pix_num = rand() % num_pix;
+ x_dir = 1;
+ y_dir = 1;
+ initialized = 1;
+ }
+
+ /* blank the frame */
+ fb_fragment_zero(fragment);
+
+ /* translate pixmap to multiplier size and draw it to the fragment */
+ for(int cursor_y=0; cursor_y < pix_height*multiplier; cursor_y++) {
+ for(int cursor_x=0; cursor_x < pix_width*multiplier; cursor_x++) {
+ int pix_offset = ((cursor_y/multiplier)*pix_width) + (cursor_x/multiplier);
+ if(pix_map[pix_num][pix_offset] == 0) continue;
+ fb_fragment_put_pixel_unchecked(
+ fragment, x+cursor_x, y+cursor_y,
+ makergb(0xFF, 0xFF, 0xFF, 1)
+ );
+ }
+ }
+
+ /* update pixmap location */
+ if(x+x_dir < 0) {
+ x_dir = 1;
+ pix_num = pick_pix(num_pix, pix_num);
+ }
+ if((x+(pix_width*multiplier))+x_dir > width) {
+ x_dir = -1;
+ pix_num = pick_pix(num_pix, pix_num);
+ }
+ if(y+y_dir < 0) {
+ y_dir = 1;
+ pix_num = pick_pix(num_pix, pix_num);
+ }
+ if((y+(pix_height*multiplier))+y_dir > height) {
+ y_dir = -1;
+ pix_num = pick_pix(num_pix, pix_num);
+ }
+ x = x+x_dir;
+ y = y+y_dir;
+}
+
+rototiller_module_t pixbounce_module = {
+ .render_fragment = pixbounce_render_fragment,
+ .name = "pixbounce",
+ .description = "pixmap bounce",
+ .author = "Philip J Freeman <elektron@halo.nu>",
+ .license = "GPLv2",
+};
© All Rights Reserved