screen system
[fbgfx] / src / conscr.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "screen.h"
5 #include "demo.h"
6
7 static int init(void);
8 static void destroy(void);
9 static void start(long trans_time);
10 static void stop(long trans_time);
11 static void draw(void);
12
13 static struct screen scr = {
14         "console",
15         init,
16         destroy,
17         start,
18         stop,
19         draw
20 };
21
22 static void *saved_fb;
23 static int fbsize;
24 static long trans_start, trans_dur;
25
26 struct screen *console_screen(void)
27 {
28         return &scr;
29 }
30
31 static int init(void)
32 {
33         fbsize = fb_width * fb_height * fb_depth / 8;
34
35         if(!(saved_fb = malloc(fbsize))) {
36                 perror("failed to allocate memory");
37                 return -1;
38         }
39         memcpy(saved_fb, fb_pixels, fbsize);
40         return 0;
41 }
42
43 static void destroy(void)
44 {
45         memcpy(fb_pixels, saved_fb, fbsize);
46         free(saved_fb);
47 }
48
49 static void start(long trans_time)
50 {
51 }
52
53 static void stop(long trans_time)
54 {
55         trans_start = time_msec;
56         trans_dur = trans_time;
57 }
58
59 static void draw(void)
60 {
61         int i, pixsz = fb_depth / 8;
62         long elapsed, offs, rem;
63         unsigned char *dptr = fb_pixels;
64         unsigned char *sptr = saved_fb;
65
66         if(!trans_start) {
67                 return;
68         }
69         printf("console draw\n");
70
71         elapsed = time_msec - trans_start;
72         offs = fb_width * elapsed / trans_dur;
73         rem = fb_width - offs;
74
75         for(i=0; i<fb_height; i++) {
76                 if(offs > 0) {
77                         memset(dptr, 0, offs * pixsz);
78                 }
79                 if(rem > 0) {
80                         memcpy(dptr + offs * pixsz, sptr, rem * pixsz);
81                 }
82
83                 dptr += fb_width * pixsz;
84                 sptr += fb_width * pixsz;
85         }
86 }