Compare commits
47 commits
master
...
war2-high-
Author | SHA1 | Date | |
---|---|---|---|
|
666a3ad0e3 | ||
|
6d44a0b122 | ||
|
2ec028e87a | ||
|
292af455b6 | ||
|
952fe4fe1a | ||
|
eeefbb9b71 | ||
|
f2a613ff2a | ||
|
a4e95ac6a0 | ||
|
6987d1a773 | ||
|
da0ccd99e8 | ||
|
f0816d26a6 | ||
|
02aa3bc0d9 | ||
|
418df16446 | ||
|
51d9ef58d9 | ||
|
bf7a3d021a | ||
|
6ead8985be | ||
|
608cb6fa68 | ||
|
b9eead1947 | ||
|
0a88e48e60 | ||
|
6aae09eea9 | ||
|
de2e3bb266 | ||
|
93c6e120b6 | ||
|
3997c03d70 | ||
|
88e9566ccf | ||
|
02d300c519 | ||
|
19ed60642f | ||
|
c9d5e1015c | ||
|
971bcb3985 | ||
|
b50f9fff7b | ||
|
9b028e6376 | ||
|
50d4c0aa81 | ||
|
8643372afe | ||
|
6e9307a422 | ||
|
6a38496bf7 | ||
|
a71528f35f | ||
|
bf3d21c835 | ||
|
aa1ba9f6ec | ||
|
e38222053b | ||
|
a4725e7b2d | ||
|
fce6319137 | ||
|
87d3fb169a | ||
|
8c6b2814a9 | ||
|
6a241ca0ae | ||
|
b4cb502f6a | ||
|
f7d5d6a46e | ||
|
2e23e4309c | ||
|
483a64c7e3 |
30 changed files with 2230 additions and 814 deletions
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -49,12 +49,12 @@ __published: // Von der IDE verwaltete Komponenten
|
|||
TLabel *MaxgameticksLbl;
|
||||
TLabel *NoactivateappLbl;
|
||||
TToggleSwitch *NoactivateappChk;
|
||||
TLabel *HookLbl;
|
||||
TToggleSwitch *HookChk;
|
||||
TLabel *ResolutionsLbl;
|
||||
TToggleSwitch *ResolutionsChk;
|
||||
TLabel *MinfpsLbl;
|
||||
TToggleSwitch *MinfpsChk;
|
||||
TToggleSwitch *FixpitchChk;
|
||||
TLabel *FixpitchLbl;
|
||||
TToggleSwitch *SinglecpuChk;
|
||||
TLabel *SinglecpuLbl;
|
||||
TLabel *NonexclusiveLbl;
|
||||
TToggleSwitch *NonexclusiveChk;
|
||||
TPaintBox *PresentationPbox;
|
||||
|
@ -62,6 +62,28 @@ __published: // Von der IDE verwaltete Komponenten
|
|||
TPaintBox *ShaderPbox;
|
||||
TPaintBox *MaxgameticksPbox;
|
||||
TImage *LanguageImg;
|
||||
TPanel *HotkeyPnl;
|
||||
TLabel *ToggleWindowedLbl;
|
||||
TSpeedButton *HotkeyBtn;
|
||||
TEdit *ToggleWindowedEdt;
|
||||
TLabel *ToggleWindowedKeyLbl;
|
||||
TLabel *MaximizeWindowLbl;
|
||||
TEdit *MaximizeWindowEdt;
|
||||
TLabel *MaximizeWindowKeyLbl;
|
||||
TLabel *UnlockCursor1Lbl;
|
||||
TEdit *UnlockCursor1Edt;
|
||||
TLabel *UnlockCursor1KeyLbl;
|
||||
TLabel *UnlockCursor2Lbl;
|
||||
TEdit *UnlockCursor2Edt;
|
||||
TLabel *UnlockCursor2KeyLbl;
|
||||
TLabel *ScreenshotLbl;
|
||||
TEdit *ScreenshotEdt;
|
||||
TComboBox *ShaderD3DCbx;
|
||||
TSpeedButton *RestoreDefaultsBtn;
|
||||
TPanel *ThemePnl;
|
||||
TComboBox *ResolutionCbx;
|
||||
TLabel *ResolutionLbl;
|
||||
TPaintBox *ResolutionPbox;
|
||||
void __fastcall DisplayBtnClick(TObject *Sender);
|
||||
void __fastcall AdvancedBtnClick(TObject *Sender);
|
||||
void __fastcall CompatibilityBtnClick(TObject *Sender);
|
||||
|
@ -79,16 +101,30 @@ __published: // Von der IDE verwaltete Komponenten
|
|||
void __fastcall SavesettingsChkClick(TObject *Sender);
|
||||
void __fastcall MaxgameticksCbxChange(TObject *Sender);
|
||||
void __fastcall NoactivateappChkClick(TObject *Sender);
|
||||
void __fastcall HookChkClick(TObject *Sender);
|
||||
void __fastcall ResolutionsChkClick(TObject *Sender);
|
||||
void __fastcall MinfpsChkClick(TObject *Sender);
|
||||
void __fastcall FixpitchChkClick(TObject *Sender);
|
||||
void __fastcall SinglecpuChkClick(TObject *Sender);
|
||||
void __fastcall NonexclusiveChkClick(TObject *Sender);
|
||||
void __fastcall PboxPaint(TObject *Sender);
|
||||
void __fastcall LanguageImgClick(TObject *Sender);
|
||||
void __fastcall FormActivate(TObject *Sender);
|
||||
void __fastcall HotkeyBtnClick(TObject *Sender);
|
||||
void __fastcall HotkeyEdtKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
|
||||
void __fastcall HotkeyEdtKeyUp(TObject *Sender, WORD &Key, TShiftState Shift);
|
||||
void __fastcall ShaderD3DCbxChange(TObject *Sender);
|
||||
void __fastcall RestoreDefaultsBtnClick(TObject *Sender);
|
||||
void __fastcall ThemePnlClick(TObject *Sender);
|
||||
|
||||
|
||||
|
||||
private: // Benutzer-Deklarationen
|
||||
virtual void __fastcall CreateParams(TCreateParams & Params);
|
||||
void SaveSettings();
|
||||
bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue);
|
||||
void ApplyTranslation(TIniFile *ini);
|
||||
System::UnicodeString GetKeyText(WORD key);
|
||||
WORD GetKeyCode(System::UnicodeString text);
|
||||
System::UnicodeString KeyToText(WORD key);
|
||||
public: // Benutzer-Deklarationen
|
||||
__fastcall TConfigForm(TComponent* Owner);
|
||||
};
|
||||
|
|
BIN
config/Resources/IT.png
Normal file
BIN
config/Resources/IT.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 420 B |
File diff suppressed because it is too large
Load diff
|
@ -2,19 +2,47 @@
|
|||
|
||||
#include <vcl.h>
|
||||
#pragma hdrstop
|
||||
#include <IniFiles.hpp>
|
||||
#include <IOUtils.hpp>
|
||||
#include <System.Hash.hpp>
|
||||
#include <tchar.h>
|
||||
//---------------------------------------------------------------------------
|
||||
#include <Vcl.Styles.hpp>
|
||||
#include <Vcl.Themes.hpp>
|
||||
USEFORM("ConfigFormUnit.cpp", ConfigForm);
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\")
|
||||
|
||||
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
|
||||
{
|
||||
try
|
||||
{
|
||||
Application->Initialize();
|
||||
Application->MainFormOnTaskBar = true;
|
||||
TStyleManager::TrySetStyle("Windows10 Blue");
|
||||
|
||||
HWND hwnd =
|
||||
FindWindow(
|
||||
THashSHA1::GetHashString(Application->ExeName).w_str(), NULL);
|
||||
|
||||
if (hwnd && ParamStr(1) != L"-restart") {
|
||||
|
||||
if (IsIconic(hwnd)) {
|
||||
ShowWindow(hwnd, SW_RESTORE);
|
||||
}
|
||||
|
||||
SetForegroundWindow(hwnd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto *ini = new TIniFile(GAME_PATH + "ddraw.ini");
|
||||
auto theme = ini->ReadString("ddraw", "configtheme", "Windows10");
|
||||
|
||||
TStyleManager::TrySetStyle(
|
||||
theme == "Cobalt XEMedia" ? "Cobalt XEMedia" : "Windows10");
|
||||
|
||||
delete ini;
|
||||
|
||||
Application->CreateForm(__classid(TConfigForm), &ConfigForm);
|
||||
Application->Run();
|
||||
}
|
||||
|
|
34
config/cnc-ddraw config.manifest
Normal file
34
config/cnc-ddraw config.manifest
Normal file
|
@ -0,0 +1,34 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
|
||||
<asmv3:application>
|
||||
<asmv3:windowsSettings>
|
||||
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
|
||||
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
|
||||
</asmv3:windowsSettings>
|
||||
</asmv3:application>
|
||||
<dependency>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity
|
||||
type="win32"
|
||||
name="Microsoft.Windows.Common-Controls"
|
||||
version="6.0.0.0"
|
||||
publicKeyToken="6595b64144ccf1df"
|
||||
language="*"
|
||||
processorArchitecture="*"/>
|
||||
</dependentAssembly>
|
||||
</dependency>
|
||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||
<application>
|
||||
<!--The ID below indicates app support for Windows Vista -->
|
||||
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
|
||||
<!--The ID below indicates app support for Windows 7 -->
|
||||
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
|
||||
<!--The ID below indicates app support for Windows 8 -->
|
||||
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
|
||||
<!--The ID below indicates app support for Windows 8.1 -->
|
||||
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
|
||||
<!--The ID below indicates app support for Windows 10 -->
|
||||
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
|
||||
</application>
|
||||
</compatibility>
|
||||
</assembly>
|
|
@ -3,5 +3,6 @@ PngImage_DE RCDATA "Resources\\DE.png"
|
|||
PngImage_ES RCDATA "Resources\\ES.png"
|
||||
PngImage_FR RCDATA "Resources\\fr.png"
|
||||
PngImage_HU RCDATA "Resources\\hu.png"
|
||||
PngImage_IT RCDATA "Resources\\IT.png"
|
||||
PngImage_RU RCDATA "Resources\\RU.png"
|
||||
PngImage_US RCDATA "Resources\\US.png"
|
||||
|
|
|
@ -18,5 +18,13 @@ EXPORTS
|
|||
DirectInputCreateW = fake_DirectInputCreateW
|
||||
DirectInputCreateEx = fake_DirectInputCreateEx
|
||||
DirectInput8Create = fake_DirectInput8Create
|
||||
DDmemcpy
|
||||
DDmemmove
|
||||
DDmemset
|
||||
DDZeroMemory
|
||||
DDmemcpyStd
|
||||
DDmemmoveStd
|
||||
DDmemsetStd
|
||||
DDZeroMemoryStd
|
||||
GameHandlesClose DATA
|
||||
pvBmpBits = FakePrimarySurface DATA
|
||||
|
|
|
@ -30,6 +30,10 @@ typedef struct IDirectDrawSurfaceImpl
|
|||
DWORD l_pitch;
|
||||
DWORD lx_pitch;
|
||||
|
||||
void* bnet_surface;
|
||||
HDC bnet_dc;
|
||||
HBITMAP bnet_bitmap;
|
||||
|
||||
PBITMAPINFO bmi;
|
||||
HBITMAP bitmap;
|
||||
HDC hdc;
|
||||
|
|
|
@ -9,6 +9,7 @@ typedef struct CNCDDRAWCONFIG
|
|||
{
|
||||
RECT window_rect;
|
||||
int window_state;
|
||||
int upscaled_state;
|
||||
char ini_path[MAX_PATH];
|
||||
char game_path[MAX_PATH];
|
||||
char process_file_name[MAX_PATH];
|
||||
|
|
4
inc/dd.h
4
inc/dd.h
|
@ -137,10 +137,11 @@ typedef struct CNCDDRAW
|
|||
int show_cursor_count;
|
||||
BOOL accurate_timers;
|
||||
BOOL resizable;
|
||||
BOOL toggle_borderless;
|
||||
BOOL toggle_upscaled;
|
||||
BOOL nonexclusive;
|
||||
BOOL fixpitch;
|
||||
int fixchilds;
|
||||
BOOL fixwndprochook;
|
||||
BOOL fixnotresponding;
|
||||
BOOL locktopleft;
|
||||
BOOL d3d9linear;
|
||||
|
@ -155,6 +156,7 @@ typedef struct CNCDDRAW
|
|||
BOOL bnet_was_fullscreen;
|
||||
BOOL bnet_was_upscaled;
|
||||
RECT bnet_win_rect;
|
||||
DEVMODE bnet_mode;
|
||||
POINT bnet_pos;
|
||||
void* last_freed_palette; /* Dungeon Keeper hack */
|
||||
BOOL child_window_exists;
|
||||
|
|
|
@ -33,6 +33,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect);
|
|||
HRESULT dds_GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD);
|
||||
void* dds_GetBuffer(IDirectDrawSurfaceImpl* This);
|
||||
HRESULT dd_CreateSurface(IDirectDrawImpl* This, LPDDSURFACEDESC lpDDSurfaceDesc, IDirectDrawSurfaceImpl** lpDDSurface, IUnknown FAR* unkOuter);
|
||||
|
||||
void dds_RedrawBnet(IDirectDrawSurfaceImpl* This, BOOL obs_hack);
|
||||
void dds_RedrawArmada(IDirectDrawSurfaceImpl* This);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#define SKIP_HOOK3 0x00000002l
|
||||
|
||||
typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA;
|
||||
typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[24]; } HOOKLIST;
|
||||
typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[25]; } HOOKLIST;
|
||||
|
||||
typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT);
|
||||
typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*);
|
||||
|
@ -34,8 +34,11 @@ typedef HWND(WINAPI* CREATEWINDOWEXAPROC)(DWORD, LPCSTR, LPCSTR, DWORD, int, int
|
|||
typedef BOOL(WINAPI* DESTROYWINDOWPROC)(HWND);
|
||||
typedef int (WINAPI* MAPWINDOWPOINTSPROC)(HWND, HWND, LPPOINT, UINT);
|
||||
typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int);
|
||||
typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND hWnd);
|
||||
typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD);
|
||||
typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int);
|
||||
typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*);
|
||||
typedef HFONT(WINAPI* CREATEFONTAPROC)(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR);
|
||||
typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR);
|
||||
typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR);
|
||||
typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD);
|
||||
|
@ -65,8 +68,11 @@ extern CREATEWINDOWEXAPROC real_CreateWindowExA;
|
|||
extern DESTROYWINDOWPROC real_DestroyWindow;
|
||||
extern MAPWINDOWPOINTSPROC real_MapWindowPoints;
|
||||
extern SHOWWINDOWPROC real_ShowWindow;
|
||||
extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow;
|
||||
extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA;
|
||||
extern GETDEVICECAPSPROC real_GetDeviceCaps;
|
||||
extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA;
|
||||
extern CREATEFONTAPROC real_CreateFontA;
|
||||
extern LOADLIBRARYAPROC real_LoadLibraryA;
|
||||
extern LOADLIBRARYWPROC real_LoadLibraryW;
|
||||
extern LOADLIBRARYEXAPROC real_LoadLibraryExA;
|
||||
|
|
|
@ -27,8 +27,15 @@ BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable);
|
|||
BOOL WINAPI fake_DestroyWindow(HWND hWnd);
|
||||
int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints);
|
||||
BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow);
|
||||
BOOL WINAPI fake_SetForegroundWindow(HWND hWnd);
|
||||
HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId);
|
||||
int WINAPI fake_GetDeviceCaps(HDC hdc, int index);
|
||||
HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA* lplf);
|
||||
HFONT WINAPI fake_CreateFontA(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight,
|
||||
DWORD fdwItalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet,
|
||||
DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily,
|
||||
LPCTSTR lpszFace);
|
||||
|
||||
HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName);
|
||||
HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName);
|
||||
HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags);
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#define WM_DISPLAYCHANGE_DDRAW WM_APP+116
|
||||
|
||||
#define IDT_TIMER_LEAVE_BNET 541287654
|
||||
#define IDT_TIMER_REDRAW_BNET 541287655
|
||||
|
||||
LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
|
|
|
@ -90,9 +90,21 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This)
|
|||
HeapFree(GetProcessHeap(), 0, This->surface);
|
||||
}
|
||||
|
||||
if (This->bnet_bitmap)
|
||||
{
|
||||
DeleteObject(This->bnet_bitmap);
|
||||
}
|
||||
else if (This->bnet_surface)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, This->bnet_surface);
|
||||
}
|
||||
|
||||
if (This->hdc)
|
||||
DeleteDC(This->hdc);
|
||||
|
||||
if (This->bnet_dc)
|
||||
DeleteDC(This->bnet_dc);
|
||||
|
||||
if (This->bmi)
|
||||
HeapFree(GetProcessHeap(), 0, This->bmi);
|
||||
|
||||
|
|
65
src/config.c
65
src/config.c
|
@ -10,11 +10,13 @@
|
|||
#include "hook.h"
|
||||
#include "debug.h"
|
||||
|
||||
#define FILE_EXISTS(a) (GetFileAttributes(a) != INVALID_FILE_ATTRIBUTES)
|
||||
|
||||
static void cfg_init();
|
||||
static void cfg_create_ini();
|
||||
|
||||
CNCDDRAWCONFIG g_config =
|
||||
{ .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1 };
|
||||
{ .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1, .upscaled_state = -1 };
|
||||
|
||||
void cfg_load()
|
||||
{
|
||||
|
@ -27,17 +29,22 @@ void cfg_load()
|
|||
g_ddraw->border = cfg_get_bool("border", TRUE);
|
||||
g_ddraw->boxing = cfg_get_bool("boxing", FALSE);
|
||||
g_ddraw->maintas = cfg_get_bool("maintas", FALSE);
|
||||
g_ddraw->adjmouse = cfg_get_bool("adjmouse", TRUE) || !cfg_get_bool("handlemouse", TRUE);
|
||||
g_ddraw->adjmouse =
|
||||
cfg_get_bool("adjmouse", TRUE) ||
|
||||
!cfg_get_bool("handlemouse", TRUE) ||
|
||||
FILE_EXISTS(".\\plugin\\HardwareCursor.w2p");
|
||||
|
||||
g_ddraw->devmode = cfg_get_bool("devmode", FALSE);
|
||||
g_ddraw->vsync = cfg_get_bool("vsync", FALSE);
|
||||
g_ddraw->noactivateapp = cfg_get_bool("noactivateapp", FALSE);
|
||||
g_ddraw->vhack = cfg_get_bool("vhack", FALSE);
|
||||
g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE);
|
||||
g_ddraw->resizable = cfg_get_bool("resizable", TRUE);
|
||||
g_ddraw->toggle_borderless = cfg_get_bool("toggle_borderless", FALSE);
|
||||
g_ddraw->toggle_upscaled = cfg_get_bool("toggle_upscaled", FALSE);
|
||||
g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE);
|
||||
g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE);
|
||||
g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT);
|
||||
g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE);
|
||||
g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE);
|
||||
g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE);
|
||||
g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE);
|
||||
|
@ -107,10 +114,7 @@ void cfg_load()
|
|||
g_ddraw->flip_limiter.tick_length = (DWORD)(flip_len + 0.5f);
|
||||
}
|
||||
|
||||
if ((g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE)))
|
||||
{
|
||||
g_config.window_rect.left = g_config.window_rect.top = -32000;
|
||||
}
|
||||
g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE);
|
||||
|
||||
if (cfg_get_bool("singlecpu", TRUE))
|
||||
{
|
||||
|
@ -146,6 +150,13 @@ void cfg_load()
|
|||
else if (tolower(tmp[0]) == 'd') /* direct3d9 */
|
||||
{
|
||||
g_ddraw->renderer = d3d9_render_main;
|
||||
|
||||
if (!g_ddraw->windowed)
|
||||
{
|
||||
g_ddraw->fullscreen = TRUE;
|
||||
g_ddraw->windowed = TRUE;
|
||||
g_config.window_rect.left = g_config.window_rect.top = -32000;
|
||||
}
|
||||
}
|
||||
else if (tolower(tmp[0]) == 'o') /* opengl */
|
||||
{
|
||||
|
@ -164,6 +175,13 @@ void cfg_load()
|
|||
if (!g_ddraw->wine && d3d9_is_available())
|
||||
{
|
||||
g_ddraw->renderer = d3d9_render_main;
|
||||
|
||||
if (!g_ddraw->windowed)
|
||||
{
|
||||
g_ddraw->fullscreen = TRUE;
|
||||
g_ddraw->windowed = TRUE;
|
||||
g_config.window_rect.left = g_config.window_rect.top = -32000;
|
||||
}
|
||||
}
|
||||
else if (oglu_load_dll())
|
||||
{
|
||||
|
@ -213,6 +231,11 @@ void cfg_save()
|
|||
{
|
||||
WritePrivateProfileString(section, "windowed", g_config.window_state ? "true" : "false", g_config.ini_path);
|
||||
}
|
||||
|
||||
if (g_config.upscaled_state != -1)
|
||||
{
|
||||
WritePrivateProfileString(section, "fullscreen", g_config.upscaled_state ? "true" : "false", g_config.ini_path);
|
||||
}
|
||||
}
|
||||
|
||||
static void cfg_create_ini()
|
||||
|
@ -221,7 +244,7 @@ static void cfg_create_ini()
|
|||
if (fh)
|
||||
{
|
||||
fputs(
|
||||
"; cnc-ddraw - https://github.com/CnCNet/cnc-ddraw - https://cncnet.org\n"
|
||||
"; cnc-ddraw - https://github.com/FunkyFr3sh/cnc-ddraw\n"
|
||||
"\n"
|
||||
"[ddraw]\n"
|
||||
"; ### Optional settings ###\n"
|
||||
|
@ -240,7 +263,7 @@ static void cfg_create_ini()
|
|||
"windowed=false\n"
|
||||
"\n"
|
||||
"; Maintain aspect ratio\n"
|
||||
"maintas=false\n"
|
||||
"maintas=true\n"
|
||||
"\n"
|
||||
"; Windowboxing / Integer Scaling\n"
|
||||
"boxing=false\n"
|
||||
|
@ -255,18 +278,18 @@ static void cfg_create_ini()
|
|||
"\n"
|
||||
"; Automatic mouse sensitivity scaling\n"
|
||||
"; Note: Only works if stretching is enabled. Sensitivity will be adjusted according to the size of the window\n"
|
||||
"adjmouse=true\n"
|
||||
"adjmouse=false\n"
|
||||
"\n"
|
||||
"; Preliminary libretro shader support - (Requires 'renderer=opengl') https://github.com/libretro/glsl-shaders\n"
|
||||
"; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV\n"
|
||||
"shader=Shaders\\interpolation\\bilinear.glsl\n"
|
||||
"shader=Shaders\\interpolation\\catmull-rom-bilinear.glsl\n"
|
||||
"\n"
|
||||
"; Window position, -32000 = center to screen\n"
|
||||
"posX=-32000\n"
|
||||
"posY=-32000\n"
|
||||
"\n"
|
||||
"; Renderer, possible values: auto, opengl, gdi, direct3d9 (auto = try direct3d9/opengl, fallback = gdi)\n"
|
||||
"renderer=auto\n"
|
||||
"renderer=opengl\n"
|
||||
"\n"
|
||||
"; Developer mode (don't lock the cursor)\n"
|
||||
"devmode=false\n"
|
||||
|
@ -290,6 +313,12 @@ static void cfg_create_ini()
|
|||
"; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french\n"
|
||||
"configlang=auto\n"
|
||||
"\n"
|
||||
"; Switch between windowed/borderless modes with alt+enter rather than windowed/fullscreen modes\n"
|
||||
"toggle_borderless=false\n"
|
||||
"\n"
|
||||
"; Switch between windowed/fullscreen upscaled modes with alt+enter rather than windowed/fullscreen modes\n"
|
||||
"toggle_upscaled=false\n"
|
||||
"\n"
|
||||
"\n"
|
||||
"\n"
|
||||
"; ### Compatibility settings ###\n"
|
||||
|
@ -665,6 +694,14 @@ static void cfg_create_ini()
|
|||
"maintas=false\n"
|
||||
"boxing=false\n"
|
||||
"\n"
|
||||
"; Diablo\n"
|
||||
"[Diablo]\n"
|
||||
"devmode=true\n"
|
||||
"\n"
|
||||
"; Diablo: Hellfire\n"
|
||||
"[hellfire]\n"
|
||||
"devmode=true\n"
|
||||
"\n"
|
||||
"; Eggsucker\n"
|
||||
"[eggsucker]\n"
|
||||
"fixpitch=true\n"
|
||||
|
@ -691,17 +728,14 @@ static void cfg_create_ini()
|
|||
"\n"
|
||||
"; Grand Theft Auto\n"
|
||||
"[Grand Theft Auto]\n"
|
||||
"fixwndprochook=true\n"
|
||||
"singlecpu=false\n"
|
||||
"\n"
|
||||
"; Grand Theft Auto: London 1969\n"
|
||||
"[gta_uk]\n"
|
||||
"fixwndprochook=true\n"
|
||||
"singlecpu=false\n"
|
||||
"\n"
|
||||
"; Grand Theft Auto: London 1961\n"
|
||||
"[Gta_61]\n"
|
||||
"fixwndprochook=true\n"
|
||||
"singlecpu=false\n"
|
||||
"\n"
|
||||
"; Heroes of Might and Magic II: The Succession Wars\n"
|
||||
|
@ -717,7 +751,6 @@ static void cfg_create_ini()
|
|||
"; Invictus\n"
|
||||
"[Invictus]\n"
|
||||
"adjmouse=true\n"
|
||||
"fixwndprochook=true\n"
|
||||
"renderer=opengl\n"
|
||||
"\n"
|
||||
"; Interstate 76\n"
|
||||
|
|
11
src/dd.c
11
src/dd.c
|
@ -450,9 +450,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
|
|||
{
|
||||
border = FALSE;
|
||||
|
||||
g_config.window_rect.left = -32000;
|
||||
g_config.window_rect.top = -32000;
|
||||
|
||||
/* prevent OpenGL from going automatically into fullscreen exclusive mode */
|
||||
if (g_ddraw->renderer == ogl_render_main)
|
||||
nonexclusive = TRUE;
|
||||
|
@ -672,6 +669,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
|
|||
int x = (g_config.window_rect.left != -32000) ? g_config.window_rect.left : (cy / 2) - (g_ddraw->render.width / 2);
|
||||
int y = (g_config.window_rect.top != -32000) ? g_config.window_rect.top : (cx / 2) - (g_ddraw->render.height / 2);
|
||||
|
||||
if (g_ddraw->fullscreen)
|
||||
{
|
||||
x = y = 0;
|
||||
}
|
||||
|
||||
if (IsIconic(g_ddraw->hwnd))
|
||||
real_ShowWindow(g_ddraw->hwnd, SW_RESTORE);
|
||||
|
||||
RECT dst = { x, y, g_ddraw->render.width + x, g_ddraw->render.height + y };
|
||||
|
||||
AdjustWindowRect(&dst, GetWindowLong(g_ddraw->hwnd, GWL_STYLE), FALSE);
|
||||
|
|
|
@ -1190,13 +1190,51 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD
|
|||
return DD_OK;
|
||||
}
|
||||
|
||||
HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
|
||||
void dds_RedrawBnet(IDirectDrawSurfaceImpl* This, BOOL obs_hack)
|
||||
{
|
||||
/* Hack for Warcraft II BNE and Diablo */
|
||||
HWND hwnd = g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL;
|
||||
|
||||
if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE))
|
||||
if (hwnd)
|
||||
{
|
||||
if (obs_hack)
|
||||
{
|
||||
/* hack for windows 8/10 fullscreen exclusive mode */
|
||||
|
||||
if (g_ddraw->primary->palette)
|
||||
{
|
||||
SetDIBColorTable(g_ddraw->primary->bnet_dc, 0, 256, g_ddraw->primary->palette->data_rgb);
|
||||
}
|
||||
|
||||
EnterCriticalSection(&g_ddraw->cs);
|
||||
|
||||
RECT rc;
|
||||
if (fake_GetWindowRect(hwnd, &rc))
|
||||
{
|
||||
HDC dc = GetDC(hwnd);
|
||||
|
||||
BitBlt(
|
||||
g_ddraw->primary->bnet_dc,
|
||||
rc.left,
|
||||
rc.top,
|
||||
rc.right - rc.left,
|
||||
rc.bottom - rc.top,
|
||||
dc,
|
||||
0,
|
||||
0,
|
||||
SRCCOPY);
|
||||
|
||||
ReleaseDC(hwnd, dc);
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&g_ddraw->cs);
|
||||
|
||||
if (g_ddraw->render.run)
|
||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
HDC primary_dc;
|
||||
dds_GetDC(This, &primary_dc);
|
||||
|
||||
|
@ -1246,11 +1284,14 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
|
|||
g_ddraw->ticks_limiter.use_blt_or_flip = x;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void dds_RedrawArmada(IDirectDrawSurfaceImpl* This)
|
||||
{
|
||||
/* Hack for Star Trek Armada */
|
||||
hwnd = g_ddraw->armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL;
|
||||
HWND hwnd = g_ddraw->armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL;
|
||||
|
||||
if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE))
|
||||
if (hwnd)
|
||||
{
|
||||
HDC primary_dc;
|
||||
dds_GetDC(This, &primary_dc);
|
||||
|
@ -1284,7 +1325,15 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
|
|||
|
||||
g_ddraw->ticks_limiter.use_blt_or_flip = x;
|
||||
}
|
||||
}
|
||||
|
||||
HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
|
||||
{
|
||||
if ((This->caps & DDSCAPS_PRIMARYSURFACE))
|
||||
{
|
||||
dds_RedrawBnet(This, FALSE);
|
||||
dds_RedrawArmada(This);
|
||||
}
|
||||
|
||||
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->render.run)
|
||||
{
|
||||
|
@ -1471,6 +1520,26 @@ HRESULT dd_CreateSurface(
|
|||
{
|
||||
g_ddraw->primary = dst_surface;
|
||||
FakePrimarySurface = dst_surface->surface;
|
||||
|
||||
dst_surface->bnet_dc = CreateCompatibleDC(g_ddraw->render.hdc);
|
||||
|
||||
dst_surface->bnet_bitmap =
|
||||
CreateDIBSection(
|
||||
dst_surface->bnet_dc,
|
||||
dst_surface->bmi,
|
||||
DIB_RGB_COLORS,
|
||||
(void**)&dst_surface->bnet_surface, NULL, 0);
|
||||
|
||||
if (!dst_surface->bnet_bitmap)
|
||||
{
|
||||
dst_surface->bnet_surface =
|
||||
HeapAlloc(
|
||||
GetProcessHeap(),
|
||||
HEAP_ZERO_MEMORY,
|
||||
dst_surface->l_pitch * (dst_surface->height + 200) * dst_surface->lx_pitch);
|
||||
}
|
||||
|
||||
SelectObject(dst_surface->bnet_dc, dst_surface->bnet_bitmap);
|
||||
}
|
||||
|
||||
SelectObject(dst_surface->hdc, dst_surface->bitmap);
|
||||
|
|
|
@ -232,3 +232,45 @@ DWORD WINAPI DDInternalUnlock(DWORD a)
|
|||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Exports for game patching */
|
||||
|
||||
void* __cdecl DDmemcpy(void* _Dst, void const* _Src, size_t _Size)
|
||||
{
|
||||
return memcpy(_Dst, _Src, _Size);
|
||||
}
|
||||
|
||||
void* __cdecl DDmemmove(void* _Dst, void const* _Src, size_t _Size)
|
||||
{
|
||||
return memmove(_Dst, _Src, _Size);
|
||||
}
|
||||
|
||||
void* __cdecl DDmemset(void* _Dst, int _Val, size_t _Size)
|
||||
{
|
||||
return memset(_Dst, _Val, _Size);
|
||||
}
|
||||
|
||||
void __cdecl DDZeroMemory(PVOID Destination, SIZE_T Length)
|
||||
{
|
||||
memset(Destination, 0, Length);
|
||||
}
|
||||
|
||||
void* __stdcall DDmemcpyStd(void* _Dst, void const* _Src, size_t _Size)
|
||||
{
|
||||
return memcpy(_Dst, _Src, _Size);
|
||||
}
|
||||
|
||||
void* __stdcall DDmemmoveStd(void* _Dst, void const* _Src, size_t _Size)
|
||||
{
|
||||
return memmove(_Dst, _Src, _Size);
|
||||
}
|
||||
|
||||
void* __stdcall DDmemsetStd(void* _Dst, int _Val, size_t _Size)
|
||||
{
|
||||
return memset(_Dst, _Val, _Size);
|
||||
}
|
||||
|
||||
void __stdcall DDZeroMemoryStd(PVOID Destination, SIZE_T Length)
|
||||
{
|
||||
memset(Destination, 0, Length);
|
||||
}
|
||||
|
|
29
src/hook.c
29
src/hook.c
|
@ -40,14 +40,18 @@ CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA;
|
|||
DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow;
|
||||
MAPWINDOWPOINTSPROC real_MapWindowPoints = MapWindowPoints;
|
||||
SHOWWINDOWPROC real_ShowWindow = ShowWindow;
|
||||
SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow;
|
||||
SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA;
|
||||
GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps;
|
||||
CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA;
|
||||
CREATEFONTAPROC real_CreateFontA = CreateFontA;
|
||||
LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA;
|
||||
LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW;
|
||||
LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA;
|
||||
LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW;
|
||||
COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance;
|
||||
|
||||
|
||||
static HOOKLIST g_hooks[] =
|
||||
{
|
||||
{
|
||||
|
@ -76,6 +80,7 @@ static HOOKLIST g_hooks[] =
|
|||
{ "DestroyWindow", (PROC)fake_DestroyWindow, (PROC*)&real_DestroyWindow, 0 },
|
||||
{ "MapWindowPoints", (PROC)fake_MapWindowPoints, (PROC*)&real_MapWindowPoints, 0 },
|
||||
{ "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow, 0 },
|
||||
{ "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 },
|
||||
{ "", NULL, NULL, 0 }
|
||||
}
|
||||
},
|
||||
|
@ -495,6 +500,20 @@ void hook_init()
|
|||
{
|
||||
BOOL initial_hook = !g_hook_active;
|
||||
|
||||
if (initial_hook)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach((PVOID*)&real_CreateFontIndirectA, (PVOID)fake_CreateFontIndirectA);
|
||||
DetourTransactionCommit();
|
||||
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach((PVOID*)&real_CreateFontA, (PVOID)fake_CreateFontA);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
|
||||
#ifdef _MSC_VER
|
||||
if (initial_hook && g_hook_dinput)
|
||||
{
|
||||
|
@ -575,6 +594,16 @@ void hook_exit()
|
|||
{
|
||||
g_hook_active = FALSE;
|
||||
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourDetach((PVOID*)&real_CreateFontIndirectA, (PVOID)fake_CreateFontIndirectA);
|
||||
DetourTransactionCommit();
|
||||
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourDetach((PVOID*)&real_CreateFontA, (PVOID)fake_CreateFontA);
|
||||
DetourTransactionCommit();
|
||||
|
||||
#ifdef _MSC_VER
|
||||
if (g_hook_dinput)
|
||||
{
|
||||
|
|
|
@ -13,7 +13,7 @@ void mouse_lock()
|
|||
if (g_ddraw->devmode || g_ddraw->bnet_active)
|
||||
return;
|
||||
|
||||
if (g_hook_active && !g_ddraw->locked)
|
||||
if (g_hook_active && !g_ddraw->locked && !IsIconic(g_ddraw->hwnd))
|
||||
{
|
||||
int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0);
|
||||
int cur_count = real_ShowCursor(TRUE) - 1;
|
||||
|
|
|
@ -442,6 +442,29 @@ DWORD WINAPI d3d9_render_main(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (g_ddraw->bnet_active)
|
||||
{
|
||||
IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
|
||||
|
||||
RECT rc = { 0,0,g_ddraw->width,g_ddraw->height };
|
||||
|
||||
if (SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0)))
|
||||
{
|
||||
unsigned char* src = (unsigned char*)g_ddraw->primary->bnet_surface;
|
||||
unsigned char* dst = (unsigned char*)lock_rc.pBits;
|
||||
|
||||
for (int i = 0; i < g_ddraw->height; i++)
|
||||
{
|
||||
memcpy(dst, src, g_ddraw->primary->l_pitch);
|
||||
|
||||
src += g_ddraw->primary->l_pitch;
|
||||
dst += lock_rc.Pitch;
|
||||
}
|
||||
|
||||
IDirect3DTexture9_UnlockRect(g_d3d9.surface_tex[tex_index], 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&g_ddraw->cs);
|
||||
|
@ -456,11 +479,6 @@ DWORD WINAPI d3d9_render_main(void)
|
|||
IDirect3DDevice9_DrawPrimitive(g_d3d9.device, D3DPT_TRIANGLESTRIP, 0, 2);
|
||||
IDirect3DDevice9_EndScene(g_d3d9.device);
|
||||
|
||||
if (g_ddraw->bnet_active)
|
||||
{
|
||||
IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
|
||||
}
|
||||
|
||||
if (FAILED(IDirect3DDevice9_Present(g_d3d9.device, NULL, NULL, NULL, NULL)))
|
||||
{
|
||||
DWORD_PTR result;
|
||||
|
|
|
@ -74,7 +74,7 @@ DWORD WINAPI gdi_render_main(void)
|
|||
|
||||
if (g_ddraw->fixchilds)
|
||||
{
|
||||
g_ddraw->child_window_exists = FALSE;
|
||||
g_ddraw->child_window_exists = g_ddraw->bnet_active && GetSystemMetrics(SM_CMONITORS) > 1;
|
||||
EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary);
|
||||
}
|
||||
|
||||
|
@ -97,8 +97,39 @@ DWORD WINAPI gdi_render_main(void)
|
|||
|
||||
if (g_ddraw->bnet_active)
|
||||
{
|
||||
RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height };
|
||||
FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
|
||||
if (GetSystemMetrics(SM_CMONITORS) == 1)
|
||||
{
|
||||
StretchDIBits(
|
||||
g_ddraw->render.hdc,
|
||||
g_ddraw->render.viewport.x,
|
||||
g_ddraw->render.viewport.y,
|
||||
g_ddraw->render.viewport.width,
|
||||
g_ddraw->render.viewport.height,
|
||||
0,
|
||||
0,
|
||||
g_ddraw->width,
|
||||
g_ddraw->height,
|
||||
g_ddraw->primary->bnet_surface,
|
||||
g_ddraw->primary->bmi,
|
||||
DIB_RGB_COLORS,
|
||||
SRCCOPY);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetDIBitsToDevice(
|
||||
g_ddraw->render.hdc,
|
||||
0,
|
||||
0,
|
||||
g_ddraw->width,
|
||||
g_ddraw->height,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
g_ddraw->height,
|
||||
g_ddraw->primary->bnet_surface,
|
||||
g_ddraw->primary->bmi,
|
||||
DIB_RGB_COLORS);
|
||||
}
|
||||
}
|
||||
else if (upscale_hack)
|
||||
{
|
||||
|
|
|
@ -150,8 +150,22 @@ static void ogl_build_programs()
|
|||
_snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.game_path, g_ddraw->shader);
|
||||
}
|
||||
|
||||
BOOL is_upscaler =
|
||||
strstr(g_ddraw->shader, "fsr.glsl") != NULL ||
|
||||
strstr(g_ddraw->shader, "catmull-rom-bilinear.glsl") != NULL ||
|
||||
strstr(g_ddraw->shader, "lanczos2-sharp.glsl") != NULL ||
|
||||
strstr(g_ddraw->shader, "xbr-lv2-noblend.glsl") != NULL ||
|
||||
strstr(g_ddraw->shader, "xbrz-freescale-multipass.glsl") != NULL ||
|
||||
strstr(g_ddraw->shader, "xbrz-freescale.glsl") != NULL;
|
||||
|
||||
if (!is_upscaler ||
|
||||
g_ddraw->render.viewport.width != g_ddraw->width ||
|
||||
g_ddraw->render.viewport.height != g_ddraw->height ||
|
||||
g_ddraw->vhack)
|
||||
{
|
||||
g_ogl.scale_program = oglu_build_program_from_file(shader_path, wglCreateContextAttribsARB != NULL);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
g_oglu_got_version3 = FALSE;
|
||||
|
@ -676,7 +690,7 @@ static void ogl_render()
|
|||
|
||||
if (g_ddraw->fixchilds)
|
||||
{
|
||||
g_ddraw->child_window_exists = FALSE;
|
||||
g_ddraw->child_window_exists = g_ddraw->bnet_active && GetSystemMetrics(SM_CMONITORS) > 1;
|
||||
EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary);
|
||||
|
||||
if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height)
|
||||
|
@ -701,6 +715,30 @@ static void ogl_render()
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (g_ddraw->bnet_active)
|
||||
{
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]);
|
||||
|
||||
if (g_ogl.adjust_alignment)
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
|
||||
glTexSubImage2D(
|
||||
GL_TEXTURE_2D,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
g_ddraw->width,
|
||||
g_ddraw->height,
|
||||
g_ogl.surface_format,
|
||||
g_ogl.surface_type,
|
||||
g_ddraw->primary->bnet_surface);
|
||||
|
||||
if (g_ogl.adjust_alignment)
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
||||
}
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&g_ddraw->cs);
|
||||
|
@ -823,9 +861,6 @@ static void ogl_render()
|
|||
glEnd();
|
||||
}
|
||||
|
||||
if (g_ddraw->bnet_active)
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
SwapBuffers(g_ddraw->render.hdc);
|
||||
|
||||
#if _DEBUG
|
||||
|
|
|
@ -132,8 +132,8 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src)
|
|||
}
|
||||
}
|
||||
|
||||
strftime(str_time, sizeof(str_time), "%Y-%m-%d-%H_%M_%S", localtime(&t));
|
||||
_snprintf(filename, sizeof(filename), "%s-%s.png", title, str_time);
|
||||
strftime(str_time, sizeof(str_time), "%Y-%m-%d_%H-%M-%S", localtime(&t));
|
||||
_snprintf(filename, sizeof(filename), "%s_%s.png", title, str_time);
|
||||
|
||||
if (src->bpp == 8 && src->palette)
|
||||
{
|
||||
|
|
48
src/utils.c
48
src/utils.c
|
@ -158,7 +158,7 @@ BOOL util_get_lowest_resolution(
|
|||
DWORD max_height)
|
||||
{
|
||||
BOOL result = FALSE;
|
||||
int org_ratio = (int)((ratio + 0.005f) * 100);
|
||||
int org_ratio = (int)((ratio + 0.005f) * 10);
|
||||
SIZE lowest = { .cx = max_width + 1, .cy = max_height + 1 };
|
||||
DWORD i = 0;
|
||||
DEVMODE m;
|
||||
|
@ -174,7 +174,7 @@ BOOL util_get_lowest_resolution(
|
|||
m.dmPelsWidth < lowest.cx &&
|
||||
m.dmPelsHeight < lowest.cy)
|
||||
{
|
||||
int res_ratio = (int)((((float)m.dmPelsWidth / m.dmPelsHeight) + 0.005f) * 100);
|
||||
int res_ratio = (int)((((float)m.dmPelsWidth / m.dmPelsHeight) + 0.005f) * 10);
|
||||
|
||||
if (res_ratio == org_ratio)
|
||||
{
|
||||
|
@ -279,18 +279,41 @@ void util_toggle_fullscreen()
|
|||
if (g_ddraw->bnet_active)
|
||||
return;
|
||||
|
||||
memset(g_ddraw->primary->bnet_surface, 0, g_ddraw->width * g_ddraw->height);
|
||||
|
||||
if (g_ddraw->toggle_borderless)
|
||||
{
|
||||
if (!g_ddraw->fullscreen)
|
||||
{
|
||||
mouse_unlock();
|
||||
|
||||
g_config.upscaled_state = g_ddraw->fullscreen = TRUE;
|
||||
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
|
||||
|
||||
mouse_lock();
|
||||
}
|
||||
else
|
||||
{
|
||||
mouse_unlock();
|
||||
|
||||
g_config.upscaled_state = g_ddraw->fullscreen = FALSE;
|
||||
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
|
||||
|
||||
//mouse_lock();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (g_ddraw->windowed)
|
||||
{
|
||||
mouse_unlock();
|
||||
|
||||
if (g_ddraw->toggle_upscaled)
|
||||
{
|
||||
g_config.upscaled_state = g_ddraw->fullscreen = TRUE;
|
||||
}
|
||||
|
||||
g_config.window_state = g_ddraw->windowed = FALSE;
|
||||
LONG style = GetWindowLong(g_ddraw->hwnd, GWL_STYLE);
|
||||
|
||||
real_SetWindowLongA(
|
||||
g_ddraw->hwnd,
|
||||
GWL_STYLE,
|
||||
style & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU));
|
||||
|
||||
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED);
|
||||
util_update_bnet_pos(0, 0);
|
||||
|
||||
|
@ -299,6 +322,12 @@ void util_toggle_fullscreen()
|
|||
else
|
||||
{
|
||||
mouse_unlock();
|
||||
|
||||
if (g_ddraw->toggle_upscaled)
|
||||
{
|
||||
g_config.upscaled_state = g_ddraw->fullscreen = FALSE;
|
||||
}
|
||||
|
||||
g_config.window_state = g_ddraw->windowed = TRUE;
|
||||
|
||||
if (g_ddraw->renderer == d3d9_render_main)
|
||||
|
@ -314,6 +343,7 @@ void util_toggle_fullscreen()
|
|||
//mouse_lock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BOOL util_unadjust_window_rect(LPRECT prc, DWORD dwStyle, BOOL fMenu, DWORD dwExStyle)
|
||||
{
|
||||
|
|
|
@ -107,6 +107,16 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
|
|||
|
||||
return TRUE;
|
||||
}
|
||||
else if (lpPoint && g_ddraw->bnet_active && real_ScreenToClient(g_ddraw->hwnd, &pt))
|
||||
{
|
||||
if (pt.x > 0 && pt.x < g_ddraw->width && pt.y > 0 && pt.y < g_ddraw->height)
|
||||
{
|
||||
lpPoint->x = pt.x;
|
||||
lpPoint->y = pt.y;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (lpPoint)
|
||||
{
|
||||
|
@ -418,24 +428,12 @@ LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong)
|
|||
if (nIndex == GWL_STYLE)
|
||||
return 0;
|
||||
|
||||
if (nIndex == GWL_WNDPROC && g_ddraw->fixwndprochook)
|
||||
if (nIndex == GWL_WNDPROC)
|
||||
{
|
||||
if (dwNewLong == (LONG)compat_WndProc)
|
||||
{
|
||||
WNDPROC old = g_ddraw->wndproc = g_compat_wndproc;
|
||||
//g_compat_wndproc = NULL;
|
||||
return (LONG)old;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dwNewLong != (LONG)g_ddraw->wndproc)
|
||||
{
|
||||
g_compat_wndproc = g_ddraw->wndproc;
|
||||
WNDPROC old = g_ddraw->wndproc;
|
||||
g_ddraw->wndproc = (WNDPROC)dwNewLong;
|
||||
}
|
||||
|
||||
return (LONG)compat_WndProc;
|
||||
}
|
||||
return (LONG)old;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -446,9 +444,9 @@ LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex)
|
|||
{
|
||||
if (g_ddraw && g_ddraw->hwnd == hWnd)
|
||||
{
|
||||
if (nIndex == GWL_WNDPROC && g_ddraw->fixwndprochook)
|
||||
if (nIndex == GWL_WNDPROC)
|
||||
{
|
||||
return (LONG)compat_WndProc;
|
||||
return (LONG)g_ddraw->wndproc;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -516,6 +514,11 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow)
|
|||
return real_ShowWindow(hWnd, nCmdShow);
|
||||
}
|
||||
|
||||
BOOL WINAPI fake_SetForegroundWindow(HWND hWnd)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId)
|
||||
{
|
||||
if (idHook == WH_KEYBOARD_LL && hmod && GetModuleHandle("AcGenral") == hmod)
|
||||
|
@ -545,6 +548,30 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index)
|
|||
return real_GetDeviceCaps(hdc, index);
|
||||
}
|
||||
|
||||
HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA* lplf)
|
||||
{
|
||||
LOGFONTA lf;
|
||||
memcpy(&lf, lplf, sizeof(lf));
|
||||
lf.lfQuality = NONANTIALIASED_QUALITY;
|
||||
|
||||
return real_CreateFontIndirectA(&lf);
|
||||
}
|
||||
|
||||
HFONT WINAPI fake_CreateFontA(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight,
|
||||
DWORD fdwItalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet,
|
||||
DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily,
|
||||
LPCTSTR lpszFace)
|
||||
{
|
||||
fdwQuality = NONANTIALIASED_QUALITY;
|
||||
|
||||
return
|
||||
real_CreateFontA(
|
||||
nHeight, nWidth, nEscapement, nOrientation, fnWeight,
|
||||
fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet,
|
||||
fdwOutputPrecision, fdwClipPrecision, fdwQuality, fdwPitchAndFamily,
|
||||
lpszFace);
|
||||
}
|
||||
|
||||
HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName)
|
||||
{
|
||||
HMODULE hmod = real_LoadLibraryA(lpLibFileName);
|
||||
|
@ -591,6 +618,7 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd)
|
|||
|
||||
if (!FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL))
|
||||
{
|
||||
KillTimer(g_ddraw->hwnd, IDT_TIMER_REDRAW_BNET);
|
||||
g_ddraw->bnet_active = FALSE;
|
||||
SetFocus(g_ddraw->hwnd);
|
||||
mouse_lock();
|
||||
|
@ -617,6 +645,7 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd)
|
|||
dst_height,
|
||||
flags);
|
||||
}
|
||||
}
|
||||
|
||||
g_ddraw->fullscreen = g_ddraw->bnet_was_upscaled;
|
||||
|
||||
|
@ -625,7 +654,6 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd)
|
|||
g_ddraw->resizable = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -649,11 +677,30 @@ HWND WINAPI fake_CreateWindowExA(
|
|||
|
||||
if (!g_ddraw->windowed && !g_ddraw->bnet_was_fullscreen)
|
||||
{
|
||||
int ws = g_config.window_state;
|
||||
util_toggle_fullscreen();
|
||||
g_config.window_state = ws;
|
||||
if ((g_ddraw->render.mode.dmPelsWidth != 640 ||
|
||||
g_ddraw->render.mode.dmPelsHeight != 480) &&
|
||||
GetSystemMetrics(SM_CMONITORS) == 1)
|
||||
{
|
||||
memcpy(&g_ddraw->bnet_mode, &g_ddraw->render.mode, sizeof(DEVMODE));
|
||||
|
||||
g_ddraw->render.mode.dmPelsWidth = 640;
|
||||
g_ddraw->render.mode.dmPelsHeight = 480;
|
||||
ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN);
|
||||
|
||||
g_ddraw->bnet_was_fullscreen = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
real_SetWindowPos(
|
||||
g_ddraw->hwnd,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
g_ddraw->render.width,
|
||||
g_ddraw->render.height + 1,
|
||||
SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING);
|
||||
}
|
||||
}
|
||||
|
||||
real_GetClientRect(g_ddraw->hwnd, &g_ddraw->bnet_win_rect);
|
||||
real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&g_ddraw->bnet_win_rect, 2);
|
||||
|
@ -673,7 +720,9 @@ HWND WINAPI fake_CreateWindowExA(
|
|||
g_ddraw->resizable = FALSE;
|
||||
|
||||
g_ddraw->bnet_active = TRUE;
|
||||
SetTimer(g_ddraw->hwnd, IDT_TIMER_REDRAW_BNET, 200, (TIMERPROC)NULL);
|
||||
mouse_unlock();
|
||||
ReleaseCapture();
|
||||
}
|
||||
|
||||
POINT pt = { 0, 0 };
|
||||
|
@ -684,10 +733,26 @@ HWND WINAPI fake_CreateWindowExA(
|
|||
int align_y = added_height > 0 ? added_height / 2 : 0;
|
||||
int align_x = added_width > 0 ? added_width / 2 : 0;
|
||||
|
||||
X += pt.x + align_x;
|
||||
Y += pt.y + align_y;
|
||||
if (g_ddraw->windowed)
|
||||
{
|
||||
X += align_x;
|
||||
Y += align_y;
|
||||
}
|
||||
else if (GetSystemMetrics(SM_CMONITORS) > 1)
|
||||
{
|
||||
X += min(g_ddraw->render.width / 2 - 640 / 2, added_width);
|
||||
Y += min(g_ddraw->render.height / 2 - 480 / 2, added_height);
|
||||
}
|
||||
|
||||
X += pt.x;
|
||||
Y += pt.y;
|
||||
|
||||
dwStyle |= WS_CLIPCHILDREN;
|
||||
|
||||
if (lpWindowName && !lpWindowName[0])
|
||||
{
|
||||
lpWindowName = "Bnet Lobby";
|
||||
}
|
||||
}
|
||||
|
||||
return real_CreateWindowExA(
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include "dllmain.h"
|
||||
#include "dd.h"
|
||||
#include "hook.h"
|
||||
#include "ddsurface.h"
|
||||
#include "mouse.h"
|
||||
#include "render_d3d9.h"
|
||||
#include "config.h"
|
||||
|
@ -145,16 +146,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||
{
|
||||
KillTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET);
|
||||
|
||||
if (!g_ddraw->windowed)
|
||||
g_ddraw->bnet_was_fullscreen = FALSE;
|
||||
|
||||
if (!g_ddraw->bnet_active)
|
||||
{
|
||||
if (g_ddraw->bnet_was_fullscreen)
|
||||
{
|
||||
int ws = g_config.window_state;
|
||||
util_toggle_fullscreen();
|
||||
g_config.window_state = ws;
|
||||
memcpy(&g_ddraw->render.mode, &g_ddraw->bnet_mode, sizeof(DEVMODE));
|
||||
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
|
||||
g_ddraw->bnet_was_fullscreen = FALSE;
|
||||
}
|
||||
else if (g_ddraw->bnet_was_upscaled)
|
||||
|
@ -166,6 +163,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||
|
||||
return 0;
|
||||
}
|
||||
case IDT_TIMER_REDRAW_BNET:
|
||||
{
|
||||
if (g_ddraw->primary)
|
||||
dds_RedrawBnet(g_ddraw->primary, TRUE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -500,6 +504,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||
if (g_ddraw->renderer != d3d9_render_main)
|
||||
{
|
||||
ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN);
|
||||
real_ShowWindow(g_ddraw->hwnd, SW_RESTORE);
|
||||
mouse_lock();
|
||||
}
|
||||
}
|
||||
|
@ -581,9 +586,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||
|
||||
if (g_ddraw->hotkeys.toggle_fullscreen &&
|
||||
wParam == g_ddraw->hotkeys.toggle_fullscreen &&
|
||||
!g_ddraw->fullscreen &&
|
||||
context_code &&
|
||||
!key_state)
|
||||
!key_state &&
|
||||
g_ddraw->renderer != d3d9_render_main)
|
||||
{
|
||||
util_toggle_fullscreen();
|
||||
return 0;
|
||||
|
|
Loading…
Reference in a new issue