rodecomp/Source/Render/DisplayMode.cpp
ragnarok-clanker b5b4ecd60f Decompile 12 functions in Source/Render/DX7/DirectDrawEnumeration.h, Source/Render/DX7/DirectDrawEnumeration.cpp, ...
Batch #1484 by ragnarok-clanker: 0 byte-identical, 12 confirmed by peer review.

- fn_09780 DirectDrawEnumeration::Devices: logic confirmed by peer review
- fn_09781 DirectDrawEnumeration::DeviceCount: logic confirmed by peer review
- fn_09782 DirectDrawEnumeration::DevicesSeen: logic confirmed by peer review
- fn_09777 DirectDrawEnumeration::Enumerate: logic confirmed by peer review
- fn_09778 DirectDrawEnumeration::Device: logic confirmed by peer review
- fn_09779 DirectDrawEnumeration::Adapter: logic confirmed by peer review
- fn_09783 DirectDrawEnumeration::Mode: logic confirmed by peer review
- fn_09785 DirectDrawEnumeration::ClearModes: logic confirmed by peer review
- fn_02331 EnumerateDisplayModesDX7: logic confirmed by peer review
- fn_02326 EnumerateAdaptersDX7: logic confirmed by peer review
- fn_02291 EnumerateDisplayModes: logic confirmed by peer review
- fn_02283 EnumerateRenderAdapters: logic confirmed by peer review

Reviewed-by: ragnarok-clanker
2026-10-28 16:32:47 +00:00

71 lines
2 KiB
C++

#include "Client/Registry.h"
#include "Render/DeviceSelection.h"
#include "Render/DisplayMode.h"
#include <algorithm>
#include <d3d9.h>
#include <utility>
// OFFSET: 0x0056A590
// FUNCTION: fn_02291
std::vector<DisplayMode> EnumerateDisplayModes(int backend, unsigned deviceIndex) {
if (backend == 1) {
return EnumerateDisplayModesDX7(deviceIndex);
}
if (backend == 2) {
return EnumerateDisplayModesDX9(deviceIndex);
}
return {};
}
// OFFSET: 0x0056DCF0
// FUNCTION: fn_02372
std::vector<DisplayMode> EnumerateDisplayModesDX9(UINT adapter) {
IDirect3D9Ex* direct3D = nullptr;
std::vector<DisplayMode> result;
if (SUCCEEDED(Direct3DCreate9Ex(D3D_SDK_VERSION, &direct3D))) {
const UINT count = direct3D->GetAdapterModeCount(adapter, D3DFMT_X8R8G8B8);
std::vector<std::pair<unsigned, unsigned>> dimensions;
dimensions.reserve(count);
for (UINT index = 0; index < count; ++index) {
D3DDISPLAYMODE mode;
if (SUCCEEDED(direct3D->EnumAdapterModes(adapter, D3DFMT_X8R8G8B8, index, &mode)) && mode.Height >= 664) {
dimensions.emplace_back(mode.Width, mode.Height);
}
}
std::sort(dimensions.begin(), dimensions.end());
dimensions.erase(std::unique(dimensions.begin(), dimensions.end()), dimensions.end());
result.reserve(dimensions.size());
for (const auto& [width, height] : dimensions) {
result.push_back({width, height, 32, std::to_string(width) + " x " + std::to_string(height)});
}
}
if (direct3D) {
direct3D->Release();
}
return result;
}
// OFFSET: 0x0056A7E0
// FUNCTION: fn_02297
LSTATUS SaveDisplayDeviceSettings() {
HKEY key = nullptr;
LSTATUS status = RegCreateKeyExA(HKEY_LOCAL_MACHINE, g_subKey, 0, nullptr, 0, KEY_ALL_ACCESS, nullptr, &key, nullptr);
if (status == ERROR_SUCCESS) {
RegSetValueExA(key, "GUIDDEVICE", 0, REG_BINARY, g_guidDevice, 16);
RegSetValueExA(key, "GUIDDRIVER", 0, REG_BINARY, g_guidDriver, 16);
status = RegSetValueExA(key, "DEVICENAME", 0, REG_SZ, reinterpret_cast<const BYTE*>(g_deviceName), 40);
}
return status;
}