moving on
[eradicate] / src / introscr.c
1 #include <stdio.h>
2 #include "screens.h"
3 #include "imago2.h"
4 #include "gfx.h"
5 #include "gfxutil.h"
6 #include "game.h"
7
8 #define FADE_DUR        800
9
10 static void *logo;
11 static int logo_width, logo_height;
12 static long start_time;
13
14 int intro_init(void)
15 {
16         if(!(logo = img_load_pixels("data/msglogo.jpg", &logo_width, &logo_height, IMG_FMT_BGRA32))) {
17                 fprintf(stderr, "failed to load logo image\n");
18                 return -1;
19         }
20         return 0;
21 }
22
23 void intro_cleanup(void)
24 {
25         img_free_pixels(logo);
26 }
27
28 void intro_start(void)
29 {
30         draw = intro_draw;
31         key_event = intro_keyb;
32
33         start_time = time_msec;
34 }
35
36 void intro_stop(void)
37 {
38 }
39
40 void fade_image(void *dest, void *src, uint16_t fade);
41
42 void intro_draw(void)
43 {
44         long tm;
45         uint16_t fade;
46
47         tm = time_msec - start_time;
48         if(tm < FADE_DUR) {
49                 fade = tm * 256 / FADE_DUR;
50         } else if(tm < FADE_DUR * 2) {
51                 fade = 256;
52         } else if(tm < FADE_DUR * 3) {
53                 fade = 256 - (tm - 2 * FADE_DUR) * 256 / FADE_DUR;
54         } else {
55                 fade = 0;
56                 menu_start();
57                 return;
58         }
59
60 #ifdef USE_MMX
61         fade_image(fb_pixels, logo, fade);
62 #else
63         {
64                 int i, j;
65                 uint32_t *src = logo;
66                 uint16_t *dest = fb_pixels;
67                 for(i=0; i<640*480; i++) {
68                         uint32_t pix = *src++;
69                         uint16_t r = (uint16_t)UNPACK_R32(pix) * fade / 256;
70                         uint16_t g = (uint16_t)UNPACK_G32(pix) * fade / 256;
71                         uint16_t b = (uint16_t)UNPACK_B32(pix) * fade / 256;
72                         *dest++ = PACK_RGB16(r, g, b);
73                 }
74         }
75 #endif
76
77         blit_frame(fb_pixels, 0);
78 }
79
80 void intro_keyb(int key, int pressed)
81 {
82         if(pressed) {
83                 menu_start();
84         }
85 }