+#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;
+ }
+}