screen system
[fbgfx] / src / screen.c
diff --git a/src/screen.c b/src/screen.c
new file mode 100644 (file)
index 0000000..1f1dfbe
--- /dev/null
@@ -0,0 +1,85 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "screen.h"
+#include "demo.h"
+
+struct screen *console_screen(void);
+struct screen *tunnel_screen(void);
+
+#define NUM_SCR        2
+static struct screen *scr[NUM_SCR];
+
+static struct screen *cur, *prev, *next;
+static long trans_start, trans_dur;
+
+int scr_init(void)
+{
+       int i;
+
+       if(!(scr[0] = console_screen())) {
+               return -1;
+       }
+       if(!(scr[1] = tunnel_screen())) {
+               return -1;
+       }
+
+       for(i=0; i<NUM_SCR; i++) {
+               if(scr[i]->init() == -1) {
+                       return -1;
+               }
+       }
+       return 0;
+}
+
+void scr_shutdown(void)
+{
+       int i;
+       for(i=0; i<NUM_SCR; i++) {
+               scr[i]->shutdown();
+       }
+}
+
+void scr_update(void)
+{
+       if(prev) {      /* we're in the middle of a transition */
+               long interval = time_msec - trans_start;
+               if(interval >= trans_dur) {
+                       prev = 0;
+                       cur = next;
+                       next = 0;
+               }
+       }
+}
+
+void scr_draw(void)
+{
+       if(cur) cur->draw();
+}
+
+struct screen *scr_lookup(const char *name)
+{
+       int i;
+       for(i=0; i<NUM_SCR; i++) {
+               if(strcmp(scr[i]->name, name) == 0) {
+                       return scr[i];
+               }
+       }
+       return 0;
+}
+
+int scr_change(struct screen *s, long trans_time)
+{
+       if(s == cur) return 0;
+
+       if(trans_time && cur) {
+               trans_dur = trans_time / 2;     /* half for each part transition out then in */
+               trans_start = time_msec;
+
+               prev = cur;
+               next = s;
+       } else {
+               cur = s;
+       }
+       return 0;
+}