diff --git a/Makefile b/Makefile
index 84be99d318..cb3ad2d83a 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ include config.mk
TARGET = ssnes tools/ssnes-joyconfig
-OBJ = ssnes.o file.o driver.o settings.o dynamic.o message.o rewind.o movie.o autosave.o netplay.o
+OBJ = ssnes.o file.o driver.o settings.o dynamic.o message.o rewind.o movie.o autosave.o netplay.o gfx/gfx_common.o
JOYCONFIG_OBJ = tools/ssnes-joyconfig.o conf/config_file.o
HEADERS = $(wildcard */*.h) $(wildcard *.h)
diff --git a/Makefile.win32 b/Makefile.win32
index e642921ae1..98b820b2ef 100644
--- a/Makefile.win32
+++ b/Makefile.win32
@@ -1,6 +1,6 @@
TARGET = ssnes.exe
JTARGET = ssnes-joyconfig.exe
-OBJ = ssnes.o file.o driver.o conf/config_file.o settings.o dynamic.o message.o rewind.o movie.o autosave.o netplay.o
+OBJ = ssnes.o file.o driver.o conf/config_file.o settings.o dynamic.o message.o rewind.o movie.o autosave.o netplay.o gfx/gfx_common.o
JOBJ = conf/config_file.o tools/main-stub.o tools/ssnes-joyconfig.o
CC = gcc
diff --git a/gfx/gfx_common.c b/gfx/gfx_common.c
new file mode 100644
index 0000000000..d7a6a98536
--- /dev/null
+++ b/gfx/gfx_common.c
@@ -0,0 +1,58 @@
+/* SSNES - A Super Nintendo Entertainment System (SNES) Emulator frontend for libsnes.
+ * Copyright (C) 2010-2011 - Hans-Kristian Arntzen
+ *
+ * Some code herein may be based on code found in BSNES.
+ *
+ * SSNES is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Found-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * SSNES is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with SSNES.
+ * If not, see .
+ */
+
+#include "gfx_common.h"
+#include "general.h"
+#include
+
+static float tv_to_fps(const struct timeval *tv, const struct timeval *new_tv, int frames)
+{
+ float time = new_tv->tv_sec - tv->tv_sec + (new_tv->tv_usec - tv->tv_usec)/1000000.0;
+ return frames/time;
+}
+
+bool gfx_window_title(char *buf, size_t size)
+{
+ static int frames = 0;
+ static struct timeval tv;
+ struct timeval new_tv;
+ bool ret = false;
+
+ if (frames == 0)
+ {
+ gettimeofday(&tv, NULL);
+ snprintf(buf, size, g_extern.title_buf);
+ ret = true;
+ }
+
+ if ((frames % 180) == 0 && frames > 0)
+ {
+ gettimeofday(&new_tv, NULL);
+ struct timeval tmp_tv = tv;
+ tv = new_tv;
+
+ float fps = tv_to_fps(&tmp_tv, &new_tv, 180);
+
+ snprintf(buf, size, "%s || FPS: %6.1f || Frames: %d", g_extern.title_buf, fps, frames);
+ ret = true;
+ }
+
+ frames++;
+ return ret;
+}
+
+
diff --git a/gfx/gfx_common.h b/gfx/gfx_common.h
new file mode 100644
index 0000000000..95486494c8
--- /dev/null
+++ b/gfx/gfx_common.h
@@ -0,0 +1,26 @@
+/* SSNES - A Super Nintendo Entertainment System (SNES) Emulator frontend for libsnes.
+ * Copyright (C) 2010-2011 - Hans-Kristian Arntzen
+ *
+ * Some code herein may be based on code found in BSNES.
+ *
+ * SSNES is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Found-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * SSNES is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with SSNES.
+ * If not, see .
+ */
+
+#ifndef __GFX_COMMON_H
+#define __GFX_COMMON_H
+
+#include
+#include
+
+bool gfx_window_title(char *buf, size_t size);
+
+#endif
diff --git a/gfx/gl.c b/gfx/gl.c
index 1624ef80ff..a60b1ec655 100644
--- a/gfx/gl.c
+++ b/gfx/gl.c
@@ -32,6 +32,7 @@
#endif
#include "gl_common.h"
+#include "gfx_common.h"
#define NO_SDL_GLEXT
#include "SDL.h"
@@ -527,37 +528,6 @@ static void set_viewport(gl_t *gl, unsigned width, unsigned height, bool force_f
//SSNES_LOG("Setting viewport @ %ux%u\n", width, height);
}
-static float tv_to_fps(const struct timeval *tv, const struct timeval *new_tv, int frames)
-{
- float time = new_tv->tv_sec - tv->tv_sec + (new_tv->tv_usec - tv->tv_usec)/1000000.0;
- return frames/time;
-}
-
-static void show_fps(void)
-{
- // Shows FPS in taskbar.
- static int frames = 0;
- static struct timeval tv;
- struct timeval new_tv;
-
- if (frames == 0)
- gettimeofday(&tv, NULL);
-
- if ((frames % 180) == 0 && frames > 0)
- {
- gettimeofday(&new_tv, NULL);
- struct timeval tmp_tv = tv;
- gettimeofday(&tv, NULL);
- char tmpstr[256] = {0};
-
- float fps = tv_to_fps(&tmp_tv, &new_tv, 180);
-
- snprintf(tmpstr, sizeof(tmpstr), "%s || FPS: %6.1f || Frames: %d", g_extern.title_buf, fps, frames);
- SDL_WM_SetCaption(tmpstr, NULL);
- }
- frames++;
-}
-
static bool gl_frame(void *data, const void* frame, unsigned width, unsigned height, unsigned pitch, const char *msg)
{
gl_t *gl = data;
@@ -617,7 +587,6 @@ static bool gl_frame(void *data, const void* frame, unsigned width, unsigned hei
//SSNES_LOG("Setting last rect: %ux%u\n", width, height);
}
-
glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch / gl->base_size);
glTexSubImage2D(GL_TEXTURE_2D,
0, 0, 0, width, height, gl->texture_type,
@@ -687,7 +656,9 @@ static bool gl_frame(void *data, const void* frame, unsigned width, unsigned hei
if (msg)
gl_render_msg(gl, msg);
- show_fps();
+ char buf[128];
+ if (gfx_window_title(buf, sizeof(buf)))
+ SDL_WM_SetCaption(buf, NULL);
SDL_GL_SwapBuffers();
return true;
@@ -819,7 +790,9 @@ static void* gl_init(video_info_t *video, const input_driver_t **input, void **i
glColor4f(1, 1, 1, 1);
glClearColor(0, 0, 0, 1);
- SDL_WM_SetCaption(g_extern.title_buf, NULL);
+ char buf[128];
+ if (gfx_window_title(buf, sizeof(buf)))
+ SDL_WM_SetCaption(buf, NULL);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
diff --git a/gfx/xvideo.c b/gfx/xvideo.c
index ce2ad5ae95..21a4b112dd 100644
--- a/gfx/xvideo.c
+++ b/gfx/xvideo.c
@@ -20,9 +20,11 @@
#include
#include
#include
+#include
#ifdef HAVE_FREETYPE
#include "fonts.h"
#endif
+#include "gfx_common.h"
#include
#include
@@ -369,7 +371,11 @@ static void* xv_init(video_info_t *video, const input_driver_t **input, void **i
XSetWindowBackground(xv->display, xv->window, 0);
XMapWindow(xv->display, xv->window);
- XStoreName(xv->display, xv->window, g_extern.title_buf);
+
+ char buf[64];
+ if (gfx_window_title(buf, sizeof(buf)))
+ XStoreName(xv->display, xv->window, buf);
+
if (video->fullscreen)
set_fullscreen(xv);
hide_mouse(xv);
@@ -537,21 +543,20 @@ static void calc_out_rect(bool keep_aspect, unsigned *x, unsigned *y, unsigned *
// If the aspect ratios of screen and desired aspect ratio are sufficiently equal (floating point stuff),
// assume they are actually equal.
- if ( (int)(device_aspect*1000) > (int)(desired_aspect*1000) )
+ if (fabs(device_aspect - desired_aspect) < 0.0001)
+ {
+ *x = 0; *y = 0; *width = vp_width; *height = vp_height;
+ }
+ else if (device_aspect > desired_aspect)
{
float delta = (desired_aspect / device_aspect - 1.0) / 2.0 + 0.5;
*x = vp_width * (0.5 - delta); *y = 0; *width = 2.0 * vp_width * delta; *height = vp_height;
}
-
- else if ( (int)(device_aspect*1000) < (int)(desired_aspect*1000) )
+ else
{
float delta = (device_aspect / desired_aspect - 1.0) / 2.0 + 0.5;
*x = 0; *y = vp_height * (0.5 - delta); *width = vp_width; *height = 2.0 * vp_height * delta;
}
- else
- {
- *x = 0; *y = 0; *width = vp_width; *height = vp_height;
- }
}
}
@@ -629,6 +634,10 @@ static bool xv_frame(void *data, const void* frame, unsigned width, unsigned hei
x, y, owidth, oheight,
true);
+ char buf[64];
+ if (gfx_window_title(buf, sizeof(buf)))
+ XStoreName(xv->display, xv->window, buf);
+
return true;
}