Abstract away aspect ratio handling.

This commit is contained in:
Themaister 2012-09-25 13:51:44 +02:00
parent 254e711e2d
commit 2674a67cdd
7 changed files with 25 additions and 4 deletions

View File

@ -630,6 +630,7 @@ const gfx_ctx_driver_t gfx_ctx_drm_egl = {
gfx_ctx_swap_interval, gfx_ctx_swap_interval,
gfx_ctx_set_video_mode, gfx_ctx_set_video_mode,
gfx_ctx_get_video_size, gfx_ctx_get_video_size,
NULL,
gfx_ctx_update_window_title, gfx_ctx_update_window_title,
gfx_ctx_check_window, gfx_ctx_check_window,
gfx_ctx_set_resize, gfx_ctx_set_resize,

View File

@ -422,6 +422,7 @@ const gfx_ctx_driver_t gfx_ctx_ps3 = {
gfx_ctx_set_swap_interval, gfx_ctx_set_swap_interval,
gfx_ctx_set_video_mode, gfx_ctx_set_video_mode,
gfx_ctx_get_video_size, gfx_ctx_get_video_size,
NULL,
gfx_ctx_update_window_title, gfx_ctx_update_window_title,
gfx_ctx_check_window, gfx_ctx_check_window,
gfx_ctx_set_resize, gfx_ctx_set_resize,

View File

@ -304,6 +304,7 @@ const gfx_ctx_driver_t gfx_ctx_sdl_gl = {
gfx_ctx_swap_interval, gfx_ctx_swap_interval,
gfx_ctx_set_video_mode, gfx_ctx_set_video_mode,
gfx_ctx_get_video_size, gfx_ctx_get_video_size,
NULL,
gfx_ctx_update_window_title, gfx_ctx_update_window_title,
gfx_ctx_check_window, gfx_ctx_check_window,
gfx_ctx_set_resize, gfx_ctx_set_resize,

View File

@ -270,6 +270,15 @@ static bool gfx_ctx_bind_api(enum gfx_ctx_api api)
} }
} }
static float gfx_ctx_translate_aspect(unsigned width, unsigned height)
{
// check for SD televisions: they should always be 4:3.
if ((width == 640 || width == 720) && (height == 480 || height == 576))
return 4.0f / 3.0f;
else
return (float)width / height;
}
const gfx_ctx_driver_t gfx_ctx_videocore = { const gfx_ctx_driver_t gfx_ctx_videocore = {
gfx_ctx_init, gfx_ctx_init,
gfx_ctx_destroy, gfx_ctx_destroy,
@ -277,6 +286,7 @@ const gfx_ctx_driver_t gfx_ctx_videocore = {
gfx_ctx_swap_interval, gfx_ctx_swap_interval,
gfx_ctx_set_video_mode, gfx_ctx_set_video_mode,
gfx_ctx_get_video_size, gfx_ctx_get_video_size,
gfx_ctx_translate_aspect,
gfx_ctx_update_window_title, gfx_ctx_update_window_title,
gfx_ctx_check_window, gfx_ctx_check_window,
gfx_ctx_set_resize, gfx_ctx_set_resize,

View File

@ -469,6 +469,7 @@ const gfx_ctx_driver_t gfx_ctx_x_egl = {
gfx_ctx_swap_interval, gfx_ctx_swap_interval,
gfx_ctx_set_video_mode, gfx_ctx_set_video_mode,
gfx_ctx_get_video_size, gfx_ctx_get_video_size,
NULL,
gfx_ctx_update_window_title, gfx_ctx_update_window_title,
gfx_ctx_check_window, gfx_ctx_check_window,
gfx_ctx_set_resize, gfx_ctx_set_resize,

View File

@ -55,6 +55,12 @@ typedef struct gfx_ctx_driver
// If not initialized yet, it returns current screen size. // If not initialized yet, it returns current screen size.
void (*get_video_size)(unsigned*, unsigned*); void (*get_video_size)(unsigned*, unsigned*);
// Translates a window size to an aspect ratio.
// In most cases this will be just width / height, but
// some contexts will better know which actual aspect ratio is used.
// This can be NULL to assume the default behavior.
float (*translate_aspect)(unsigned, unsigned);
// Asks driver to update window title (FPS, etc). // Asks driver to update window title (FPS, etc).
void (*update_window_title)(bool); void (*update_window_title)(bool);

View File

@ -609,11 +609,12 @@ void gl_set_viewport(gl_t *gl, unsigned width, unsigned height, bool force_full,
if (gl->keep_aspect && !force_full) if (gl->keep_aspect && !force_full)
{ {
float desired_aspect = g_settings.video.aspect_ratio; float desired_aspect = g_settings.video.aspect_ratio;
float device_aspect = (float)width / height;
// check for SD televisions: they should always be 4:3 float device_aspect;
if ((width == 640 || width == 720) && (height == 480 || height == 576)) if (gl->driver->translate_aspect)
device_aspect = 4.0f / 3.0f; device_aspect = gl->driver->translate_aspect(width, height);
else
device_aspect = (float)width / height;
float delta; float delta;