| Index: apps/ball/main.c |
| — | — | @@ -26,29 +26,17 @@ |
| 27 | 27 | #define BALL_W 5
|
| 28 | 28 | #define BALL_H 5
|
| 29 | 29 |
|
| 30 | | -unsigned int dw, dh, dbpp;
|
| 31 | | -void* fb;
|
| | 30 | +// 24-bit FB (rgb888)
|
| | 31 | +#define DBPP 3
|
| 32 | 32 |
|
| 33 | | -static inline void drawat(unsigned int x, unsigned int y, unsigned char color)
|
| 34 | | -{
|
| 35 | | - if (x >= dw || y >= dh) return;
|
| 36 | | -
|
| 37 | | - // TODO: is there a better way?
|
| 38 | | - *((char *)(fb + dbpp * x + dbpp * dw * y)) = color;
|
| 39 | | - *((char *)(fb + dbpp * x + dbpp * dw * y + 1)) = color;
|
| 40 | | - *((char *)(fb + dbpp * x + dbpp * dw * y + 2)) = color;
|
| 41 | | -}
|
| 42 | | -
|
| 43 | 33 | static void main()
|
| 44 | 34 | {
|
| 45 | | - unsigned int run_cycles = 5000;
|
| 46 | | -
|
| 47 | | - dw = lcd_get_width();
|
| | 35 | + unsigned int run_cycles = 5000,
|
| | 36 | + dw = lcd_get_width(),
|
| 48 | 37 | dh = lcd_get_height();
|
| 49 | | - dbpp = 3; // 24-bit FB (rgb888)
|
| 50 | 38 |
|
| 51 | | - unsigned int fb_size = dbpp * dw * dh;
|
| 52 | | - fb = malloc(fb_size);
|
| | 39 | + unsigned int fb_size = DBPP * dw * dh;
|
| | 40 | + void* fb = malloc(fb_size);
|
| 53 | 41 |
|
| 54 | 42 | if (fb == NULL)
|
| 55 | 43 | {
|
| — | — | @@ -58,8 +46,22 @@ |
| 59 | 47 | unsigned int i, x = 0, y = 0,
|
| 60 | 48 | old_x, old_y, bx, by,
|
| 61 | 49 | size = BALL_W * BALL_H;
|
| | 50 | + unsigned char shape[BALL_H][BALL_W][DBPP];
|
| 62 | 51 | int vx = 1, vy = 1;
|
| 63 | 52 |
|
| | 53 | + // generate our shape
|
| | 54 | + memset(&shape, 0xff, sizeof(shape));
|
| | 55 | +
|
| | 56 | + // skip the first and the last pixel
|
| | 57 | + // then skip the ones in top-right and bottom-left
|
| | 58 | + // to create a rounded square
|
| | 59 | + for (i = 1; i < size - 1; ++i)
|
| | 60 | + {
|
| | 61 | + if (i == BALL_W - 1 || i == size - BALL_W) continue;
|
| | 62 | +
|
| | 63 | + memset(((void *)&shape) + i * DBPP, 0, DBPP);
|
| | 64 | + }
|
| | 65 | +
|
| 64 | 66 | //filllcd(0, 0, dw, dh, 0xffffff); // broken on Nano 4G?
|
| 65 | 67 | memset(fb, 0xff, fb_size);
|
| 66 | 68 | displaylcd(0, 0, dw, dh, fb, 0, 0, dw);
|
| — | — | @@ -85,24 +87,12 @@ |
| 86 | 88 |
|
| 87 | 89 | x += vx; y += vy;
|
| 88 | 90 |
|
| 89 | | - // draw our ball-like object
|
| 90 | | - // a circle-like actually, since we
|
| 91 | | - // don't have a 3D engine yet :)
|
| 92 | | - for (i = 1; i < BALL_W - 1; ++i)
|
| | 91 | + // copy the shape to the framebuffer
|
| | 92 | + for (i = 0; i < BALL_H; ++i)
|
| 93 | 93 | {
|
| 94 | | - drawat(x + i, y, 0);
|
| | 94 | + memcpy(fb + x * DBPP + (y + i) * dw * DBPP, &shape[i], sizeof(shape[i]));
|
| 95 | 95 | }
|
| 96 | 96 |
|
| 97 | | - for (i = BALL_W; i < size - BALL_W; ++i)
|
| 98 | | - {
|
| 99 | | - drawat(x + i % BALL_W, y + i / BALL_W, 0);
|
| 100 | | - }
|
| 101 | | -
|
| 102 | | - for (i = 1; i < BALL_W - 1; ++i)
|
| 103 | | - {
|
| 104 | | - drawat(x + i, y + BALL_H - 1, 0);
|
| 105 | | - }
|
| 106 | | -
|
| 107 | 97 | // offset to redraw from
|
| 108 | 98 | bx = vx > 0 ? old_x : x;
|
| 109 | 99 | by = vy > 0 ? old_y : y;
|