menubg, png, bugfix
[fceu.git] / drivers / gp2x / gp2x-video.c
CommitLineData
35868d35 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
937bf65b 22#include "../../video.h"
23
b2b95d2e 24#include "main.h"
22f08d95 25#include "gp2x.h"
35868d35 26#include "minimal.h"
b2b95d2e 27#include "fonts.h"
989672f4 28#include "asmutils.h"
35868d35 29
35868d35 30static char fps_str[32];
31static int framesEmulated, framesRendered;
32
b2b95d2e 33int gp2x_palette[256];
989672f4 34unsigned short gp2x_palette16[256];
b2b95d2e 35
35868d35 36int paletterefresh;
37
21afaa36 38extern int eoptions;
39
6587f346 40#define FPS_COLOR 1
35868d35 41
42
35868d35 43static 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
21afaa36 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;
35868d35 63
64 }
65 screen+=8;
66 }
67}
68
69
70void CleanSurface(void)
71{
72 int c=4;
73 while (c--)
74 {
21afaa36 75 memset32(gp2x_screen, 0, 320*240*2/4);
35868d35 76 gp2x_video_flip();
77 }
b2b95d2e 78 XBuf = gp2x_screen;
35868d35 79}
80
81
82void KillVideo(void)
83{
84}
85
86
87int 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;
b2b95d2e 97 XBuf = gp2x_screen;
35868d35 98 return 1;
99}
100
101
102void ToggleFS(void)
103{
104}
105
106
989672f4 107// 16: rrrr rggg gggb bbbb
35868d35 108void FCEUD_SetPalette(uint8 index, uint8 r, uint8 g, uint8 b)
109{
47d0839e 110 /* note: menu depends on bit5 being 0 */
b2b95d2e 111 gp2x_palette[index] = (r << 16) | (g << 8) | b;
47d0839e 112 gp2x_palette16[index] = ((r & 0xf8) << 8) | ((g & 0xf8) << 3) | (b >> 3);
b2b95d2e 113 gp2x_video_setpalette(gp2x_palette, index + 1);
35868d35 114
115 paletterefresh = 1;
116}
117
118
119void FCEUD_GetPalette(uint8 index, uint8 * r, uint8 * g, uint8 * b)
120{
b2b95d2e 121 int pix = gp2x_palette[index];
122 *r = (uint8) (pix >> 16);
123 *g = (uint8) (pix >> 8);
124 *b = (uint8) pix;
35868d35 125}
126
127
128static 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 {
22f08d95 136 sprintf(fps_str, "%2i/%2i", framesRendered, framesEmulated);
35868d35 137 framesEmulated = framesRendered = 0;
138 needfpsflip = 4;
139 prevsec = tv_now.tv_sec;
140 }
141
21afaa36 142 if (!Settings.showfps || !screen) return;
143
989672f4 144 if (Settings.scaling == 0)
35868d35 145 {
146 if (needfpsflip)
147 {
21afaa36 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);
35868d35 154 needfpsflip--;
155 }
156 }
157 else
158 {
21afaa36 159 gp2x_text(screen+32, 0, srendline, fps_str, FPS_COLOR, 0);
35868d35 160 }
161}
162
163
937bf65b 164void BlitScreen(uint8 *buf)
35868d35 165{
35868d35 166 framesEmulated++;
167
21afaa36 168 if (!buf) {
169 printFps(0);
170 return;
171 }
35868d35 172
173 framesRendered++;
174
b2b95d2e 175 printFps(gp2x_screen);
989672f4 176
21afaa36 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
989672f4 186 if (Settings.scaling == 3)
21afaa36 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 }
989672f4 192
35868d35 193 gp2x_video_flip();
b2b95d2e 194 XBuf = gp2x_screen;
35868d35 195}
196
197