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