screen system
[fbgfx] / src / screen.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "screen.h"
5 #include "demo.h"
6
7 struct screen *console_screen(void);
8 struct screen *tunnel_screen(void);
9
10 #define NUM_SCR 2
11 static struct screen *scr[NUM_SCR];
12
13 static struct screen *cur, *prev, *next;
14 static long trans_start, trans_dur;
15
16 int scr_init(void)
17 {
18         int i;
19
20         if(!(scr[0] = console_screen())) {
21                 return -1;
22         }
23         if(!(scr[1] = tunnel_screen())) {
24                 return -1;
25         }
26
27         for(i=0; i<NUM_SCR; i++) {
28                 if(scr[i]->init() == -1) {
29                         return -1;
30                 }
31         }
32         return 0;
33 }
34
35 void scr_shutdown(void)
36 {
37         int i;
38         for(i=0; i<NUM_SCR; i++) {
39                 scr[i]->shutdown();
40         }
41 }
42
43 void scr_update(void)
44 {
45         if(prev) {      /* we're in the middle of a transition */
46                 long interval = time_msec - trans_start;
47                 if(interval >= trans_dur) {
48                         prev = 0;
49                         cur = next;
50                         next = 0;
51                 }
52         }
53 }
54
55 void scr_draw(void)
56 {
57         if(cur) cur->draw();
58 }
59
60 struct screen *scr_lookup(const char *name)
61 {
62         int i;
63         for(i=0; i<NUM_SCR; i++) {
64                 if(strcmp(scr[i]->name, name) == 0) {
65                         return scr[i];
66                 }
67         }
68         return 0;
69 }
70
71 int scr_change(struct screen *s, long trans_time)
72 {
73         if(s == cur) return 0;
74
75         if(trans_time && cur) {
76                 trans_dur = trans_time / 2;     /* half for each part transition out then in */
77                 trans_start = time_msec;
78
79                 prev = cur;
80                 next = s;
81         } else {
82                 cur = s;
83         }
84         return 0;
85 }