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:
- 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
/tmp and /var/tmp at all on MS Windows (Cygwin excepted) - SvdB
- 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
resolutions are available when not using OpenGL.
-k (or --keepaspectratio)
Keep 4:3 aspect ratio when using custom resolutions.
-c (or --scale=mode)
Graphics scaling mode (bilinear, biadapt, biadv, triscan, hq or none).
+1
View File
@@ -48,6 +48,7 @@ int optMeleeScale;
BOOLEAN optSubtitles;
BOOLEAN optStereoSFX;
BOOLEAN optKeepAspectRatio;
uio_DirHandle *contentDir;
uio_DirHandle *configDir;
uio_DirHandle *saveDir;
+1
View File
@@ -41,6 +41,7 @@ extern int optMeleeScale;
extern BOOLEAN optSubtitles;
extern BOOLEAN optStereoSFX;
extern BOOLEAN optKeepAspectRatio;
extern uio_DirHandle *contentDir;
extern uio_DirHandle *configDir;
+65 -12
View File
@@ -21,6 +21,7 @@
#include "libs/graphics/sdl/opengl.h"
#include "bbox.h"
#include "scalers.h"
#include "options.h"
#include "libs/log.h"
typedef struct _gl_screeninfo {
@@ -337,28 +338,77 @@ TFB_GL_ScanLines (void)
static void
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)
{
float scale_x = (ScreenWidthActual / (float)ScreenWidth);
float scale_y = (ScreenHeightActual / (float)ScreenHeight);
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;
glScissor (
(GLint) (r->x * scale_x),
(GLint) ((ScreenHeight - (r->y + r->h)) * scale_y),
(GLsizei) (r->w * scale_x),
(GLsizei) (r->h * scale_y)
);
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 (!keep_aspect_ratio)
{
sx_multiplier = ScreenWidthActual / (float)ScreenWidth;
sy_multiplier = ScreenHeightActual / (float)ScreenHeight;
sx = (int)(r->x * sx_multiplier);
sy = (int)((ScreenHeight - (r->y + r->h)) * sy_multiplier);
}
sw = (int)(r->w * sx_multiplier);
sh = (int)(r->h * sy_multiplier);
glScissor (sx, sy, sw, sh);
glEnable (GL_SCISSOR_TEST);
}
glBegin (GL_TRIANGLE_FAN);
glTexCoord2f (0, 0);
glVertex2i (0, 0);
glVertex2i (x1, y1);
glTexCoord2f (ScreenWidth / 512.0f, 0);
glVertex2i (ScreenWidthActual, 0);
glVertex2i (x2, y1);
glTexCoord2f (ScreenWidth / 512.0f, ScreenHeight / 256.0f);
glVertex2i (ScreenWidthActual, ScreenHeightActual);
glVertex2i (x2, y2);
glTexCoord2f (0, ScreenHeight / 256.0f);
glVertex2i (0, ScreenHeightActual);
glVertex2i (x1, y2);
glEnd ();
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);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
if (optKeepAspectRatio)
glClear (GL_COLOR_BUFFER_BIT);
(void) transition_amount;
(void) fade_amount;
+13 -1
View File
@@ -67,6 +67,7 @@ struct options_struct {
int soundFlags;
int width;
int height;
BOOLEAN keepAspectRatio;
const char *configDir;
const char *contentDir;
const char **addons;
@@ -115,6 +116,7 @@ main (int argc, char *argv[])
/* .soundFlags = */ audio_QUALITY_MEDIUM,
/* .width = */ 640,
/* .height = */ 480,
/* .keepAspectRatio = */ FALSE,
/* .configDir = */ NULL,
/* .contentDir = */ NULL,
/* .addons = */ NULL,
@@ -207,6 +209,10 @@ main (int argc, char *argv[])
{
options.height = res_GetInteger ("config.resheight");
}
if (res_HasKey("config.keepaspectratio"))
{
options.keepAspectRatio = res_GetBoolean ("config.keepaspectratio");
}
if (res_HasKey ("config.alwaysgl"))
{
if (res_GetBoolean ("config.alwaysgl"))
@@ -408,6 +414,7 @@ main (int argc, char *argv[])
optWhichShield = options.whichShield;
optSmoothScroll = options.smoothScroll;
optMeleeScale = options.meleeScale;
optKeepAspectRatio = options.keepAspectRatio;
optSubtitles = options.subTitles;
optStereoSFX = options.stereoSFX;
musicVolumeScale = options.musicVolumeScale;
@@ -488,7 +495,7 @@ enum
#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[] =
{
{"res", 1, NULL, 'r'},
@@ -513,6 +520,7 @@ static struct option longOptions[] =
{"version", 0, NULL, 'v'},
{"windowed", 0, NULL, 'w'},
{"nogl", 0, NULL, 'x'},
{"keepaspectratio", 0, NULL, 'k'},
// options with no short equivalent:
{"cscan", 1, NULL, CSCAN_OPT},
@@ -625,6 +633,9 @@ parseOptions (int argc, char *argv[], struct options_struct *options)
case 'x':
options->gfxDriver = TFB_GFXDRIVER_SDL_PURE;
break;
case 'k':
options->keepAspectRatio = TRUE;
break;
case 'c':
// make sure whatever was set by saved config is cleared
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, " -o, --opengl (default off)");
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, "
"hq or none (default) )");
log_add (log_User, " -b, --meleezoom=MODE (step, aka pc, or smooth, aka 3do; "