Subversion Repositories freemyipod

Rev

Rev 761 | Rev 835 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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