screen system
[fbgfx] / src / conscr.c
diff --git a/src/conscr.c b/src/conscr.c
new file mode 100644 (file)
index 0000000..4c56fb0
--- /dev/null
@@ -0,0 +1,86 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "screen.h"
+#include "demo.h"
+
+static int init(void);
+static void destroy(void);
+static void start(long trans_time);
+static void stop(long trans_time);
+static void draw(void);
+
+static struct screen scr = {
+       "console",
+       init,
+       destroy,
+       start,
+       stop,
+       draw
+};
+
+static void *saved_fb;
+static int fbsize;
+static long trans_start, trans_dur;
+
+struct screen *console_screen(void)
+{
+       return &scr;
+}
+
+static int init(void)
+{
+       fbsize = fb_width * fb_height * fb_depth / 8;
+
+       if(!(saved_fb = malloc(fbsize))) {
+               perror("failed to allocate memory");
+               return -1;
+       }
+       memcpy(saved_fb, fb_pixels, fbsize);
+       return 0;
+}
+
+static void destroy(void)
+{
+       memcpy(fb_pixels, saved_fb, fbsize);
+       free(saved_fb);
+}
+
+static void start(long trans_time)
+{
+}
+
+static void stop(long trans_time)
+{
+       trans_start = time_msec;
+       trans_dur = trans_time;
+}
+
+static void draw(void)
+{
+       int i, pixsz = fb_depth / 8;
+       long elapsed, offs, rem;
+       unsigned char *dptr = fb_pixels;
+       unsigned char *sptr = saved_fb;
+
+       if(!trans_start) {
+               return;
+       }
+       printf("console draw\n");
+
+       elapsed = time_msec - trans_start;
+       offs = fb_width * elapsed / trans_dur;
+       rem = fb_width - offs;
+
+       for(i=0; i<fb_height; i++) {
+               if(offs > 0) {
+                       memset(dptr, 0, offs * pixsz);
+               }
+               if(rem > 0) {
+                       memcpy(dptr + offs * pixsz, sptr, rem * pixsz);
+               }
+
+               dptr += fb_width * pixsz;
+               sptr += fb_width * pixsz;
+       }
+}