mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-10 14:51:51 +00:00
- change vid_scalemode 6 to work similarly to 0 and 1 when vid_cropaspect is turned on
- add vid_scaletolowest
This commit is contained in:
parent
c574899dba
commit
f284567830
1 changed files with 50 additions and 18 deletions
|
@ -56,16 +56,16 @@ namespace
|
||||||
{
|
{
|
||||||
bool isValid;
|
bool isValid;
|
||||||
bool isLinear;
|
bool isLinear;
|
||||||
uint32_t(*GetScaledWidth)(uint32_t Width);
|
uint32_t(*GetScaledWidth)(uint32_t Width, uint32_t Height);
|
||||||
uint32_t(*GetScaledHeight)(uint32_t Height);
|
uint32_t(*GetScaledHeight)(uint32_t Width, uint32_t Height);
|
||||||
bool isScaled43;
|
bool isScaled43;
|
||||||
bool isCustom;
|
bool isCustom;
|
||||||
};
|
};
|
||||||
|
|
||||||
float v_MinimumToFill()
|
float v_MinimumToFill(uint32_t inwidth, uint32_t inheight)
|
||||||
{
|
{
|
||||||
// sx = screen x dimension, sy = same for y
|
// sx = screen x dimension, sy = same for y
|
||||||
float sx = (float)screen->GetClientWidth(), sy = (float)screen->GetClientHeight();
|
float sx = (float)inwidth, sy = (float)inheight;
|
||||||
static float lastsx = 0., lastsy = 0., result = 0.;
|
static float lastsx = 0., lastsy = 0., result = 0.;
|
||||||
if (lastsx != sx || lastsy != sy)
|
if (lastsx != sx || lastsy != sy)
|
||||||
{
|
{
|
||||||
|
@ -79,25 +79,25 @@ namespace
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
inline uint32_t v_mfillX()
|
inline uint32_t v_mfillX(uint32_t inwidth, uint32_t inheight)
|
||||||
{
|
{
|
||||||
return screen ? (uint32_t)((float)screen->GetClientWidth() * v_MinimumToFill()) : 640;
|
return (uint32_t)((float)inwidth * v_MinimumToFill(inwidth, inheight));
|
||||||
}
|
}
|
||||||
inline uint32_t v_mfillY()
|
inline uint32_t v_mfillY(uint32_t inwidth, uint32_t inheight)
|
||||||
{
|
{
|
||||||
return screen ? (uint32_t)((float)screen->GetClientHeight() * v_MinimumToFill()) : 400;
|
return (uint32_t)((float)inheight * v_MinimumToFill(inwidth, inheight));
|
||||||
}
|
}
|
||||||
|
|
||||||
v_ScaleTable vScaleTable[NUMSCALEMODES] =
|
v_ScaleTable vScaleTable[NUMSCALEMODES] =
|
||||||
{
|
{
|
||||||
// isValid, isLinear, GetScaledWidth(), GetScaledHeight(), isScaled43, isCustom
|
// isValid, isLinear, GetScaledWidth(), GetScaledHeight(), isScaled43, isCustom
|
||||||
{ true, false, [](uint32_t Width)->uint32_t { return Width; }, [](uint32_t Height)->uint32_t { return Height; }, false, false }, // 0 - Native
|
{ true, false, [](uint32_t Width, uint32_t Height)->uint32_t { return Width; }, [](uint32_t Width, uint32_t Height)->uint32_t { return Height; }, false, false }, // 0 - Native
|
||||||
{ true, true, [](uint32_t Width)->uint32_t { return Width; }, [](uint32_t Height)->uint32_t { return Height; }, false, false }, // 1 - Native (Linear)
|
{ true, true, [](uint32_t Width, uint32_t Height)->uint32_t { return Width; }, [](uint32_t Width, uint32_t Height)->uint32_t { return Height; }, false, false }, // 1 - Native (Linear)
|
||||||
{ true, false, [](uint32_t Width)->uint32_t { return 640; }, [](uint32_t Height)->uint32_t { return 400; }, true, false }, // 2 - 640x400 (formerly 320x200)
|
{ true, false, [](uint32_t Width, uint32_t Height)->uint32_t { return 640; }, [](uint32_t Width, uint32_t Height)->uint32_t { return 400; }, true, false }, // 2 - 640x400 (formerly 320x200)
|
||||||
{ true, true, [](uint32_t Width)->uint32_t { return 960; }, [](uint32_t Height)->uint32_t { return 600; }, true, false }, // 3 - 960x600 (formerly 640x400)
|
{ true, true, [](uint32_t Width, uint32_t Height)->uint32_t { return 960; }, [](uint32_t Width, uint32_t Height)->uint32_t { return 600; }, true, false }, // 3 - 960x600 (formerly 640x400)
|
||||||
{ true, true, [](uint32_t Width)->uint32_t { return 1280; }, [](uint32_t Height)->uint32_t { return 800; }, true, false }, // 4 - 1280x800
|
{ true, true, [](uint32_t Width, uint32_t Height)->uint32_t { return 1280; }, [](uint32_t Width, uint32_t Height)->uint32_t { return 800; }, true, false }, // 4 - 1280x800
|
||||||
{ true, true, [](uint32_t Width)->uint32_t { return vid_scale_customwidth; }, [](uint32_t Height)->uint32_t { return vid_scale_customheight; }, true, true }, // 5 - Custom
|
{ true, true, [](uint32_t Width, uint32_t Height)->uint32_t { return vid_scale_customwidth; }, [](uint32_t Width, uint32_t Height)->uint32_t { return vid_scale_customheight; }, true, true }, // 5 - Custom
|
||||||
{ true, true, [](uint32_t Width)->uint32_t { return v_mfillX(); }, [](uint32_t Height)->uint32_t { return v_mfillY(); }, false, false }, // 6 - Minimum Scale to Fill Entire Screen
|
{ true, true, [](uint32_t Width, uint32_t Height)->uint32_t { return v_mfillX(Width, Height); }, [](uint32_t Width, uint32_t Height)->uint32_t { return v_mfillY(Width, Height); }, false, false }, // 6 - Minimum Scale to Fill Entire Screen
|
||||||
};
|
};
|
||||||
bool isOutOfBounds(int x)
|
bool isOutOfBounds(int x)
|
||||||
{
|
{
|
||||||
|
@ -143,8 +143,11 @@ int ViewportScaledWidth(int width, int height)
|
||||||
if (isOutOfBounds(vid_scalemode))
|
if (isOutOfBounds(vid_scalemode))
|
||||||
vid_scalemode = 0;
|
vid_scalemode = 0;
|
||||||
if (vid_cropaspect && height > 0)
|
if (vid_cropaspect && height > 0)
|
||||||
|
{
|
||||||
width = ((float)width/height > ActiveRatio(width, height)) ? (int)(height * ActiveRatio(width, height)) : width;
|
width = ((float)width/height > ActiveRatio(width, height)) ? (int)(height * ActiveRatio(width, height)) : width;
|
||||||
return (int)MAX((int32_t)VID_MIN_WIDTH, (int32_t)(vid_scalefactor * vScaleTable[vid_scalemode].GetScaledWidth(width)));
|
height = ((float)width/height < ActiveRatio(width, height)) ? (int)(width / ActiveRatio(width, height)) : height;
|
||||||
|
}
|
||||||
|
return (int)MAX((int32_t)VID_MIN_WIDTH, (int32_t)(vid_scalefactor * vScaleTable[vid_scalemode].GetScaledWidth(width, height)));
|
||||||
}
|
}
|
||||||
|
|
||||||
int ViewportScaledHeight(int width, int height)
|
int ViewportScaledHeight(int width, int height)
|
||||||
|
@ -152,8 +155,11 @@ int ViewportScaledHeight(int width, int height)
|
||||||
if (isOutOfBounds(vid_scalemode))
|
if (isOutOfBounds(vid_scalemode))
|
||||||
vid_scalemode = 0;
|
vid_scalemode = 0;
|
||||||
if (vid_cropaspect && height > 0)
|
if (vid_cropaspect && height > 0)
|
||||||
|
{
|
||||||
height = ((float)width/height < ActiveRatio(width, height)) ? (int)(width / ActiveRatio(width, height)) : height;
|
height = ((float)width/height < ActiveRatio(width, height)) ? (int)(width / ActiveRatio(width, height)) : height;
|
||||||
return (int)MAX((int32_t)VID_MIN_HEIGHT, (int32_t)(vid_scalefactor * vScaleTable[vid_scalemode].GetScaledHeight(height)));
|
width = ((float)width/height > ActiveRatio(width, height)) ? (int)(height * ActiveRatio(width, height)) : width;
|
||||||
|
}
|
||||||
|
return (int)MAX((int32_t)VID_MIN_HEIGHT, (int32_t)(vid_scalefactor * vScaleTable[vid_scalemode].GetScaledHeight(width, height)));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ViewportIsScaled43()
|
bool ViewportIsScaled43()
|
||||||
|
@ -226,3 +232,29 @@ CCMD (vid_setscale)
|
||||||
Printf("Usage: vid_setscale <x> <y> [bool linear] [bool long-pixel-shape]\nThis command will create a custom viewport scaling mode.\n");
|
Printf("Usage: vid_setscale <x> <y> [bool linear] [bool long-pixel-shape]\nThis command will create a custom viewport scaling mode.\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CCMD (vid_scaletolowest)
|
||||||
|
{
|
||||||
|
uint32_t method = 0;
|
||||||
|
if (argv.argc() > 1)
|
||||||
|
method = atoi(argv[1]);
|
||||||
|
switch (method)
|
||||||
|
{
|
||||||
|
case 1: // Method 1: set a custom video scaling
|
||||||
|
vid_scalemode = 5;
|
||||||
|
vid_scalefactor = 1.0;
|
||||||
|
vid_scale_customlinear = 1;
|
||||||
|
vid_scale_customstretched = 0;
|
||||||
|
vid_scale_customwidth = v_mfillX(screen->GetClientWidth(), screen->GetClientHeight());
|
||||||
|
vid_scale_customheight = v_mfillY(screen->GetClientWidth(), screen->GetClientHeight());
|
||||||
|
break;
|
||||||
|
case 2: // Method 2: use the actual downscaling mode directly
|
||||||
|
vid_scalemode = 6;
|
||||||
|
vid_scalefactor = 1.0;
|
||||||
|
break;
|
||||||
|
default: // Default method: use vid_scalefactor to achieve the result on a default scaling mode
|
||||||
|
vid_scalemode = 1;
|
||||||
|
vid_scalefactor = v_MinimumToFill(screen->GetClientWidth(), screen->GetClientHeight());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue