# Conflicts:
#	src/v_video.cpp
This commit is contained in:
raa-eruanna 2016-09-14 02:24:59 -04:00
commit 81545d9b4e
22 changed files with 377 additions and 206 deletions

View file

@ -14,6 +14,11 @@ list( APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR} )
include( CreateLaunchers ) include( CreateLaunchers )
include( FindPackageHandleStandardArgs ) include( FindPackageHandleStandardArgs )
# Produce a warning if XP support will be missing.
if( MSVC14 AND NOT CMAKE_GENERATOR_TOOLSET STREQUAL "v140_xp" )
message( WARNING "This project supports Windows XP (including XP x64), but you must set the optional toolset to v140_xp manually to have it in your build! Use -T \"v140_xp\" from the command prompt." )
endif()
# Support cross compiling # Support cross compiling
option( FORCE_CROSSCOMPILE "Turn on cross compiling." NO ) option( FORCE_CROSSCOMPILE "Turn on cross compiling." NO )
if( FORCE_CROSSCOMPILE ) if( FORCE_CROSSCOMPILE )

View file

@ -115,59 +115,49 @@ if( WIN32 )
set( FMOD_LIB_PATH_SUFFIXES PATH_SUFFIXES lib ) set( FMOD_LIB_PATH_SUFFIXES PATH_SUFFIXES lib )
set( NASM_NAMES nasmw nasm ) set( NASM_NAMES nasmw nasm )
if( NOT MSVC ) find_path( D3D_INCLUDE_DIR d3d9.h
find_path( D3D_INCLUDE_DIR d3d9.h PATHS ENV DXSDK_DIR
PATHS ENV DXSDK_DIR PATH_SUFFIXES Include )
PATH_SUFFIXES Include ) if( NOT D3D_INCLUDE_DIR )
if( NOT D3D_INCLUDE_DIR ) message( SEND_ERROR "Could not find DirectX 9 header files" )
message( SEND_ERROR "Could not find DirectX 9 header files" )
else()
include_directories( ${D3D_INCLUDE_DIR} )
endif()
find_path( XINPUT_INCLUDE_DIR xinput.h
PATHS ENV DXSDK_DIR
PATH_SUFFIXES Include )
if( NOT XINPUT_INCLUDE_DIR )
message( WARNING "Could not find xinput.h. XInput will be disabled." )
add_definitions( -DNO_XINPUT )
else()
include_directories( ${XINPUT_INCLUDE_DIR} )
endif()
find_library( DX_dxguid_LIBRARY dxguid
PATHS ENV DXSDK_DIR
PATH_SUFFIXES Lib Lib/${XBITS} )
find_library( DX_dinput8_LIBRARY dinput8
PATHS ENV DXSDK_DIR
PATH_SUFFIXES Lib Lib/${XBITS} )
set( DX_LIBS_FOUND YES )
if( NOT DX_dxguid_LIBRARY )
set( DX_LIBS_FOUND NO )
endif()
if( NOT DX_dinput8_LIBRARY )
set( DX_LIBS_FOUND NO )
endif()
if( NOT DX_LIBS_FOUND )
message( FATAL_ERROR "Could not find DirectX 9 libraries" )
endif()
set( DX_LIBS
"${DX_dxguid_LIBRARY}"
"${DX_dinput8_LIBRARY}"
)
else() else()
set( DX_LIBS include_directories( ${D3D_INCLUDE_DIR} )
dxguid
dinput8
)
endif() endif()
set( ZDOOM_LIBS ${DX_LIBS} find_path( XINPUT_INCLUDE_DIR xinput.h
PATHS ENV DXSDK_DIR
PATH_SUFFIXES Include )
if( NOT XINPUT_INCLUDE_DIR )
message( WARNING "Could not find xinput.h. XInput will be disabled." )
add_definitions( -DNO_XINPUT )
else()
include_directories( ${XINPUT_INCLUDE_DIR} )
endif()
find_library( DX_dxguid_LIBRARY dxguid
PATHS ENV DXSDK_DIR
PATH_SUFFIXES Lib Lib/${XBITS} )
find_library( DX_dinput8_LIBRARY dinput8
PATHS ENV DXSDK_DIR
PATH_SUFFIXES Lib Lib/${XBITS} )
set( DX_LIBS_FOUND YES )
if( NOT DX_dxguid_LIBRARY )
set( DX_LIBS_FOUND NO )
endif()
if( NOT DX_dinput8_LIBRARY )
set( DX_LIBS_FOUND NO )
endif()
if( NOT DX_LIBS_FOUND )
message( FATAL_ERROR "Could not find DirectX 9 libraries" )
endif()
set( ZDOOM_LIBS
wsock32 wsock32
winmm winmm
"${DX_dxguid_LIBRARY}"
"${DX_dinput8_LIBRARY}"
ole32 ole32
user32 user32
gdi32 gdi32
@ -281,6 +271,10 @@ if( NOT NO_FMOD )
if( FMOD_INCLUDE_DIR ) if( FMOD_INCLUDE_DIR )
message( STATUS "FMOD include files found at ${FMOD_INCLUDE_DIR}" ) message( STATUS "FMOD include files found at ${FMOD_INCLUDE_DIR}" )
include_directories( "${FMOD_INCLUDE_DIR}" ) include_directories( "${FMOD_INCLUDE_DIR}" )
if( EXISTS "${FMOD_INCLUDE_DIR}/fmod_common.h" )
set( FMOD_STUDIO YES )
endif()
else() else()
message( STATUS "Could not find FMOD include files" ) message( STATUS "Could not find FMOD include files" )
set( NO_FMOD ON ) set( NO_FMOD ON )
@ -1482,7 +1476,16 @@ endif()
if( MSVC ) if( MSVC )
option( ZDOOM_GENERATE_MAPFILE "Generate .map file for debugging." OFF ) option( ZDOOM_GENERATE_MAPFILE "Generate .map file for debugging." OFF )
set( LINKERSTUFF "/MANIFEST:NO /DELAYLOAD:\"fmodex${X64}.dll\"" ) set( LINKERSTUFF "/MANIFEST:NO" )
if( NOT NO_FMOD )
if( FMOD_STUDIO )
set( LINKERSTUFF "${LINKERSTUFF} /DELAYLOAD:\"fmod${X64}.dll\"" )
else()
set( LINKERSTUFF "${LINKERSTUFF} /DELAYLOAD:\"fmodex${X64}.dll\"" )
endif()
endif()
if( ZDOOM_GENERATE_MAPFILE ) if( ZDOOM_GENERATE_MAPFILE )
set( LINKERSTUFF "${LINKERSTUFF} /MAP" ) set( LINKERSTUFF "${LINKERSTUFF} /MAP" )
endif() endif()
@ -1522,17 +1525,23 @@ if( APPLE )
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/posix/osx/zdoom-info.plist" ) MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/posix/osx/zdoom-info.plist" )
if( NOT NO_FMOD ) if( NOT NO_FMOD )
if( FMOD_STUDIO )
set( FMOD_DYLIB libfmod.dylib )
else()
set( FMOD_DYLIB libfmodex.dylib )
endif()
# Fix fmod link so that it can be found in the app bundle. # Fix fmod link so that it can be found in the app bundle.
find_program( OTOOL otool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin" ) find_program( OTOOL otool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin" )
find_program( INSTALL_NAME_TOOL install_name_tool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin" ) find_program( INSTALL_NAME_TOOL install_name_tool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin" )
execute_process( COMMAND "${OTOOL}" -L "${FMOD_LIBRARY}" execute_process( COMMAND "${OTOOL}" -L "${FMOD_LIBRARY}"
COMMAND grep "libfmodex.dylib (compat" COMMAND grep "${FMOD_DYLIB} (compat"
COMMAND head -n1 COMMAND head -n1
COMMAND awk "{print $1}" COMMAND awk "{print $1}"
OUTPUT_VARIABLE FMOD_LINK OUTPUT_VARIABLE FMOD_LINK
OUTPUT_STRIP_TRAILING_WHITESPACE ) OUTPUT_STRIP_TRAILING_WHITESPACE )
add_custom_command( TARGET zdoom POST_BUILD add_custom_command( TARGET zdoom POST_BUILD
COMMAND "${INSTALL_NAME_TOOL}" -change "${FMOD_LINK}" @executable_path/../Frameworks/libfmodex.dylib "$<TARGET_FILE:zdoom>" COMMAND "${INSTALL_NAME_TOOL}" -change "${FMOD_LINK}" @executable_path/../Frameworks/${FMOD_DYLIB} "$<TARGET_FILE:zdoom>"
COMMENT "Relinking FMOD Ex" ) COMMENT "Relinking FMOD Ex" )
endif() endif()
endif() endif()

View file

@ -811,8 +811,8 @@ static void C_DrawNotifyText ()
DTA_KeepRatio, true, DTA_KeepRatio, true,
DTA_AlphaF, alpha, TAG_DONE); DTA_AlphaF, alpha, TAG_DONE);
else else
screen->DrawText (SmallFont, color, (screen->GetWidth() / active_con_scaletext() - screen->DrawText (SmallFont, color, (screen->GetWidth() -
SmallFont->StringWidth (NotifyStrings[i].Text))/ active_con_scaletext(), SmallFont->StringWidth (NotifyStrings[i].Text) * active_con_scaletext()) / 2 / active_con_scaletext(),
line, NotifyStrings[i].Text, line, NotifyStrings[i].Text,
DTA_VirtualWidth, screen->GetWidth() / active_con_scaletext(), DTA_VirtualWidth, screen->GetWidth() / active_con_scaletext(),
DTA_VirtualHeight, screen->GetHeight() / active_con_scaletext(), DTA_VirtualHeight, screen->GetHeight() / active_con_scaletext(),
@ -1747,6 +1747,14 @@ void C_AddTabCommand (const char *name)
void C_RemoveTabCommand (const char *name) void C_RemoveTabCommand (const char *name)
{ {
if (TabCommands.Size() == 0)
{
// There are no tab commands that can be removed.
// This is important to skip construction of aname
// in case the NameManager has already been destroyed.
return;
}
FName aname(name, true); FName aname(name, true);
if (aname == NAME_None) if (aname == NAME_None)

View file

@ -1914,7 +1914,7 @@ class CommandAspectRatio : public SBarInfoCommandFlowControl
{ {
SBarInfoCommandFlowControl::Tick(block, statusBar, hudChanged); SBarInfoCommandFlowControl::Tick(block, statusBar, hudChanged);
SetTruth(ratioMap[CheckRatio(screen->GetWidth(), screen->GetHeight())] == ratio, block, statusBar); SetTruth(ratioMap[FindRatio()] == ratio, block, statusBar);
} }
protected: protected:
enum Ratio enum Ratio
@ -1931,6 +1931,37 @@ class CommandAspectRatio : public SBarInfoCommandFlowControl
static Ratio ratioMap[5]; static Ratio ratioMap[5];
Ratio ratio; Ratio ratio;
private:
int FindRatio()
{
float aspect = ActiveRatio(screen->GetWidth(), screen->GetHeight());
static std::pair<float, int> ratioTypes[] =
{
{ 21 / 9.0f , ASPECTRATIO_16_9 },
{ 16 / 9.0f , ASPECTRATIO_16_9 },
{ 17 / 10.0f , ASPECTRATIO_17_10 },
{ 16 / 10.0f , ASPECTRATIO_16_10 },
{ 4 / 3.0f , ASPECTRATIO_4_3 },
{ 5 / 4.0f , ASPECTRATIO_5_4 },
{ 0.0f, 0 }
};
int ratio = ratioTypes[0].second;
float distance = fabs(ratioTypes[0].first - aspect);
for (int i = 1; ratioTypes[i].first != 0.0f; i++)
{
float d = fabs(ratioTypes[i].first - aspect);
if (d < distance)
{
ratio = ratioTypes[i].second;
distance = d;
}
}
return ratio;
}
}; };
CommandAspectRatio::Ratio CommandAspectRatio::ratioMap[5] = {ASPECTRATIO_4_3,ASPECTRATIO_16_9,ASPECTRATIO_16_10,ASPECTRATIO_16_10,ASPECTRATIO_5_4}; CommandAspectRatio::Ratio CommandAspectRatio::ratioMap[5] = {ASPECTRATIO_4_3,ASPECTRATIO_16_9,ASPECTRATIO_16_10,ASPECTRATIO_16_10,ASPECTRATIO_5_4};

View file

@ -1108,13 +1108,13 @@ void DrawHUD()
} }
else else
{ {
if (WidescreenRatio == 4) if (CheckRatio(SCREENWIDTH, SCREENHEIGHT) == 4)
{ {
hudheight = hudwidth * 30 / BaseRatioSizes[WidescreenRatio][3]; // BaseRatioSizes is inverted for this mode hudheight = hudwidth * 30 / AspectMultiplier(WidescreenRatio); // BaseRatioSizes is inverted for this mode
} }
else else
{ {
hudheight = hudwidth * 30 / (48*48/BaseRatioSizes[WidescreenRatio][3]); hudheight = hudwidth * 30 / (48*48/AspectMultiplier(WidescreenRatio));
} }
} }
} }

View file

@ -299,14 +299,15 @@ void DBaseStatusBar::SetScaled (bool scale, bool force)
{ {
ST_X = 0; ST_X = 0;
ST_Y = VirticalResolution - RelTop; ST_Y = VirticalResolution - RelTop;
if (CheckRatio(SCREENWIDTH, SCREENHEIGHT) != 4) float aspect = ActiveRatio(SCREENWIDTH, SCREENHEIGHT);
if (!AspectTallerThanWide(aspect))
{ // Normal resolution { // Normal resolution
::ST_Y = Scale (ST_Y, SCREENHEIGHT, VirticalResolution); ::ST_Y = Scale (ST_Y, SCREENHEIGHT, VirticalResolution);
} }
else else
{ // 5:4 resolution { // 5:4 resolution
::ST_Y = Scale(ST_Y - VirticalResolution/2, SCREENHEIGHT*3, Scale(VirticalResolution, BaseRatioSizes[4][1], 200)) + SCREENHEIGHT/2 ::ST_Y = Scale(ST_Y - VirticalResolution/2, SCREENHEIGHT*3, Scale(VirticalResolution, AspectBaseHeight(aspect), 200)) + SCREENHEIGHT/2
+ (SCREENHEIGHT - SCREENHEIGHT * BaseRatioSizes[4][3] / 48) / 2; + (SCREENHEIGHT - SCREENHEIGHT * AspectMultiplier(aspect) / 48) / 2;
} }
Displacement = 0; Displacement = 0;
} }
@ -1035,10 +1036,10 @@ void DBaseStatusBar::DrSmallNumberOuter (int val, int x, int y, bool center) con
void DBaseStatusBar::RefreshBackground () const void DBaseStatusBar::RefreshBackground () const
{ {
int x, x2, y, ratio; int x, x2, y;
ratio = CheckRatio (SCREENWIDTH, SCREENHEIGHT); float ratio = ActiveRatio (SCREENWIDTH, SCREENHEIGHT);
x = (!IsRatioWidescreen(ratio) || !Scaled) ? ST_X : SCREENWIDTH*(48-BaseRatioSizes[ratio][3])/(48*2); x = (ratio < 1.5f || !Scaled) ? ST_X : SCREENWIDTH*(48-AspectMultiplier(ratio))/(48*2);
y = x == ST_X && x > 0 ? ST_Y : ::ST_Y; y = x == ST_X && x > 0 ? ST_Y : ::ST_Y;
if(!CompleteBorder) if(!CompleteBorder)
@ -1058,8 +1059,8 @@ void DBaseStatusBar::RefreshBackground () const
{ {
if(!CompleteBorder) if(!CompleteBorder)
{ {
x2 = !IsRatioWidescreen(ratio) || !Scaled ? ST_X+HorizontalResolution : x2 = ratio < 1.5f || !Scaled ? ST_X+HorizontalResolution :
SCREENWIDTH - (SCREENWIDTH*(48-BaseRatioSizes[ratio][3])+48*2-1)/(48*2); SCREENWIDTH - (SCREENWIDTH*(48-AspectMultiplier(ratio))+48*2-1)/(48*2);
} }
else else
{ {

View file

@ -35,6 +35,7 @@
#include <string.h> #include <string.h>
#include "name.h" #include "name.h"
#include "c_dispatch.h" #include "c_dispatch.h"
#include "c_console.h"
// MACROS ------------------------------------------------------------------ // MACROS ------------------------------------------------------------------
@ -268,6 +269,8 @@ FName::NameManager::~NameManager()
{ {
NameBlock *block, *next; NameBlock *block, *next;
C_ClearTabCommands();
for (block = Blocks; block != NULL; block = next) for (block = Blocks; block != NULL; block = next)
{ {
next = block->NextBlock; next = block->NextBlock;

View file

@ -309,6 +309,11 @@ void FUDMFKeys::Sort()
FUDMFKey *FUDMFKeys::Find(FName key) FUDMFKey *FUDMFKeys::Find(FName key)
{ {
if (!mSorted)
{
mSorted = true;
Sort();
}
int min = 0, max = Size()-1; int min = 0, max = Size()-1;
while (min <= max) while (min <= max)

View file

@ -245,6 +245,7 @@ struct FUDMFKey
class FUDMFKeys : public TArray<FUDMFKey> class FUDMFKeys : public TArray<FUDMFKey>
{ {
bool mSorted = false;
public: public:
void Sort(); void Sort();
FUDMFKey *Find(FName key); FUDMFKey *Find(FName key);

View file

@ -235,7 +235,7 @@ void R_SetVisibility(double vis)
else else
r_WallVisibility = r_BaseVisibility; r_WallVisibility = r_BaseVisibility;
r_WallVisibility = (InvZtoScale * SCREENWIDTH*BaseRatioSizes[WidescreenRatio][1] / r_WallVisibility = (InvZtoScale * SCREENWIDTH*AspectBaseHeight(WidescreenRatio) /
(viewwidth*SCREENHEIGHT*3)) * (r_WallVisibility * FocalTangent); (viewwidth*SCREENHEIGHT*3)) * (r_WallVisibility * FocalTangent);
// Prevent overflow on floors/ceilings. Note that the calculation of // Prevent overflow on floors/ceilings. Note that the calculation of
@ -298,7 +298,7 @@ CCMD (r_visibility)
// //
//========================================================================== //==========================================================================
void R_SWRSetWindow(int windowSize, int fullWidth, int fullHeight, int stHeight, int trueratio) void R_SWRSetWindow(int windowSize, int fullWidth, int fullHeight, int stHeight, float trueratio)
{ {
int virtheight, virtwidth, virtwidth2, virtheight2; int virtheight, virtwidth, virtwidth2, virtheight2;
@ -321,22 +321,22 @@ void R_SWRSetWindow(int windowSize, int fullWidth, int fullHeight, int stHeight,
virtwidth = virtwidth2 = fullWidth; virtwidth = virtwidth2 = fullWidth;
virtheight = virtheight2 = fullHeight; virtheight = virtheight2 = fullHeight;
if (Is54Aspect(trueratio)) if (AspectTallerThanWide(trueratio))
{ {
virtheight2 = virtheight2 * BaseRatioSizes[trueratio][3] / 48; virtheight2 = virtheight2 * AspectMultiplier(trueratio) / 48;
} }
else else
{ {
virtwidth2 = virtwidth2 * BaseRatioSizes[trueratio][3] / 48; virtwidth2 = virtwidth2 * AspectMultiplier(trueratio) / 48;
} }
if (Is54Aspect(WidescreenRatio)) if (AspectTallerThanWide(WidescreenRatio))
{ {
virtheight = virtheight * BaseRatioSizes[WidescreenRatio][3] / 48; virtheight = virtheight * AspectMultiplier(WidescreenRatio) / 48;
} }
else else
{ {
virtwidth = virtwidth * BaseRatioSizes[WidescreenRatio][3] / 48; virtwidth = virtwidth * AspectMultiplier(WidescreenRatio) / 48;
} }
BaseYaspectMul = 320.0 * virtheight2 / (r_Yaspect * virtwidth2); BaseYaspectMul = 320.0 * virtheight2 / (r_Yaspect * virtwidth2);
@ -688,7 +688,7 @@ void R_EnterPortal (PortalDrawseg* pds, int depth)
ViewPos.X = (x1 + r * dx)*2 - x; ViewPos.X = (x1 + r * dx)*2 - x;
ViewPos.Y = (y1 + r * dy)*2 - y; ViewPos.Y = (y1 + r * dy)*2 - y;
} }
ViewAngle = pds->src->Delta().Angle() - startang; ViewAngle = pds->src->Delta().Angle() * 2 - startang;
} }
else else
{ {
@ -968,7 +968,7 @@ void R_RenderViewToCanvas (AActor *actor, DCanvas *canvas,
RenderTarget = canvas; RenderTarget = canvas;
bRenderingToCanvas = true; bRenderingToCanvas = true;
R_SetWindow (12, width, height, height); R_SetWindow (12, width, height, height, true);
viewwindowx = x; viewwindowx = x;
viewwindowy = y; viewwindowy = y;
viewactive = true; viewactive = true;

View file

@ -55,7 +55,7 @@ struct FRenderer
virtual void ErrorCleanup () {} virtual void ErrorCleanup () {}
virtual void ClearBuffer(int color) = 0; virtual void ClearBuffer(int color) = 0;
virtual void Init() = 0; virtual void Init() = 0;
virtual void SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, int trueratio) {} virtual void SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, float trueratio) {}
virtual void SetupFrame(player_t *player) {} virtual void SetupFrame(player_t *player) {}
virtual void CopyStackedViewParameters() {} virtual void CopyStackedViewParameters() {}
virtual void RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, int fov) = 0; virtual void RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, int fov) = 0;

View file

@ -47,7 +47,7 @@
EXTERN_CVAR(Bool, r_shadercolormaps) EXTERN_CVAR(Bool, r_shadercolormaps)
class FArchive; class FArchive;
void R_SWRSetWindow(int windowSize, int fullWidth, int fullHeight, int stHeight, int trueratio); void R_SWRSetWindow(int windowSize, int fullWidth, int fullHeight, int stHeight, float trueratio);
void R_SetupColormap(player_t *); void R_SetupColormap(player_t *);
void R_SetupFreelook(); void R_SetupFreelook();
void R_InitRenderer(); void R_InitRenderer();
@ -299,7 +299,7 @@ void FSoftwareRenderer::ClearBuffer(int color)
// //
//=========================================================================== //===========================================================================
void FSoftwareRenderer::SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, int trueratio) void FSoftwareRenderer::SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, float trueratio)
{ {
R_SWRSetWindow(windowSize, fullWidth, fullHeight, stHeight, trueratio); R_SWRSetWindow(windowSize, fullWidth, fullHeight, stHeight, trueratio);
} }

View file

@ -30,7 +30,7 @@ struct FSoftwareRenderer : public FRenderer
void ErrorCleanup (); void ErrorCleanup ();
void ClearBuffer(int color); void ClearBuffer(int color);
void Init(); void Init();
void SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, int trueratio); void SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, float trueratio);
void SetupFrame(player_t *player); void SetupFrame(player_t *player);
void CopyStackedViewParameters(); void CopyStackedViewParameters();
void RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, int fov); void RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, int fov);

View file

@ -1395,7 +1395,7 @@ void R_DrawPSprite(DPSprite *pspr, AActor *owner, float bobx, float boby, double
} }
if (pspr->GetID() < PSP_TARGETCENTER) if (pspr->GetID() < PSP_TARGETCENTER)
{ // Move the weapon down for 1280x1024. { // Move the weapon down for 1280x1024.
vis->texturemid -= BaseRatioSizes[WidescreenRatio][2]; vis->texturemid -= AspectPspriteOffset(WidescreenRatio);
} }
vis->x1 = x1 < 0 ? 0 : x1; vis->x1 = x1 < 0 ? 0 : x1;
vis->x2 = x2 >= viewwidth ? viewwidth : x2; vis->x2 = x2 >= viewwidth ? viewwidth : x2;

View file

@ -138,7 +138,7 @@ angle_t LocalViewAngle;
int LocalViewPitch; int LocalViewPitch;
bool LocalKeyboardTurner; bool LocalKeyboardTurner;
int WidescreenRatio; float WidescreenRatio;
int setblocks; int setblocks;
int extralight; int extralight;
bool setsizeneeded; bool setsizeneeded;
@ -198,9 +198,9 @@ void R_SetViewSize (int blocks)
// //
//========================================================================== //==========================================================================
void R_SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight) void R_SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, bool renderingToCanvas)
{ {
int trueratio; float trueratio;
if (windowSize >= 11) if (windowSize >= 11)
{ {
@ -220,8 +220,15 @@ void R_SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight)
freelookviewheight = ((setblocks*fullHeight)/10)&~7; freelookviewheight = ((setblocks*fullHeight)/10)&~7;
} }
// If the screen is approximately 16:9 or 16:10, consider it widescreen. if (renderingToCanvas)
WidescreenRatio = CheckRatio (fullWidth, fullHeight, &trueratio); {
WidescreenRatio = fullWidth / (float)fullHeight;
trueratio = WidescreenRatio;
}
else
{
WidescreenRatio = ActiveRatio(fullWidth, fullHeight, &trueratio);
}
DrawFSHUD = (windowSize == 11); DrawFSHUD = (windowSize == 11);
@ -230,13 +237,13 @@ void R_SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight)
centery = viewheight/2; centery = viewheight/2;
centerx = viewwidth/2; centerx = viewwidth/2;
if (Is54Aspect(WidescreenRatio)) if (AspectTallerThanWide(WidescreenRatio))
{ {
centerxwide = centerx; centerxwide = centerx;
} }
else else
{ {
centerxwide = centerx * BaseRatioSizes[WidescreenRatio][3] / 48; centerxwide = centerx * AspectMultiplier(WidescreenRatio) / 48;
} }

View file

@ -33,7 +33,7 @@ extern int validcount;
extern angle_t LocalViewAngle; // [RH] Added to consoleplayer's angle extern angle_t LocalViewAngle; // [RH] Added to consoleplayer's angle
extern int LocalViewPitch; // [RH] Used directly instead of consoleplayer's pitch extern int LocalViewPitch; // [RH] Used directly instead of consoleplayer's pitch
extern bool LocalKeyboardTurner; // [RH] The local player used the keyboard to turn, so interpolate extern bool LocalKeyboardTurner; // [RH] The local player used the keyboard to turn, so interpolate
extern int WidescreenRatio; extern float WidescreenRatio;
extern double r_TicFracF; extern double r_TicFracF;
extern DWORD r_FrameTime; extern DWORD r_FrameTime;
@ -95,7 +95,7 @@ void R_ExecuteSetViewSize (void);
// Called by M_Responder. // Called by M_Responder.
void R_SetViewSize (int blocks); void R_SetViewSize (int blocks);
void R_SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight); void R_SetWindow (int windowSize, int fullWidth, int fullHeight, int stHeight, bool renderingToCanvas = false);
extern void R_FreePastViewers (); extern void R_FreePastViewers ();

View file

@ -971,6 +971,7 @@ bool FMODSoundRenderer::Init()
#if FMOD_STUDIO #if FMOD_STUDIO
FMOD_ADVANCEDSETTINGS advSettings = {}; FMOD_ADVANCEDSETTINGS advSettings = {};
advSettings.cbSize = sizeof advSettings;
advSettings.resamplerMethod = resampler; advSettings.resamplerMethod = resampler;
result = Sys->setAdvancedSettings(&advSettings); result = Sys->setAdvancedSettings(&advSettings);
if (result != FMOD_OK) if (result != FMOD_OK)
@ -1370,11 +1371,8 @@ void FMODSoundRenderer::PrintStatus()
{ {
FMOD_OUTPUTTYPE output; FMOD_OUTPUTTYPE output;
FMOD_SPEAKERMODE speakermode; FMOD_SPEAKERMODE speakermode;
FMOD_SOUND_FORMAT format;
FMOD_DSP_RESAMPLER resampler;
int driver; int driver;
int samplerate; int samplerate;
int numoutputchannels;
unsigned int bufferlength; unsigned int bufferlength;
int numbuffers; int numbuffers;
@ -1413,6 +1411,9 @@ void FMODSoundRenderer::PrintStatus()
#endif #endif
} }
#if !FMOD_STUDIO #if !FMOD_STUDIO
FMOD_SOUND_FORMAT format;
FMOD_DSP_RESAMPLER resampler;
int numoutputchannels;
if (FMOD_OK == Sys->getSoftwareFormat(&samplerate, &format, &numoutputchannels, NULL, &resampler, NULL)) if (FMOD_OK == Sys->getSoftwareFormat(&samplerate, &format, &numoutputchannels, NULL, &resampler, NULL))
{ {
Printf (TEXTCOLOR_LIGHTBLUE "Software mixer sample rate: " TEXTCOLOR_GREEN "%d\n", samplerate); Printf (TEXTCOLOR_LIGHTBLUE "Software mixer sample rate: " TEXTCOLOR_GREEN "%d\n", samplerate);
@ -2758,6 +2759,16 @@ std::pair<SoundHandle,bool> FMODSoundRenderer::LoadSoundRaw(BYTE *sfxdata, int l
exinfo.defaultfrequency = frequency; exinfo.defaultfrequency = frequency;
switch (bits) switch (bits)
{ {
#if FMOD_STUDIO
case -8:
// Need to convert sample data from signed to unsigned.
for (int i = 0; i < length; i++)
{
sfxdata[i] ^= 0x80;
}
case 8:
#else // !FMOD_STUDIO
case 8: case 8:
// Need to convert sample data from unsigned to signed. // Need to convert sample data from unsigned to signed.
for (int i = 0; i < length; ++i) for (int i = 0; i < length; ++i)
@ -2766,6 +2777,7 @@ std::pair<SoundHandle,bool> FMODSoundRenderer::LoadSoundRaw(BYTE *sfxdata, int l
} }
case -8: case -8:
#endif // FMOD_STUDIO
exinfo.format = FMOD_SOUND_FORMAT_PCM8; exinfo.format = FMOD_SOUND_FORMAT_PCM8;
numsamples = length; numsamples = length;
break; break;

View file

@ -870,37 +870,37 @@ bool DCanvas::ParseDrawTextureTags (FTexture *img, double x, double y, DWORD tag
void DCanvas::VirtualToRealCoords(double &x, double &y, double &w, double &h, void DCanvas::VirtualToRealCoords(double &x, double &y, double &w, double &h,
double vwidth, double vheight, bool vbottom, bool handleaspect) const double vwidth, double vheight, bool vbottom, bool handleaspect) const
{ {
int myratio = handleaspect ? CheckRatio (Width, Height) : 0; float myratio = handleaspect ? ActiveRatio (Width, Height) : (4.0f / 3.0f);
// if 21:9 AR, map to 16:9 for all callers. // if 21:9 AR, map to 16:9 for all callers.
// this allows for black bars and stops the stretching of fullscreen images // this allows for black bars and stops the stretching of fullscreen images
if (myratio == 6) { if (myratio > 1.7f) {
myratio = 2; myratio = 16.0f / 9.0f;
} }
double right = x + w; double right = x + w;
double bottom = y + h; double bottom = y + h;
if (myratio != 0 && myratio != 4) if (myratio > 1.334f)
{ // The target surface is either 16:9 or 16:10, so expand the { // The target surface is either 16:9 or 16:10, so expand the
// specified virtual size to avoid undesired stretching of the // specified virtual size to avoid undesired stretching of the
// image. Does not handle non-4:3 virtual sizes. I'll worry about // image. Does not handle non-4:3 virtual sizes. I'll worry about
// those if somebody expresses a desire to use them. // those if somebody expresses a desire to use them.
x = (x - vwidth * 0.5) * Width * 960 / (vwidth * BaseRatioSizes[myratio][0]) + Width * 0.5; x = (x - vwidth * 0.5) * Width * 960 / (vwidth * AspectBaseWidth(myratio)) + Width * 0.5;
w = (right - vwidth * 0.5) * Width * 960 / (vwidth * BaseRatioSizes[myratio][0]) + Width * 0.5 - x; w = (right - vwidth * 0.5) * Width * 960 / (vwidth * AspectBaseWidth(myratio)) + Width * 0.5 - x;
} }
else else
{ {
x = x * Width / vwidth; x = x * Width / vwidth;
w = right * Width / vwidth - x; w = right * Width / vwidth - x;
} }
if (myratio == 4) if (AspectTallerThanWide(myratio))
{ // The target surface is 5:4 { // The target surface is 5:4
y = (y - vheight * 0.5) * Height * 600 / (vheight * BaseRatioSizes[myratio][1]) + Height * 0.5; y = (y - vheight * 0.5) * Height * 600 / (vheight * AspectBaseHeight(myratio)) + Height * 0.5;
h = (bottom - vheight * 0.5) * Height * 600 / (vheight * BaseRatioSizes[myratio][1]) + Height * 0.5 - y; h = (bottom - vheight * 0.5) * Height * 600 / (vheight * AspectBaseHeight(myratio)) + Height * 0.5 - y;
if (vbottom) if (vbottom)
{ {
y += (Height - Height * BaseRatioSizes[myratio][3] / 48.0) * 0.5; y += (Height - Height * AspectMultiplier(myratio) / 48.0) * 0.5;
} }
} }
else else
@ -944,30 +944,30 @@ void DCanvas::VirtualToRealCoordsInt(int &x, int &y, int &w, int &h,
void DCanvas::FillBorder (FTexture *img) void DCanvas::FillBorder (FTexture *img)
{ {
int myratio = CheckRatio (Width, Height); float myratio = ActiveRatio (Width, Height);
// if 21:9 AR, fill borders akin to 16:9, since all fullscreen // if 21:9 AR, fill borders akin to 16:9, since all fullscreen
// images are being drawn to that scale. // images are being drawn to that scale.
if (myratio == 6) { if (myratio > 1.7f) {
myratio = 2; myratio = 16 / 9.0f;
} }
if (myratio == 0) if (myratio >= 1.3f && myratio <= 1.4f)
{ // This is a 4:3 display, so no border to show { // This is a 4:3 display, so no border to show
return; return;
} }
int bordtop, bordbottom, bordleft, bordright, bord; int bordtop, bordbottom, bordleft, bordright, bord;
if (Is54Aspect(myratio)) if (AspectTallerThanWide(myratio))
{ // Screen is taller than it is wide { // Screen is taller than it is wide
bordleft = bordright = 0; bordleft = bordright = 0;
bord = Height - Height * BaseRatioSizes[myratio][3] / 48; bord = Height - Height * AspectMultiplier(myratio) / 48;
bordtop = bord / 2; bordtop = bord / 2;
bordbottom = bord - bordtop; bordbottom = bord - bordtop;
} }
else else
{ // Screen is wider than it is tall { // Screen is wider than it is tall
bordtop = bordbottom = 0; bordtop = bordbottom = 0;
bord = Width - Width * BaseRatioSizes[myratio][3] / 48; bord = Width - Width * AspectMultiplier(myratio) / 48;
bordleft = bord / 2; bordleft = bord / 2;
bordright = bord - bordleft; bordright = bord - bordleft;
} }

View file

@ -763,6 +763,21 @@ void DCanvas::CalcGamma (float gamma, BYTE gammalookup[256])
DSimpleCanvas::DSimpleCanvas (int width, int height, bool bgra) DSimpleCanvas::DSimpleCanvas (int width, int height, bool bgra)
: DCanvas (width, height, bgra) : DCanvas (width, height, bgra)
{ {
MemBuffer = nullptr;
Resize(width, height);
}
void DSimpleCanvas::Resize(int width, int height)
{
Width = width;
Height = height;
if (MemBuffer != NULL)
{
delete[] MemBuffer;
MemBuffer = NULL;
}
// Making the pitch a power of 2 is very bad for performance // Making the pitch a power of 2 is very bad for performance
// Try to maximize the number of cache lines that can be filled // Try to maximize the number of cache lines that can be filled
// for each column drawing operation by making the pitch slightly // for each column drawing operation by making the pitch slightly
@ -1363,7 +1378,6 @@ CCMD(clean)
bool V_DoModeSetup (int width, int height, int bits) bool V_DoModeSetup (int width, int height, int bits)
{ {
DFrameBuffer *buff = I_SetMode (width, height, screen); DFrameBuffer *buff = I_SetMode (width, height, screen);
int cx1, cx2;
if (buff == NULL) if (buff == NULL)
{ {
@ -1378,6 +1392,17 @@ bool V_DoModeSetup (int width, int height, int bits)
// if D3DFB is being used for the display. // if D3DFB is being used for the display.
FFont::StaticPreloadFonts(); FFont::StaticPreloadFonts();
DisplayBits = bits;
V_UpdateModeSize(width, height);
M_RefreshModesList ();
return true;
}
void V_UpdateModeSize (int width, int height)
{
int cx1, cx2;
V_CalcCleanFacs(320, 200, width, height, &CleanXfac, &CleanYfac, &cx1, &cx2); V_CalcCleanFacs(320, 200, width, height, &CleanXfac, &CleanYfac, &cx1, &cx2);
CleanWidth = width / CleanXfac; CleanWidth = width / CleanXfac;
@ -1418,32 +1443,37 @@ bool V_DoModeSetup (int width, int height, int bits)
DisplayWidth = width; DisplayWidth = width;
DisplayHeight = height; DisplayHeight = height;
DisplayBits = bits;
R_OldBlend = ~0; R_OldBlend = ~0;
Renderer->OnModeSet(); Renderer->OnModeSet();
}
M_RefreshModesList (); void V_OutputResized (int width, int height)
{
return true; V_UpdateModeSize(width, height);
setsizeneeded = true;
if (StatusBar != NULL)
{
StatusBar->ScreenSizeChanged();
}
} }
void V_CalcCleanFacs (int designwidth, int designheight, int realwidth, int realheight, int *cleanx, int *cleany, int *_cx1, int *_cx2) void V_CalcCleanFacs (int designwidth, int designheight, int realwidth, int realheight, int *cleanx, int *cleany, int *_cx1, int *_cx2)
{ {
int ratio; float ratio;
int cwidth; int cwidth;
int cheight; int cheight;
int cx1, cy1, cx2, cy2; int cx1, cy1, cx2, cy2;
ratio = CheckRatio(realwidth, realheight); ratio = ActiveRatio(realwidth, realheight);
if (Is54Aspect(ratio)) if (AspectTallerThanWide(ratio))
{ {
cwidth = realwidth; cwidth = realwidth;
cheight = realheight * BaseRatioSizes[ratio][3] / 48; cheight = realheight * AspectMultiplier(ratio) / 48;
} }
else else
{ {
cwidth = realwidth * BaseRatioSizes[ratio][3] / 48; cwidth = realwidth * AspectMultiplier(ratio) / 48;
cheight = realheight; cheight = realheight;
} }
// Use whichever pair of cwidth/cheight or width/height that produces less difference // Use whichever pair of cwidth/cheight or width/height that produces less difference
@ -1677,20 +1707,10 @@ CUSTOM_CVAR (Int, vid_aspect, 0, CVAR_GLOBALCONFIG|CVAR_ARCHIVE)
} }
} }
// Tries to guess the physical dimensions of the screen based on the // Helper for ActiveRatio and CheckRatio. Returns the forced ratio type, or -1 if none.
// screen's pixel dimensions. Can return: int ActiveFakeRatio(int width, int height)
// 0: 4:3
// 1: 16:9
// 2: 16:10
// 3: 17:10
// 4: 5:4
// 5: 17:10 (redundant)
// 6: 21:9
int CheckRatio (int width, int height, int *trueratio)
{ {
int fakeratio = -1; int fakeratio = -1;
int ratio;
if ((vid_aspect >= 1) && (vid_aspect <= 6)) if ((vid_aspect >= 1) && (vid_aspect <= 6))
{ {
// [SP] User wants to force aspect ratio; let them. // [SP] User wants to force aspect ratio; let them.
@ -1712,74 +1732,112 @@ int CheckRatio (int width, int height, int *trueratio)
} }
else else
{ {
fakeratio = (height * 5/4 == width) ? 4 : 0; fakeratio = (height * 5 / 4 == width) ? 4 : 0;
} }
} }
// If the size is approximately 16:9, consider it so. return fakeratio;
if (abs (height * 16/9 - width) < 10)
{
ratio = 1;
}
// Consider 17:10 as well.
else if (abs (height * 17/10 - width) < 10)
{
ratio = 3;
}
// 16:10 has more variance in the pixel dimensions. Grr.
else if (abs (height * 16/10 - width) < 60)
{
// 320x200 and 640x400 are always 4:3, not 16:10
if ((width == 320 && height == 200) || (width == 640 && height == 400))
{
ratio = 0;
}
else
{
ratio = 2;
}
}
// Unless vid_tft is set, 1280x1024 is 4:3, not 5:4.
else if (height * 5/4 == width && vid_tft)
{
ratio = 4;
}
// test for 21:9 (actually 64:27, 21:9 is a semi-accurate ratio used in marketing)
else if (abs (height * 64/27 - width) < 30)
{
ratio = 6;
}
// Assume anything else is 4:3. (Which is probably wrong these days...)
else
{
ratio = 0;
}
if (trueratio != NULL)
{
*trueratio = ratio;
}
return (fakeratio >= 0) ? fakeratio : ratio;
} }
// First column: Base width // Active screen ratio based on cvars and size
// Second column: Base height (used for wall visibility multiplier) float ActiveRatio(int width, int height, float *trueratio)
// Third column: Psprite offset (needed for "tallscreen" modes)
// Fourth column: Width or height multiplier
// For widescreen aspect ratio x:y ...
// base_width = 240 * x / y
// multiplier = 320 / base_width
// base_height = 200 * multiplier
const int BaseRatioSizes[7][4] =
{ {
{ 960, 600, 0, 48 }, // 4:3 320, 200, multiplied by three static float forcedRatioTypes[] =
{ 1280, 450, 0, 48*3/4 }, // 16:9 426.6667, 150, multiplied by three {
{ 1152, 500, 0, 48*5/6 }, // 16:10 386, 166.6667, multiplied by three 4 / 3.0f,
{ 1224, 471, 0, 48*40/51 }, // 17:10 408, 156.8627, multiplied by three 16 / 9.0f,
{ 960, 640, (int)(6.5*FRACUNIT), 48*15/16 }, // 5:4 320, 213.3333, multiplied by three 16 / 10.0f,
{ 1224, 471, 0, 48*40/51 }, // 17:10 408, 156.8627, multiplied by three (REDUNDANT) 17 / 10.0f,
{ 1707, 338, 0, 48*9/16 } // 21:9 568.8889, 337.5, multiplied by three 5 / 4.0f,
}; 17 / 10.0f,
21 / 9.0f
};
float ratio = width / (float)height;
int fakeratio = ActiveFakeRatio(width, height);
if (trueratio)
*trueratio = ratio;
return (fakeratio != -1) ? forcedRatioTypes[fakeratio] : ratio;
}
// Tries to guess the physical dimensions of the screen based on the
// screen's pixel dimensions. Can return:
// 0: 4:3
// 1: 16:9
// 2: 16:10
// 3: 17:10
// 4: 5:4
// 5: 17:10 (redundant, never returned)
// 6: 21:9
int CheckRatio (int width, int height, int *trueratio)
{
float aspect = width / (float)height;
static std::pair<float, int> ratioTypes[] =
{
{ 21 / 9.0f , 6 },
{ 16 / 9.0f , 1 },
{ 17 / 10.0f , 3 },
{ 16 / 10.0f , 2 },
{ 4 / 3.0f , 0 },
{ 5 / 4.0f , 4 },
{ 0.0f, 0 }
};
int ratio = ratioTypes[0].second;
float distance = fabs(ratioTypes[0].first - aspect);
for (int i = 1; ratioTypes[i].first != 0.0f; i++)
{
float d = fabs(ratioTypes[i].first - aspect);
if (d < distance)
{
ratio = ratioTypes[i].second;
distance = d;
}
}
int fakeratio = ActiveFakeRatio(width, height);
if (fakeratio == -1)
fakeratio = ratio;
if (trueratio)
*trueratio = ratio;
return fakeratio;
}
int AspectBaseWidth(float aspect)
{
return (int)round(240.0f * aspect * 3.0f);
}
int AspectBaseHeight(float aspect)
{
if (!AspectTallerThanWide(aspect))
return (int)round(200.0f * (320.0f / (AspectBaseWidth(aspect) / 3.0f)) * 3.0f);
else
return (int)round((200.0f * (4.0f / 3.0f)) / aspect * 3.0f);
}
double AspectPspriteOffset(float aspect)
{
if (!AspectTallerThanWide(aspect))
return 0.0;
else
return ((4.0 / 3.0) / aspect - 1.0) * 97.5;
}
int AspectMultiplier(float aspect)
{
if (!AspectTallerThanWide(aspect))
return (int)round(320.0f / (AspectBaseWidth(aspect) / 3.0f) * 48.0f);
else
return (int)round(200.0f / (AspectBaseHeight(aspect) / 3.0f) * 48.0f);
}
bool AspectTallerThanWide(float aspect)
{
return aspect < 1.333f;
}
void IVideo::DumpAdapters () void IVideo::DumpAdapters ()
{ {

View file

@ -47,6 +47,8 @@ extern int CleanWidth_1, CleanHeight_1, CleanXfac_1, CleanYfac_1;
extern int DisplayWidth, DisplayHeight, DisplayBits; extern int DisplayWidth, DisplayHeight, DisplayBits;
bool V_DoModeSetup (int width, int height, int bits); bool V_DoModeSetup (int width, int height, int bits);
void V_UpdateModeSize (int width, int height);
void V_OutputResized (int width, int height);
void V_CalcCleanFacs (int designwidth, int designheight, int realwidth, int realheight, int *cleanx, int *cleany, int *cx1=NULL, int *cx2=NULL); void V_CalcCleanFacs (int designwidth, int designheight, int realwidth, int realheight, int *cleanx, int *cleany, int *cx1=NULL, int *cx2=NULL);
class FTexture; class FTexture;
@ -302,6 +304,8 @@ public:
void Unlock (); void Unlock ();
protected: protected:
void Resize(int width, int height);
BYTE *MemBuffer; BYTE *MemBuffer;
DSimpleCanvas() {} DSimpleCanvas() {}
@ -515,15 +519,16 @@ extern "C" void ASM_PatchPitch (void);
int CheckRatio (int width, int height, int *trueratio=NULL); int CheckRatio (int width, int height, int *trueratio=NULL);
static inline int CheckRatio (double width, double height) { return CheckRatio(int(width), int(height)); } static inline int CheckRatio (double width, double height) { return CheckRatio(int(width), int(height)); }
extern const int BaseRatioSizes[7][4]; inline bool IsRatioWidescreen(int ratio) { return (ratio & 3) != 0; }
inline bool IsRatioWidescreen(int ratio) { float ActiveRatio (int width, int height, float *trueratio = NULL);
return (ratio & 3)!=0; static inline double ActiveRatio (double width, double height) { return ActiveRatio(int(width), int(height)); }
}
inline bool Is54Aspect(int ratio) { int AspectBaseWidth(float aspect);
return ratio == 4; int AspectBaseHeight(float aspect);
} double AspectPspriteOffset(float aspect);
int AspectMultiplier(float aspect);
bool AspectTallerThanWide(float aspect);
EXTERN_CVAR(Int, uiscale); EXTERN_CVAR(Int, uiscale);

View file

@ -1222,6 +1222,24 @@ void D3DFB::Flip()
CurrRenderTexture ^= RenderTextureToggle; CurrRenderTexture ^= RenderTextureToggle;
TempRenderTexture = RenderTexture[CurrRenderTexture]; TempRenderTexture = RenderTexture[CurrRenderTexture];
} }
if (Windowed)
{
RECT box;
GetClientRect(Window, &box);
if (box.right > 0 && box.right > 0 && (Width != box.right || Height != box.bottom))
{
Resize(box.right, box.bottom);
TrueHeight = Height;
PixelDoubling = 0;
LBOffsetI = 0;
LBOffset = 0.0f;
Reset();
V_OutputResized(Width, Height);
}
}
} }
//========================================================================== //==========================================================================

View file

@ -537,10 +537,18 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
if (screen && !VidResizing) if (screen && !VidResizing)
{ {
LPMINMAXINFO mmi = (LPMINMAXINFO)lParam; LPMINMAXINFO mmi = (LPMINMAXINFO)lParam;
RECT rect = { 0, 0, screen->GetWidth(), screen->GetHeight() }; if (screen->IsFullscreen())
AdjustWindowRectEx(&rect, WS_VISIBLE|WS_OVERLAPPEDWINDOW, FALSE, WS_EX_APPWINDOW); {
mmi->ptMinTrackSize.x = rect.right - rect.left; RECT rect = { 0, 0, screen->GetWidth(), screen->GetHeight() };
mmi->ptMinTrackSize.y = rect.bottom - rect.top; AdjustWindowRectEx(&rect, WS_VISIBLE | WS_OVERLAPPEDWINDOW, FALSE, WS_EX_APPWINDOW);
mmi->ptMinTrackSize.x = rect.right - rect.left;
mmi->ptMinTrackSize.y = rect.bottom - rect.top;
}
else
{
mmi->ptMinTrackSize.x = 320;
mmi->ptMinTrackSize.y = 200;
}
return 0; return 0;
} }
break; break;