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