Added --keepaspectratio option to keep correct aspect ratio with custom resolutions

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@2825 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
gewlitys
2007-07-29 19:18:14 +00:00
parent c82e1fa430
commit ca2f82e40f
6 changed files with 87 additions and 14 deletions
+2
View File
@@ -1,4 +1,6 @@
Changes towards version 0.7: Changes towards version 0.7:
- Added --keepaspectratio to keep correct aspect ratio when using
custom resolutions in OpenGL mode - Mika
- Add /var/tmp as possible location for temporary files. Don't try - Add /var/tmp as possible location for temporary files. Don't try
/tmp and /var/tmp at all on MS Windows (Cygwin excepted) - SvdB /tmp and /var/tmp at all on MS Windows (Cygwin excepted) - SvdB
- Added fullscreen/windowed toggle key F11 - Mika - Added fullscreen/windowed toggle key F11 - Mika
+4
View File
@@ -74,6 +74,10 @@ poor or no 3D acceleration, and is often faster, especially on older
or less well supported cards. Only the 320x240 and 640x480 or less well supported cards. Only the 320x240 and 640x480
resolutions are available when not using OpenGL. resolutions are available when not using OpenGL.
-k (or --keepaspectratio)
Keep 4:3 aspect ratio when using custom resolutions.
-c (or --scale=mode) -c (or --scale=mode)
Graphics scaling mode (bilinear, biadapt, biadv, triscan, hq or none). Graphics scaling mode (bilinear, biadapt, biadv, triscan, hq or none).
+1
View File
@@ -48,6 +48,7 @@ int optMeleeScale;
BOOLEAN optSubtitles; BOOLEAN optSubtitles;
BOOLEAN optStereoSFX; BOOLEAN optStereoSFX;
BOOLEAN optKeepAspectRatio;
uio_DirHandle *contentDir; uio_DirHandle *contentDir;
uio_DirHandle *configDir; uio_DirHandle *configDir;
uio_DirHandle *saveDir; uio_DirHandle *saveDir;
+1
View File
@@ -41,6 +41,7 @@ extern int optMeleeScale;
extern BOOLEAN optSubtitles; extern BOOLEAN optSubtitles;
extern BOOLEAN optStereoSFX; extern BOOLEAN optStereoSFX;
extern BOOLEAN optKeepAspectRatio;
extern uio_DirHandle *contentDir; extern uio_DirHandle *contentDir;
extern uio_DirHandle *configDir; extern uio_DirHandle *configDir;
+66 -13
View File
@@ -21,6 +21,7 @@
#include "libs/graphics/sdl/opengl.h" #include "libs/graphics/sdl/opengl.h"
#include "bbox.h" #include "bbox.h"
#include "scalers.h" #include "scalers.h"
#include "options.h"
#include "libs/log.h" #include "libs/log.h"
typedef struct _gl_screeninfo { typedef struct _gl_screeninfo {
@@ -337,28 +338,77 @@ TFB_GL_ScanLines (void)
static void static void
TFB_GL_DrawQuad (SDL_Rect *r) TFB_GL_DrawQuad (SDL_Rect *r)
{ {
BOOLEAN keep_aspect_ratio = optKeepAspectRatio;
int x1 = 0, y1 = 0, x2 = ScreenWidthActual, y2 = ScreenHeightActual;
int sx, sy, sw, sh;
float sx_multiplier, sy_multiplier;
if (keep_aspect_ratio)
{
float threshold = 0.75f;
float ratio = ScreenHeightActual / (float)ScreenWidthActual;
if (ratio > threshold)
{
// screen is narrower than 4:3
int height = (int)(ScreenWidthActual * threshold);
y1 = (ScreenHeightActual - height) / 2;
y2 = ScreenHeightActual - y1;
if (r != NULL)
{
sx_multiplier = ScreenWidthActual / (float)ScreenWidth;
sy_multiplier = height / (float)ScreenHeight;
sx = (int)(r->x * sx_multiplier);
sy = (int)(((ScreenHeight - (r->y + r->h)) * sy_multiplier) + y1);
}
}
else if (ratio < threshold)
{
// screen is wider than 4:3
int width = (int)(ScreenHeightActual / threshold);
x1 = (ScreenWidthActual - width) / 2;
x2 = ScreenWidthActual - x1;
if (r != NULL)
{
sx_multiplier = width / (float)ScreenWidth;
sy_multiplier = ScreenHeightActual / (float)ScreenHeight;
sx = (int)((r->x * sx_multiplier) + x1);
sy = (int)((ScreenHeight - (r->y + r->h)) * sy_multiplier);
}
}
else
{
// screen is 4:3
keep_aspect_ratio = 0;
}
}
if (r != NULL) if (r != NULL)
{ {
float scale_x = (ScreenWidthActual / (float)ScreenWidth); if (!keep_aspect_ratio)
float scale_y = (ScreenHeightActual / (float)ScreenHeight); {
sx_multiplier = ScreenWidthActual / (float)ScreenWidth;
glScissor ( sy_multiplier = ScreenHeightActual / (float)ScreenHeight;
(GLint) (r->x * scale_x), sx = (int)(r->x * sx_multiplier);
(GLint) ((ScreenHeight - (r->y + r->h)) * scale_y), sy = (int)((ScreenHeight - (r->y + r->h)) * sy_multiplier);
(GLsizei) (r->w * scale_x), }
(GLsizei) (r->h * scale_y) sw = (int)(r->w * sx_multiplier);
); sh = (int)(r->h * sy_multiplier);
glScissor (sx, sy, sw, sh);
glEnable (GL_SCISSOR_TEST); glEnable (GL_SCISSOR_TEST);
} }
glBegin (GL_TRIANGLE_FAN); glBegin (GL_TRIANGLE_FAN);
glTexCoord2f (0, 0); glTexCoord2f (0, 0);
glVertex2i (0, 0); glVertex2i (x1, y1);
glTexCoord2f (ScreenWidth / 512.0f, 0); glTexCoord2f (ScreenWidth / 512.0f, 0);
glVertex2i (ScreenWidthActual, 0); glVertex2i (x2, y1);
glTexCoord2f (ScreenWidth / 512.0f, ScreenHeight / 256.0f); glTexCoord2f (ScreenWidth / 512.0f, ScreenHeight / 256.0f);
glVertex2i (ScreenWidthActual, ScreenHeightActual); glVertex2i (x2, y2);
glTexCoord2f (0, ScreenHeight / 256.0f); glTexCoord2f (0, ScreenHeight / 256.0f);
glVertex2i (0, ScreenHeightActual); glVertex2i (x1, y2);
glEnd (); glEnd ();
if (r != NULL) if (r != NULL)
{ {
@@ -374,6 +424,9 @@ TFB_GL_Preprocess (int force_full_redraw, int transition_amount, int fade_amount
glOrtho (0,ScreenWidthActual,ScreenHeightActual, 0, -1, 1); glOrtho (0,ScreenWidthActual,ScreenHeightActual, 0, -1, 1);
glMatrixMode (GL_MODELVIEW); glMatrixMode (GL_MODELVIEW);
glLoadIdentity (); glLoadIdentity ();
if (optKeepAspectRatio)
glClear (GL_COLOR_BUFFER_BIT);
(void) transition_amount; (void) transition_amount;
(void) fade_amount; (void) fade_amount;
+13 -1
View File
@@ -67,6 +67,7 @@ struct options_struct {
int soundFlags; int soundFlags;
int width; int width;
int height; int height;
BOOLEAN keepAspectRatio;
const char *configDir; const char *configDir;
const char *contentDir; const char *contentDir;
const char **addons; const char **addons;
@@ -115,6 +116,7 @@ main (int argc, char *argv[])
/* .soundFlags = */ audio_QUALITY_MEDIUM, /* .soundFlags = */ audio_QUALITY_MEDIUM,
/* .width = */ 640, /* .width = */ 640,
/* .height = */ 480, /* .height = */ 480,
/* .keepAspectRatio = */ FALSE,
/* .configDir = */ NULL, /* .configDir = */ NULL,
/* .contentDir = */ NULL, /* .contentDir = */ NULL,
/* .addons = */ NULL, /* .addons = */ NULL,
@@ -207,6 +209,10 @@ main (int argc, char *argv[])
{ {
options.height = res_GetInteger ("config.resheight"); options.height = res_GetInteger ("config.resheight");
} }
if (res_HasKey("config.keepaspectratio"))
{
options.keepAspectRatio = res_GetBoolean ("config.keepaspectratio");
}
if (res_HasKey ("config.alwaysgl")) if (res_HasKey ("config.alwaysgl"))
{ {
if (res_GetBoolean ("config.alwaysgl")) if (res_GetBoolean ("config.alwaysgl"))
@@ -408,6 +414,7 @@ main (int argc, char *argv[])
optWhichShield = options.whichShield; optWhichShield = options.whichShield;
optSmoothScroll = options.smoothScroll; optSmoothScroll = options.smoothScroll;
optMeleeScale = options.meleeScale; optMeleeScale = options.meleeScale;
optKeepAspectRatio = options.keepAspectRatio;
optSubtitles = options.subTitles; optSubtitles = options.subTitles;
optStereoSFX = options.stereoSFX; optStereoSFX = options.stereoSFX;
musicVolumeScale = options.musicVolumeScale; musicVolumeScale = options.musicVolumeScale;
@@ -488,7 +495,7 @@ enum
#endif #endif
}; };
static const char *optString = "+r:d:foc:b:spC:n:?hM:S:T:m:q:ug:l:i:vwx"; static const char *optString = "+r:d:foc:b:spC:n:?hM:S:T:m:q:ug:l:i:vwxk";
static struct option longOptions[] = static struct option longOptions[] =
{ {
{"res", 1, NULL, 'r'}, {"res", 1, NULL, 'r'},
@@ -513,6 +520,7 @@ static struct option longOptions[] =
{"version", 0, NULL, 'v'}, {"version", 0, NULL, 'v'},
{"windowed", 0, NULL, 'w'}, {"windowed", 0, NULL, 'w'},
{"nogl", 0, NULL, 'x'}, {"nogl", 0, NULL, 'x'},
{"keepaspectratio", 0, NULL, 'k'},
// options with no short equivalent: // options with no short equivalent:
{"cscan", 1, NULL, CSCAN_OPT}, {"cscan", 1, NULL, CSCAN_OPT},
@@ -625,6 +633,9 @@ parseOptions (int argc, char *argv[], struct options_struct *options)
case 'x': case 'x':
options->gfxDriver = TFB_GFXDRIVER_SDL_PURE; options->gfxDriver = TFB_GFXDRIVER_SDL_PURE;
break; break;
case 'k':
options->keepAspectRatio = TRUE;
break;
case 'c': case 'c':
// make sure whatever was set by saved config is cleared // make sure whatever was set by saved config is cleared
options->gfxFlags &= ~TFB_GFXFLAGS_SCALE_ANY; options->gfxFlags &= ~TFB_GFXFLAGS_SCALE_ANY;
@@ -972,6 +983,7 @@ usage (FILE *out, const struct options_struct *defaultOptions)
log_add (log_User, " -w, --windowed (default on)"); log_add (log_User, " -w, --windowed (default on)");
log_add (log_User, " -o, --opengl (default off)"); log_add (log_User, " -o, --opengl (default off)");
log_add (log_User, " -x, --nogl (default on)"); log_add (log_User, " -x, --nogl (default on)");
log_add (log_User, " -k, --keepaspectratio (default off)");
log_add (log_User, " -c, --scale=MODE (bilinear, biadapt, biadv, triscan, " log_add (log_User, " -c, --scale=MODE (bilinear, biadapt, biadv, triscan, "
"hq or none (default) )"); "hq or none (default) )");
log_add (log_User, " -b, --meleezoom=MODE (step, aka pc, or smooth, aka 3do; " log_add (log_User, " -b, --meleezoom=MODE (step, aka pc, or smooth, aka 3do; "