backport builds
[dosdemo] / src / screen.c
index 4379778..8069ce8 100644 (file)
@@ -4,29 +4,79 @@
 #include <assert.h>
 #include "screen.h"
 #include "demo.h"
+#include "gfxutil.h"
+#include "timer.h"
+
+#define DBG_SCRCHG \
+       do { \
+               dbg_curscr_name = cur->name ? cur->name : "<unknown>"; \
+               dbg_curscr_name_len = strlen(dbg_curscr_name); \
+               dbg_curscr_name_pos = 320 - dbg_curscr_name_len * 9; \
+       } while(0)
 
 struct screen *tunnel_screen(void);
 struct screen *fract_screen(void);
-struct screen *mike_screen(void);
-
-#define NUM_SCR        32
+struct screen *grise_screen(void);
+struct screen *polytest_screen(void);
+struct screen *plasma_screen(void);
+struct screen *bump_screen(void);
+struct screen *thunder_screen(void);
+struct screen *metaballs_screen(void);
+struct screen *greets_screen(void);
+struct screen *infcubes_screen(void);
+struct screen *hairball_screen(void);
+
+void start_loadscr(void);
+void end_loadscr(void);
+void loadscr(int n, int count);
+
+#define NUM_SCR 32
 static struct screen *scr[NUM_SCR];
 static int num_screens;
 
 static struct screen *cur, *prev, *next;
 static long trans_start, trans_dur;
 
+const char *dbg_curscr_name;
+int dbg_curscr_name_len, dbg_curscr_name_pos;
+
 int scr_init(void)
 {
        int i, idx = 0;
 
+       start_loadscr();
+
        if(!(scr[idx++] = tunnel_screen())) {
                return -1;
        }
        if(!(scr[idx++] = fract_screen())) {
                return -1;
        }
-       if (!(scr[idx++] = mike_screen())) {
+       if (!(scr[idx++] = grise_screen())) {
+               return -1;
+       }
+       if(!(scr[idx++] = polytest_screen())) {
+               return -1;
+       }
+       if (!(scr[idx++] = plasma_screen())) {
+               return -1;
+       }
+       if (!(scr[idx++] = bump_screen())) {
+               return -1;
+       }
+       if (!(scr[idx++] = thunder_screen())) {
+               return -1;
+       }
+       if(!(scr[idx++] = metaballs_screen())) {
+               return -1;
+       }
+       if(!(scr[idx++] = greets_screen())) {
+               return -1;
+       }
+       if(!(scr[idx++] = infcubes_screen())) {
+               return -1;
+       }
+       if(!(scr[idx++] = hairball_screen())) {
                return -1;
        }
        num_screens = idx;
@@ -34,21 +84,13 @@ int scr_init(void)
        assert(num_screens <= NUM_SCR);
 
        for(i=0; i<num_screens; i++) {
-               int r;
-               r = scr[i]->init();
-               if(r == -1) {
+               loadscr(i, num_screens);
+               if(scr[i]->init() == -1) {
                        return -1;
                }
-
-               /* Make the effect run first if it returns "CAFE" from ins init() */
-               if (r == 0xCAFE) {
-                       struct screen *tmp;
-                       tmp = scr[i];
-                       scr[i] = scr[0];
-                       scr[0] = tmp;
-                       printf("*** Screen %s displayed out of order ***\n", scr[0]->name);
-               }
        }
+
+       end_loadscr();
        return 0;
 }
 
@@ -62,7 +104,7 @@ void scr_shutdown(void)
 
 void scr_update(void)
 {
-       if(prev) {      /* we're in the middle of a transition */
+       if(prev) {  /* we're in the middle of a transition */
                long interval = time_msec - trans_start;
                if(interval >= trans_dur) {
                        if(next->start) {
@@ -71,13 +113,25 @@ void scr_update(void)
                        prev = 0;
                        cur = next;
                        next = 0;
+
+                       DBG_SCRCHG;
                }
        }
 }
 
+
 void scr_draw(void)
 {
-       if(cur) cur->draw();
+       if(cur) {
+               cur->draw();
+       }
+}
+
+void scr_keypress(int key)
+{
+       if(cur && cur->keypress) {
+               cur->keypress(key);
+       }
 }
 
 struct screen *scr_lookup(const char *name)
@@ -107,17 +161,14 @@ int scr_change(struct screen *s, long trans_time)
        if(s == cur) return 0;
 
        if(trans_time) {
-               trans_dur = trans_time / 2;     /* half for each part transition out then in */
+               trans_dur = trans_time / 2; /* half for each part transition out then in */
                trans_start = time_msec;
        } else {
                trans_dur = 0;
        }
 
-       if(cur) {
-               if(cur->stop) {
-                       cur->stop(trans_dur);
-               }
-
+       if(cur && cur->stop) {
+               cur->stop(trans_dur);
                prev = cur;
                next = s;
        } else {
@@ -127,6 +178,54 @@ int scr_change(struct screen *s, long trans_time)
 
                cur = s;
                prev = 0;
+
+               DBG_SCRCHG;
        }
        return 0;
 }
+
+/* loading screen */
+extern uint16_t loading_pixels[];
+
+void start_loadscr(void)
+{
+       swap_buffers(loading_pixels);
+}
+
+#define SPLAT_X 288
+#define SPLAT_Y 104
+
+#define FING_X 217
+#define FING_LAST_X    291
+#define FING_Y 151
+#define FING_W 7
+#define FING_H 8
+
+void end_loadscr(void)
+{
+       blitfb(loading_pixels + SPLAT_Y * 320 + SPLAT_X, loading_pixels + 320 * 240, 32, 72, 32);
+       blit_key(loading_pixels + FING_Y * 320 + FING_LAST_X, 320, loading_pixels + 247 * 320 + 64,
+                       FING_W, FING_H, FING_W, 0);
+       swap_buffers(loading_pixels);
+       sleep_msec(300);
+}
+
+void loadscr(int n, int count)
+{
+       int xoffs = 75 * n / (count - 1);
+       static int prev_xoffs;
+       uint16_t *sptr, *dptr;
+
+       sptr = loading_pixels + 247 * 320 + 64;
+       dptr = loading_pixels + FING_Y * 320 + FING_X + prev_xoffs;
+
+       while(prev_xoffs < xoffs) {
+               blit_key(dptr, 320, sptr, FING_W, FING_H, FING_W, 0);
+               dptr++;
+               prev_xoffs++;
+       }
+
+       swap_buffers(loading_pixels);
+
+       /*sleep_msec(200);*/
+}