e7022391ed8f9151fa47d5a3a9859f69dcf2213b
[fceu.git] / drivers / gp2x / gp2x-video.c
1 /* FCE Ultra - NES/Famicom Emulator
2  *
3  * This program is free software; you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License as published by
5  * the Free Software Foundation; either version 2 of the License, or
6  * (at your option) any later version.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16  */
17
18 #include <stdio.h>
19 #include <string.h>
20 #include <sys/time.h>
21
22 #include "../../video.h"
23
24 #include "main.h"
25 #include "gp2x.h"
26 #include "minimal.h"
27 #include "fonts.h"
28 #include "asmutils.h"
29
30 static char fps_str[32];
31 static int framesEmulated, framesRendered;
32
33 int gp2x_palette[256];
34 unsigned short gp2x_palette16[256];
35
36 int paletterefresh;
37
38 extern int eoptions;
39
40 #define FPS_COLOR 1
41
42
43 static void gp2x_text(unsigned char *screen, int x, int y, char *text, int color, int flip)
44 {
45         int i,l,slen;
46         slen=strlen(text);
47
48         screen=screen+x+y*320;
49
50         for (i=0;i<slen;i++)
51         {
52                 for (l=0;l<8;l++)
53                 {
54
55                         screen[l*320+0]=(fontdata8x8[((text[i])*8)+l]&0x80)?color:0;
56                         screen[l*320+1]=(fontdata8x8[((text[i])*8)+l]&0x40)?color:0;
57                         screen[l*320+2]=(fontdata8x8[((text[i])*8)+l]&0x20)?color:0;
58                         screen[l*320+3]=(fontdata8x8[((text[i])*8)+l]&0x10)?color:0;
59                         screen[l*320+4]=(fontdata8x8[((text[i])*8)+l]&0x08)?color:0;
60                         screen[l*320+5]=(fontdata8x8[((text[i])*8)+l]&0x04)?color:0;
61                         screen[l*320+6]=(fontdata8x8[((text[i])*8)+l]&0x02)?color:0;
62                         screen[l*320+7]=(fontdata8x8[((text[i])*8)+l]&0x01)?color:0;
63
64                 }
65                 screen+=8;
66         }
67 }
68
69
70 void CleanSurface(void)
71 {
72         int c=4;
73         while (c--)
74         {
75                 memset32(gp2x_screen, 0, 320*240*2/4);
76                 gp2x_video_flip();
77         }
78         XBuf = gp2x_screen;
79 }
80
81
82 void KillVideo(void)
83 {
84 }
85
86
87 int InitVideo(void)
88 {
89         fps_str[0]=0;
90
91         CleanSurface();
92
93         puts("Initialized GP2X VIDEO via minimal");
94
95         srendline=0;
96         erendline=239;
97         XBuf = gp2x_screen;
98         return 1;
99 }
100
101
102 void ToggleFS(void)
103 {
104 }
105
106
107 // 16: rrrr rggg gggb bbbb
108 void FCEUD_SetPalette(uint8 index, uint8 r, uint8 g, uint8 b)
109 {
110         /* note: menu depends on bit5 being 0 */
111         gp2x_palette[index] = (r << 16) | (g << 8) | b;
112         gp2x_palette16[index] = ((r & 0xf8) << 8) | ((g & 0xf8) << 3) | (b >> 3);
113         gp2x_video_setpalette(gp2x_palette, index + 1);
114
115         paletterefresh = 1;
116 }
117
118
119 void FCEUD_GetPalette(uint8 index, uint8 * r, uint8 * g, uint8 * b)
120 {
121         int pix = gp2x_palette[index];
122         *r = (uint8) (pix >> 16);
123         *g = (uint8) (pix >> 8);
124         *b = (uint8)  pix;
125 }
126
127
128 static INLINE void printFps(uint8 *screen)
129 {
130         struct timeval tv_now;
131         static int prevsec, needfpsflip = 0;
132
133         gettimeofday(&tv_now, 0);
134         if (prevsec != tv_now.tv_sec)
135         {
136                 sprintf(fps_str, "%2i/%2i", framesRendered, framesEmulated);
137                 framesEmulated = framesRendered = 0;
138                 needfpsflip = 4;
139                 prevsec = tv_now.tv_sec;
140         }
141
142         if (!Settings.showfps || !screen) return;
143
144         if (Settings.scaling == 0)
145         {
146                 if (needfpsflip)
147                 {
148                         int sep;
149                         for (sep=1; sep < 5; sep++)
150                                 if (fps_str[sep] == '/' || fps_str[sep] == 0) break;
151                         fps_str[sep] = 0;
152                         gp2x_text(screen, 0,  0, fps_str,       FPS_COLOR, 0);
153                         gp2x_text(screen, 0, 10, fps_str+sep+1, FPS_COLOR, 0);
154                         needfpsflip--;
155                 }
156         }
157         else
158         {
159                 gp2x_text(screen+32, 0, srendline, fps_str, FPS_COLOR, 0);
160         }
161 }
162
163
164 void BlitScreen(uint8 *buf)
165 {
166         framesEmulated++;
167
168         if (!buf) {
169                 printFps(0);
170                 return;
171         }
172
173         framesRendered++;
174
175         printFps(gp2x_screen);
176
177         if (eoptions & EO_CLIPSIDES)
178         {
179                 int i, *p = (int *) ((char *)gp2x_screen + 32);
180                 for (i = 240; i; i--, p += 320/4)
181                 {
182                         p[0] = p[1] = p[62] = p[63] = 0;
183                 }
184         }
185
186         if (Settings.scaling == 3)
187         {
188                 soft_scale((char *)gp2x_screen + 32, gp2x_palette16, srendline, erendline-srendline);
189                 if (srendline)
190                         memset32((int *)((char *)gp2x_screen + 32), 0, srendline*320*2/4);
191         }
192
193         gp2x_video_flip();
194         XBuf = gp2x_screen;
195 }
196
197