#include "../compat/pgmspace.h" #include "../random/prng.h" #include "../config.h" #include "../pixel.h" #include "../util.h" #define RANDOM8(x) random8(x) #define PGM(x) pgm_read_byte(&(x)) // straight or non straight line from one point to the other // value=brightness static void line(pixel p1, pixel p2, unsigned char value) { char dx, dy, stepx, stepy, fraction; dy = p2.y - p1.y; dx = p2.x - p1.x; if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; } if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; } dx <<= 1; dy <<= 1; setpixel(p1, value); if (dx > dy) { fraction = dy - (dx >> 1); while (p1.x != p2.x) { if (fraction >= 0) { p1.y += stepy; fraction -= dx; } p1.x += stepx; fraction += dy; setpixel(p1, value); } } else { fraction = dx - (dy >> 1); while (p1.y != p2.y) { if (fraction >= 0) { p1.x += stepx; fraction -= dy; } p1.y += stepy; fraction += dx; setpixel(p1, value); } } } // filled_rectangle p1=upper right corner, w=width, h=height , // value=brightness static void filled_rectangle(pixel p1, unsigned char w, unsigned char h, unsigned char value) { unsigned char y; for (y = p1.y; y < (p1.y + h); y++) { line((pixel){p1.x,y}, (pixel){(p1.x+w-1),y}, value); } } void checkbox() { unsigned char x, delay = 250; // quadrat aus linien line((pixel){0, 0}, (pixel){7, 0}, 3); wait (delay); line ((pixel){7, 0}, (pixel){7, 7}, 3); wait (delay); line ((pixel){7, 7}, (pixel){0, 7}, 3); wait (delay); line ((pixel){0, 7}, (pixel){0, 0}, 3); wait (delay); // 2 diagonale lininen line ((pixel){7, 7}, (pixel){0, 0}, 3); wait (delay); line ((pixel){0, 7}, (pixel){7, 0}, 3); wait (delay * 3); for (x = NUM_COLS; x--;) { // shift image right shift_pixmap_l (); wait (30); } } void movinglines() { unsigned char x, y, n; line((pixel){NUM_COLS - 1, NUM_ROWS - 1}, (pixel){NUM_COLS - 1, 0}, 3); // linie wandert nach rechts for (x = 0; x < NUM_COLS; x++) { shift_pixmap_l (); wait (100); } // von unten nach oben for (y = NUM_ROWS; y--;) { line ((pixel){0, y}, (pixel){NUM_COLS - 1, y}, 3); wait (100); line ((pixel){0, y}, (pixel){NUM_COLS - 1, y}, 0); //wait(10); } // eine linie von rechts nach links und 1-8 mal von oben nach unten // je nach display format das ganze 4 mal for (n = 0; n < 4; n++) { for (x = 0; x < NUM_COLS - 1; x++) { y = x % NUM_ROWS; line ((pixel){0, y}, (pixel){NUM_COLS - 1, y}, 3); line ((pixel){x, 0}, (pixel){x, NUM_ROWS - 1}, 3); wait (50); line ((pixel){0, y}, (pixel){NUM_COLS - 1, y}, 0); line ((pixel){x, 0}, (pixel){x, NUM_ROWS - 1}, 0); //wait(10); } } } //rechteckmuster mit helligkeitsstufen void rectangle1() { unsigned char x, value, xcenter, ycenter, size; unsigned int delay = 500; xcenter = NUM_COLS / 2; ycenter = NUM_ROWS / 2; clear_screen(0); size = NUM_ROWS; value = 3; for (x = 8; x > 0; x--) { if (value < NUMPLANE) value++; else value = 0; filled_rectangle((pixel){(xcenter - x), (ycenter - x)}, size, size, value); wait (delay); size -= 2; } wait (delay * 3); } // zufallsrechtecke void rectangles() { unsigned char value, n, x, y, h, w; clear_screen(0); for (n = 0; n < 60; n++) { x = RANDOM8() % NUM_COLS; y = RANDOM8() % NUM_ROWS; h = RANDOM8() % NUM_COLS / 2; w = RANDOM8() % NUM_ROWS / 2; value = RANDOM8() % (NUMPLANE + 1); filled_rectangle((pixel){x, y}, w, h, value); wait (500 + RANDOM8 () % 3000); } } // schräge linien die aufblitzen void lines1() { unsigned char value, n, x, y, h, w; unsigned int delay = 500; clear_screen(0); for (n = 0; n < 200; n++) { x = RANDOM8() % NUM_COLS; y = RANDOM8() % NUM_ROWS; h = RANDOM8() % NUM_COLS; w = RANDOM8() % NUM_ROWS; value = RANDOM8() % (NUMPLANE + 1); line((pixel){x, y}, (pixel){w, h}, value); wait (RANDOM8 () % delay); line ((pixel){x, y}, (pixel){w, h}, 0); } } // random dots void dots1() { unsigned char n, x, y; clear_screen(0); for (n = 50; n--;) { x = RANDOM8() % NUM_COLS; y = RANDOM8() % NUM_ROWS; static unsigned char const color[5] PROGMEM = {1, 2, 3, 2, 1}; for (unsigned char i = 0; i < 5; ++i) { setpixel ((pixel){x, y}, PGM(color[i])); wait(100); } wait ((RANDOM8 () % 255) * 10); } }