cf1ed73c2b6f53212e690e71576cd202a3cda624
[dosdemo] / src / mike.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <math.h>
5 #include <assert.h>
6 #include "imago2.h"
7 #include "demo.h"
8 #include "screen.h"
9
10 #define BG_FILENAME "data/grise.png"
11
12 #define MIN_SCROLL 32
13 #define MAX_SCROLL (backgroundW - fb_width - MIN_SCROLL)
14
15 static int init(void);
16 static void destroy(void);
17 static void start(long trans_time);
18 static void stop(long trans_time);
19 static void draw(void);
20
21 static void convert32To16(unsigned int *src32, unsigned short *dst16, unsigned int pixelCount);
22
23 static unsigned short *background = 0;
24 static unsigned int backgroundW = 0;
25 static unsigned int backgroundH = 0;
26
27 static struct screen scr = {
28         "mike",
29         init,
30         destroy,
31         start,
32         stop,
33         draw
34 };
35
36 struct screen *mike_screen(void)
37 {
38         return &scr;
39 }
40
41
42 static int init(void)
43 {
44         if (!(background = img_load_pixels(BG_FILENAME, &backgroundW, &backgroundH, IMG_FMT_RGBA32))) {
45                 fprintf(stderr, "failed to load image " BG_FILENAME "\n");
46                 return -1;
47         }
48
49         /* Convert to 16bpp */
50         convert32To16((unsigned int*)background, background, backgroundW * backgroundH);
51
52         return 0;
53 }
54
55 static void destroy(void)
56 {
57         //img_free_pixels(background);
58 }
59
60 static void start(long trans_time)
61 {
62
63 }
64
65 static void stop(long trans_time)
66 {
67 }
68
69 static void draw(void)
70 {       
71         int scroll = MIN_SCROLL + (MAX_SCROLL - MIN_SCROLL) * mouse_x / fb_width;
72         unsigned short *dst = fb_pixels;
73         unsigned short *src = background + 2 * scroll;
74         int scanline = 0;
75         
76
77         for (scanline = 0; scanline < fb_height; scanline++) {
78                 memcpy(dst, src, fb_width * 2);
79                 src += backgroundW;
80                 dst += fb_width;
81         }
82 }
83
84 /* src and dst can be the same */
85 static void convert32To16(unsigned int *src32, unsigned short *dst16, unsigned int pixelCount) {
86         unsigned int p;
87         while (pixelCount) {
88                 p = *src32++;
89                 *dst16++ =      ((p << 8) & 0xF800)             /* R */
90                         |               ((p >> 5) & 0x07E0)             /* G */
91                         |               ((p >> 19) & 0x001F);   /* B */
92                 pixelCount--;
93         }
94 }
95
96