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 |
91 changed files with 4414 additions and 17879 deletions
154
.github/workflows/build.yml
vendored
154
.github/workflows/build.yml
vendored
|
|
@ -1,154 +0,0 @@
|
|||
name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'github-action'
|
||||
|
||||
jobs:
|
||||
Build:
|
||||
runs-on: windows-2019
|
||||
steps:
|
||||
|
||||
# - name: Install Windows XP Support for Visual Studio 2022 # windows-2022 # v141_xp # Installation takes more than 5 minutes
|
||||
# run: |
|
||||
# Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\"
|
||||
# $InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise"
|
||||
# $componentsToAdd = @(
|
||||
# "Microsoft.VisualStudio.Component.WinXP"
|
||||
# )
|
||||
# [string]$workloadArgs = $componentsToAdd | ForEach-Object {" --add " + $_}
|
||||
# $Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache')
|
||||
# $process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden
|
||||
# if ($process.ExitCode -eq 0)
|
||||
# {
|
||||
# Write-Host "components have been successfully added"
|
||||
# Get-ChildItem C:\ProgramData\Microsoft\VisualStudio\Packages\Microsoft.Windows.XPSupport.*
|
||||
# }
|
||||
# else
|
||||
# {
|
||||
# Write-Host "components were not installed"
|
||||
# exit 1
|
||||
# }
|
||||
|
||||
- name: Clone cnc-ddraw
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Release build
|
||||
id: build-release
|
||||
uses: ./
|
||||
with:
|
||||
release: true
|
||||
|
||||
- name: ReleaseXP build
|
||||
id: build-releasexp
|
||||
uses: ./
|
||||
with:
|
||||
releasexp: true
|
||||
|
||||
- name: Debug build
|
||||
id: build-debug
|
||||
uses: ./
|
||||
with:
|
||||
debug: true
|
||||
|
||||
- name: DebugLogXP build
|
||||
id: build-debuglogxp
|
||||
uses: ./
|
||||
with:
|
||||
debuglogxp: true
|
||||
|
||||
- name: DebugLogMiniXP build
|
||||
id: build-debuglogminixp
|
||||
uses: ./
|
||||
with:
|
||||
debuglogminixp: true
|
||||
|
||||
- name: Prepare artifact
|
||||
run: |
|
||||
:
|
||||
|
||||
mkdir -p cnc-ddraw-experimental
|
||||
|
||||
if [[ -f "${{ steps.build-release.outputs.release }}" ]]; then
|
||||
mkdir -p cnc-ddraw-release
|
||||
|
||||
cp "${{ steps.build-release.outputs.release }}" cnc-ddraw-release
|
||||
fi
|
||||
|
||||
if [[ -f "${{ steps.build-releasexp.outputs.releasexp }}" ]]; then
|
||||
mkdir -p cnc-ddraw-releasexp
|
||||
|
||||
cp "${{ steps.build-releasexp.outputs.releasexp }}" cnc-ddraw-releasexp
|
||||
|
||||
rundll32.exe ./cnc-ddraw-releasexp/ddraw.dll, DDIsWindowed
|
||||
|
||||
cp "${{ steps.build-releasexp.outputs.releasexp-pdb }}" cnc-ddraw-experimental
|
||||
7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-release.zip" "./cnc-ddraw-releasexp/ddraw.*"
|
||||
fi
|
||||
|
||||
if [[ -f "${{ steps.build-debug.outputs.debug }}" ]]; then
|
||||
mkdir -p cnc-ddraw-debug
|
||||
|
||||
cp "${{ steps.build-debug.outputs.debug }}" cnc-ddraw-debug
|
||||
cp "${{ steps.build-debug.outputs.debug-pdb }}" cnc-ddraw-debug
|
||||
fi
|
||||
|
||||
if [[ -f "${{ steps.build-debuglogxp.outputs.debuglogxp }}" ]]; then
|
||||
mkdir -p cnc-ddraw-debuglogxp
|
||||
|
||||
cp "${{ steps.build-debuglogxp.outputs.debuglogxp }}" cnc-ddraw-debuglogxp
|
||||
cp "${{ steps.build-debuglogxp.outputs.debuglogxp-pdb }}" cnc-ddraw-debuglogxp
|
||||
|
||||
7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-debuglog.zip" "./cnc-ddraw-debuglogxp/*"
|
||||
fi
|
||||
|
||||
if [[ -f "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" ]]; then
|
||||
mkdir -p cnc-ddraw-debuglogminixp
|
||||
|
||||
cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" cnc-ddraw-debuglogminixp
|
||||
cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp-pdb }}" cnc-ddraw-debuglogminixp
|
||||
fi
|
||||
|
||||
shell: bash
|
||||
|
||||
- name: Upload artifacts cnc-ddraw-release
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: cnc-ddraw-release
|
||||
path: cnc-ddraw-release
|
||||
|
||||
- name: Upload artifacts cnc-ddraw-releasexp
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: cnc-ddraw-releasexp
|
||||
path: cnc-ddraw-releasexp
|
||||
|
||||
- name: Upload artifacts cnc-ddraw-debug
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: cnc-ddraw-debug
|
||||
path: cnc-ddraw-debug
|
||||
|
||||
- name: Upload artifacts cnc-ddraw-debuglogxp
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: cnc-ddraw-debuglogxp
|
||||
path: cnc-ddraw-debuglogxp
|
||||
|
||||
- name: Upload artifacts cnc-ddraw-debuglogminixp
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: cnc-ddraw-debuglogminixp
|
||||
path: cnc-ddraw-debuglogminixp
|
||||
|
||||
- name: Release experimental
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
prerelease: true
|
||||
name: experimental
|
||||
tag_name: experimental
|
||||
files: cnc-ddraw-experimental/*
|
||||
fail_on_unmatched_files: true
|
||||
draft: true
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -1,6 +1,4 @@
|
|||
|
||||
inc/git.h
|
||||
|
||||
# C++ Builder
|
||||
|
||||
__astcache/
|
||||
|
|
|
|||
2
LICENSE
2
LICENSE
|
|
@ -1,6 +1,6 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2022 github.com/FunkyFr3sh
|
||||
Copyright (c) 2020 CnCNet
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
|||
81
Makefile
81
Makefile
|
|
@ -1,48 +1,45 @@
|
|||
-include config.mk
|
||||
|
||||
TARGET ?= ddraw.dll
|
||||
WINDRES ?= windres
|
||||
LDFLAGS = -Iinc -Wall -Wl,--enable-stdcall-fixup -s
|
||||
CFLAGS = -std=c99
|
||||
LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32
|
||||
|
||||
LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared
|
||||
CFLAGS ?= -Iinc -O2 -Wall -std=c99
|
||||
LIBS = -lgdi32 -lwinmm -lole32 -lmsimg32 -lavifil32 -luuid
|
||||
FILES = src/IDirect3D/IDirect3D.c \
|
||||
src/IDirect3D/IDirect3D2.c \
|
||||
src/IDirect3D/IDirect3D3.c \
|
||||
src/IDirect3D/IDirect3D7.c \
|
||||
src/IDirectDraw/IDirectDraw.c \
|
||||
src/IDirectDraw/IDirectDrawPalette.c \
|
||||
src/IDirectDraw/IDirectDrawClipper.c \
|
||||
src/IDirectDraw/IDirectDrawSurface.c \
|
||||
src/IDirectDraw/IDirectDrawGammaControl.c \
|
||||
src/IAMMediaStream/IAMMediaStream.c \
|
||||
src/dd.c \
|
||||
src/ddpalette.c \
|
||||
src/ddsurface.c \
|
||||
src/ddclipper.c \
|
||||
src/render_ogl.c \
|
||||
src/render_gdi.c \
|
||||
src/render_d3d9.c \
|
||||
src/debug.c \
|
||||
src/mouse.c \
|
||||
src/winapi_hooks.c \
|
||||
src/screenshot.c \
|
||||
src/config.c \
|
||||
src/lodepng.c \
|
||||
src/directinput.c \
|
||||
src/hook.c \
|
||||
src/dllmain.c \
|
||||
src/wndproc.c \
|
||||
src/utils.c \
|
||||
src/fps_limiter.c \
|
||||
src/opengl_utils.c
|
||||
|
||||
COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN)
|
||||
BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN)
|
||||
|
||||
HASH := \#
|
||||
ECHOTEST := $(shell echo \"\")
|
||||
ifeq ($(ECHOTEST),\"\")
|
||||
# Windows
|
||||
ECOMMIT := $(shell echo $(HASH)define GIT_COMMIT "$(COMMIT)" > inc/git.h)
|
||||
EBRANCH := $(shell echo $(HASH)define GIT_BRANCH "$(BRANCH)" >> inc/git.h)
|
||||
else
|
||||
# Either *nix or Windows with BusyBox (e.g. w64devkit)
|
||||
ECOMMIT := $(shell echo "$(HASH)define GIT_COMMIT" \"$(COMMIT)\" > inc/git.h)
|
||||
EBRANCH := $(shell echo "$(HASH)define GIT_BRANCH" \"$(BRANCH)\" >> inc/git.h)
|
||||
endif
|
||||
|
||||
ifdef DEBUG
|
||||
CFLAGS += -D _DEBUG -D _DEBUG_X
|
||||
endif
|
||||
|
||||
ifdef _WIN32_WINNT
|
||||
CFLAGS += -march=i486 -D _WIN32_WINNT=$(_WIN32_WINNT)
|
||||
endif
|
||||
|
||||
CC = i686-w64-mingw32-gcc
|
||||
WINDRES ?= i686-w64-mingw32-windres
|
||||
|
||||
SRCS := $(wildcard src/*.c) $(wildcard src/*/*.c) res.rc
|
||||
OBJS := $(addsuffix .o, $(basename $(SRCS)))
|
||||
|
||||
.PHONY: clean all
|
||||
all: $(TARGET)
|
||||
|
||||
%.o: %.rc
|
||||
$(WINDRES) -J rc $< $@ || windres -J rc $< $@
|
||||
|
||||
$(TARGET): $(OBJS)
|
||||
$(CC) $(LDFLAGS) -o $@ $^ exports.def $(LIBS)
|
||||
all:
|
||||
$(WINDRES) -J rc ddraw.rc ddraw.rc.o
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS)
|
||||
# $(CC) $(CFLAGS) $(LDFLAGS) -nostdlib -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) -lkernel32 -luser32 -lmsvcrt
|
||||
|
||||
clean:
|
||||
$(RM) $(TARGET) $(OBJS) || del $(TARGET) $(subst /,\\,$(OBJS))
|
||||
$(RM) ddraw.dll ddraw.rc.o
|
||||
|
|
|
|||
506
README.md
506
README.md
|
|
@ -1,11 +1,11 @@
|
|||
# cnc-ddraw
|
||||
cnc-ddraw can fix compatibility issues in older 2D games, such as black screen, bad performance, crashes or defective Alt+Tab. It does also add new features such as borderless mode, windowed mode and upscaling via shaders.
|
||||
cnc-ddraw can fix compatibility issues in older games, such as black screen, bad performance, crashes or defective Alt+Tab.
|
||||
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
- Supports Windows ME, 2000, XP, Vista, 7, 8, 10, 11, Wine (Linux/macOS/Android) and Virtual Machines
|
||||
- Supports Windows XP, Vista, 7, 8, 10, 11 and Wine
|
||||
- GDI / OpenGL / Direct3D 9 renderer (With automatic renderer selection)
|
||||
- Upscaling via glsl shaders - https://imgur.com/a/kxsM1oY | https://imgur.com/a/wjrhpFV
|
||||
- Windowed Mode / Fullscreen Exclusive Mode / Borderless Mode
|
||||
|
|
@ -21,19 +21,37 @@ cnc-ddraw can fix compatibility issues in older 2D games, such as black screen,
|
|||
|
||||
### Instructions
|
||||
|
||||
1. Download [cnc-ddraw.zip](https://github.com/FunkyFr3sh/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) and extract it into your game folder
|
||||
1. Download [cnc-ddraw.zip](https://github.com/CnCNet/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) and extract it into your game folder
|
||||
2. Start the game
|
||||
|
||||
Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) manually or run `cnc-ddraw config.exe` once.
|
||||
|
||||
Note: If you use cnc-ddraw with a game that got its own windowed mode built in then **make sure you disable the games own windowed mode** first.
|
||||
|
||||
If you want to play in windowed mode then start the game once in fullscreen and then press Alt+Enter to enable the cnc-ddraw windowed mode (Or enable windowed mode in the config program without using Alt+Enter).
|
||||
|
||||
|
||||
|
||||
**Important**
|
||||
**If the game starts but it doesn't work perfectly** then open the config program and check the **Compatibility settings**. Alternatively you can also open ddraw.ini with notepad and modify the **Compatibility settings** in there.
|
||||
|
||||
- **The game must be set to fullscreen**. To enable windowed mode, use `cnc-ddraw config.exe` instead
|
||||
- **cnc-ddraw does not support Direct3D games**, the game must have a **DirectDraw (Software)** renderer
|
||||
- **If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/FunkyFr3sh/cnc-ddraw/issues/44)
|
||||
- Some games require additional steps before they can be used with cnc-ddraw, check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) for details
|
||||
|
||||
|
||||
**Compatibility settings in ddraw.ini**
|
||||
|
||||
- If there are **problems on Alt+Tab** then try to set `noactivateapp=true` - If it still doesn't work also try `renderer=opengl` or `renderer=gdi`.
|
||||
|
||||
- If the **game is running too fast** then try to set `maxgameticks=60` - If it's still too fast, try a lower value.
|
||||
|
||||
- If **windowed mode or upscaling are not working properly** then try to set `hook=2` and `renderer=gdi`.
|
||||
|
||||
- If **videos or other UI elements are invisible** then try to set `nonexclusive=true`.
|
||||
|
||||
- If some parts of the screen are **being displayed diagonally** then try to set `fixpitch=true`.
|
||||
|
||||
- If the game is **stuttering on a Freesync/G-Sync monitor** then try to set `minfps=-1`.
|
||||
|
||||
|
||||
|
||||
**If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/CnCNet/cnc-ddraw/issues/44)
|
||||
|
||||
|
||||
|
||||
|
|
@ -41,451 +59,37 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
|
|||
* [Alt] + [Enter] = Switch between windowed and fullscreen mode
|
||||
* [Ctrl] + [Tab] = Unlock cursor
|
||||
* [Right Alt] + [Right Ctrl] = Unlock cursor
|
||||
* [Alt] + [Page Down] = Maximize window
|
||||
|
||||
|
||||
|
||||
### Supported Games
|
||||
- 101: The Airborne Invasion of Normandy
|
||||
- 7th Legion
|
||||
- Abomination - The Nemesis Project
|
||||
- Addiction Pinball
|
||||
- Age of Empires
|
||||
- Age of Empires II
|
||||
- Age of Empires II: The Conquerors
|
||||
- Age of Empires: The Rise of Rome
|
||||
- Age of Wonders
|
||||
- Age of Wonders 2
|
||||
- Age of Wonders: Shadow Magic
|
||||
- Agharta the Hollow Earth
|
||||
- Airline 69: Return to Casablanca
|
||||
- Airline Tycoon Deluxe
|
||||
- Alien Nations
|
||||
- American Conquest (Steam+GOG)
|
||||
- American Girls Dress Designer
|
||||
- Amerzone
|
||||
- Ancient Conquest
|
||||
- Ancient Evil
|
||||
- Anno 1602: Creation of a New World
|
||||
- Another War
|
||||
- Anstoss 3
|
||||
- Arcanum: Of Steamworks and Magick Obscura
|
||||
- Arcatera the Dark Brotherhood
|
||||
- Army Men 2
|
||||
- Army Men: Air Tactics
|
||||
- Army Men: Toys in Space
|
||||
- Army Men: World War / Army Men: Operation Meltdown
|
||||
- Arthur's Pet Chase
|
||||
- Arthur's Sand Castle Contest
|
||||
- Arthur's Wilderness Rescue
|
||||
- Atlantis 2: Beyond Atlantis
|
||||
- Atlantis 3: The New World
|
||||
- Atlantis: The Lost Tales
|
||||
- Atomic Bomberman
|
||||
- Atrox
|
||||
- Baldr Force EXE
|
||||
- Baldur's Gate
|
||||
- Baldur's Gate 2
|
||||
- Balls of Steel v1.2
|
||||
- Barbie(R) Photo Designer
|
||||
- Barbie(tm) Beach Vacation(tm)
|
||||
- Batman: Justice Unbalanced
|
||||
- Batman: Toxic Chill
|
||||
- Bejeweled 2 Deluxe
|
||||
- Birthright: The Gorgons Alliance
|
||||
- Blade & Sword
|
||||
- Blood II - The Chosen
|
||||
- Blue's 123 Time Activities
|
||||
- Blue's Treasure Hunt
|
||||
- Broken Sword
|
||||
- Broken Sword 2: The Smoking Mirror
|
||||
- Caesar III (Sierra - 1998)
|
||||
- Call To Power 2
|
||||
- Callus 95 - CPS-1 (Capcom Play System 1) emulator
|
||||
- Capitalism II
|
||||
- Capitalism Lab
|
||||
- Captain Claw
|
||||
- Carmageddon
|
||||
- Carmageddon 2
|
||||
- Casino Empire (AKA Hoyle Casino)
|
||||
- Championship Manager 99-00
|
||||
- Chaos Gate
|
||||
- Clans
|
||||
- Close Combat 2: A Bridge Too Far
|
||||
- Close Combat 3: The Russian Front
|
||||
- Close Combat 4: The Battle of the Bulge
|
||||
- Close Combat 5: Invasion: Normandy
|
||||
- ClueFinders 3rd Grade Adventures
|
||||
- ClueFinders 4th Grade Adventures
|
||||
- ClueFinders 5th Grade Adventures
|
||||
- ClueFinders 6th Grade Adventures
|
||||
- ClueFinders Math Adventures 1.0
|
||||
- ClueFinders Math Adventures 2.0
|
||||
- ClueFinders Mystery Mansion
|
||||
- ClueFinders Search and Solve Adventures
|
||||
- ClueFinders The Incredible Toy Store Adventure
|
||||
- ClueFinders(R) Reading Adventures Ages 9-12
|
||||
- Command & Conquer Gold
|
||||
- Command & Conquer: Red Alert
|
||||
- Command & Conquer: Red Alert 2
|
||||
- Command & Conquer: Red Alert 2: Yuri's Revenge
|
||||
- Command & Conquer: Sole Survivor
|
||||
- Command & Conquer: Tiberian Sun
|
||||
- Commandos
|
||||
- Commandos - Beyond The Call Of Duty
|
||||
- Commandos 2
|
||||
- Commando 2004 (only with /ddraw command line parameter)
|
||||
- Constructor
|
||||
- Corsairs Gold
|
||||
- Cossacks (Steam+GOG)
|
||||
- Cultures - The Discovery of Vinland
|
||||
- Cultures 2
|
||||
- Cyber Gladiators (needs CyberGladiators_Patch_Win_EN_WinXP.zip)
|
||||
- Cyberchase Carnival Chaos
|
||||
- Cyberchase Castleblanca Quest
|
||||
- Cydonia Mars - The First Manned Mission
|
||||
- Cloud Kingdom 3 (only with /ddraw command line parameter)
|
||||
- Dark Earth
|
||||
- Dark Reign: The Future of War
|
||||
- Dark Secret of Africa
|
||||
- Day Of The Tentacle
|
||||
- Daytona
|
||||
- Daytona USA (Sega - 1996)
|
||||
- Deadlock 2
|
||||
- Deadly Tide
|
||||
- Delta Force
|
||||
- Desperados: Wanted Dead or Alive
|
||||
- Diablo
|
||||
- Diablo 2
|
||||
- Diablo 2: Lord of Destruction
|
||||
- Diablo: Hellfire
|
||||
- Die by the Sword
|
||||
- Disciples
|
||||
- Disciples 2 - Rise of the Elves
|
||||
- Discoworld Noir
|
||||
- Divine Divinity
|
||||
- Dominion - Storm Over Gift 3
|
||||
- Doom 95
|
||||
- Dracula
|
||||
- Dragon Throne: Battle of Red Cliffs
|
||||
- Dreams to Realty
|
||||
- DuelSavior
|
||||
- DuelSavior: Justice
|
||||
- Dune 2000
|
||||
- Dungeon Keeper
|
||||
- Dungeon Keeper 2
|
||||
- Economic War
|
||||
- Eggsucker
|
||||
- Emperor: Rise of the Middle Kingdom
|
||||
- Enemy Infestation
|
||||
- Escape Velocity Nova
|
||||
- Excalibur 2555AD
|
||||
- F-16 Agressor
|
||||
- F-16 Multirole Fighter
|
||||
- F-22 Raptor
|
||||
- Fable
|
||||
- Fairy Tale About Father Frost, Ivan and Nastya
|
||||
- Falcon 4.0 (Microprose version)
|
||||
- Fallout
|
||||
- Fallout 2
|
||||
- Fallout Tactics: Brotherhood of Steel
|
||||
- Final fantasy VII
|
||||
- Final fantasy VIII
|
||||
- Final Liberation: Warhammer Epic 40000 (GOG)
|
||||
- Freddi Fish
|
||||
- Freddi Fish 4
|
||||
- Freddi Fish's One-Stop Fun Shop
|
||||
- Freddi Fish: Maze Madness
|
||||
- Freddi Fish: The Case of the Creature of Coral Cove
|
||||
- Freddi Fish: The Case of the Haunted Schoolhouse
|
||||
- Freddi Fish: The Case of the Hogfish Rustlers of Briny Gulch
|
||||
- Freddi Water Worries
|
||||
- Full Throttle
|
||||
- Future Cop L.A.P.D
|
||||
- G-Police
|
||||
- Gateway (Remake)
|
||||
- Geneforge
|
||||
- Gilbert Goodmate And The Mushroom Of Phungoria
|
||||
- Gorasul: The Legacy of the Dragon
|
||||
- Grand Theft Auto
|
||||
- Grand Theft Auto: London 1961
|
||||
- Grand Theft Auto: London 1969
|
||||
- Gromada Revenge
|
||||
- Gruntz
|
||||
- Hamtaro: Wake Up Snoozer!
|
||||
- Handkerchief
|
||||
- Hard Truck: Road to Victory
|
||||
- Heart of Darkness
|
||||
- Hearts of Iron 2
|
||||
- Heroes Chronicles: Clash of the Dragons
|
||||
- Heroes Chronicles: Conquest of the Underworld
|
||||
- Heroes Chronicles: Masters of the Elements
|
||||
- Heroes Chronicles: Warlords of the Wasteland
|
||||
- Heroes of Might and Magic
|
||||
- Heroes of Might and Magic II
|
||||
- Heroes of Might and Magic III
|
||||
- Heroes of Might and Magic IV
|
||||
- Hexen 95
|
||||
- Hooligans: Storm over Europe
|
||||
- Hugo Gold
|
||||
- Hugo Wild River
|
||||
- Icewind Dale
|
||||
- Icewind Dale 2
|
||||
- Ignition
|
||||
- Imperialism 2: The Age of Exploration
|
||||
- Indiana Jones and the Fate of Atlantis
|
||||
- Indiana Jones and the Last Crusade
|
||||
- Infantry Online
|
||||
- Interstate 76
|
||||
- Invictus: In the Shadow of Olympus
|
||||
- Jagged Alliance 2
|
||||
- Jagged Alliance 2: Unfinished Business
|
||||
- Jagged Alliance 2: Wildfire
|
||||
- Jazz Jackrabbit 2
|
||||
- Jeff Wayne's The War of the Worlds
|
||||
- Karma Immortal Wrath
|
||||
- Killing Time
|
||||
- Kings Quest 8: Mask of Eternity
|
||||
- KKND Xtreme
|
||||
- KKND2: Krossfire
|
||||
- Knights and Merchants: The Peasants Rebellion
|
||||
- Knights and Merchants: The Shattered Kingdom
|
||||
- Kohan: Immortal Sovereigns
|
||||
- Konung
|
||||
- Konung 2
|
||||
- Lands of Lore 2 Guardian of Destiny (Software mode only)
|
||||
- Lapis (lapis.mgame.com)
|
||||
- Last Bronx
|
||||
- Links Extreme
|
||||
- Lionheart - Legacy of the Crusader
|
||||
- Little Bear Kindergarten Thinking Adventures
|
||||
- Little Bear Preschool Thinking Adventures
|
||||
- Little Bear Rainy Day Activities
|
||||
- Little Bear Toddler Discovery Adventures
|
||||
- Locomotion
|
||||
- Lode Runner 2
|
||||
- Lost Vikings 2
|
||||
- M.A.X. 2 Mechanized Assault & Exploration
|
||||
- Madeline 1st Grade Math
|
||||
- Madeline 2nd Grade Math
|
||||
- Mageslayer
|
||||
- Majesty Gold
|
||||
- Majesty Gold HD
|
||||
- Mario Sorb 3
|
||||
- Meat Puppet
|
||||
- Mech Warrior 3
|
||||
- Megaman X4
|
||||
- Metal Gear Solid
|
||||
- Metal Knight
|
||||
- Mob Rule (AKA Constructor: Street Wars / Street Wars: Constructor Underworld)
|
||||
- Moorhuhn
|
||||
- Moorhuhn 2
|
||||
- Moorhuhn Adventure: Fluch des Goldes
|
||||
- Moorhuhn Adventure: Schatz des Pharao and Fluch des Goldes)
|
||||
- Moorhuhn Winter Editon
|
||||
- MiG-29 Fulcrum
|
||||
- Mission Deliver Kindness
|
||||
- Moto Racer
|
||||
- Moto Racer 2
|
||||
- Nancy Drew: Danger on Deception Island
|
||||
- Nancy Drew: Last Train to Blue Moon Canyon
|
||||
- Nancy Drew: Message in a Haunted Mansion
|
||||
- Nancy Drew: Secrets Can Kill
|
||||
- Nancy Drew: Stay Tuned For Danger
|
||||
- Nancy Drew: The Secret of Shadow Ranch
|
||||
- Nancy Drew: Treasure in the Royal Tower
|
||||
- NBA Action '98
|
||||
- NBA Full Court Press
|
||||
- Need For Speed III: Hot Pursuit
|
||||
- Need For Speed: High Stakes
|
||||
- Neo Sonic Universe
|
||||
- New Robinson
|
||||
- NexusTk
|
||||
- Nightmare Creatures
|
||||
- Ninja Jonder Deluxe
|
||||
- Nox (Westwood - 2000)
|
||||
- Oddworld: Abe's Exoddus
|
||||
- Oddworld: Abe's Oddysee
|
||||
- Original War
|
||||
- Outlaws
|
||||
- Outlive
|
||||
- Outwars (software mode)
|
||||
- Pacific General
|
||||
- Pajama Sam
|
||||
- Pajama Sam 3
|
||||
- Pajama Sam 3: You Are What You Eat From Your Head To Your Feet
|
||||
- Pajama Sam's Games to Play on Any Day
|
||||
- Pajama Sam's One-Stop Fun Shop
|
||||
- Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm)
|
||||
- Pajama Sam: No Need to Hide When It's Dark Outside
|
||||
- Pandora's Box Puzzle Game
|
||||
- Panzer Dragoon
|
||||
- Patrician 3
|
||||
- Pax Imperia
|
||||
- Pharaoh (Sierra - 1999)
|
||||
- Pizza Syndicate (AKA Fast Food Tycoon)
|
||||
- Platypus
|
||||
- Populous: The Beginning
|
||||
- Poseidon: Master of Atlantis
|
||||
- Pro Pinball - Big Race USA
|
||||
- Pro Pinball - Fantastic Journey
|
||||
- Putt-Putt and Pep's Balloon-o-Rama
|
||||
- Putt-Putt and Pep's Dog On A Stick
|
||||
- Putt-Putt Joins the Circus
|
||||
- Putt-Putt Saves The Zoo
|
||||
- Putt-Putt's One-Stop Fun Shop
|
||||
- Putt-Putt: Pep's Birthday Surprise
|
||||
- Putt-Putt: Travels Through Time
|
||||
- Quest for Glory 5
|
||||
- Rage of Mages
|
||||
- Rage of Mages 2
|
||||
- Railroad Tycoon II
|
||||
- Reader Rabbit 1st Grade
|
||||
- Reader Rabbit 2nd Grade
|
||||
- Reader Rabbit Dreamship Tales
|
||||
- Reader Rabbit Kindergarten
|
||||
- Reader Rabbit Learn To Read With Phonics
|
||||
- Reader Rabbit Learning Creations
|
||||
- Reader Rabbit Math Ages 4-6
|
||||
- Reader Rabbit Preschool 2002
|
||||
- Reader Rabbit Reading Ages 4-6
|
||||
- Reader Rabbit Reading Ages 6-9
|
||||
- Reader Rabbit Thinking Ages 4-6 (US)
|
||||
- Reader Rabbit Toddler
|
||||
- Reader Rabbit's(R) Math Ages 6 - 9 (2002)
|
||||
- Real War
|
||||
- Red Baron 3D
|
||||
- Reksio and Captain Nemo (Reksio i Kapitan Nemo)
|
||||
- Reksio and Kretes in Action (Reksio i Kretes w Akcji!)
|
||||
- Reksio and the Pirate Treasure (Reksio i Skarb Piratów)
|
||||
- Reksio and the Time Machine (Reksio i Wehikuł Czasu)
|
||||
- Reksio and the UFO (Reksio i Ufo)
|
||||
- Reksio and the Wizards (Reksio i Czarodzieje)
|
||||
- Rent-A-Hero
|
||||
- Resurrection - The Return of the Black Dragon (software mode)
|
||||
- Return to Krondor
|
||||
- Rising Lands (patched)
|
||||
- Road Rash
|
||||
- Robin Hood - The Legend of Sherwood
|
||||
- Roland Garros 98 (software mode)
|
||||
- RollerCoaster Tycoon
|
||||
- Sanitarium
|
||||
- Scooby-Doo(TM), Case File #2 The Scary Stone Dragon
|
||||
- Scooby-Doo(TM), Phantom of the Knight(TM)
|
||||
- Scooby-Doo(TM), Showdown in Ghost Town(TM)
|
||||
- Sega Rally
|
||||
- Sega Touring Car
|
||||
- Septerra Core
|
||||
- Settlers 3
|
||||
- Seven Kingdoms II
|
||||
- Shadow Flare
|
||||
- Shadow Watch
|
||||
- Shogo - Mobile Armor Division
|
||||
- Silver (needs "SilverUK GeForce2 And Radeon Patch")
|
||||
- Sim City 3000
|
||||
- Sim Copter
|
||||
- SimTunes
|
||||
- Sim Theme Park (aka Theme Park World)
|
||||
- SimCoaster / Theme Park Inc
|
||||
- Simon the Sorcerer 1/2 (windows 95 version)
|
||||
- Sonic 3D Blast
|
||||
- Soldiers At War
|
||||
- Space Rangers
|
||||
- Spec Ops - Ranger Assault (software mode)
|
||||
- SpongeBob SquarePants: Typing
|
||||
- SPY Fox : Some Assembly Required
|
||||
- SPY Fox in Dry Cereal
|
||||
- SPY Fox: Hold the Mustard
|
||||
- SPY Fox: Operation Ozone
|
||||
- Squad Leader
|
||||
- Star Trek Away Team
|
||||
- Star Trek Generations
|
||||
- Star Wars Anakin's Speedway
|
||||
- Star Wars Early Learning Activity Center
|
||||
- Star Wars Episode I: The Gungan Frontier
|
||||
- Star Wars Jedi Knight: Dark Forces II
|
||||
- Star Wars Rebellion
|
||||
- Star Wars Yoda's Challenge
|
||||
- Star Wars: Droid Works
|
||||
- Star Wars: Galactic Battlegrounds
|
||||
- Star Wars: Galactic Battlegrounds: Clone Campaigns
|
||||
- Star Wars: Pit Droids
|
||||
- StarCraft
|
||||
- StarCraft: Broodwars
|
||||
- StarFlyers Alien Space Chase
|
||||
- StarFlyers Royal Jewel Rescue
|
||||
- Starship Titanic
|
||||
- Start Trek Armada
|
||||
- Steel Panthers: World At War
|
||||
- Strawberry Shortcake: Amazing Cookie Party
|
||||
- Stronghold Crusader Extreme HD
|
||||
- Stronghold Crusader HD
|
||||
- Stronghold HD
|
||||
- Sudden Strike 2
|
||||
- Superbike 2000
|
||||
- Swarog
|
||||
- The Jungle Book Groove Party
|
||||
- The Curse Of Monkey Island
|
||||
- The Dig
|
||||
- The Last Express
|
||||
- The Missing on Lost Island
|
||||
- The Neverhood
|
||||
- The Next Worlds
|
||||
- The Powerpuff Girls - Princess Snorebucks
|
||||
- The Powerpuff Girls(TM) Mojo Jojo's Clone Zone
|
||||
- The Rocky Interactive Horror Show
|
||||
- The Sex Files
|
||||
- The X-Files DVD
|
||||
- Theme Hospital
|
||||
- Three Kingdoms: Fate of the Dragon
|
||||
- Throne of Darkness
|
||||
- Thunder Brigade
|
||||
- TianLong BaBu
|
||||
- Tone Rebellion
|
||||
- Total Annihilation
|
||||
- Total Annihilation (Unofficial Beta Patch v3.9.02)
|
||||
- Total Annihilation: Kingdoms
|
||||
- Toy Story
|
||||
- Tridonis
|
||||
- Twisted Metal
|
||||
- Twisted Metal 2
|
||||
- Tzar: The Burden of the Crown
|
||||
- Unreal
|
||||
- Uprising 2: Lead and Destroy
|
||||
- Uprising: Join or Die
|
||||
- Vermeer
|
||||
- Virtua Cop
|
||||
- Virtua Cop 2
|
||||
- Virtua Fighter 2
|
||||
- Virtua Fighter PC
|
||||
- Virtual Springfield
|
||||
- Virtual On: Cyber Troopers
|
||||
- WarGames
|
||||
- War Wind
|
||||
- War Wind II - Human Onslaught
|
||||
- Warcraft 2
|
||||
- WarCraft 2000: Nuclear Epidemic
|
||||
- Warlords 3: Darklords Rising
|
||||
- Warlords Battlecry
|
||||
- Warlords Battlecry 2
|
||||
- Warlords Battlecry 3
|
||||
- Weird War
|
||||
- Wheel Of Fortune
|
||||
- Wing Commander - The Kilrathi Saga
|
||||
- Wizardry 8
|
||||
- Wizards and Warriors
|
||||
- Worms 2
|
||||
- Worms Armageddon
|
||||
- Z & Z Expansion Kit
|
||||
- Zeus: Master of Olympus
|
||||
- Zoombinis Island Odyssey
|
||||
- Zoombinis Logical Journey
|
||||
- Zoombinis Mountain Rescue
|
||||
- Zork Nemesis
|
||||
- Zuma Deluxe
|
||||
- ...
|
||||
|
||||
There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) and the instructions above.
|
||||
- Command & Conquer Gold
|
||||
- Command & Conquer: Red Alert
|
||||
- Command & Conquer: Tiberian Sun
|
||||
- Command & Conquer: Red Alert 2
|
||||
- Carmageddon
|
||||
- Carmageddon 2
|
||||
- Warcraft 2
|
||||
- StarCraft
|
||||
- Diablo
|
||||
- Diablo 2
|
||||
- Age of Empires
|
||||
- Age of Empires II
|
||||
- Theme Hospital
|
||||
- Populous: The Beginning
|
||||
- Outlaws
|
||||
- Dungeon Keeper
|
||||
- Dark Reign: The Future of War
|
||||
- Star Wars: Galactic Battlegrounds
|
||||
- Atomic Bomberman
|
||||
- Dune 2000
|
||||
- Oddworld: Abe's Oddysee
|
||||
- Commandos
|
||||
- Red Baron 3D
|
||||
- F-16 Multirole Fighter
|
||||
- F-22 Raptor
|
||||
- Nox
|
||||
- ...
|
||||
|
||||
|
||||
[](https://github.com/FunkyFr3sh/cnc-ddraw/releases/latest/download/cnc-ddraw.zip)
|
||||
There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the instructions above.
|
||||
|
|
|
|||
211
action.yml
211
action.yml
|
|
@ -1,211 +0,0 @@
|
|||
#name: 'sfall'
|
||||
#description: 'Builds sfall binaries'
|
||||
#author: '@wipe2238'
|
||||
|
||||
###
|
||||
#
|
||||
# Example:
|
||||
#
|
||||
# - name: Build sfall
|
||||
# id: sfall
|
||||
# uses: phobos2077/sfall@develop
|
||||
# with:
|
||||
# release-xp: true
|
||||
#
|
||||
# - name: Copy sfall to mod directory
|
||||
# run: copy "${{ steps.sfall.outputs.release-xp }}" "my/mod/directory/ddraw.dll"
|
||||
#
|
||||
###
|
||||
|
||||
# While both inputs are marked as required, users needs to set only one of them (at minimum) to 'true' for action to work
|
||||
inputs:
|
||||
|
||||
release:
|
||||
description: 'Set to true to enable building with Release configuration'
|
||||
required: true
|
||||
|
||||
releasexp:
|
||||
description: 'Set to true to enable building with ReleaseXP configuration'
|
||||
required: true
|
||||
|
||||
debug:
|
||||
description: 'Set to true to enable building with Debug configuration'
|
||||
required: true
|
||||
|
||||
debuglogxp:
|
||||
description: 'Set to true to enable building with DebugLogXP configuration'
|
||||
required: true
|
||||
|
||||
debuglogminixp:
|
||||
description: 'Set to true to enable building with DebugLogMiniXP configuration'
|
||||
required: true
|
||||
|
||||
# Outputs are always using Windows directory separator (`\`)
|
||||
outputs:
|
||||
|
||||
release:
|
||||
description: 'Full path to ddraw.dll built with Release configuration'
|
||||
value: ${{ steps.build-release.outputs.ddraw-dll }}
|
||||
release-pdb:
|
||||
description: 'Full path to ddraw.pdb built with Release configuration'
|
||||
value: ${{ steps.build-release.outputs.ddraw-pdb }}
|
||||
|
||||
releasexp:
|
||||
description: 'Full path to ddraw.dll built with ReleaseXP configuration'
|
||||
value: ${{ steps.build-releasexp.outputs.ddraw-dll }}
|
||||
releasexp-pdb:
|
||||
description: 'Full path to ddraw.pdb built with ReleaseXP configuration'
|
||||
value: ${{ steps.build-releasexp.outputs.ddraw-pdb }}
|
||||
|
||||
debug:
|
||||
description: 'Full path to ddraw.dll built with Debug configuration'
|
||||
value: ${{ steps.build-debug.outputs.ddraw-dll }}
|
||||
debug-pdb:
|
||||
description: 'Full path to ddraw.pdb built with Debug configuration'
|
||||
value: ${{ steps.build-debug.outputs.ddraw-pdb }}
|
||||
|
||||
debuglogxp:
|
||||
description: 'Full path to ddraw.dll built with DebugLogXP configuration'
|
||||
value: ${{ steps.build-debuglogxp.outputs.ddraw-dll }}
|
||||
debuglogxp-pdb:
|
||||
description: 'Full path to ddraw.pdb built with DebugLogXP configuration'
|
||||
value: ${{ steps.build-debuglogxp.outputs.ddraw-pdb }}
|
||||
|
||||
debuglogminixp:
|
||||
description: 'Full path to ddraw.dll built with DebugLogMiniXP configuration'
|
||||
value: ${{ steps.build-debuglogminixp.outputs.ddraw-dll }}
|
||||
debuglogminixp-pdb:
|
||||
description: 'Full path to ddraw.pdb built with DebugLogMiniXP configuration'
|
||||
value: ${{ steps.build-debuglogminixp.outputs.ddraw-pdb }}
|
||||
|
||||
runs:
|
||||
using: 'composite'
|
||||
steps:
|
||||
|
||||
# Quick check for things which should never happen
|
||||
- name: Sanity checks
|
||||
run: |
|
||||
if [[ "${{ runner.os }}" != "Windows" ]]; then
|
||||
echo "[ERROR] This action can only be used on Windows"
|
||||
exit 1
|
||||
elif [[ "${{ inputs.release }}" != "true" ]] && [[ "${{ inputs.releasexp }}" != "true" ]] && [[ "${{ inputs.debug }}" != "true" ]] && [[ "${{ inputs.debuglogxp }}" != "true" ]] && [[ "${{ inputs.debuglogminixp }}" != "true" ]]; then
|
||||
echo "[ERROR] At least one of following inputs must be set to 'true' -- 'release', 'releasexp', 'debug', 'debuglogxp', 'debuglogminixp'"
|
||||
exit 1
|
||||
#
|
||||
elif [[ ! -f "$(cygpath --unix "$GITHUB_ACTION_PATH/cnc-ddraw.sln")" ]]; then
|
||||
echo "[ERROR] Solution file not found -- '\\cnc-ddraw.sln'"
|
||||
exit 1
|
||||
fi
|
||||
#
|
||||
shell: bash
|
||||
|
||||
# MSBuild is not in PATH on Windows machines
|
||||
# Using `::set-output` to make sure workflow environment remains unchanged
|
||||
- name: Prepare MSBuild
|
||||
id: msbuild
|
||||
run: |
|
||||
echo "::group::Prepare MSBuild"
|
||||
|
||||
MSBUILD_EXE="$("/c/Program Files (x86)/Microsoft Visual Studio/Installer/vswhere.exe" -latest -requires Microsoft.Component.MSBuild -find MSBuild/**/Bin/MSBuild.exe)"
|
||||
echo "exe=$MSBUILD_EXE" >> $GITHUB_OUTPUT
|
||||
|
||||
echo "::endgroup::"
|
||||
shell: bash
|
||||
|
||||
# Creating empty `PostBuild.cmd` to avoid false-positive build error
|
||||
- name: Build Release
|
||||
id: build-release
|
||||
run: |
|
||||
if false; then
|
||||
#if [[ "${{ inputs.release }}" == "true" ]]; then
|
||||
echo ::group::Build Release
|
||||
|
||||
#
|
||||
# echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd"
|
||||
"${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Release -p:Platform=x86 -p:PlatformToolset=v142
|
||||
#
|
||||
echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Release/ddraw.dll")" >> $GITHUB_OUTPUT
|
||||
echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Release/ddraw.pdb")" >> $GITHUB_OUTPUT
|
||||
|
||||
echo "::endgroup::"
|
||||
fi
|
||||
shell: bash
|
||||
|
||||
# Creating empty `PostBuild.cmd` to avoid false-positive build error
|
||||
- name: Build ReleaseXP
|
||||
id: build-releasexp
|
||||
run: |
|
||||
#if false; then
|
||||
if [[ "${{ inputs.releasexp }}" == "true" ]]; then
|
||||
echo ::group::Build ReleaseXP
|
||||
|
||||
#
|
||||
# echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd"
|
||||
"${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=ReleaseXP -p:Platform=x86 -p:PlatformToolset=v141_xp
|
||||
#
|
||||
echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/ReleaseXP/ddraw.dll")" >> $GITHUB_OUTPUT
|
||||
echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/ReleaseXP/ddraw.pdb")" >> $GITHUB_OUTPUT
|
||||
|
||||
echo "::endgroup::"
|
||||
fi
|
||||
shell: bash
|
||||
|
||||
# Creating empty `PostBuild.cmd` to avoid false-positive build error
|
||||
- name: Build Debug
|
||||
id: build-debug
|
||||
run: |
|
||||
:
|
||||
if false; then
|
||||
#if [[ "${{ inputs.debug }}" == "true" ]]; then
|
||||
echo "::group::Build Debug"
|
||||
|
||||
#
|
||||
# echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd"
|
||||
"${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Debug -p:Platform=x86 -p:PlatformToolset=v142
|
||||
#
|
||||
echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.dll")" >> $GITHUB_OUTPUT
|
||||
echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.pdb")" >> $GITHUB_OUTPUT
|
||||
|
||||
echo "::endgroup::"
|
||||
fi
|
||||
shell: bash
|
||||
|
||||
# Creating empty `PostBuild.cmd` to avoid false-positive build error
|
||||
- name: Build DebugLogXP
|
||||
id: build-debuglogxp
|
||||
run: |
|
||||
:
|
||||
#if false; then
|
||||
if [[ "${{ inputs.debuglogxp }}" == "true" ]]; then
|
||||
echo "::group::Build DebugLogXP"
|
||||
|
||||
#
|
||||
# echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd"
|
||||
"${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLogXP -p:Platform=x86 -p:PlatformToolset=v141_xp
|
||||
#
|
||||
echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogXP/ddraw.dll")" >> $GITHUB_OUTPUT
|
||||
echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogXP/ddraw.pdb")" >> $GITHUB_OUTPUT
|
||||
|
||||
echo "::endgroup::"
|
||||
fi
|
||||
shell: bash
|
||||
|
||||
# Creating empty `PostBuild.cmd` to avoid false-positive build error
|
||||
- name: Build DebugLogMiniXP
|
||||
id: build-debuglogminixp
|
||||
run: |
|
||||
:
|
||||
if false; then
|
||||
#if [[ "${{ inputs.debuglogminixp }}" == "true" ]]; then
|
||||
echo "::group::Build DebugLogMiniXP"
|
||||
|
||||
#
|
||||
# echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd"
|
||||
"${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLogMiniXP -p:Platform=x86 -p:PlatformToolset=v141_xp
|
||||
#
|
||||
echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMiniXP/ddraw.dll")" >> $GITHUB_OUTPUT
|
||||
echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMiniXP/ddraw.pdb")" >> $GITHUB_OUTPUT
|
||||
|
||||
echo "::endgroup::"
|
||||
fi
|
||||
shell: bash
|
||||
8
build.bat
Normal file
8
build.bat
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
@echo off
|
||||
REM
|
||||
REM cnc-patch environment config
|
||||
REM
|
||||
set PATH=C:\win-builds-patch-32\bin
|
||||
gmake clean
|
||||
gmake
|
||||
pause
|
||||
15
build.cmd
15
build.cmd
|
|
@ -1,15 +0,0 @@
|
|||
@echo off
|
||||
|
||||
set GIT1=C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\
|
||||
set GIT2=C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\
|
||||
set GIT3=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\
|
||||
set GIT4=C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\
|
||||
set GIT5=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\
|
||||
set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\
|
||||
|
||||
set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH%
|
||||
|
||||
make clean
|
||||
make _WIN32_WINNT=0x0400
|
||||
|
||||
pause
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
@echo off
|
||||
|
||||
set GIT1=C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\
|
||||
set GIT2=C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\
|
||||
set GIT3=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\
|
||||
set GIT4=C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\
|
||||
set GIT5=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\
|
||||
set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\
|
||||
|
||||
set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH%
|
||||
|
||||
make clean
|
||||
make DEBUG=1 _WIN32_WINNT=0x0400
|
||||
|
||||
pause
|
||||
|
|
@ -1,29 +1,23 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.6.33829.357
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.30503.244
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cnc-ddraw", "cnc-ddraw.vcxproj", "{96094551-5D52-4EBD-BE4C-5291A03507FC}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x86 = Debug|x86
|
||||
DebugLogMiniXP|x86 = DebugLogMiniXP|x86
|
||||
DebugLogXP|x86 = DebugLogXP|x86
|
||||
DebugLog|x86 = DebugLog|x86
|
||||
Release|x86 = Release|x86
|
||||
ReleaseXP|x86 = ReleaseXP|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.Build.0 = Debug|Win32
|
||||
{96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.ActiveCfg = DebugLogMiniXP|Win32
|
||||
{96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.Build.0 = DebugLogMiniXP|Win32
|
||||
{96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.ActiveCfg = DebugLogXP|Win32
|
||||
{96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.Build.0 = DebugLogXP|Win32
|
||||
{96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLog|x86.ActiveCfg = DebugLog|Win32
|
||||
{96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLog|x86.Build.0 = DebugLog|Win32
|
||||
{96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.ActiveCfg = Release|Win32
|
||||
{96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.Build.0 = Release|Win32
|
||||
{96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseXP|x86.ActiveCfg = ReleaseXP|Win32
|
||||
{96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseXP|x86.Build.0 = ReleaseXP|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
|
|
|||
|
|
@ -1,33 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="DebugLogMiniXP|Win32">
|
||||
<Configuration>DebugLogMiniXP</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="DebugLogXP|Win32">
|
||||
<Configuration>DebugLogXP</Configuration>
|
||||
<ProjectConfiguration Include="DebugLog|Win32">
|
||||
<Configuration>DebugLog</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="ReleaseXP|Win32">
|
||||
<Configuration>ReleaseXP</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="src\blt.c" />
|
||||
<ClCompile Include="src\crc32.c" />
|
||||
<ClCompile Include="src\ddclipper.c" />
|
||||
<ClCompile Include="src\debug.c" />
|
||||
<ClCompile Include="src\delay_imports.c" />
|
||||
<ClCompile Include="src\detours\creatwth.cpp" />
|
||||
<ClCompile Include="src\detours\detours.cpp" />
|
||||
<ClCompile Include="src\detours\disasm.cpp" />
|
||||
|
|
@ -50,9 +39,6 @@
|
|||
<ClCompile Include="src\IDirect3D\IDirect3D7.c" />
|
||||
<ClCompile Include="src\IAMMediaStream\IAMMediaStream.c" />
|
||||
<ClCompile Include="src\IDirectDraw\IDirectDrawGammaControl.c" />
|
||||
<ClCompile Include="src\indeo.c" />
|
||||
<ClCompile Include="src\ini.c" />
|
||||
<ClCompile Include="src\keyboard.c" />
|
||||
<ClCompile Include="src\utils.c" />
|
||||
<ClCompile Include="src\hook.c" />
|
||||
<ClCompile Include="src\IDirectDraw\IDirectDraw.c" />
|
||||
|
|
@ -70,18 +56,13 @@
|
|||
<ClCompile Include="src\screenshot.c" />
|
||||
<ClCompile Include="src\config.c" />
|
||||
<ClCompile Include="src\ddsurface.c" />
|
||||
<ClCompile Include="src\versionhelpers.c" />
|
||||
<ClCompile Include="src\winapi_hooks.c" />
|
||||
<ClCompile Include="src\wndproc.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="inc\blt.h" />
|
||||
<ClInclude Include="inc\crc32.h" />
|
||||
<ClInclude Include="inc\d3d9shader.h" />
|
||||
<ClInclude Include="inc\d3dcaps.h" />
|
||||
<ClInclude Include="inc\ddclipper.h" />
|
||||
<ClInclude Include="inc\ddraw.h" />
|
||||
<ClInclude Include="inc\delay_imports.h" />
|
||||
<ClInclude Include="inc\directinput.h" />
|
||||
<ClInclude Include="inc\dllmain.h" />
|
||||
<ClInclude Include="inc\fps_limiter.h" />
|
||||
|
|
@ -89,10 +70,6 @@
|
|||
<ClInclude Include="inc\IDirect3D.h" />
|
||||
<ClInclude Include="inc\IAMMediaStream.h" />
|
||||
<ClInclude Include="inc\IDirectDrawGammaControl.h" />
|
||||
<ClInclude Include="inc\indeo.h" />
|
||||
<ClInclude Include="inc\ini.h" />
|
||||
<ClInclude Include="inc\keyboard.h" />
|
||||
<ClInclude Include="inc\palette.h" />
|
||||
<ClInclude Include="inc\patch.h" />
|
||||
<ClInclude Include="inc\utils.h" />
|
||||
<ClInclude Include="inc\hook.h" />
|
||||
|
|
@ -111,53 +88,37 @@
|
|||
<ClInclude Include="inc\openglshader.h" />
|
||||
<ClInclude Include="inc\render_ogl.h" />
|
||||
<ClInclude Include="inc\render_gdi.h" />
|
||||
<ClInclude Include="inc\scale_pattern.h" />
|
||||
<ClInclude Include="inc\screenshot.h" />
|
||||
<ClInclude Include="inc\config.h" />
|
||||
<ClInclude Include="inc\ddsurface.h" />
|
||||
<ClInclude Include="inc\version.h" />
|
||||
<ClInclude Include="inc\versionhelpers.h" />
|
||||
<ClInclude Include="inc\wglext.h" />
|
||||
<ClInclude Include="inc\winapi_hooks.h" />
|
||||
<ClInclude Include="inc\wndproc.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="res.rc" />
|
||||
<ResourceCompile Include="ddraw.rc" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<PropertyGroup Label="Globals">
|
||||
<RootNamespace>cnc_ddraw</RootNamespace>
|
||||
<WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0'))</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>7.0</WindowsTargetPlatformVersion>
|
||||
<ProjectGuid>{96094551-5D52-4EBD-BE4C-5291A03507FC}</ProjectGuid>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||
<PlatformToolset>v141_xp</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseXP|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v141_xp</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogXP|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v141_xp</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogMiniXP|Win32'" Label="Configuration">
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugLog|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v141_xp</PlatformToolset>
|
||||
|
|
@ -165,7 +126,8 @@
|
|||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
|
|
@ -174,13 +136,7 @@
|
|||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseXP|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogXP|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogMiniXP|Win32'" Label="PropertySheets">
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugLog|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
|
|
@ -196,21 +152,9 @@
|
|||
<LinkIncremental>false</LinkIncremental>
|
||||
<TargetName>ddraw</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseXP|Win32'">
|
||||
<OutDir>$(SolutionDir)bin\ReleaseXP\</OutDir>
|
||||
<IntDir>$(SolutionDir)bin\ReleaseXP\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<TargetName>ddraw</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogXP|Win32'">
|
||||
<OutDir>$(SolutionDir)bin\DebugLogXP\</OutDir>
|
||||
<IntDir>$(SolutionDir)bin\DebugLogXP\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<TargetName>ddraw</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogMiniXP|Win32'">
|
||||
<OutDir>$(SolutionDir)bin\DebugLogMiniXP\</OutDir>
|
||||
<IntDir>$(SolutionDir)bin\DebugLogMiniXP\</IntDir>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugLog|Win32'">
|
||||
<OutDir>$(SolutionDir)bin\DebugLog\</OutDir>
|
||||
<IntDir>$(SolutionDir)bin\DebugLog\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<TargetName>ddraw</TargetName>
|
||||
</PropertyGroup>
|
||||
|
|
@ -220,37 +164,22 @@
|
|||
</PrecompiledHeader>
|
||||
<WarningLevel>Level2</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_DEBUG_X;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<AdditionalIncludeDirectories>inc;src\detours</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<AdditionalDependencies>avifil32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>exports.def</ModuleDefinitionFile>
|
||||
<AdditionalDependencies>dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>ddraw.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
<PostBuildEvent>
|
||||
<Command>
|
||||
if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" (
|
||||
if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" (
|
||||
copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)"
|
||||
)
|
||||
</Command>
|
||||
</PostBuildEvent>
|
||||
<PreBuildEvent>
|
||||
<Command>
|
||||
set DST_FILE="inc/git.h"
|
||||
set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe"
|
||||
|
||||
if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe"
|
||||
if not exist %GIT_PATH% set GIT_PATH=git.exe
|
||||
|
||||
for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I
|
||||
for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I
|
||||
|
||||
echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE%
|
||||
echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE%
|
||||
</Command>
|
||||
</PreBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
|
|
@ -268,75 +197,11 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE%
|
|||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>avifil32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>exports.def</ModuleDefinitionFile>
|
||||
<AdditionalDependencies>winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>ddraw.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
<PostBuildEvent>
|
||||
<Command>
|
||||
if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" (
|
||||
copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)"
|
||||
)
|
||||
</Command>
|
||||
</PostBuildEvent>
|
||||
<PreBuildEvent>
|
||||
<Command>
|
||||
set DST_FILE="inc/git.h"
|
||||
set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe"
|
||||
|
||||
if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe"
|
||||
if not exist %GIT_PATH% set GIT_PATH=git.exe
|
||||
|
||||
for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I
|
||||
for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I
|
||||
|
||||
echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE%
|
||||
echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE%
|
||||
</Command>
|
||||
</PreBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseXP|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level2</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<AdditionalIncludeDirectories>inc;src\detours</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>avifil32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>exports.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
<PostBuildEvent>
|
||||
<Command>
|
||||
if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" (
|
||||
copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)"
|
||||
)
|
||||
</Command>
|
||||
</PostBuildEvent>
|
||||
<PreBuildEvent>
|
||||
<Command>
|
||||
set DST_FILE="inc/git.h"
|
||||
set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe"
|
||||
|
||||
if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe"
|
||||
if not exist %GIT_PATH% set GIT_PATH=git.exe
|
||||
|
||||
for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I
|
||||
for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I
|
||||
|
||||
echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE%
|
||||
echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE%
|
||||
</Command>
|
||||
</PreBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogXP|Win32'">
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugLog|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level2</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
|
|
@ -352,74 +217,11 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE%
|
|||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>avifil32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>exports.def</ModuleDefinitionFile>
|
||||
<AdditionalDependencies>dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>ddraw.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
<PostBuildEvent>
|
||||
<Command>
|
||||
if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" (
|
||||
copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)"
|
||||
)
|
||||
</Command>
|
||||
</PostBuildEvent>
|
||||
<PreBuildEvent>
|
||||
<Command>
|
||||
set DST_FILE="inc/git.h"
|
||||
set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe"
|
||||
|
||||
if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe"
|
||||
if not exist %GIT_PATH% set GIT_PATH=git.exe
|
||||
|
||||
for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I
|
||||
for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I
|
||||
|
||||
echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE%
|
||||
echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE%
|
||||
</Command>
|
||||
</PreBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogMiniXP|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level2</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>_DEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<AdditionalIncludeDirectories>inc;src\detours</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>avifil32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ModuleDefinitionFile>exports.def</ModuleDefinitionFile>
|
||||
</Link>
|
||||
<PostBuildEvent>
|
||||
<Command>
|
||||
if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" (
|
||||
copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)"
|
||||
)
|
||||
</Command>
|
||||
</PostBuildEvent>
|
||||
<PreBuildEvent>
|
||||
<Command>
|
||||
set DST_FILE="inc/git.h"
|
||||
set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe"
|
||||
|
||||
if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe"
|
||||
if not exist %GIT_PATH% set GIT_PATH=git.exe
|
||||
|
||||
for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I
|
||||
for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I
|
||||
|
||||
echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE%
|
||||
echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE%
|
||||
</Command>
|
||||
</PreBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
|
|
@ -150,27 +150,6 @@
|
|||
<ClCompile Include="src\fps_limiter.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\crc32.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\blt.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\ini.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\versionhelpers.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\indeo.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\keyboard.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\delay_imports.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="inc\debug.h">
|
||||
|
|
@ -191,6 +170,9 @@
|
|||
<ClInclude Include="inc\lodepng.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="inc\scale_pattern.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="inc\mouse.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
|
|
@ -275,39 +257,9 @@
|
|||
<ClInclude Include="inc\ddraw.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="inc\crc32.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="inc\blt.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="inc\version.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="inc\ini.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="inc\versionhelpers.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="inc\indeo.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="inc\keyboard.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="inc\palette.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="inc\d3dcaps.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="inc\delay_imports.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="res.rc">
|
||||
<ResourceCompile Include="ddraw.rc">
|
||||
<Filter>Resource Files</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
|
|
|
|||
|
|
@ -43,12 +43,7 @@ void __fastcall TConfigForm::CreateParams(TCreateParams & Params)
|
|||
|
||||
void __fastcall TConfigForm::LanguageImgClick(TObject *Sender)
|
||||
{
|
||||
auto iniPath = System::Sysutils::GetEnvironmentVariable(
|
||||
"CNC_DDRAW_CONFIG_FILE");
|
||||
|
||||
auto *ini =
|
||||
new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini");
|
||||
|
||||
auto *ini = new TIniFile(GAME_PATH + "ddraw.ini");
|
||||
ini->WriteString("ddraw", "configlang", IsEnglish ? "auto" : "english");
|
||||
delete ini;
|
||||
|
||||
|
|
@ -65,12 +60,7 @@ void __fastcall TConfigForm::LanguageImgClick(TObject *Sender)
|
|||
|
||||
void __fastcall TConfigForm::ThemePnlClick(TObject *Sender)
|
||||
{
|
||||
auto iniPath = System::Sysutils::GetEnvironmentVariable(
|
||||
"CNC_DDRAW_CONFIG_FILE");
|
||||
|
||||
auto *ini =
|
||||
new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini");
|
||||
|
||||
auto *ini = new TIniFile(GAME_PATH + "ddraw.ini");
|
||||
auto theme =
|
||||
ThemePnl->Color == (TColor)RGB(31, 31, 31) ? "Cobalt XEMedia" : "Windows10";
|
||||
|
||||
|
|
@ -99,10 +89,15 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender)
|
|||
return;
|
||||
}
|
||||
|
||||
auto iniPath = System::Sysutils::GetEnvironmentVariable(
|
||||
"CNC_DDRAW_CONFIG_FILE");
|
||||
auto *ini = new TIniFile(GAME_PATH + "Warcraft II BNE.ini");
|
||||
|
||||
DeleteFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini");
|
||||
ini->WriteString("Game", "Resolution", "4");
|
||||
ini->WriteString("Game", "Width", "0");
|
||||
ini->WriteString("Game", "Height", "0");
|
||||
|
||||
delete ini;
|
||||
|
||||
DeleteFile(GAME_PATH + "ddraw.ini");
|
||||
|
||||
ShellExecute(
|
||||
NULL,
|
||||
|
|
@ -117,9 +112,6 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender)
|
|||
|
||||
void TConfigForm::ApplyTranslation(TIniFile *ini)
|
||||
{
|
||||
Application->HintHidePause = 100 * 1000;
|
||||
Application->HintPause = 0;
|
||||
|
||||
auto lang = LowerCase(ini->ReadString("ddraw", "configlang", "auto"));
|
||||
int priID = SysLocale.PriLangID;
|
||||
|
||||
|
|
@ -131,31 +123,32 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
ConfigForm->Caption = L"cnc-ddraw 配置";
|
||||
DisplayBtn->Caption = L"显示设置";
|
||||
AdvancedBtn->Caption = L"高级设置";
|
||||
HotkeyBtn->Caption = L"快捷键设置";
|
||||
HotkeyBtn->Caption = L"热键设置";
|
||||
CompatibilityBtn->Caption = L"兼容性设置";
|
||||
RestoreDefaultsBtn->Caption = L"恢复默认设置";
|
||||
PresentationLbl->Caption = L"显示方式";
|
||||
MaintasLbl->Caption = L"保持宽高比";
|
||||
VsyncLbl->Caption = L"启用垂直同步";
|
||||
ResolutionLbl->Caption = L"解决";
|
||||
MaintasLbl->Caption = L"保持纵横比";
|
||||
VsyncLbl->Caption = L"打开垂直同步";
|
||||
AdjmouseLbl->Caption = L"调整鼠标灵敏度";
|
||||
DevmodeLbl->Caption = L"将光标锁定到窗口/屏幕";
|
||||
DevmodeLbl->Caption = L"锁定光标到窗口/屏幕";
|
||||
RendererLbl->Caption = L"渲染器";
|
||||
BorderLbl->Caption = L"在窗口模式下显示窗口边框";
|
||||
SavesettingsLbl->Caption = L"记住窗口位置和大小";
|
||||
ShaderLbl->Caption = L"OpenGL 着色器";
|
||||
MaxfpsLbl->Caption = L"限制帧速率";
|
||||
BoxingLbl->Caption = L"启用整数缩放";
|
||||
ShaderLbl->Caption = L"OpenGL着色器";
|
||||
MaxfpsLbl->Caption = L"限制帧率";
|
||||
BoxingLbl->Caption = L"打开窗盒显示/整数缩放";
|
||||
ToggleWindowedLbl->Caption = L"切换窗口模式";
|
||||
MaximizeWindowLbl->Caption = L"最大化窗口";
|
||||
UnlockCursor1Lbl->Caption = L"解锁光标 1";
|
||||
UnlockCursor2Lbl->Caption = L"解锁光标 2";
|
||||
ScreenshotLbl->Caption = L"截图";
|
||||
MaxgameticksLbl->Caption = L"限制游戏速度";
|
||||
ScreenshotLbl->Caption = L"截屏";
|
||||
MaxgameticksLbl->Caption = L"限制游戏速率";
|
||||
NoactivateappLbl->Caption = L"修复损坏的Alt+Tab功能";
|
||||
ResolutionsLbl->Caption = L"解锁额外的屏幕分辨率";
|
||||
MinfpsLbl->Caption = L"强制高 FPS / 修复 Freesync/G-Sync 卡顿";
|
||||
SinglecpuLbl->Caption = L"修复低性能和声音问题";
|
||||
NonexclusiveLbl->Caption = L"修复不显示的视频/UI 元素";
|
||||
ResolutionsLbl->Caption = L"解锁其他屏幕分辨率";
|
||||
MinfpsLbl->Caption = L"强制高FPS / 修复使用Freesync/G-Sync的卡顿问题";
|
||||
SinglecpuLbl->Caption = L"修复性能不佳和声音问题";
|
||||
NonexclusiveLbl->Caption = L"修复不显示的视频/UI元素";
|
||||
|
||||
RendererCbx->Items->Clear();
|
||||
RendererCbx->AddItem(L"自动", NULL);
|
||||
|
|
@ -172,37 +165,15 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
MaxgameticksCbx->Items->Clear();
|
||||
MaxgameticksCbx->AddItem(L"无限制", NULL);
|
||||
MaxgameticksCbx->AddItem(L"与显示器刷新率同步", NULL);
|
||||
MaxgameticksCbx->AddItem(L"模拟 60hz 刷新率显示器", NULL);
|
||||
MaxgameticksCbx->AddItem(L"1000 次每秒", NULL);
|
||||
MaxgameticksCbx->AddItem(L"500 次每秒", NULL);
|
||||
MaxgameticksCbx->AddItem(L"250 次每秒", NULL);
|
||||
MaxgameticksCbx->AddItem(L"125 次每秒", NULL);
|
||||
MaxgameticksCbx->AddItem(L"60 次每秒", NULL);
|
||||
MaxgameticksCbx->AddItem(L"30 次每秒", NULL);
|
||||
MaxgameticksCbx->AddItem(L"25 次每秒", NULL);
|
||||
MaxgameticksCbx->AddItem(L"15 次每秒", NULL);
|
||||
|
||||
System::UnicodeString shaderHint =
|
||||
L"一些着色器只有在启用放大时才有效。\n\n";
|
||||
|
||||
System::UnicodeString upscaleHint =
|
||||
L"必须启用放大才能使此设置生效。\n\n";
|
||||
|
||||
System::UnicodeString enableUpscaleHint =
|
||||
L"要启用放大,请将显示方式设置为“无边框” \n"
|
||||
"或“拉伸至全屏”。对于“窗口化”, \n"
|
||||
"你必须调整窗口大小或将窗口开启最大化。";
|
||||
|
||||
ShaderLbl->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
|
||||
MaintasLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
MaintasChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
MaxgameticksCbx->AddItem(L"模拟60hz刷新率显示器", NULL);
|
||||
MaxgameticksCbx->AddItem(L"1000tick每秒", NULL);
|
||||
MaxgameticksCbx->AddItem(L"500tick每秒", NULL);
|
||||
MaxgameticksCbx->AddItem(L"250tick每秒", NULL);
|
||||
MaxgameticksCbx->AddItem(L"125tick每秒", NULL);
|
||||
MaxgameticksCbx->AddItem(L"60tick每秒", NULL);
|
||||
MaxgameticksCbx->AddItem(L"30tick每秒", NULL);
|
||||
MaxgameticksCbx->AddItem(L"25tick每秒", NULL);
|
||||
MaxgameticksCbx->AddItem(L"15tick每秒", NULL);
|
||||
}
|
||||
else if (lang == "spanish" || (lang == "auto" && priID == LANG_SPANISH)) {
|
||||
LanguageImg->Visible = true;
|
||||
|
|
@ -216,6 +187,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
CompatibilityBtn->Caption = L"Ajustes de compatibilidad";
|
||||
RestoreDefaultsBtn->Caption = L"Restaurar la configuración predeterminada";
|
||||
PresentationLbl->Caption = L"Presentación";
|
||||
ResolutionLbl->Caption = L"Resolución";
|
||||
MaintasLbl->Caption = L"Mantener la relación de aspecto";
|
||||
VsyncLbl->Caption = L"Activar VSync";
|
||||
AdjmouseLbl->Caption = L"Ajustar sensibilidad de ratón";
|
||||
|
|
@ -262,28 +234,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
MaxgameticksCbx->AddItem(L"30 tics por segundo", NULL);
|
||||
MaxgameticksCbx->AddItem(L"25 tics por segundo", NULL);
|
||||
MaxgameticksCbx->AddItem(L"15 tics por segundo", NULL);
|
||||
|
||||
System::UnicodeString shaderHint =
|
||||
L"Algunos de los sombreadores solo funcionan cuando la ampliación está habilitada. \n\n";
|
||||
|
||||
System::UnicodeString upscaleHint =
|
||||
L"La ampliación debe estar habilitada para que esta configuración funcione. \n\n";
|
||||
|
||||
System::UnicodeString enableUpscaleHint =
|
||||
L"Para habilitar la mejora, configure su presentación en 'Sin bordes' \n"
|
||||
"o 'Pantalla completa ampliada'. Para la presentación 'Ventana', \n"
|
||||
"debe cambiar el tamaño o maximizar la ventana.";
|
||||
|
||||
ShaderLbl->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
|
||||
MaintasLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
MaintasChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
}
|
||||
else if (lang == "german" || (lang == "auto" && priID == LANG_GERMAN)) {
|
||||
LanguageImg->Visible = true;
|
||||
|
|
@ -297,6 +247,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
CompatibilityBtn->Caption = L"Kompatibilitätseinstellungen";
|
||||
RestoreDefaultsBtn->Caption = L"Standardeinstellungen wiederherstellen";
|
||||
PresentationLbl->Caption = L"Darstellung";
|
||||
ResolutionLbl->Caption = L"Auflösung";
|
||||
MaintasLbl->Caption = L"Seitenverhältnis beibehalten";
|
||||
VsyncLbl->Caption = L"VSync aktiveren";
|
||||
AdjmouseLbl->Caption = L"Mausempfindlichkeit anpassen";
|
||||
|
|
@ -306,7 +257,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
SavesettingsLbl->Caption = L"Fensterposition und Größe merken";
|
||||
ShaderLbl->Caption = L"OpenGL Shader";
|
||||
MaxfpsLbl->Caption = L"Limitiere Aktualisierungsrate";
|
||||
BoxingLbl->Caption = L"Windowboxing / Integer Skalierung aktivieren"; //Not 100% sure if "windowboxing" can be translated better.
|
||||
BoxingLbl->Caption = L"Fensterboxing / Integer Skalierung aktivieren"; //Not 100% sure if "windowboxing" can be translated better.
|
||||
ToggleWindowedLbl->Caption = L"Fenstermodus umschalten";
|
||||
MaximizeWindowLbl->Caption = L"Fenster maximieren";
|
||||
UnlockCursor1Lbl->Caption = L"Cursor entsperren 1";
|
||||
|
|
@ -343,29 +294,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
MaxgameticksCbx->AddItem(L"30 Ticks pro Sekunde", NULL);
|
||||
MaxgameticksCbx->AddItem(L"25 Ticks pro Sekunde", NULL);
|
||||
MaxgameticksCbx->AddItem(L"15 Ticks pro Sekunde", NULL);
|
||||
|
||||
System::UnicodeString shaderHint =
|
||||
L"Einige der Shader funktionieren nur, wenn die Hochskalierung aktiviert ist. \n\n";
|
||||
|
||||
System::UnicodeString upscaleHint =
|
||||
L"Damit diese Einstellung funktioniert, muss die Hochskalierung aktiviert sein. \n\n";
|
||||
|
||||
System::UnicodeString enableUpscaleHint =
|
||||
L"Um die Hochskalierung zu aktivieren, stellen Sie Ihre Darstellung \n"
|
||||
"entweder auf 'Ränderfreies Fenster' oder 'Hochskaliertes Vollbild' ein. \n"
|
||||
"Für die 'Fenstermodus'-Darstellung müssen Sie die Größe des Fensters \n"
|
||||
"ändern oder es maximieren.";
|
||||
|
||||
ShaderLbl->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
|
||||
MaintasLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
MaintasChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
}
|
||||
else if (lang == "russian" || (lang == "auto" && priID == LANG_RUSSIAN)) {
|
||||
LanguageImg->Visible = true;
|
||||
|
|
@ -380,6 +308,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
CompatibilityBtn->Caption = L"Настройки совместимости";
|
||||
RestoreDefaultsBtn->Caption = L"Восстановить настройки по умолчанию";
|
||||
PresentationLbl->Caption = L"Отображение";
|
||||
ResolutionLbl->Caption = L"Разрешение";
|
||||
MaintasLbl->Caption = L"Сохранять соотношение сторон";
|
||||
VsyncLbl->Caption = L"Включить VSync";
|
||||
AdjmouseLbl->Caption = L"Регулировка чувствительности мыши";
|
||||
|
|
@ -426,28 +355,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
MaxgameticksCbx->AddItem(L"30 тиков в секунду", NULL);
|
||||
MaxgameticksCbx->AddItem(L"25 тиков в секунду", NULL);
|
||||
MaxgameticksCbx->AddItem(L"15 тиков в секунду", NULL);
|
||||
|
||||
System::UnicodeString shaderHint =
|
||||
L"Некоторые шейдеры работают только при включенном масштабировании. \n\n";
|
||||
|
||||
System::UnicodeString upscaleHint =
|
||||
L"Чтобы этот параметр работал, необходимо включить масштабирование. \n\n";
|
||||
|
||||
System::UnicodeString enableUpscaleHint =
|
||||
L"Чтобы включить масштабирование, установите для презентации режим \n"
|
||||
"'Без границ' или 'Полноэкранный масштабированный'. Для презентации в \n"
|
||||
"'Оконный' режиме необходимо изменить размер или развернуть окно.";
|
||||
|
||||
ShaderLbl->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
|
||||
MaintasLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
MaintasChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
}
|
||||
else if (lang == "hungarian" || (lang == "auto" && priID == LANG_HUNGARIAN)) {
|
||||
LanguageImg->Visible = true;
|
||||
|
|
@ -461,6 +368,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
CompatibilityBtn->Caption = L"Kompatibilitás Beállítások";
|
||||
RestoreDefaultsBtn->Caption = L"Visszaállítja az alapértelmezett beállításokat";
|
||||
PresentationLbl->Caption = L"Bemutató";
|
||||
ResolutionLbl->Caption = L"Felbontás";
|
||||
MaintasLbl->Caption = L"Képarány megtartása";
|
||||
VsyncLbl->Caption = L"VSync bekapcsolása";
|
||||
AdjmouseLbl->Caption = L"Egérérzékenység beállítás";
|
||||
|
|
@ -507,28 +415,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
MaxgameticksCbx->AddItem(L"30 tick másodpercenként", NULL);
|
||||
MaxgameticksCbx->AddItem(L"25 tick másodpercenként", NULL);
|
||||
MaxgameticksCbx->AddItem(L"15 tick másodpercenként", NULL);
|
||||
|
||||
System::UnicodeString shaderHint =
|
||||
L"Néhány árnyékoló csak akkor működik, ha a felskálázás engedélyezve van. \n\n";
|
||||
|
||||
System::UnicodeString upscaleHint =
|
||||
L"A beállítás működéséhez engedélyezni kell a felskálázást. \n\n";
|
||||
|
||||
System::UnicodeString enableUpscaleHint =
|
||||
L"A felskálázás engedélyezéséhez állítsa a prezentációt 'Keret nélkül' \n"
|
||||
"vagy 'Teljes képernyő felskálázva' értékre. Az 'Ablakban' bemutatóhoz \n"
|
||||
"át kell méretezni vagy maximalizálni kell az ablakot.";
|
||||
|
||||
ShaderLbl->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
|
||||
MaintasLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
MaintasChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
}
|
||||
else if (lang == "french" || (lang == "auto" && priID == LANG_FRENCH)) {
|
||||
LanguageImg->Visible = true;
|
||||
|
|
@ -542,6 +428,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
CompatibilityBtn->Caption = L"Paramètres de Compatibilité";
|
||||
RestoreDefaultsBtn->Caption = L"Restaurer les paramètres par défaut";
|
||||
PresentationLbl->Caption = L"Présentation";
|
||||
ResolutionLbl->Caption = L"Résolution";
|
||||
MaintasLbl->Caption = L"Conserver les proportions de l'image";
|
||||
VsyncLbl->Caption = L"Activer la synchro verticale (VSync)";
|
||||
AdjmouseLbl->Caption = L"Ajuster la sensibilité souris";
|
||||
|
|
@ -588,28 +475,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
MaxgameticksCbx->AddItem(L"30 tics par seconde", NULL);
|
||||
MaxgameticksCbx->AddItem(L"25 tics par seconde", NULL);
|
||||
MaxgameticksCbx->AddItem(L"15 tics par seconde", NULL);
|
||||
|
||||
System::UnicodeString shaderHint =
|
||||
L"Certains shaders ne fonctionnent que lorsque la mise à l'échelle est activée. \n\n";
|
||||
|
||||
System::UnicodeString upscaleHint =
|
||||
L"La mise à l'échelle doit être activée pour que ce paramètre fonctionne. \n\n";
|
||||
|
||||
System::UnicodeString enableUpscaleHint =
|
||||
L"Pour activer la mise à l'échelle, définissez votre présentation \n"
|
||||
"sur 'Sans Bordure' ou 'Plein Écran Mis à l'Échelle'. Pour la \n"
|
||||
"présentation 'Fenêtré', vous devez redimensionner ou agrandir la fenêtre.";
|
||||
|
||||
ShaderLbl->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
|
||||
MaintasLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
MaintasChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
}
|
||||
else if (lang == "italian" || (lang == "auto" && priID == LANG_ITALIAN)) {
|
||||
LanguageImg->Visible = true;
|
||||
|
|
@ -623,6 +488,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
CompatibilityBtn->Caption = L"Impostazioni di compatibilità";
|
||||
RestoreDefaultsBtn->Caption = L"Ripristina le impostazioni predefinite";
|
||||
PresentationLbl->Caption = L"Presentazione";
|
||||
ResolutionLbl->Caption = L"Risoluzione";
|
||||
MaintasLbl->Caption = L"Mantieni il rapporto d'aspetto";
|
||||
VsyncLbl->Caption = L"Abilita la sincronizzazione verticale (VSync)";
|
||||
AdjmouseLbl->Caption = L"Regola la sensibilità del mouse";
|
||||
|
|
@ -669,190 +535,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
MaxgameticksCbx->AddItem(L"30 tick al secondo", NULL);
|
||||
MaxgameticksCbx->AddItem(L"25 tick al secondo", NULL);
|
||||
MaxgameticksCbx->AddItem(L"15 tick al secondo", NULL);
|
||||
|
||||
System::UnicodeString shaderHint =
|
||||
L"Alcuni shader funzionano solo quando il ridimensionamento dell'immagine è abilitato. \n\n";
|
||||
|
||||
System::UnicodeString upscaleHint =
|
||||
L"Affinché questa impostazione funzioni, è necessario abilitare il ridimensionamento dell'immagine. \n\n";
|
||||
|
||||
System::UnicodeString enableUpscaleHint =
|
||||
L"Per abilitare il ridimensionamento dell'immagine, imposta la modalità di presentazione \n"
|
||||
"su 'Senza Bordi o 'Schermo Intero Ridimensionato'. Per la modalità 'In Finestra', \n"
|
||||
"è necessario ridimensionare o ingrandire la finestra manualmente.";
|
||||
|
||||
ShaderLbl->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
|
||||
MaintasLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
MaintasChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
}
|
||||
else if (lang == "vietnamese" || (lang == "auto" && priID == LANG_VIETNAMESE)) {
|
||||
LanguageImg->Visible = true;
|
||||
|
||||
/* -vietnamese - made by TheBuck338 @ github */
|
||||
|
||||
ConfigForm->Caption = L"Thiết lập cnc-ddraw";
|
||||
DisplayBtn->Caption = L"Cài Đặt Hình Ảnh";
|
||||
AdvancedBtn->Caption = L"Cài Đặt Nâng Cao";
|
||||
HotkeyBtn->Caption = L"Cài Đặt Phím Tắt";
|
||||
CompatibilityBtn->Caption = L"Cài Đặt Tương Thích";
|
||||
RestoreDefaultsBtn->Caption = L"Khôi phục cài đặt gốc";
|
||||
PresentationLbl->Caption = L"Chế Độ Hiển Thị";
|
||||
MaintasLbl->Caption = L"Giữ nguyên tỉ lệ khung hình";
|
||||
VsyncLbl->Caption = L"Bật VSync";
|
||||
AdjmouseLbl->Caption = L"Điều chỉnh độ nhạy của chuột";
|
||||
DevmodeLbl->Caption = L"Khóa con trỏ vào cửa sổ / màn hình";
|
||||
RendererLbl->Caption = L"Trình kết xuất";
|
||||
BorderLbl->Caption = L"Hiển thị thanh tiêu đề trong chế độ cửa sổ";
|
||||
SavesettingsLbl->Caption = L"Ghi nhớ vị trí kích thước và cửa sổ";
|
||||
ShaderLbl->Caption = L"Shader OpenGL";
|
||||
MaxfpsLbl->Caption = L"Giới hạn tốc độ khung hình";
|
||||
BoxingLbl->Caption = L"Bật windowboxing / chia tỷ lệ theo số nguyên";
|
||||
ToggleWindowedLbl->Caption = L"Bật/tắt chế độ cửa sổ";
|
||||
MaximizeWindowLbl->Caption = L"Phóng to cửa sổ";
|
||||
UnlockCursor1Lbl->Caption = L"Mở khóa con trỏ 1";
|
||||
UnlockCursor2Lbl->Caption = L"Mở khóa con trỏ 2";
|
||||
ScreenshotLbl->Caption = L"Chụp màn hình";
|
||||
MaxgameticksLbl->Caption = L"Giới hạn tốc độ trò chơi";
|
||||
NoactivateappLbl->Caption = L"Sửa lỗi Alt+Tab";
|
||||
ResolutionsLbl->Caption = L"Mở khóa thêm độ phân giải màn hình";
|
||||
MinfpsLbl->Caption = L"Khắc phục hiện tượng giật hình khi sử dụng Freesync/G-Sync";
|
||||
SinglecpuLbl->Caption = L"Khắc phục các vấn đề về hiệu năng và âm thanh kém";
|
||||
NonexclusiveLbl->Caption = L"Sửa lỗi các video / phần tử UI không hiển thị";
|
||||
|
||||
RendererCbx->Items->Clear();
|
||||
RendererCbx->AddItem(L"Tự Động", NULL);
|
||||
RendererCbx->AddItem(L"Direct3D 9", NULL);
|
||||
RendererCbx->AddItem(L"OpenGL", NULL);
|
||||
RendererCbx->AddItem(L"GDI", NULL);
|
||||
|
||||
PresentationCbx->Items->Clear();
|
||||
PresentationCbx->AddItem(L"Toàn Màn Hình", NULL);
|
||||
PresentationCbx->AddItem(L"Toàn Màn Hình Nâng Cao Độ Phân Giải", NULL);
|
||||
PresentationCbx->AddItem(L"Toàn Màn Hình Không Viền", NULL);
|
||||
PresentationCbx->AddItem(L"Cửa Sổ", NULL);
|
||||
|
||||
MaxgameticksCbx->Items->Clear();
|
||||
MaxgameticksCbx->AddItem(L"Không giới hạn", NULL);
|
||||
MaxgameticksCbx->AddItem(L"Đồng bộ hóa với tần số quét màn hình", NULL);
|
||||
MaxgameticksCbx->AddItem(L"Mô phỏng màn hình với tần số quét 60Hz", NULL);
|
||||
MaxgameticksCbx->AddItem(L"1000 ticks mỗi giây", NULL);
|
||||
MaxgameticksCbx->AddItem(L"500 ticks mỗi giây", NULL);
|
||||
MaxgameticksCbx->AddItem(L"250 ticks mỗi giây", NULL);
|
||||
MaxgameticksCbx->AddItem(L"125 ticks mỗi giây", NULL);
|
||||
MaxgameticksCbx->AddItem(L"60 ticks mỗi giây", NULL);
|
||||
MaxgameticksCbx->AddItem(L"30 ticks mỗi giây", NULL);
|
||||
MaxgameticksCbx->AddItem(L"25 ticks mỗi giây", NULL);
|
||||
MaxgameticksCbx->AddItem(L"15 ticks mỗi giây", NULL);
|
||||
|
||||
System::UnicodeString shaderHint =
|
||||
L"Một số shader chỉ hoạt động khi bật chế độ nâng cao độ phân giải. \n\n";
|
||||
|
||||
System::UnicodeString upscaleHint =
|
||||
L"Phải bật chế độ nâng cao độ phân giải để cài đặt này hoạt động. \n\n";
|
||||
|
||||
System::UnicodeString enableUpscaleHint =
|
||||
L"Để bật chế độ nâng cao độ phân giải, hãy đặt chế độ hiển thị của bạn\n"
|
||||
"thành 'Toàn Màn Hình Không Viền' hoặc 'Toàn Màn Hình Nâng Cao Độ Phân Giải'.\n"
|
||||
"Đối với chế độ 'Cửa Sổ', bạn phải thay đổi kích thước hoặc phóng to cửa sổ.";
|
||||
|
||||
ShaderLbl->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
|
||||
MaintasLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
MaintasChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
}
|
||||
else if (lang == "polish" || (lang == "auto" && priID == LANG_POLISH)) {
|
||||
LanguageImg->Visible = true;
|
||||
|
||||
/* -polish - made by WaRzillA @ github */
|
||||
|
||||
ConfigForm->Caption = L"Konfiguracja cnc-ddraw";
|
||||
DisplayBtn->Caption = L"Ustawienia wyświetlania";
|
||||
AdvancedBtn->Caption = L"Ustawienia zaawansowane";
|
||||
HotkeyBtn->Caption = L"Skróty klawiaturowe";
|
||||
CompatibilityBtn->Caption = L"Ustawienia kompatybilności";
|
||||
RestoreDefaultsBtn->Caption = L"Przywróć ustawienia domyślne";
|
||||
PresentationLbl->Caption = L"Tryb wyświetlania";
|
||||
MaintasLbl->Caption = L"Zachowaj proporcje obrazu";
|
||||
VsyncLbl->Caption = L"Włącz VSync";
|
||||
AdjmouseLbl->Caption = L"Dostosuj czułość myszy";
|
||||
DevmodeLbl->Caption = L"Zablokuj kursor w oknie/na ekranie";
|
||||
RendererLbl->Caption = L"Silnik renderowania";
|
||||
BorderLbl->Caption = L"Pokaż ramki okna w trybie okienkowym";
|
||||
SavesettingsLbl->Caption = L"Zapamiętaj pozycję i rozmiar okna";
|
||||
ShaderLbl->Caption = L"Shader OpenGL";
|
||||
MaxfpsLbl->Caption = L"Ogranicz liczbę klatek na sekundę";
|
||||
BoxingLbl->Caption = L"Włącz windowboxing / integer scaling ";
|
||||
ToggleWindowedLbl->Caption = L"Przełącz na tryb okienkowy";
|
||||
MaximizeWindowLbl->Caption = L"Maksymalizuj okno";
|
||||
UnlockCursor1Lbl->Caption = L"Odblokuj kursor 1";
|
||||
UnlockCursor2Lbl->Caption = L"Odblokuj kursor 2";
|
||||
ScreenshotLbl->Caption = L"Zrzut ekranu";
|
||||
MaxgameticksLbl->Caption = L"Ogranicz prędkość gry";
|
||||
NoactivateappLbl->Caption = L"Napraw nieprawidłowe działanie Alt+Tab";
|
||||
ResolutionsLbl->Caption = L"Odblokuj dodatkowe rozdzielczości ekranu";
|
||||
MinfpsLbl->Caption = L"Wymuś wysokie FPS / Napraw zacinanie Freesync/G-Sync";
|
||||
SinglecpuLbl->Caption = L"Napraw problemy z wydajnością i dźwiękiem";
|
||||
NonexclusiveLbl->Caption = L"Napraw niewidoczne filmy / elementy interfejsu";
|
||||
|
||||
RendererCbx->Items->Clear();
|
||||
RendererCbx->AddItem(L"Automatyczny", NULL);
|
||||
RendererCbx->AddItem(L"Direct3D 9", NULL);
|
||||
RendererCbx->AddItem(L"OpenGL", NULL);
|
||||
RendererCbx->AddItem(L"GDI", NULL);
|
||||
|
||||
PresentationCbx->Items->Clear();
|
||||
PresentationCbx->AddItem(L"Pełny ekran", NULL);
|
||||
PresentationCbx->AddItem(L"Pełny ekran z upscalingiem", NULL);
|
||||
PresentationCbx->AddItem(L"Tryb bezramkowy", NULL);
|
||||
PresentationCbx->AddItem(L"Tryb okienkowy", NULL);
|
||||
|
||||
MaxgameticksCbx->Items->Clear();
|
||||
MaxgameticksCbx->AddItem(L"Bez limitu", NULL);
|
||||
MaxgameticksCbx->AddItem(L"Synchronizacja z odświeżaniem monitora", NULL);
|
||||
MaxgameticksCbx->AddItem(L"Symulacja monitora 60 Hz", NULL);
|
||||
MaxgameticksCbx->AddItem(L"1000 tików na sekundę", NULL);
|
||||
MaxgameticksCbx->AddItem(L"500 tików na sekundę", NULL);
|
||||
MaxgameticksCbx->AddItem(L"250 tików na sekundę", NULL);
|
||||
MaxgameticksCbx->AddItem(L"125 tików na sekundę", NULL);
|
||||
MaxgameticksCbx->AddItem(L"60 tików na sekundę", NULL);
|
||||
MaxgameticksCbx->AddItem(L"30 tików na sekundę", NULL);
|
||||
MaxgameticksCbx->AddItem(L"25 tików na sekundę", NULL);
|
||||
MaxgameticksCbx->AddItem(L"15 tików na sekundę", NULL);
|
||||
|
||||
System::UnicodeString shaderHint =
|
||||
L"Niektóre shadery działają tylko wtedy, gdy włączone jest skalowanie. \n\n";
|
||||
|
||||
System::UnicodeString upscaleHint =
|
||||
L"Skalowanie musi być włączone, aby ta opcja działała. \n\n";
|
||||
|
||||
System::UnicodeString enableUpscaleHint =
|
||||
L"Aby włączyć skalowanie, ustaw tryb wyświetlania na 'Tryb bezramkowy' \n"
|
||||
"lub 'Pełny ekran z upscalingiem'. Dla 'Tryb okienkowy' \n"
|
||||
"musisz zmienić rozmiar lub zmaksymalizować okno.";
|
||||
|
||||
ShaderLbl->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
|
||||
MaintasLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
MaintasChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
}
|
||||
else {
|
||||
IsEnglish = true;
|
||||
|
|
@ -900,18 +582,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
LanguageImg->Picture->Graphic = png;
|
||||
LanguageImg->Visible = true;
|
||||
}
|
||||
else if (priID == LANG_VIETNAMESE) {
|
||||
TPngImage *png = new TPngImage();
|
||||
png->LoadFromResourceName((int)HInstance, "PngImage_VN");
|
||||
LanguageImg->Picture->Graphic = png;
|
||||
LanguageImg->Visible = true;
|
||||
}
|
||||
else if (priID == LANG_POLISH) {
|
||||
TPngImage *png = new TPngImage();
|
||||
png->LoadFromResourceName((int)HInstance, "PngImage_PL");
|
||||
LanguageImg->Picture->Graphic = png;
|
||||
LanguageImg->Visible = true;
|
||||
}
|
||||
} catch (...) {
|
||||
}
|
||||
|
||||
|
|
@ -923,6 +593,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
CompatibilityBtn->Caption = L"Compatibility Settings";
|
||||
RestoreDefaultsBtn->Caption = L"Restore default settings";
|
||||
PresentationLbl->Caption = L"Presentation";
|
||||
ResolutionLbl->Caption = L"Resolution";
|
||||
MaintasLbl->Caption = L"Maintain aspect ratio";
|
||||
VsyncLbl->Caption = L"Enable VSync";
|
||||
AdjmouseLbl->Caption = L"Adjust mouse sensitivity";
|
||||
|
|
@ -970,28 +641,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
|
|||
MaxgameticksCbx->AddItem(L"25 ticks per second", NULL);
|
||||
MaxgameticksCbx->AddItem(L"15 ticks per second", NULL);
|
||||
*/
|
||||
|
||||
System::UnicodeString shaderHint =
|
||||
L"Some of the shaders only work when upscaling is enabled. \n\n";
|
||||
|
||||
System::UnicodeString upscaleHint =
|
||||
L"Upscaling must be enabled for this setting to work. \n\n";
|
||||
|
||||
System::UnicodeString enableUpscaleHint =
|
||||
L"To enable upscaling, set your presentation to either 'Borderless' \n"
|
||||
"or 'Fullscreen Upscaled'. For the 'Windowed' presentation, \n"
|
||||
"you must resize or maximize the window.";
|
||||
|
||||
ShaderLbl->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
ShaderCbx->Hint = shaderHint + enableUpscaleHint;
|
||||
|
||||
MaintasLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
MaintasChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
AdjmouseChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingLbl->Hint = upscaleHint + enableUpscaleHint;
|
||||
BoxingChk->Hint = upscaleHint + enableUpscaleHint;
|
||||
}
|
||||
|
||||
ToggleWindowedKeyLbl->Caption = GetKeyText(VK_MENU) + L" +";
|
||||
|
|
@ -1038,12 +687,8 @@ void __fastcall TConfigForm::CompatibilityBtnClick(TObject *Sender)
|
|||
|
||||
void __fastcall TConfigForm::FormCreate(TObject *Sender)
|
||||
{
|
||||
auto iniPath = System::Sysutils::GetEnvironmentVariable(
|
||||
"CNC_DDRAW_CONFIG_FILE");
|
||||
|
||||
/* Let cnc-ddraw create a new ddraw.ini if it doesn't exist */
|
||||
if (FileExists(GAME_PATH + "ddraw.dll") &&
|
||||
!FileExists(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini")) {
|
||||
if (FileExists(GAME_PATH + "ddraw.dll") && !FileExists(GAME_PATH + "ddraw.ini")) {
|
||||
|
||||
SetEnvironmentVariableW(L"cnc_ddraw_config_init", L"1");
|
||||
|
||||
|
|
@ -1067,8 +712,8 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender)
|
|||
}
|
||||
}
|
||||
|
||||
auto *ini =
|
||||
new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini");
|
||||
auto *ini = new TIniFile(GAME_PATH + "ddraw.ini");
|
||||
auto *hd_ini = new TIniFile(GAME_PATH + "Warcraft II BNE.ini");
|
||||
|
||||
if (ini->ReadString("ddraw", "configtheme", "Windows10") == "Cobalt XEMedia") {
|
||||
|
||||
|
|
@ -1102,6 +747,18 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender)
|
|||
PresentationCbx->ItemIndex = 0;
|
||||
}
|
||||
|
||||
int cwidth = hd_ini->ReadInteger("Game", "Width", 0);
|
||||
int cheight = hd_ini->ReadInteger("Game", "Height", 0);
|
||||
int reso = hd_ini->ReadInteger("Game", "Resolution", 4);
|
||||
|
||||
if (!cwidth || !cheight) {
|
||||
ResolutionCbx->ItemIndex = reso <= 11 ? reso : 4;
|
||||
}
|
||||
else {
|
||||
ResolutionCbx->AddItem(IntToStr(cwidth) + "x" + IntToStr(cheight), NULL);
|
||||
ResolutionCbx->ItemIndex = ResolutionCbx->Items->Count - 1;
|
||||
}
|
||||
|
||||
MaintasChk->State = GetBool(ini, "maintas", false) ? tssOn : tssOff;
|
||||
VsyncChk->State = GetBool(ini, "vsync", false) ? tssOn : tssOff;
|
||||
AdjmouseChk->State = GetBool(ini, "adjmouse", true) ? tssOn : tssOff;
|
||||
|
|
@ -1144,9 +801,6 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender)
|
|||
RendererCbx->ItemIndex = 0;
|
||||
}
|
||||
|
||||
ShaderD3DCbx->Enabled = !ContainsStr(RendererCbx->Text, "GDI");
|
||||
ShaderCbx->Enabled = ShaderD3DCbx->Enabled;
|
||||
|
||||
try
|
||||
{
|
||||
TStringDynArray list = TDirectory::GetFiles(
|
||||
|
|
@ -1159,15 +813,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender)
|
|||
}
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
|
||||
if (ShaderCbx->Items->Count == 0) {
|
||||
ShaderCbx->AddItem("Nearest neighbor", NULL);
|
||||
ShaderCbx->AddItem("Bilinear", NULL);
|
||||
ShaderCbx->AddItem("Bicubic", NULL);
|
||||
ShaderCbx->AddItem("Lanczos", NULL);
|
||||
ShaderCbx->AddItem("xBR-lv2", NULL);
|
||||
}
|
||||
}
|
||||
|
||||
auto shader = ini->ReadString("ddraw", "shader", "Bicubic");
|
||||
ShaderCbx->ItemIndex = ShaderCbx->Items->IndexOf(shader);
|
||||
|
|
@ -1177,24 +823,15 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender)
|
|||
ShaderCbx->ItemIndex = ShaderCbx->Items->Count - 1;
|
||||
}
|
||||
|
||||
int d3d9_filter = ini->ReadInteger("ddraw", "d3d9_filter", 2);
|
||||
bool d3d9_filter = GetBool(ini, "d3d9linear", true);
|
||||
|
||||
switch (d3d9_filter) {
|
||||
case 0:
|
||||
ShaderD3DCbx->ItemIndex = 0;
|
||||
break;
|
||||
case 1:
|
||||
if (d3d9_filter) {
|
||||
ShaderD3DCbx->ItemIndex = 1;
|
||||
break;
|
||||
case 2:
|
||||
default:
|
||||
ShaderD3DCbx->ItemIndex = 2;
|
||||
break;
|
||||
case 3:
|
||||
ShaderD3DCbx->ItemIndex = 3;
|
||||
break;
|
||||
}
|
||||
|
||||
else {
|
||||
ShaderD3DCbx->ItemIndex = 0;
|
||||
}
|
||||
|
||||
Maxfps = ini->ReadInteger("ddraw", "maxfps", -1);
|
||||
MaxfpsChk->State = Maxfps != 0 ? tssOn : tssOff;
|
||||
|
||||
|
|
@ -1274,16 +911,17 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender)
|
|||
MinfpsChk->State = Minfps != 0 ? tssOn : tssOff;
|
||||
|
||||
SinglecpuChk->State = GetBool(ini, "singlecpu", true) ? tssOff : tssOn;
|
||||
NonexclusiveChk->State = GetBool(ini, "nonexclusive", true) ? tssOn : tssOff;
|
||||
NonexclusiveChk->State = GetBool(ini, "nonexclusive", false) ? tssOn : tssOff;
|
||||
|
||||
CompatibilityBtn->Visible = !GetBool(ini, "hide_compat_tab", false);
|
||||
|
||||
RestoreDefaultsBtn->Visible =
|
||||
FileExists(GAME_PATH + "ddraw.dll") &&
|
||||
FileExists(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini") &&
|
||||
FileExists(GAME_PATH + "ddraw.ini") &&
|
||||
GetBool(ini, "allow_reset", true);
|
||||
|
||||
delete ini;
|
||||
delete hd_ini;
|
||||
|
||||
Initialized = true;
|
||||
}
|
||||
|
|
@ -1293,11 +931,8 @@ void TConfigForm::SaveSettings()
|
|||
if (!Initialized)
|
||||
return;
|
||||
|
||||
auto iniPath = System::Sysutils::GetEnvironmentVariable(
|
||||
"CNC_DDRAW_CONFIG_FILE");
|
||||
|
||||
auto *ini =
|
||||
new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini");
|
||||
auto *ini = new TIniFile(GAME_PATH + "ddraw.ini");
|
||||
auto *hd_ini = new TIniFile(GAME_PATH + "Warcraft II BNE.ini");
|
||||
|
||||
/* Display Settings */
|
||||
|
||||
|
|
@ -1328,6 +963,17 @@ void TConfigForm::SaveSettings()
|
|||
break;
|
||||
}
|
||||
|
||||
if (ResolutionCbx->ItemIndex <= 11) {
|
||||
hd_ini->WriteInteger("Game", "Resolution", ResolutionCbx->ItemIndex);
|
||||
|
||||
hd_ini->WriteInteger("Game", "Width", 0);
|
||||
hd_ini->WriteInteger("Game", "Height", 0);
|
||||
|
||||
if (ResolutionCbx->Items->Count == 13) {
|
||||
ResolutionCbx->Items->Delete(12);
|
||||
}
|
||||
}
|
||||
|
||||
ini->WriteString(
|
||||
"ddraw",
|
||||
"maintas",
|
||||
|
|
@ -1377,8 +1023,13 @@ void TConfigForm::SaveSettings()
|
|||
|
||||
ini->WriteString("ddraw", "shader", ShaderCbx->Text);
|
||||
|
||||
ini->WriteInteger("ddraw", "d3d9_filter", ShaderD3DCbx->ItemIndex);
|
||||
|
||||
if (ShaderD3DCbx->ItemIndex == 0) {
|
||||
ini->WriteString("ddraw", "d3d9linear", "false");
|
||||
}
|
||||
else {
|
||||
ini->WriteString("ddraw", "d3d9linear", "true");
|
||||
}
|
||||
|
||||
int maxfps = Maxfps == 0 ? -1 : Maxfps;
|
||||
|
||||
ini->WriteInteger(
|
||||
|
|
@ -1510,15 +1161,10 @@ void TConfigForm::SaveSettings()
|
|||
NonexclusiveChk->State == tssOn ? "true" : "false");
|
||||
|
||||
delete ini;
|
||||
delete hd_ini;
|
||||
}
|
||||
|
||||
void __fastcall TConfigForm::FormActivate(TObject *Sender)
|
||||
{
|
||||
DisableGameUX();
|
||||
AddDllOverride();
|
||||
}
|
||||
|
||||
void TConfigForm::AddDllOverride()
|
||||
{
|
||||
/* Detect wine (Linux/macOS) and create the needed dll override */
|
||||
if (!GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "wine_get_version"))
|
||||
|
|
@ -1558,47 +1204,6 @@ void TConfigForm::AddDllOverride()
|
|||
reg->Free();
|
||||
}
|
||||
|
||||
void TConfigForm::DisableGameUX()
|
||||
{
|
||||
/* Prevent bug where some games don't start properly and run in the background */
|
||||
if (!(TOSVersion::Major == 6 && TOSVersion::Minor == 1))
|
||||
return;
|
||||
|
||||
TRegistry* reg = new TRegistry(KEY_READ);
|
||||
reg->RootKey = HKEY_CLASSES_ROOT;
|
||||
|
||||
if (reg->OpenKey(
|
||||
"Local Settings\\Software\\Microsoft\\Windows\\GameUX\\ServiceLocation\\",
|
||||
false)) {
|
||||
|
||||
if (reg->ValueExists("Games") &&
|
||||
reg->ReadString("Games") != "127.0.0.1" &&
|
||||
LowerCase(reg->ReadString("Games")) != "localhost") {
|
||||
|
||||
reg->CloseKey();
|
||||
|
||||
reg->Access = KEY_WRITE;
|
||||
|
||||
if (reg->OpenKey(
|
||||
"Local Settings\\Software\\Microsoft\\Windows\\GameUX\\ServiceLocation\\",
|
||||
false)) {
|
||||
|
||||
try {
|
||||
reg->WriteString("Games", "127.0.0.1");
|
||||
} catch (...) {
|
||||
/* maybe restart with admin rights here? */
|
||||
}
|
||||
|
||||
reg->CloseKey();
|
||||
}
|
||||
}
|
||||
else
|
||||
reg->CloseKey();
|
||||
}
|
||||
|
||||
reg->Free();
|
||||
}
|
||||
|
||||
void __fastcall TConfigForm::HotkeyEdtKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
|
||||
{
|
||||
TEdit *edit = static_cast<TEdit*>(Sender);
|
||||
|
|
@ -1733,9 +1338,6 @@ void __fastcall TConfigForm::DevmodeChkClick(TObject *Sender)
|
|||
|
||||
void __fastcall TConfigForm::RendererCbxChange(TObject *Sender)
|
||||
{
|
||||
ShaderD3DCbx->Enabled = !ContainsStr(RendererCbx->Text, "GDI");
|
||||
ShaderCbx->Enabled = ShaderD3DCbx->Enabled;
|
||||
|
||||
if (ContainsStr(RendererCbx->Text, "Direct3D")) {
|
||||
|
||||
ShaderLbl->Caption =
|
||||
|
|
@ -1825,3 +1427,4 @@ void __fastcall TConfigForm::PboxPaint(TObject *Sender)
|
|||
//pbox->Canvas->Rectangle(pbox->ClientRect);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@ object ConfigForm: TConfigForm
|
|||
BorderIcons = [biSystemMenu, biMinimize]
|
||||
BorderStyle = bsSingle
|
||||
Caption = 'cnc-ddraw config'
|
||||
ClientHeight = 476
|
||||
ClientWidth = 741
|
||||
ClientHeight = 475
|
||||
ClientWidth = 737
|
||||
Color = clMenu
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
|
|
@ -2677,219 +2677,18 @@ object ConfigForm: TConfigForm
|
|||
61C0650530766087F0B9DE67A1EF3B173173597F3B695CC608E0B202F8FC22D7
|
||||
BBBF4CD8CBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCB
|
||||
B88CB18EFF1FA2974C1C31AF16A40000000049454E44AE426082}
|
||||
Position = poScreenCenter
|
||||
Position = poDesktopCenter
|
||||
OnActivate = FormActivate
|
||||
OnCreate = FormCreate
|
||||
DesignSize = (
|
||||
741
|
||||
476)
|
||||
737
|
||||
475)
|
||||
TextHeight = 13
|
||||
object DisplayPnl: TPanel
|
||||
Left = 233
|
||||
Top = 8
|
||||
Width = 499
|
||||
Height = 465
|
||||
Anchors = [akLeft, akTop, akRight, akBottom]
|
||||
BevelOuter = bvNone
|
||||
Color = clWhite
|
||||
ParentBackground = False
|
||||
ShowCaption = False
|
||||
TabOrder = 1
|
||||
StyleElements = [seFont, seBorder]
|
||||
DesignSize = (
|
||||
499
|
||||
465)
|
||||
object PresentationLbl: TLabel
|
||||
Left = 40
|
||||
Top = 28
|
||||
Width = 87
|
||||
Height = 21
|
||||
Caption = 'Presentation'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -16
|
||||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
end
|
||||
object MaintasLbl: TLabel
|
||||
Left = 40
|
||||
Top = 105
|
||||
Width = 145
|
||||
Height = 21
|
||||
Margins.Top = 18
|
||||
Caption = 'Maintain aspect ratio'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -16
|
||||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
ParentShowHint = False
|
||||
ShowHint = True
|
||||
end
|
||||
object VsyncLbl: TLabel
|
||||
Left = 40
|
||||
Top = 173
|
||||
Width = 93
|
||||
Height = 21
|
||||
Margins.Top = 18
|
||||
Caption = 'Enable VSync'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -16
|
||||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
end
|
||||
object AdjmouseLbl: TLabel
|
||||
Left = 40
|
||||
Top = 241
|
||||
Width = 168
|
||||
Height = 21
|
||||
Margins.Top = 18
|
||||
Caption = 'Adjust mouse sensitivity'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -16
|
||||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
ParentShowHint = False
|
||||
ShowHint = True
|
||||
end
|
||||
object DevmodeLbl: TLabel
|
||||
Left = 40
|
||||
Top = 309
|
||||
Width = 216
|
||||
Height = 21
|
||||
Margins.Top = 18
|
||||
Caption = 'Lock cursor to window / screen'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -16
|
||||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
end
|
||||
object PresentationPbox: TPaintBox
|
||||
Left = 40
|
||||
Top = 54
|
||||
Width = 282
|
||||
Height = 31
|
||||
OnPaint = PboxPaint
|
||||
end
|
||||
object LanguageImg: TImage
|
||||
Left = 453
|
||||
Top = 8
|
||||
Width = 16
|
||||
Height = 11
|
||||
Anchors = [akTop, akRight]
|
||||
Picture.Data = {
|
||||
0954506E67496D61676589504E470D0A1A0A0000000D49484452000000100000
|
||||
000B0802000000F9809A6E0000000467414D410000AFC837058AE90000001974
|
||||
455874536F6674776172650041646F626520496D616765526561647971C9653C
|
||||
000001B34944415478DA4D51DF4B5451109EB3B95010813E583ED8D28B7F8356
|
||||
6A1A2BD5530F81AE108837E9414390681F841235FF00115C0A5A82AD1E7C1172
|
||||
B7A050597C102C05E5C2222CE5A2D8522CABBBDD7BEEF935CE5DF1E2F031F30D
|
||||
C37C67660EB39EAE4160C68051000200C9BF897C47E7FFBFBF7F283735508D51
|
||||
C3DBF9B65416639DE6E34AA8BF1DDF67D9E3DB2AB95A37D8A51101D12005F049
|
||||
26B3E03774C65A3F658D3640100A35FA842BFC09E3502AC3F111542BE038ACFF
|
||||
7EEEC71A35AC74F4B6F7DDD23DAF59262EA3D375E917CE9DE94B3683D24B61CE
|
||||
ACBE7ED475E76D7B8B5943D98ED8CDE432BDE06B2B091EA20D9E7236D4E11C09
|
||||
43B58A9C8310A1C187EBF626B3ACAF89C4DDEE576629CEA35317D3F1E36B33E2
|
||||
F798691ED92E25DB4EE56907F2E5AB8D797F07EB4B6B5FF4DD374DC246C20E16
|
||||
B597833D0D05ADAECCF8DA9E4720121AEEFD9CCFB14221DFD4745D4A19289D27
|
||||
01775DF74618E616534C4F3E63F71E617A198B45289769621F9C234D2F040644
|
||||
CA0BCF073EECFF62BBBB3B91484B251CBE2C7870F5F3A694E4BC01605F6BD330
|
||||
3BC10E9E3CA0E3041F0967840354009C1A642D3DAD9E00C53A4C480864283400
|
||||
00000049454E44AE426082}
|
||||
Stretch = True
|
||||
Visible = False
|
||||
OnClick = LanguageImgClick
|
||||
end
|
||||
object PresentationCbx: TComboBox
|
||||
Left = 41
|
||||
Top = 55
|
||||
Width = 280
|
||||
Height = 29
|
||||
BevelEdges = []
|
||||
BevelInner = bvNone
|
||||
BevelOuter = bvSpace
|
||||
Style = csDropDownList
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -16
|
||||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
TabOrder = 1
|
||||
OnChange = PresentationCbxChange
|
||||
Items.Strings = (
|
||||
'Fullscreen'
|
||||
'Fullscreen Upscaled'
|
||||
'Borderless'
|
||||
'Windowed')
|
||||
end
|
||||
object MaintasChk: TToggleSwitch
|
||||
Left = 40
|
||||
Top = 132
|
||||
Width = 50
|
||||
Height = 20
|
||||
ParentShowHint = False
|
||||
ShowHint = True
|
||||
ShowStateCaption = False
|
||||
TabOrder = 0
|
||||
OnClick = MaintasChkClick
|
||||
end
|
||||
object VsyncChk: TToggleSwitch
|
||||
Left = 40
|
||||
Top = 200
|
||||
Width = 50
|
||||
Height = 20
|
||||
ShowStateCaption = False
|
||||
TabOrder = 2
|
||||
OnClick = VsyncChkClick
|
||||
end
|
||||
object AdjmouseChk: TToggleSwitch
|
||||
Left = 40
|
||||
Top = 268
|
||||
Width = 50
|
||||
Height = 20
|
||||
ParentShowHint = False
|
||||
ShowHint = True
|
||||
ShowStateCaption = False
|
||||
TabOrder = 3
|
||||
OnClick = AdjmouseChkClick
|
||||
end
|
||||
object DevmodeChk: TToggleSwitch
|
||||
Left = 40
|
||||
Top = 336
|
||||
Width = 50
|
||||
Height = 20
|
||||
ShowStateCaption = False
|
||||
TabOrder = 4
|
||||
OnClick = DevmodeChkClick
|
||||
end
|
||||
object ThemePnl: TPanel
|
||||
Left = 475
|
||||
Top = 8
|
||||
Width = 16
|
||||
Height = 11
|
||||
Anchors = [akTop, akRight]
|
||||
BevelOuter = bvNone
|
||||
Color = 2039583
|
||||
ParentBackground = False
|
||||
TabOrder = 5
|
||||
StyleElements = [seFont, seBorder]
|
||||
OnClick = ThemePnlClick
|
||||
end
|
||||
end
|
||||
object CompatibilityPnl: TPanel
|
||||
Left = 233
|
||||
Top = 8
|
||||
Width = 499
|
||||
Height = 465
|
||||
Width = 495
|
||||
Height = 464
|
||||
Anchors = [akLeft, akTop, akRight, akBottom]
|
||||
BevelOuter = bvNone
|
||||
Color = clWhite
|
||||
|
|
@ -2898,6 +2697,8 @@ object ConfigForm: TConfigForm
|
|||
TabOrder = 3
|
||||
Visible = False
|
||||
StyleElements = [seFont, seBorder]
|
||||
ExplicitWidth = 491
|
||||
ExplicitHeight = 463
|
||||
object MaxgameticksLbl: TLabel
|
||||
Left = 40
|
||||
Top = 28
|
||||
|
|
@ -3068,8 +2869,8 @@ object ConfigForm: TConfigForm
|
|||
object AdvancedPnl: TPanel
|
||||
Left = 233
|
||||
Top = 8
|
||||
Width = 499
|
||||
Height = 465
|
||||
Width = 495
|
||||
Height = 464
|
||||
Anchors = [akLeft, akTop, akRight, akBottom]
|
||||
BevelOuter = bvNone
|
||||
Color = clWhite
|
||||
|
|
@ -3078,6 +2879,8 @@ object ConfigForm: TConfigForm
|
|||
TabOrder = 2
|
||||
Visible = False
|
||||
StyleElements = [seFont, seBorder]
|
||||
ExplicitWidth = 491
|
||||
ExplicitHeight = 463
|
||||
object RendererLbl: TLabel
|
||||
Left = 40
|
||||
Top = 28
|
||||
|
|
@ -3118,8 +2921,6 @@ object ConfigForm: TConfigForm
|
|||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
ParentShowHint = False
|
||||
ShowHint = True
|
||||
end
|
||||
object MaxfpsLbl: TLabel
|
||||
Left = 40
|
||||
|
|
@ -3162,8 +2963,6 @@ object ConfigForm: TConfigForm
|
|||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
ParentShowHint = False
|
||||
ShowHint = True
|
||||
end
|
||||
object RendererPbox: TPaintBox
|
||||
Left = 40
|
||||
|
|
@ -3195,8 +2994,6 @@ object ConfigForm: TConfigForm
|
|||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
ParentShowHint = False
|
||||
ShowHint = True
|
||||
TabOrder = 6
|
||||
Visible = False
|
||||
OnChange = ShaderD3DCbxChange
|
||||
|
|
@ -3256,15 +3053,13 @@ object ConfigForm: TConfigForm
|
|||
BevelInner = bvNone
|
||||
BevelOuter = bvSpace
|
||||
Style = csDropDownList
|
||||
DropDownCount = 13
|
||||
DropDownCount = 10
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -16
|
||||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
ParentShowHint = False
|
||||
ShowHint = True
|
||||
TabOrder = 3
|
||||
OnChange = ShaderCbxChange
|
||||
end
|
||||
|
|
@ -3282,8 +3077,6 @@ object ConfigForm: TConfigForm
|
|||
Top = 277
|
||||
Width = 50
|
||||
Height = 20
|
||||
ParentShowHint = False
|
||||
ShowHint = True
|
||||
ShowStateCaption = False
|
||||
TabOrder = 5
|
||||
OnClick = BoxingChkClick
|
||||
|
|
@ -3292,8 +3085,8 @@ object ConfigForm: TConfigForm
|
|||
object HotkeyPnl: TPanel
|
||||
Left = 233
|
||||
Top = 8
|
||||
Width = 499
|
||||
Height = 465
|
||||
Width = 495
|
||||
Height = 464
|
||||
Anchors = [akLeft, akTop, akRight, akBottom]
|
||||
BevelOuter = bvNone
|
||||
Color = clWhite
|
||||
|
|
@ -3302,6 +3095,8 @@ object ConfigForm: TConfigForm
|
|||
TabOrder = 4
|
||||
Visible = False
|
||||
StyleElements = [seFont, seBorder]
|
||||
ExplicitWidth = 491
|
||||
ExplicitHeight = 463
|
||||
object ToggleWindowedLbl: TLabel
|
||||
Left = 40
|
||||
Top = 27
|
||||
|
|
@ -3519,19 +3314,269 @@ object ConfigForm: TConfigForm
|
|||
OnKeyUp = HotkeyEdtKeyUp
|
||||
end
|
||||
end
|
||||
object DisplayPnl: TPanel
|
||||
Left = 233
|
||||
Top = 8
|
||||
Width = 495
|
||||
Height = 464
|
||||
Anchors = [akLeft, akTop, akRight, akBottom]
|
||||
BevelOuter = bvNone
|
||||
Color = clWhite
|
||||
ParentBackground = False
|
||||
ShowCaption = False
|
||||
TabOrder = 1
|
||||
StyleElements = [seFont, seBorder]
|
||||
ExplicitWidth = 491
|
||||
ExplicitHeight = 463
|
||||
DesignSize = (
|
||||
495
|
||||
464)
|
||||
object PresentationLbl: TLabel
|
||||
Left = 40
|
||||
Top = 28
|
||||
Width = 87
|
||||
Height = 21
|
||||
Caption = 'Presentation'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -16
|
||||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
end
|
||||
object MaintasLbl: TLabel
|
||||
Left = 40
|
||||
Top = 182
|
||||
Width = 145
|
||||
Height = 21
|
||||
Margins.Top = 18
|
||||
Caption = 'Maintain aspect ratio'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -16
|
||||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
end
|
||||
object VsyncLbl: TLabel
|
||||
Left = 40
|
||||
Top = 250
|
||||
Width = 93
|
||||
Height = 21
|
||||
Margins.Top = 18
|
||||
Caption = 'Enable VSync'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -16
|
||||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
end
|
||||
object AdjmouseLbl: TLabel
|
||||
Left = 40
|
||||
Top = 318
|
||||
Width = 168
|
||||
Height = 21
|
||||
Margins.Top = 18
|
||||
Caption = 'Adjust mouse sensitivity'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -16
|
||||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
end
|
||||
object DevmodeLbl: TLabel
|
||||
Left = 40
|
||||
Top = 386
|
||||
Width = 216
|
||||
Height = 21
|
||||
Margins.Top = 18
|
||||
Caption = 'Lock cursor to window / screen'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -16
|
||||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
end
|
||||
object PresentationPbox: TPaintBox
|
||||
Left = 40
|
||||
Top = 54
|
||||
Width = 282
|
||||
Height = 31
|
||||
OnPaint = PboxPaint
|
||||
end
|
||||
object LanguageImg: TImage
|
||||
Left = 449
|
||||
Top = 8
|
||||
Width = 16
|
||||
Height = 11
|
||||
Anchors = [akTop, akRight]
|
||||
Picture.Data = {
|
||||
0954506E67496D61676589504E470D0A1A0A0000000D49484452000000100000
|
||||
000B0802000000F9809A6E0000000467414D410000AFC837058AE90000001974
|
||||
455874536F6674776172650041646F626520496D616765526561647971C9653C
|
||||
000001B34944415478DA4D51DF4B5451109EB3B95010813E583ED8D28B7F8356
|
||||
6A1A2BD5530F81AE108837E9414390681F841235FF00115C0A5A82AD1E7C1172
|
||||
B7A050597C102C05E5C2222CE5A2D8522CABBBDD7BEEF935CE5DF1E2F031F30D
|
||||
C37C67660EB39EAE4160C68051000200C9BF897C47E7FFBFBF7F283735508D51
|
||||
C3DBF9B65416639DE6E34AA8BF1DDF67D9E3DB2AB95A37D8A51101D12005F049
|
||||
26B3E03774C65A3F658D3640100A35FA842BFC09E3502AC3F111542BE038ACFF
|
||||
7EEEC71A35AC74F4B6F7DDD23DAF59262EA3D375E917CE9DE94B3683D24B61CE
|
||||
ACBE7ED475E76D7B8B5943D98ED8CDE432BDE06B2B091EA20D9E7236D4E11C09
|
||||
43B58A9C8310A1C187EBF626B3ACAF89C4DDEE576629CEA35317D3F1E36B33E2
|
||||
F798691ED92E25DB4EE56907F2E5AB8D797F07EB4B6B5FF4DD374DC246C20E16
|
||||
B597833D0D05ADAECCF8DA9E4720121AEEFD9CCFB14221DFD4745D4A19289D27
|
||||
01775DF74618E616534C4F3E63F71E617A198B45289769621F9C234D2F040644
|
||||
CA0BCF073EECFF62BBBB3B91484B251CBE2C7870F5F3A694E4BC01605F6BD330
|
||||
3BC10E9E3CA0E3041F0967840354009C1A642D3DAD9E00C53A4C480864283400
|
||||
00000049454E44AE426082}
|
||||
Stretch = True
|
||||
Visible = False
|
||||
OnClick = LanguageImgClick
|
||||
ExplicitLeft = 453
|
||||
end
|
||||
object ResolutionLbl: TLabel
|
||||
Left = 40
|
||||
Top = 105
|
||||
Width = 74
|
||||
Height = 21
|
||||
Caption = 'Resolution'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -16
|
||||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
end
|
||||
object ResolutionPbox: TPaintBox
|
||||
Left = 40
|
||||
Top = 131
|
||||
Width = 282
|
||||
Height = 31
|
||||
OnPaint = PboxPaint
|
||||
end
|
||||
object PresentationCbx: TComboBox
|
||||
Left = 41
|
||||
Top = 55
|
||||
Width = 280
|
||||
Height = 29
|
||||
BevelEdges = []
|
||||
BevelInner = bvNone
|
||||
BevelOuter = bvSpace
|
||||
Style = csDropDownList
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -16
|
||||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
TabOrder = 1
|
||||
OnChange = PresentationCbxChange
|
||||
Items.Strings = (
|
||||
'Fullscreen'
|
||||
'Fullscreen Upscaled'
|
||||
'Borderless'
|
||||
'Windowed')
|
||||
end
|
||||
object MaintasChk: TToggleSwitch
|
||||
Left = 40
|
||||
Top = 209
|
||||
Width = 50
|
||||
Height = 20
|
||||
ShowStateCaption = False
|
||||
TabOrder = 0
|
||||
OnClick = MaintasChkClick
|
||||
end
|
||||
object VsyncChk: TToggleSwitch
|
||||
Left = 40
|
||||
Top = 277
|
||||
Width = 50
|
||||
Height = 20
|
||||
ShowStateCaption = False
|
||||
TabOrder = 2
|
||||
OnClick = VsyncChkClick
|
||||
end
|
||||
object AdjmouseChk: TToggleSwitch
|
||||
Left = 40
|
||||
Top = 345
|
||||
Width = 50
|
||||
Height = 20
|
||||
ShowStateCaption = False
|
||||
TabOrder = 3
|
||||
OnClick = AdjmouseChkClick
|
||||
end
|
||||
object DevmodeChk: TToggleSwitch
|
||||
Left = 40
|
||||
Top = 413
|
||||
Width = 50
|
||||
Height = 20
|
||||
ShowStateCaption = False
|
||||
TabOrder = 4
|
||||
OnClick = DevmodeChkClick
|
||||
end
|
||||
object ThemePnl: TPanel
|
||||
Left = 471
|
||||
Top = 8
|
||||
Width = 16
|
||||
Height = 11
|
||||
Anchors = [akTop, akRight]
|
||||
BevelOuter = bvNone
|
||||
Color = 2039583
|
||||
ParentBackground = False
|
||||
TabOrder = 5
|
||||
StyleElements = [seFont, seBorder]
|
||||
OnClick = ThemePnlClick
|
||||
ExplicitLeft = 467
|
||||
end
|
||||
object ResolutionCbx: TComboBox
|
||||
Left = 41
|
||||
Top = 132
|
||||
Width = 280
|
||||
Height = 29
|
||||
BevelEdges = []
|
||||
BevelInner = bvNone
|
||||
BevelOuter = bvSpace
|
||||
Style = csDropDownList
|
||||
DropDownCount = 13
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -16
|
||||
Font.Name = 'Segoe UI'
|
||||
Font.Style = []
|
||||
ParentFont = False
|
||||
TabOrder = 6
|
||||
OnChange = PresentationCbxChange
|
||||
Items.Strings = (
|
||||
'640x480 (4:3)'
|
||||
'800x608 (4:3)'
|
||||
'1024x768 (4:3)'
|
||||
'832x480 (16:9)'
|
||||
'960x544 (16:9)'
|
||||
'1024x576 (16:9)'
|
||||
'1280x704 (16:9)'
|
||||
'1120x480 (21:9)'
|
||||
'1280x544 (21:9)'
|
||||
'768x480 (16:10)'
|
||||
'960x608 (16:10)'
|
||||
'1280x800 (16:10)')
|
||||
end
|
||||
end
|
||||
object MenuPnl: TPanel
|
||||
Left = 0
|
||||
Top = 8
|
||||
Width = 233
|
||||
Height = 468
|
||||
Height = 467
|
||||
Anchors = [akLeft, akTop, akBottom]
|
||||
BevelOuter = bvNone
|
||||
Color = clMenu
|
||||
ParentBackground = False
|
||||
TabOrder = 0
|
||||
ExplicitHeight = 466
|
||||
DesignSize = (
|
||||
233
|
||||
468)
|
||||
467)
|
||||
object DisplayBtn: TSpeedButton
|
||||
Left = 0
|
||||
Top = 8
|
||||
|
|
@ -3598,7 +3643,7 @@ object ConfigForm: TConfigForm
|
|||
end
|
||||
object RestoreDefaultsBtn: TSpeedButton
|
||||
Left = 0
|
||||
Top = 440
|
||||
Top = 439
|
||||
Width = 227
|
||||
Height = 22
|
||||
Anchors = [akLeft, akRight, akBottom]
|
||||
|
|
@ -3611,6 +3656,7 @@ object ConfigForm: TConfigForm
|
|||
Font.Style = []
|
||||
ParentFont = False
|
||||
OnClick = RestoreDefaultsBtnClick
|
||||
ExplicitTop = 440
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -81,6 +81,9 @@ __published: // Von der IDE verwaltete Komponenten
|
|||
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);
|
||||
|
|
@ -122,8 +125,6 @@ private: // Benutzer-Deklarationen
|
|||
System::UnicodeString GetKeyText(WORD key);
|
||||
WORD GetKeyCode(System::UnicodeString text);
|
||||
System::UnicodeString KeyToText(WORD key);
|
||||
void DisableGameUX();
|
||||
void AddDllOverride();
|
||||
public: // Benutzer-Deklarationen
|
||||
__fastcall TConfigForm(TComponent* Owner);
|
||||
};
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 474 B |
Binary file not shown.
|
Before Width: | Height: | Size: 374 B |
|
|
@ -1,7 +1,7 @@
|
|||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{E020D5C7-AE07-4DB9-9688-6D289E9FFF1A}</ProjectGuid>
|
||||
<ProjectVersion>20.1</ProjectVersion>
|
||||
<ProjectVersion>19.5</ProjectVersion>
|
||||
<FrameworkType>VCL</FrameworkType>
|
||||
<AppType>Application</AppType>
|
||||
<MainSource>cnc-ddraw config.cpp</MainSource>
|
||||
|
|
@ -10,7 +10,6 @@
|
|||
<Platform Condition="'$(Platform)'==''">Win32</Platform>
|
||||
<TargetedPlatforms>1</TargetedPlatforms>
|
||||
<CC_Suffix Condition="'$(CC_Suffix)'==''">c</CC_Suffix>
|
||||
<ProjectName Condition="'$(ProjectName)'==''">cnc-ddraw config</ProjectName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
|
||||
<Base>true</Base>
|
||||
|
|
@ -25,11 +24,6 @@
|
|||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win64x' and '$(Base)'=='true') or '$(Base_Win64x)'!=''">
|
||||
<Base_Win64x>true</Base_Win64x>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
|
||||
<Cfg_1>true</Cfg_1>
|
||||
<CfgParent>Base</CfgParent>
|
||||
|
|
@ -47,12 +41,6 @@
|
|||
<Cfg_1>true</Cfg_1>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win64x' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win64x)'!=''">
|
||||
<Cfg_1_Win64x>true</Cfg_1_Win64x>
|
||||
<CfgParent>Cfg_1</CfgParent>
|
||||
<Cfg_1>true</Cfg_1>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
|
||||
<Cfg_2>true</Cfg_2>
|
||||
<CfgParent>Base</CfgParent>
|
||||
|
|
@ -70,12 +58,6 @@
|
|||
<Cfg_2>true</Cfg_2>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win64x' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win64x)'!=''">
|
||||
<Cfg_2_Win64x>true</Cfg_2_Win64x>
|
||||
<CfgParent>Cfg_2</CfgParent>
|
||||
<Cfg_2>true</Cfg_2>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Base)'!=''">
|
||||
<DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
|
||||
<DynamicRTL>true</DynamicRTL>
|
||||
|
|
@ -119,14 +101,6 @@
|
|||
<VerInfo_Locale>1033</VerInfo_Locale>
|
||||
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Base_Win64x)'!=''">
|
||||
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)</DCC_Namespace>
|
||||
<BT_BuildType>Debug</BT_BuildType>
|
||||
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
|
||||
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
|
||||
<VerInfo_Locale>1033</VerInfo_Locale>
|
||||
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_1)'!=''">
|
||||
<BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
|
||||
<BCC_DisableOptimizations>true</BCC_DisableOptimizations>
|
||||
|
|
@ -167,9 +141,6 @@
|
|||
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
|
||||
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_1_Win64x)'!=''">
|
||||
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_2)'!=''">
|
||||
<Defines>NDEBUG;$(Defines)</Defines>
|
||||
<TASM_Debugging>None</TASM_Debugging>
|
||||
|
|
@ -190,9 +161,6 @@
|
|||
<PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
|
||||
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_2_Win64x)'!=''">
|
||||
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<CppCompile Include="cnc-ddraw config.cpp">
|
||||
<BuildOrder>0</BuildOrder>
|
||||
|
|
@ -227,10 +195,6 @@
|
|||
<ResourceType>RCDATA</ResourceType>
|
||||
<ResourceId>PngImage_IT</ResourceId>
|
||||
</RcItem>
|
||||
<RcItem Include="Resources\pl.png">
|
||||
<ResourceType>RCDATA</ResourceType>
|
||||
<ResourceId>PngImage_PL</ResourceId>
|
||||
</RcItem>
|
||||
<RcItem Include="Resources\RU.png">
|
||||
<ResourceType>RCDATA</ResourceType>
|
||||
<ResourceId>PngImage_RU</ResourceId>
|
||||
|
|
@ -239,10 +203,6 @@
|
|||
<ResourceType>RCDATA</ResourceType>
|
||||
<ResourceId>PngImage_US</ResourceId>
|
||||
</RcItem>
|
||||
<RcItem Include="Resources\VN.png">
|
||||
<ResourceType>RCDATA</ResourceType>
|
||||
<ResourceId>PngImage_VN</ResourceId>
|
||||
</RcItem>
|
||||
<FormResources Include="ConfigFormUnit.dfm"/>
|
||||
<BuildConfiguration Include="Base">
|
||||
<Key>Base</Key>
|
||||
|
|
@ -305,16 +265,6 @@
|
|||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'!='true'" LocalName="$(BDS)\bin64\cc64290.dll" Class="DependencyModule">
|
||||
<Platform Name="Win64">
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'=='true'" LocalName="$(BDS)\bin64\cc64290mt.dll" Class="DependencyModule">
|
||||
<Platform Name="Win64">
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile Condition="'$(UsingDelphiRTL)'=='true'" LocalName="$(BDS)\bin\borlndmm.dll" Class="DependencyModule">
|
||||
<Platform Name="Win32">
|
||||
<Overwrite>true</Overwrite>
|
||||
|
|
@ -332,16 +282,6 @@
|
|||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'!='true'" LocalName="$(BDS)\bin\cc32290.dll" Class="DependencyModule">
|
||||
<Platform Name="Win32">
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'=='true'" LocalName="$(BDS)\bin\cc32290mt.dll" Class="DependencyModule">
|
||||
<Platform Name="Win32">
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'!='true'" LocalName="$(BDS)\bin\cc32c260.dll" Class="DependencyModule"/>
|
||||
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'=='true'" LocalName="$(BDS)\bin\cc32c260mt.dll" Class="DependencyModule"/>
|
||||
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'!='true'" LocalName="$(BDS)\bin\cc32c280.dll" Class="DependencyModule">
|
||||
|
|
@ -354,92 +294,16 @@
|
|||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'!='true'" LocalName="$(BDS)\bin\cc32c290.dll" Class="DependencyModule">
|
||||
<Platform Name="Win32">
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'=='true'" LocalName="$(BDS)\bin\cc32c290mt.dll" Class="DependencyModule">
|
||||
<Platform Name="Win32">
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName=".\Win32\Debug\cnc-ddraw_config.exe" Configuration="Debug" Class="ProjectOutput"/>
|
||||
<DeployFile LocalName=".\Win32\Release\cnc-ddraw config.exe" Configuration="Release" Class="ProjectOutput"/>
|
||||
<DeployFile LocalName=".\Win32\Release\cnc-ddraw config.exe" Configuration="Release" Class="ProjectOutput">
|
||||
<Platform Name="Win32">
|
||||
<RemoteName>cnc-ddraw config.exe</RemoteName>
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="Resources\CN.png" Configuration="Release" Class="ProjectFile"/>
|
||||
<DeployFile LocalName="Resources\CN.png" Configuration="Release" Class="ProjectFile">
|
||||
<Platform Name="Win32">
|
||||
<RemoteDir>.\</RemoteDir>
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="Resources\DE.png" Configuration="Release" Class="ProjectFile"/>
|
||||
<DeployFile LocalName="Resources\DE.png" Configuration="Release" Class="ProjectFile">
|
||||
<Platform Name="Win32">
|
||||
<RemoteDir>.\</RemoteDir>
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="Resources\ES.png" Configuration="Release" Class="ProjectFile"/>
|
||||
<DeployFile LocalName="Resources\ES.png" Configuration="Release" Class="ProjectFile">
|
||||
<Platform Name="Win32">
|
||||
<RemoteDir>.\</RemoteDir>
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="Resources\IT.png" Configuration="Release" Class="ProjectFile"/>
|
||||
<DeployFile LocalName="Resources\IT.png" Configuration="Release" Class="ProjectFile">
|
||||
<Platform Name="Win32">
|
||||
<RemoteDir>.\</RemoteDir>
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="Resources\RU.png" Configuration="Release" Class="ProjectFile"/>
|
||||
<DeployFile LocalName="Resources\RU.png" Configuration="Release" Class="ProjectFile">
|
||||
<Platform Name="Win32">
|
||||
<RemoteDir>.\</RemoteDir>
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="Resources\US.png" Configuration="Release" Class="ProjectFile"/>
|
||||
<DeployFile LocalName="Resources\US.png" Configuration="Release" Class="ProjectFile">
|
||||
<Platform Name="Win32">
|
||||
<RemoteDir>.\</RemoteDir>
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="Resources\VN.png" Configuration="Release" Class="ProjectFile">
|
||||
<Platform Name="Win32">
|
||||
<RemoteDir>.\</RemoteDir>
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="Resources\fr.png" Configuration="Release" Class="ProjectFile"/>
|
||||
<DeployFile LocalName="Resources\fr.png" Configuration="Release" Class="ProjectFile">
|
||||
<Platform Name="Win32">
|
||||
<RemoteDir>.\</RemoteDir>
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="Resources\hu.png" Configuration="Release" Class="ProjectFile"/>
|
||||
<DeployFile LocalName="Resources\hu.png" Configuration="Release" Class="ProjectFile">
|
||||
<Platform Name="Win32">
|
||||
<RemoteDir>.\</RemoteDir>
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployFile LocalName="Resources\pl.png" Configuration="Release" Class="ProjectFile">
|
||||
<Platform Name="Win32">
|
||||
<RemoteDir>.\</RemoteDir>
|
||||
<Overwrite>true</Overwrite>
|
||||
</Platform>
|
||||
</DeployFile>
|
||||
<DeployClass Name="AdditionalDebugSymbols">
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
|
|
@ -530,16 +394,6 @@
|
|||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="AndroidSplashImageDefV21">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-anydpi-v21</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-anydpi-v21</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="AndroidSplashStyles">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\values</RemoteDir>
|
||||
|
|
@ -560,66 +414,6 @@
|
|||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="AndroidSplashStylesV31">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\values-v31</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\values-v31</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_AdaptiveIcon">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-anydpi-v26</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-anydpi-v26</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_AdaptiveIconBackground">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_AdaptiveIconForeground">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_AdaptiveIconMonochrome">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_AdaptiveIconV33">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-anydpi-v33</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-anydpi-v33</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_Colors">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\values</RemoteDir>
|
||||
|
|
@ -630,16 +424,6 @@
|
|||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_ColorsDark">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\values-night-v21</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\values-night-v21</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_DefaultAppIcon">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable</RemoteDir>
|
||||
|
|
@ -810,56 +594,6 @@
|
|||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_VectorizedNotificationIcon">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-anydpi-v24</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-anydpi-v24</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_VectorizedSplash">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_VectorizedSplashDark">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-night-anydpi-v21</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-night-anydpi-v21</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_VectorizedSplashV31">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-anydpi-v31</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-anydpi-v31</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="Android_VectorizedSplashV31Dark">
|
||||
<Platform Name="Android">
|
||||
<RemoteDir>res\drawable-night-anydpi-v31</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Android64">
|
||||
<RemoteDir>res\drawable-night-anydpi-v31</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="DebugSymbols">
|
||||
<Platform Name="iOSSimulator">
|
||||
<Operation>1</Operation>
|
||||
|
|
@ -1100,9 +834,6 @@
|
|||
<Platform Name="Win64">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Win64x">
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="ProjectiOSDeviceDebug">
|
||||
<Platform Name="iOSDevice32">
|
||||
|
|
@ -1173,10 +904,6 @@
|
|||
<RemoteDir>Assets</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Win64x">
|
||||
<RemoteDir>Assets</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="UWP_CppLogo44">
|
||||
<Platform Name="Win32">
|
||||
|
|
@ -1187,10 +914,6 @@
|
|||
<RemoteDir>Assets</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
<Platform Name="Win64x">
|
||||
<RemoteDir>Assets</RemoteDir>
|
||||
<Operation>1</Operation>
|
||||
</Platform>
|
||||
</DeployClass>
|
||||
<DeployClass Name="iOS_AppStore1024">
|
||||
<Platform Name="iOSDevice64">
|
||||
|
|
@ -1404,12 +1127,10 @@
|
|||
<ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME).app"/>
|
||||
<ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/>
|
||||
<ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/>
|
||||
<ProjectRoot Platform="Win64x" Name="$(PROJECTNAME)"/>
|
||||
</Deployment>
|
||||
<Platforms>
|
||||
<Platform value="Win32">True</Platform>
|
||||
<Platform value="Win64">False</Platform>
|
||||
<Platform value="Win64x">False</Platform>
|
||||
</Platforms>
|
||||
</BorlandProject>
|
||||
<ProjectFileVersion>12</ProjectFileVersion>
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
#include <Vcl.Themes.hpp>
|
||||
USEFORM("ConfigFormUnit.cpp", ConfigForm);
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\")
|
||||
|
||||
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
|
||||
|
|
@ -34,12 +35,7 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
|
|||
return 0;
|
||||
}
|
||||
|
||||
auto iniPath = System::Sysutils::GetEnvironmentVariable(
|
||||
"CNC_DDRAW_CONFIG_FILE");
|
||||
|
||||
auto *ini =
|
||||
new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini");
|
||||
|
||||
auto *ini = new TIniFile(GAME_PATH + "ddraw.ini");
|
||||
auto theme = ini->ReadString("ddraw", "configtheme", "Windows10");
|
||||
|
||||
TStyleManager::TrySetStyle(
|
||||
|
|
@ -67,15 +63,4 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// dummy functions to avoid Wtsapi32.dll imports
|
||||
EXTERN_C BOOL WINAPI WTSRegisterSessionNotification(HWND hWnd, DWORD dwFlags)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
EXTERN_C BOOL WINAPI WTSUnRegisterSessionNotification(HWND hWnd)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -4,7 +4,5 @@ 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_PL RCDATA "Resources\\pl.png"
|
||||
PngImage_RU RCDATA "Resources\\RU.png"
|
||||
PngImage_US RCDATA "Resources\\US.png"
|
||||
PngImage_VN RCDATA "Resources\\VN.png"
|
||||
|
|
|
|||
|
|
@ -18,8 +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
|
||||
DDIsWindowed
|
||||
DDGetProcAddress
|
||||
DDEnableZoom
|
||||
37
ddraw.rc
Normal file
37
ddraw.rc
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
#define str(s) #s
|
||||
#define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d)
|
||||
|
||||
#define VERSION_MAJOR 4
|
||||
#define VERSION_MINOR 4
|
||||
#define VERSION_BUILD 5
|
||||
#define VERSION_REVISION 0
|
||||
|
||||
#define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION
|
||||
#define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION)
|
||||
|
||||
1 VERSIONINFO
|
||||
FILEVERSION VERSION
|
||||
PRODUCTVERSION VERSION
|
||||
{
|
||||
BLOCK "StringFileInfo"
|
||||
{
|
||||
BLOCK "040904B0"
|
||||
{
|
||||
VALUE "CompanyName", "cncnet.org"
|
||||
VALUE "FileDescription", "DirectDraw replacement"
|
||||
VALUE "FileVersion", VERSION_STRING
|
||||
VALUE "InternalName", "ddraw"
|
||||
VALUE "LegalCopyright", "Copyright (c) 2010-2021"
|
||||
VALUE "LegalTrademarks", ""
|
||||
VALUE "OriginalFileName", "ddraw.dll"
|
||||
VALUE "ProductName", "cnc-ddraw"
|
||||
VALUE "ProductVersion", VERSION_STRING
|
||||
VALUE "Comments", "https://cncnet.org"
|
||||
}
|
||||
}
|
||||
|
||||
BLOCK "VarFileInfo"
|
||||
{
|
||||
VALUE "Translation", 0x0409, 0x04B0
|
||||
}
|
||||
}
|
||||
|
|
@ -3,7 +3,6 @@
|
|||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include "d3dcaps.h"
|
||||
|
||||
|
||||
DEFINE_GUID(IID_IDirect3D, 0x3BBA0080, 0x2421, 0x11CF, 0xA3, 0x1A, 0x00, 0xAA, 0x00, 0xB9, 0x33, 0x56);
|
||||
|
|
@ -11,9 +10,6 @@ DEFINE_GUID(IID_IDirect3D2, 0x6aae1ec1, 0x662a, 0x11d0, 0x88, 0x9d, 0x00, 0xaa,
|
|||
DEFINE_GUID(IID_IDirect3D3, 0xbb223240, 0xe72b, 0x11d0, 0xa9, 0xb4, 0x00, 0xaa, 0x00, 0xc0, 0x99, 0x3e);
|
||||
DEFINE_GUID(IID_IDirect3D7, 0xf5049e77, 0x4861, 0x11d2, 0xa4, 0x7, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8);
|
||||
|
||||
DEFINE_GUID(IID_IDirect3DNullDevice, 0x8767df22, 0xbacc, 0x11d1, 0x89, 0x69, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8);
|
||||
|
||||
|
||||
#define DECLARE_D3D_INTERFACE(iface) typedef struct iface { \
|
||||
struct iface##Vtbl FAR* lpVtbl; \
|
||||
ULONG ref; \
|
||||
|
|
@ -21,6 +17,7 @@ DEFINE_GUID(IID_IDirect3DNullDevice, 0x8767df22, 0xbacc, 0x11d1, 0x89, 0x69, 0x0
|
|||
typedef struct iface##Vtbl iface##Vtbl; \
|
||||
struct iface##Vtbl
|
||||
|
||||
|
||||
/* IID_IDirect3D */
|
||||
|
||||
DECLARE_D3D_INTERFACE(IDirect3DImpl)
|
||||
|
|
@ -30,7 +27,7 @@ DECLARE_D3D_INTERFACE(IDirect3DImpl)
|
|||
ULONG(__stdcall * Release) (IDirect3DImpl*);
|
||||
|
||||
HRESULT(__stdcall * Initialize)(IDirect3DImpl*, int);
|
||||
HRESULT(__stdcall * EnumDevices)(IDirect3DImpl*, LPD3DENUMDEVICESCALLBACK, LPVOID);
|
||||
HRESULT(__stdcall * EnumDevices)(IDirect3DImpl*, int, int);
|
||||
HRESULT(__stdcall * CreateLight)(IDirect3DImpl*, int, int);
|
||||
HRESULT(__stdcall * CreateMaterial)(IDirect3DImpl*, int, int);
|
||||
HRESULT(__stdcall * CreateViewport)(IDirect3DImpl*, int, int);
|
||||
|
|
@ -47,7 +44,7 @@ DECLARE_D3D_INTERFACE(IDirect3D2Impl)
|
|||
ULONG(__stdcall * AddRef) (IDirect3D2Impl*);
|
||||
ULONG(__stdcall * Release) (IDirect3D2Impl*);
|
||||
|
||||
HRESULT(__stdcall * EnumDevices)(IDirect3D2Impl*, LPD3DENUMDEVICESCALLBACK, LPVOID);
|
||||
HRESULT(__stdcall * EnumDevices)(IDirect3D2Impl*, int, int);
|
||||
HRESULT(__stdcall * CreateLight)(IDirect3D2Impl*, int, int);
|
||||
HRESULT(__stdcall * CreateMaterial)(IDirect3D2Impl*, int, int);
|
||||
HRESULT(__stdcall * CreateViewport)(IDirect3D2Impl*, int, int);
|
||||
|
|
@ -65,7 +62,7 @@ DECLARE_D3D_INTERFACE(IDirect3D3Impl)
|
|||
ULONG(__stdcall * AddRef) (IDirect3D3Impl*);
|
||||
ULONG(__stdcall * Release) (IDirect3D3Impl*);
|
||||
|
||||
HRESULT(__stdcall * EnumDevices)(IDirect3D3Impl*, LPD3DENUMDEVICESCALLBACK, LPVOID);
|
||||
HRESULT(__stdcall * EnumDevices)(IDirect3D3Impl*, int, int);
|
||||
HRESULT(__stdcall * CreateLight)(IDirect3D3Impl*, int, int);
|
||||
HRESULT(__stdcall * CreateMaterial)(IDirect3D3Impl*, int, int);
|
||||
HRESULT(__stdcall * CreateViewport)(IDirect3D3Impl*, int, int);
|
||||
|
|
@ -86,7 +83,7 @@ DECLARE_D3D_INTERFACE(IDirect3D7Impl)
|
|||
ULONG(__stdcall * AddRef) (IDirect3D7Impl*);
|
||||
ULONG(__stdcall * Release) (IDirect3D7Impl*);
|
||||
|
||||
HRESULT(__stdcall * EnumDevices)(IDirect3D7Impl*, LPD3DENUMDEVICESCALLBACK7, LPVOID);
|
||||
HRESULT(__stdcall * EnumDevices)(IDirect3D7Impl*, int, int);
|
||||
HRESULT(__stdcall * CreateDevice)(IDirect3D7Impl*, int, int, int);
|
||||
HRESULT(__stdcall * CreateVertexBuffer)(IDirect3D7Impl*, int, int, int);
|
||||
HRESULT(__stdcall * EnumZBufferFormats)(IDirect3D7Impl*, int, int, int);
|
||||
|
|
|
|||
|
|
@ -14,9 +14,6 @@ typedef struct IDirectDrawClipperImpl
|
|||
struct IDirectDrawClipperImplVtbl* lpVtbl;
|
||||
|
||||
ULONG ref;
|
||||
HWND hwnd;
|
||||
HRGN region;
|
||||
CRITICAL_SECTION cs;
|
||||
|
||||
} IDirectDrawClipperImpl;
|
||||
|
||||
|
|
|
|||
|
|
@ -9,11 +9,6 @@
|
|||
#include "IDirectDraw.h"
|
||||
|
||||
|
||||
typedef struct DDBITMAPINFO{
|
||||
BITMAPINFOHEADER bmiHeader;
|
||||
RGBQUAD bmiColors[256];
|
||||
} DDBITMAPINFO;
|
||||
|
||||
struct IDirectDrawSurfaceImpl;
|
||||
struct IDirectDrawSurfaceImplVtbl;
|
||||
|
||||
|
|
@ -23,34 +18,28 @@ typedef struct IDirectDrawSurfaceImpl
|
|||
|
||||
ULONG ref;
|
||||
|
||||
DWORD bpp;
|
||||
DWORD width;
|
||||
DWORD height;
|
||||
DWORD size;
|
||||
DWORD bpp;
|
||||
DWORD flags;
|
||||
DWORD caps;
|
||||
DWORD backbuffer_count;
|
||||
CRITICAL_SECTION cs;
|
||||
|
||||
IDirectDrawPaletteImpl* palette;
|
||||
PALETTEENTRY selected_pal[256];
|
||||
UINT selected_pal_count;
|
||||
|
||||
void* surface;
|
||||
HANDLE mapping;
|
||||
DWORD pitch;
|
||||
DWORD bytes_pp;
|
||||
BOOL custom_buf;
|
||||
DWORD l_pitch;
|
||||
DWORD lx_pitch;
|
||||
|
||||
void* bnet_surface;
|
||||
HDC bnet_dc;
|
||||
HBITMAP bnet_bitmap;
|
||||
|
||||
PBITMAPINFO bmi;
|
||||
HBITMAP bitmap;
|
||||
HDC hdc;
|
||||
int dc_state;
|
||||
DDCOLORKEY color_key;
|
||||
DWORD last_flip_tick;
|
||||
DWORD last_blt_tick;
|
||||
BOOL queried;
|
||||
BOOL skip_flip; /* Quest for Glory 5 */
|
||||
|
||||
struct IDirectDrawSurfaceImpl* backbuffer;
|
||||
struct IDirectDrawClipperImpl* clipper;
|
||||
|
|
|
|||
141
inc/blt.h
141
inc/blt.h
|
|
@ -1,141 +0,0 @@
|
|||
#ifndef BLT_H
|
||||
#define BLT_H
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
|
||||
|
||||
extern BOOL g_blt_use_avx;
|
||||
|
||||
void blt_copy(
|
||||
unsigned char* dst,
|
||||
unsigned char* src,
|
||||
size_t size);
|
||||
|
||||
void blt_clean(
|
||||
unsigned char* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned char* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_p,
|
||||
int bpp);
|
||||
|
||||
void blt_overlap(
|
||||
unsigned char* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned char* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_p,
|
||||
int bpp);
|
||||
|
||||
void blt_colorkey(
|
||||
unsigned char* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned char* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_p,
|
||||
unsigned int key_low,
|
||||
unsigned int key_high,
|
||||
int bpp);
|
||||
|
||||
void blt_colorkey_mirror_stretch(
|
||||
unsigned char* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned char* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_w,
|
||||
int src_h,
|
||||
int src_p,
|
||||
unsigned int key_low,
|
||||
unsigned int key_high,
|
||||
BOOL mirror_up_down,
|
||||
BOOL mirror_left_right,
|
||||
int bpp);
|
||||
|
||||
void blt_clear(
|
||||
unsigned char* dst,
|
||||
char color,
|
||||
size_t size);
|
||||
|
||||
void blt_colorfill(
|
||||
unsigned char* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned int color,
|
||||
int bpp);
|
||||
|
||||
void blt_rgb565_to_rgba8888(
|
||||
unsigned int* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned short* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_p);
|
||||
|
||||
void blt_rgb555_to_rgba8888(
|
||||
unsigned int* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned short* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_p);
|
||||
|
||||
void blt_bgra8888_to_rgba8888(
|
||||
unsigned int* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned int* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_p);
|
||||
|
||||
void blt_stretch(
|
||||
unsigned char* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned char* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_w,
|
||||
int src_h,
|
||||
int src_p,
|
||||
int bpp);
|
||||
|
||||
#endif
|
||||
99
inc/config.h
99
inc/config.h
|
|
@ -1,10 +1,9 @@
|
|||
#ifndef CONFIG_H
|
||||
#define CONFIG_H
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include "ini.h"
|
||||
|
||||
#define FILE_EXISTS(a) (GetFileAttributes(a) != INVALID_FILE_ATTRIBUTES)
|
||||
|
||||
typedef struct CNCDDRAWCONFIG
|
||||
{
|
||||
|
|
@ -13,100 +12,8 @@ typedef struct CNCDDRAWCONFIG
|
|||
int upscaled_state;
|
||||
char ini_path[MAX_PATH];
|
||||
char game_path[MAX_PATH];
|
||||
char dll_path[MAX_PATH];
|
||||
char process_file_name[MAX_PATH];
|
||||
char dll_file_name[MAX_PATH];
|
||||
char process_file_ext[MAX_PATH];
|
||||
char dll_file_ext[MAX_PATH];
|
||||
char game_section[MAX_PATH];
|
||||
INIFILE ini;
|
||||
BOOL d3d9on12;
|
||||
BOOL opengl_core;
|
||||
|
||||
/* Optional settings */
|
||||
|
||||
BOOL fullscreen;
|
||||
BOOL windowed;
|
||||
BOOL maintas;
|
||||
char aspect_ratio[16];
|
||||
BOOL boxing;
|
||||
int maxfps;
|
||||
BOOL vsync;
|
||||
BOOL adjmouse;
|
||||
char shader[MAX_PATH];
|
||||
char renderer[256];
|
||||
BOOL devmode;
|
||||
BOOL border;
|
||||
int save_settings;
|
||||
BOOL resizable;
|
||||
int d3d9_filter;
|
||||
int anti_aliased_fonts_min_size;
|
||||
int min_font_size;
|
||||
int center_window;
|
||||
char inject_resolution[128];
|
||||
BOOL vhack;
|
||||
char screenshot_dir[MAX_PATH];
|
||||
BOOL toggle_borderless;
|
||||
BOOL toggle_upscaled;
|
||||
|
||||
/* Compatibility settings */
|
||||
|
||||
BOOL noactivateapp;
|
||||
int maxgameticks;
|
||||
int limiter_type;
|
||||
int minfps;
|
||||
BOOL nonexclusive;
|
||||
BOOL singlecpu;
|
||||
int resolutions;
|
||||
int fixchilds;
|
||||
BOOL hook_peekmessage;
|
||||
|
||||
/* Undocumented settings */
|
||||
|
||||
BOOL fix_alt_key_stuck;
|
||||
BOOL fix_not_responding;
|
||||
BOOL no_compat_warning;
|
||||
int guard_lines;
|
||||
int max_resolutions;
|
||||
BOOL lock_surfaces;
|
||||
BOOL flipclear;
|
||||
BOOL rgb555;
|
||||
BOOL no_dinput_hook;
|
||||
BOOL center_cursor_fix;
|
||||
char fake_mode[128];
|
||||
BOOL lock_mouse_top_left;
|
||||
char win_version[32];
|
||||
int hook;
|
||||
BOOL limit_gdi_handles;
|
||||
BOOL remove_menu;
|
||||
int refresh_rate;
|
||||
int terminate_process;
|
||||
|
||||
/* Hotkeys */
|
||||
|
||||
struct
|
||||
{
|
||||
int toggle_fullscreen;
|
||||
int toggle_fullscreen2;
|
||||
int toggle_maximize;
|
||||
int toggle_maximize2;
|
||||
int unlock_cursor1;
|
||||
int unlock_cursor2;
|
||||
int screenshot;
|
||||
} hotkeys;
|
||||
|
||||
/* Game specific settings */
|
||||
|
||||
BOOL armadahack;
|
||||
BOOL tshack;
|
||||
BOOL infantryhack;
|
||||
BOOL stronghold_hack;
|
||||
BOOL mgs_hack;
|
||||
BOOL tlc_hack;
|
||||
BOOL carma95_hack;
|
||||
BOOL sirtech_hack;
|
||||
BOOL flightsim98_hack;
|
||||
BOOL darkcolony_hack;
|
||||
|
||||
} CNCDDRAWCONFIG;
|
||||
|
||||
|
|
@ -115,4 +22,8 @@ extern CNCDDRAWCONFIG g_config;
|
|||
void cfg_load();
|
||||
void cfg_save();
|
||||
|
||||
BOOL cfg_get_bool(LPCSTR key, BOOL default_value);
|
||||
int cfg_get_int(LPCSTR key, int default_value);
|
||||
DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
11
inc/crc32.h
11
inc/crc32.h
|
|
@ -1,11 +0,0 @@
|
|||
#ifndef CRC32_H
|
||||
#define CRC32_H
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
|
||||
|
||||
unsigned long Crc32_ComputeBuf(unsigned long inCrc32, const void* buf, size_t bufLen);
|
||||
unsigned long Crc32_FromFile(unsigned long crc32, char* filename);
|
||||
|
||||
#endif
|
||||
1721
inc/d3d9shader.h
1721
inc/d3d9shader.h
File diff suppressed because it is too large
Load diff
607
inc/d3dcaps.h
607
inc/d3dcaps.h
|
|
@ -1,607 +0,0 @@
|
|||
/*==========================================================================;
|
||||
*
|
||||
* Copyright (C) Microsoft Corporation. All Rights Reserved.
|
||||
*
|
||||
* File: d3dcaps.h
|
||||
* Content: Direct3D capabilities include file
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
|
||||
#ifndef _D3DCAPS_H
|
||||
#define _D3DCAPS_H
|
||||
|
||||
/*
|
||||
* Pull in DirectDraw include file automatically:
|
||||
*/
|
||||
#include "ddraw.h"
|
||||
|
||||
#ifndef DIRECT3D_VERSION
|
||||
#define DIRECT3D_VERSION 0x0700
|
||||
#endif
|
||||
|
||||
#if defined(_X86_) || defined(_IA64_)
|
||||
#pragma pack(4)
|
||||
#endif
|
||||
|
||||
/* Description of capabilities of transform */
|
||||
|
||||
typedef struct _D3DTRANSFORMCAPS {
|
||||
DWORD dwSize;
|
||||
DWORD dwCaps;
|
||||
} D3DTRANSFORMCAPS, *LPD3DTRANSFORMCAPS;
|
||||
|
||||
#define D3DTRANSFORMCAPS_CLIP 0x00000001L /* Will clip whilst transforming */
|
||||
|
||||
/* Description of capabilities of lighting */
|
||||
|
||||
typedef struct _D3DLIGHTINGCAPS {
|
||||
DWORD dwSize;
|
||||
DWORD dwCaps; /* Lighting caps */
|
||||
DWORD dwLightingModel; /* Lighting model - RGB or mono */
|
||||
DWORD dwNumLights; /* Number of lights that can be handled */
|
||||
} D3DLIGHTINGCAPS, *LPD3DLIGHTINGCAPS;
|
||||
|
||||
#define D3DLIGHTINGMODEL_RGB 0x00000001L
|
||||
#define D3DLIGHTINGMODEL_MONO 0x00000002L
|
||||
|
||||
#define D3DLIGHTCAPS_POINT 0x00000001L /* Point lights supported */
|
||||
#define D3DLIGHTCAPS_SPOT 0x00000002L /* Spot lights supported */
|
||||
#define D3DLIGHTCAPS_DIRECTIONAL 0x00000004L /* Directional lights supported */
|
||||
#if(DIRECT3D_VERSION < 0x700)
|
||||
#define D3DLIGHTCAPS_PARALLELPOINT 0x00000008L /* Parallel point lights supported */
|
||||
#endif
|
||||
#if(DIRECT3D_VERSION < 0x500)
|
||||
#define D3DLIGHTCAPS_GLSPOT 0x00000010L /* GL syle spot lights supported */
|
||||
#endif
|
||||
|
||||
/* Description of capabilities for each primitive type */
|
||||
|
||||
typedef struct _D3DPrimCaps {
|
||||
DWORD dwSize;
|
||||
DWORD dwMiscCaps; /* Capability flags */
|
||||
DWORD dwRasterCaps;
|
||||
DWORD dwZCmpCaps;
|
||||
DWORD dwSrcBlendCaps;
|
||||
DWORD dwDestBlendCaps;
|
||||
DWORD dwAlphaCmpCaps;
|
||||
DWORD dwShadeCaps;
|
||||
DWORD dwTextureCaps;
|
||||
DWORD dwTextureFilterCaps;
|
||||
DWORD dwTextureBlendCaps;
|
||||
DWORD dwTextureAddressCaps;
|
||||
DWORD dwStippleWidth; /* maximum width and height of */
|
||||
DWORD dwStippleHeight; /* of supported stipple (up to 32x32) */
|
||||
} D3DPRIMCAPS, *LPD3DPRIMCAPS;
|
||||
|
||||
/* D3DPRIMCAPS dwMiscCaps */
|
||||
|
||||
#define D3DPMISCCAPS_MASKPLANES 0x00000001L
|
||||
#define D3DPMISCCAPS_MASKZ 0x00000002L
|
||||
#define D3DPMISCCAPS_LINEPATTERNREP 0x00000004L
|
||||
#define D3DPMISCCAPS_CONFORMANT 0x00000008L
|
||||
#define D3DPMISCCAPS_CULLNONE 0x00000010L
|
||||
#define D3DPMISCCAPS_CULLCW 0x00000020L
|
||||
#define D3DPMISCCAPS_CULLCCW 0x00000040L
|
||||
|
||||
/* D3DPRIMCAPS dwRasterCaps */
|
||||
|
||||
#define D3DPRASTERCAPS_DITHER 0x00000001L
|
||||
#define D3DPRASTERCAPS_ROP2 0x00000002L
|
||||
#define D3DPRASTERCAPS_XOR 0x00000004L
|
||||
#define D3DPRASTERCAPS_PAT 0x00000008L
|
||||
#define D3DPRASTERCAPS_ZTEST 0x00000010L
|
||||
#define D3DPRASTERCAPS_SUBPIXEL 0x00000020L
|
||||
#define D3DPRASTERCAPS_SUBPIXELX 0x00000040L
|
||||
#define D3DPRASTERCAPS_FOGVERTEX 0x00000080L
|
||||
#define D3DPRASTERCAPS_FOGTABLE 0x00000100L
|
||||
#define D3DPRASTERCAPS_STIPPLE 0x00000200L
|
||||
#if(DIRECT3D_VERSION >= 0x0500)
|
||||
#define D3DPRASTERCAPS_ANTIALIASSORTDEPENDENT 0x00000400L
|
||||
#define D3DPRASTERCAPS_ANTIALIASSORTINDEPENDENT 0x00000800L
|
||||
#define D3DPRASTERCAPS_ANTIALIASEDGES 0x00001000L
|
||||
#define D3DPRASTERCAPS_MIPMAPLODBIAS 0x00002000L
|
||||
#define D3DPRASTERCAPS_ZBIAS 0x00004000L
|
||||
#define D3DPRASTERCAPS_ZBUFFERLESSHSR 0x00008000L
|
||||
#define D3DPRASTERCAPS_FOGRANGE 0x00010000L
|
||||
#define D3DPRASTERCAPS_ANISOTROPY 0x00020000L
|
||||
#endif /* DIRECT3D_VERSION >= 0x0500 */
|
||||
#if(DIRECT3D_VERSION >= 0x0600)
|
||||
#define D3DPRASTERCAPS_WBUFFER 0x00040000L
|
||||
#define D3DPRASTERCAPS_TRANSLUCENTSORTINDEPENDENT 0x00080000L
|
||||
#define D3DPRASTERCAPS_WFOG 0x00100000L
|
||||
#define D3DPRASTERCAPS_ZFOG 0x00200000L
|
||||
#endif /* DIRECT3D_VERSION >= 0x0600 */
|
||||
|
||||
/* D3DPRIMCAPS dwZCmpCaps, dwAlphaCmpCaps */
|
||||
|
||||
#define D3DPCMPCAPS_NEVER 0x00000001L
|
||||
#define D3DPCMPCAPS_LESS 0x00000002L
|
||||
#define D3DPCMPCAPS_EQUAL 0x00000004L
|
||||
#define D3DPCMPCAPS_LESSEQUAL 0x00000008L
|
||||
#define D3DPCMPCAPS_GREATER 0x00000010L
|
||||
#define D3DPCMPCAPS_NOTEQUAL 0x00000020L
|
||||
#define D3DPCMPCAPS_GREATEREQUAL 0x00000040L
|
||||
#define D3DPCMPCAPS_ALWAYS 0x00000080L
|
||||
|
||||
/* D3DPRIMCAPS dwSourceBlendCaps, dwDestBlendCaps */
|
||||
|
||||
#define D3DPBLENDCAPS_ZERO 0x00000001L
|
||||
#define D3DPBLENDCAPS_ONE 0x00000002L
|
||||
#define D3DPBLENDCAPS_SRCCOLOR 0x00000004L
|
||||
#define D3DPBLENDCAPS_INVSRCCOLOR 0x00000008L
|
||||
#define D3DPBLENDCAPS_SRCALPHA 0x00000010L
|
||||
#define D3DPBLENDCAPS_INVSRCALPHA 0x00000020L
|
||||
#define D3DPBLENDCAPS_DESTALPHA 0x00000040L
|
||||
#define D3DPBLENDCAPS_INVDESTALPHA 0x00000080L
|
||||
#define D3DPBLENDCAPS_DESTCOLOR 0x00000100L
|
||||
#define D3DPBLENDCAPS_INVDESTCOLOR 0x00000200L
|
||||
#define D3DPBLENDCAPS_SRCALPHASAT 0x00000400L
|
||||
#define D3DPBLENDCAPS_BOTHSRCALPHA 0x00000800L
|
||||
#define D3DPBLENDCAPS_BOTHINVSRCALPHA 0x00001000L
|
||||
|
||||
/* D3DPRIMCAPS dwShadeCaps */
|
||||
|
||||
#define D3DPSHADECAPS_COLORFLATMONO 0x00000001L
|
||||
#define D3DPSHADECAPS_COLORFLATRGB 0x00000002L
|
||||
#define D3DPSHADECAPS_COLORGOURAUDMONO 0x00000004L
|
||||
#define D3DPSHADECAPS_COLORGOURAUDRGB 0x00000008L
|
||||
#define D3DPSHADECAPS_COLORPHONGMONO 0x00000010L
|
||||
#define D3DPSHADECAPS_COLORPHONGRGB 0x00000020L
|
||||
|
||||
#define D3DPSHADECAPS_SPECULARFLATMONO 0x00000040L
|
||||
#define D3DPSHADECAPS_SPECULARFLATRGB 0x00000080L
|
||||
#define D3DPSHADECAPS_SPECULARGOURAUDMONO 0x00000100L
|
||||
#define D3DPSHADECAPS_SPECULARGOURAUDRGB 0x00000200L
|
||||
#define D3DPSHADECAPS_SPECULARPHONGMONO 0x00000400L
|
||||
#define D3DPSHADECAPS_SPECULARPHONGRGB 0x00000800L
|
||||
|
||||
#define D3DPSHADECAPS_ALPHAFLATBLEND 0x00001000L
|
||||
#define D3DPSHADECAPS_ALPHAFLATSTIPPLED 0x00002000L
|
||||
#define D3DPSHADECAPS_ALPHAGOURAUDBLEND 0x00004000L
|
||||
#define D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED 0x00008000L
|
||||
#define D3DPSHADECAPS_ALPHAPHONGBLEND 0x00010000L
|
||||
#define D3DPSHADECAPS_ALPHAPHONGSTIPPLED 0x00020000L
|
||||
|
||||
#define D3DPSHADECAPS_FOGFLAT 0x00040000L
|
||||
#define D3DPSHADECAPS_FOGGOURAUD 0x00080000L
|
||||
#define D3DPSHADECAPS_FOGPHONG 0x00100000L
|
||||
|
||||
/* D3DPRIMCAPS dwTextureCaps */
|
||||
|
||||
/*
|
||||
* Perspective-correct texturing is supported
|
||||
*/
|
||||
#define D3DPTEXTURECAPS_PERSPECTIVE 0x00000001L
|
||||
|
||||
/*
|
||||
* Power-of-2 texture dimensions are required
|
||||
*/
|
||||
#define D3DPTEXTURECAPS_POW2 0x00000002L
|
||||
|
||||
/*
|
||||
* Alpha in texture pixels is supported
|
||||
*/
|
||||
#define D3DPTEXTURECAPS_ALPHA 0x00000004L
|
||||
|
||||
/*
|
||||
* Color-keyed textures are supported
|
||||
*/
|
||||
#define D3DPTEXTURECAPS_TRANSPARENCY 0x00000008L
|
||||
|
||||
/*
|
||||
* obsolete, see D3DPTADDRESSCAPS_BORDER
|
||||
*/
|
||||
#define D3DPTEXTURECAPS_BORDER 0x00000010L
|
||||
|
||||
/*
|
||||
* Only square textures are supported
|
||||
*/
|
||||
#define D3DPTEXTURECAPS_SQUAREONLY 0x00000020L
|
||||
|
||||
#if(DIRECT3D_VERSION >= 0x0600)
|
||||
/*
|
||||
* Texture indices are not scaled by the texture size prior
|
||||
* to interpolation.
|
||||
*/
|
||||
#define D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE 0x00000040L
|
||||
|
||||
/*
|
||||
* Device can draw alpha from texture palettes
|
||||
*/
|
||||
#define D3DPTEXTURECAPS_ALPHAPALETTE 0x00000080L
|
||||
|
||||
/*
|
||||
* Device can use non-POW2 textures if:
|
||||
* 1) D3DTEXTURE_ADDRESS is set to CLAMP for this texture's stage
|
||||
* 2) D3DRS_WRAP(N) is zero for this texture's coordinates
|
||||
* 3) mip mapping is not enabled (use magnification filter only)
|
||||
*/
|
||||
#define D3DPTEXTURECAPS_NONPOW2CONDITIONAL 0x00000100L
|
||||
|
||||
#endif /* DIRECT3D_VERSION >= 0x0600 */
|
||||
#if(DIRECT3D_VERSION >= 0x0700)
|
||||
|
||||
// 0x00000200L unused
|
||||
|
||||
/*
|
||||
* Device can divide transformed texture coordinates by the
|
||||
* COUNTth texture coordinate (can do D3DTTFF_PROJECTED)
|
||||
*/
|
||||
#define D3DPTEXTURECAPS_PROJECTED 0x00000400L
|
||||
|
||||
/*
|
||||
* Device can do cubemap textures
|
||||
*/
|
||||
#define D3DPTEXTURECAPS_CUBEMAP 0x00000800L
|
||||
|
||||
#define D3DPTEXTURECAPS_COLORKEYBLEND 0x00001000L
|
||||
#endif /* DIRECT3D_VERSION >= 0x0700 */
|
||||
|
||||
/* D3DPRIMCAPS dwTextureFilterCaps */
|
||||
|
||||
#define D3DPTFILTERCAPS_NEAREST 0x00000001L
|
||||
#define D3DPTFILTERCAPS_LINEAR 0x00000002L
|
||||
#define D3DPTFILTERCAPS_MIPNEAREST 0x00000004L
|
||||
#define D3DPTFILTERCAPS_MIPLINEAR 0x00000008L
|
||||
#define D3DPTFILTERCAPS_LINEARMIPNEAREST 0x00000010L
|
||||
#define D3DPTFILTERCAPS_LINEARMIPLINEAR 0x00000020L
|
||||
|
||||
#if(DIRECT3D_VERSION >= 0x0600)
|
||||
/* Device3 Min Filter */
|
||||
#define D3DPTFILTERCAPS_MINFPOINT 0x00000100L
|
||||
#define D3DPTFILTERCAPS_MINFLINEAR 0x00000200L
|
||||
#define D3DPTFILTERCAPS_MINFANISOTROPIC 0x00000400L
|
||||
|
||||
/* Device3 Mip Filter */
|
||||
#define D3DPTFILTERCAPS_MIPFPOINT 0x00010000L
|
||||
#define D3DPTFILTERCAPS_MIPFLINEAR 0x00020000L
|
||||
|
||||
/* Device3 Mag Filter */
|
||||
#define D3DPTFILTERCAPS_MAGFPOINT 0x01000000L
|
||||
#define D3DPTFILTERCAPS_MAGFLINEAR 0x02000000L
|
||||
#define D3DPTFILTERCAPS_MAGFANISOTROPIC 0x04000000L
|
||||
#define D3DPTFILTERCAPS_MAGFAFLATCUBIC 0x08000000L
|
||||
#define D3DPTFILTERCAPS_MAGFGAUSSIANCUBIC 0x10000000L
|
||||
#endif /* DIRECT3D_VERSION >= 0x0600 */
|
||||
|
||||
/* D3DPRIMCAPS dwTextureBlendCaps */
|
||||
|
||||
#define D3DPTBLENDCAPS_DECAL 0x00000001L
|
||||
#define D3DPTBLENDCAPS_MODULATE 0x00000002L
|
||||
#define D3DPTBLENDCAPS_DECALALPHA 0x00000004L
|
||||
#define D3DPTBLENDCAPS_MODULATEALPHA 0x00000008L
|
||||
#define D3DPTBLENDCAPS_DECALMASK 0x00000010L
|
||||
#define D3DPTBLENDCAPS_MODULATEMASK 0x00000020L
|
||||
#define D3DPTBLENDCAPS_COPY 0x00000040L
|
||||
#if(DIRECT3D_VERSION >= 0x0500)
|
||||
#define D3DPTBLENDCAPS_ADD 0x00000080L
|
||||
#endif /* DIRECT3D_VERSION >= 0x0500 */
|
||||
|
||||
/* D3DPRIMCAPS dwTextureAddressCaps */
|
||||
#define D3DPTADDRESSCAPS_WRAP 0x00000001L
|
||||
#define D3DPTADDRESSCAPS_MIRROR 0x00000002L
|
||||
#define D3DPTADDRESSCAPS_CLAMP 0x00000004L
|
||||
#if(DIRECT3D_VERSION >= 0x0500)
|
||||
#define D3DPTADDRESSCAPS_BORDER 0x00000008L
|
||||
#define D3DPTADDRESSCAPS_INDEPENDENTUV 0x00000010L
|
||||
#endif /* DIRECT3D_VERSION >= 0x0500 */
|
||||
|
||||
#if(DIRECT3D_VERSION >= 0x0600)
|
||||
|
||||
/* D3DDEVICEDESC dwStencilCaps */
|
||||
|
||||
#define D3DSTENCILCAPS_KEEP 0x00000001L
|
||||
#define D3DSTENCILCAPS_ZERO 0x00000002L
|
||||
#define D3DSTENCILCAPS_REPLACE 0x00000004L
|
||||
#define D3DSTENCILCAPS_INCRSAT 0x00000008L
|
||||
#define D3DSTENCILCAPS_DECRSAT 0x00000010L
|
||||
#define D3DSTENCILCAPS_INVERT 0x00000020L
|
||||
#define D3DSTENCILCAPS_INCR 0x00000040L
|
||||
#define D3DSTENCILCAPS_DECR 0x00000080L
|
||||
|
||||
/* D3DDEVICEDESC dwTextureOpCaps */
|
||||
|
||||
#define D3DTEXOPCAPS_DISABLE 0x00000001L
|
||||
#define D3DTEXOPCAPS_SELECTARG1 0x00000002L
|
||||
#define D3DTEXOPCAPS_SELECTARG2 0x00000004L
|
||||
#define D3DTEXOPCAPS_MODULATE 0x00000008L
|
||||
#define D3DTEXOPCAPS_MODULATE2X 0x00000010L
|
||||
#define D3DTEXOPCAPS_MODULATE4X 0x00000020L
|
||||
#define D3DTEXOPCAPS_ADD 0x00000040L
|
||||
#define D3DTEXOPCAPS_ADDSIGNED 0x00000080L
|
||||
#define D3DTEXOPCAPS_ADDSIGNED2X 0x00000100L
|
||||
#define D3DTEXOPCAPS_SUBTRACT 0x00000200L
|
||||
#define D3DTEXOPCAPS_ADDSMOOTH 0x00000400L
|
||||
#define D3DTEXOPCAPS_BLENDDIFFUSEALPHA 0x00000800L
|
||||
#define D3DTEXOPCAPS_BLENDTEXTUREALPHA 0x00001000L
|
||||
#define D3DTEXOPCAPS_BLENDFACTORALPHA 0x00002000L
|
||||
#define D3DTEXOPCAPS_BLENDTEXTUREALPHAPM 0x00004000L
|
||||
#define D3DTEXOPCAPS_BLENDCURRENTALPHA 0x00008000L
|
||||
#define D3DTEXOPCAPS_PREMODULATE 0x00010000L
|
||||
#define D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR 0x00020000L
|
||||
#define D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA 0x00040000L
|
||||
#define D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR 0x00080000L
|
||||
#define D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA 0x00100000L
|
||||
#define D3DTEXOPCAPS_BUMPENVMAP 0x00200000L
|
||||
#define D3DTEXOPCAPS_BUMPENVMAPLUMINANCE 0x00400000L
|
||||
#define D3DTEXOPCAPS_DOTPRODUCT3 0x00800000L
|
||||
|
||||
/* D3DDEVICEDESC dwFVFCaps flags */
|
||||
|
||||
#define D3DFVFCAPS_TEXCOORDCOUNTMASK 0x0000ffffL /* mask for texture coordinate count field */
|
||||
#define D3DFVFCAPS_DONOTSTRIPELEMENTS 0x00080000L /* Device prefers that vertex elements not be stripped */
|
||||
|
||||
#endif /* DIRECT3D_VERSION >= 0x0600 */
|
||||
|
||||
typedef float D3DVALUE, *LPD3DVALUE;
|
||||
typedef DWORD D3DCOLORMODEL;
|
||||
|
||||
/*
|
||||
* Description for a device.
|
||||
* This is used to describe a device that is to be created or to query
|
||||
* the current device.
|
||||
*/
|
||||
typedef struct _D3DDeviceDesc {
|
||||
DWORD dwSize; /* Size of D3DDEVICEDESC structure */
|
||||
DWORD dwFlags; /* Indicates which fields have valid data */
|
||||
D3DCOLORMODEL dcmColorModel; /* Color model of device */
|
||||
DWORD dwDevCaps; /* Capabilities of device */
|
||||
D3DTRANSFORMCAPS dtcTransformCaps; /* Capabilities of transform */
|
||||
BOOL bClipping; /* Device can do 3D clipping */
|
||||
D3DLIGHTINGCAPS dlcLightingCaps; /* Capabilities of lighting */
|
||||
D3DPRIMCAPS dpcLineCaps;
|
||||
D3DPRIMCAPS dpcTriCaps;
|
||||
DWORD dwDeviceRenderBitDepth; /* One of DDBB_8, 16, etc.. */
|
||||
DWORD dwDeviceZBufferBitDepth;/* One of DDBD_16, 32, etc.. */
|
||||
DWORD dwMaxBufferSize; /* Maximum execute buffer size */
|
||||
DWORD dwMaxVertexCount; /* Maximum vertex count */
|
||||
//#if(DIRECT3D_VERSION >= 0x0500)
|
||||
// *** New fields for DX5 *** //
|
||||
|
||||
// Width and height caps are 0 for legacy HALs.
|
||||
DWORD dwMinTextureWidth, dwMinTextureHeight;
|
||||
DWORD dwMaxTextureWidth, dwMaxTextureHeight;
|
||||
DWORD dwMinStippleWidth, dwMaxStippleWidth;
|
||||
DWORD dwMinStippleHeight, dwMaxStippleHeight;
|
||||
//#endif /* DIRECT3D_VERSION >= 0x0500 */
|
||||
|
||||
//#if(DIRECT3D_VERSION >= 0x0600)
|
||||
// New fields for DX6
|
||||
DWORD dwMaxTextureRepeat;
|
||||
DWORD dwMaxTextureAspectRatio;
|
||||
DWORD dwMaxAnisotropy;
|
||||
|
||||
// Guard band that the rasterizer can accommodate
|
||||
// Screen-space vertices inside this space but outside the viewport
|
||||
// will get clipped properly.
|
||||
D3DVALUE dvGuardBandLeft;
|
||||
D3DVALUE dvGuardBandTop;
|
||||
D3DVALUE dvGuardBandRight;
|
||||
D3DVALUE dvGuardBandBottom;
|
||||
|
||||
D3DVALUE dvExtentsAdjust;
|
||||
DWORD dwStencilCaps;
|
||||
|
||||
DWORD dwFVFCaps;
|
||||
DWORD dwTextureOpCaps;
|
||||
WORD wMaxTextureBlendStages;
|
||||
WORD wMaxSimultaneousTextures;
|
||||
//#endif /* DIRECT3D_VERSION >= 0x0600 */
|
||||
} D3DDEVICEDESC, *LPD3DDEVICEDESC;
|
||||
|
||||
#if(DIRECT3D_VERSION >= 0x0700)
|
||||
typedef struct _D3DDeviceDesc7 {
|
||||
DWORD dwDevCaps; /* Capabilities of device */
|
||||
D3DPRIMCAPS dpcLineCaps;
|
||||
D3DPRIMCAPS dpcTriCaps;
|
||||
DWORD dwDeviceRenderBitDepth; /* One of DDBB_8, 16, etc.. */
|
||||
DWORD dwDeviceZBufferBitDepth;/* One of DDBD_16, 32, etc.. */
|
||||
|
||||
DWORD dwMinTextureWidth, dwMinTextureHeight;
|
||||
DWORD dwMaxTextureWidth, dwMaxTextureHeight;
|
||||
|
||||
DWORD dwMaxTextureRepeat;
|
||||
DWORD dwMaxTextureAspectRatio;
|
||||
DWORD dwMaxAnisotropy;
|
||||
|
||||
D3DVALUE dvGuardBandLeft;
|
||||
D3DVALUE dvGuardBandTop;
|
||||
D3DVALUE dvGuardBandRight;
|
||||
D3DVALUE dvGuardBandBottom;
|
||||
|
||||
D3DVALUE dvExtentsAdjust;
|
||||
DWORD dwStencilCaps;
|
||||
|
||||
DWORD dwFVFCaps;
|
||||
DWORD dwTextureOpCaps;
|
||||
WORD wMaxTextureBlendStages;
|
||||
WORD wMaxSimultaneousTextures;
|
||||
|
||||
DWORD dwMaxActiveLights;
|
||||
D3DVALUE dvMaxVertexW;
|
||||
GUID deviceGUID;
|
||||
|
||||
WORD wMaxUserClipPlanes;
|
||||
WORD wMaxVertexBlendMatrices;
|
||||
|
||||
DWORD dwVertexProcessingCaps;
|
||||
|
||||
DWORD dwReserved1;
|
||||
DWORD dwReserved2;
|
||||
DWORD dwReserved3;
|
||||
DWORD dwReserved4;
|
||||
} D3DDEVICEDESC7, *LPD3DDEVICEDESC7;
|
||||
#endif /* DIRECT3D_VERSION >= 0x0700 */
|
||||
|
||||
#define D3DDEVICEDESCSIZE (sizeof(D3DDEVICEDESC))
|
||||
#define D3DDEVICEDESC7SIZE (sizeof(D3DDEVICEDESC7))
|
||||
|
||||
typedef HRESULT (CALLBACK * LPD3DENUMDEVICESCALLBACK)(GUID FAR *lpGuid, LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC, LPD3DDEVICEDESC, LPVOID);
|
||||
|
||||
//#if(DIRECT3D_VERSION >= 0x0700)
|
||||
typedef HRESULT (CALLBACK * LPD3DENUMDEVICESCALLBACK7)(LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC7, LPVOID);
|
||||
//#endif /* DIRECT3D_VERSION >= 0x0700 */
|
||||
|
||||
/* D3DDEVICEDESC dwFlags indicating valid fields */
|
||||
|
||||
#define D3DDD_COLORMODEL 0x00000001L /* dcmColorModel is valid */
|
||||
#define D3DDD_DEVCAPS 0x00000002L /* dwDevCaps is valid */
|
||||
#define D3DDD_TRANSFORMCAPS 0x00000004L /* dtcTransformCaps is valid */
|
||||
#define D3DDD_LIGHTINGCAPS 0x00000008L /* dlcLightingCaps is valid */
|
||||
#define D3DDD_BCLIPPING 0x00000010L /* bClipping is valid */
|
||||
#define D3DDD_LINECAPS 0x00000020L /* dpcLineCaps is valid */
|
||||
#define D3DDD_TRICAPS 0x00000040L /* dpcTriCaps is valid */
|
||||
#define D3DDD_DEVICERENDERBITDEPTH 0x00000080L /* dwDeviceRenderBitDepth is valid */
|
||||
#define D3DDD_DEVICEZBUFFERBITDEPTH 0x00000100L /* dwDeviceZBufferBitDepth is valid */
|
||||
#define D3DDD_MAXBUFFERSIZE 0x00000200L /* dwMaxBufferSize is valid */
|
||||
#define D3DDD_MAXVERTEXCOUNT 0x00000400L /* dwMaxVertexCount is valid */
|
||||
|
||||
/* D3DDEVICEDESC dwDevCaps flags */
|
||||
|
||||
#define D3DDEVCAPS_FLOATTLVERTEX 0x00000001L /* Device accepts floating point */
|
||||
/* for post-transform vertex data */
|
||||
#define D3DDEVCAPS_SORTINCREASINGZ 0x00000002L /* Device needs data sorted for increasing Z */
|
||||
#define D3DDEVCAPS_SORTDECREASINGZ 0X00000004L /* Device needs data sorted for decreasing Z */
|
||||
#define D3DDEVCAPS_SORTEXACT 0x00000008L /* Device needs data sorted exactly */
|
||||
|
||||
#define D3DDEVCAPS_EXECUTESYSTEMMEMORY 0x00000010L /* Device can use execute buffers from system memory */
|
||||
#define D3DDEVCAPS_EXECUTEVIDEOMEMORY 0x00000020L /* Device can use execute buffers from video memory */
|
||||
#define D3DDEVCAPS_TLVERTEXSYSTEMMEMORY 0x00000040L /* Device can use TL buffers from system memory */
|
||||
#define D3DDEVCAPS_TLVERTEXVIDEOMEMORY 0x00000080L /* Device can use TL buffers from video memory */
|
||||
#define D3DDEVCAPS_TEXTURESYSTEMMEMORY 0x00000100L /* Device can texture from system memory */
|
||||
#define D3DDEVCAPS_TEXTUREVIDEOMEMORY 0x00000200L /* Device can texture from device memory */
|
||||
#if(DIRECT3D_VERSION >= 0x0500)
|
||||
#define D3DDEVCAPS_DRAWPRIMTLVERTEX 0x00000400L /* Device can draw TLVERTEX primitives */
|
||||
#define D3DDEVCAPS_CANRENDERAFTERFLIP 0x00000800L /* Device can render without waiting for flip to complete */
|
||||
#define D3DDEVCAPS_TEXTURENONLOCALVIDMEM 0x00001000L /* Device can texture from nonlocal video memory */
|
||||
#endif /* DIRECT3D_VERSION >= 0x0500 */
|
||||
#if(DIRECT3D_VERSION >= 0x0600)
|
||||
#define D3DDEVCAPS_DRAWPRIMITIVES2 0x00002000L /* Device can support DrawPrimitives2 */
|
||||
#define D3DDEVCAPS_SEPARATETEXTUREMEMORIES 0x00004000L /* Device is texturing from separate memory pools */
|
||||
#define D3DDEVCAPS_DRAWPRIMITIVES2EX 0x00008000L /* Device can support Extended DrawPrimitives2 i.e. DX7 compliant driver*/
|
||||
#endif /* DIRECT3D_VERSION >= 0x0600 */
|
||||
#if(DIRECT3D_VERSION >= 0x0700)
|
||||
#define D3DDEVCAPS_HWTRANSFORMANDLIGHT 0x00010000L /* Device can support transformation and lighting in hardware and DRAWPRIMITIVES2EX must be also */
|
||||
#define D3DDEVCAPS_CANBLTSYSTONONLOCAL 0x00020000L /* Device supports a Tex Blt from system memory to non-local vidmem */
|
||||
#define D3DDEVCAPS_HWRASTERIZATION 0x00080000L /* Device has HW acceleration for rasterization */
|
||||
|
||||
/*
|
||||
* These are the flags in the D3DDEVICEDESC7.dwVertexProcessingCaps field
|
||||
*/
|
||||
|
||||
/* device can do texgen */
|
||||
#define D3DVTXPCAPS_TEXGEN 0x00000001L
|
||||
/* device can do IDirect3DDevice7 colormaterialsource ops */
|
||||
#define D3DVTXPCAPS_MATERIALSOURCE7 0x00000002L
|
||||
/* device can do vertex fog */
|
||||
#define D3DVTXPCAPS_VERTEXFOG 0x00000004L
|
||||
/* device can do directional lights */
|
||||
#define D3DVTXPCAPS_DIRECTIONALLIGHTS 0x00000008L
|
||||
/* device can do positional lights (includes point and spot) */
|
||||
#define D3DVTXPCAPS_POSITIONALLIGHTS 0x00000010L
|
||||
/* device can do local viewer */
|
||||
#define D3DVTXPCAPS_LOCALVIEWER 0x00000020L
|
||||
|
||||
#endif /* DIRECT3D_VERSION >= 0x0700 */
|
||||
|
||||
#define D3DFDS_COLORMODEL 0x00000001L /* Match color model */
|
||||
#define D3DFDS_GUID 0x00000002L /* Match guid */
|
||||
#define D3DFDS_HARDWARE 0x00000004L /* Match hardware/software */
|
||||
#define D3DFDS_TRIANGLES 0x00000008L /* Match in triCaps */
|
||||
#define D3DFDS_LINES 0x00000010L /* Match in lineCaps */
|
||||
#define D3DFDS_MISCCAPS 0x00000020L /* Match primCaps.dwMiscCaps */
|
||||
#define D3DFDS_RASTERCAPS 0x00000040L /* Match primCaps.dwRasterCaps */
|
||||
#define D3DFDS_ZCMPCAPS 0x00000080L /* Match primCaps.dwZCmpCaps */
|
||||
#define D3DFDS_ALPHACMPCAPS 0x00000100L /* Match primCaps.dwAlphaCmpCaps */
|
||||
#define D3DFDS_SRCBLENDCAPS 0x00000200L /* Match primCaps.dwSourceBlendCaps */
|
||||
#define D3DFDS_DSTBLENDCAPS 0x00000400L /* Match primCaps.dwDestBlendCaps */
|
||||
#define D3DFDS_SHADECAPS 0x00000800L /* Match primCaps.dwShadeCaps */
|
||||
#define D3DFDS_TEXTURECAPS 0x00001000L /* Match primCaps.dwTextureCaps */
|
||||
#define D3DFDS_TEXTUREFILTERCAPS 0x00002000L /* Match primCaps.dwTextureFilterCaps */
|
||||
#define D3DFDS_TEXTUREBLENDCAPS 0x00004000L /* Match primCaps.dwTextureBlendCaps */
|
||||
#define D3DFDS_TEXTUREADDRESSCAPS 0x00008000L /* Match primCaps.dwTextureBlendCaps */
|
||||
|
||||
/*
|
||||
* FindDevice arguments
|
||||
*/
|
||||
typedef struct _D3DFINDDEVICESEARCH {
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
BOOL bHardware;
|
||||
D3DCOLORMODEL dcmColorModel;
|
||||
GUID guid;
|
||||
DWORD dwCaps;
|
||||
D3DPRIMCAPS dpcPrimCaps;
|
||||
} D3DFINDDEVICESEARCH, *LPD3DFINDDEVICESEARCH;
|
||||
|
||||
typedef struct _D3DFINDDEVICERESULT {
|
||||
DWORD dwSize;
|
||||
GUID guid; /* guid which matched */
|
||||
D3DDEVICEDESC ddHwDesc; /* hardware D3DDEVICEDESC */
|
||||
D3DDEVICEDESC ddSwDesc; /* software D3DDEVICEDESC */
|
||||
} D3DFINDDEVICERESULT, *LPD3DFINDDEVICERESULT;
|
||||
|
||||
/*
|
||||
* Description of execute buffer.
|
||||
*/
|
||||
typedef struct _D3DExecuteBufferDesc {
|
||||
DWORD dwSize; /* size of this structure */
|
||||
DWORD dwFlags; /* flags indicating which fields are valid */
|
||||
DWORD dwCaps; /* capabilities of execute buffer */
|
||||
DWORD dwBufferSize; /* size of execute buffer data */
|
||||
LPVOID lpData; /* pointer to actual data */
|
||||
} D3DEXECUTEBUFFERDESC, *LPD3DEXECUTEBUFFERDESC;
|
||||
|
||||
/* D3DEXECUTEBUFFER dwFlags indicating valid fields */
|
||||
|
||||
#define D3DDEB_BUFSIZE 0x00000001l /* buffer size valid */
|
||||
#define D3DDEB_CAPS 0x00000002l /* caps valid */
|
||||
#define D3DDEB_LPDATA 0x00000004l /* lpData valid */
|
||||
|
||||
/* D3DEXECUTEBUFFER dwCaps */
|
||||
|
||||
#define D3DDEBCAPS_SYSTEMMEMORY 0x00000001l /* buffer in system memory */
|
||||
#define D3DDEBCAPS_VIDEOMEMORY 0x00000002l /* buffer in device memory */
|
||||
#define D3DDEBCAPS_MEM (D3DDEBCAPS_SYSTEMMEMORY|D3DDEBCAPS_VIDEOMEMORY)
|
||||
|
||||
#if(DIRECT3D_VERSION < 0x0800)
|
||||
|
||||
#if(DIRECT3D_VERSION >= 0x0700)
|
||||
typedef struct _D3DDEVINFO_TEXTUREMANAGER {
|
||||
BOOL bThrashing; /* indicates if thrashing */
|
||||
DWORD dwApproxBytesDownloaded; /* Approximate number of bytes downloaded by texture manager */
|
||||
DWORD dwNumEvicts; /* number of textures evicted */
|
||||
DWORD dwNumVidCreates; /* number of textures created in video memory */
|
||||
DWORD dwNumTexturesUsed; /* number of textures used */
|
||||
DWORD dwNumUsedTexInVid; /* number of used textures present in video memory */
|
||||
DWORD dwWorkingSet; /* number of textures in video memory */
|
||||
DWORD dwWorkingSetBytes; /* number of bytes in video memory */
|
||||
DWORD dwTotalManaged; /* total number of managed textures */
|
||||
DWORD dwTotalBytes; /* total number of bytes of managed textures */
|
||||
DWORD dwLastPri; /* priority of last texture evicted */
|
||||
} D3DDEVINFO_TEXTUREMANAGER, *LPD3DDEVINFO_TEXTUREMANAGER;
|
||||
|
||||
typedef struct _D3DDEVINFO_TEXTURING {
|
||||
DWORD dwNumLoads; /* counts Load() API calls */
|
||||
DWORD dwApproxBytesLoaded; /* Approximate number bytes loaded via Load() */
|
||||
DWORD dwNumPreLoads; /* counts PreLoad() API calls */
|
||||
DWORD dwNumSet; /* counts SetTexture() API calls */
|
||||
DWORD dwNumCreates; /* counts texture creates */
|
||||
DWORD dwNumDestroys; /* counts texture destroys */
|
||||
DWORD dwNumSetPriorities; /* counts SetPriority() API calls */
|
||||
DWORD dwNumSetLODs; /* counts SetLOD() API calls */
|
||||
DWORD dwNumLocks; /* counts number of texture locks */
|
||||
DWORD dwNumGetDCs; /* counts number of GetDCs to textures */
|
||||
} D3DDEVINFO_TEXTURING, *LPD3DDEVINFO_TEXTURING;
|
||||
#endif /* DIRECT3D_VERSION >= 0x0700 */
|
||||
|
||||
#endif //(DIRECT3D_VERSION < 0x0800)
|
||||
|
||||
#pragma pack()
|
||||
|
||||
|
||||
#endif /* _D3DCAPS_H_ */
|
||||
|
||||
|
||||
130
inc/dd.h
130
inc/dd.h
|
|
@ -5,26 +5,21 @@
|
|||
#include <windows.h>
|
||||
#include "ddraw.h"
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define __try
|
||||
#define __except(x) if (0)
|
||||
#endif
|
||||
|
||||
typedef HRESULT(WINAPI* DIRECTDRAWCREATEPROC)(GUID FAR*, LPDIRECTDRAW FAR*, IUnknown FAR*);
|
||||
|
||||
ULONG dd_AddRef();
|
||||
ULONG dd_Release();
|
||||
HRESULT dd_EnumDisplayModes(DWORD dwFlags, LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext, LPDDENUMMODESCALLBACK lpEnumModesCallback);
|
||||
HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent);
|
||||
HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFlags);
|
||||
HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags);
|
||||
HRESULT dd_RestoreDisplayMode();
|
||||
HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps);
|
||||
HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc);
|
||||
HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq);
|
||||
HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB);
|
||||
HRESULT dd_RestoreDisplayMode();
|
||||
HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags);
|
||||
HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFlags);
|
||||
HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent);
|
||||
HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree);
|
||||
HRESULT dd_TestCooperativeLevel();
|
||||
HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB);
|
||||
HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID riid);
|
||||
HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter);
|
||||
|
||||
|
|
@ -32,76 +27,41 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute
|
|||
#define FIX_CHILDS_DETECT 1
|
||||
#define FIX_CHILDS_DETECT_PAINT 2
|
||||
#define FIX_CHILDS_DETECT_HIDE 3
|
||||
#define FIX_CHILDS_DETECT_HIDE_NOSCALE 4
|
||||
|
||||
#define RESLIST_NORMAL 0
|
||||
#define RESLIST_MINI 1
|
||||
#define RESLIST_FULL 2
|
||||
|
||||
#define FILTER_NEAREST 0
|
||||
#define FILTER_LINEAR 1
|
||||
#define FILTER_CUBIC 2
|
||||
#define FILTER_LANCZOS 3
|
||||
|
||||
#define SDM_MODE_SET_BY_GAME 0x00000001l
|
||||
#define SDM_LEAVE_WINDOWED 0x00000002l
|
||||
#define SDM_LEAVE_FULLSCREEN 0x00000004l
|
||||
|
||||
#define LIMIT_AUTO 0
|
||||
#define LIMIT_TESTCOOP 1
|
||||
#define LIMIT_BLTFAST 2
|
||||
#define LIMIT_UNLOCK 3
|
||||
#define LIMIT_PEEKMESSAGE 4
|
||||
|
||||
#define CENTER_WINDOW_NEVER 0
|
||||
#define CENTER_WINDOW_AUTO 1
|
||||
#define CENTER_WINDOW_ALWAYS 2
|
||||
|
||||
#ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION
|
||||
#define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002
|
||||
#endif
|
||||
|
||||
#ifndef CREATE_WAITABLE_TIMER_MANUAL_RESET
|
||||
#define CREATE_WAITABLE_TIMER_MANUAL_RESET 0x00000001
|
||||
#endif
|
||||
|
||||
#ifndef GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT
|
||||
#define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 0x00000002
|
||||
#endif
|
||||
|
||||
#ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
|
||||
#define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 0x00000004
|
||||
#endif
|
||||
|
||||
#if (_WIN32_WINNT < _WIN32_WINNT_WIN2K)
|
||||
#define GdiTransparentBlt TransparentBlt
|
||||
#endif
|
||||
|
||||
typedef struct SPEEDLIMITER
|
||||
{
|
||||
DWORD tick_length;
|
||||
LONGLONG tick_length_ns;
|
||||
HANDLE htimer;
|
||||
LARGE_INTEGER due_time;
|
||||
BOOL dds_unlock_limiter_disabled;
|
||||
BOOL use_blt_or_flip;
|
||||
} SPEEDLIMITER;
|
||||
|
||||
struct IDirectDrawSurfaceImpl;
|
||||
|
||||
extern struct CNCDDRAW g_ddraw;
|
||||
extern struct CNCDDRAW* g_ddraw;
|
||||
|
||||
typedef struct CNCDDRAW
|
||||
{
|
||||
LONG ref;
|
||||
ULONG ref;
|
||||
|
||||
DWORD width;
|
||||
DWORD height;
|
||||
DWORD bpp;
|
||||
|
||||
BOOL windowed;
|
||||
BOOL border;
|
||||
BOOL boxing;
|
||||
DEVMODE mode;
|
||||
struct IDirectDrawSurfaceImpl* primary;
|
||||
char title[128];
|
||||
|
||||
CRITICAL_SECTION cs;
|
||||
|
||||
/* real export from system32\ddraw.dll */
|
||||
|
|
@ -111,9 +71,12 @@ typedef struct CNCDDRAW
|
|||
|
||||
struct
|
||||
{
|
||||
int maxfps;
|
||||
int minfps;
|
||||
DWORD minfps_tick_len;
|
||||
int width;
|
||||
int height;
|
||||
int opengl_y_align;
|
||||
int bpp;
|
||||
|
||||
HDC hdc;
|
||||
int* tex;
|
||||
|
|
@ -127,7 +90,6 @@ typedef struct CNCDDRAW
|
|||
LONG palette_updated;
|
||||
LONG surface_updated;
|
||||
LONG clear_screen;
|
||||
LONG screen_updated;
|
||||
|
||||
float scale_w;
|
||||
float scale_h;
|
||||
|
|
@ -137,59 +99,73 @@ typedef struct CNCDDRAW
|
|||
|
||||
struct
|
||||
{
|
||||
float scale_x;
|
||||
float scale_y;
|
||||
float unscale_x;
|
||||
float unscale_y;
|
||||
|
||||
int y_adjust;
|
||||
int x_adjust;
|
||||
RECT rc;
|
||||
} mouse;
|
||||
|
||||
DWORD(WINAPI* renderer)(void);
|
||||
struct
|
||||
{
|
||||
int toggle_fullscreen;
|
||||
int toggle_maximize;
|
||||
int unlock_cursor1;
|
||||
int unlock_cursor2;
|
||||
int screenshot;
|
||||
} hotkeys;
|
||||
|
||||
HWND hwnd;
|
||||
WNDPROC wndproc;
|
||||
struct { DWORD x; DWORD y; } cursor;
|
||||
BOOL locked;
|
||||
BOOL adjmouse;
|
||||
BOOL devmode;
|
||||
BOOL vsync;
|
||||
BOOL vhack;
|
||||
int upscale_hack_width;
|
||||
int upscale_hack_height;
|
||||
BOOL isredalert;
|
||||
BOOL iscnc1;
|
||||
BOOL iskkndx;
|
||||
BOOL isworms2;
|
||||
LONG upscale_hack_active;
|
||||
DWORD(WINAPI* renderer)(void);
|
||||
BOOL fullscreen;
|
||||
BOOL maintas;
|
||||
BOOL noactivateapp;
|
||||
char shader[MAX_PATH];
|
||||
BOOL wine;
|
||||
HCURSOR old_cursor;
|
||||
int show_cursor_count;
|
||||
BOOL accurate_timers;
|
||||
BOOL resizable;
|
||||
BOOL toggle_borderless;
|
||||
BOOL toggle_upscaled;
|
||||
BOOL nonexclusive;
|
||||
BOOL fixpitch;
|
||||
int fixchilds;
|
||||
BOOL fixnotresponding;
|
||||
BOOL locktopleft;
|
||||
BOOL d3d9linear;
|
||||
BOOL gdilinear;
|
||||
int resolutions;
|
||||
BOOL armadahack;
|
||||
BOOL tshack;
|
||||
int maxgameticks;
|
||||
BOOL alt_key_down;
|
||||
BOOL releasealt;
|
||||
BOOL bnet_active;
|
||||
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 */
|
||||
void* last_freed_surface; /* Nox hack */
|
||||
BOOL child_window_exists;
|
||||
BOOL got_child_windows;
|
||||
DWORD last_set_window_pos_tick; /* WINE hack */
|
||||
DWORD last_msg_pull_tick;
|
||||
BOOL show_driver_warning;
|
||||
SPEEDLIMITER ticks_limiter;
|
||||
SPEEDLIMITER flip_limiter;
|
||||
DWORD minfps_tick_len;
|
||||
DWORD gui_thread_id;
|
||||
BOOL show_driver_warning;
|
||||
BOOL windowed_hack;
|
||||
|
||||
struct
|
||||
{
|
||||
HWND hwnd;
|
||||
int x;
|
||||
int y;
|
||||
} textbox; /* Age Of Empires 2 textbox align */
|
||||
|
||||
struct
|
||||
{
|
||||
BOOL enabled;
|
||||
} zoom;
|
||||
} CNCDDRAW;
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -7,12 +7,6 @@
|
|||
#include "IDirectDrawClipper.h"
|
||||
|
||||
|
||||
HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSiz);
|
||||
HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd);
|
||||
HRESULT ddc_IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged);
|
||||
HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags);
|
||||
HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd);
|
||||
HRESULT ddc_SetClipRect(IDirectDrawClipperImpl* This, LPRECT lpRect);
|
||||
HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper, IUnknown FAR* pUnkOuter);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -7,8 +7,6 @@
|
|||
#include "IDirectDrawPalette.h"
|
||||
#include "dd.h"
|
||||
|
||||
#define DDPCAPS_REFRESH_CHANGED_ONLY (1 << 31)
|
||||
|
||||
HRESULT ddp_GetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpEntries);
|
||||
HRESULT ddp_SetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries);
|
||||
HRESULT dd_CreatePalette(DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, IDirectDrawPaletteImpl** lpDDPalette, IUnknown FAR* unkOuter);
|
||||
|
|
|
|||
|
|
@ -7,8 +7,6 @@
|
|||
#include "IDirectDrawSurface.h"
|
||||
#include "IDirectDraw.h"
|
||||
|
||||
#define DDBLT_NO_CLIP (1 << 31)
|
||||
|
||||
/* enables redraw via blt/unlock if there wasn't any flip for X ms */
|
||||
#define FLIP_REDRAW_TIMEOUT 1000 / 10
|
||||
|
||||
|
|
@ -33,10 +31,9 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKE
|
|||
HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpDDPalette);
|
||||
HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect);
|
||||
HRESULT dds_GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD);
|
||||
HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags);
|
||||
void* dds_GetBuffer(IDirectDrawSurfaceImpl* This);
|
||||
HRESULT dd_CreateSurface(IDirectDrawImpl* This, LPDDSURFACEDESC lpDDSurfaceDesc, IDirectDrawSurfaceImpl** lpDDSurface, IUnknown FAR* unkOuter);
|
||||
|
||||
extern LONG g_dds_gdi_handles;
|
||||
void dds_RedrawBnet(IDirectDrawSurfaceImpl* This, BOOL obs_hack);
|
||||
void dds_RedrawArmada(IDirectDrawSurfaceImpl* This);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
28
inc/debug.h
28
inc/debug.h
|
|
@ -3,49 +3,25 @@
|
|||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <intrin.h>
|
||||
|
||||
LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception);
|
||||
LONG WINAPI dbg_vectored_exception_handler(EXCEPTION_POINTERS* exception);
|
||||
int dbg_exception_handler(EXCEPTION_POINTERS* exception);
|
||||
void dbg_counter_start();
|
||||
double dbg_counter_stop();
|
||||
void dbg_debug_string(const char* format, ...);
|
||||
void dbg_print_rect(char* info, LPRECT rect);
|
||||
void dbg_draw_frame_info_start();
|
||||
void dbg_draw_frame_info_end();
|
||||
void dbg_printf(const char* fmt, ...);
|
||||
int dbg_printf(const char* fmt, ...);
|
||||
void dbg_init();
|
||||
void dbg_dump_wnd_styles(DWORD style, DWORD exstyle);
|
||||
void dbg_dump_swp_flags(DWORD flags);
|
||||
void dbg_dump_ddp_flags(DWORD flags);
|
||||
void dbg_dump_scl_flags(DWORD flags);
|
||||
void dbg_dump_edm_flags(DWORD flags);
|
||||
void dbg_dump_dds_flip_flags(DWORD flags);
|
||||
void dbg_dump_dds_blt_flags(DWORD flags);
|
||||
void dbg_dump_dds_blt_fx_flags(DWORD flags);
|
||||
void dbg_dump_dds_caps(DWORD caps);
|
||||
void dbg_dump_dds_flags(DWORD flags);
|
||||
void dbg_dump_dds_blt_fast_flags(DWORD flags);
|
||||
void dbg_dump_dds_lock_flags(DWORD flags);
|
||||
void dbg_dump_di_scm_flags(DWORD flags);
|
||||
void dbg_dump_hook_type(int idHook);
|
||||
char* dbg_d3d9_hr_to_str(HRESULT hr);
|
||||
char* dbg_mes_to_str(int id);
|
||||
void __cdecl dbg_invoke_watson(wchar_t const*, wchar_t const*, wchar_t const*, unsigned int, uintptr_t);
|
||||
|
||||
extern double g_dbg_frame_time;
|
||||
extern DWORD g_dbg_frame_count;
|
||||
extern LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter;
|
||||
extern PVOID g_dbg_exception_handle;
|
||||
|
||||
#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */
|
||||
#undef _ReturnAddress
|
||||
#undef _AddressOfReturnAddress
|
||||
#define _ReturnAddress() __builtin_return_address(0)
|
||||
#define _AddressOfReturnAddress() __builtin_frame_address (0)
|
||||
#else
|
||||
#pragma intrinsic(_ReturnAddress)
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
//#define _DEBUG 1
|
||||
|
||||
|
|
|
|||
|
|
@ -1,25 +0,0 @@
|
|||
#ifndef DELAY_IMPORTS_H
|
||||
#define DELAY_IMPORTS_H
|
||||
|
||||
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
|
||||
#define ThreadQuerySetWin32StartAddress 9
|
||||
|
||||
typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG);
|
||||
typedef const char* (CDECL* WINE_GET_VERSIONPROC)();
|
||||
typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release);
|
||||
typedef NTSTATUS(WINAPI* NTQUERYINFORMATIONTHREADPROC)(HANDLE, LONG, PVOID, ULONG, PULONG);
|
||||
|
||||
typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE);
|
||||
typedef BOOL(WINAPI* GETMODULEHANDLEEXAPROC)(DWORD, LPCSTR, HMODULE*);
|
||||
|
||||
extern NTQUERYINFORMATIONTHREADPROC delay_NtQueryInformationThread;
|
||||
extern RTLVERIFYVERSIONINFOPROC delay_RtlVerifyVersionInfo;
|
||||
extern WINE_GET_VERSIONPROC delay_wine_get_version;
|
||||
extern WINE_GET_HOST_VERSIONPROC delay_wine_get_host_version;
|
||||
|
||||
extern VERSETCONDITIONMASKPROC delay_VerSetConditionMask;
|
||||
extern GETMODULEHANDLEEXAPROC delay_GetModuleHandleExA;
|
||||
|
||||
void delay_imports_init();
|
||||
|
||||
#endif
|
||||
|
|
@ -14,8 +14,6 @@ typedef HRESULT(WINAPI* DIDSETCOOPERATIVELEVELPROC)(IDirectInputDeviceA*, HWND,
|
|||
typedef HRESULT(WINAPI* DIDGETDEVICEDATAPROC)(IDirectInputDeviceA*, DWORD, LPDIDEVICEOBJECTDATA, LPDWORD, DWORD);
|
||||
typedef HRESULT(WINAPI* DIDGETDEVICESTATEPROC)(IDirectInputDeviceA*, DWORD, LPVOID);
|
||||
|
||||
extern BOOL g_dinput_hook_active;
|
||||
|
||||
extern DIRECTINPUTCREATEAPROC real_DirectInputCreateA;
|
||||
extern DIRECTINPUTCREATEWPROC real_DirectInputCreateW;
|
||||
extern DIRECTINPUTCREATEEXPROC real_DirectInputCreateEx;
|
||||
|
|
@ -26,7 +24,4 @@ HRESULT WINAPI fake_DirectInputCreateW(HINSTANCE hinst, DWORD dwVersion, LPDIREC
|
|||
HRESULT WINAPI fake_DirectInputCreateEx(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPDIRECTINPUT7A* ppvOut, LPUNKNOWN punkOuter);
|
||||
HRESULT WINAPI fake_DirectInput8Create(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPDIRECTINPUT8* ppvOut, LPUNKNOWN punkOuter);
|
||||
|
||||
void dinput_hook_init();
|
||||
void dinput_hook_exit();
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -16,21 +16,15 @@ typedef enum PROCESS_DPI_AWARENESS {
|
|||
PROCESS_PER_MONITOR_DPI_AWARE = 2
|
||||
} PROCESS_DPI_AWARENESS;
|
||||
|
||||
#ifndef _DPI_AWARENESS_CONTEXTS_
|
||||
DECLARE_HANDLE(DPI_AWARENESS_CONTEXT);
|
||||
#define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1)
|
||||
#define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ((DPI_AWARENESS_CONTEXT)-2)
|
||||
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ((DPI_AWARENESS_CONTEXT)-3)
|
||||
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT)-4)
|
||||
#define DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED ((DPI_AWARENESS_CONTEXT)-5)
|
||||
#endif
|
||||
|
||||
typedef HRESULT(__stdcall* SETPROCESSDPIAWERENESSPROC)(PROCESS_DPI_AWARENESS);
|
||||
typedef BOOL(__stdcall* SETPROCESSDPIAWAREPROC)();
|
||||
typedef BOOL(__stdcall* SETPROCESSDPIAWARENESSCONTEXTPROC)(DPI_AWARENESS_CONTEXT);
|
||||
|
||||
#if (_WIN32_WINNT < _WIN32_WINNT_WINXP)
|
||||
#define SetThreadExecutionState(a)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -48,14 +48,12 @@ typedef struct FPSLIMITER
|
|||
D3DKMTCLOSEADAPTERPROC D3DKMTCloseAdapter;
|
||||
BOOL got_adapter;
|
||||
BOOL initialized;
|
||||
CRITICAL_SECTION cs;
|
||||
BOOL cs_initialized;
|
||||
} FPSLIMITER;
|
||||
|
||||
extern FPSLIMITER g_fpsl;
|
||||
|
||||
void fpsl_init();
|
||||
BOOL fpsl_wait_for_vblank();
|
||||
BOOL fpsl_wait_for_vblank(BOOL open_adapter);
|
||||
BOOL fpsl_dwm_flush();
|
||||
BOOL fpsl_dwm_is_enabled();
|
||||
void fpsl_frame_start();
|
||||
|
|
|
|||
89
inc/hook.h
89
inc/hook.h
|
|
@ -1,24 +1,15 @@
|
|||
#ifndef HOOK_H
|
||||
#define HOOK_H
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <vfw.h>
|
||||
|
||||
|
||||
#define HOOK_SKIP_2 0x00000001l
|
||||
#define HOOK_LOCAL_ONLY 0x00000002l
|
||||
#define HOOK_SYSTEM_ONLY 0x00000004l
|
||||
#define SKIP_HOOK2 0x00000001l
|
||||
#define SKIP_HOOK3 0x00000002l
|
||||
|
||||
typedef struct HOOKLISTDATA {
|
||||
char function_name[32];
|
||||
PROC new_function;
|
||||
PROC* function;
|
||||
DWORD flags;
|
||||
PROC org_function;
|
||||
HMODULE mod;
|
||||
} HOOKLISTDATA;
|
||||
|
||||
typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[39]; } HOOKLIST;
|
||||
typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA;
|
||||
typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[25]; } HOOKLIST;
|
||||
|
||||
typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT);
|
||||
typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*);
|
||||
|
|
@ -37,57 +28,22 @@ typedef BOOL(WINAPI* SETWINDOWPOSPROC)(HWND, HWND, int, int, int, int, UINT);
|
|||
typedef BOOL(WINAPI* MOVEWINDOWPROC)(HWND, int, int, int, int, BOOL);
|
||||
typedef LRESULT(WINAPI* SENDMESSAGEAPROC)(HWND, UINT, WPARAM, LPARAM);
|
||||
typedef LONG(WINAPI* SETWINDOWLONGAPROC)(HWND, int, LONG);
|
||||
typedef LONG(WINAPI* SETWINDOWLONGWPROC)(HWND, int, LONG);
|
||||
typedef LONG(WINAPI* GETWINDOWLONGAPROC)(HWND, int);
|
||||
typedef BOOL(WINAPI* ENABLEWINDOWPROC)(HWND, BOOL);
|
||||
typedef HWND(WINAPI* CREATEWINDOWEXAPROC)(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID);
|
||||
typedef BOOL(WINAPI* DESTROYWINDOWPROC)(HWND);
|
||||
typedef int (WINAPI* MAPWINDOWPOINTSPROC)(HWND, HWND, LPPOINT, UINT);
|
||||
typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int);
|
||||
typedef HWND(WINAPI* GETTOPWINDOWPROC)(HWND);
|
||||
typedef HWND(WINAPI* GETFOREGROUNDWINDOWPROC)();
|
||||
typedef BOOL(WINAPI* STRETCHBLTPROC)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD);
|
||||
typedef BOOL(WINAPI* BITBLTPROC)(HDC, int, int, int, int, HDC, int, int, DWORD);
|
||||
|
||||
typedef int (WINAPI* SETDIBITSTODEVICEPROC)(
|
||||
HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT);
|
||||
|
||||
typedef int (WINAPI* STRETCHDIBITSPROC)(
|
||||
HDC, int, int, int, int, int, int, int, int, const VOID*, const BITMAPINFO*, UINT, DWORD);
|
||||
|
||||
typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND);
|
||||
typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND hWnd);
|
||||
typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD);
|
||||
typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT);
|
||||
typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT);
|
||||
typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*);
|
||||
typedef BOOL(WINAPI* SETWINDOWPLACEMENTPROC)(HWND, const WINDOWPLACEMENT*);
|
||||
typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*);
|
||||
typedef LRESULT(WINAPI* DEFWINDOWPROCAPROC)(HWND, UINT, WPARAM, LPARAM);
|
||||
typedef HWND(WINAPI* SETPARENTPROC)(HWND, HWND);
|
||||
typedef HDC (WINAPI* BEGINPAINTPROC)(HWND, LPPAINTSTRUCT);
|
||||
typedef SHORT(WINAPI* GETKEYSTATEPROC)(int);
|
||||
typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int);
|
||||
|
||||
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 UINT(WINAPI* GETSYSTEMPALETTEENTRIESPROC)(HDC, UINT, UINT, LPPALETTEENTRY);
|
||||
typedef HPALETTE(WINAPI* SELECTPALETTEPROC)(HDC, HPALETTE, BOOL);
|
||||
typedef UINT (WINAPI* REALIZEPALETTEPROC)(HDC);
|
||||
|
||||
typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR);
|
||||
typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR);
|
||||
typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD);
|
||||
typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD);
|
||||
typedef FARPROC(WINAPI* GETPROCADDRESSPROC)(HMODULE, LPCSTR);
|
||||
typedef BOOL(WINAPI* GETDISKFREESPACEAPROC)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD);
|
||||
typedef DWORD(WINAPI* GETVERSIONPROC)(void);
|
||||
typedef BOOL(WINAPI* GETVERSIONEXAPROC)(LPOSVERSIONINFOA);
|
||||
typedef HRESULT(WINAPI* COCREATEINSTANCEPROC)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*);
|
||||
typedef MCIERROR(WINAPI* MCISENDCOMMANDAPROC)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR);
|
||||
typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER);
|
||||
|
||||
typedef PGETFRAME (WINAPI* AVISTREAMGETFRAMEOPENPROC)(PAVISTREAM, LPBITMAPINFOHEADER);
|
||||
|
||||
extern GETCURSORPOSPROC real_GetCursorPos;
|
||||
extern CLIPCURSORPROC real_ClipCursor;
|
||||
|
|
@ -106,57 +62,32 @@ extern SETWINDOWPOSPROC real_SetWindowPos;
|
|||
extern MOVEWINDOWPROC real_MoveWindow;
|
||||
extern SENDMESSAGEAPROC real_SendMessageA;
|
||||
extern SETWINDOWLONGAPROC real_SetWindowLongA;
|
||||
extern SETWINDOWLONGWPROC real_SetWindowLongW;
|
||||
extern GETWINDOWLONGAPROC real_GetWindowLongA;
|
||||
extern ENABLEWINDOWPROC real_EnableWindow;
|
||||
extern CREATEWINDOWEXAPROC real_CreateWindowExA;
|
||||
extern DESTROYWINDOWPROC real_DestroyWindow;
|
||||
extern MAPWINDOWPOINTSPROC real_MapWindowPoints;
|
||||
extern SHOWWINDOWPROC real_ShowWindow;
|
||||
extern GETTOPWINDOWPROC real_GetTopWindow;
|
||||
extern GETFOREGROUNDWINDOWPROC real_GetForegroundWindow;
|
||||
extern STRETCHBLTPROC real_StretchBlt;
|
||||
extern BITBLTPROC real_BitBlt;
|
||||
extern SETDIBITSTODEVICEPROC real_SetDIBitsToDevice;
|
||||
extern STRETCHDIBITSPROC real_StretchDIBits;
|
||||
extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow;
|
||||
extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA;
|
||||
extern PEEKMESSAGEAPROC real_PeekMessageA;
|
||||
extern GETMESSAGEAPROC real_GetMessageA;
|
||||
extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement;
|
||||
extern SETWINDOWPLACEMENTPROC real_SetWindowPlacement;
|
||||
extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA;
|
||||
extern DEFWINDOWPROCAPROC real_DefWindowProcA;
|
||||
extern SETPARENTPROC real_SetParent;
|
||||
extern BEGINPAINTPROC real_BeginPaint;
|
||||
extern GETKEYSTATEPROC real_GetKeyState;
|
||||
extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState;
|
||||
extern GETDEVICECAPSPROC real_GetDeviceCaps;
|
||||
extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA;
|
||||
extern CREATEFONTAPROC real_CreateFontA;
|
||||
extern GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries;
|
||||
extern SELECTPALETTEPROC real_SelectPalette;
|
||||
extern REALIZEPALETTEPROC real_RealizePalette;
|
||||
extern LOADLIBRARYAPROC real_LoadLibraryA;
|
||||
extern LOADLIBRARYWPROC real_LoadLibraryW;
|
||||
extern LOADLIBRARYEXAPROC real_LoadLibraryExA;
|
||||
extern LOADLIBRARYEXWPROC real_LoadLibraryExW;
|
||||
extern GETPROCADDRESSPROC real_GetProcAddress;
|
||||
extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA;
|
||||
extern GETVERSIONPROC real_GetVersion;
|
||||
extern GETVERSIONEXAPROC real_GetVersionExA;
|
||||
extern COCREATEINSTANCEPROC real_CoCreateInstance;
|
||||
extern MCISENDCOMMANDAPROC real_mciSendCommandA;
|
||||
extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter;
|
||||
extern AVISTREAMGETFRAMEOPENPROC real_AVIStreamGetFrameOpen;
|
||||
|
||||
extern int g_hook_method;
|
||||
extern BOOL g_hook_dinput;
|
||||
extern BOOL g_hook_active;
|
||||
extern HOOKLIST g_hook_hooklist[];
|
||||
|
||||
void hook_init();
|
||||
void hook_early_init();
|
||||
void hook_exit();
|
||||
void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function_name, PROC new_function);
|
||||
void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local);
|
||||
void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks);
|
||||
void hook_create(HOOKLIST* hooks, BOOL initial_hook);
|
||||
void hook_revert(HOOKLIST* hooks);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +0,0 @@
|
|||
#ifndef INDEO_H
|
||||
#define INDEO_H
|
||||
|
||||
void indeo_enable();
|
||||
void indeo_disable();
|
||||
|
||||
#endif
|
||||
22
inc/ini.h
22
inc/ini.h
|
|
@ -1,22 +0,0 @@
|
|||
#ifndef INI_H
|
||||
#define INI_H
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char filename[MAX_PATH];
|
||||
|
||||
struct {
|
||||
unsigned long hash;
|
||||
char* data;
|
||||
}*sections;
|
||||
} INIFILE;
|
||||
|
||||
void ini_create(INIFILE* ini, char* filename);
|
||||
BOOL ini_section_exists(INIFILE* ini, LPCSTR section);
|
||||
DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR buf, DWORD size);
|
||||
BOOL ini_get_bool(INIFILE* ini, LPCSTR section, LPCSTR key, BOOL def);
|
||||
int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def);
|
||||
float ini_get_float(INIFILE* ini, LPCSTR section, LPCSTR key, float def);
|
||||
void ini_free(INIFILE* ini);
|
||||
|
||||
#endif
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
#ifndef KEYBOARD_H
|
||||
#define KEYBOARD_H
|
||||
|
||||
|
||||
void keyboard_hook_init();
|
||||
void keyboard_hook_exit();
|
||||
LRESULT CALLBACK keyboard_hook_proc(int Code, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
extern HHOOK g_keyboard_hook;
|
||||
|
||||
#endif
|
||||
|
|
@ -5,7 +5,6 @@ void mouse_lock();
|
|||
void mouse_unlock();
|
||||
LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
extern BOOL g_mouse_locked;
|
||||
extern HHOOK g_mouse_hook;
|
||||
extern HOOKPROC g_mouse_proc;
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ extern PFNGLVERTEX2FPROC glVertex2f;
|
|||
BOOL oglu_load_dll();
|
||||
void oglu_init();
|
||||
BOOL oglu_ext_exists(char* ext, HDC hdc);
|
||||
GLuint oglu_build_program(GLchar* vert_source, GLchar* frag_source, BOOL core_profile);
|
||||
GLuint oglu_build_program(const GLchar* vert_source, const GLchar* frag_source);
|
||||
GLuint oglu_build_program_from_file(const char* file_path, BOOL core_profile);
|
||||
|
||||
extern PFNGLVIEWPORTPROC glViewport;
|
||||
|
|
@ -108,13 +108,10 @@ extern PFNGLDRAWBUFFERSPROC glDrawBuffers;
|
|||
extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
|
||||
extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
|
||||
extern PFNGLTEXBUFFERPROC glTexBuffer;
|
||||
extern PFNGLGETINTEGERVPROC glGetIntegerv;
|
||||
extern PFNGLGETSTRINGIPROC glGetStringi;
|
||||
|
||||
extern HMODULE g_oglu_hmodule;
|
||||
extern BOOL g_oglu_got_version2;
|
||||
extern BOOL g_oglu_got_version3;
|
||||
extern char g_oglu_version[];
|
||||
extern char g_oglu_version_long[];
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
/* OpenGL 2.0 */
|
||||
|
||||
static char PASSTHROUGH_VERT_SHADER_110[] =
|
||||
const char PASSTHROUGH_VERT_SHADER_110[] =
|
||||
"#version 110\n"
|
||||
"varying vec2 TEX0; \n"
|
||||
"\n"
|
||||
|
|
@ -13,34 +13,33 @@ static char PASSTHROUGH_VERT_SHADER_110[] =
|
|||
" TEX0 = gl_MultiTexCoord0.xy; \n"
|
||||
"}\n";
|
||||
|
||||
|
||||
static char PALETTE_FRAG_SHADER_110[] =
|
||||
const char PALETTE_FRAG_SHADER_110[] =
|
||||
"#version 110\n"
|
||||
"uniform sampler2D Texture; \n"
|
||||
"uniform sampler2D PaletteTexture; \n"
|
||||
"uniform sampler2D SurfaceTex; \n"
|
||||
"uniform sampler2D PaletteTex; \n"
|
||||
"varying vec2 TEX0; \n"
|
||||
"\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" vec4 pIndex = texture2D(Texture, TEX0); \n"
|
||||
" gl_FragColor = texture2D(PaletteTexture, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0)); \n"
|
||||
" vec4 pIndex = texture2D(SurfaceTex, TEX0); \n"
|
||||
" gl_FragColor = texture2D(PaletteTex, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0)); \n"
|
||||
"}\n";
|
||||
|
||||
|
||||
static char PASSTHROUGH_FRAG_SHADER_110[] =
|
||||
const char PASSTHROUGH_FRAG_SHADER_110[] =
|
||||
"#version 110\n"
|
||||
"uniform sampler2D Texture; \n"
|
||||
"uniform sampler2D SurfaceTex; \n"
|
||||
"varying vec2 TEX0; \n"
|
||||
"\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" vec4 texel = texture2D(Texture, TEX0); \n"
|
||||
" vec4 texel = texture2D(SurfaceTex, TEX0); \n"
|
||||
" gl_FragColor = texel; \n"
|
||||
"}\n";
|
||||
|
||||
/* OpenGL 3.0 */
|
||||
|
||||
static char PASSTHROUGH_VERT_SHADER[] =
|
||||
const char PASSTHROUGH_VERT_SHADER[] =
|
||||
"#version 130\n"
|
||||
"in vec4 VertexCoord;\n"
|
||||
"in vec4 COLOR;\n"
|
||||
|
|
@ -57,538 +56,75 @@ static char PASSTHROUGH_VERT_SHADER[] =
|
|||
"}\n";
|
||||
|
||||
|
||||
static char PALETTE_FRAG_SHADER[] =
|
||||
const char PALETTE_FRAG_SHADER[] =
|
||||
"#version 130\n"
|
||||
"out vec4 FragColor;\n"
|
||||
"uniform sampler2D Texture;\n"
|
||||
"uniform sampler2D PaletteTexture;\n"
|
||||
"uniform sampler2D SurfaceTex;\n"
|
||||
"uniform sampler2D PaletteTex;\n"
|
||||
"in vec4 TEX0;\n"
|
||||
"\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" vec4 pIndex = texture(Texture, TEX0.xy);\n"
|
||||
" FragColor = texture(PaletteTexture, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0));\n"
|
||||
" vec4 pIndex = texture(SurfaceTex, TEX0.xy);\n"
|
||||
" FragColor = texture(PaletteTex, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0));\n"
|
||||
"}\n";
|
||||
|
||||
|
||||
static char PASSTHROUGH_FRAG_SHADER[] =
|
||||
const char PASSTHROUGH_FRAG_SHADER[] =
|
||||
"#version 130\n"
|
||||
"out vec4 FragColor;\n"
|
||||
"uniform sampler2D Texture;\n"
|
||||
"uniform sampler2D SurfaceTex;\n"
|
||||
"in vec4 TEX0;\n"
|
||||
"\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" vec4 texel = texture(Texture, TEX0.xy);\n"
|
||||
" vec4 texel = texture(SurfaceTex, TEX0.xy);\n"
|
||||
" FragColor = texel;\n"
|
||||
"}\n";
|
||||
|
||||
/* OpenGL 3.2 (Core Profile) */
|
||||
|
||||
static char RGB555_FRAG_SHADER[] =
|
||||
"#version 130\n"
|
||||
"out vec4 FragColor;\n"
|
||||
"uniform sampler2D Texture;\n"
|
||||
"in vec4 TEX0;\n"
|
||||
"\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" vec4 texel = texture(Texture, TEX0.xy);\n"
|
||||
" int bytes = int(texel.r * 255.0 + 0.5) | int(texel.g * 255.0 + 0.5) << 8;\n"
|
||||
" vec4 color;\n"
|
||||
" color.r = float((bytes >> 10) & 31) / 31.0;\n"
|
||||
" color.g = float((bytes >> 5) & 31) / 31.0;\n"
|
||||
" color.b = float(bytes & 31) / 31.0;\n"
|
||||
" color.a = 1.0;\n"
|
||||
" FragColor = color;\n"
|
||||
"}\n";
|
||||
|
||||
|
||||
/*
|
||||
// The following code is licensed under the MIT license: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae
|
||||
// Ported from code: https://gist.github.com/TheRealMJP/c83b8c0f46b63f3a88a5986f4fa982b1
|
||||
// Samples a texture with Catmull-Rom filtering, using 9 texture fetches instead of 16.
|
||||
// See http://vec3.ca/bicubic-filtering-in-fewer-taps/ for more details
|
||||
// Modified to use 5 texture fetches
|
||||
*/
|
||||
|
||||
static char CATMULL_ROM_FRAG_SHADER[] =
|
||||
"#version 130\n"
|
||||
"out vec4 FragColor;\n"
|
||||
"uniform int FrameDirection;\n"
|
||||
"uniform int FrameCount;\n"
|
||||
"uniform vec2 OutputSize;\n"
|
||||
"uniform vec2 TextureSize;\n"
|
||||
"uniform vec2 InputSize;\n"
|
||||
"uniform sampler2D Texture;\n"
|
||||
"in vec4 TEX0;\n"
|
||||
"\n"
|
||||
"#define SourceSize vec4(TextureSize, 1.0 / TextureSize)\n"
|
||||
"\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" vec2 samplePos = TEX0.xy * SourceSize.xy;\n"
|
||||
" vec2 texPos1 = floor(samplePos - 0.5) + 0.5;\n"
|
||||
"\n"
|
||||
" vec2 f = samplePos - texPos1;\n"
|
||||
"\n"
|
||||
" vec2 w0 = f * (-0.5 + f * (1.0 - 0.5 * f));\n"
|
||||
" vec2 w1 = 1.0 + f * f * (-2.5 + 1.5 * f);\n"
|
||||
" vec2 w2 = f * (0.5 + f * (2.0 - 1.5 * f));\n"
|
||||
" vec2 w3 = f * f * (-0.5 + 0.5 * f);\n"
|
||||
"\n"
|
||||
" vec2 w12 = w1 + w2;\n"
|
||||
" vec2 offset12 = w2 / (w1 + w2);\n"
|
||||
"\n"
|
||||
" vec2 texPos0 = texPos1 - 1.;\n"
|
||||
" vec2 texPos3 = texPos1 + 2.;\n"
|
||||
" vec2 texPos12 = texPos1 + offset12;\n"
|
||||
"\n"
|
||||
" texPos0 *= SourceSize.zw;\n"
|
||||
" texPos3 *= SourceSize.zw;\n"
|
||||
" texPos12 *= SourceSize.zw;\n"
|
||||
"\n"
|
||||
" float wtm = w12.x * w0.y;\n"
|
||||
" float wml = w0.x * w12.y;\n"
|
||||
" float wmm = w12.x * w12.y;\n"
|
||||
" float wmr = w3.x * w12.y;\n"
|
||||
" float wbm = w12.x * w3.y;\n"
|
||||
"\n"
|
||||
" vec3 result = vec3(0.0f);\n"
|
||||
"\n"
|
||||
" result += texture(Texture, vec2(texPos12.x, texPos0.y)).rgb * wtm;\n"
|
||||
" result += texture(Texture, vec2(texPos0.x, texPos12.y)).rgb * wml;\n"
|
||||
" result += texture(Texture, vec2(texPos12.x, texPos12.y)).rgb * wmm;\n"
|
||||
" result += texture(Texture, vec2(texPos3.x, texPos12.y)).rgb * wmr;\n"
|
||||
" result += texture(Texture, vec2(texPos12.x, texPos3.y)).rgb * wbm;\n"
|
||||
"\n"
|
||||
" FragColor = vec4(result * (1. / (wtm + wml + wmm + wmr + wbm)), 1.0);\n"
|
||||
"}\n";
|
||||
|
||||
|
||||
/*
|
||||
// The following code is licensed under the MIT license:
|
||||
// Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader
|
||||
// Copyright (C) 2011-2016 Hyllian/Jararaca - sergiogdb@gmail.com
|
||||
// https://github.com/libretro/glsl-shaders/blob/09e2942efbab2f51b60ff0b93b7761b0b0570910/windowed/shaders/lanczos2-sharp.glsl
|
||||
*/
|
||||
|
||||
static char LANCZOS2_FRAG_SHADER[] =
|
||||
"#version 130\n"
|
||||
"#define JINC2_WINDOW_SINC 0.5\n"
|
||||
"#define JINC2_SINC 1.0\n"
|
||||
"#define JINC2_AR_STRENGTH 0.8\n"
|
||||
"\n"
|
||||
"out vec4 FragColor;\n"
|
||||
"uniform int FrameDirection;\n"
|
||||
"uniform int FrameCount;\n"
|
||||
"uniform vec2 OutputSize;\n"
|
||||
"uniform vec2 TextureSize;\n"
|
||||
"uniform vec2 InputSize;\n"
|
||||
"uniform sampler2D Texture;\n"
|
||||
"in vec4 TEX0;\n"
|
||||
"\n"
|
||||
"const float pi = 3.1415926535897932384626433832795;\n"
|
||||
"const float wa = JINC2_WINDOW_SINC*pi;\n"
|
||||
"const float wb = JINC2_SINC*pi;\n"
|
||||
"\n"
|
||||
"// Calculates the distance between two points\n"
|
||||
"float d(vec2 pt1, vec2 pt2)\n"
|
||||
"{\n"
|
||||
" vec2 v = pt2 - pt1;\n"
|
||||
" return sqrt(dot(v,v));\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"vec3 min4(vec3 a, vec3 b, vec3 c, vec3 d)\n"
|
||||
"{\n"
|
||||
" return min(a, min(b, min(c, d)));\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"vec3 max4(vec3 a, vec3 b, vec3 c, vec3 d)\n"
|
||||
"{\n"
|
||||
" return max(a, max(b, max(c, d)));\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"vec4 resampler(vec4 x)\n"
|
||||
"{\n"
|
||||
" vec4 res;\n"
|
||||
"\n"
|
||||
" res.x = (x.x==0.0) ? wa*wb : sin(x.x*wa)*sin(x.x*wb)/(x.x*x.x);\n"
|
||||
" res.y = (x.y==0.0) ? wa*wb : sin(x.y*wa)*sin(x.y*wb)/(x.y*x.y);\n"
|
||||
" res.z = (x.z==0.0) ? wa*wb : sin(x.z*wa)*sin(x.z*wb)/(x.z*x.z);\n"
|
||||
" res.w = (x.w==0.0) ? wa*wb : sin(x.w*wa)*sin(x.w*wb)/(x.w*x.w);\n"
|
||||
"\n"
|
||||
" return res;\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" vec3 color;\n"
|
||||
" vec4 weights[4];\n"
|
||||
"\n"
|
||||
" vec2 dx = vec2(1.0, 0.0);\n"
|
||||
" vec2 dy = vec2(0.0, 1.0);\n"
|
||||
"\n"
|
||||
" vec2 pc = TEX0.xy*TextureSize;\n"
|
||||
"\n"
|
||||
" vec2 tc = (floor(pc-vec2(0.5,0.5))+vec2(0.5,0.5));\n"
|
||||
" \n"
|
||||
" weights[0] = resampler(vec4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy)));\n"
|
||||
" weights[1] = resampler(vec4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx )));\n"
|
||||
" weights[2] = resampler(vec4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy)));\n"
|
||||
" weights[3] = resampler(vec4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy)));\n"
|
||||
"\n"
|
||||
" dx = dx/TextureSize;\n"
|
||||
" dy = dy/TextureSize;\n"
|
||||
" tc = tc/TextureSize;\n"
|
||||
"\n"
|
||||
" vec3 c00 = texture(Texture, tc -dx -dy).xyz;\n"
|
||||
" vec3 c10 = texture(Texture, tc -dy).xyz;\n"
|
||||
" vec3 c20 = texture(Texture, tc +dx -dy).xyz;\n"
|
||||
" vec3 c30 = texture(Texture, tc+2.0*dx -dy).xyz;\n"
|
||||
" vec3 c01 = texture(Texture, tc -dx ).xyz;\n"
|
||||
" vec3 c11 = texture(Texture, tc ).xyz;\n"
|
||||
" vec3 c21 = texture(Texture, tc +dx ).xyz;\n"
|
||||
" vec3 c31 = texture(Texture, tc+2.0*dx ).xyz;\n"
|
||||
" vec3 c02 = texture(Texture, tc -dx +dy).xyz;\n"
|
||||
" vec3 c12 = texture(Texture, tc +dy).xyz;\n"
|
||||
" vec3 c22 = texture(Texture, tc +dx +dy).xyz;\n"
|
||||
" vec3 c32 = texture(Texture, tc+2.0*dx +dy).xyz;\n"
|
||||
" vec3 c03 = texture(Texture, tc -dx+2.0*dy).xyz;\n"
|
||||
" vec3 c13 = texture(Texture, tc +2.0*dy).xyz;\n"
|
||||
" vec3 c23 = texture(Texture, tc +dx+2.0*dy).xyz;\n"
|
||||
" vec3 c33 = texture(Texture, tc+2.0*dx+2.0*dy).xyz;\n"
|
||||
" \n"
|
||||
" // Get min/max samples\n"
|
||||
" vec3 min_sample = min4(c11, c21, c12, c22);\n"
|
||||
" vec3 max_sample = max4(c11, c21, c12, c22);\n"
|
||||
" \n"
|
||||
" color = vec3(dot(weights[0], vec4(c00.x, c10.x, c20.x, c30.x)), dot(weights[0], vec4(c00.y, c10.y, c20.y, c30.y)), dot(weights[0], vec4(c00.z, c10.z, c20.z, c30.z)));\n"
|
||||
" color+= vec3(dot(weights[1], vec4(c01.x, c11.x, c21.x, c31.x)), dot(weights[1], vec4(c01.y, c11.y, c21.y, c31.y)), dot(weights[1], vec4(c01.z, c11.z, c21.z, c31.z)));\n"
|
||||
" color+= vec3(dot(weights[2], vec4(c02.x, c12.x, c22.x, c32.x)), dot(weights[2], vec4(c02.y, c12.y, c22.y, c32.y)), dot(weights[2], vec4(c02.z, c12.z, c22.z, c32.z)));\n"
|
||||
" color+= vec3(dot(weights[3], vec4(c03.x, c13.x, c23.x, c33.x)), dot(weights[3], vec4(c03.y, c13.y, c23.y, c33.y)), dot(weights[3], vec4(c03.z, c13.z, c23.z, c33.z)));\n"
|
||||
" color = color/(dot(weights[0], vec4(1,1,1,1)) + dot(weights[1], vec4(1,1,1,1)) + dot(weights[2], vec4(1,1,1,1)) + dot(weights[3], vec4(1,1,1,1)));\n"
|
||||
"\n"
|
||||
" // Anti-ringing\n"
|
||||
" vec3 aux = color;\n"
|
||||
" color = clamp(color, min_sample, max_sample);\n"
|
||||
" color = mix(aux, color, JINC2_AR_STRENGTH);\n"
|
||||
"\n"
|
||||
" // final sum and weight normalization\n"
|
||||
" FragColor.xyz = color;\n"
|
||||
"}\n";
|
||||
|
||||
/*
|
||||
// The following code is licensed under the MIT license:
|
||||
// Hyllian's xBR-lv2 Shader
|
||||
// Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com
|
||||
// https://github.com/libretro/glsl-shaders/blob/09e2942efbab2f51b60ff0b93b7761b0b0570910/xbr/shaders/xbr-lv2.glsl
|
||||
*/
|
||||
|
||||
static char XBR_LV2_VERT_SHADER[] =
|
||||
"#version 130\n"
|
||||
"\n"
|
||||
"#define texCoord TEX0\n"
|
||||
"#define t1 TEX1\n"
|
||||
"#define t2 TEX2\n"
|
||||
"#define t3 TEX3\n"
|
||||
"#define t4 TEX4\n"
|
||||
"#define t5 TEX5\n"
|
||||
"#define t6 TEX6\n"
|
||||
"#define t7 TEX7\n"
|
||||
"\n"
|
||||
const char PASSTHROUGH_VERT_SHADER_CORE[] =
|
||||
"#version 150\n"
|
||||
"in vec4 VertexCoord;\n"
|
||||
"in vec4 Color;\n"
|
||||
"in vec2 TexCoord;\n"
|
||||
"\n"
|
||||
"out vec4 color;\n"
|
||||
"out vec2 texCoord;\n"
|
||||
"out vec4 t1;\n"
|
||||
"out vec4 t2;\n"
|
||||
"out vec4 t3;\n"
|
||||
"out vec4 t4;\n"
|
||||
"out vec4 t5;\n"
|
||||
"out vec4 t6;\n"
|
||||
"out vec4 t7;\n"
|
||||
"\n"
|
||||
"in vec4 COLOR;\n"
|
||||
"in vec4 TexCoord;\n"
|
||||
"out vec4 COL0;\n"
|
||||
"out vec4 TEX0;\n"
|
||||
"uniform mat4 MVPMatrix;\n"
|
||||
"uniform int FrameDirection;\n"
|
||||
"uniform int FrameCount;\n"
|
||||
"uniform vec2 OutputSize;\n"
|
||||
"uniform vec2 TextureSize;\n"
|
||||
"uniform vec2 InputSize;\n"
|
||||
"\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" gl_Position = MVPMatrix * VertexCoord;\n"
|
||||
" color = Color;\n"
|
||||
"\n"
|
||||
" float dx = (1.0/TextureSize.x);\n"
|
||||
" float dy = (1.0/TextureSize.y);\n"
|
||||
"\n"
|
||||
" texCoord = TexCoord;\n"
|
||||
" texCoord.x *= 1.00000001;\n"
|
||||
" t1 = TexCoord.xxxy + vec4( -dx, 0, dx,-2.0*dy); // A1 B1 C1\n"
|
||||
" t2 = TexCoord.xxxy + vec4( -dx, 0, dx, -dy); // A B C\n"
|
||||
" t3 = TexCoord.xxxy + vec4( -dx, 0, dx, 0); // D E F\n"
|
||||
" t4 = TexCoord.xxxy + vec4( -dx, 0, dx, dy); // G H I\n"
|
||||
" t5 = TexCoord.xxxy + vec4( -dx, 0, dx, 2.0*dy); // G5 H5 I5\n"
|
||||
" t6 = TexCoord.xyyy + vec4(-2.0*dx,-dy, 0, dy); // A0 D0 G0\n"
|
||||
" t7 = TexCoord.xyyy + vec4( 2.0*dx,-dy, 0, dy); // C4 F4 I4\n"
|
||||
" COL0 = COLOR;\n"
|
||||
" TEX0.xy = TexCoord.xy;\n"
|
||||
"}\n";
|
||||
|
||||
static char XBR_LV2_FRAG_SHADER[] =
|
||||
"#version 130\n"
|
||||
"\n"
|
||||
"//#pragma parameter XBR_SCALE \"xBR Scale\" 3.0 1.0 5.0 1.0\n"
|
||||
"#pragma parameter XBR_Y_WEIGHT \"Y Weight\" 48.0 0.0 100.0 1.0\n"
|
||||
"#pragma parameter XBR_EQ_THRESHOLD \"Eq Threshold\" 15.0 0.0 50.0 1.0\n"
|
||||
"#pragma parameter XBR_LV1_COEFFICIENT \"Lv1 Coefficient\" 0.5 0.0 30.0 0.5\n"
|
||||
"#pragma parameter XBR_LV2_COEFFICIENT \"Lv2 Coefficient\" 2.0 1.0 3.0 0.1\n"
|
||||
"#pragma parameter small_details \"Preserve Small Details\" 0.0 0.0 1.0 1.0\n"
|
||||
"\n"
|
||||
"#define mul(a,b) (b*a)\n"
|
||||
"\n"
|
||||
"// Uncomment just one of the three params below to choose the corner detection\n"
|
||||
"//#define CORNER_A\n"
|
||||
"//#define CORNER_B\n"
|
||||
"#define CORNER_C\n"
|
||||
"//#define CORNER_D\n"
|
||||
"\n"
|
||||
"#ifndef CORNER_A\n"
|
||||
" #define SMOOTH_TIPS\n"
|
||||
"#endif\n"
|
||||
"\n"
|
||||
"#define XBR_SCALE 3.0\n"
|
||||
"\n"
|
||||
"#define lv2_cf XBR_LV2_COEFFICIENT\n"
|
||||
"\n"
|
||||
"#define texCoord TEX0\n"
|
||||
"#define t1 TEX1\n"
|
||||
"#define t2 TEX2\n"
|
||||
"#define t3 TEX3\n"
|
||||
"#define t4 TEX4\n"
|
||||
"#define t5 TEX5\n"
|
||||
"#define t6 TEX6\n"
|
||||
"#define t7 TEX7\n"
|
||||
"\n"
|
||||
|
||||
const char PALETTE_FRAG_SHADER_CORE[] =
|
||||
"#version 150\n"
|
||||
"out vec4 FragColor;\n"
|
||||
"uniform int FrameDirection;\n"
|
||||
"uniform int FrameCount;\n"
|
||||
"uniform vec2 OutputSize;\n"
|
||||
"uniform vec2 TextureSize;\n"
|
||||
"uniform vec2 InputSize;\n"
|
||||
"uniform sampler2D Texture;\n"
|
||||
"in vec2 texCoord;\n"
|
||||
"in vec4 t1;\n"
|
||||
"in vec4 t2;\n"
|
||||
"in vec4 t3;\n"
|
||||
"in vec4 t4;\n"
|
||||
"in vec4 t5;\n"
|
||||
"in vec4 t6;\n"
|
||||
"in vec4 t7;\n"
|
||||
"\n"
|
||||
"#ifdef PARAMETER_UNIFORM\n"
|
||||
"uniform float XBR_Y_WEIGHT;\n"
|
||||
"uniform float XBR_EQ_THRESHOLD;\n"
|
||||
"uniform float XBR_LV1_COEFFICIENT;\n"
|
||||
"uniform float XBR_LV2_COEFFICIENT;\n"
|
||||
"uniform float small_details;\n"
|
||||
"#else\n"
|
||||
"#define XBR_Y_WEIGHT 48.0\n"
|
||||
"#define XBR_EQ_THRESHOLD 15.0\n"
|
||||
"#define XBR_LV1_COEFFICIENT 0.5\n"
|
||||
"#define XBR_LV2_COEFFICIENT 2.0\n"
|
||||
"#define small_details 0.0\n"
|
||||
"#endif\n"
|
||||
"// END PARAMETERS //\n"
|
||||
"\n"
|
||||
"const float coef = 2.0;\n"
|
||||
"const vec3 rgbw = vec3(14.352, 28.176, 5.472);\n"
|
||||
"const vec4 eq_threshold = vec4(15.0, 15.0, 15.0, 15.0);\n"
|
||||
"\n"
|
||||
"vec4 delta = vec4(1.0/XBR_SCALE, 1.0/XBR_SCALE, 1.0/XBR_SCALE, 1.0/XBR_SCALE);\n"
|
||||
"vec4 delta_l = vec4(0.5/XBR_SCALE, 1.0/XBR_SCALE, 0.5/XBR_SCALE, 1.0/XBR_SCALE);\n"
|
||||
"vec4 delta_u = delta_l.yxwz;\n"
|
||||
"\n"
|
||||
"const vec4 Ao = vec4( 1.0, -1.0, -1.0, 1.0 );\n"
|
||||
"const vec4 Bo = vec4( 1.0, 1.0, -1.0,-1.0 );\n"
|
||||
"const vec4 Co = vec4( 1.5, 0.5, -0.5, 0.5 );\n"
|
||||
"const vec4 Ax = vec4( 1.0, -1.0, -1.0, 1.0 );\n"
|
||||
"const vec4 Bx = vec4( 0.5, 2.0, -0.5,-2.0 );\n"
|
||||
"const vec4 Cx = vec4( 1.0, 1.0, -0.5, 0.0 );\n"
|
||||
"const vec4 Ay = vec4( 1.0, -1.0, -1.0, 1.0 );\n"
|
||||
"const vec4 By = vec4( 2.0, 0.5, -2.0,-0.5 );\n"
|
||||
"const vec4 Cy = vec4( 2.0, 0.0, -1.0, 0.5 );\n"
|
||||
"const vec4 Ci = vec4(0.25, 0.25, 0.25, 0.25);\n"
|
||||
"\n"
|
||||
"const vec3 Y = vec3(0.2126, 0.7152, 0.0722);\n"
|
||||
"\n"
|
||||
"// Difference between vector components.\n"
|
||||
"vec4 df(vec4 A, vec4 B)\n"
|
||||
"{\n"
|
||||
" return vec4(abs(A-B));\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"// Compare two vectors and return their components are different.\n"
|
||||
"vec4 diff(vec4 A, vec4 B)\n"
|
||||
"{\n"
|
||||
" return vec4(notEqual(A, B));\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"// Determine if two vector components are equal based on a threshold.\n"
|
||||
"vec4 eq(vec4 A, vec4 B)\n"
|
||||
"{\n"
|
||||
" return (step(df(A, B), vec4(XBR_EQ_THRESHOLD)));\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"// Determine if two vector components are NOT equal based on a threshold.\n"
|
||||
"vec4 neq(vec4 A, vec4 B)\n"
|
||||
"{\n"
|
||||
" return (vec4(1.0, 1.0, 1.0, 1.0) - eq(A, B));\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"// Weighted distance.\n"
|
||||
"vec4 wd(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h)\n"
|
||||
"{\n"
|
||||
" return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + 4.0*df(g,h));\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"vec4 weighted_distance(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h, vec4 i, vec4 j, vec4 k, vec4 l)\n"
|
||||
"{\n"
|
||||
" return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + df(i,j) + df(k,l) + 2.0*df(g,h));\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"float c_df(vec3 c1, vec3 c2) \n"
|
||||
"{\n"
|
||||
" vec3 df = abs(c1 - c2);\n"
|
||||
" return df.r + df.g + df.b;\n"
|
||||
"}\n"
|
||||
"uniform sampler2D SurfaceTex;\n"
|
||||
"uniform sampler2D PaletteTex;\n"
|
||||
"in vec4 TEX0;\n"
|
||||
"\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" vec4 edri, edr, edr_l, edr_u, px; // px = pixel, edr = edge detection rule\n"
|
||||
" vec4 irlv0, irlv1, irlv2l, irlv2u, block_3d;\n"
|
||||
" vec4 fx, fx_l, fx_u; // inequations of straight lines.\n"
|
||||
" vec4 pIndex = texture(SurfaceTex, TEX0.xy);\n"
|
||||
" FragColor = texture(PaletteTex, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0));\n"
|
||||
"}\n";
|
||||
|
||||
|
||||
const char PASSTHROUGH_FRAG_SHADER_CORE[] =
|
||||
"#version 150\n"
|
||||
"out vec4 FragColor;\n"
|
||||
"uniform sampler2D SurfaceTex;\n"
|
||||
"in vec4 TEX0;\n"
|
||||
"\n"
|
||||
" vec2 fp = fract(texCoord*TextureSize);\n"
|
||||
"\n"
|
||||
" vec3 A1 = texture(Texture, t1.xw ).xyz;\n"
|
||||
" vec3 B1 = texture(Texture, t1.yw ).xyz;\n"
|
||||
" vec3 C1 = texture(Texture, t1.zw ).xyz;\n"
|
||||
" vec3 A = texture(Texture, t2.xw ).xyz;\n"
|
||||
" vec3 B = texture(Texture, t2.yw ).xyz;\n"
|
||||
" vec3 C = texture(Texture, t2.zw ).xyz;\n"
|
||||
" vec3 D = texture(Texture, t3.xw ).xyz;\n"
|
||||
" vec3 E = texture(Texture, t3.yw ).xyz;\n"
|
||||
" vec3 F = texture(Texture, t3.zw ).xyz;\n"
|
||||
" vec3 G = texture(Texture, t4.xw ).xyz;\n"
|
||||
" vec3 H = texture(Texture, t4.yw ).xyz;\n"
|
||||
" vec3 I = texture(Texture, t4.zw ).xyz;\n"
|
||||
" vec3 G5 = texture(Texture, t5.xw ).xyz;\n"
|
||||
" vec3 H5 = texture(Texture, t5.yw ).xyz;\n"
|
||||
" vec3 I5 = texture(Texture, t5.zw ).xyz;\n"
|
||||
" vec3 A0 = texture(Texture, t6.xy ).xyz;\n"
|
||||
" vec3 D0 = texture(Texture, t6.xz ).xyz;\n"
|
||||
" vec3 G0 = texture(Texture, t6.xw ).xyz;\n"
|
||||
" vec3 C4 = texture(Texture, t7.xy ).xyz;\n"
|
||||
" vec3 F4 = texture(Texture, t7.xz ).xyz;\n"
|
||||
" vec3 I4 = texture(Texture, t7.xw ).xyz;\n"
|
||||
"\n"
|
||||
" vec4 b = vec4(dot(B ,rgbw), dot(D ,rgbw), dot(H ,rgbw), dot(F ,rgbw));\n"
|
||||
" vec4 c = vec4(dot(C ,rgbw), dot(A ,rgbw), dot(G ,rgbw), dot(I ,rgbw));\n"
|
||||
" vec4 d = b.yzwx;\n"
|
||||
" vec4 e = vec4(dot(E,rgbw));\n"
|
||||
" vec4 f = b.wxyz;\n"
|
||||
" vec4 g = c.zwxy;\n"
|
||||
" vec4 h = b.zwxy;\n"
|
||||
" vec4 i = c.wxyz;\n"
|
||||
"\n"
|
||||
" vec4 i4, i5, h5, f4;\n"
|
||||
"\n"
|
||||
" float y_weight = XBR_Y_WEIGHT;\n"
|
||||
"\n"
|
||||
" if (small_details < 0.5)\n"
|
||||
" {\n"
|
||||
" i4 = vec4(dot(I4,rgbw), dot(C1,rgbw), dot(A0,rgbw), dot(G5,rgbw));\n"
|
||||
" i5 = vec4(dot(I5,rgbw), dot(C4,rgbw), dot(A1,rgbw), dot(G0,rgbw));\n"
|
||||
" h5 = vec4(dot(H5,rgbw), dot(F4,rgbw), dot(B1,rgbw), dot(D0,rgbw));\n"
|
||||
" }\n"
|
||||
" else\n"
|
||||
" {\n"
|
||||
" i4 = mul( mat4x3(I4, C1, A0, G5), y_weight * Y );\n"
|
||||
" i5 = mul( mat4x3(I5, C4, A1, G0), y_weight * Y );\n"
|
||||
" h5 = mul( mat4x3(H5, F4, B1, D0), y_weight * Y );\n"
|
||||
" }\n"
|
||||
"\n"
|
||||
" // These inequations define the line below which interpolation occurs.\n"
|
||||
" fx = (Ao*fp.y+Bo*fp.x); \n"
|
||||
" fx_l = (Ax*fp.y+Bx*fp.x);\n"
|
||||
" fx_u = (Ay*fp.y+By*fp.x);\n"
|
||||
"\n"
|
||||
" irlv1 = irlv0 = diff(e,f) * diff(e,h);\n"
|
||||
"\n"
|
||||
"#ifdef CORNER_B\n"
|
||||
" irlv1 = (irlv0 * ( neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c) ) );\n"
|
||||
"#endif\n"
|
||||
"#ifdef CORNER_D\n"
|
||||
" vec4 c1 = i4.yzwx;\n"
|
||||
" vec4 g0 = i5.wxyz;\n"
|
||||
" irlv1 = (irlv0 * ( neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c) ) * (diff(f,f4) * diff(f,i) + diff(h,h5) * diff(h,i) + diff(h,g) + diff(f,c) + eq(b,c1) * eq(d,g0)));\n"
|
||||
"#endif\n"
|
||||
"#ifdef CORNER_C\n"
|
||||
" irlv1 = (irlv0 * ( neq(f,b) * neq(f,c) + neq(h,d) * neq(h,g) + eq(e,i) * (neq(f,f4) * neq(f,i4) + neq(h,h5) * neq(h,i5)) + eq(e,g) + eq(e,c)) );\n"
|
||||
"#endif\n"
|
||||
"\n"
|
||||
" irlv2l = diff(e,g) * diff(d,g);\n"
|
||||
" irlv2u = diff(e,c) * diff(b,c);\n"
|
||||
"\n"
|
||||
" vec4 fx45i = clamp((fx + delta -Co - Ci)/(2.0*delta ), 0.0, 1.0);\n"
|
||||
" vec4 fx45 = clamp((fx + delta -Co )/(2.0*delta ), 0.0, 1.0);\n"
|
||||
" vec4 fx30 = clamp((fx_l + delta_l -Cx )/(2.0*delta_l), 0.0, 1.0);\n"
|
||||
" vec4 fx60 = clamp((fx_u + delta_u -Cy )/(2.0*delta_u), 0.0, 1.0);\n"
|
||||
"\n"
|
||||
" vec4 wd1, wd2;\n"
|
||||
" if (small_details < 0.5)\n"
|
||||
" {\n"
|
||||
" wd1 = wd( e, c, g, i, h5, f4, h, f);\n"
|
||||
" wd2 = wd( h, d, i5, f, i4, b, e, i);\n"
|
||||
" }\n"
|
||||
" else\n"
|
||||
" {\n"
|
||||
" wd1 = weighted_distance( e, c, g, i, f4, h5, h, f, b, d, i4, i5);\n"
|
||||
" wd2 = weighted_distance( h, d, i5, f, b, i4, e, i, g, h5, c, f4);\n"
|
||||
" }\n"
|
||||
"\n"
|
||||
" edri = step(wd1, wd2) * irlv0;\n"
|
||||
" edr = step(wd1 + vec4(0.1, 0.1, 0.1, 0.1), wd2) * step(vec4(0.5, 0.5, 0.5, 0.5), irlv1);\n"
|
||||
" edr_l = step( lv2_cf*df(f,g), df(h,c) ) * irlv2l * edr;\n"
|
||||
" edr_u = step( lv2_cf*df(h,c), df(f,g) ) * irlv2u * edr;\n"
|
||||
"\n"
|
||||
" fx45 = edr * fx45;\n"
|
||||
" fx30 = edr_l * fx30;\n"
|
||||
" fx60 = edr_u * fx60;\n"
|
||||
" fx45i = edri * fx45i;\n"
|
||||
"\n"
|
||||
" px = step(df(e,f), df(e,h));\n"
|
||||
"\n"
|
||||
"#ifdef SMOOTH_TIPS\n"
|
||||
" vec4 maximos = max(max(fx30, fx60), max(fx45, fx45i));\n"
|
||||
"#endif\n"
|
||||
"#ifndef SMOOTH_TIPS\n"
|
||||
" vec4 maximos = max(max(fx30, fx60), fx45);\n"
|
||||
"#endif\n"
|
||||
"\n"
|
||||
" vec3 res1 = E;\n"
|
||||
" res1 = mix(res1, mix(H, F, px.x), maximos.x);\n"
|
||||
" res1 = mix(res1, mix(B, D, px.z), maximos.z);\n"
|
||||
" \n"
|
||||
" vec3 res2 = E;\n"
|
||||
" res2 = mix(res2, mix(F, B, px.y), maximos.y);\n"
|
||||
" res2 = mix(res2, mix(D, H, px.w), maximos.w);\n"
|
||||
" \n"
|
||||
" vec3 res = mix(res1, res2, step(c_df(E, res1), c_df(E, res2)));\n"
|
||||
"\n"
|
||||
" FragColor.xyz = res;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" vec4 texel = texture(SurfaceTex, TEX0.xy);\n"
|
||||
" FragColor = texel;\n"
|
||||
"}\n";
|
||||
|
||||
#endif
|
||||
|
|
|
|||
265
inc/palette.h
265
inc/palette.h
|
|
@ -1,265 +0,0 @@
|
|||
#ifndef PALETTE_H
|
||||
#define PALETTE_H
|
||||
|
||||
// Original palette copied from Windows ME
|
||||
static PALETTEENTRY g_ddp_default_palette[] =
|
||||
{
|
||||
{ 0, 0, 0, 0 },
|
||||
{ 128, 0, 0, 0 },
|
||||
{ 0, 128, 0, 0 },
|
||||
{ 128, 128, 0, 0 },
|
||||
{ 0, 0, 128, 0 },
|
||||
{ 128, 0, 128, 0 },
|
||||
{ 0, 128, 128, 0 },
|
||||
{ 192, 192, 192, 0 },
|
||||
{ 192, 220, 192, 0 },
|
||||
{ 166, 202, 240, 0 },
|
||||
{ 95, 63, 63, 0 },
|
||||
{ 127, 63, 63, 0 },
|
||||
{ 159, 63, 63, 0 },
|
||||
{ 191, 63, 63, 0 },
|
||||
{ 223, 63, 63, 0 },
|
||||
{ 255, 63, 63, 0 },
|
||||
{ 63, 95, 63, 0 },
|
||||
{ 95, 95, 63, 0 },
|
||||
{ 127, 95, 63, 0 },
|
||||
{ 159, 95, 63, 0 },
|
||||
{ 191, 95, 63, 0 },
|
||||
{ 223, 95, 63, 0 },
|
||||
{ 255, 95, 63, 0 },
|
||||
{ 63, 127, 63, 0 },
|
||||
{ 95, 127, 63, 0 },
|
||||
{ 127, 127, 63, 0 },
|
||||
{ 159, 127, 63, 0 },
|
||||
{ 191, 127, 63, 0 },
|
||||
{ 223, 127, 63, 0 },
|
||||
{ 255, 127, 63, 0 },
|
||||
{ 63, 159, 63, 0 },
|
||||
{ 95, 159, 63, 0 },
|
||||
{ 127, 159, 63, 0 },
|
||||
{ 159, 159, 63, 0 },
|
||||
{ 191, 159, 63, 0 },
|
||||
{ 223, 159, 63, 0 },
|
||||
{ 255, 159, 63, 0 },
|
||||
{ 63, 191, 63, 0 },
|
||||
{ 95, 191, 63, 0 },
|
||||
{ 127, 191, 63, 0 },
|
||||
{ 159, 191, 63, 0 },
|
||||
{ 191, 191, 63, 0 },
|
||||
{ 223, 191, 63, 0 },
|
||||
{ 255, 191, 63, 0 },
|
||||
{ 63, 223, 63, 0 },
|
||||
{ 95, 223, 63, 0 },
|
||||
{ 127, 223, 63, 0 },
|
||||
{ 159, 223, 63, 0 },
|
||||
{ 191, 223, 63, 0 },
|
||||
{ 223, 223, 63, 0 },
|
||||
{ 255, 223, 63, 0 },
|
||||
{ 63, 255, 63, 0 },
|
||||
{ 95, 255, 63, 0 },
|
||||
{ 127, 255, 63, 0 },
|
||||
{ 159, 255, 63, 0 },
|
||||
{ 191, 255, 63, 0 },
|
||||
{ 223, 255, 63, 0 },
|
||||
{ 255, 255, 63, 0 },
|
||||
{ 63, 63, 95, 0 },
|
||||
{ 95, 63, 95, 0 },
|
||||
{ 127, 63, 95, 0 },
|
||||
{ 159, 63, 95, 0 },
|
||||
{ 191, 63, 95, 0 },
|
||||
{ 223, 63, 95, 0 },
|
||||
{ 255, 63, 95, 0 },
|
||||
{ 63, 95, 95, 0 },
|
||||
{ 95, 95, 95, 0 },
|
||||
{ 127, 95, 95, 0 },
|
||||
{ 159, 95, 95, 0 },
|
||||
{ 191, 95, 95, 0 },
|
||||
{ 223, 95, 95, 0 },
|
||||
{ 255, 95, 95, 0 },
|
||||
{ 63, 127, 95, 0 },
|
||||
{ 95, 127, 95, 0 },
|
||||
{ 127, 127, 95, 0 },
|
||||
{ 159, 127, 95, 0 },
|
||||
{ 191, 127, 95, 0 },
|
||||
{ 223, 127, 95, 0 },
|
||||
{ 255, 127, 95, 0 },
|
||||
{ 63, 159, 95, 0 },
|
||||
{ 95, 159, 95, 0 },
|
||||
{ 127, 159, 95, 0 },
|
||||
{ 159, 159, 95, 0 },
|
||||
{ 191, 159, 95, 0 },
|
||||
{ 223, 159, 95, 0 },
|
||||
{ 255, 159, 95, 0 },
|
||||
{ 63, 191, 95, 0 },
|
||||
{ 95, 191, 95, 0 },
|
||||
{ 127, 191, 95, 0 },
|
||||
{ 159, 191, 95, 0 },
|
||||
{ 191, 191, 95, 0 },
|
||||
{ 223, 191, 95, 0 },
|
||||
{ 255, 191, 95, 0 },
|
||||
{ 63, 223, 95, 0 },
|
||||
{ 95, 223, 95, 0 },
|
||||
{ 127, 223, 95, 0 },
|
||||
{ 159, 223, 95, 0 },
|
||||
{ 191, 223, 95, 0 },
|
||||
{ 223, 223, 95, 0 },
|
||||
{ 255, 223, 95, 0 },
|
||||
{ 63, 255, 95, 0 },
|
||||
{ 95, 255, 95, 0 },
|
||||
{ 127, 255, 95, 0 },
|
||||
{ 159, 255, 95, 0 },
|
||||
{ 191, 255, 95, 0 },
|
||||
{ 223, 255, 95, 0 },
|
||||
{ 255, 255, 95, 0 },
|
||||
{ 63, 63, 127, 0 },
|
||||
{ 95, 63, 127, 0 },
|
||||
{ 127, 63, 127, 0 },
|
||||
{ 159, 63, 127, 0 },
|
||||
{ 191, 63, 127, 0 },
|
||||
{ 223, 63, 127, 0 },
|
||||
{ 255, 63, 127, 0 },
|
||||
{ 63, 95, 127, 0 },
|
||||
{ 95, 95, 127, 0 },
|
||||
{ 127, 95, 127, 0 },
|
||||
{ 159, 95, 127, 0 },
|
||||
{ 191, 95, 127, 0 },
|
||||
{ 223, 95, 127, 0 },
|
||||
{ 255, 95, 127, 0 },
|
||||
{ 63, 127, 127, 0 },
|
||||
{ 95, 127, 127, 0 },
|
||||
{ 127, 127, 127, 0 },
|
||||
{ 159, 127, 127, 0 },
|
||||
{ 191, 127, 127, 0 },
|
||||
{ 223, 127, 127, 0 },
|
||||
{ 255, 127, 127, 0 },
|
||||
{ 63, 159, 127, 0 },
|
||||
{ 95, 159, 127, 0 },
|
||||
{ 127, 159, 127, 0 },
|
||||
{ 159, 159, 127, 0 },
|
||||
{ 191, 159, 127, 0 },
|
||||
{ 223, 159, 127, 0 },
|
||||
{ 255, 159, 127, 0 },
|
||||
{ 63, 191, 127, 0 },
|
||||
{ 95, 191, 127, 0 },
|
||||
{ 127, 191, 127, 0 },
|
||||
{ 159, 191, 127, 0 },
|
||||
{ 191, 191, 127, 0 },
|
||||
{ 223, 191, 127, 0 },
|
||||
{ 255, 191, 127, 0 },
|
||||
{ 63, 223, 127, 0 },
|
||||
{ 95, 223, 127, 0 },
|
||||
{ 127, 223, 127, 0 },
|
||||
{ 159, 223, 127, 0 },
|
||||
{ 191, 223, 127, 0 },
|
||||
{ 223, 223, 127, 0 },
|
||||
{ 255, 223, 127, 0 },
|
||||
{ 63, 255, 127, 0 },
|
||||
{ 95, 255, 127, 0 },
|
||||
{ 127, 255, 127, 0 },
|
||||
{ 159, 255, 127, 0 },
|
||||
{ 191, 255, 127, 0 },
|
||||
{ 223, 255, 127, 0 },
|
||||
{ 255, 255, 127, 0 },
|
||||
{ 63, 63, 159, 0 },
|
||||
{ 95, 63, 159, 0 },
|
||||
{ 127, 63, 159, 0 },
|
||||
{ 159, 63, 159, 0 },
|
||||
{ 191, 63, 159, 0 },
|
||||
{ 223, 63, 159, 0 },
|
||||
{ 255, 63, 159, 0 },
|
||||
{ 63, 95, 159, 0 },
|
||||
{ 95, 95, 159, 0 },
|
||||
{ 127, 95, 159, 0 },
|
||||
{ 159, 95, 159, 0 },
|
||||
{ 191, 95, 159, 0 },
|
||||
{ 223, 95, 159, 0 },
|
||||
{ 255, 95, 159, 0 },
|
||||
{ 63, 127, 159, 0 },
|
||||
{ 95, 127, 159, 0 },
|
||||
{ 127, 127, 159, 0 },
|
||||
{ 159, 127, 159, 0 },
|
||||
{ 191, 127, 159, 0 },
|
||||
{ 223, 127, 159, 0 },
|
||||
{ 255, 127, 159, 0 },
|
||||
{ 63, 159, 159, 0 },
|
||||
{ 95, 159, 159, 0 },
|
||||
{ 127, 159, 159, 0 },
|
||||
{ 159, 159, 159, 0 },
|
||||
{ 191, 159, 159, 0 },
|
||||
{ 223, 159, 159, 0 },
|
||||
{ 255, 159, 159, 0 },
|
||||
{ 63, 191, 159, 0 },
|
||||
{ 95, 191, 159, 0 },
|
||||
{ 127, 191, 159, 0 },
|
||||
{ 159, 191, 159, 0 },
|
||||
{ 191, 191, 159, 0 },
|
||||
{ 223, 191, 159, 0 },
|
||||
{ 255, 191, 159, 0 },
|
||||
{ 63, 223, 159, 0 },
|
||||
{ 95, 223, 159, 0 },
|
||||
{ 127, 223, 159, 0 },
|
||||
{ 159, 223, 159, 0 },
|
||||
{ 191, 223, 159, 0 },
|
||||
{ 223, 223, 159, 0 },
|
||||
{ 255, 223, 159, 0 },
|
||||
{ 63, 255, 159, 0 },
|
||||
{ 95, 255, 159, 0 },
|
||||
{ 127, 255, 159, 0 },
|
||||
{ 159, 255, 159, 0 },
|
||||
{ 191, 255, 159, 0 },
|
||||
{ 223, 255, 159, 0 },
|
||||
{ 255, 255, 159, 0 },
|
||||
{ 63, 63, 191, 0 },
|
||||
{ 95, 63, 191, 0 },
|
||||
{ 127, 63, 191, 0 },
|
||||
{ 159, 63, 191, 0 },
|
||||
{ 191, 63, 191, 0 },
|
||||
{ 223, 63, 191, 0 },
|
||||
{ 255, 63, 191, 0 },
|
||||
{ 63, 95, 191, 0 },
|
||||
{ 95, 95, 191, 0 },
|
||||
{ 127, 95, 191, 0 },
|
||||
{ 159, 95, 191, 0 },
|
||||
{ 191, 95, 191, 0 },
|
||||
{ 223, 95, 191, 0 },
|
||||
{ 255, 95, 191, 0 },
|
||||
{ 63, 127, 191, 0 },
|
||||
{ 95, 127, 191, 0 },
|
||||
{ 127, 127, 191, 0 },
|
||||
{ 159, 127, 191, 0 },
|
||||
{ 191, 127, 191, 0 },
|
||||
{ 223, 127, 191, 0 },
|
||||
{ 255, 127, 191, 0 },
|
||||
{ 63, 159, 191, 0 },
|
||||
{ 95, 159, 191, 0 },
|
||||
{ 127, 159, 191, 0 },
|
||||
{ 159, 159, 191, 0 },
|
||||
{ 191, 159, 191, 0 },
|
||||
{ 223, 159, 191, 0 },
|
||||
{ 255, 159, 191, 0 },
|
||||
{ 63, 191, 191, 0 },
|
||||
{ 95, 191, 191, 0 },
|
||||
{ 127, 191, 191, 0 },
|
||||
{ 159, 191, 191, 0 },
|
||||
{ 191, 191, 191, 0 },
|
||||
{ 223, 191, 191, 0 },
|
||||
{ 255, 191, 191, 0 },
|
||||
{ 63, 223, 191, 0 },
|
||||
{ 95, 223, 191, 0 },
|
||||
{ 127, 223, 191, 0 },
|
||||
{ 159, 223, 191, 0 },
|
||||
{ 191, 223, 191, 0 },
|
||||
{ 223, 223, 191, 0 },
|
||||
{ 255, 251, 240, 0 },
|
||||
{ 58, 109, 165, 0 },
|
||||
{ 128, 128, 128, 0 },
|
||||
{ 255, 0, 0, 0 },
|
||||
{ 0, 255, 0, 0 },
|
||||
{ 255, 255, 0, 0 },
|
||||
{ 0, 0, 255, 0 },
|
||||
{ 255, 0, 255, 0 },
|
||||
{ 0, 255, 255, 0 },
|
||||
{ 255, 255, 255, 0 }
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -13,36 +13,24 @@ typedef struct D3D9RENDERER
|
|||
{
|
||||
HMODULE hmodule;
|
||||
D3DPRESENT_PARAMETERS params;
|
||||
HWND hwnd;
|
||||
LPDIRECT3D9 instance;
|
||||
LPDIRECT3DDEVICE9 device;
|
||||
LPDIRECT3DVERTEXBUFFER9 vertex_buf;
|
||||
IDirect3DTexture9* surface_tex[D3D9_TEXTURE_COUNT];
|
||||
IDirect3DTexture9* palette_tex[D3D9_TEXTURE_COUNT];
|
||||
IDirect3DPixelShader9* pixel_shader;
|
||||
IDirect3DPixelShader9* pixel_shader_upscale;
|
||||
IDirect3DPixelShader9* pixel_shader_bilinear;
|
||||
float scale_w;
|
||||
float scale_h;
|
||||
int bits_per_pixel;
|
||||
int tex_width;
|
||||
int tex_height;
|
||||
} D3D9RENDERER;
|
||||
|
||||
#define MAX_D3D9ON12_QUEUES 2
|
||||
|
||||
typedef struct _D3D9ON12_ARGS
|
||||
{
|
||||
BOOL Enable9On12;
|
||||
IUnknown* pD3D12Device;
|
||||
IUnknown* ppD3D12Queues[MAX_D3D9ON12_QUEUES];
|
||||
UINT NumQueues;
|
||||
UINT NodeMask;
|
||||
} D3D9ON12_ARGS;
|
||||
|
||||
BOOL d3d9_is_available();
|
||||
DWORD WINAPI d3d9_render_main(void);
|
||||
BOOL d3d9_create();
|
||||
BOOL d3d9_reset(BOOL windowed);
|
||||
BOOL d3d9_release_resources();
|
||||
BOOL d3d9_reset();
|
||||
BOOL d3d9_release();
|
||||
BOOL d3d9_on_device_lost();
|
||||
|
||||
|
|
|
|||
|
|
@ -5,28 +5,16 @@
|
|||
#include "opengl_utils.h"
|
||||
|
||||
#define TEXTURE_COUNT 4
|
||||
#define FBO_COUNT 2
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define GL_CHECK(stmt) do { \
|
||||
stmt; \
|
||||
ogl_check_error(#stmt); \
|
||||
} while (0)
|
||||
#else
|
||||
#define GL_CHECK(stmt) stmt
|
||||
#endif
|
||||
|
||||
typedef struct OGLRENDERER
|
||||
{
|
||||
HWND hwnd;
|
||||
HDC hdc;
|
||||
HGLRC context;
|
||||
GLuint main_program;
|
||||
GLuint shader1_program;
|
||||
GLuint shader2_program;
|
||||
GLuint scale_program;
|
||||
BOOL got_error;
|
||||
int surface_tex_width;
|
||||
int surface_tex_height;
|
||||
int* surface_tex;
|
||||
GLenum surface_format;
|
||||
GLenum surface_type;
|
||||
GLuint surface_tex_ids[TEXTURE_COUNT];
|
||||
|
|
@ -37,23 +25,17 @@ typedef struct OGLRENDERER
|
|||
GLint main_vertex_coord_attr_loc;
|
||||
GLuint main_vbos[3];
|
||||
GLuint main_vao;
|
||||
GLint shader1_frame_count_uni_loc;
|
||||
GLint shader2_frame_count_uni_loc;
|
||||
GLuint frame_buffer_id[FBO_COUNT];
|
||||
GLuint frame_buffer_tex_id[FBO_COUNT];
|
||||
GLint shader1_tex_coord_attr_loc;
|
||||
GLint shader2_tex_coord_attr_loc;
|
||||
GLuint shader1_vbos[3];
|
||||
GLuint shader2_vbos[3];
|
||||
GLuint shader1_vao;
|
||||
GLuint shader2_vao;
|
||||
GLint frame_count_uni_loc;
|
||||
GLuint frame_buffer_id;
|
||||
GLuint frame_buffer_tex_id;
|
||||
GLint scale_tex_coord_attr_loc;
|
||||
GLuint scale_vbos[3];
|
||||
GLuint scale_vao;
|
||||
BOOL use_opengl;
|
||||
BOOL adjust_alignment;
|
||||
BOOL filter_bilinear;
|
||||
BOOL shader2_upscale;
|
||||
} OGLRENDERER;
|
||||
|
||||
DWORD WINAPI ogl_render_main(void);
|
||||
BOOL ogl_create();
|
||||
BOOL ogl_release();
|
||||
|
||||
#endif
|
||||
|
|
|
|||
18
inc/scale_pattern.h
Normal file
18
inc/scale_pattern.h
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
#ifndef _SCALE_PATTERN_H
|
||||
#define _SCALE_PATTERN_H
|
||||
|
||||
typedef enum {
|
||||
REPEAT,
|
||||
SEQUENCE,
|
||||
ONCE,
|
||||
END
|
||||
} SCALE_PATTERN_TYPE;
|
||||
|
||||
typedef struct {
|
||||
SCALE_PATTERN_TYPE type;
|
||||
int dst_index;
|
||||
int src_index;
|
||||
int count;
|
||||
} scale_pattern;
|
||||
|
||||
#endif
|
||||
12
inc/utils.h
12
inc/utils.h
|
|
@ -5,17 +5,6 @@
|
|||
#include <windows.h>
|
||||
|
||||
|
||||
HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast);
|
||||
void util_set_process_affinity();
|
||||
void util_set_thread_affinity(DWORD tid);
|
||||
void util_pull_messages();
|
||||
DWORD util_get_timestamp(HMODULE mod);
|
||||
FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name);
|
||||
BOOL util_caller_is_ddraw_wrapper(void* return_address);
|
||||
BOOL util_is_bad_read_ptr(void* p);
|
||||
BOOL util_is_minimized(HWND hwnd);
|
||||
BOOL util_in_foreground();
|
||||
BOOL util_is_avx_supported();
|
||||
void util_limit_game_ticks();
|
||||
void util_update_bnet_pos(int newX, int newY);
|
||||
BOOL util_get_lowest_resolution(float ratio, SIZE* outRes, DWORD minWidth, DWORD minHeight, DWORD maxWidth, DWORD maxHeight);
|
||||
|
|
@ -23,7 +12,6 @@ void util_toggle_maximize();
|
|||
void util_toggle_fullscreen();
|
||||
BOOL util_unadjust_window_rect(LPRECT prc, DWORD dwStyle, BOOL fMenu, DWORD dwExStyle);
|
||||
void util_set_window_rect(int x, int y, int width, int height, UINT flags);
|
||||
BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam);
|
||||
BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lParam);
|
||||
BOOL util_detect_low_res_screen();
|
||||
|
||||
|
|
|
|||
|
|
@ -1,16 +0,0 @@
|
|||
#ifndef VERSION_H
|
||||
#define VERSION_H
|
||||
|
||||
#define str(s) #s
|
||||
#define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d)
|
||||
|
||||
#define VERSION_MAJOR 7
|
||||
#define VERSION_MINOR 1
|
||||
#define VERSION_BUILD 0
|
||||
#define VERSION_REVISION 1
|
||||
|
||||
#define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION
|
||||
#define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION)
|
||||
|
||||
|
||||
#endif
|
||||
|
|
@ -1,266 +0,0 @@
|
|||
/**
|
||||
* This file is part of the mingw-w64 runtime package.
|
||||
* No warranty is given; refer to the file DISCLAIMER within this package.
|
||||
*/
|
||||
|
||||
#ifndef _INC_VERSIONHELPERS
|
||||
#define _INC_VERSIONHELPERS
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define VERSIONHELPERAPI inline bool
|
||||
#else
|
||||
#define VERSIONHELPERAPI FORCEINLINE BOOL
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32_WINNT_WIN8
|
||||
#define _WIN32_WINNT_WIN8 0x0602
|
||||
#endif
|
||||
#ifndef _WIN32_WINNT_WINBLUE
|
||||
#define _WIN32_WINNT_WINBLUE 0x0603
|
||||
#endif
|
||||
#ifndef _WIN32_WINNT_WINTHRESHOLD
|
||||
#define _WIN32_WINNT_WINTHRESHOLD 0x0A00 /* ABRACADABRA_THRESHOLD*/
|
||||
#endif
|
||||
#ifndef _WIN32_WINNT_WIN10
|
||||
#define _WIN32_WINNT_WIN10 0x0A00 /* ABRACADABRA_THRESHOLD*/
|
||||
#endif
|
||||
#ifndef _WIN32_WINNT_WIN11
|
||||
#define _WIN32_WINNT_WIN11 0x0A00
|
||||
#endif
|
||||
|
||||
#if (_WIN32_WINNT < _WIN32_WINNT_WIN2K)
|
||||
#define VerifyVersionInfoW(a,b,c) 0
|
||||
#define VerSetConditionMask verhelp_set_mask
|
||||
#endif
|
||||
|
||||
BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask);
|
||||
ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition);
|
||||
const char* verhelp_wine_get_version();
|
||||
void verhelp_wine_get_host_version(const char** sysname, const char** release);
|
||||
|
||||
VERSIONHELPERAPI IsWindowsVersionOrGreater(DWORD major, DWORD minor, DWORD build, WORD servpack)
|
||||
{
|
||||
RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack };
|
||||
return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR,
|
||||
VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0,
|
||||
VER_MAJORVERSION, VER_GREATER_EQUAL),
|
||||
VER_MINORVERSION, VER_GREATER_EQUAL),
|
||||
VER_BUILDNUMBER, VER_GREATER_EQUAL),
|
||||
VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL));
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsVersion(DWORD major, DWORD minor, DWORD build, WORD servpack)
|
||||
{
|
||||
RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack };
|
||||
return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR,
|
||||
VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0,
|
||||
VER_MAJORVERSION, VER_EQUAL),
|
||||
VER_MINORVERSION, VER_EQUAL),
|
||||
VER_BUILDNUMBER, VER_GREATER_EQUAL),
|
||||
VER_SERVICEPACKMAJOR, VER_EQUAL));
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsVersionExcactBuild(DWORD major, DWORD minor, DWORD build, WORD servpack)
|
||||
{
|
||||
RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack };
|
||||
return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR,
|
||||
VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0,
|
||||
VER_MAJORVERSION, VER_EQUAL),
|
||||
VER_MINORVERSION, VER_EQUAL),
|
||||
VER_BUILDNUMBER, VER_EQUAL),
|
||||
VER_SERVICEPACKMAJOR, VER_EQUAL));
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsVersionAnySP(DWORD major, DWORD minor, DWORD build)
|
||||
{
|
||||
RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},0 };
|
||||
return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR,
|
||||
VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0,
|
||||
VER_MAJORVERSION, VER_EQUAL),
|
||||
VER_MINORVERSION, VER_EQUAL),
|
||||
VER_BUILDNUMBER, VER_GREATER_EQUAL),
|
||||
VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL));
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows2000OrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN2K), LOBYTE(_WIN32_WINNT_WIN2K), 0, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsXPOrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsXPSP1OrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 1);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsXPSP2OrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 2);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsXPSP3OrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 3);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsVistaOrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsVistaSP1OrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 1);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsVistaSP2OrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 2);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows7OrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows7SP1OrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 1);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows8OrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows8Point1OrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsThresholdOrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINTHRESHOLD), LOBYTE(_WIN32_WINNT_WINTHRESHOLD), 0, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows10OrGreater(void) {
|
||||
return IsWindowsThresholdOrGreater();
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows10Version1803OrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN10), LOBYTE(_WIN32_WINNT_WIN10), 17134, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows11OrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows11Version24H2OrGreater(void) {
|
||||
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 26100, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsServer(void) {
|
||||
OSVERSIONINFOEXW vi = {sizeof(vi),0,0,0,0,{0},0,0,0,VER_NT_WORKSTATION};
|
||||
return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL));
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows2000(void) {
|
||||
return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WIN2K), LOBYTE(_WIN32_WINNT_WIN2K), 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsXP(void) {
|
||||
return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsXPRTM(void) {
|
||||
return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsXPSP1(void) {
|
||||
return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 1);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsXPSP2(void) {
|
||||
return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 2);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsXPSP3(void) {
|
||||
return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 3);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsVista(void) {
|
||||
return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsVistaRTM(void) {
|
||||
return IsWindowsVersion(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsVistaSP1(void) {
|
||||
return IsWindowsVersion(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 1);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsVistaSP2(void) {
|
||||
return IsWindowsVersion(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 2);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows7(void) {
|
||||
return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows7RTM(void) {
|
||||
return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows7SP1(void) {
|
||||
return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 1);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows8(void) {
|
||||
return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows8Point1(void) {
|
||||
return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindowsThreshold(void) {
|
||||
return IsWindows10OrGreater() && !IsWindows11OrGreater();
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows10(void) {
|
||||
return IsWindowsThreshold();
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows11(void) {
|
||||
return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWindows11Version24H2(void) {
|
||||
return IsWindowsVersionExcactBuild(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 26100, 0);
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsWine(void) {
|
||||
return verhelp_wine_get_version() != NULL;
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsMacOS(void) {
|
||||
const char* sysname = NULL;
|
||||
const char* release = NULL;
|
||||
verhelp_wine_get_host_version(&sysname, &release);
|
||||
|
||||
return sysname && _strcmpi(sysname, "Darwin") == 0;
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsLinux(void) {
|
||||
const char* sysname = NULL;
|
||||
const char* release = NULL;
|
||||
verhelp_wine_get_host_version(&sysname, &release);
|
||||
|
||||
return sysname && _strcmpi(sysname, "Linux") == 0;
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsAndroid(void) {
|
||||
const char* sysname = NULL;
|
||||
const char* release = NULL;
|
||||
verhelp_wine_get_host_version(&sysname, &release);
|
||||
|
||||
return release && strstr(release, "android") != NULL;
|
||||
}
|
||||
|
||||
VERSIONHELPERAPI IsSteamDeck(void) {
|
||||
return IsWine() && GetEnvironmentVariable("STEAMDECK", NULL, 0);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
#ifndef WINAPI_HOOKS_H
|
||||
#define WINAPI_HOOKS_H
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <vfw.h>
|
||||
|
||||
|
||||
BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint);
|
||||
|
|
@ -22,81 +22,28 @@ BOOL WINAPI fake_SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int
|
|||
BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);
|
||||
LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
|
||||
LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong);
|
||||
LONG WINAPI fake_SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong);
|
||||
LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex);
|
||||
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);
|
||||
HWND WINAPI fake_GetTopWindow(HWND hWnd);
|
||||
HWND WINAPI fake_GetForegroundWindow(void);
|
||||
BOOL WINAPI fake_SetForegroundWindow(HWND hWnd);
|
||||
HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId);
|
||||
BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg);
|
||||
BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
|
||||
BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl);
|
||||
BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl);
|
||||
BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode);
|
||||
LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
|
||||
HWND WINAPI fake_SetParent(HWND hWndChild, HWND hWndNewParent);
|
||||
HDC WINAPI fake_BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);
|
||||
SHORT WINAPI fake_GetKeyState(int nVirtKey);
|
||||
SHORT WINAPI fake_GetAsyncKeyState(int vKey);
|
||||
int WINAPI fake_GetDeviceCaps(HDC hdc, int index);
|
||||
int WINAPI fake_GetDeviceCaps_system(HDC hdc, int index);
|
||||
|
||||
BOOL WINAPI fake_StretchBlt(
|
||||
HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop);
|
||||
|
||||
BOOL WINAPI fake_WinGStretchBlt(
|
||||
HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc);
|
||||
|
||||
BOOL WINAPI fake_WinGBitBlt(
|
||||
HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1);
|
||||
|
||||
BOOL WINAPI fake_BitBlt(
|
||||
HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, DWORD rop);
|
||||
|
||||
int WINAPI fake_SetDIBitsToDevice(
|
||||
HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT);
|
||||
|
||||
int WINAPI fake_StretchDIBits(
|
||||
HDC, int, int, int, int, int, int, int, int, const VOID*, const BITMAPINFO*, UINT, DWORD);
|
||||
|
||||
HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA*);
|
||||
HFONT WINAPI fake_CreateFontA(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR);
|
||||
UINT WINAPI fake_GetSystemPaletteEntries(HDC, UINT, UINT, LPPALETTEENTRY);
|
||||
HPALETTE WINAPI fake_SelectPalette(HDC, HPALETTE, BOOL);
|
||||
UINT WINAPI fake_RealizePalette(HDC);
|
||||
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);
|
||||
HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags);
|
||||
FARPROC WINAPI fake_GetProcAddress(HMODULE hModule, LPCSTR lpProcName);
|
||||
|
||||
BOOL WINAPI fake_GetDiskFreeSpaceA(
|
||||
LPCSTR lpRootPathName,
|
||||
LPDWORD lpSectorsPerCluster,
|
||||
LPDWORD lpBytesPerSector,
|
||||
LPDWORD lpNumberOfFreeClusters,
|
||||
LPDWORD lpTotalNumberOfClusters);
|
||||
|
||||
DWORD WINAPI fake_GetVersion(void);
|
||||
BOOL WINAPI fake_GetVersionExA(LPOSVERSIONINFOA lpVersionInformation);
|
||||
|
||||
HWND WINAPI fake_CreateWindowExA(
|
||||
DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y,
|
||||
int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);
|
||||
|
||||
HRESULT WINAPI fake_CoCreateInstance(
|
||||
REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv);
|
||||
|
||||
MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR fdwCommand, DWORD_PTR dwParam);
|
||||
|
||||
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter(
|
||||
LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);
|
||||
|
||||
PGETFRAME WINAPI fake_AVIStreamGetFrameOpen(PAVISTREAM pavi, LPBITMAPINFOHEADER lpbiWanted);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -7,19 +7,9 @@
|
|||
#define WM_SIZE_DDRAW WM_APP+114
|
||||
#define WM_MOVE_DDRAW WM_APP+115
|
||||
#define WM_DISPLAYCHANGE_DDRAW WM_APP+116
|
||||
#define WM_TOGGLE_FULLSCREEN WM_APP+117
|
||||
#define WM_TOGGLE_MAXIMIZE WM_APP+118
|
||||
#define WM_RESTORE_STYLE WM_APP+119
|
||||
|
||||
#define IDT_TIMER_LEAVE_BNET 541287654
|
||||
#define IDT_TIMER_LINUX_FIX_WINDOW_SIZE 345267753
|
||||
|
||||
#define CNC_DDRAW_SET_FULLSCREEN 1
|
||||
#define CNC_DDRAW_SET_WINDOWED 2
|
||||
|
||||
#ifndef WM_UNICHAR
|
||||
#define WM_UNICHAR 0x0109
|
||||
#endif
|
||||
#define IDT_TIMER_REDRAW_BNET 541287655
|
||||
|
||||
LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
|
|
|
|||
30
res.rc
30
res.rc
|
|
@ -1,30 +0,0 @@
|
|||
#include "inc/version.h"
|
||||
#include "inc/git.h"
|
||||
|
||||
|
||||
1 VERSIONINFO
|
||||
FILEVERSION VERSION
|
||||
PRODUCTVERSION VERSION
|
||||
{
|
||||
BLOCK "StringFileInfo"
|
||||
{
|
||||
BLOCK "040904B0"
|
||||
{
|
||||
VALUE "CompanyName", "github.com/FunkyFr3sh"
|
||||
VALUE "FileDescription", "DirectDraw replacement"
|
||||
VALUE "FileVersion", VERSION_STRING " (git~" GIT_COMMIT ", " GIT_BRANCH ")"
|
||||
VALUE "InternalName", "ddraw"
|
||||
VALUE "LegalCopyright", "Copyright (c) 2010-2024"
|
||||
VALUE "LegalTrademarks", ""
|
||||
VALUE "OriginalFileName", "ddraw.dll"
|
||||
VALUE "ProductName", "cnc-ddraw"
|
||||
VALUE "ProductVersion", VERSION_STRING " (git~" GIT_COMMIT ", " GIT_BRANCH ")"
|
||||
VALUE "Comments", "https://github.com/FunkyFr3sh/cnc-ddraw"
|
||||
}
|
||||
}
|
||||
|
||||
BLOCK "VarFileInfo"
|
||||
{
|
||||
VALUE "Translation", 0x0409, 0x04B0
|
||||
}
|
||||
}
|
||||
|
|
@ -4,28 +4,15 @@
|
|||
|
||||
HRESULT __stdcall IDirect3D__QueryInterface(IDirect3DImpl* This, REFIID riid, void** obj)
|
||||
{
|
||||
TRACE(
|
||||
"NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
(unsigned int)riid,
|
||||
obj,
|
||||
_ReturnAddress());
|
||||
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj);
|
||||
HRESULT ret = E_FAIL;
|
||||
|
||||
if (riid)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1);
|
||||
}
|
||||
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ULONG __stdcall IDirect3D__AddRef(IDirect3DImpl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
ULONG ret = ++This->ref;
|
||||
TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret);
|
||||
return ret;
|
||||
|
|
@ -33,7 +20,7 @@ ULONG __stdcall IDirect3D__AddRef(IDirect3DImpl* This)
|
|||
|
||||
ULONG __stdcall IDirect3D__Release(IDirect3DImpl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
|
||||
ULONG ret = --This->ref;
|
||||
|
||||
|
|
@ -50,33 +37,23 @@ ULONG __stdcall IDirect3D__Release(IDirect3DImpl* This)
|
|||
|
||||
HRESULT __stdcall IDirect3D__Initialize(IDirect3DImpl* This, int a)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirect3D__EnumDevices(
|
||||
IDirect3DImpl* This,
|
||||
LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
|
||||
LPVOID lpUserArg)
|
||||
HRESULT __stdcall IDirect3D__EnumDevices(IDirect3DImpl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
HRESULT ret = S_OK;
|
||||
|
||||
if (lpEnumDevicesCallback)
|
||||
{
|
||||
D3DDEVICEDESC desc = { 0 };
|
||||
lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg);
|
||||
}
|
||||
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirect3D__CreateLight(IDirect3DImpl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -84,7 +61,7 @@ HRESULT __stdcall IDirect3D__CreateLight(IDirect3DImpl* This, int a, int b)
|
|||
|
||||
HRESULT __stdcall IDirect3D__CreateMaterial(IDirect3DImpl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -92,7 +69,7 @@ HRESULT __stdcall IDirect3D__CreateMaterial(IDirect3DImpl* This, int a, int b)
|
|||
|
||||
HRESULT __stdcall IDirect3D__CreateViewport(IDirect3DImpl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -100,7 +77,7 @@ HRESULT __stdcall IDirect3D__CreateViewport(IDirect3DImpl* This, int a, int b)
|
|||
|
||||
HRESULT __stdcall IDirect3D__FindDevice(IDirect3DImpl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -4,28 +4,15 @@
|
|||
|
||||
HRESULT __stdcall IDirect3D2__QueryInterface(IDirect3D2Impl* This, REFIID riid, void** obj)
|
||||
{
|
||||
TRACE(
|
||||
"NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
(unsigned int)riid,
|
||||
obj,
|
||||
_ReturnAddress());
|
||||
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj);
|
||||
HRESULT ret = E_FAIL;
|
||||
|
||||
if (riid)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1);
|
||||
}
|
||||
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ULONG __stdcall IDirect3D2__AddRef(IDirect3D2Impl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
ULONG ret = ++This->ref;
|
||||
TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret);
|
||||
return ret;
|
||||
|
|
@ -33,7 +20,7 @@ ULONG __stdcall IDirect3D2__AddRef(IDirect3D2Impl* This)
|
|||
|
||||
ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
|
||||
ULONG ret = --This->ref;
|
||||
|
||||
|
|
@ -48,27 +35,17 @@ ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This)
|
|||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirect3D2__EnumDevices(
|
||||
IDirect3D2Impl* This,
|
||||
LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
|
||||
LPVOID lpUserArg)
|
||||
HRESULT __stdcall IDirect3D2__EnumDevices(IDirect3D2Impl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
HRESULT ret = S_OK;
|
||||
|
||||
if (lpEnumDevicesCallback)
|
||||
{
|
||||
//D3DDEVICEDESC desc = { 0 };
|
||||
//lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg);
|
||||
}
|
||||
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirect3D2__CreateLight(IDirect3D2Impl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -76,7 +53,7 @@ HRESULT __stdcall IDirect3D2__CreateLight(IDirect3D2Impl* This, int a, int b)
|
|||
|
||||
HRESULT __stdcall IDirect3D2__CreateMaterial(IDirect3D2Impl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -84,7 +61,7 @@ HRESULT __stdcall IDirect3D2__CreateMaterial(IDirect3D2Impl* This, int a, int b)
|
|||
|
||||
HRESULT __stdcall IDirect3D2__CreateViewport(IDirect3D2Impl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -92,7 +69,7 @@ HRESULT __stdcall IDirect3D2__CreateViewport(IDirect3D2Impl* This, int a, int b)
|
|||
|
||||
HRESULT __stdcall IDirect3D2__FindDevice(IDirect3D2Impl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -100,7 +77,7 @@ HRESULT __stdcall IDirect3D2__FindDevice(IDirect3D2Impl* This, int a, int b)
|
|||
|
||||
HRESULT __stdcall IDirect3D2__CreateDevice(IDirect3D2Impl* This, int a, int b, int c)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -4,28 +4,15 @@
|
|||
|
||||
HRESULT __stdcall IDirect3D3__QueryInterface(IDirect3D3Impl* This, REFIID riid, void** obj)
|
||||
{
|
||||
TRACE(
|
||||
"NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
(unsigned int)riid,
|
||||
obj,
|
||||
_ReturnAddress());
|
||||
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj);
|
||||
HRESULT ret = E_FAIL;
|
||||
|
||||
if (riid)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1);
|
||||
}
|
||||
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ULONG __stdcall IDirect3D3__AddRef(IDirect3D3Impl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
ULONG ret = ++This->ref;
|
||||
TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret);
|
||||
return ret;
|
||||
|
|
@ -33,7 +20,7 @@ ULONG __stdcall IDirect3D3__AddRef(IDirect3D3Impl* This)
|
|||
|
||||
ULONG __stdcall IDirect3D3__Release(IDirect3D3Impl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
|
||||
ULONG ret = --This->ref;
|
||||
|
||||
|
|
@ -48,27 +35,17 @@ ULONG __stdcall IDirect3D3__Release(IDirect3D3Impl* This)
|
|||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirect3D3__EnumDevices(
|
||||
IDirect3D3Impl* This,
|
||||
LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
|
||||
LPVOID lpUserArg)
|
||||
HRESULT __stdcall IDirect3D3__EnumDevices(IDirect3D3Impl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
HRESULT ret = S_OK;
|
||||
|
||||
if (lpEnumDevicesCallback)
|
||||
{
|
||||
//D3DDEVICEDESC desc = { 0 };
|
||||
//lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg);
|
||||
}
|
||||
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirect3D3__CreateLight(IDirect3D3Impl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -76,7 +53,7 @@ HRESULT __stdcall IDirect3D3__CreateLight(IDirect3D3Impl* This, int a, int b)
|
|||
|
||||
HRESULT __stdcall IDirect3D3__CreateMaterial(IDirect3D3Impl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -84,7 +61,7 @@ HRESULT __stdcall IDirect3D3__CreateMaterial(IDirect3D3Impl* This, int a, int b)
|
|||
|
||||
HRESULT __stdcall IDirect3D3__CreateViewport(IDirect3D3Impl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -92,7 +69,7 @@ HRESULT __stdcall IDirect3D3__CreateViewport(IDirect3D3Impl* This, int a, int b)
|
|||
|
||||
HRESULT __stdcall IDirect3D3__FindDevice(IDirect3D3Impl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -100,7 +77,7 @@ HRESULT __stdcall IDirect3D3__FindDevice(IDirect3D3Impl* This, int a, int b)
|
|||
|
||||
HRESULT __stdcall IDirect3D3__CreateDevice(IDirect3D3Impl* This, int a, int b, int c, int d)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -108,7 +85,7 @@ HRESULT __stdcall IDirect3D3__CreateDevice(IDirect3D3Impl* This, int a, int b, i
|
|||
|
||||
HRESULT __stdcall IDirect3D3__CreateVertexBuffer(IDirect3D3Impl* This, int a, int b, int c, int d)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -116,7 +93,7 @@ HRESULT __stdcall IDirect3D3__CreateVertexBuffer(IDirect3D3Impl* This, int a, in
|
|||
|
||||
HRESULT __stdcall IDirect3D3__EnumZBufferFormats(IDirect3D3Impl* This, int a, int b, int c)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -124,7 +101,7 @@ HRESULT __stdcall IDirect3D3__EnumZBufferFormats(IDirect3D3Impl* This, int a, in
|
|||
|
||||
HRESULT __stdcall IDirect3D3__EvictManagedTextures(IDirect3D3Impl* This)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -4,28 +4,15 @@
|
|||
|
||||
HRESULT __stdcall IDirect3D7__QueryInterface(IDirect3D7Impl* This, REFIID riid, void** obj)
|
||||
{
|
||||
TRACE(
|
||||
"NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
(unsigned int)riid,
|
||||
obj,
|
||||
_ReturnAddress());
|
||||
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj);
|
||||
HRESULT ret = E_FAIL;
|
||||
|
||||
if (riid)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1);
|
||||
}
|
||||
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ULONG __stdcall IDirect3D7__AddRef(IDirect3D7Impl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
ULONG ret = ++This->ref;
|
||||
TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret);
|
||||
return ret;
|
||||
|
|
@ -33,7 +20,7 @@ ULONG __stdcall IDirect3D7__AddRef(IDirect3D7Impl* This)
|
|||
|
||||
ULONG __stdcall IDirect3D7__Release(IDirect3D7Impl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
|
||||
ULONG ret = --This->ref;
|
||||
|
||||
|
|
@ -48,27 +35,17 @@ ULONG __stdcall IDirect3D7__Release(IDirect3D7Impl* This)
|
|||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirect3D7__EnumDevices(
|
||||
IDirect3D7Impl* This,
|
||||
LPD3DENUMDEVICESCALLBACK7 lpEnumDevicesCallback,
|
||||
LPVOID lpUserArg)
|
||||
HRESULT __stdcall IDirect3D7__EnumDevices(IDirect3D7Impl* This, int a, int b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
HRESULT ret = S_OK;
|
||||
|
||||
if (lpEnumDevicesCallback)
|
||||
{
|
||||
//D3DDEVICEDESC7 desc = { 0 };
|
||||
//lpEnumDevicesCallback("NULL", "NULL", &desc, lpUserArg);
|
||||
}
|
||||
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirect3D7__CreateDevice(IDirect3D7Impl* This, int a, int b, int c)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -76,7 +53,7 @@ HRESULT __stdcall IDirect3D7__CreateDevice(IDirect3D7Impl* This, int a, int b, i
|
|||
|
||||
HRESULT __stdcall IDirect3D7__CreateVertexBuffer(IDirect3D7Impl* This, int a, int b, int c)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -84,7 +61,7 @@ HRESULT __stdcall IDirect3D7__CreateVertexBuffer(IDirect3D7Impl* This, int a, in
|
|||
|
||||
HRESULT __stdcall IDirect3D7__EnumZBufferFormats(IDirect3D7Impl* This, int a, int b, int c)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -92,7 +69,7 @@ HRESULT __stdcall IDirect3D7__EnumZBufferFormats(IDirect3D7Impl* This, int a, in
|
|||
|
||||
HRESULT __stdcall IDirect3D7__EvictManagedTextures(IDirect3D7Impl* This)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
#include <windows.h>
|
||||
#include <initguid.h>
|
||||
#include "IDirectDraw.h"
|
||||
#include "IDirect3D.h"
|
||||
|
|
@ -8,21 +7,15 @@
|
|||
#include "ddpalette.h"
|
||||
#include "ddsurface.h"
|
||||
#include "debug.h"
|
||||
#include "hook.h"
|
||||
#include "config.h"
|
||||
|
||||
|
||||
HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid, LPVOID FAR* ppvObj)
|
||||
{
|
||||
TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", __FUNCTION__, This, (unsigned int)riid, ppvObj, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj);
|
||||
|
||||
HRESULT ret = E_NOINTERFACE;
|
||||
HRESULT ret = DDERR_UNSUPPORTED;
|
||||
|
||||
if (!ppvObj)
|
||||
{
|
||||
ret = E_INVALIDARG;
|
||||
}
|
||||
else if (riid)
|
||||
if (riid)
|
||||
{
|
||||
if (IsEqualGUID(&IID_IDirectDraw2, riid) ||
|
||||
IsEqualGUID(&IID_IDirectDraw4, riid) ||
|
||||
|
|
@ -111,14 +104,12 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid
|
|||
*ppvObj = d3d;
|
||||
|
||||
ret = S_OK;
|
||||
}
|
||||
else if (IsEqualGUID(&IID_IMediaStream, riid) || IsEqualGUID(&IID_IAMMediaStream, riid))
|
||||
}
|
||||
/*
|
||||
else if (
|
||||
!g_ddraw->passthrough &&
|
||||
(IsEqualGUID(&IID_IMediaStream, riid) || IsEqualGUID(&IID_IAMMediaStream, riid)))
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED GUID = %08X (IID_IXXMediaStream)\n", ((GUID*)riid)->Data1);
|
||||
|
||||
ret = E_NOINTERFACE;
|
||||
|
||||
/*
|
||||
IAMMediaStreamImpl* ms =
|
||||
(IAMMediaStreamImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAMMediaStreamImpl));
|
||||
|
||||
|
|
@ -127,63 +118,50 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid
|
|||
ms->lpVtbl = &g_ms_vtbl;
|
||||
ms->lpVtbl->AddRef(ms);
|
||||
|
||||
*ppvObj = ms;
|
||||
*obj = ms;
|
||||
|
||||
ret = S_OK;
|
||||
*/
|
||||
}
|
||||
else if (((GUID*)riid)->Data1 == 0 && ((GUID*)riid)->Data2 == 0 && ((GUID*)riid)->Data3 == 0)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED GUID = 0 0 0\n");
|
||||
|
||||
ret = E_NOINTERFACE;
|
||||
}
|
||||
*/
|
||||
else
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1);
|
||||
|
||||
if (!g_ddraw.real_dll)
|
||||
g_ddraw.real_dll = real_LoadLibraryA("system32\\ddraw.dll");
|
||||
if (!g_ddraw->real_dll)
|
||||
g_ddraw->real_dll = LoadLibrary("system32\\ddraw.dll");
|
||||
|
||||
if (g_ddraw.real_dll && !g_ddraw.DirectDrawCreate)
|
||||
g_ddraw.DirectDrawCreate = (void*)real_GetProcAddress(g_ddraw.real_dll, "DirectDrawCreate");
|
||||
if (g_ddraw->real_dll && !g_ddraw->DirectDrawCreate)
|
||||
g_ddraw->DirectDrawCreate = (void*)GetProcAddress(g_ddraw->real_dll, "DirectDrawCreate");
|
||||
|
||||
if (g_ddraw.DirectDrawCreate == DirectDrawCreate)
|
||||
g_ddraw.DirectDrawCreate = NULL;
|
||||
if (g_ddraw->DirectDrawCreate == DirectDrawCreate)
|
||||
g_ddraw->DirectDrawCreate = NULL;
|
||||
|
||||
if (!g_ddraw.real_dd && g_ddraw.DirectDrawCreate)
|
||||
g_ddraw.DirectDrawCreate(NULL, &g_ddraw.real_dd, NULL);
|
||||
if (!g_ddraw->real_dd && g_ddraw->DirectDrawCreate)
|
||||
g_ddraw->DirectDrawCreate(NULL, &g_ddraw->real_dd, NULL);
|
||||
|
||||
if (g_ddraw.real_dd)
|
||||
ret = IDirectDraw_QueryInterface(g_ddraw.real_dd, riid, ppvObj);
|
||||
if (g_ddraw->real_dd)
|
||||
ret = IDirectDraw_QueryInterface(g_ddraw->real_dd, riid, ppvObj);
|
||||
else
|
||||
ret = E_NOINTERFACE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TRACE("<- %s(result=%08X)\n", __FUNCTION__, ret);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ULONG __stdcall IDirectDraw__AddRef(IDirectDrawImpl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
ULONG ret = ++This->ref;
|
||||
|
||||
#ifdef _DEBUG
|
||||
ULONG glob_ref = dd_AddRef();
|
||||
#else
|
||||
dd_AddRef();
|
||||
#endif
|
||||
|
||||
TRACE("<- %s(This ref=%u, global ref=%u)\n", __FUNCTION__, ret, glob_ref);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ULONG __stdcall IDirectDraw__Release(IDirectDrawImpl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
|
||||
ULONG ret = --This->ref;
|
||||
|
||||
|
|
@ -194,11 +172,7 @@ ULONG __stdcall IDirectDraw__Release(IDirectDrawImpl* This)
|
|||
HeapFree(GetProcessHeap(), 0, This);
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
ULONG glob_ref = dd_Release();
|
||||
#else
|
||||
dd_Release();
|
||||
#endif
|
||||
|
||||
TRACE("<- %s(This ref=%u, global ref=%u)\n", __FUNCTION__, ret, glob_ref);
|
||||
return ret;
|
||||
|
|
@ -206,7 +180,7 @@ ULONG __stdcall IDirectDraw__Release(IDirectDrawImpl* This)
|
|||
|
||||
HRESULT __stdcall IDirectDraw__Compact(IDirectDrawImpl* This)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -219,13 +193,12 @@ HRESULT __stdcall IDirectDraw__CreateClipper(
|
|||
IUnknown FAR* pUnkOuter)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(This=%p, dwFlags=%08X, lplpDDClipper=%p, unkOuter=%p) [%p]\n",
|
||||
"-> %s(This=%p, dwFlags=%08X, lplpDDClipper=%p, unkOuter=%p)\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
dwFlags,
|
||||
lplpDDClipper,
|
||||
pUnkOuter,
|
||||
_ReturnAddress());
|
||||
pUnkOuter);
|
||||
|
||||
HRESULT ret = dd_CreateClipper(dwFlags, (IDirectDrawClipperImpl**)lplpDDClipper, pUnkOuter);
|
||||
|
||||
|
|
@ -241,14 +214,13 @@ HRESULT __stdcall IDirectDraw__CreatePalette(
|
|||
IUnknown FAR* unkOuter)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(This=%p, dwFlags=%08X, lpDDColorArray=%p, lpDDPalette=%p, unkOuter=%p) [%p]\n",
|
||||
"-> %s(This=%p, dwFlags=%08X, lpDDColorArray=%p, lpDDPalette=%p, unkOuter=%p)\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
dwFlags,
|
||||
lpDDColorArray,
|
||||
lpDDPalette,
|
||||
unkOuter,
|
||||
_ReturnAddress());
|
||||
unkOuter);
|
||||
|
||||
HRESULT ret = dd_CreatePalette(dwFlags, lpDDColorArray, (IDirectDrawPaletteImpl**)lpDDPalette, unkOuter);
|
||||
|
||||
|
|
@ -263,13 +235,12 @@ HRESULT __stdcall IDirectDraw__CreateSurface(
|
|||
IUnknown FAR* unkOuter)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(This=%p, lpDDSurfaceDesc=%p, lpDDSurface=%p, unkOuter=%p) [%p]\n",
|
||||
"-> %s(This=%p, lpDDSurfaceDesc=%p, lpDDSurface=%p, unkOuter=%p)\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
lpDDSurfaceDesc,
|
||||
lpDDSurface,
|
||||
unkOuter,
|
||||
_ReturnAddress());
|
||||
unkOuter);
|
||||
|
||||
HRESULT ret =
|
||||
dd_CreateSurface(
|
||||
|
|
@ -287,7 +258,7 @@ HRESULT __stdcall IDirectDraw__DuplicateSurface(
|
|||
LPDIRECTDRAWSURFACE7 lpDDSrcSurface,
|
||||
LPDIRECTDRAWSURFACE7* lpDDDestSurface)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_CANTDUPLICATE;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -301,14 +272,13 @@ HRESULT __stdcall IDirectDraw__EnumDisplayModes(
|
|||
LPDDENUMMODESCALLBACK2 lpEnumModesCallback)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(This=%p, dwFlags=%08X, lpDDSurfaceDesc=%p, lpContext=%p, lpEnumModesCallback=%p) [%p]\n",
|
||||
"-> %s(This=%p, dwFlags=%08X, lpDDSurfaceDesc=%p, lpContext=%p, lpEnumModesCallback=%p)\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
dwFlags,
|
||||
lpDDSurfaceDesc,
|
||||
lpContext,
|
||||
lpEnumModesCallback,
|
||||
_ReturnAddress());
|
||||
lpEnumModesCallback);
|
||||
|
||||
HRESULT ret =
|
||||
dd_EnumDisplayModes(
|
||||
|
|
@ -328,25 +298,15 @@ HRESULT __stdcall IDirectDraw__EnumSurfaces(
|
|||
LPVOID lpContext,
|
||||
LPDDENUMSURFACESCALLBACK7 lpEnumSurfacesCallback)
|
||||
{
|
||||
TRACE(
|
||||
"NOT_IMPLEMENTED -> %s(This=%p, dwFlags=%08X, lpDDSurfaceDesc=%p, lpContext=%p, lpEnumSurfacesCallback=%p) [%p]\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
dwFlags,
|
||||
lpDDSurfaceDesc,
|
||||
lpContext,
|
||||
lpEnumSurfacesCallback,
|
||||
_ReturnAddress());
|
||||
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDraw__FlipToGDISurface(IDirectDrawImpl* This)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -354,14 +314,7 @@ HRESULT __stdcall IDirectDraw__FlipToGDISurface(IDirectDrawImpl* This)
|
|||
|
||||
HRESULT __stdcall IDirectDraw__GetCaps(IDirectDrawImpl* This, LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDEmulCaps)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(This=%p, lpDDDriverCaps=%p, lpDDEmulCaps=%p) [%p]\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
lpDDDriverCaps,
|
||||
lpDDEmulCaps,
|
||||
_ReturnAddress());
|
||||
|
||||
TRACE("-> %s(This=%p, lpDDDriverCaps=%p, lpDDEmulCaps=%p)\n", __FUNCTION__, This, lpDDDriverCaps, lpDDEmulCaps);
|
||||
HRESULT ret = dd_GetCaps((LPDDCAPS_DX1)lpDDDriverCaps, (LPDDCAPS_DX1)lpDDEmulCaps);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -369,7 +322,7 @@ HRESULT __stdcall IDirectDraw__GetCaps(IDirectDrawImpl* This, LPDDCAPS lpDDDrive
|
|||
|
||||
HRESULT __stdcall IDirectDraw__GetDisplayMode(IDirectDrawImpl* This, LPDDSURFACEDESC2 lpDDSurfaceDesc)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = dd_GetDisplayMode((LPDDSURFACEDESC)lpDDSurfaceDesc);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -377,7 +330,7 @@ HRESULT __stdcall IDirectDraw__GetDisplayMode(IDirectDrawImpl* This, LPDDSURFACE
|
|||
|
||||
HRESULT __stdcall IDirectDraw__GetFourCCCodes(IDirectDrawImpl* This, LPDWORD lpNumCodes, LPDWORD lpCodes)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_INVALIDOBJECT;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -385,16 +338,16 @@ HRESULT __stdcall IDirectDraw__GetFourCCCodes(IDirectDrawImpl* This, LPDWORD lpN
|
|||
|
||||
HRESULT __stdcall IDirectDraw__GetGDISurface(IDirectDrawImpl* This, LPDIRECTDRAWSURFACE7* lplpGDIDDSurface)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
HRESULT ret = DD_OK;
|
||||
*lplpGDIDDSurface = (LPDIRECTDRAWSURFACE7)g_ddraw.primary;
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_NOTFOUND;
|
||||
*lplpGDIDDSurface = (LPDIRECTDRAWSURFACE7)g_ddraw->primary;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDraw__GetMonitorFrequency(IDirectDrawImpl* This, LPDWORD lpdwFreq)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = dd_GetMonitorFrequency(lpdwFreq);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -402,7 +355,7 @@ HRESULT __stdcall IDirectDraw__GetMonitorFrequency(IDirectDrawImpl* This, LPDWOR
|
|||
|
||||
HRESULT __stdcall IDirectDraw__GetScanLine(IDirectDrawImpl* This, LPDWORD lpdwScanLine)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_UNSUPPORTED;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -410,7 +363,7 @@ HRESULT __stdcall IDirectDraw__GetScanLine(IDirectDrawImpl* This, LPDWORD lpdwSc
|
|||
|
||||
HRESULT __stdcall IDirectDraw__GetVerticalBlankStatus(IDirectDrawImpl* This, LPBOOL lpbIsInVB)
|
||||
{
|
||||
TRACE("-> %s(This=%p, lpbIsInVB=%p) [%p]\n", __FUNCTION__, This, lpbIsInVB, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p, lpbIsInVB=%p)\n", __FUNCTION__, This, lpbIsInVB);
|
||||
HRESULT ret = dd_GetVerticalBlankStatus(lpbIsInVB);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -418,15 +371,15 @@ HRESULT __stdcall IDirectDraw__GetVerticalBlankStatus(IDirectDrawImpl* This, LPB
|
|||
|
||||
HRESULT __stdcall IDirectDraw__Initialize(IDirectDrawImpl* This, GUID* lpGUID)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDraw__RestoreDisplayMode(IDirectDrawImpl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = dd_RestoreDisplayMode();
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -434,7 +387,7 @@ HRESULT __stdcall IDirectDraw__RestoreDisplayMode(IDirectDrawImpl* This)
|
|||
|
||||
HRESULT __stdcall IDirectDraw__SetCooperativeLevel(IDirectDrawImpl* This, HWND hwnd, DWORD dwFlags)
|
||||
{
|
||||
TRACE("-> %s(This=%p, hwnd=%p, dwFlags=0x%08X) [%p]\n", __FUNCTION__, This, hwnd, dwFlags, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p, hwnd=%p, dwFlags=0x%08X)\n", __FUNCTION__, This, hwnd, dwFlags);
|
||||
HRESULT ret = dd_SetCooperativeLevel(hwnd, dwFlags);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -442,15 +395,7 @@ HRESULT __stdcall IDirectDraw__SetCooperativeLevel(IDirectDrawImpl* This, HWND h
|
|||
|
||||
HRESULT __stdcall IDirectDraw__SetDisplayMode(IDirectDrawImpl* This, DWORD dwWidth, DWORD dwHeight, DWORD dwBPP)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d) [%p]\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
dwWidth,
|
||||
dwHeight,
|
||||
dwBPP,
|
||||
_ReturnAddress());
|
||||
|
||||
TRACE("-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d)\n", __FUNCTION__, This, dwWidth, dwHeight, dwBPP);
|
||||
HRESULT ret = dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, SDM_MODE_SET_BY_GAME);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -465,15 +410,14 @@ HRESULT __stdcall IDirectDraw__SetDisplayModeX(
|
|||
DWORD dwFlags)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d, refreshRate=%d, dwFlags=%d) [%p]\n",
|
||||
"-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d, refreshRate=%d, dwFlags=%d)\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
dwWidth,
|
||||
dwHeight,
|
||||
dwBPP,
|
||||
dwRefreshRate,
|
||||
dwFlags,
|
||||
_ReturnAddress());
|
||||
dwFlags);
|
||||
|
||||
HRESULT ret = dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, SDM_MODE_SET_BY_GAME);
|
||||
|
||||
|
|
@ -483,7 +427,7 @@ HRESULT __stdcall IDirectDraw__SetDisplayModeX(
|
|||
|
||||
HRESULT __stdcall IDirectDraw__WaitForVerticalBlank(IDirectDrawImpl* This, DWORD dwFlags, HANDLE hEvent)
|
||||
{
|
||||
TRACE_EXT("-> %s(This=%p, dwFlags=%08X, hEvent=%p) [%p]\n", __FUNCTION__, This, dwFlags, hEvent, _ReturnAddress());
|
||||
TRACE_EXT("-> %s(This=%p, dwFlags=%08X, hEvent=%p)\n", __FUNCTION__, This, dwFlags, hEvent);
|
||||
HRESULT ret = dd_WaitForVerticalBlank(dwFlags, hEvent);
|
||||
TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -496,13 +440,12 @@ HRESULT __stdcall IDirectDraw__GetAvailableVidMem(
|
|||
LPDWORD lpdwFree)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(This=%p, lpDDCaps=%p, lpdwTotal=%p, lpdwFree=%p) [%p]\n",
|
||||
"-> %s(This=%p, lpDDCaps=%p, lpdwTotal=%p, lpdwFree=%p)\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
lpDDCaps,
|
||||
lpdwTotal,
|
||||
lpdwFree,
|
||||
_ReturnAddress());
|
||||
lpdwFree);
|
||||
|
||||
HRESULT ret = dd_GetAvailableVidMem((LPDDSCAPS)lpDDCaps, lpdwTotal, lpdwFree);
|
||||
|
||||
|
|
@ -512,7 +455,7 @@ HRESULT __stdcall IDirectDraw__GetAvailableVidMem(
|
|||
|
||||
HRESULT __stdcall IDirectDraw__GetSurfaceFromDC(IDirectDrawImpl* This, HDC hdc, LPDIRECTDRAWSURFACE7* lplpDDSurface)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_NOTFOUND;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -520,7 +463,7 @@ HRESULT __stdcall IDirectDraw__GetSurfaceFromDC(IDirectDrawImpl* This, HDC hdc,
|
|||
|
||||
HRESULT __stdcall IDirectDraw__RestoreAllSurfaces(IDirectDrawImpl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -528,23 +471,23 @@ HRESULT __stdcall IDirectDraw__RestoreAllSurfaces(IDirectDrawImpl* This)
|
|||
|
||||
HRESULT __stdcall IDirectDraw__TestCooperativeLevel(IDirectDrawImpl* This)
|
||||
{
|
||||
TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
HRESULT ret = dd_TestCooperativeLevel();
|
||||
TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDraw__GetDeviceIdentifier(IDirectDrawImpl* This, LPDDDEVICEIDENTIFIER2 pDDDI, DWORD dwFlags)
|
||||
{
|
||||
TRACE("-> %s(This=%p, pDDDI=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, pDDDI, dwFlags, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p, pDDDI=%p, dwFlags=%08X)\n", __FUNCTION__, This, pDDDI, dwFlags);
|
||||
HRESULT ret = dd_GetDeviceIdentifier((LPDDDEVICEIDENTIFIER)pDDDI, dwFlags, &This->guid);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDraw__StartModeTest(IDirectDrawImpl* This, LPSIZE pModes, DWORD dwNumModes, DWORD dwFlags)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_CURRENTLYNOTAVAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -552,7 +495,7 @@ HRESULT __stdcall IDirectDraw__StartModeTest(IDirectDrawImpl* This, LPSIZE pMode
|
|||
|
||||
HRESULT __stdcall IDirectDraw__EvaluateMode(IDirectDrawImpl* This, DWORD dwFlags, DWORD* pTimeout)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_INVALIDOBJECT;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -2,31 +2,17 @@
|
|||
#include "ddclipper.h"
|
||||
#include "debug.h"
|
||||
|
||||
|
||||
HRESULT __stdcall IDirectDrawClipper__QueryInterface(IDirectDrawClipperImpl* This, REFIID riid, LPVOID FAR* ppvObj)
|
||||
{
|
||||
TRACE(
|
||||
"NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
(unsigned int)riid,
|
||||
ppvObj,
|
||||
_ReturnAddress());
|
||||
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj);
|
||||
HRESULT ret = E_NOINTERFACE;
|
||||
|
||||
if (!ppvObj)
|
||||
{
|
||||
ret = E_INVALIDARG;
|
||||
}
|
||||
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ULONG __stdcall IDirectDrawClipper__AddRef(IDirectDrawClipperImpl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
ULONG ret = ++This->ref;
|
||||
TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret);
|
||||
return ret;
|
||||
|
|
@ -34,7 +20,7 @@ ULONG __stdcall IDirectDrawClipper__AddRef(IDirectDrawClipperImpl* This)
|
|||
|
||||
ULONG __stdcall IDirectDrawClipper__Release(IDirectDrawClipperImpl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
|
||||
ULONG ret = --This->ref;
|
||||
|
||||
|
|
@ -42,11 +28,6 @@ ULONG __stdcall IDirectDrawClipper__Release(IDirectDrawClipperImpl* This)
|
|||
{
|
||||
TRACE(" Released (%p)\n", This);
|
||||
|
||||
if (This->region)
|
||||
DeleteObject(This->region);
|
||||
|
||||
DeleteCriticalSection(&This->cs);
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, This);
|
||||
}
|
||||
|
||||
|
|
@ -60,58 +41,49 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList(
|
|||
LPRGNDATA lpClipList,
|
||||
LPDWORD lpdwSiz)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p) [%p]\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
lpRect,
|
||||
lpClipList,
|
||||
lpdwSiz,
|
||||
_ReturnAddress());
|
||||
|
||||
HRESULT ret = ddc_GetClipList(This, lpRect, lpClipList, lpdwSiz);
|
||||
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_NOCLIPLIST;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDrawClipper__GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd)
|
||||
{
|
||||
TRACE("-> %s(This=%p, lphWnd=%p) [%p]\n", __FUNCTION__, This, lphWnd, _ReturnAddress());
|
||||
HRESULT ret = ddc_GetHWnd(This, lphWnd);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_INVALIDOBJECT;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDrawClipper__Initialize(IDirectDrawClipperImpl* This, LPDIRECTDRAW lpDD, DWORD dwFlags)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged)
|
||||
{
|
||||
TRACE("-> %s(This=%p, lpbChanged=%p) [%p]\n", __FUNCTION__, This, lpbChanged, _ReturnAddress());
|
||||
HRESULT ret = ddc_IsClipListChanged(This, lpbChanged);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_INVALIDOBJECT;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags)
|
||||
{
|
||||
TRACE("-> %s(This=%p, lpClipList=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, lpClipList, dwFlags, _ReturnAddress());
|
||||
HRESULT ret = ddc_SetClipList(This, lpClipList, dwFlags);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDrawClipper__SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd)
|
||||
{
|
||||
TRACE("-> %s(This=%p, dwFlags=%08X, hWnd=%p) [%p]\n", __FUNCTION__, This, dwFlags, hWnd, _ReturnAddress());
|
||||
HRESULT ret = ddc_SetHWnd(This, dwFlags, hWnd);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,31 +1,17 @@
|
|||
#include "IDirectDrawGammaControl.h"
|
||||
#include "debug.h"
|
||||
|
||||
|
||||
HRESULT __stdcall IDirectDrawGammaControl__QueryInterface(IDirectDrawGammaControlImpl* This, REFIID riid, LPVOID FAR* ppvObj)
|
||||
{
|
||||
TRACE(
|
||||
"NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
(unsigned int)riid,
|
||||
ppvObj,
|
||||
_ReturnAddress());
|
||||
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj);
|
||||
HRESULT ret = E_NOINTERFACE;
|
||||
|
||||
if (!ppvObj)
|
||||
{
|
||||
ret = E_INVALIDARG;
|
||||
}
|
||||
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ULONG __stdcall IDirectDrawGammaControl__AddRef(IDirectDrawGammaControlImpl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
ULONG ret = ++This->ref;
|
||||
TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret);
|
||||
return ret;
|
||||
|
|
@ -33,7 +19,7 @@ ULONG __stdcall IDirectDrawGammaControl__AddRef(IDirectDrawGammaControlImpl* Thi
|
|||
|
||||
ULONG __stdcall IDirectDrawGammaControl__Release(IDirectDrawGammaControlImpl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
|
||||
ULONG ret = --This->ref;
|
||||
|
||||
|
|
@ -50,7 +36,7 @@ ULONG __stdcall IDirectDrawGammaControl__Release(IDirectDrawGammaControlImpl* Th
|
|||
|
||||
HRESULT __stdcall IDirectDrawGammaControl__GetGammaRamp(IDirectDrawGammaControlImpl* This, DWORD dwFlags, LPDDGAMMARAMP lpRampData)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_EXCEPTION;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -58,7 +44,7 @@ HRESULT __stdcall IDirectDrawGammaControl__GetGammaRamp(IDirectDrawGammaControlI
|
|||
|
||||
HRESULT __stdcall IDirectDrawGammaControl__SetGammaRamp(IDirectDrawGammaControlImpl* This, DWORD dwFlags, LPDDGAMMARAMP lpRampData)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_EXCEPTION;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -6,28 +6,15 @@
|
|||
|
||||
HRESULT __stdcall IDirectDrawPalette__QueryInterface(IDirectDrawPaletteImpl* This, REFIID riid, LPVOID FAR* ppvObj)
|
||||
{
|
||||
TRACE(
|
||||
"NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
(unsigned int)riid,
|
||||
ppvObj,
|
||||
_ReturnAddress());
|
||||
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj);
|
||||
HRESULT ret = E_NOINTERFACE;
|
||||
|
||||
if (!ppvObj)
|
||||
{
|
||||
ret = E_INVALIDARG;
|
||||
}
|
||||
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ULONG __stdcall IDirectDrawPalette__AddRef(IDirectDrawPaletteImpl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
ULONG ret = ++This->ref;
|
||||
TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret);
|
||||
return ret;
|
||||
|
|
@ -35,7 +22,7 @@ ULONG __stdcall IDirectDrawPalette__AddRef(IDirectDrawPaletteImpl* This)
|
|||
|
||||
ULONG __stdcall IDirectDrawPalette__Release(IDirectDrawPaletteImpl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
|
||||
ULONG ret = --This->ref;
|
||||
|
||||
|
|
@ -43,8 +30,8 @@ ULONG __stdcall IDirectDrawPalette__Release(IDirectDrawPaletteImpl* This)
|
|||
{
|
||||
TRACE(" Released (%p)\n", This);
|
||||
|
||||
if (g_ddraw.ref)
|
||||
g_ddraw.last_freed_palette = This;
|
||||
if (g_ddraw)
|
||||
g_ddraw->last_freed_palette = This;
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, This);
|
||||
}
|
||||
|
|
@ -55,7 +42,7 @@ ULONG __stdcall IDirectDrawPalette__Release(IDirectDrawPaletteImpl* This)
|
|||
|
||||
HRESULT __stdcall IDirectDrawPalette__GetCaps(IDirectDrawPaletteImpl* This, LPDWORD lpdwCaps)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpdwCaps=%p) [%p]\n", __FUNCTION__, This, lpdwCaps, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpdwCaps=%p)\n", __FUNCTION__, This, lpdwCaps);
|
||||
HRESULT ret = DDERR_INVALIDOBJECT;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -69,14 +56,13 @@ HRESULT __stdcall IDirectDrawPalette__GetEntries(
|
|||
LPPALETTEENTRY lpEntries)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(This=%p, dwFlags=%08X, dwBase=%u, dwNumEntries=%u, lpEntries=%p) [%p]\n",
|
||||
"-> %s(This=%p, dwFlags=%08X, dwBase=%u, dwNumEntries=%u, lpEntries=%p)\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
dwFlags,
|
||||
dwBase,
|
||||
dwNumEntries,
|
||||
lpEntries,
|
||||
_ReturnAddress());
|
||||
lpEntries);
|
||||
|
||||
HRESULT ret = ddp_GetEntries(This, dwFlags, dwBase, dwNumEntries, lpEntries);
|
||||
|
||||
|
|
@ -90,9 +76,9 @@ HRESULT __stdcall IDirectDrawPalette__Initialize(
|
|||
DWORD dwFlags,
|
||||
LPPALETTEENTRY lpDDColorTable)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -104,14 +90,13 @@ HRESULT __stdcall IDirectDrawPalette__SetEntries(
|
|||
LPPALETTEENTRY lpEntries)
|
||||
{
|
||||
TRACE_EXT(
|
||||
"-> %s(This=%p, dwFlags=%08X, dwStartingEntry=%u, dwCount=%u, lpEntries=%p) [%p]\n",
|
||||
"-> %s(This=%p, dwFlags=%08X, dwStartingEntry=%u, dwCount=%u, lpEntries=%p)\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
dwFlags,
|
||||
dwStartingEntry,
|
||||
dwCount,
|
||||
lpEntries,
|
||||
_ReturnAddress());
|
||||
lpEntries);
|
||||
|
||||
HRESULT ret = ddp_SetEntries(This, dwFlags, dwStartingEntry, dwCount, lpEntries);
|
||||
|
||||
|
|
|
|||
|
|
@ -8,14 +8,10 @@
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* This, REFIID riid, LPVOID FAR* ppvObj)
|
||||
{
|
||||
TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", __FUNCTION__, This, (unsigned int)riid, ppvObj, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj);
|
||||
HRESULT ret = S_OK;
|
||||
|
||||
if (!ppvObj)
|
||||
{
|
||||
ret = E_INVALIDARG;
|
||||
}
|
||||
else if (riid)
|
||||
if (riid)
|
||||
{
|
||||
if (IsEqualGUID(&IID_IDirectDrawSurface, riid) ||
|
||||
IsEqualGUID(&IID_IDirectDrawSurface2, riid) ||
|
||||
|
|
@ -27,8 +23,6 @@ HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* Thi
|
|||
|
||||
IDirectDrawSurface_AddRef(This);
|
||||
|
||||
This->queried = TRUE; /* Hack for Baldr Force exe */
|
||||
|
||||
*ppvObj = This;
|
||||
|
||||
ret = S_OK;
|
||||
|
|
@ -64,7 +58,7 @@ HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* Thi
|
|||
|
||||
ULONG __stdcall IDirectDrawSurface__AddRef(IDirectDrawSurfaceImpl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
ULONG ret = ++This->ref;
|
||||
TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret);
|
||||
return ret;
|
||||
|
|
@ -72,67 +66,59 @@ ULONG __stdcall IDirectDrawSurface__AddRef(IDirectDrawSurfaceImpl* This)
|
|||
|
||||
ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
|
||||
ULONG ret = --This->ref;
|
||||
|
||||
if (This->queried && ret == 1) /* Hack for Baldr Force exe */
|
||||
{
|
||||
This->queried = FALSE;
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
if (This->ref == 0)
|
||||
{
|
||||
TRACE(" Released (%p)\n", This);
|
||||
|
||||
if (g_ddraw.ref && (This->caps & DDSCAPS_PRIMARYSURFACE))
|
||||
if (g_ddraw && (This->caps & DDSCAPS_PRIMARYSURFACE))
|
||||
{
|
||||
EnterCriticalSection(&g_ddraw.cs);
|
||||
g_ddraw.primary = NULL;
|
||||
LeaveCriticalSection(&g_ddraw.cs);
|
||||
EnterCriticalSection(&g_ddraw->cs);
|
||||
g_ddraw->primary = NULL;
|
||||
LeaveCriticalSection(&g_ddraw->cs);
|
||||
}
|
||||
|
||||
if (This->bitmap)
|
||||
{
|
||||
DeleteObject(This->bitmap);
|
||||
InterlockedDecrement(&g_dds_gdi_handles);
|
||||
}
|
||||
else if (This->surface && !This->custom_buf)
|
||||
else if (This->surface)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, This->surface);
|
||||
}
|
||||
|
||||
if (This->hdc)
|
||||
if (This->bnet_bitmap)
|
||||
{
|
||||
DeleteDC(This->hdc);
|
||||
InterlockedDecrement(&g_dds_gdi_handles);
|
||||
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);
|
||||
|
||||
if (This->mapping)
|
||||
CloseHandle(This->mapping);
|
||||
|
||||
if (This->backbuffer && (!g_ddraw.ref || (void*)This->backbuffer != g_ddraw.last_freed_surface))
|
||||
{
|
||||
if (This->backbuffer)
|
||||
IDirectDrawSurface_Release(This->backbuffer);
|
||||
}
|
||||
|
||||
if (This->clipper)
|
||||
IDirectDrawClipper_Release(This->clipper);
|
||||
|
||||
if (This->palette && (!g_ddraw.ref || (void*)This->palette != g_ddraw.last_freed_palette))
|
||||
if (This->palette && (!g_ddraw || (void*)This->palette != g_ddraw->last_freed_palette))
|
||||
{
|
||||
IDirectDrawPalette_Release(This->palette);
|
||||
}
|
||||
|
||||
DeleteCriticalSection(&This->cs);
|
||||
|
||||
if (g_ddraw.ref)
|
||||
g_ddraw.last_freed_surface = This;
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, This);
|
||||
}
|
||||
|
||||
|
|
@ -142,7 +128,7 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This)
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__AddAttachedSurface(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWSURFACE7 lpDDSurface)
|
||||
{
|
||||
TRACE("-> %s(This=%p, lpDDSurface=%p) [%p]\n", __FUNCTION__, This, lpDDSurface, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p, lpDDSurface=%p)\n", __FUNCTION__, This, lpDDSurface);
|
||||
HRESULT ret = dds_AddAttachedSurface(This, (IDirectDrawSurfaceImpl*)lpDDSurface);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -150,7 +136,7 @@ HRESULT __stdcall IDirectDrawSurface__AddAttachedSurface(IDirectDrawSurfaceImpl*
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__AddOverlayDirtyRect(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -165,15 +151,14 @@ HRESULT __stdcall IDirectDrawSurface__Blt(
|
|||
LPDDBLTFX lpDDBltFx)
|
||||
{
|
||||
TRACE_EXT(
|
||||
"-> %s(This=%p, lpDestRect=%p, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X, lpDDBltFx=%p) [%p]\n",
|
||||
"-> %s(This=%p, lpDestRect=%p, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X, lpDDBltFx=%p)\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
lpDestRect,
|
||||
lpDDSrcSurface,
|
||||
lpSrcRect,
|
||||
dwFlags,
|
||||
lpDDBltFx,
|
||||
_ReturnAddress());
|
||||
lpDDBltFx);
|
||||
|
||||
HRESULT ret = dds_Blt(This, lpDestRect, (IDirectDrawSurfaceImpl*)lpDDSrcSurface, lpSrcRect, dwFlags, lpDDBltFx);
|
||||
|
||||
|
|
@ -187,7 +172,7 @@ HRESULT __stdcall IDirectDrawSurface__BltBatch(
|
|||
DWORD dwCount,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -202,15 +187,14 @@ HRESULT __stdcall IDirectDrawSurface__BltFast(
|
|||
DWORD dwFlags)
|
||||
{
|
||||
TRACE_EXT(
|
||||
"-> %s(This=%p, dwX=%d, dwY=%d, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X) [%p]\n",
|
||||
"-> %s(This=%p, dwX=%d, dwY=%d, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X)\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
dwX,
|
||||
dwY,
|
||||
lpDDSrcSurface,
|
||||
lpSrcRect,
|
||||
dwFlags,
|
||||
_ReturnAddress());
|
||||
dwFlags);
|
||||
|
||||
HRESULT ret = dds_BltFast(This, dwX, dwY, (IDirectDrawSurfaceImpl*)lpDDSrcSurface, lpSrcRect, dwFlags);
|
||||
|
||||
|
|
@ -223,7 +207,7 @@ HRESULT __stdcall IDirectDrawSurface__DeleteAttachedSurface(
|
|||
DWORD dwFlags,
|
||||
LPDIRECTDRAWSURFACE7 lpDDSurface)
|
||||
{
|
||||
TRACE("-> %s(This=%p, dwFlags=%08X, lpDDSurface=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpDDSurface, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p, dwFlags=%08X, lpDDSurface=%p)\n", __FUNCTION__, This, dwFlags, lpDDSurface);
|
||||
HRESULT ret = dds_DeleteAttachedSurface(This, dwFlags, (IDirectDrawSurfaceImpl*)lpDDSurface);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -235,12 +219,11 @@ HRESULT __stdcall IDirectDrawSurface__EnumAttachedSurfaces(
|
|||
LPDDENUMSURFACESCALLBACK7 lpEnumSurfacesCallback)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(This=%p, lpContext=%p, lpEnumSurfacesCallback=%p) [%p]\n",
|
||||
"-> %s(This=%p, lpContext=%p, lpEnumSurfacesCallback=%p)\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
lpContext,
|
||||
lpEnumSurfacesCallback,
|
||||
_ReturnAddress());
|
||||
lpEnumSurfacesCallback);
|
||||
|
||||
HRESULT ret = dds_EnumAttachedSurfaces(This, lpContext, (LPDDENUMSURFACESCALLBACK)lpEnumSurfacesCallback);
|
||||
|
||||
|
|
@ -254,7 +237,7 @@ HRESULT __stdcall IDirectDrawSurface__EnumOverlayZOrders(
|
|||
LPVOID lpContext,
|
||||
LPDDENUMSURFACESCALLBACK7 lpfnCallback)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -266,12 +249,11 @@ HRESULT __stdcall IDirectDrawSurface__Flip(
|
|||
DWORD dwFlags)
|
||||
{
|
||||
TRACE_EXT(
|
||||
"-> %s(This=%p, lpDDSurfaceTargetOverride=%p, dwFlags=%08X) [%p]\n",
|
||||
"-> %s(This=%p, lpDDSurfaceTargetOverride=%p, dwFlags=%08X)\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
lpDDSurfaceTargetOverride,
|
||||
dwFlags,
|
||||
_ReturnAddress());
|
||||
dwFlags);
|
||||
|
||||
HRESULT ret = dds_Flip(This, (IDirectDrawSurfaceImpl*)lpDDSurfaceTargetOverride, dwFlags);
|
||||
|
||||
|
|
@ -284,31 +266,23 @@ HRESULT __stdcall IDirectDrawSurface__GetAttachedSurface(
|
|||
LPDDSCAPS2 lpDdsCaps,
|
||||
LPDIRECTDRAWSURFACE7 FAR* lpDDsurface)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(This=%p, dwCaps=%08X, lpDDsurface=%p) [%p]\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
lpDdsCaps->dwCaps,
|
||||
lpDDsurface,
|
||||
_ReturnAddress());
|
||||
|
||||
TRACE("-> %s(This=%p, dwCaps=%08X, lpDDsurface=%p)\n", __FUNCTION__, This, lpDdsCaps->dwCaps, lpDDsurface);
|
||||
HRESULT ret = dds_GetAttachedSurface(This, (LPDDSCAPS)lpDdsCaps, (IDirectDrawSurfaceImpl**)lpDDsurface);
|
||||
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetBltStatus(IDirectDrawSurfaceImpl* This, DWORD dwFlags)
|
||||
{
|
||||
//TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
//TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetCaps(IDirectDrawSurfaceImpl* This, LPDDSCAPS2 lpDDSCaps)
|
||||
{
|
||||
TRACE("-> %s(This=%p, lpDDSCaps=%p) [%p]\n", __FUNCTION__, This, lpDDSCaps, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p, lpDDSCaps=%p)\n", __FUNCTION__, This, lpDDSCaps);
|
||||
HRESULT ret = dds_GetCaps(This, (LPDDSCAPS)lpDDSCaps);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -316,7 +290,7 @@ HRESULT __stdcall IDirectDrawSurface__GetCaps(IDirectDrawSurfaceImpl* This, LPDD
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER FAR* lpClipper)
|
||||
{
|
||||
TRACE_EXT("-> %s(This=%p, lpClipper=%p) [%p]\n", __FUNCTION__, This, lpClipper, _ReturnAddress());
|
||||
TRACE_EXT("-> %s(This=%p, lpClipper=%p)\n", __FUNCTION__, This, lpClipper);
|
||||
HRESULT ret = dds_GetClipper(This, (IDirectDrawClipperImpl**)lpClipper);
|
||||
TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -324,7 +298,7 @@ HRESULT __stdcall IDirectDrawSurface__GetClipper(IDirectDrawSurfaceImpl* This, L
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey)
|
||||
{
|
||||
TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpColorKey, _ReturnAddress());
|
||||
TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p)\n", __FUNCTION__, This, dwFlags, lpColorKey);
|
||||
HRESULT ret = dds_GetColorKey(This, dwFlags, lpColorKey);
|
||||
TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -332,7 +306,7 @@ HRESULT __stdcall IDirectDrawSurface__GetColorKey(IDirectDrawSurfaceImpl* This,
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC)
|
||||
{
|
||||
TRACE_EXT("-> %s(This=%p, lpHDC=%p) [%p]\n", __FUNCTION__, This, lpHDC, _ReturnAddress());
|
||||
TRACE_EXT("-> %s(This=%p, lpHDC=%p)\n", __FUNCTION__, This, lpHDC);
|
||||
HRESULT ret = dds_GetDC(This, lpHDC);
|
||||
TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -340,7 +314,7 @@ HRESULT __stdcall IDirectDrawSurface__GetDC(IDirectDrawSurfaceImpl* This, HDC FA
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetFlipStatus(IDirectDrawSurfaceImpl* This, DWORD dwFlags)
|
||||
{
|
||||
TRACE_EXT("-> %s(This=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, dwFlags, _ReturnAddress());
|
||||
TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -348,7 +322,7 @@ HRESULT __stdcall IDirectDrawSurface__GetFlipStatus(IDirectDrawSurfaceImpl* This
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetOverlayPosition(IDirectDrawSurfaceImpl* This, LPLONG lplX, LPLONG lplY)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_NOTAOVERLAYSURFACE;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -356,7 +330,7 @@ HRESULT __stdcall IDirectDrawSurface__GetOverlayPosition(IDirectDrawSurfaceImpl*
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetPalette(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWPALETTE FAR* lplpDDPalette)
|
||||
{
|
||||
TRACE("-> %s(This=%p, lplpDDPalette=%p) [%p]\n", __FUNCTION__, This, lplpDDPalette, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p, lplpDDPalette=%p)\n", __FUNCTION__, This, lplpDDPalette);
|
||||
HRESULT ret = dds_GetPalette(This, (IDirectDrawPaletteImpl**)lplpDDPalette);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -364,7 +338,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPalette(IDirectDrawSurfaceImpl* This, L
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetPixelFormat(IDirectDrawSurfaceImpl* This, LPDDPIXELFORMAT ddpfPixelFormat)
|
||||
{
|
||||
TRACE_EXT("-> %s(This=%p, ...) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE_EXT("-> %s(This=%p, ...)\n", __FUNCTION__, This);
|
||||
HRESULT ret = dds_GetPixelFormat(This, ddpfPixelFormat);
|
||||
TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -372,7 +346,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPixelFormat(IDirectDrawSurfaceImpl* Thi
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSurfaceDesc)
|
||||
{
|
||||
TRACE_EXT("-> %s(This=%p, lpDDSurfaceDesc=%p) [%p]\n", __FUNCTION__, This, lpDDSurfaceDesc, _ReturnAddress());
|
||||
TRACE_EXT("-> %s(This=%p, lpDDSurfaceDesc=%p)\n", __FUNCTION__, This, lpDDSurfaceDesc);
|
||||
HRESULT ret = dds_GetSurfaceDesc(This, (LPDDSURFACEDESC)lpDDSurfaceDesc);
|
||||
TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -383,17 +357,17 @@ HRESULT __stdcall IDirectDrawSurface__Initialize(
|
|||
LPDIRECTDRAW lpDD,
|
||||
LPDDSURFACEDESC2 lpDDSurfaceDesc)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT __stdcall IDirectDrawSurface__IsLost(IDirectDrawSurfaceImpl* This)
|
||||
{
|
||||
//TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
//TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -405,14 +379,13 @@ HRESULT __stdcall IDirectDrawSurface__Lock(
|
|||
HANDLE hEvent)
|
||||
{
|
||||
TRACE_EXT(
|
||||
"-> %s(This=%p, lpDestRect=%p, lpDDSurfaceDesc=%p, dwFlags=%08X, hEvent=%p) [%p]\n",
|
||||
"-> %s(This=%p, lpDestRect=%p, lpDDSurfaceDesc=%p, dwFlags=%08X, hEvent=%p)\n",
|
||||
__FUNCTION__,
|
||||
This,
|
||||
lpDestRect,
|
||||
lpDDSurfaceDesc,
|
||||
dwFlags,
|
||||
hEvent,
|
||||
_ReturnAddress());
|
||||
hEvent);
|
||||
|
||||
HRESULT ret = dds_Lock(This, lpDestRect, (LPDDSURFACEDESC)lpDDSurfaceDesc, dwFlags, hEvent);
|
||||
|
||||
|
|
@ -422,7 +395,7 @@ HRESULT __stdcall IDirectDrawSurface__Lock(
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC)
|
||||
{
|
||||
TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = dds_ReleaseDC(This, hDC);
|
||||
TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -430,7 +403,7 @@ HRESULT __stdcall IDirectDrawSurface__ReleaseDC(IDirectDrawSurfaceImpl* This, HD
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__Restore(IDirectDrawSurfaceImpl* This)
|
||||
{
|
||||
TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -438,7 +411,7 @@ HRESULT __stdcall IDirectDrawSurface__Restore(IDirectDrawSurfaceImpl* This)
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__SetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER lpClipper)
|
||||
{
|
||||
TRACE("-> %s(This=%p, lpClipper=%p) [%p]\n", __FUNCTION__, This, lpClipper, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p, lpClipper=%p)\n", __FUNCTION__, This, lpClipper);
|
||||
HRESULT ret = dds_SetClipper(This, (IDirectDrawClipperImpl*)lpClipper);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -446,7 +419,7 @@ HRESULT __stdcall IDirectDrawSurface__SetClipper(IDirectDrawSurfaceImpl* This, L
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey)
|
||||
{
|
||||
TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpColorKey, _ReturnAddress());
|
||||
TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p)\n", __FUNCTION__, This, dwFlags, lpColorKey);
|
||||
HRESULT ret = dds_SetColorKey(This, dwFlags, lpColorKey);
|
||||
TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -454,7 +427,7 @@ HRESULT __stdcall IDirectDrawSurface__SetColorKey(IDirectDrawSurfaceImpl* This,
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__SetOverlayPosition(IDirectDrawSurfaceImpl* This, LONG lX, LONG lY)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -462,7 +435,7 @@ HRESULT __stdcall IDirectDrawSurface__SetOverlayPosition(IDirectDrawSurfaceImpl*
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__SetPalette(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWPALETTE lpDDPalette)
|
||||
{
|
||||
TRACE("-> %s(This=%p, lpDDPalette=%p) [%p]\n", __FUNCTION__, This, lpDDPalette, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p, lpDDPalette=%p)\n", __FUNCTION__, This, lpDDPalette);
|
||||
HRESULT ret = dds_SetPalette(This, (IDirectDrawPaletteImpl*)lpDDPalette);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -470,7 +443,7 @@ HRESULT __stdcall IDirectDrawSurface__SetPalette(IDirectDrawSurfaceImpl* This, L
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
|
||||
{
|
||||
TRACE_EXT("-> %s(This=%p, lpRect=%p) [%p]\n", __FUNCTION__, This, lpRect, _ReturnAddress());
|
||||
TRACE_EXT("-> %s(This=%p, lpRect=%p)\n", __FUNCTION__, This, lpRect);
|
||||
HRESULT ret = dds_Unlock(This, lpRect);
|
||||
TRACE_EXT("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -484,7 +457,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlay(
|
|||
DWORD dwFlags,
|
||||
LPDDOVERLAYFX lpDDOverlayFx)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -492,7 +465,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlay(
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__UpdateOverlayDisplay(IDirectDrawSurfaceImpl* This, DWORD dwFlags)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -503,7 +476,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlayZOrder(
|
|||
DWORD dwFlags,
|
||||
LPDIRECTDRAWSURFACE7 lpDDSReference)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -511,7 +484,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlayZOrder(
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD)
|
||||
{
|
||||
TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = dds_GetDDInterface(This, lplpDD);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -519,7 +492,7 @@ HRESULT __stdcall IDirectDrawSurface__GetDDInterface(IDirectDrawSurfaceImpl* Thi
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__PageLock(IDirectDrawSurfaceImpl* This, DWORD dwFlags)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -527,7 +500,7 @@ HRESULT __stdcall IDirectDrawSurface__PageLock(IDirectDrawSurfaceImpl* This, DWO
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__PageUnlock(IDirectDrawSurfaceImpl* This, DWORD dwFlags)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -535,9 +508,9 @@ HRESULT __stdcall IDirectDrawSurface__PageUnlock(IDirectDrawSurfaceImpl* This, D
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags)
|
||||
{
|
||||
TRACE("-> %s(This=%p, lpDDSD=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, lpDDSD, dwFlags, _ReturnAddress());
|
||||
HRESULT ret = dds_SetSurfaceDesc(This, lpDDSD, dwFlags);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_UNSUPPORTED;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -548,7 +521,7 @@ HRESULT __stdcall IDirectDrawSurface__SetPrivateData(
|
|||
DWORD dwSize,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_OUTOFMEMORY;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -560,7 +533,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPrivateData(
|
|||
LPVOID lpBuffer,
|
||||
LPDWORD lpdwBufferSize)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_NOTFOUND;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -568,7 +541,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPrivateData(
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__FreePrivateData(IDirectDrawSurfaceImpl* This, REFGUID rtag)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DD_OK;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -576,7 +549,7 @@ HRESULT __stdcall IDirectDrawSurface__FreePrivateData(IDirectDrawSurfaceImpl* Th
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetUniquenessValue(IDirectDrawSurfaceImpl* This, LPDWORD lpdwValue)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_INVALIDOBJECT;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -584,7 +557,7 @@ HRESULT __stdcall IDirectDrawSurface__GetUniquenessValue(IDirectDrawSurfaceImpl*
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__ChangeUniquenessValue(IDirectDrawSurfaceImpl* This)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_INVALIDOBJECT;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -592,7 +565,7 @@ HRESULT __stdcall IDirectDrawSurface__ChangeUniquenessValue(IDirectDrawSurfaceIm
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__SetPriority(IDirectDrawSurfaceImpl* This, DWORD dwPrio)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_INVALIDOBJECT;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -600,7 +573,7 @@ HRESULT __stdcall IDirectDrawSurface__SetPriority(IDirectDrawSurfaceImpl* This,
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetPriority(IDirectDrawSurfaceImpl* This, LPDWORD lpdwPrio)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_INVALIDOBJECT;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -608,7 +581,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPriority(IDirectDrawSurfaceImpl* This,
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__SetLOD(IDirectDrawSurfaceImpl* This, DWORD dwLod)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_INVALIDOBJECT;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -616,7 +589,7 @@ HRESULT __stdcall IDirectDrawSurface__SetLOD(IDirectDrawSurfaceImpl* This, DWORD
|
|||
|
||||
HRESULT __stdcall IDirectDrawSurface__GetLOD(IDirectDrawSurfaceImpl* This, LPDWORD lpdwLod)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
|
||||
HRESULT ret = DDERR_INVALIDOBJECT;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
|
|||
794
src/blt.c
794
src/blt.c
|
|
@ -1,794 +0,0 @@
|
|||
#include <windows.h>
|
||||
#include <intrin.h>
|
||||
#include "debug.h"
|
||||
#include "blt.h"
|
||||
|
||||
|
||||
BOOL g_blt_use_avx;
|
||||
|
||||
void blt_copy(
|
||||
unsigned char* dst,
|
||||
unsigned char* src,
|
||||
size_t size)
|
||||
{
|
||||
#if defined(_MSC_VER) || defined(__AVX__)
|
||||
if (!((DWORD)dst % 64) && !((DWORD)src % 64))
|
||||
{
|
||||
if (size >= 1024 * 4096 && g_blt_use_avx)
|
||||
{
|
||||
_mm_prefetch((const char*)(src), _MM_HINT_NTA);
|
||||
|
||||
while (size >= 256)
|
||||
{
|
||||
__m256i c0 = _mm256_load_si256(((const __m256i*)src) + 0);
|
||||
__m256i c1 = _mm256_load_si256(((const __m256i*)src) + 1);
|
||||
__m256i c2 = _mm256_load_si256(((const __m256i*)src) + 2);
|
||||
__m256i c3 = _mm256_load_si256(((const __m256i*)src) + 3);
|
||||
__m256i c4 = _mm256_load_si256(((const __m256i*)src) + 4);
|
||||
__m256i c5 = _mm256_load_si256(((const __m256i*)src) + 5);
|
||||
__m256i c6 = _mm256_load_si256(((const __m256i*)src) + 6);
|
||||
__m256i c7 = _mm256_load_si256(((const __m256i*)src) + 7);
|
||||
|
||||
_mm_prefetch((const char*)(src + 512), _MM_HINT_NTA);
|
||||
|
||||
_mm256_stream_si256((((__m256i*)dst) + 0), c0);
|
||||
_mm256_stream_si256((((__m256i*)dst) + 1), c1);
|
||||
_mm256_stream_si256((((__m256i*)dst) + 2), c2);
|
||||
_mm256_stream_si256((((__m256i*)dst) + 3), c3);
|
||||
_mm256_stream_si256((((__m256i*)dst) + 4), c4);
|
||||
_mm256_stream_si256((((__m256i*)dst) + 5), c5);
|
||||
_mm256_stream_si256((((__m256i*)dst) + 6), c6);
|
||||
_mm256_stream_si256((((__m256i*)dst) + 7), c7);
|
||||
|
||||
src += 256;
|
||||
dst += 256;
|
||||
size -= 256;
|
||||
}
|
||||
|
||||
_mm_sfence();
|
||||
_mm256_zeroupper();
|
||||
}
|
||||
else if (size < 1024 * 100 && g_blt_use_avx)
|
||||
{
|
||||
while (size >= 128)
|
||||
{
|
||||
__m256i c0 = _mm256_load_si256(((const __m256i*)src) + 0);
|
||||
__m256i c1 = _mm256_load_si256(((const __m256i*)src) + 1);
|
||||
__m256i c2 = _mm256_load_si256(((const __m256i*)src) + 2);
|
||||
__m256i c3 = _mm256_load_si256(((const __m256i*)src) + 3);
|
||||
|
||||
_mm256_store_si256((((__m256i*)dst) + 0), c0);
|
||||
_mm256_store_si256((((__m256i*)dst) + 1), c1);
|
||||
_mm256_store_si256((((__m256i*)dst) + 2), c2);
|
||||
_mm256_store_si256((((__m256i*)dst) + 3), c3);
|
||||
|
||||
src += 128;
|
||||
dst += 128;
|
||||
size -= 128;
|
||||
}
|
||||
|
||||
_mm256_zeroupper();
|
||||
}
|
||||
else if (size >= 1024 * 100)
|
||||
{
|
||||
__movsb(dst, src, size);
|
||||
|
||||
size = 0;
|
||||
}
|
||||
|
||||
/* memcpy below handles the remainder */
|
||||
}
|
||||
#endif
|
||||
|
||||
if (size > 0)
|
||||
{
|
||||
memcpy(dst, src, size);
|
||||
}
|
||||
}
|
||||
|
||||
void blt_clean(
|
||||
unsigned char* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned char* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_p,
|
||||
int bpp)
|
||||
{
|
||||
int bytes_pp = bpp / 8;
|
||||
|
||||
size_t size = dst_w * bytes_pp;
|
||||
|
||||
src += (src_x * bytes_pp) + (src_p * src_y);
|
||||
dst += (dst_x * bytes_pp) + (dst_p * dst_y);
|
||||
|
||||
if (size == dst_p && dst_p == src_p)
|
||||
{
|
||||
blt_copy(dst, src, dst_p * dst_h);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < dst_h; i++)
|
||||
{
|
||||
blt_copy(dst, src, size);
|
||||
|
||||
src += src_p;
|
||||
dst += dst_p;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void blt_overlap(
|
||||
unsigned char* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned char* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_p,
|
||||
int bpp)
|
||||
{
|
||||
int bytes_pp = bpp / 8;
|
||||
|
||||
size_t size = dst_w * bytes_pp;
|
||||
|
||||
src += (src_x * bytes_pp) + (src_p * src_y);
|
||||
dst += (dst_x * bytes_pp) + (dst_p * dst_y);
|
||||
|
||||
if (dst_y > src_y)
|
||||
{
|
||||
src += src_p * dst_h;
|
||||
dst += dst_p * dst_h;
|
||||
|
||||
for (int i = dst_h; i-- > 0;)
|
||||
{
|
||||
src -= src_p;
|
||||
dst -= dst_p;
|
||||
|
||||
memmove(dst, src, size);
|
||||
}
|
||||
}
|
||||
else if (size == dst_p && dst_p == src_p)
|
||||
{
|
||||
memmove(dst, src, dst_p * dst_h);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < dst_h; i++)
|
||||
{
|
||||
memmove(dst, src, size);
|
||||
|
||||
src += src_p;
|
||||
dst += dst_p;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void blt_colorkey(
|
||||
unsigned char* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned char* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_p,
|
||||
unsigned int key_low,
|
||||
unsigned int key_high,
|
||||
int bpp)
|
||||
{
|
||||
int bytes_pp = bpp / 8;
|
||||
|
||||
size_t s_a = (src_p / bytes_pp) - dst_w;
|
||||
size_t d_a = (dst_p / bytes_pp) - dst_w;
|
||||
|
||||
src += (src_x * bytes_pp) + (src_p * src_y);
|
||||
dst += (dst_x * bytes_pp) + (dst_p * dst_y);
|
||||
|
||||
if (bpp == 8)
|
||||
{
|
||||
unsigned char key_l = (unsigned char)key_low;
|
||||
unsigned char key_h = (unsigned char)key_high;
|
||||
|
||||
if (key_l == key_h)
|
||||
{
|
||||
for (unsigned char* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;)
|
||||
{
|
||||
for (unsigned char* w_end = dst + dst_w; dst < w_end;)
|
||||
{
|
||||
unsigned char c = *src++;
|
||||
|
||||
if (c != key_l)
|
||||
{
|
||||
*dst = c;
|
||||
}
|
||||
|
||||
dst++;
|
||||
}
|
||||
|
||||
src += s_a;
|
||||
dst += d_a;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (unsigned char* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;)
|
||||
{
|
||||
for (unsigned char* w_end = dst + dst_w; dst < w_end;)
|
||||
{
|
||||
unsigned char c = *src++;
|
||||
|
||||
if (c < key_l || c > key_h)
|
||||
{
|
||||
*dst = c;
|
||||
}
|
||||
|
||||
dst++;
|
||||
}
|
||||
|
||||
src += s_a;
|
||||
dst += d_a;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bpp == 16)
|
||||
{
|
||||
unsigned short key_l = (unsigned short)key_low;
|
||||
unsigned short key_h = (unsigned short)key_high;
|
||||
|
||||
unsigned short* d = (unsigned short*)dst;
|
||||
unsigned short* s = (unsigned short*)src;
|
||||
|
||||
if (key_l == key_h)
|
||||
{
|
||||
for (unsigned short* h_end = d + dst_h * (dst_w + d_a); d < h_end;)
|
||||
{
|
||||
for (unsigned short* w_end = d + dst_w; d < w_end;)
|
||||
{
|
||||
unsigned short c = *s++;
|
||||
|
||||
if (c != key_l)
|
||||
{
|
||||
*d = c;
|
||||
}
|
||||
|
||||
d++;
|
||||
}
|
||||
|
||||
s += s_a;
|
||||
d += d_a;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (unsigned short* h_end = d + dst_h * (dst_w + d_a); d < h_end;)
|
||||
{
|
||||
for (unsigned short* w_end = d + dst_w; d < w_end;)
|
||||
{
|
||||
unsigned short c = *s++;
|
||||
|
||||
if (c < key_l || c > key_h)
|
||||
{
|
||||
*d = c;
|
||||
}
|
||||
|
||||
d++;
|
||||
}
|
||||
|
||||
s += s_a;
|
||||
d += d_a;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bpp == 32)
|
||||
{
|
||||
unsigned int key_l = key_low & 0xFFFFFF;
|
||||
unsigned int key_h = key_high & 0xFFFFFF;
|
||||
|
||||
unsigned int* d = (unsigned int*)dst;
|
||||
unsigned int* s = (unsigned int*)src;
|
||||
|
||||
if (key_l == key_h)
|
||||
{
|
||||
for (unsigned int* h_end = d + dst_h * (dst_w + d_a); d < h_end;)
|
||||
{
|
||||
for (unsigned int* w_end = d + dst_w; d < w_end;)
|
||||
{
|
||||
unsigned int c = *s++;
|
||||
|
||||
if ((c & 0xFFFFFF) != key_l)
|
||||
{
|
||||
*d = c;
|
||||
}
|
||||
|
||||
d++;
|
||||
}
|
||||
|
||||
s += s_a;
|
||||
d += d_a;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (unsigned int* h_end = d + dst_h * (dst_w + d_a); d < h_end;)
|
||||
{
|
||||
for (unsigned int* w_end = d + dst_w; d < w_end;)
|
||||
{
|
||||
unsigned int c = *s++;
|
||||
|
||||
if ((c & 0xFFFFFF) < key_l || (c & 0xFFFFFF) > key_h)
|
||||
{
|
||||
*d = c;
|
||||
}
|
||||
|
||||
d++;
|
||||
}
|
||||
|
||||
s += s_a;
|
||||
d += d_a;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void blt_colorkey_mirror_stretch(
|
||||
unsigned char* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned char* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_w,
|
||||
int src_h,
|
||||
int src_p,
|
||||
unsigned int key_low,
|
||||
unsigned int key_high,
|
||||
BOOL mirror_up_down,
|
||||
BOOL mirror_left_right,
|
||||
int bpp)
|
||||
{
|
||||
int bytes_pp = bpp / 8;
|
||||
|
||||
int dst_surf_w = dst_p / bytes_pp;
|
||||
int src_surf_w = src_p / bytes_pp;
|
||||
|
||||
float scale_w = (float)src_w / dst_w;
|
||||
float scale_h = (float)src_h / dst_h;
|
||||
|
||||
if (bpp == 8)
|
||||
{
|
||||
unsigned char key_l = (unsigned char)key_low;
|
||||
unsigned char key_h = (unsigned char)key_high;
|
||||
|
||||
for (int y = 0; y < dst_h; y++)
|
||||
{
|
||||
int scaled_y = (int)(y * scale_h);
|
||||
|
||||
if (mirror_up_down)
|
||||
scaled_y = src_h - 1 - scaled_y;
|
||||
|
||||
int src_row = src_x + src_surf_w * (scaled_y + src_y);
|
||||
int dst_row = dst_x + dst_surf_w * (y + dst_y);
|
||||
|
||||
for (int x = 0; x < dst_w; x++)
|
||||
{
|
||||
int scaled_x = (int)(x * scale_w);
|
||||
|
||||
if (mirror_left_right)
|
||||
scaled_x = src_w - 1 - scaled_x;
|
||||
|
||||
unsigned char c = ((unsigned char*)src)[scaled_x + src_row];
|
||||
|
||||
if (c < key_l || c > key_h)
|
||||
{
|
||||
((unsigned char*)dst)[x + dst_row] = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bpp == 16)
|
||||
{
|
||||
unsigned short key_l = (unsigned short)key_low;
|
||||
unsigned short key_h = (unsigned short)key_high;
|
||||
|
||||
for (int y = 0; y < dst_h; y++)
|
||||
{
|
||||
int scaled_y = (int)(y * scale_h);
|
||||
|
||||
if (mirror_up_down)
|
||||
scaled_y = src_h - 1 - scaled_y;
|
||||
|
||||
int src_row = src_x + src_surf_w * (scaled_y + src_y);
|
||||
int dst_row = dst_x + dst_surf_w * (y + dst_y);
|
||||
|
||||
for (int x = 0; x < dst_w; x++)
|
||||
{
|
||||
int scaled_x = (int)(x * scale_w);
|
||||
|
||||
if (mirror_left_right)
|
||||
scaled_x = src_w - 1 - scaled_x;
|
||||
|
||||
unsigned short c = ((unsigned short*)src)[scaled_x + src_row];
|
||||
|
||||
if (c < key_l || c > key_h)
|
||||
{
|
||||
((unsigned short*)dst)[x + dst_row] = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bpp == 32)
|
||||
{
|
||||
unsigned int key_l = key_low & 0xFFFFFF;
|
||||
unsigned int key_h = key_high & 0xFFFFFF;
|
||||
|
||||
for (int y = 0; y < dst_h; y++)
|
||||
{
|
||||
int scaled_y = (int)(y * scale_h);
|
||||
|
||||
if (mirror_up_down)
|
||||
scaled_y = src_h - 1 - scaled_y;
|
||||
|
||||
int src_row = src_x + src_surf_w * (scaled_y + src_y);
|
||||
int dst_row = dst_x + dst_surf_w * (y + dst_y);
|
||||
|
||||
for (int x = 0; x < dst_w; x++)
|
||||
{
|
||||
int scaled_x = (int)(x * scale_w);
|
||||
|
||||
if (mirror_left_right)
|
||||
scaled_x = src_w - 1 - scaled_x;
|
||||
|
||||
unsigned int c = ((unsigned int*)src)[scaled_x + src_row];
|
||||
|
||||
if ((c & 0xFFFFFF) < key_l || (c & 0xFFFFFF) > key_h)
|
||||
{
|
||||
((unsigned int*)dst)[x + dst_row] = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void blt_clear(
|
||||
unsigned char* dst,
|
||||
char color,
|
||||
size_t size)
|
||||
{
|
||||
#if defined(_MSC_VER) || defined(__AVX__)
|
||||
if (size < 1024 * 100 && g_blt_use_avx && !((DWORD)dst % 32))
|
||||
{
|
||||
__m256i c0 = _mm256_set1_epi8(color);
|
||||
|
||||
while (size >= 128)
|
||||
{
|
||||
_mm256_store_si256((((__m256i*)dst) + 0), c0);
|
||||
_mm256_store_si256((((__m256i*)dst) + 1), c0);
|
||||
_mm256_store_si256((((__m256i*)dst) + 2), c0);
|
||||
_mm256_store_si256((((__m256i*)dst) + 3), c0);
|
||||
|
||||
dst += 128;
|
||||
size -= 128;
|
||||
}
|
||||
|
||||
_mm256_zeroupper();
|
||||
|
||||
/* memset below handles the remainder */
|
||||
}
|
||||
#endif
|
||||
|
||||
if (size >= 1024 * 100)
|
||||
{
|
||||
__stosb(dst, color, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
memset(dst, color, size);
|
||||
}
|
||||
}
|
||||
|
||||
void blt_colorfill(
|
||||
unsigned char* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned int color,
|
||||
int bpp)
|
||||
{
|
||||
int bytes_pp = bpp / 8;
|
||||
|
||||
size_t size = dst_w * bytes_pp;
|
||||
|
||||
dst += (dst_x * bytes_pp) + (dst_p * dst_y);
|
||||
|
||||
if (bpp == 8 ||
|
||||
(bpp == 16 &&
|
||||
(color & 0xFF) == ((color >> 8) & 0xFF)) ||
|
||||
((bpp == 32 || bpp == 24) &&
|
||||
(color & 0xFF) == ((color >> 8) & 0xFF) &&
|
||||
(color & 0xFF) == ((color >> 16) & 0xFF) &&
|
||||
(color & 0xFF) == ((color >> 24) & 0xFF)))
|
||||
{
|
||||
if (size == dst_p)
|
||||
{
|
||||
blt_clear(dst, color, dst_p * dst_h);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < dst_h; i++)
|
||||
{
|
||||
blt_clear(dst, color, size);
|
||||
dst += dst_p;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bpp == 16)
|
||||
{
|
||||
unsigned short* first_row = (unsigned short*)dst;
|
||||
|
||||
for (int x = 0; x < dst_w; x++)
|
||||
{
|
||||
first_row[x] = (unsigned short)color;
|
||||
}
|
||||
|
||||
for (int i = 1; i < dst_h; i++)
|
||||
{
|
||||
dst += dst_p;
|
||||
blt_copy(dst, (void*)first_row, size);
|
||||
}
|
||||
}
|
||||
else if (bpp == 32)
|
||||
{
|
||||
unsigned int* first_row = (unsigned int*)dst;
|
||||
|
||||
for (int x = 0; x < dst_w; x++)
|
||||
{
|
||||
first_row[x] = color;
|
||||
}
|
||||
|
||||
for (int i = 1; i < dst_h; i++)
|
||||
{
|
||||
dst += dst_p;
|
||||
blt_copy(dst, (void*)first_row, size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void blt_rgb565_to_rgba8888(
|
||||
unsigned int* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned short* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_p)
|
||||
{
|
||||
size_t s_a = (src_p / sizeof(src[0])) - dst_w;
|
||||
size_t d_a = (dst_p / sizeof(dst[0])) - dst_w;
|
||||
|
||||
src += src_x + ((src_p / sizeof(src[0])) * src_y);
|
||||
dst += dst_x + ((dst_p / sizeof(dst[0])) * dst_y);
|
||||
|
||||
for (unsigned int* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;)
|
||||
{
|
||||
for (unsigned int* w_end = dst + dst_w; dst < w_end;)
|
||||
{
|
||||
unsigned short pixel = *src++;
|
||||
|
||||
BYTE r = ((pixel & 0xF800) >> 11) << 3;
|
||||
BYTE g = ((pixel & 0x07E0) >> 5) << 2;
|
||||
BYTE b = ((pixel & 0x001F)) << 3;
|
||||
|
||||
*dst++ = (0xFF << 24) | (b << 16) | (g << 8) | r;
|
||||
}
|
||||
|
||||
src += s_a;
|
||||
dst += d_a;
|
||||
}
|
||||
}
|
||||
|
||||
void blt_rgb555_to_rgba8888(
|
||||
unsigned int* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned short* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_p)
|
||||
{
|
||||
size_t s_a = (src_p / sizeof(src[0])) - dst_w;
|
||||
size_t d_a = (dst_p / sizeof(dst[0])) - dst_w;
|
||||
|
||||
src += src_x + ((src_p / sizeof(src[0])) * src_y);
|
||||
dst += dst_x + ((dst_p / sizeof(dst[0])) * dst_y);
|
||||
|
||||
for (unsigned int* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;)
|
||||
{
|
||||
for (unsigned int* w_end = dst + dst_w; dst < w_end;)
|
||||
{
|
||||
unsigned short pixel = *src++;
|
||||
|
||||
BYTE r = ((pixel & 0x7C00) >> 10) << 3;
|
||||
BYTE g = ((pixel & 0x03E0) >> 5) << 3;
|
||||
BYTE b = ((pixel & 0x001F)) << 3;
|
||||
|
||||
*dst++ = (0xFF << 24) | (b << 16) | (g << 8) | r;
|
||||
}
|
||||
|
||||
src += s_a;
|
||||
dst += d_a;
|
||||
}
|
||||
}
|
||||
|
||||
void blt_bgra8888_to_rgba8888(
|
||||
unsigned int* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned int* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_p)
|
||||
{
|
||||
size_t s_a = (src_p / sizeof(src[0])) - dst_w;
|
||||
size_t d_a = (dst_p / sizeof(dst[0])) - dst_w;
|
||||
|
||||
src += src_x + ((src_p / sizeof(src[0])) * src_y);
|
||||
dst += dst_x + ((dst_p / sizeof(dst[0])) * dst_y);
|
||||
|
||||
for (unsigned int* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;)
|
||||
{
|
||||
for (unsigned int* w_end = dst + dst_w; dst < w_end;)
|
||||
{
|
||||
unsigned int pixel = *src++;
|
||||
|
||||
BYTE r = pixel >> 16;
|
||||
BYTE g = pixel >> 8;
|
||||
BYTE b = pixel;
|
||||
|
||||
*dst++ = (0xFF << 24) | (b << 16) | (g << 8) | r;
|
||||
}
|
||||
|
||||
src += s_a;
|
||||
dst += d_a;
|
||||
}
|
||||
}
|
||||
|
||||
void blt_stretch(
|
||||
unsigned char* dst,
|
||||
int dst_x,
|
||||
int dst_y,
|
||||
int dst_w,
|
||||
int dst_h,
|
||||
int dst_p,
|
||||
unsigned char* src,
|
||||
int src_x,
|
||||
int src_y,
|
||||
int src_w,
|
||||
int src_h,
|
||||
int src_p,
|
||||
int bpp)
|
||||
{
|
||||
int bytes_pp = bpp / 8;
|
||||
|
||||
size_t size = dst_w * bytes_pp;
|
||||
|
||||
int dst_surf_w = dst_p / bytes_pp;
|
||||
int src_surf_w = src_p / bytes_pp;
|
||||
|
||||
float scale_w = (float)src_w / dst_w;
|
||||
float scale_h = (float)src_h / dst_h;
|
||||
|
||||
int last_y = -1;
|
||||
int last_row = -1;
|
||||
|
||||
if (bpp == 8)
|
||||
{
|
||||
unsigned char* d = (unsigned char*)dst;
|
||||
unsigned char* s = (unsigned char*)src;
|
||||
|
||||
for (int y = 0; y < dst_h; y++)
|
||||
{
|
||||
int scaled_y = (int)(y * scale_h);
|
||||
int dst_row = dst_x + dst_surf_w * (y + dst_y);
|
||||
|
||||
if (scaled_y == last_y)
|
||||
{
|
||||
blt_copy(&d[dst_row], &d[last_row], size);
|
||||
continue;
|
||||
}
|
||||
|
||||
last_y = scaled_y;
|
||||
last_row = dst_row;
|
||||
|
||||
int src_row = src_x + src_surf_w * (scaled_y + src_y);
|
||||
|
||||
for (int x = 0; x < dst_w; x++)
|
||||
{
|
||||
int scaled_x = (int)(x * scale_w);
|
||||
|
||||
d[x + dst_row] = s[scaled_x + src_row];
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bpp == 16)
|
||||
{
|
||||
unsigned short* d = (unsigned short*)dst;
|
||||
unsigned short* s = (unsigned short*)src;
|
||||
|
||||
for (int y = 0; y < dst_h; y++)
|
||||
{
|
||||
int scaled_y = (int)(y * scale_h);
|
||||
int dst_row = dst_x + dst_surf_w * (y + dst_y);
|
||||
|
||||
if (scaled_y == last_y)
|
||||
{
|
||||
blt_copy((void*)&d[dst_row], (void*)&d[last_row], size);
|
||||
continue;
|
||||
}
|
||||
|
||||
last_y = scaled_y;
|
||||
last_row = dst_row;
|
||||
|
||||
int src_row = src_x + src_surf_w * (scaled_y + src_y);
|
||||
|
||||
for (int x = 0; x < dst_w; x++)
|
||||
{
|
||||
int scaled_x = (int)(x * scale_w);
|
||||
|
||||
d[x + dst_row] = s[scaled_x + src_row];
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bpp == 32)
|
||||
{
|
||||
unsigned int* d = (unsigned int*)dst;
|
||||
unsigned int* s = (unsigned int*)src;
|
||||
|
||||
for (int y = 0; y < dst_h; y++)
|
||||
{
|
||||
int scaled_y = (int)(y * scale_h);
|
||||
int dst_row = dst_x + dst_surf_w * (y + dst_y);
|
||||
|
||||
if (scaled_y == last_y)
|
||||
{
|
||||
blt_copy((void*)&d[dst_row], (void*)&d[last_row], size);
|
||||
continue;
|
||||
}
|
||||
|
||||
last_y = scaled_y;
|
||||
last_row = dst_row;
|
||||
|
||||
int src_row = src_x + src_surf_w * (scaled_y + src_y);
|
||||
|
||||
for (int x = 0; x < dst_w; x++)
|
||||
{
|
||||
int scaled_x = (int)(x * scale_w);
|
||||
|
||||
d[x + dst_row] = s[scaled_x + src_row];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
1704
src/config.c
1704
src/config.c
File diff suppressed because it is too large
Load diff
105
src/crc32.c
105
src/crc32.c
|
|
@ -1,105 +0,0 @@
|
|||
/*----------------------------------------------------------------------------*\
|
||||
* CRC-32 version 2.0.0 by Craig Bruce, 2006-04-29.
|
||||
*
|
||||
* This program generates the CRC-32 values for the files named in the
|
||||
* command-line arguments. These are the same CRC-32 values used by GZIP,
|
||||
* PKZIP, and ZMODEM. The Crc32_ComputeBuf() can also be detached and
|
||||
* used independently.
|
||||
*
|
||||
* THIS PROGRAM IS PUBLIC-DOMAIN SOFTWARE.
|
||||
*
|
||||
* Based on the byte-oriented implementation "File Verification Using CRC"
|
||||
* by Mark R. Nelson in Dr. Dobb's Journal, May 1992, pp. 64-67.
|
||||
*
|
||||
* v1.0.0: original release.
|
||||
* v1.0.1: fixed printf formats.
|
||||
* v1.0.2: fixed something else.
|
||||
* v1.0.3: replaced CRC constant table by generator function.
|
||||
* v1.0.4: reformatted code, made ANSI C. 1994-12-05.
|
||||
* v2.0.0: rewrote to use memory buffer & static table, 2006-04-29.
|
||||
\*----------------------------------------------------------------------------*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf,
|
||||
size_t bufLen )
|
||||
{
|
||||
static const unsigned long crcTable[256] = {
|
||||
0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535,
|
||||
0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD,
|
||||
0xE7B82D07,0x90BF1D91,0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D,
|
||||
0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC,
|
||||
0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,0x3B6E20C8,0x4C69105E,0xD56041E4,
|
||||
0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C,
|
||||
0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,0x26D930AC,
|
||||
0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F,
|
||||
0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB,
|
||||
0xB6662D3D,0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F,
|
||||
0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB,
|
||||
0x086D3D2D,0x91646C97,0xE6635C01,0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E,
|
||||
0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA,
|
||||
0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,0x4DB26158,0x3AB551CE,
|
||||
0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A,
|
||||
0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9,
|
||||
0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409,
|
||||
0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81,
|
||||
0xB7BD5C3B,0xC0BA6CAD,0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739,
|
||||
0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8,
|
||||
0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,0xF00F9344,0x8708A3D2,0x1E01F268,
|
||||
0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0,
|
||||
0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,0xD6D6A3E8,
|
||||
0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B,
|
||||
0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF,
|
||||
0x4669BE79,0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703,
|
||||
0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7,
|
||||
0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A,
|
||||
0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE,
|
||||
0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,0x86D3D2D4,0xF1D4E242,
|
||||
0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6,
|
||||
0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45,
|
||||
0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D,
|
||||
0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,
|
||||
0x47B2CF7F,0x30B5FFE9,0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,
|
||||
0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,
|
||||
0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D };
|
||||
unsigned long crc32;
|
||||
unsigned char *byteBuf;
|
||||
size_t i;
|
||||
|
||||
/** accumulate crc32 for buffer **/
|
||||
crc32 = inCrc32 ^ 0xFFFFFFFF;
|
||||
byteBuf = (unsigned char*) buf;
|
||||
for (i=0; i < bufLen; i++) {
|
||||
crc32 = (crc32 >> 8) ^ crcTable[ (crc32 ^ byteBuf[i]) & 0xFF ];
|
||||
}
|
||||
return( crc32 ^ 0xFFFFFFFF );
|
||||
}
|
||||
|
||||
unsigned long Crc32_FromFile(unsigned long crc32, char* filename)
|
||||
{
|
||||
if (!filename)
|
||||
return 0;
|
||||
|
||||
FILE* fp = fopen(filename, "rb");
|
||||
if (!fp)
|
||||
return 0;
|
||||
|
||||
char buf[1024];
|
||||
for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp)) && !ferror(fp);)
|
||||
{
|
||||
crc32 = Crc32_ComputeBuf(crc32, buf, s);
|
||||
}
|
||||
|
||||
if (ferror(fp))
|
||||
crc32 = 0;
|
||||
|
||||
fclose(fp);
|
||||
|
||||
return crc32;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*\
|
||||
* END OF MODULE: crc32.c
|
||||
\*----------------------------------------------------------------------------*/
|
||||
188
src/ddclipper.c
188
src/ddclipper.c
|
|
@ -3,195 +3,8 @@
|
|||
#include "IDirectDrawClipper.h"
|
||||
#include "ddclipper.h"
|
||||
#include "debug.h"
|
||||
#include "dd.h"
|
||||
|
||||
|
||||
HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSiz)
|
||||
{
|
||||
EnterCriticalSection(&This->cs);
|
||||
|
||||
if (!This->region)
|
||||
{
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DDERR_NOCLIPLIST;
|
||||
}
|
||||
|
||||
if (!lpdwSiz)
|
||||
{
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DDERR_INVALIDPARAMS;
|
||||
}
|
||||
|
||||
HRGN region = NULL;
|
||||
|
||||
if (lpRect)
|
||||
{
|
||||
region = CreateRectRgnIndirect(lpRect);
|
||||
|
||||
if (!region)
|
||||
{
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DDERR_INVALIDPARAMS;
|
||||
}
|
||||
|
||||
if (CombineRgn(region, This->region, region, RGN_AND) == ERROR)
|
||||
{
|
||||
DeleteObject(region);
|
||||
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DDERR_GENERIC;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
region = This->region;
|
||||
}
|
||||
|
||||
*lpdwSiz = GetRegionData(region, *lpdwSiz, lpClipList);
|
||||
|
||||
if (lpRect)
|
||||
DeleteObject(region);
|
||||
|
||||
if (*lpdwSiz == 0)
|
||||
{
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DDERR_REGIONTOOSMALL;
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd)
|
||||
{
|
||||
EnterCriticalSection(&This->cs);
|
||||
|
||||
if (!lphWnd)
|
||||
{
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DDERR_INVALIDPARAMS;
|
||||
}
|
||||
|
||||
*lphWnd = This->hwnd;
|
||||
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
HRESULT ddc_IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged)
|
||||
{
|
||||
EnterCriticalSection(&This->cs);
|
||||
|
||||
if (!lpbChanged)
|
||||
{
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DDERR_INVALIDPARAMS;
|
||||
}
|
||||
|
||||
*lpbChanged = FALSE; /* Always return FALSE - See ddc_SetHWnd for remarks */
|
||||
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags)
|
||||
{
|
||||
EnterCriticalSection(&This->cs);
|
||||
|
||||
if (This->hwnd)
|
||||
{
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DDERR_CLIPPERISUSINGHWND;
|
||||
}
|
||||
|
||||
if (lpClipList)
|
||||
{
|
||||
if (!lpClipList->rdh.nCount)
|
||||
{
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DDERR_INVALIDCLIPLIST;
|
||||
}
|
||||
|
||||
if (This->region)
|
||||
DeleteObject(This->region);
|
||||
|
||||
RECT* rc = (RECT*)lpClipList->Buffer;
|
||||
|
||||
This->region = CreateRectRgnIndirect(&rc[0]);
|
||||
|
||||
if (!This->region)
|
||||
{
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DDERR_INVALIDCLIPLIST;
|
||||
}
|
||||
|
||||
for (int i = 1; i < lpClipList->rdh.nCount; ++i)
|
||||
{
|
||||
HRGN region = CreateRectRgnIndirect(&rc[i]);
|
||||
|
||||
if (!region)
|
||||
{
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DDERR_INVALIDCLIPLIST;
|
||||
}
|
||||
|
||||
if (CombineRgn(This->region, region, This->region, RGN_OR) == ERROR)
|
||||
{
|
||||
DeleteObject(region);
|
||||
DeleteObject(This->region);
|
||||
This->region = NULL;
|
||||
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DDERR_INVALIDCLIPLIST;
|
||||
}
|
||||
|
||||
DeleteObject(region);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (This->region)
|
||||
DeleteObject(This->region);
|
||||
|
||||
This->region = NULL;
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd)
|
||||
{
|
||||
EnterCriticalSection(&This->cs);
|
||||
/*
|
||||
We don't use the regions from the hwnd here since everything is emulated and we need the entire
|
||||
emulated surface to be redrawn all the time
|
||||
*/
|
||||
This->hwnd = hWnd;
|
||||
|
||||
if (hWnd && !This->region && g_ddraw.width)
|
||||
{
|
||||
RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height };
|
||||
ddc_SetClipRect(This, &rc);
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
HRESULT ddc_SetClipRect(IDirectDrawClipperImpl* This, LPRECT lpRect)
|
||||
{
|
||||
EnterCriticalSection(&This->cs);
|
||||
|
||||
if (This->region)
|
||||
DeleteObject(This->region);
|
||||
|
||||
This->region = CreateRectRgnIndirect(lpRect);
|
||||
|
||||
LeaveCriticalSection(&This->cs);
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper, IUnknown FAR* pUnkOuter)
|
||||
{
|
||||
if (!lplpDDClipper)
|
||||
|
|
@ -204,7 +17,6 @@ HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper,
|
|||
|
||||
c->lpVtbl = &g_ddc_vtbl;
|
||||
IDirectDrawClipper_AddRef(c);
|
||||
InitializeCriticalSection(&c->cs);
|
||||
|
||||
*lplpDDClipper = c;
|
||||
|
||||
|
|
|
|||
|
|
@ -14,15 +14,11 @@ HRESULT ddp_GetEntries(
|
|||
DWORD dwNumEntries,
|
||||
LPPALETTEENTRY lpEntries)
|
||||
{
|
||||
if (!lpEntries)
|
||||
return DDERR_INVALIDPARAMS;
|
||||
|
||||
for (int i = dwBase, x = 0; i < dwBase + dwNumEntries && i < 256; i++, x++)
|
||||
for (int i = dwBase, x = 0; i < dwBase + dwNumEntries; i++, x++)
|
||||
{
|
||||
lpEntries[x].peRed = This->data_rgb[i].rgbRed;
|
||||
lpEntries[x].peGreen = This->data_rgb[i].rgbGreen;
|
||||
lpEntries[x].peBlue = This->data_rgb[i].rgbBlue;
|
||||
lpEntries[x].peFlags = 0;
|
||||
}
|
||||
|
||||
return DD_OK;
|
||||
|
|
@ -35,17 +31,7 @@ HRESULT ddp_SetEntries(
|
|||
DWORD dwCount,
|
||||
LPPALETTEENTRY lpEntries)
|
||||
{
|
||||
if (!lpEntries)
|
||||
return DDERR_INVALIDPARAMS;
|
||||
|
||||
RGBQUAD data_rgb[256];
|
||||
|
||||
if ((dwFlags & DDPCAPS_REFRESH_CHANGED_ONLY))
|
||||
{
|
||||
memcpy(data_rgb, This->data_rgb, sizeof(This->data_rgb));
|
||||
}
|
||||
|
||||
for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount && i < 256; i++, x++)
|
||||
for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount; i++, x++)
|
||||
{
|
||||
This->data_bgr[i] = (lpEntries[x].peBlue << 16) | (lpEntries[x].peGreen << 8) | lpEntries[x].peRed;
|
||||
|
||||
|
|
@ -71,21 +57,10 @@ HRESULT ddp_SetEntries(
|
|||
This->data_rgb[255].rgbReserved = 0;
|
||||
}
|
||||
|
||||
if ((dwFlags & DDPCAPS_REFRESH_CHANGED_ONLY))
|
||||
if (g_ddraw->primary && g_ddraw->primary->palette == This && g_ddraw->render.run)
|
||||
{
|
||||
if (memcmp(data_rgb, This->data_rgb, sizeof(This->data_rgb)) == 0)
|
||||
{
|
||||
// do not set palette_updated BOOL if nothing changed
|
||||
return DD_OK;
|
||||
}
|
||||
|
||||
TRACE_EXT(" Palette changed\n");
|
||||
}
|
||||
|
||||
if (g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette == This && g_ddraw.render.run)
|
||||
{
|
||||
InterlockedExchange(&g_ddraw.render.palette_updated, TRUE);
|
||||
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||
InterlockedExchange(&g_ddraw->render.palette_updated, TRUE);
|
||||
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
||||
}
|
||||
|
||||
return DD_OK;
|
||||
|
|
@ -97,8 +72,6 @@ HRESULT dd_CreatePalette(
|
|||
IDirectDrawPaletteImpl** lpDDPalette,
|
||||
IUnknown FAR* unkOuter)
|
||||
{
|
||||
dbg_dump_ddp_flags(dwFlags);
|
||||
|
||||
if (!lpDDPalette || !lpDDColorArray)
|
||||
return DDERR_INVALIDPARAMS;
|
||||
|
||||
|
|
|
|||
1670
src/ddsurface.c
1670
src/ddsurface.c
File diff suppressed because it is too large
Load diff
794
src/debug.c
794
src/debug.c
|
|
@ -1,285 +1,86 @@
|
|||
#include <windows.h>
|
||||
#include <dbghelp.h>
|
||||
#include <stdio.h>
|
||||
#include <d3d9.h>
|
||||
#include <time.h>
|
||||
#include "directinput.h"
|
||||
#include "ddraw.h"
|
||||
#include "dd.h"
|
||||
#include "ddsurface.h"
|
||||
#include "wndproc.h"
|
||||
#include "debug.h"
|
||||
#include "hook.h"
|
||||
#include "version.h"
|
||||
#include "git.h"
|
||||
#include "versionhelpers.h"
|
||||
#include "utils.h"
|
||||
#include "crc32.h"
|
||||
#include "dllmain.h"
|
||||
#include "config.h"
|
||||
#include "delay_imports.h"
|
||||
|
||||
|
||||
double g_dbg_frame_time = 0;
|
||||
DWORD g_dbg_frame_count = 0;
|
||||
LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter;
|
||||
PVOID g_dbg_exception_handle;
|
||||
|
||||
static LONGLONG g_dbg_counter_start_time = 0;
|
||||
static double g_dbg_counter_freq = 0.0;
|
||||
static FILE* g_dbg_log_file;
|
||||
static char g_dbg_log_path1[MAX_PATH] = "cnc-ddraw-1.log";
|
||||
static char g_dbg_log_path2[MAX_PATH] = "cnc-ddraw-2.log";
|
||||
static char g_dbg_log_path3[MAX_PATH] = "cnc-ddraw-3.log";
|
||||
static char g_dbg_dmp_path1[MAX_PATH] = "cnc-ddraw-1.dmp";
|
||||
static char g_dbg_dmp_path2[MAX_PATH] = "cnc-ddraw-2.dmp";
|
||||
static BOOL g_dbg_log_rotate;
|
||||
|
||||
#ifdef _DEBUG
|
||||
static int g_dbg_crash_count = 0;
|
||||
|
||||
LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception)
|
||||
#if _DEBUG
|
||||
int dbg_exception_handler(EXCEPTION_POINTERS* exception)
|
||||
{
|
||||
g_dbg_crash_count++;
|
||||
HANDLE dmp =
|
||||
CreateFile(
|
||||
"cnc-ddraw.dmp",
|
||||
GENERIC_READ | GENERIC_WRITE,
|
||||
FILE_SHARE_WRITE | FILE_SHARE_READ,
|
||||
0,
|
||||
CREATE_ALWAYS,
|
||||
0,
|
||||
0);
|
||||
|
||||
BOOL(WINAPI * MiniDumpWriteDumpProc)(
|
||||
HANDLE,
|
||||
DWORD,
|
||||
HANDLE,
|
||||
MINIDUMP_TYPE,
|
||||
PMINIDUMP_EXCEPTION_INFORMATION,
|
||||
PMINIDUMP_USER_STREAM_INFORMATION,
|
||||
PMINIDUMP_CALLBACK_INFORMATION
|
||||
);
|
||||
|
||||
MiniDumpWriteDumpProc = (void*)real_GetProcAddress(real_LoadLibraryA("Dbghelp.dll"), "MiniDumpWriteDump");
|
||||
if (MiniDumpWriteDumpProc)
|
||||
if (dmp)
|
||||
{
|
||||
HANDLE dmp =
|
||||
CreateFile(
|
||||
g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2,
|
||||
GENERIC_READ | GENERIC_WRITE,
|
||||
FILE_SHARE_WRITE | FILE_SHARE_READ,
|
||||
0,
|
||||
CREATE_ALWAYS,
|
||||
0,
|
||||
0);
|
||||
MINIDUMP_EXCEPTION_INFORMATION info;
|
||||
info.ThreadId = GetCurrentThreadId();
|
||||
info.ExceptionPointers = exception;
|
||||
info.ClientPointers = TRUE;
|
||||
|
||||
if (dmp != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
MINIDUMP_EXCEPTION_INFORMATION info;
|
||||
info.ThreadId = GetCurrentThreadId();
|
||||
info.ExceptionPointers = exception;
|
||||
info.ClientPointers = TRUE;
|
||||
MiniDumpWriteDump(
|
||||
GetCurrentProcess(),
|
||||
GetCurrentProcessId(),
|
||||
dmp,
|
||||
0,
|
||||
&info,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
MiniDumpWriteDumpProc(
|
||||
GetCurrentProcess(),
|
||||
GetCurrentProcessId(),
|
||||
dmp,
|
||||
0,
|
||||
&info,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
CloseHandle(dmp);
|
||||
}
|
||||
CloseHandle(dmp);
|
||||
}
|
||||
|
||||
if (exception && exception->ExceptionRecord)
|
||||
{
|
||||
HMODULE mod = NULL;
|
||||
char filename[MAX_PATH] = { 0 };
|
||||
|
||||
if (delay_GetModuleHandleExA && delay_GetModuleHandleExA(
|
||||
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
|
||||
exception->ExceptionRecord->ExceptionAddress,
|
||||
&mod))
|
||||
{
|
||||
GetModuleFileNameA(mod, filename, sizeof(filename) - 1);
|
||||
}
|
||||
|
||||
TRACE(
|
||||
"Exception at %p (%p+%p), Code=%08X - %s\n",
|
||||
exception->ExceptionRecord->ExceptionAddress,
|
||||
mod,
|
||||
(int)exception->ExceptionRecord->ExceptionAddress - (int)mod,
|
||||
exception->ExceptionRecord->ExceptionCode,
|
||||
filename);
|
||||
}
|
||||
|
||||
if (g_dbg_exception_filter)
|
||||
return g_dbg_exception_filter(exception);
|
||||
|
||||
return EXCEPTION_EXECUTE_HANDLER;
|
||||
}
|
||||
|
||||
void __cdecl dbg_invoke_watson(
|
||||
wchar_t const* const expression,
|
||||
wchar_t const* const function_name,
|
||||
wchar_t const* const file_name,
|
||||
unsigned int const line_number,
|
||||
uintptr_t const reserved
|
||||
)
|
||||
{
|
||||
TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress());
|
||||
|
||||
/* Force access violation to produce a dmp file for debugging */
|
||||
*(int*)0 = 0;
|
||||
|
||||
TerminateProcess(GetCurrentProcess(), STATUS_INVALID_CRUNTIME_PARAMETER);
|
||||
}
|
||||
#endif
|
||||
|
||||
LONG WINAPI dbg_vectored_exception_handler(EXCEPTION_POINTERS* exception)
|
||||
{
|
||||
if (exception &&
|
||||
exception->ContextRecord &&
|
||||
exception->ExceptionRecord &&
|
||||
exception->ExceptionRecord->ExceptionAddress &&
|
||||
exception->ExceptionRecord->ExceptionCode == STATUS_PRIVILEGED_INSTRUCTION)
|
||||
{
|
||||
size_t size = 0;
|
||||
BYTE* addr = exception->ExceptionRecord->ExceptionAddress;
|
||||
switch (*addr)
|
||||
{
|
||||
case 0xE4: // IN ib
|
||||
case 0xE5: // IN id
|
||||
case 0xE6: // OUT ib
|
||||
case 0xE7: // OUT ib
|
||||
size = 2;
|
||||
break;
|
||||
case 0xF8: // CLC
|
||||
case 0xF9: // STC
|
||||
case 0xFA: // CLI
|
||||
case 0xFB: // STI
|
||||
case 0xFC: // CLD
|
||||
case 0xFD: // STD
|
||||
case 0xEC: // IN ib
|
||||
case 0xED: // IN id
|
||||
case 0xEE: // OUT
|
||||
case 0xEF: // OUT
|
||||
size = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (size)
|
||||
{
|
||||
exception->ContextRecord->Eip += size;
|
||||
return EXCEPTION_CONTINUE_EXECUTION;
|
||||
}
|
||||
}
|
||||
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
|
||||
void dbg_init()
|
||||
{
|
||||
static BOOL once = 0;
|
||||
static int stdout_open = 0;
|
||||
|
||||
if (!once)
|
||||
if (!stdout_open)
|
||||
{
|
||||
once = TRUE;
|
||||
stdout_open = 1;
|
||||
|
||||
char exe_path[MAX_PATH] = { 0 };
|
||||
if (GetModuleFileNameA(NULL, exe_path, sizeof(exe_path) - 1) > 0)
|
||||
{
|
||||
char filename[MAX_PATH] = { 0 };
|
||||
char drive[MAX_PATH] = { 0 };
|
||||
char dir[MAX_PATH] = { 0 };
|
||||
_splitpath(exe_path, drive, dir, filename, NULL);
|
||||
freopen("cnc-ddraw.log", "w", stdout);
|
||||
setvbuf(stdout, NULL, _IOLBF, 1024);
|
||||
|
||||
char game_path[MAX_PATH] = { 0 };
|
||||
_makepath(game_path, drive, dir, NULL, NULL);
|
||||
|
||||
_snprintf(g_dbg_dmp_path1, sizeof(g_dbg_dmp_path1) - 1, "%scnc-ddraw-%s-1.dmp", game_path, filename);
|
||||
_snprintf(g_dbg_dmp_path2, sizeof(g_dbg_dmp_path2) - 1, "%scnc-ddraw-%s-2.dmp", game_path, filename);
|
||||
|
||||
_snprintf(g_dbg_log_path1, sizeof(g_dbg_log_path1) - 1, "%scnc-ddraw-%s-1.log", game_path, filename);
|
||||
_snprintf(g_dbg_log_path2, sizeof(g_dbg_log_path2) - 1, "%scnc-ddraw-%s-2.log", game_path, filename);
|
||||
_snprintf(g_dbg_log_path3, sizeof(g_dbg_log_path3) - 1, "%scnc-ddraw-%s-3.log", game_path, filename);
|
||||
}
|
||||
|
||||
remove(g_dbg_dmp_path1);
|
||||
remove(g_dbg_dmp_path2);
|
||||
|
||||
remove(g_dbg_log_path1);
|
||||
remove(g_dbg_log_path2);
|
||||
remove(g_dbg_log_path3);
|
||||
|
||||
g_dbg_log_file = fopen(g_dbg_log_path1, "w");
|
||||
if (g_dbg_log_file)
|
||||
{
|
||||
setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024);
|
||||
}
|
||||
|
||||
TRACE(
|
||||
"cnc-ddraw version = %d.%d.%d.%d (git~%s, %s)\n",
|
||||
VERSION_MAJOR,
|
||||
VERSION_MINOR,
|
||||
VERSION_BUILD,
|
||||
VERSION_REVISION,
|
||||
GIT_COMMIT,
|
||||
GIT_BRANCH);
|
||||
|
||||
TRACE("cnc-ddraw = %p\n", g_ddraw_module);
|
||||
|
||||
HKEY hkey = NULL;
|
||||
HKEY hkey;
|
||||
LONG status =
|
||||
RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0L, KEY_READ, &hkey);
|
||||
|
||||
HKEY hkey9x = NULL;
|
||||
LONG status9x =
|
||||
RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion", 0L, KEY_READ, &hkey9x);
|
||||
|
||||
char name[256] = { 0 };
|
||||
DWORD name_size = sizeof(name);
|
||||
if (status || RegQueryValueExA(hkey, "ProductName", NULL, NULL, (PVOID)&name, &name_size) != ERROR_SUCCESS)
|
||||
{
|
||||
if (status9x == ERROR_SUCCESS)
|
||||
RegQueryValueExA(hkey9x, "ProductName", NULL, NULL, (PVOID)&name, &name_size);
|
||||
}
|
||||
|
||||
char vers[256] = { 0 };
|
||||
DWORD vers_size = sizeof(vers);
|
||||
if (status || RegQueryValueExA(hkey, "DisplayVersion", NULL, NULL, (PVOID)&vers, &vers_size) != ERROR_SUCCESS)
|
||||
{
|
||||
if (status9x == ERROR_SUCCESS)
|
||||
RegQueryValueExA(hkey9x, "VersionNumber", NULL, NULL, (PVOID)&vers, &vers_size);
|
||||
}
|
||||
|
||||
char build[256] = { 0 };
|
||||
DWORD build_size = sizeof(build);
|
||||
if (status || RegQueryValueExA(hkey, "BuildLabEx", NULL, NULL, (PVOID)&build, &build_size) != ERROR_SUCCESS)
|
||||
{
|
||||
if (status == ERROR_SUCCESS)
|
||||
RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size);
|
||||
}
|
||||
|
||||
TRACE("%s %s (%s)\n", name, vers, build);
|
||||
|
||||
if (status == ERROR_SUCCESS)
|
||||
RegCloseKey(hkey);
|
||||
|
||||
if (status9x == ERROR_SUCCESS)
|
||||
RegCloseKey(hkey9x);
|
||||
|
||||
if (IsWine())
|
||||
{
|
||||
TRACE("Wine version = %s\n", verhelp_wine_get_version());
|
||||
char name[256] = { 0 };
|
||||
DWORD name_size = sizeof(name);
|
||||
RegQueryValueExA(hkey, "ProductName", NULL, NULL, (PVOID)&name, &name_size);
|
||||
|
||||
const char* sysname = NULL;
|
||||
const char* release = NULL;
|
||||
verhelp_wine_get_host_version(&sysname, &release);
|
||||
char build[256] = { 0 };
|
||||
DWORD build_size = sizeof(build);
|
||||
RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size);
|
||||
|
||||
TRACE("Wine sysname = %s, release = %s\n", sysname, release);
|
||||
}
|
||||
dbg_printf("%s (%s)\n", name, build);
|
||||
|
||||
TRACE("crc32 = %08X\n", Crc32_FromFile(0, exe_path));
|
||||
const char* (CDECL * wine_get_version)() =
|
||||
(void*)GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version");
|
||||
|
||||
DWORD timestamp = util_get_timestamp(GetModuleHandleA(NULL));
|
||||
if (timestamp)
|
||||
{
|
||||
TRACE("timestamp = %s", asctime(_gmtime32((const long*)×tamp)));
|
||||
if (wine_get_version)
|
||||
dbg_printf("Wine version = %s\n", wine_get_version());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -309,7 +110,7 @@ void dbg_debug_string(const char* format, ...)
|
|||
OutputDebugStringA(buffer);
|
||||
}
|
||||
|
||||
void dbg_printf(const char* fmt, ...)
|
||||
int dbg_printf(const char* fmt, ...)
|
||||
{
|
||||
static CRITICAL_SECTION cs;
|
||||
static BOOL initialized;
|
||||
|
|
@ -322,63 +123,30 @@ void dbg_printf(const char* fmt, ...)
|
|||
|
||||
EnterCriticalSection(&cs);
|
||||
|
||||
if (g_dbg_log_file && ftell(g_dbg_log_file) >= 1024 * 1024 * 100) /* rotate every 100MB */
|
||||
{
|
||||
g_dbg_log_file =
|
||||
freopen(
|
||||
g_dbg_log_rotate ? g_dbg_log_path3 : g_dbg_log_path2,
|
||||
"w",
|
||||
g_dbg_log_file);
|
||||
va_list args;
|
||||
int ret;
|
||||
|
||||
g_dbg_log_rotate = !g_dbg_log_rotate;
|
||||
SYSTEMTIME st;
|
||||
GetLocalTime(&st);
|
||||
|
||||
if (g_dbg_log_file)
|
||||
{
|
||||
setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024);
|
||||
}
|
||||
}
|
||||
fprintf(
|
||||
stdout,
|
||||
"[%lu] %02d:%02d:%02d.%03d ",
|
||||
GetCurrentThreadId(),
|
||||
st.wHour,
|
||||
st.wMinute,
|
||||
st.wSecond,
|
||||
st.wMilliseconds);
|
||||
|
||||
if (g_dbg_log_file)
|
||||
{
|
||||
va_list args;
|
||||
SYSTEMTIME st;
|
||||
GetLocalTime(&st);
|
||||
va_start(args, fmt);
|
||||
ret = vfprintf(stdout, fmt, args);
|
||||
va_end(args);
|
||||
|
||||
fprintf(
|
||||
g_dbg_log_file,
|
||||
"[%lu] %02d:%02d:%02d.%03d ",
|
||||
GetCurrentThreadId(),
|
||||
st.wHour,
|
||||
st.wMinute,
|
||||
st.wSecond,
|
||||
st.wMilliseconds);
|
||||
|
||||
va_start(args, fmt);
|
||||
vfprintf(g_dbg_log_file, fmt, args);
|
||||
va_end(args);
|
||||
|
||||
fflush(g_dbg_log_file);
|
||||
}
|
||||
fflush(stdout);
|
||||
|
||||
LeaveCriticalSection(&cs);
|
||||
}
|
||||
|
||||
void dbg_print_rect(char* info, LPRECT rect)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
if (rect)
|
||||
{
|
||||
TRACE(
|
||||
" %s: l=%d, t=%d, r=%d, b=%d (%dx%d)\n",
|
||||
info,
|
||||
rect->left,
|
||||
rect->top,
|
||||
rect->right,
|
||||
rect->bottom,
|
||||
rect->right - rect->left,
|
||||
rect->bottom - rect->top);
|
||||
}
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
void dbg_draw_frame_info_start()
|
||||
|
|
@ -386,12 +154,12 @@ void dbg_draw_frame_info_start()
|
|||
static DWORD tick_fps = 0;
|
||||
static char debug_text[512] = { 0 };
|
||||
|
||||
RECT debugrc = { 0, 0, g_ddraw.width, g_ddraw.height };
|
||||
RECT debugrc = { 0, 0, g_ddraw->width, g_ddraw->height };
|
||||
|
||||
if (g_ddraw.primary)
|
||||
if (g_ddraw->primary)
|
||||
{
|
||||
HDC primary_dc;
|
||||
dds_GetDC(g_ddraw.primary, &primary_dc);
|
||||
dds_GetDC(g_ddraw->primary, &primary_dc);
|
||||
|
||||
DrawText(primary_dc, debug_text, -1, &debugrc, DT_NOCLIP);
|
||||
}
|
||||
|
|
@ -421,316 +189,6 @@ void dbg_draw_frame_info_end()
|
|||
g_dbg_frame_time = dbg_counter_stop();
|
||||
}
|
||||
|
||||
void dbg_dump_wnd_styles(DWORD style, DWORD exstyle)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
if (style & WS_BORDER) {
|
||||
TRACE(" WS_BORDER\n");
|
||||
}
|
||||
if (style & WS_CAPTION) {
|
||||
TRACE(" WS_CAPTION\n");
|
||||
}
|
||||
if (style & WS_CHILD) {
|
||||
TRACE(" WS_CHILD\n");
|
||||
}
|
||||
if (style & WS_CHILDWINDOW) {
|
||||
TRACE(" WS_CHILDWINDOW\n");
|
||||
}
|
||||
if (style & WS_CLIPCHILDREN) {
|
||||
TRACE(" WS_CLIPCHILDREN\n");
|
||||
}
|
||||
if (style & WS_CLIPSIBLINGS) {
|
||||
TRACE(" WS_CLIPSIBLINGS\n");
|
||||
}
|
||||
if (style & WS_DISABLED) {
|
||||
TRACE(" WS_DISABLED\n");
|
||||
}
|
||||
if (style & WS_DLGFRAME) {
|
||||
TRACE(" WS_DLGFRAME\n");
|
||||
}
|
||||
if (style & WS_GROUP) {
|
||||
TRACE(" WS_GROUP\n");
|
||||
}
|
||||
if (style & WS_HSCROLL) {
|
||||
TRACE(" WS_HSCROLL\n");
|
||||
}
|
||||
if (style & WS_ICONIC) {
|
||||
TRACE(" WS_ICONIC\n");
|
||||
}
|
||||
if (style & WS_MAXIMIZE) {
|
||||
TRACE(" WS_MAXIMIZE\n");
|
||||
}
|
||||
if (style & WS_MAXIMIZEBOX) {
|
||||
TRACE(" WS_MAXIMIZEBOX\n");
|
||||
}
|
||||
if (style & WS_MINIMIZE) {
|
||||
TRACE(" WS_MINIMIZE\n");
|
||||
}
|
||||
if (style & WS_MINIMIZEBOX) {
|
||||
TRACE(" WS_MINIMIZEBOX\n");
|
||||
}
|
||||
if (style & WS_POPUP) {
|
||||
TRACE(" WS_POPUP\n");
|
||||
}
|
||||
if (style & WS_SIZEBOX) {
|
||||
TRACE(" WS_SIZEBOX\n");
|
||||
}
|
||||
if (style & WS_SYSMENU) {
|
||||
TRACE(" WS_SYSMENU\n");
|
||||
}
|
||||
if (style & WS_TABSTOP) {
|
||||
TRACE(" WS_TABSTOP\n");
|
||||
}
|
||||
if (style & WS_THICKFRAME) {
|
||||
TRACE(" WS_THICKFRAME\n");
|
||||
}
|
||||
if (style & WS_VISIBLE) {
|
||||
TRACE(" WS_VISIBLE\n");
|
||||
}
|
||||
if (style & WS_VSCROLL) {
|
||||
TRACE(" WS_VSCROLL\n");
|
||||
}
|
||||
|
||||
if (exstyle & WS_EX_ACCEPTFILES) {
|
||||
TRACE(" WS_EX_ACCEPTFILES\n");
|
||||
}
|
||||
if (exstyle & WS_EX_APPWINDOW) {
|
||||
TRACE(" WS_EX_APPWINDOW\n");
|
||||
}
|
||||
if (exstyle & WS_EX_CLIENTEDGE) {
|
||||
TRACE(" WS_EX_CLIENTEDGE\n");
|
||||
}
|
||||
if (exstyle & WS_EX_COMPOSITED) {
|
||||
TRACE(" WS_EX_COMPOSITED\n");
|
||||
}
|
||||
if (exstyle & WS_EX_CONTEXTHELP) {
|
||||
TRACE(" WS_EX_CONTEXTHELP\n");
|
||||
}
|
||||
if (exstyle & WS_EX_CONTROLPARENT) {
|
||||
TRACE(" WS_EX_CONTROLPARENT\n");
|
||||
}
|
||||
if (exstyle & WS_EX_DLGMODALFRAME) {
|
||||
TRACE(" WS_EX_DLGMODALFRAME\n");
|
||||
}
|
||||
if (exstyle & WS_EX_LAYERED) {
|
||||
TRACE(" WS_EX_LAYERED\n");
|
||||
}
|
||||
if (exstyle & WS_EX_LAYOUTRTL) {
|
||||
TRACE(" WS_EX_LAYOUTRTL\n");
|
||||
}
|
||||
if (exstyle & WS_EX_LEFTSCROLLBAR) {
|
||||
TRACE(" WS_EX_LEFTSCROLLBAR\n");
|
||||
}
|
||||
if (exstyle & WS_EX_MDICHILD) {
|
||||
TRACE(" WS_EX_MDICHILD\n");
|
||||
}
|
||||
if (exstyle & WS_EX_NOACTIVATE) {
|
||||
TRACE(" WS_EX_NOACTIVATE\n");
|
||||
}
|
||||
if (exstyle & WS_EX_NOINHERITLAYOUT) {
|
||||
TRACE(" WS_EX_NOINHERITLAYOUT\n");
|
||||
}
|
||||
if (exstyle & WS_EX_NOPARENTNOTIFY) {
|
||||
TRACE(" WS_EX_NOPARENTNOTIFY\n");
|
||||
}
|
||||
//if (exstyle & WS_EX_NOREDIRECTIONBITMAP) {
|
||||
// TRACE(" WS_EX_NOREDIRECTIONBITMAP\n");
|
||||
//}
|
||||
if (exstyle & WS_EX_RIGHT) {
|
||||
TRACE(" WS_EX_RIGHT\n");
|
||||
}
|
||||
if (exstyle & WS_EX_RTLREADING) {
|
||||
TRACE(" WS_EX_RTLREADING\n");
|
||||
}
|
||||
if (exstyle & WS_EX_STATICEDGE) {
|
||||
TRACE(" WS_EX_STATICEDGE\n");
|
||||
}
|
||||
if (exstyle & WS_EX_TOOLWINDOW) {
|
||||
TRACE(" WS_EX_TOOLWINDOW\n");
|
||||
}
|
||||
if (exstyle & WS_EX_TOPMOST) {
|
||||
TRACE(" WS_EX_TOPMOST\n");
|
||||
}
|
||||
if (exstyle & WS_EX_TRANSPARENT) {
|
||||
TRACE(" WS_EX_TRANSPARENT\n");
|
||||
}
|
||||
if (exstyle & WS_EX_WINDOWEDGE) {
|
||||
TRACE(" WS_EX_WINDOWEDGE\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void dbg_dump_swp_flags(DWORD flags)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
if (flags & SWP_NOSIZE) {
|
||||
TRACE(" SWP_NOSIZE\n");
|
||||
}
|
||||
if (flags & SWP_NOMOVE) {
|
||||
TRACE(" SWP_NOMOVE\n");
|
||||
}
|
||||
if (flags & SWP_NOZORDER) {
|
||||
TRACE(" SWP_NOZORDER\n");
|
||||
}
|
||||
if (flags & SWP_NOREDRAW) {
|
||||
TRACE(" SWP_NOREDRAW\n");
|
||||
}
|
||||
if (flags & SWP_NOACTIVATE) {
|
||||
TRACE(" SWP_NOACTIVATE\n");
|
||||
}
|
||||
if (flags & SWP_FRAMECHANGED) {
|
||||
TRACE(" SWP_FRAMECHANGED\n");
|
||||
}
|
||||
if (flags & SWP_SHOWWINDOW) {
|
||||
TRACE(" SWP_SHOWWINDOW\n");
|
||||
}
|
||||
if (flags & SWP_HIDEWINDOW) {
|
||||
TRACE(" SWP_HIDEWINDOW\n");
|
||||
}
|
||||
if (flags & SWP_NOCOPYBITS) {
|
||||
TRACE(" SWP_NOCOPYBITS\n");
|
||||
}
|
||||
if (flags & SWP_NOOWNERZORDER) {
|
||||
TRACE(" SWP_NOOWNERZORDER\n");
|
||||
}
|
||||
if (flags & SWP_NOSENDCHANGING) {
|
||||
TRACE(" SWP_NOSENDCHANGING\n");
|
||||
}
|
||||
if (flags & SWP_DEFERERASE) {
|
||||
TRACE(" SWP_DEFERERASE\n");
|
||||
}
|
||||
if (flags & SWP_ASYNCWINDOWPOS) {
|
||||
TRACE(" SWP_ASYNCWINDOWPOS\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void dbg_dump_ddp_flags(DWORD flags)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
if (flags & DDPCAPS_4BIT) {
|
||||
TRACE(" DDPCAPS_4BIT\n");
|
||||
}
|
||||
if (flags & DDPCAPS_8BITENTRIES) {
|
||||
TRACE(" DDPCAPS_8BITENTRIES\n");
|
||||
}
|
||||
if (flags & DDPCAPS_8BIT) {
|
||||
TRACE(" DDPCAPS_8BIT\n");
|
||||
}
|
||||
if (flags & DDPCAPS_INITIALIZE) {
|
||||
TRACE(" DDPCAPS_INITIALIZE\n");
|
||||
}
|
||||
if (flags & DDPCAPS_PRIMARYSURFACE) {
|
||||
TRACE(" DDPCAPS_PRIMARYSURFACE\n");
|
||||
}
|
||||
if (flags & DDPCAPS_PRIMARYSURFACELEFT) {
|
||||
TRACE(" DDPCAPS_PRIMARYSURFACELEFT\n");
|
||||
}
|
||||
if (flags & DDPCAPS_ALLOW256) {
|
||||
TRACE(" DDPCAPS_ALLOW256\n");
|
||||
}
|
||||
if (flags & DDPCAPS_VSYNC) {
|
||||
TRACE(" DDPCAPS_VSYNC\n");
|
||||
}
|
||||
if (flags & DDPCAPS_1BIT) {
|
||||
TRACE(" DDPCAPS_1BIT\n");
|
||||
}
|
||||
if (flags & DDPCAPS_2BIT) {
|
||||
TRACE(" DDPCAPS_2BIT\n");
|
||||
}
|
||||
if (flags & DDPCAPS_ALPHA) {
|
||||
TRACE(" DDPCAPS_ALPHA\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void dbg_dump_scl_flags(DWORD flags)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
if (flags & DDSCL_FULLSCREEN) {
|
||||
TRACE(" DDSCL_FULLSCREEN\n");
|
||||
}
|
||||
if (flags & DDSCL_ALLOWREBOOT) {
|
||||
TRACE(" DDSCL_ALLOWREBOOT\n");
|
||||
}
|
||||
if (flags & DDSCL_NOWINDOWCHANGES) {
|
||||
TRACE(" DDSCL_NOWINDOWCHANGES\n");
|
||||
}
|
||||
if (flags & DDSCL_NORMAL) {
|
||||
TRACE(" DDSCL_NORMAL\n");
|
||||
}
|
||||
if (flags & DDSCL_EXCLUSIVE) {
|
||||
TRACE(" DDSCL_EXCLUSIVE\n");
|
||||
}
|
||||
if (flags & DDSCL_ALLOWMODEX) {
|
||||
TRACE(" DDSCL_ALLOWMODEX\n");
|
||||
}
|
||||
if (flags & DDSCL_SETFOCUSWINDOW) {
|
||||
TRACE(" DDSCL_SETFOCUSWINDOW\n");
|
||||
}
|
||||
if (flags & DDSCL_SETDEVICEWINDOW) {
|
||||
TRACE(" DDSCL_SETDEVICEWINDOW\n");
|
||||
}
|
||||
if (flags & DDSCL_CREATEDEVICEWINDOW) {
|
||||
TRACE(" DDSCL_CREATEDEVICEWINDOW\n");
|
||||
}
|
||||
if (flags & DDSCL_MULTITHREADED) {
|
||||
TRACE(" DDSCL_MULTITHREADED\n");
|
||||
}
|
||||
if (flags & DDSCL_FPUSETUP) {
|
||||
TRACE(" DDSCL_FPUSETUP\n");
|
||||
}
|
||||
if (flags & DDSCL_FPUPRESERVE) {
|
||||
TRACE(" DDSCL_FPUPRESERVE\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void dbg_dump_edm_flags(DWORD flags)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
if (flags & DDEDM_REFRESHRATES) {
|
||||
TRACE(" DDEDM_REFRESHRATES\n");
|
||||
}
|
||||
if (flags & DDEDM_STANDARDVGAMODES) {
|
||||
TRACE(" DDEDM_STANDARDVGAMODES\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void dbg_dump_dds_flip_flags(DWORD flags)
|
||||
{
|
||||
#ifdef _DEBUG_X
|
||||
if (flags & DDFLIP_WAIT) {
|
||||
TRACE(" DDFLIP_WAIT\n");
|
||||
}
|
||||
if (flags & DDFLIP_EVEN) {
|
||||
TRACE(" DDFLIP_EVEN\n");
|
||||
}
|
||||
if (flags & DDFLIP_ODD) {
|
||||
TRACE(" DDFLIP_ODD\n");
|
||||
}
|
||||
if (flags & DDFLIP_NOVSYNC) {
|
||||
TRACE(" DDFLIP_NOVSYNC\n");
|
||||
}
|
||||
if (flags & DDFLIP_INTERVAL2) {
|
||||
TRACE(" DDFLIP_INTERVAL2\n");
|
||||
}
|
||||
if (flags & DDFLIP_INTERVAL3) {
|
||||
TRACE(" DDFLIP_INTERVAL3\n");
|
||||
}
|
||||
if (flags & DDFLIP_INTERVAL4) {
|
||||
TRACE(" DDFLIP_INTERVAL4\n");
|
||||
}
|
||||
if (flags & DDFLIP_STEREO) {
|
||||
TRACE(" DDFLIP_STEREO\n");
|
||||
}
|
||||
if (flags & DDFLIP_DONOTWAIT) {
|
||||
TRACE(" DDFLIP_DONOTWAIT\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void dbg_dump_dds_blt_flags(DWORD flags)
|
||||
{
|
||||
#ifdef _DEBUG_X
|
||||
|
|
@ -865,7 +323,7 @@ void dbg_dump_dds_blt_fx_flags(DWORD flags)
|
|||
|
||||
void dbg_dump_dds_caps(DWORD caps)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
#ifdef _DEBUG_X
|
||||
if (caps & DDSCAPS_RESERVED1) {
|
||||
TRACE(" DDSCAPS_RESERVED1\n");
|
||||
}
|
||||
|
|
@ -961,7 +419,7 @@ void dbg_dump_dds_caps(DWORD caps)
|
|||
|
||||
void dbg_dump_dds_flags(DWORD flags)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
#ifdef _DEBUG_X
|
||||
if (flags & DDSD_CAPS) {
|
||||
TRACE(" DDSD_CAPS\n");
|
||||
}
|
||||
|
|
@ -1091,111 +549,6 @@ void dbg_dump_dds_lock_flags(DWORD flags)
|
|||
#endif
|
||||
}
|
||||
|
||||
void dbg_dump_di_scm_flags(DWORD flags)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
if (flags & DISCL_EXCLUSIVE) {
|
||||
TRACE(" DISCL_EXCLUSIVE\n");
|
||||
}
|
||||
if (flags & DISCL_NONEXCLUSIVE) {
|
||||
TRACE(" DISCL_NONEXCLUSIVE\n");
|
||||
}
|
||||
if (flags & DISCL_FOREGROUND) {
|
||||
TRACE(" DISCL_FOREGROUND\n");
|
||||
}
|
||||
if (flags & DISCL_BACKGROUND) {
|
||||
TRACE(" DISCL_BACKGROUND\n");
|
||||
}
|
||||
if (flags & DISCL_NOWINKEY) {
|
||||
TRACE(" DISCL_NOWINKEY\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void dbg_dump_hook_type(int idHook)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
if (idHook == 0) {
|
||||
TRACE(" WH_JOURNALRECORD\n");
|
||||
}
|
||||
if (idHook == 1) {
|
||||
TRACE(" WH_JOURNALPLAYBACK\n");
|
||||
}
|
||||
if (idHook == 2) {
|
||||
TRACE(" WH_KEYBOARD\n");
|
||||
}
|
||||
if (idHook == 3) {
|
||||
TRACE(" WH_GETMESSAGE\n");
|
||||
}
|
||||
if (idHook == 4) {
|
||||
TRACE(" WH_CALLWNDPROC\n");
|
||||
}
|
||||
if (idHook == 5) {
|
||||
TRACE(" WH_CBT\n");
|
||||
}
|
||||
if (idHook == 6) {
|
||||
TRACE(" WH_SYSMSGFILTER\n");
|
||||
}
|
||||
if (idHook == 7) {
|
||||
TRACE(" WH_MOUSE\n");
|
||||
}
|
||||
if (idHook == 9) {
|
||||
TRACE(" WH_DEBUG\n");
|
||||
}
|
||||
if (idHook == 10) {
|
||||
TRACE(" WH_SHELL\n");
|
||||
}
|
||||
if (idHook == 11) {
|
||||
TRACE(" WH_FOREGROUNDIDLE\n");
|
||||
}
|
||||
if (idHook == 12) {
|
||||
TRACE(" WH_CALLWNDPROCRET\n");
|
||||
}
|
||||
if (idHook == 13) {
|
||||
TRACE(" WH_KEYBOARD_LL\n");
|
||||
}
|
||||
if (idHook == 14) {
|
||||
TRACE(" WH_MOUSE_LL\n");
|
||||
}
|
||||
if (idHook == -1) {
|
||||
TRACE(" WH_MSGFILTER\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
char* dbg_d3d9_hr_to_str(HRESULT hr)
|
||||
{
|
||||
#define HR_TO_STR(x) if (x == hr) return #x
|
||||
|
||||
HR_TO_STR(D3D_OK);
|
||||
|
||||
HR_TO_STR(D3DERR_WRONGTEXTUREFORMAT);
|
||||
HR_TO_STR(D3DERR_UNSUPPORTEDCOLOROPERATION);
|
||||
HR_TO_STR(D3DERR_UNSUPPORTEDCOLORARG);
|
||||
HR_TO_STR(D3DERR_UNSUPPORTEDALPHAOPERATION);
|
||||
HR_TO_STR(D3DERR_UNSUPPORTEDALPHAARG);
|
||||
HR_TO_STR(D3DERR_TOOMANYOPERATIONS);
|
||||
HR_TO_STR(D3DERR_CONFLICTINGTEXTUREFILTER);
|
||||
HR_TO_STR(D3DERR_UNSUPPORTEDFACTORVALUE);
|
||||
HR_TO_STR(D3DERR_CONFLICTINGRENDERSTATE);
|
||||
HR_TO_STR(D3DERR_UNSUPPORTEDTEXTUREFILTER);
|
||||
HR_TO_STR(D3DERR_CONFLICTINGTEXTUREPALETTE);
|
||||
HR_TO_STR(D3DERR_DRIVERINTERNALERROR);
|
||||
|
||||
HR_TO_STR(D3DERR_NOTFOUND);
|
||||
HR_TO_STR(D3DERR_MOREDATA);
|
||||
HR_TO_STR(D3DERR_DEVICELOST);
|
||||
HR_TO_STR(D3DERR_DEVICENOTRESET);
|
||||
HR_TO_STR(D3DERR_NOTAVAILABLE);
|
||||
HR_TO_STR(D3DERR_OUTOFVIDEOMEMORY);
|
||||
HR_TO_STR(D3DERR_INVALIDDEVICE);
|
||||
HR_TO_STR(D3DERR_INVALIDCALL);
|
||||
HR_TO_STR(D3DERR_DRIVERINVALIDCALL);
|
||||
HR_TO_STR(D3DERR_WASSTILLDRAWING);
|
||||
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
char* dbg_mes_to_str(int id)
|
||||
{
|
||||
switch (id)
|
||||
|
|
@ -1279,13 +632,6 @@ char* dbg_mes_to_str(int id)
|
|||
case 134: return "WM_NCACTIVATE";
|
||||
case 135: return "WM_GETDLGCODE";
|
||||
case 136: return "WM_SYNCPAINT";
|
||||
case 144: return "WM_UAHDESTROYWINDOW";
|
||||
case 145: return "WM_UAHDRAWMENU";
|
||||
case 146: return "WM_UAHDRAWMENUITEM";
|
||||
case 147: return "WM_UAHINITMENU";
|
||||
case 148: return "WM_UAHMEASUREMENUITEM";
|
||||
case 149: return "WM_UAHNCPAINTMENUPOPUP";
|
||||
case 150: return "WM_UAHUPDATE";
|
||||
case 160: return "WM_NCMOUSEMOVE";
|
||||
case 161: return "WM_NCLBUTTONDOWN";
|
||||
case 162: return "WM_NCLBUTTONUP";
|
||||
|
|
@ -1452,8 +798,6 @@ char* dbg_mes_to_str(int id)
|
|||
case 673: return "WM_MOUSEHOVER";
|
||||
case 674: return "WM_NCMOUSELEAVE";
|
||||
case 675: return "WM_MOUSELEAVE";
|
||||
case 736: return "WM_DPICHANGED";
|
||||
case 740: return "WM_GETDPISCALEDSIZE";
|
||||
case 768: return "WM_CUT";
|
||||
case 769: return "WM_COPY";
|
||||
case 770: return "WM_PASTE";
|
||||
|
|
@ -1875,14 +1219,6 @@ char* dbg_mes_to_str(int id)
|
|||
case 8720: return "OCM_PARENTNOTIFY";
|
||||
case 32768: return "WM_APP";
|
||||
case 52429: return "WM_RASDIALEVENT";
|
||||
case WM_DISPLAYCHANGE_DDRAW: return "WM_DISPLAYCHANGE_DDRAW";
|
||||
case WM_SIZE_DDRAW: return "WM_SIZE_DDRAW";
|
||||
case WM_MOVE_DDRAW: return "WM_MOVE_DDRAW";
|
||||
case WM_D3D9DEVICELOST: return "WM_D3D9DEVICELOST";
|
||||
case WM_WINEFULLSCREEN: return "WM_WINEFULLSCREEN";
|
||||
case WM_AUTORENDERER: return "WM_AUTORENDERER";
|
||||
case WM_TOGGLE_FULLSCREEN: return "WM_TOGGLE_FULLSCREEN";
|
||||
case WM_TOGGLE_MAXIMIZE: return "WM_TOGGLE_MAXIMIZE";
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -1,30 +0,0 @@
|
|||
#include <windows.h>
|
||||
#include "versionhelpers.h"
|
||||
#include "delay_imports.h"
|
||||
|
||||
NTQUERYINFORMATIONTHREADPROC delay_NtQueryInformationThread;
|
||||
RTLVERIFYVERSIONINFOPROC delay_RtlVerifyVersionInfo;
|
||||
WINE_GET_VERSIONPROC delay_wine_get_version;
|
||||
WINE_GET_HOST_VERSIONPROC delay_wine_get_host_version;
|
||||
|
||||
VERSETCONDITIONMASKPROC delay_VerSetConditionMask;
|
||||
GETMODULEHANDLEEXAPROC delay_GetModuleHandleExA;
|
||||
|
||||
void delay_imports_init()
|
||||
{
|
||||
HMODULE mod = GetModuleHandleA("ntdll.dll");
|
||||
if (mod)
|
||||
{
|
||||
delay_NtQueryInformationThread = (NTQUERYINFORMATIONTHREADPROC)GetProcAddress(mod, "NtQueryInformationThread");
|
||||
delay_RtlVerifyVersionInfo = (RTLVERIFYVERSIONINFOPROC)GetProcAddress(mod, "RtlVerifyVersionInfo");
|
||||
delay_wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version");
|
||||
delay_wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version");
|
||||
}
|
||||
|
||||
mod = GetModuleHandleA("Kernel32.dll");
|
||||
if (mod)
|
||||
{
|
||||
delay_VerSetConditionMask = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask");
|
||||
delay_GetModuleHandleExA = (GETMODULEHANDLEEXAPROC)GetProcAddress(mod, "GetModuleHandleExA");
|
||||
}
|
||||
}
|
||||
|
|
@ -1,18 +1,11 @@
|
|||
|
||||
#include <windows.h>
|
||||
#include <initguid.h>
|
||||
#include "directinput.h"
|
||||
#include "debug.h"
|
||||
#include "hook.h"
|
||||
#include "dd.h"
|
||||
#include "mouse.h"
|
||||
#include "config.h"
|
||||
#include "utils.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include "detours.h"
|
||||
#endif
|
||||
|
||||
BOOL g_dinput_hook_active;
|
||||
|
||||
DIRECTINPUTCREATEAPROC real_DirectInputCreateA;
|
||||
DIRECTINPUTCREATEWPROC real_DirectInputCreateW;
|
||||
|
|
@ -24,20 +17,10 @@ static DICREATEDEVICEEXPROC real_di_CreateDeviceEx;
|
|||
static DIDSETCOOPERATIVELEVELPROC real_did_SetCooperativeLevel;
|
||||
static DIDGETDEVICEDATAPROC real_did_GetDeviceData;
|
||||
static DIDGETDEVICESTATEPROC real_did_GetDeviceState;
|
||||
|
||||
static PROC* g_di_CreateDevice_vtbl_addr;
|
||||
static PROC* g_di_CreateDeviceEx_vtbl_addr;
|
||||
static PROC* g_did_SetCooperativeLevel_vtbl_addr;
|
||||
static PROC* g_did_GetDeviceData_vtbl_addr;
|
||||
static PROC* g_did_GetDeviceState_vtbl_addr;
|
||||
|
||||
static LPDIRECTINPUTDEVICEA g_mouse_device;
|
||||
|
||||
static PROC hook_func(PROC* org_func, PROC new_func)
|
||||
{
|
||||
if (!org_func || !new_func)
|
||||
return 0;
|
||||
|
||||
PROC org = *org_func;
|
||||
DWORD old_protect;
|
||||
|
||||
|
|
@ -54,18 +37,16 @@ static PROC hook_func(PROC* org_func, PROC new_func)
|
|||
|
||||
static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HWND hwnd, DWORD dwFlags)
|
||||
{
|
||||
TRACE("DirectInput SetCooperativeLevel(This=%p, hwnd=%p, dwFlags=0x%08X) [%p]\n", This, hwnd, dwFlags, _ReturnAddress());
|
||||
TRACE(" mouse_device = %s\n", This == g_mouse_device ? "TRUE" : "FALSE");
|
||||
dbg_dump_di_scm_flags(dwFlags);
|
||||
TRACE("DirectInput SetCooperativeLevel\n");
|
||||
|
||||
if (This == g_mouse_device && (dwFlags & DISCL_EXCLUSIVE))
|
||||
if (This == g_mouse_device && g_ddraw && (dwFlags & DISCL_EXCLUSIVE))
|
||||
{
|
||||
if (g_mouse_locked || g_config.devmode || !g_ddraw.ref)
|
||||
if (g_ddraw->locked || g_ddraw->devmode)
|
||||
{
|
||||
while (real_ShowCursor(FALSE) >= 0);
|
||||
}
|
||||
|
||||
InterlockedExchange((LONG*)&g_ddraw.show_cursor_count, -1);
|
||||
InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, -1);
|
||||
}
|
||||
|
||||
return real_did_SetCooperativeLevel(This, hwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);
|
||||
|
|
@ -78,25 +59,13 @@ static HRESULT WINAPI fake_did_GetDeviceData(
|
|||
LPDWORD pdwInOut,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
/*
|
||||
TRACE(
|
||||
"DirectInput GetDeviceData(This=%p, cbObjectData=%lu, rgdod=%p, pdwInOut=%p, dwFlags=%lu) [%p]\n",
|
||||
This,
|
||||
cbObjectData,
|
||||
rgdod,
|
||||
pdwInOut,
|
||||
dwFlags,
|
||||
_ReturnAddress());
|
||||
*/
|
||||
|
||||
BOOL block_mouse = This == g_mouse_device && !g_mouse_locked && !g_config.devmode;
|
||||
BOOL in_background = FALSE;//g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground(g_ddraw.hwnd);
|
||||
//TRACE("DirectInput GetDeviceData\n");
|
||||
|
||||
HRESULT result = real_did_GetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags);
|
||||
|
||||
if (SUCCEEDED(result))
|
||||
if (SUCCEEDED(result) && g_ddraw && !g_ddraw->locked)
|
||||
{
|
||||
if ((block_mouse || in_background) && pdwInOut)
|
||||
if (pdwInOut)
|
||||
{
|
||||
if (rgdod && *pdwInOut > 0 && cbObjectData > 0)
|
||||
{
|
||||
|
|
@ -112,16 +81,13 @@ static HRESULT WINAPI fake_did_GetDeviceData(
|
|||
|
||||
static HRESULT WINAPI fake_did_GetDeviceState(IDirectInputDeviceA* This, DWORD cbData, LPVOID lpvData)
|
||||
{
|
||||
//TRACE("DirectInput GetDeviceState(This=%p, cbData=%lu, lpvData=%p) [%p]\n", This, cbData, lpvData, _ReturnAddress());
|
||||
|
||||
BOOL block_mouse = This == g_mouse_device && !g_mouse_locked && !g_config.devmode;
|
||||
BOOL in_background = g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground(g_ddraw.hwnd);
|
||||
//TRACE("DirectInput GetDeviceState\n");
|
||||
|
||||
HRESULT result = real_did_GetDeviceState(This, cbData, lpvData);
|
||||
|
||||
if (SUCCEEDED(result))
|
||||
if (SUCCEEDED(result) && g_ddraw && !g_ddraw->locked)
|
||||
{
|
||||
if ((block_mouse || in_background) && cbData > 0 && lpvData)
|
||||
if (cbData > 0 && lpvData)
|
||||
{
|
||||
memset(lpvData, 0, cbData);
|
||||
}
|
||||
|
|
@ -136,38 +102,30 @@ static HRESULT WINAPI fake_di_CreateDevice(
|
|||
LPDIRECTINPUTDEVICEA* lplpDIDevice,
|
||||
LPUNKNOWN pUnkOuter)
|
||||
{
|
||||
TRACE("DirectInput CreateDevice [%p]\n", _ReturnAddress());
|
||||
TRACE("DirectInput CreateDevice\n");
|
||||
|
||||
HRESULT result = real_di_CreateDevice(This, rguid, lplpDIDevice, pUnkOuter);
|
||||
|
||||
if (SUCCEEDED(result))
|
||||
{
|
||||
if (rguid)
|
||||
if (rguid && IsEqualGUID(&GUID_SysMouse, rguid))
|
||||
{
|
||||
TRACE(" GUID = %08X\n", ((GUID*)rguid)->Data1);
|
||||
|
||||
if (IsEqualGUID(&GUID_SysMouse, rguid))
|
||||
{
|
||||
g_mouse_device = *lplpDIDevice;
|
||||
}
|
||||
g_mouse_device = *lplpDIDevice;
|
||||
}
|
||||
|
||||
if (!real_did_SetCooperativeLevel)
|
||||
{
|
||||
g_did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel;
|
||||
|
||||
real_did_SetCooperativeLevel =
|
||||
(DIDSETCOOPERATIVELEVELPROC)hook_func(g_did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel);
|
||||
|
||||
g_did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData;
|
||||
(DIDSETCOOPERATIVELEVELPROC)hook_func(
|
||||
(PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel, (PROC)fake_did_SetCooperativeLevel);
|
||||
|
||||
real_did_GetDeviceData =
|
||||
(DIDGETDEVICEDATAPROC)hook_func(g_did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData);
|
||||
|
||||
g_did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState;
|
||||
(DIDGETDEVICEDATAPROC)hook_func(
|
||||
(PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData, (PROC)fake_did_GetDeviceData);
|
||||
|
||||
real_did_GetDeviceState =
|
||||
(DIDGETDEVICESTATEPROC)hook_func(g_did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState);
|
||||
(DIDGETDEVICESTATEPROC)hook_func(
|
||||
(PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState, (PROC)fake_did_GetDeviceState);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -181,38 +139,30 @@ static HRESULT WINAPI fake_di_CreateDeviceEx(
|
|||
LPDIRECTINPUTDEVICEA* lplpDIDevice,
|
||||
LPUNKNOWN pUnkOuter)
|
||||
{
|
||||
TRACE("DirectInput CreateDeviceEx [%p]\n", _ReturnAddress());
|
||||
TRACE("DirectInput CreateDeviceEx\n");
|
||||
|
||||
HRESULT result = real_di_CreateDeviceEx(This, rguid, riid, lplpDIDevice, pUnkOuter);
|
||||
|
||||
if (SUCCEEDED(result))
|
||||
{
|
||||
if (rguid)
|
||||
if (rguid && IsEqualGUID(&GUID_SysMouse, rguid))
|
||||
{
|
||||
TRACE(" GUID = %08X\n", ((GUID*)rguid)->Data1);
|
||||
|
||||
if (IsEqualGUID(&GUID_SysMouse, rguid))
|
||||
{
|
||||
g_mouse_device = *lplpDIDevice;
|
||||
}
|
||||
g_mouse_device = *lplpDIDevice;
|
||||
}
|
||||
|
||||
if (!real_did_SetCooperativeLevel)
|
||||
{
|
||||
g_did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel;
|
||||
|
||||
real_did_SetCooperativeLevel =
|
||||
(DIDSETCOOPERATIVELEVELPROC)hook_func(g_did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel);
|
||||
|
||||
g_did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData;
|
||||
(DIDSETCOOPERATIVELEVELPROC)hook_func(
|
||||
(PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel, (PROC)fake_did_SetCooperativeLevel);
|
||||
|
||||
real_did_GetDeviceData =
|
||||
(DIDGETDEVICEDATAPROC)hook_func(g_did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData);
|
||||
|
||||
g_did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState;
|
||||
(DIDGETDEVICEDATAPROC)hook_func(
|
||||
(PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData, (PROC)fake_did_GetDeviceData);
|
||||
|
||||
real_did_GetDeviceState =
|
||||
(DIDGETDEVICESTATEPROC)hook_func(g_did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState);
|
||||
(DIDGETDEVICESTATEPROC)hook_func(
|
||||
(PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState, (PROC)fake_did_GetDeviceState);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -225,19 +175,17 @@ HRESULT WINAPI fake_DirectInputCreateA(
|
|||
LPDIRECTINPUTA* lplpDirectInput,
|
||||
LPUNKNOWN punkOuter)
|
||||
{
|
||||
TRACE("DirectInputCreateA [%p]\n", _ReturnAddress());
|
||||
TRACE("DirectInputCreateA\n");
|
||||
|
||||
if (!real_DirectInputCreateA)
|
||||
{
|
||||
real_DirectInputCreateA =
|
||||
(DIRECTINPUTCREATEAPROC)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateA");
|
||||
(DIRECTINPUTCREATEAPROC)GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateA");
|
||||
|
||||
if (real_DirectInputCreateA == fake_DirectInputCreateA)
|
||||
{
|
||||
real_DirectInputCreateA =
|
||||
(DIRECTINPUTCREATEAPROC)real_GetProcAddress(
|
||||
real_LoadLibraryA("system32\\dinput.dll"),
|
||||
"DirectInputCreateA");
|
||||
(DIRECTINPUTCREATEAPROC)GetProcAddress(LoadLibraryA("system32\\dinput.dll"), "DirectInputCreateA");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -246,12 +194,10 @@ HRESULT WINAPI fake_DirectInputCreateA(
|
|||
|
||||
HRESULT result = real_DirectInputCreateA(hinst, dwVersion, lplpDirectInput, punkOuter);
|
||||
|
||||
if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook)
|
||||
if (SUCCEEDED(result) && !real_di_CreateDevice)
|
||||
{
|
||||
g_di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice;
|
||||
|
||||
real_di_CreateDevice =
|
||||
(DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice);
|
||||
(DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
@ -263,19 +209,17 @@ HRESULT WINAPI fake_DirectInputCreateW(
|
|||
LPDIRECTINPUTW* lplpDirectInput,
|
||||
LPUNKNOWN punkOuter)
|
||||
{
|
||||
TRACE("DirectInputCreateW [%p]\n", _ReturnAddress());
|
||||
TRACE("DirectInputCreateW\n");
|
||||
|
||||
if (!real_DirectInputCreateW)
|
||||
{
|
||||
real_DirectInputCreateW =
|
||||
(DIRECTINPUTCREATEWPROC)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateW");
|
||||
(DIRECTINPUTCREATEWPROC)GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateW");
|
||||
|
||||
if (real_DirectInputCreateW == fake_DirectInputCreateW)
|
||||
{
|
||||
real_DirectInputCreateW =
|
||||
(DIRECTINPUTCREATEWPROC)real_GetProcAddress(
|
||||
real_LoadLibraryA("system32\\dinput.dll"),
|
||||
"DirectInputCreateW");
|
||||
(DIRECTINPUTCREATEWPROC)GetProcAddress(LoadLibraryA("system32\\dinput.dll"), "DirectInputCreateW");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -284,12 +228,10 @@ HRESULT WINAPI fake_DirectInputCreateW(
|
|||
|
||||
HRESULT result = real_DirectInputCreateW(hinst, dwVersion, lplpDirectInput, punkOuter);
|
||||
|
||||
if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook)
|
||||
if (SUCCEEDED(result) && !real_di_CreateDevice)
|
||||
{
|
||||
g_di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice;
|
||||
|
||||
real_di_CreateDevice =
|
||||
(DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice);
|
||||
(DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
@ -302,19 +244,17 @@ HRESULT WINAPI fake_DirectInputCreateEx(
|
|||
LPDIRECTINPUT7A* ppvOut,
|
||||
LPUNKNOWN punkOuter)
|
||||
{
|
||||
TRACE("DirectInputCreateEx [%p]\n", _ReturnAddress());
|
||||
TRACE("DirectInputCreateEx\n");
|
||||
|
||||
if (!real_DirectInputCreateEx)
|
||||
{
|
||||
real_DirectInputCreateEx =
|
||||
(DIRECTINPUTCREATEEXPROC)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateEx");
|
||||
(DIRECTINPUTCREATEEXPROC)GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateEx");
|
||||
|
||||
if (real_DirectInputCreateEx == fake_DirectInputCreateEx)
|
||||
{
|
||||
real_DirectInputCreateEx =
|
||||
(DIRECTINPUTCREATEEXPROC)real_GetProcAddress(
|
||||
real_LoadLibraryA("system32\\dinput.dll"),
|
||||
"DirectInputCreateEx");
|
||||
(DIRECTINPUTCREATEEXPROC)GetProcAddress(LoadLibraryA("system32\\dinput.dll"), "DirectInputCreateEx");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -323,24 +263,19 @@ HRESULT WINAPI fake_DirectInputCreateEx(
|
|||
|
||||
HRESULT result = real_DirectInputCreateEx(hinst, dwVersion, riidltf, ppvOut, punkOuter);
|
||||
|
||||
if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook)
|
||||
if (SUCCEEDED(result) && !real_di_CreateDevice)
|
||||
{
|
||||
g_di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice;
|
||||
|
||||
real_di_CreateDevice =
|
||||
(DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice);
|
||||
(DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice);
|
||||
}
|
||||
|
||||
if (SUCCEEDED(result) &&
|
||||
!real_di_CreateDeviceEx &&
|
||||
riidltf &&
|
||||
(IsEqualGUID(&IID_IDirectInput7A, riidltf) || IsEqualGUID(&IID_IDirectInput7W, riidltf))
|
||||
&& !g_config.no_dinput_hook)
|
||||
(IsEqualGUID(&IID_IDirectInput7A, riidltf) || IsEqualGUID(&IID_IDirectInput7W, riidltf)))
|
||||
{
|
||||
g_di_CreateDeviceEx_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx;
|
||||
|
||||
real_di_CreateDeviceEx =
|
||||
(DICREATEDEVICEEXPROC)hook_func(g_di_CreateDeviceEx_vtbl_addr, (PROC)fake_di_CreateDeviceEx);
|
||||
(DICREATEDEVICEEXPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx, (PROC)fake_di_CreateDeviceEx);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
@ -353,19 +288,17 @@ HRESULT WINAPI fake_DirectInput8Create(
|
|||
LPDIRECTINPUT8* ppvOut,
|
||||
LPUNKNOWN punkOuter)
|
||||
{
|
||||
TRACE("DirectInput8Create [%p]\n", _ReturnAddress());
|
||||
TRACE("DirectInput8Create\n");
|
||||
|
||||
if (!real_DirectInput8Create)
|
||||
{
|
||||
real_DirectInput8Create =
|
||||
(DIRECTINPUT8CREATEPROC)real_GetProcAddress(real_LoadLibraryA("dinput8.dll"), "DirectInput8Create");
|
||||
(DIRECTINPUT8CREATEPROC)GetProcAddress(GetModuleHandle("dinput8.dll"), "DirectInput8Create");
|
||||
|
||||
if (real_DirectInput8Create == fake_DirectInput8Create)
|
||||
{
|
||||
real_DirectInput8Create =
|
||||
(DIRECTINPUT8CREATEPROC)real_GetProcAddress(
|
||||
real_LoadLibraryA("system32\\dinput8.dll"),
|
||||
"DirectInput8Create");
|
||||
(DIRECTINPUT8CREATEPROC)GetProcAddress(LoadLibraryA("system32\\dinput8.dll"), "DirectInput8Create");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -374,111 +307,11 @@ HRESULT WINAPI fake_DirectInput8Create(
|
|||
|
||||
HRESULT result = real_DirectInput8Create(hinst, dwVersion, riidltf, ppvOut, punkOuter);
|
||||
|
||||
if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook)
|
||||
if (SUCCEEDED(result) && !real_di_CreateDevice)
|
||||
{
|
||||
g_di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice;
|
||||
|
||||
real_di_CreateDevice =
|
||||
(DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice);
|
||||
(DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void dinput_hook_init()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
if (!g_dinput_hook_active)
|
||||
{
|
||||
g_dinput_hook_active = TRUE;
|
||||
|
||||
real_DirectInputCreateA = (void*)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateA");
|
||||
|
||||
if (real_DirectInputCreateA && real_DirectInputCreateA != fake_DirectInputCreateA)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach((PVOID*)&real_DirectInputCreateA, (PVOID)fake_DirectInputCreateA);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
/* Being called from winmm for some reason
|
||||
real_DirectInputCreateW = (void*)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateW");
|
||||
|
||||
if (real_DirectInputCreateW && real_DirectInputCreateW != fake_DirectInputCreateW)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach((PVOID*)&real_DirectInputCreateW, (PVOID)fake_DirectInputCreateW);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
*/
|
||||
real_DirectInputCreateEx = (void*)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateEx");
|
||||
|
||||
if (real_DirectInputCreateEx && real_DirectInputCreateEx != fake_DirectInputCreateEx)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach((PVOID*)&real_DirectInputCreateEx, (PVOID)fake_DirectInputCreateEx);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
real_DirectInput8Create = (void*)real_GetProcAddress(real_LoadLibraryA("dinput8.dll"), "DirectInput8Create");
|
||||
|
||||
if (real_DirectInput8Create && real_DirectInput8Create != fake_DirectInput8Create)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach((PVOID*)&real_DirectInput8Create, (PVOID)fake_DirectInput8Create);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void dinput_hook_exit()
|
||||
{
|
||||
hook_func(g_di_CreateDevice_vtbl_addr, (PROC)real_di_CreateDevice);
|
||||
hook_func(g_di_CreateDeviceEx_vtbl_addr, (PROC)real_di_CreateDeviceEx);
|
||||
hook_func(g_did_SetCooperativeLevel_vtbl_addr, (PROC)real_did_SetCooperativeLevel);
|
||||
hook_func(g_did_GetDeviceData_vtbl_addr, (PROC)real_did_GetDeviceData);
|
||||
hook_func(g_did_GetDeviceState_vtbl_addr, (PROC)real_did_GetDeviceState);
|
||||
|
||||
#ifdef _MSC_VER
|
||||
if (g_dinput_hook_active)
|
||||
{
|
||||
if (real_DirectInputCreateA)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourDetach((PVOID*)&real_DirectInputCreateA, (PVOID)fake_DirectInputCreateA);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
/* Being called from winmm for some reason
|
||||
if (real_DirectInputCreateW)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourDetach((PVOID*)&real_DirectInputCreateW, (PVOID)fake_DirectInputCreateW);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
*/
|
||||
if (real_DirectInputCreateEx)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourDetach((PVOID*)&real_DirectInputCreateEx, (PVOID)fake_DirectInputCreateEx);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
if (real_DirectInput8Create)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourDetach((PVOID*)&real_DirectInput8Create, (PVOID)fake_DirectInput8Create);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
g_dinput_hook_active = FALSE;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
252
src/dllmain.c
252
src/dllmain.c
|
|
@ -2,18 +2,12 @@
|
|||
#include "ddraw.h"
|
||||
#include <stdio.h>
|
||||
#include "dllmain.h"
|
||||
#include "directinput.h"
|
||||
#include "IDirectDraw.h"
|
||||
#include "dd.h"
|
||||
#include "ddclipper.h"
|
||||
#include "debug.h"
|
||||
#include "config.h"
|
||||
#include "hook.h"
|
||||
#include "indeo.h"
|
||||
#include "utils.h"
|
||||
#include "versionhelpers.h"
|
||||
#include "delay_imports.h"
|
||||
#include "keyboard.h"
|
||||
|
||||
|
||||
/* export for cncnet cnc games */
|
||||
|
|
@ -24,7 +18,6 @@ PVOID FakePrimarySurface;
|
|||
|
||||
|
||||
HMODULE g_ddraw_module;
|
||||
static BOOL g_screensaver_disabled;
|
||||
|
||||
BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
|
||||
{
|
||||
|
|
@ -32,61 +25,33 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
|
|||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
{
|
||||
g_ddraw_module = hDll;
|
||||
|
||||
delay_imports_init();
|
||||
|
||||
if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0))
|
||||
{
|
||||
cfg_load();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
#if _DEBUG
|
||||
dbg_init();
|
||||
g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler);
|
||||
TRACE("cnc-ddraw = %p\n", hDll);
|
||||
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler);
|
||||
#endif
|
||||
|
||||
cfg_load();
|
||||
|
||||
PVOID(WINAPI * add_handler)(ULONG, PVECTORED_EXCEPTION_HANDLER) =
|
||||
(void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "AddVectoredExceptionHandler");
|
||||
|
||||
if (add_handler)
|
||||
{
|
||||
g_dbg_exception_handle = add_handler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler);
|
||||
}
|
||||
g_ddraw_module = hDll;
|
||||
|
||||
char buf[1024];
|
||||
|
||||
if (GetEnvironmentVariable("__COMPAT_LAYER", buf, sizeof(buf)))
|
||||
{
|
||||
TRACE("__COMPAT_LAYER = %s\n", buf);
|
||||
|
||||
char* s = strtok(buf, " ");
|
||||
|
||||
while (s)
|
||||
{
|
||||
/* Workaround for bug in Windows 11 (Steam RA2 crash) */
|
||||
if (_strcmpi(s, "Win7RTM") == 0)
|
||||
{
|
||||
g_config.d3d9on12 = TRUE;
|
||||
}
|
||||
|
||||
if (_strcmpi(s, "WIN95") == 0 || _strcmpi(s, "WIN98") == 0 || _strcmpi(s, "NT4SP5") == 0)
|
||||
{
|
||||
char mes[280] = { 0 };
|
||||
char mes[128] = { 0 };
|
||||
|
||||
_snprintf(
|
||||
mes,
|
||||
sizeof(mes) - 1,
|
||||
"Warning: Compatibility modes detected. \n\nIf there are issues with the game then try to "
|
||||
"disable the '%s' compatibility mode for all game executables.\n\n"
|
||||
"Note: You can disable this warning via ddraw.ini -> 'no_compat_warning=true'",
|
||||
sizeof(mes),
|
||||
"Please disable the '%s' compatibility mode for all game executables and "
|
||||
"then try to start the game again.",
|
||||
s);
|
||||
|
||||
if (!g_config.no_compat_warning)
|
||||
MessageBoxA(NULL, mes, "Compatibility modes detected - cnc-ddraw", MB_OK);
|
||||
MessageBoxA(NULL, mes, "Compatibility modes detected - cnc-ddraw", MB_OK);
|
||||
|
||||
break;
|
||||
}
|
||||
|
|
@ -103,7 +68,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
|
|||
if (user32_dll)
|
||||
{
|
||||
SETPROCESSDPIAWARENESSCONTEXTPROC set_awareness_context =
|
||||
(SETPROCESSDPIAWARENESSCONTEXTPROC)real_GetProcAddress(user32_dll, "SetProcessDpiAwarenessContext");
|
||||
(SETPROCESSDPIAWARENESSCONTEXTPROC)GetProcAddress(user32_dll, "SetProcessDpiAwarenessContext");
|
||||
|
||||
if (set_awareness_context)
|
||||
{
|
||||
|
|
@ -114,7 +79,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
|
|||
if (!set_dpi_aware && shcore_dll)
|
||||
{
|
||||
SETPROCESSDPIAWERENESSPROC set_awareness =
|
||||
(SETPROCESSDPIAWERENESSPROC)real_GetProcAddress(shcore_dll, "SetProcessDpiAwareness");
|
||||
(SETPROCESSDPIAWERENESSPROC)GetProcAddress(shcore_dll, "SetProcessDpiAwareness");
|
||||
|
||||
if (set_awareness)
|
||||
{
|
||||
|
|
@ -127,166 +92,58 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
|
|||
if (!set_dpi_aware && user32_dll)
|
||||
{
|
||||
SETPROCESSDPIAWAREPROC set_aware =
|
||||
(SETPROCESSDPIAWAREPROC)real_GetProcAddress(user32_dll, "SetProcessDPIAware");
|
||||
(SETPROCESSDPIAWAREPROC)GetProcAddress(user32_dll, "SetProcessDPIAware");
|
||||
|
||||
if (set_aware)
|
||||
set_aware();
|
||||
}
|
||||
|
||||
/* Make sure screensaver will stay off and monitors will stay on */
|
||||
SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED);
|
||||
|
||||
/* WINE does not support SetThreadExecutionState so we'll have to use SPI_SETSCREENSAVEACTIVE instead */
|
||||
BOOL screensaver_enabled = FALSE;
|
||||
SystemParametersInfoA(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_enabled, 0);
|
||||
|
||||
if (screensaver_enabled)
|
||||
{
|
||||
SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);
|
||||
g_screensaver_disabled = TRUE;
|
||||
}
|
||||
|
||||
indeo_enable();
|
||||
timeBeginPeriod(1);
|
||||
hook_init();
|
||||
hook_early_init();
|
||||
break;
|
||||
}
|
||||
case DLL_PROCESS_DETACH:
|
||||
{
|
||||
if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0))
|
||||
return TRUE;
|
||||
|
||||
TRACE("cnc-ddraw DLL_PROCESS_DETACH\n");
|
||||
|
||||
cfg_save();
|
||||
|
||||
indeo_disable();
|
||||
timeEndPeriod(1);
|
||||
keyboard_hook_exit();
|
||||
dinput_hook_exit();
|
||||
hook_exit();
|
||||
|
||||
SetThreadExecutionState(ES_CONTINUOUS);
|
||||
|
||||
if (g_screensaver_disabled)
|
||||
{
|
||||
SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0);
|
||||
}
|
||||
|
||||
ULONG(WINAPI* remove_handler)(PVOID) =
|
||||
(void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "RemoveVectoredExceptionHandler");
|
||||
|
||||
if (g_dbg_exception_handle && remove_handler)
|
||||
remove_handler(g_dbg_exception_handle);
|
||||
|
||||
if (g_config.terminate_process == 2)
|
||||
TerminateProcess(GetCurrentProcess(), 0);
|
||||
|
||||
break;
|
||||
}
|
||||
case DLL_THREAD_ATTACH:
|
||||
{
|
||||
if (g_config.singlecpu && !IsWine() && IsWindows11Version24H2OrGreater())
|
||||
{
|
||||
util_set_thread_affinity(GetCurrentThreadId());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void DDEnableZoom()
|
||||
{
|
||||
TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress());
|
||||
|
||||
g_ddraw.zoom.enabled = TRUE;
|
||||
}
|
||||
|
||||
BOOL DDIsWindowed()
|
||||
{
|
||||
TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress());
|
||||
|
||||
return g_config.windowed && !g_config.fullscreen;
|
||||
}
|
||||
|
||||
FARPROC WINAPI DDGetProcAddress(HMODULE hModule, LPCSTR lpProcName)
|
||||
{
|
||||
TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress());
|
||||
|
||||
return real_GetProcAddress(hModule, lpProcName);
|
||||
}
|
||||
|
||||
HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnknown FAR* pUnkOuter)
|
||||
{
|
||||
TRACE("-> %s(lpGUID=%p, lplpDD=%p, pUnkOuter=%p) [%p]\n", __FUNCTION__, lpGUID, lplpDD, pUnkOuter, _ReturnAddress());
|
||||
|
||||
HRESULT ret;
|
||||
|
||||
if (util_caller_is_ddraw_wrapper(_ReturnAddress()) || g_config.flightsim98_hack)
|
||||
{
|
||||
if (lplpDD)
|
||||
*lplpDD = NULL;
|
||||
|
||||
ret = DDERR_GENERIC;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = dd_CreateEx(lpGUID, (LPVOID*)lplpDD, &IID_IDirectDraw, pUnkOuter);
|
||||
}
|
||||
|
||||
TRACE("-> %s(lpGUID=%p, lplpDD=%p, pUnkOuter=%p)\n", __FUNCTION__, lpGUID, lplpDD, pUnkOuter);
|
||||
HRESULT ret = dd_CreateEx(lpGUID, (LPVOID*)lplpDD, &IID_IDirectDraw, pUnkOuter);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT WINAPI DirectDrawCreateClipper(DWORD dwFlags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(dwFlags=%08X, DDClipper=%p, unkOuter=%p) [%p]\n",
|
||||
__FUNCTION__,
|
||||
(int)dwFlags,
|
||||
lplpDDClipper,
|
||||
pUnkOuter,
|
||||
_ReturnAddress());
|
||||
|
||||
TRACE("-> %s(dwFlags=%08X, DDClipper=%p, unkOuter=%p)\n", __FUNCTION__, (int)dwFlags, lplpDDClipper, pUnkOuter);
|
||||
HRESULT ret = dd_CreateClipper(dwFlags, (IDirectDrawClipperImpl**)lplpDDClipper, pUnkOuter);
|
||||
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT WINAPI DirectDrawCreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(lpGUID=%p, lplpDD=%p, riid=%08X, pUnkOuter=%p) [%p]\n",
|
||||
__FUNCTION__,
|
||||
lpGuid,
|
||||
lplpDD,
|
||||
iid,
|
||||
pUnkOuter,
|
||||
_ReturnAddress());
|
||||
|
||||
HRESULT ret;
|
||||
|
||||
if (util_caller_is_ddraw_wrapper(_ReturnAddress()) || g_config.flightsim98_hack)
|
||||
{
|
||||
if (lplpDD)
|
||||
*lplpDD = NULL;
|
||||
|
||||
ret = DDERR_GENERIC;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = dd_CreateEx(lpGuid, lplpDD, &IID_IDirectDraw7, pUnkOuter);
|
||||
}
|
||||
|
||||
TRACE("-> %s(lpGUID=%p, lplpDD=%p, riid=%08X, pUnkOuter=%p)\n", __FUNCTION__, lpGuid, lplpDD, iid, pUnkOuter);
|
||||
HRESULT ret = dd_CreateEx(lpGuid, lplpDD, &IID_IDirectDraw7, pUnkOuter);
|
||||
TRACE("<- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
HRESULT WINAPI DirectDrawEnumerateA(LPDDENUMCALLBACK lpCallback, LPVOID lpContext)
|
||||
{
|
||||
TRACE("-> %s(lpCallback=%p, lpContext=%p) [%p]\n", __FUNCTION__, lpCallback, lpContext, _ReturnAddress());
|
||||
TRACE("-> %s(lpCallback=%p, lpContext=%p)\n", __FUNCTION__, lpCallback, lpContext);
|
||||
|
||||
if (lpCallback)
|
||||
lpCallback(NULL, "Primary Display Driver", "display", lpContext);
|
||||
|
|
@ -297,13 +154,7 @@ HRESULT WINAPI DirectDrawEnumerateA(LPDDENUMCALLBACK lpCallback, LPVOID lpContex
|
|||
|
||||
HRESULT WINAPI DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d) [%p]\n",
|
||||
__FUNCTION__,
|
||||
lpCallback,
|
||||
lpContext,
|
||||
dwFlags,
|
||||
_ReturnAddress());
|
||||
TRACE("-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d)\n", __FUNCTION__, lpCallback, lpContext, dwFlags);
|
||||
|
||||
if (lpCallback)
|
||||
lpCallback(NULL, "Primary Display Driver", "display", lpContext, NULL);
|
||||
|
|
@ -314,12 +165,7 @@ HRESULT WINAPI DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA lpCallback, LPVOID lpC
|
|||
|
||||
HRESULT WINAPI DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags)
|
||||
{
|
||||
TRACE(
|
||||
"-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d) [%p]\n", __FUNCTION__,
|
||||
lpCallback,
|
||||
lpContext,
|
||||
dwFlags,
|
||||
_ReturnAddress());
|
||||
TRACE("-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d)\n", __FUNCTION__, lpCallback, lpContext, dwFlags);
|
||||
|
||||
if (lpCallback)
|
||||
lpCallback(NULL, L"Primary Display Driver", L"display", lpContext, NULL);
|
||||
|
|
@ -330,7 +176,7 @@ HRESULT WINAPI DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW lpCallback, LPVOID lpC
|
|||
|
||||
HRESULT WINAPI DirectDrawEnumerateW(LPDDENUMCALLBACKW lpCallback, LPVOID lpContext)
|
||||
{
|
||||
TRACE("-> %s(lpCallback=%p, lpContext=%p) [%p]\n", __FUNCTION__, lpCallback, lpContext, _ReturnAddress());
|
||||
TRACE("-> %s(lpCallback=%p, lpContext=%p)\n", __FUNCTION__, lpCallback, lpContext);
|
||||
|
||||
if (lpCallback)
|
||||
lpCallback(NULL, L"Primary Display Driver", L"display", lpContext);
|
||||
|
|
@ -341,7 +187,7 @@ HRESULT WINAPI DirectDrawEnumerateW(LPDDENUMCALLBACKW lpCallback, LPVOID lpConte
|
|||
|
||||
DWORD WINAPI CompleteCreateSysmemSurface(DWORD a)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__);
|
||||
DWORD ret = 0;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -349,7 +195,7 @@ DWORD WINAPI CompleteCreateSysmemSurface(DWORD a)
|
|||
|
||||
HRESULT WINAPI D3DParseUnknownCommand(LPVOID lpCmd, LPVOID* lpRetCmd)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s(lpCmd=%p, lpRetCmd=%p) [%p]\n", __FUNCTION__, lpCmd, lpRetCmd, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s(lpCmd=%p, lpRetCmd=%p)\n", __FUNCTION__, lpCmd, lpRetCmd);
|
||||
HRESULT ret = E_FAIL;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -357,7 +203,7 @@ HRESULT WINAPI D3DParseUnknownCommand(LPVOID lpCmd, LPVOID* lpRetCmd)
|
|||
|
||||
DWORD WINAPI AcquireDDThreadLock()
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__);
|
||||
DWORD ret = 0;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -365,7 +211,7 @@ DWORD WINAPI AcquireDDThreadLock()
|
|||
|
||||
DWORD WINAPI ReleaseDDThreadLock()
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__);
|
||||
DWORD ret = 0;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -373,7 +219,7 @@ DWORD WINAPI ReleaseDDThreadLock()
|
|||
|
||||
DWORD WINAPI DDInternalLock(DWORD a, DWORD b)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__);
|
||||
DWORD ret = 0;
|
||||
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
|
||||
return ret;
|
||||
|
|
@ -381,8 +227,50 @@ DWORD WINAPI DDInternalLock(DWORD a, DWORD b)
|
|||
|
||||
DWORD WINAPI DDInternalUnlock(DWORD a)
|
||||
{
|
||||
TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress());
|
||||
TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__);
|
||||
DWORD ret = 0;
|
||||
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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,23 +2,18 @@
|
|||
#include "fps_limiter.h"
|
||||
#include "dd.h"
|
||||
#include "debug.h"
|
||||
#include "hook.h"
|
||||
#include "config.h"
|
||||
#include "render_ogl.h"
|
||||
#include "versionhelpers.h"
|
||||
|
||||
|
||||
FPSLIMITER g_fpsl;
|
||||
|
||||
void fpsl_init()
|
||||
{
|
||||
int max_fps = g_config.maxfps;
|
||||
int max_fps = g_ddraw->render.maxfps;
|
||||
|
||||
g_fpsl.tick_length_ns = 0;
|
||||
g_fpsl.tick_length = 0;
|
||||
|
||||
if (max_fps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency)))
|
||||
max_fps = g_ddraw.mode.dmDisplayFrequency;
|
||||
if (max_fps < 0 || g_ddraw->vsync)
|
||||
max_fps = g_ddraw->mode.dmDisplayFrequency;
|
||||
|
||||
if (max_fps > 1000)
|
||||
max_fps = 0;
|
||||
|
|
@ -38,75 +33,62 @@ void fpsl_init()
|
|||
g_fpsl.D3DKMTCloseAdapter(&g_fpsl.close_adapter);
|
||||
}
|
||||
|
||||
if (!g_fpsl.cs_initialized)
|
||||
{
|
||||
g_fpsl.cs_initialized = TRUE;
|
||||
InitializeCriticalSection(&g_fpsl.cs);
|
||||
}
|
||||
|
||||
if (!g_fpsl.gdi32_dll)
|
||||
{
|
||||
g_fpsl.gdi32_dll = real_LoadLibraryA("gdi32.dll");
|
||||
g_fpsl.gdi32_dll = LoadLibraryA("gdi32.dll");
|
||||
}
|
||||
|
||||
if (!g_fpsl.dwmapi_dll)
|
||||
{
|
||||
g_fpsl.dwmapi_dll = real_LoadLibraryA("dwmapi.dll");
|
||||
g_fpsl.dwmapi_dll = LoadLibraryA("dwmapi.dll");
|
||||
}
|
||||
|
||||
if (!g_fpsl.DwmFlush)
|
||||
{
|
||||
g_fpsl.DwmFlush =
|
||||
(DWMFLUSHPROC)real_GetProcAddress(g_fpsl.dwmapi_dll, "DwmFlush");
|
||||
(DWMFLUSHPROC)GetProcAddress(g_fpsl.dwmapi_dll, "DwmFlush");
|
||||
}
|
||||
|
||||
if (!g_fpsl.DwmIsCompositionEnabled)
|
||||
{
|
||||
g_fpsl.DwmIsCompositionEnabled =
|
||||
(DWMISCOMPOSITIONENABLEDPROC)real_GetProcAddress(g_fpsl.dwmapi_dll, "DwmIsCompositionEnabled");
|
||||
(DWMISCOMPOSITIONENABLEDPROC)GetProcAddress(g_fpsl.dwmapi_dll, "DwmIsCompositionEnabled");
|
||||
}
|
||||
|
||||
if (!g_fpsl.D3DKMTWaitForVerticalBlankEvent)
|
||||
{
|
||||
g_fpsl.D3DKMTWaitForVerticalBlankEvent =
|
||||
(D3DKMTWAITFORVERTICALBLANKEVENTPROC)real_GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTWaitForVerticalBlankEvent");
|
||||
(D3DKMTWAITFORVERTICALBLANKEVENTPROC)GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTWaitForVerticalBlankEvent");
|
||||
}
|
||||
|
||||
if (!g_fpsl.D3DKMTOpenAdapterFromHdc)
|
||||
{
|
||||
g_fpsl.D3DKMTOpenAdapterFromHdc =
|
||||
(D3DKMTOPENADAPTERFROMHDCPROC)real_GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTOpenAdapterFromHdc");
|
||||
(D3DKMTOPENADAPTERFROMHDCPROC)GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTOpenAdapterFromHdc");
|
||||
}
|
||||
|
||||
if (!g_fpsl.D3DKMTCloseAdapter)
|
||||
{
|
||||
g_fpsl.D3DKMTCloseAdapter =
|
||||
(D3DKMTCLOSEADAPTERPROC)real_GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTCloseAdapter");
|
||||
(D3DKMTCLOSEADAPTERPROC)GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTCloseAdapter");
|
||||
}
|
||||
|
||||
g_fpsl.initialized = TRUE;
|
||||
}
|
||||
|
||||
BOOL fpsl_wait_for_vblank()
|
||||
BOOL fpsl_wait_for_vblank(BOOL open_adapter)
|
||||
{
|
||||
if (g_fpsl.initialized)
|
||||
{
|
||||
if (!g_fpsl.got_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && g_ddraw.render.hdc)
|
||||
if (open_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && !g_fpsl.got_adapter)
|
||||
{
|
||||
EnterCriticalSection(&g_fpsl.cs);
|
||||
g_fpsl.adapter.hDc = g_ddraw->render.hdc;
|
||||
|
||||
if (!g_fpsl.got_adapter)
|
||||
if (g_fpsl.D3DKMTOpenAdapterFromHdc(&g_fpsl.adapter) == 0)
|
||||
{
|
||||
g_fpsl.adapter.hDc = g_ddraw.render.hdc;
|
||||
|
||||
if (g_fpsl.D3DKMTOpenAdapterFromHdc(&g_fpsl.adapter) == 0)
|
||||
{
|
||||
g_fpsl.vblank_event.hAdapter = g_fpsl.adapter.hAdapter;
|
||||
g_fpsl.got_adapter = TRUE;
|
||||
}
|
||||
g_fpsl.vblank_event.hAdapter = g_fpsl.adapter.hAdapter;
|
||||
g_fpsl.got_adapter = TRUE;
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&g_fpsl.cs);
|
||||
}
|
||||
|
||||
if (g_fpsl.got_adapter && g_fpsl.D3DKMTWaitForVerticalBlankEvent)
|
||||
|
|
@ -120,12 +102,7 @@ BOOL fpsl_wait_for_vblank()
|
|||
|
||||
BOOL fpsl_dwm_flush()
|
||||
{
|
||||
if (g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush && !IsWine())
|
||||
{
|
||||
return SUCCEEDED(g_fpsl.DwmFlush());
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
return g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush && SUCCEEDED(g_fpsl.DwmFlush());
|
||||
}
|
||||
|
||||
BOOL fpsl_dwm_is_enabled()
|
||||
|
|
@ -146,27 +123,17 @@ void fpsl_frame_start()
|
|||
|
||||
void fpsl_frame_end()
|
||||
{
|
||||
if (g_config.maxfps < 0 ||
|
||||
(g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency)))
|
||||
if (g_ddraw->render.maxfps < 0 || g_ddraw->vsync)
|
||||
{
|
||||
/* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */
|
||||
if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater())
|
||||
{
|
||||
if (fpsl_wait_for_vblank())
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (fpsl_dwm_flush() || fpsl_wait_for_vblank())
|
||||
return;
|
||||
}
|
||||
if (fpsl_dwm_flush() || fpsl_wait_for_vblank(TRUE))
|
||||
return;
|
||||
}
|
||||
|
||||
if (g_fpsl.tick_length > 0)
|
||||
{
|
||||
if (g_fpsl.htimer)
|
||||
{
|
||||
if (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency))
|
||||
if (g_ddraw->vsync)
|
||||
{
|
||||
WaitForSingleObject(g_fpsl.htimer, g_fpsl.tick_length * 2);
|
||||
LARGE_INTEGER due_time = { .QuadPart = -g_fpsl.tick_length_ns };
|
||||
|
|
|
|||
554
src/hook.c
554
src/hook.c
|
|
@ -1,21 +1,21 @@
|
|||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <psapi.h>
|
||||
#include "directinput.h"
|
||||
#include "dd.h"
|
||||
#include "winapi_hooks.h"
|
||||
#include "hook.h"
|
||||
#include "debug.h"
|
||||
#include "dllmain.h"
|
||||
#include "config.h"
|
||||
#include "utils.h"
|
||||
#include "patch.h"
|
||||
#include "versionhelpers.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include "detours.h"
|
||||
#endif
|
||||
|
||||
BOOL g_hook_active;
|
||||
BOOL g_hook_dinput;
|
||||
int g_hook_method = 1;
|
||||
|
||||
GETCURSORPOSPROC real_GetCursorPos = GetCursorPos;
|
||||
CLIPCURSORPROC real_ClipCursor = ClipCursor;
|
||||
|
|
@ -40,50 +40,19 @@ CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA;
|
|||
DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow;
|
||||
MAPWINDOWPOINTSPROC real_MapWindowPoints = MapWindowPoints;
|
||||
SHOWWINDOWPROC real_ShowWindow = ShowWindow;
|
||||
GETTOPWINDOWPROC real_GetTopWindow = GetTopWindow;
|
||||
GETFOREGROUNDWINDOWPROC real_GetForegroundWindow = GetForegroundWindow;
|
||||
STRETCHBLTPROC real_StretchBlt = StretchBlt;
|
||||
BITBLTPROC real_BitBlt = BitBlt;
|
||||
SETDIBITSTODEVICEPROC real_SetDIBitsToDevice = SetDIBitsToDevice;
|
||||
STRETCHDIBITSPROC real_StretchDIBits = StretchDIBits;
|
||||
SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow;
|
||||
SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA;
|
||||
PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA;
|
||||
GETMESSAGEAPROC real_GetMessageA = GetMessageA;
|
||||
GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement;
|
||||
SETWINDOWPLACEMENTPROC real_SetWindowPlacement = SetWindowPlacement;
|
||||
ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA;
|
||||
DEFWINDOWPROCAPROC real_DefWindowProcA = DefWindowProcA;
|
||||
SETPARENTPROC real_SetParent = SetParent;
|
||||
BEGINPAINTPROC real_BeginPaint = BeginPaint;
|
||||
GETKEYSTATEPROC real_GetKeyState = GetKeyState;
|
||||
GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState;
|
||||
GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps;
|
||||
CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA;
|
||||
CREATEFONTAPROC real_CreateFontA = CreateFontA;
|
||||
GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries = GetSystemPaletteEntries;
|
||||
SELECTPALETTEPROC real_SelectPalette = SelectPalette;
|
||||
REALIZEPALETTEPROC real_RealizePalette = RealizePalette;
|
||||
LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA;
|
||||
LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW;
|
||||
LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA;
|
||||
LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW;
|
||||
GETPROCADDRESSPROC real_GetProcAddress = GetProcAddress;
|
||||
GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA;
|
||||
GETVERSIONPROC real_GetVersion = GetVersion;
|
||||
GETVERSIONEXAPROC real_GetVersionExA = GetVersionExA;
|
||||
COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance;
|
||||
MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA;
|
||||
SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter;
|
||||
AVISTREAMGETFRAMEOPENPROC real_AVIStreamGetFrameOpen = AVIStreamGetFrameOpen;
|
||||
|
||||
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
|
||||
SETWINDOWLONGWPROC real_SetWindowLongW = SetWindowLongW;
|
||||
#else
|
||||
SETWINDOWLONGWPROC real_SetWindowLongW;
|
||||
#endif
|
||||
|
||||
HOOKLIST g_hook_hooklist[] =
|
||||
static HOOKLIST g_hooks[] =
|
||||
{
|
||||
{
|
||||
"user32.dll",
|
||||
|
|
@ -92,8 +61,8 @@ HOOKLIST g_hook_hooklist[] =
|
|||
{ "ClipCursor", (PROC)fake_ClipCursor, (PROC*)&real_ClipCursor, 0 },
|
||||
{ "ShowCursor", (PROC)fake_ShowCursor, (PROC*)&real_ShowCursor, 0 },
|
||||
{ "SetCursor", (PROC)fake_SetCursor, (PROC*)&real_SetCursor, 0 },
|
||||
{ "GetWindowRect", (PROC)fake_GetWindowRect, (PROC*)&real_GetWindowRect, 0 },
|
||||
{ "GetClientRect", (PROC)fake_GetClientRect, (PROC*)&real_GetClientRect, 0 },
|
||||
{ "GetWindowRect", (PROC)fake_GetWindowRect, (PROC*)&real_GetWindowRect, SKIP_HOOK3 },
|
||||
{ "GetClientRect", (PROC)fake_GetClientRect, (PROC*)&real_GetClientRect, SKIP_HOOK3 },
|
||||
{ "ClientToScreen", (PROC)fake_ClientToScreen, (PROC*)&real_ClientToScreen, 0 },
|
||||
{ "ScreenToClient", (PROC)fake_ScreenToClient, (PROC*)&real_ScreenToClient, 0 },
|
||||
{ "SetCursorPos", (PROC)fake_SetCursorPos, (PROC*)&real_SetCursorPos, 0 },
|
||||
|
|
@ -111,104 +80,24 @@ HOOKLIST g_hook_hooklist[] =
|
|||
{ "DestroyWindow", (PROC)fake_DestroyWindow, (PROC*)&real_DestroyWindow, 0 },
|
||||
{ "MapWindowPoints", (PROC)fake_MapWindowPoints, (PROC*)&real_MapWindowPoints, 0 },
|
||||
{ "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow, 0 },
|
||||
{ "GetTopWindow", (PROC)fake_GetTopWindow, (PROC*)&real_GetTopWindow, 0 },
|
||||
{ "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 },
|
||||
{ "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 },
|
||||
{ "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 },
|
||||
{ "GetWindowPlacement", (PROC)fake_GetWindowPlacement, (PROC*)&real_GetWindowPlacement, 0 },
|
||||
{ "SetWindowPlacement", (PROC)fake_SetWindowPlacement, (PROC*)&real_SetWindowPlacement, 0 },
|
||||
{ "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 },
|
||||
{ "DefWindowProcA", (PROC)fake_DefWindowProcA, (PROC*)&real_DefWindowProcA, 0 },
|
||||
{ "SetParent", (PROC)fake_SetParent, (PROC*)&real_SetParent, 0 },
|
||||
{ "BeginPaint", (PROC)fake_BeginPaint, (PROC*)&real_BeginPaint, 0 },
|
||||
{ "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 },
|
||||
{ "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 },
|
||||
{ "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 },
|
||||
{ "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA, (PROC*)&real_SetWindowsHookExA, 0 },
|
||||
|
||||
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
|
||||
{ "SetWindowLongW", (PROC)fake_SetWindowLongW, (PROC*)&real_SetWindowLongW, 0 },
|
||||
#endif
|
||||
|
||||
{ "", NULL, NULL, 0 }
|
||||
}
|
||||
},
|
||||
{
|
||||
"ole32.dll",
|
||||
{
|
||||
{ "CoCreateInstance", (PROC)fake_CoCreateInstance, (PROC*)&real_CoCreateInstance, HOOK_SKIP_2 },
|
||||
{ "", NULL, NULL, 0 }
|
||||
}
|
||||
},
|
||||
{
|
||||
"winmm.dll",
|
||||
{
|
||||
{ "mciSendCommandA", (PROC)fake_mciSendCommandA, (PROC*)&real_mciSendCommandA, HOOK_SKIP_2 },
|
||||
{ "", NULL, NULL, 0 }
|
||||
}
|
||||
},
|
||||
{
|
||||
"Avifil32.dll",
|
||||
{
|
||||
{ "AVIStreamGetFrameOpen", (PROC)fake_AVIStreamGetFrameOpen, (PROC*)&real_AVIStreamGetFrameOpen, 0 },
|
||||
{ "", NULL, NULL, 0 }
|
||||
}
|
||||
},
|
||||
{
|
||||
"dinput.dll",
|
||||
{
|
||||
{ "DirectInputCreateA", (PROC)fake_DirectInputCreateA, (PROC*)&real_DirectInputCreateA, HOOK_SKIP_2 },
|
||||
//{ "DirectInputCreateW", (PROC)fake_DirectInputCreateW, (PROC*)&real_DirectInputCreateW, HOOK_SKIP_2 },
|
||||
{ "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx, (PROC*)&real_DirectInputCreateEx, HOOK_SKIP_2 },
|
||||
{ "", NULL, NULL, 0 }
|
||||
}
|
||||
},
|
||||
{
|
||||
"dinput8.dll",
|
||||
{
|
||||
{ "DirectInput8Create", (PROC)fake_DirectInput8Create, (PROC*)&real_DirectInput8Create, HOOK_SKIP_2 },
|
||||
{ "", NULL, NULL, 0 }
|
||||
}
|
||||
},
|
||||
{
|
||||
"gdi32.dll",
|
||||
{
|
||||
{ "BitBlt", (PROC)fake_BitBlt, (PROC*)&real_BitBlt, HOOK_SKIP_2 },
|
||||
{ "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, HOOK_SKIP_2 },
|
||||
{ "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, HOOK_SKIP_2 },
|
||||
{ "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, HOOK_SKIP_2 },
|
||||
{ "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, HOOK_LOCAL_ONLY },
|
||||
{ "GetDeviceCaps", (PROC)fake_GetDeviceCaps_system, NULL, HOOK_SYSTEM_ONLY },
|
||||
{ "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 },
|
||||
{ "GetSystemPaletteEntries", (PROC)fake_GetSystemPaletteEntries, (PROC*)&real_GetSystemPaletteEntries, 0 },
|
||||
{ "SelectPalette", (PROC)fake_SelectPalette, (PROC*)&real_SelectPalette, 0 },
|
||||
{ "RealizePalette", (PROC)fake_RealizePalette, (PROC*)&real_RealizePalette, 0 },
|
||||
{ "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 },
|
||||
{ "", NULL, NULL, 0 }
|
||||
}
|
||||
},
|
||||
{
|
||||
"WING32.DLL",
|
||||
{
|
||||
{ "WinGBitBlt", (PROC)fake_WinGBitBlt, NULL, 0 },
|
||||
{ "WinGStretchBlt", (PROC)fake_WinGStretchBlt, NULL, 0 },
|
||||
{ "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, SKIP_HOOK3 },
|
||||
{ "", NULL, NULL, 0 }
|
||||
}
|
||||
},
|
||||
{
|
||||
"kernel32.dll",
|
||||
{
|
||||
{ "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, HOOK_SKIP_2 },
|
||||
{ "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, HOOK_SKIP_2 },
|
||||
{ "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, HOOK_SKIP_2 },
|
||||
{ "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 },
|
||||
{ "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, HOOK_SKIP_2 },
|
||||
{ "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, 0 },
|
||||
{ "GetVersion", (PROC)fake_GetVersion, (PROC*)&real_GetVersion, 0 },
|
||||
{ "GetVersionExA", (PROC)fake_GetVersionExA, (PROC*)&real_GetVersionExA, 0 },
|
||||
#if defined(_DEBUG) && defined(__GNUC__)
|
||||
{ "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter, (PROC*)&real_SetUnhandledExceptionFilter, 0 },
|
||||
#endif
|
||||
{ "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, SKIP_HOOK2 | SKIP_HOOK3 },
|
||||
{ "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, SKIP_HOOK2 | SKIP_HOOK3 },
|
||||
{ "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, SKIP_HOOK2 | SKIP_HOOK3 },
|
||||
{ "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, SKIP_HOOK2 | SKIP_HOOK3 },
|
||||
{ "", NULL, NULL, 0 }
|
||||
}
|
||||
},
|
||||
|
|
@ -230,73 +119,60 @@ void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function
|
|||
strncpy(hooks[0].module_name, module_name, sizeof(hooks[0].module_name) - 1);
|
||||
strncpy(hooks[0].data[0].function_name, function_name, sizeof(hooks[0].data[0].function_name) - 1);
|
||||
|
||||
hook_patch_iat_list(hmod, unhook, (HOOKLIST*)&hooks, FALSE);
|
||||
hook_patch_iat_list(hmod, unhook, (HOOKLIST*)&hooks);
|
||||
}
|
||||
|
||||
void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local)
|
||||
void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks)
|
||||
{
|
||||
if (!hmod || hmod == INVALID_HANDLE_VALUE || !hooks)
|
||||
return;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
__try
|
||||
{
|
||||
#endif
|
||||
PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)hmod;
|
||||
if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
|
||||
return;
|
||||
|
||||
PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)hmod + (DWORD)dos_header->e_lfanew);
|
||||
PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew);
|
||||
if (nt_headers->Signature != IMAGE_NT_SIGNATURE)
|
||||
return;
|
||||
|
||||
DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
|
||||
if (!import_desc_rva)
|
||||
return;
|
||||
PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header +
|
||||
(DWORD)(nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress));
|
||||
|
||||
PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)hmod + import_desc_rva);
|
||||
if (import_desc == (PIMAGE_IMPORT_DESCRIPTOR)nt_headers)
|
||||
return;
|
||||
|
||||
while (import_desc->FirstThunk)
|
||||
{
|
||||
if (!import_desc->Name)
|
||||
{
|
||||
import_desc++;
|
||||
continue;
|
||||
}
|
||||
|
||||
for (int i = 0; hooks[i].module_name[0]; i++)
|
||||
{
|
||||
char* imp_module_name = (char*)((DWORD)hmod + import_desc->Name);
|
||||
char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name));
|
||||
|
||||
if (_stricmp(imp_module_name, hooks[i].module_name) == 0)
|
||||
{
|
||||
HMODULE cur_mod = GetModuleHandleA(hooks[i].module_name);
|
||||
HMODULE cur_mod = GetModuleHandle(hooks[i].module_name);
|
||||
|
||||
PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)hmod + import_desc->FirstThunk);
|
||||
PIMAGE_THUNK_DATA first_thunk =
|
||||
(PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->FirstThunk);
|
||||
|
||||
PIMAGE_THUNK_DATA original_first_thunk =
|
||||
(PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->OriginalFirstThunk);
|
||||
|
||||
while (first_thunk->u1.Function)
|
||||
{
|
||||
for (int x = 0; hooks[i].data[x].function_name[0]; x++)
|
||||
{
|
||||
/* GetProcAddress is slow, save the pointer and reuse it for better performance */
|
||||
DWORD org_function = (DWORD)InterlockedExchangeAdd((LONG*)&hooks[i].data[x].org_function, 0);
|
||||
|
||||
if (!org_function || cur_mod != hooks[i].data[x].mod)
|
||||
{
|
||||
hooks[i].data[x].mod = cur_mod;
|
||||
|
||||
org_function = (DWORD)real_GetProcAddress(cur_mod, hooks[i].data[x].function_name);
|
||||
|
||||
InterlockedExchange((LONG*)&hooks[i].data[x].org_function, (LONG)org_function);
|
||||
}
|
||||
DWORD org_function =
|
||||
(DWORD)GetProcAddress(
|
||||
cur_mod,
|
||||
hooks[i].data[x].function_name);
|
||||
|
||||
if (!hooks[i].data[x].new_function || !org_function)
|
||||
continue;
|
||||
|
||||
if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY))
|
||||
continue;
|
||||
|
||||
if (is_local && (hooks[i].data[x].flags & HOOK_SYSTEM_ONLY))
|
||||
continue;
|
||||
|
||||
if (unhook)
|
||||
{
|
||||
if (first_thunk->u1.Function == (DWORD)hooks[i].data[x].new_function)
|
||||
|
|
@ -340,90 +216,73 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks,
|
|||
}
|
||||
|
||||
first_thunk++;
|
||||
original_first_thunk++;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
import_desc++;
|
||||
}
|
||||
#ifdef _MSC_VER
|
||||
}
|
||||
__except (EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local)
|
||||
void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks)
|
||||
{
|
||||
hook_patch_obfuscated_iat_list(hmod, unhook, hooks, is_local);
|
||||
hook_patch_obfuscated_iat_list(hmod, unhook, hooks);
|
||||
|
||||
if (!hmod || hmod == INVALID_HANDLE_VALUE || !hooks)
|
||||
return;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
__try
|
||||
{
|
||||
#endif
|
||||
PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)hmod;
|
||||
if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
|
||||
return;
|
||||
|
||||
PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)hmod + (DWORD)dos_header->e_lfanew);
|
||||
PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew);
|
||||
if (nt_headers->Signature != IMAGE_NT_SIGNATURE)
|
||||
return;
|
||||
|
||||
DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
|
||||
if (!import_desc_rva)
|
||||
return;
|
||||
PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header +
|
||||
(DWORD)(nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress));
|
||||
|
||||
PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)hmod + import_desc_rva);
|
||||
if (import_desc == (PIMAGE_IMPORT_DESCRIPTOR)nt_headers)
|
||||
return;
|
||||
|
||||
while (import_desc->FirstThunk)
|
||||
{
|
||||
if (!import_desc->OriginalFirstThunk || !import_desc->Name)
|
||||
{
|
||||
import_desc++;
|
||||
continue;
|
||||
}
|
||||
|
||||
for (int i = 0; hooks[i].module_name[0]; i++)
|
||||
{
|
||||
char* imp_module_name = (char*)((DWORD)hmod + import_desc->Name);
|
||||
char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name));
|
||||
|
||||
if (_stricmp(imp_module_name, hooks[i].module_name) == 0)
|
||||
{
|
||||
PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)hmod + import_desc->FirstThunk);
|
||||
PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)hmod + import_desc->OriginalFirstThunk);
|
||||
PIMAGE_THUNK_DATA first_thunk =
|
||||
(PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->FirstThunk);
|
||||
|
||||
while (first_thunk->u1.Function)
|
||||
PIMAGE_THUNK_DATA original_first_thunk =
|
||||
(PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->OriginalFirstThunk);
|
||||
|
||||
while (first_thunk->u1.Function && original_first_thunk->u1.AddressOfData)
|
||||
{
|
||||
if (!o_first_thunk->u1.AddressOfData)
|
||||
{
|
||||
first_thunk++;
|
||||
o_first_thunk++;
|
||||
continue;
|
||||
}
|
||||
PIMAGE_IMPORT_BY_NAME import =
|
||||
(PIMAGE_IMPORT_BY_NAME)((DWORD)dos_header + original_first_thunk->u1.AddressOfData);
|
||||
|
||||
PIMAGE_IMPORT_BY_NAME import = (void*)((DWORD)dos_header + o_first_thunk->u1.AddressOfData);
|
||||
|
||||
if ((o_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0)
|
||||
if ((original_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0)
|
||||
{
|
||||
for (int x = 0; hooks[i].data[x].function_name[0]; x++)
|
||||
{
|
||||
if (!unhook && !hooks[i].data[x].new_function)
|
||||
continue;
|
||||
|
||||
if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY))
|
||||
continue;
|
||||
|
||||
if (is_local && (hooks[i].data[x].flags & HOOK_SYSTEM_ONLY))
|
||||
continue;
|
||||
|
||||
#if defined(__GNUC__)
|
||||
if (util_is_bad_read_ptr((void*)import->Name))
|
||||
continue;
|
||||
#endif
|
||||
|
||||
if (strcmp((const char*)import->Name, hooks[i].data[x].function_name) == 0)
|
||||
if (_stricmp((const char*)import->Name, hooks[i].data[x].function_name) == 0)
|
||||
{
|
||||
DWORD op;
|
||||
|
||||
|
|
@ -436,8 +295,8 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc
|
|||
if (unhook)
|
||||
{
|
||||
DWORD org =
|
||||
(DWORD)real_GetProcAddress(
|
||||
GetModuleHandleA(hooks[i].module_name),
|
||||
(DWORD)GetProcAddress(
|
||||
GetModuleHandle(hooks[i].module_name),
|
||||
hooks[i].data[x].function_name);
|
||||
|
||||
if (org && first_thunk->u1.Function != org)
|
||||
|
|
@ -460,82 +319,34 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc
|
|||
}
|
||||
|
||||
first_thunk++;
|
||||
o_first_thunk++;
|
||||
original_first_thunk++;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
import_desc++;
|
||||
}
|
||||
#ifdef _MSC_VER
|
||||
}
|
||||
__except (EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
BOOL hook_got_ddraw_import(HMODULE mod, BOOL check_imported_dlls)
|
||||
{
|
||||
if (!mod)
|
||||
return FALSE;
|
||||
|
||||
__try
|
||||
{
|
||||
PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)mod;
|
||||
if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
|
||||
return FALSE;
|
||||
|
||||
PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)mod + (DWORD)dos_header->e_lfanew);
|
||||
if (nt_headers->Signature != IMAGE_NT_SIGNATURE)
|
||||
return FALSE;
|
||||
|
||||
DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
|
||||
if (!import_desc_rva)
|
||||
return FALSE;
|
||||
|
||||
PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)mod + import_desc_rva);
|
||||
|
||||
while (import_desc->FirstThunk)
|
||||
{
|
||||
if (import_desc->Name)
|
||||
{
|
||||
char* imp_module_name = (char*)((DWORD)mod + import_desc->Name);
|
||||
|
||||
if (_stricmp(imp_module_name, "ddraw.dll") == 0)
|
||||
{
|
||||
PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)mod + import_desc->FirstThunk);
|
||||
|
||||
if (first_thunk->u1.Function)
|
||||
return TRUE;
|
||||
}
|
||||
else if (check_imported_dlls)
|
||||
{
|
||||
if (hook_got_ddraw_import(GetModuleHandleA(imp_module_name), FALSE))
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
import_desc++;
|
||||
}
|
||||
}
|
||||
__except (EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
void hook_create(HOOKLIST* hooks, BOOL initial_hook)
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
if ((g_config.hook == 2) && initial_hook)
|
||||
if ((g_hook_method == 2 || g_hook_method == 3) && initial_hook)
|
||||
{
|
||||
for (int i = 0; hooks[i].module_name[0]; i++)
|
||||
{
|
||||
for (int x = 0; hooks[i].data[x].function_name[0]; x++)
|
||||
{
|
||||
if ((hooks[i].data[x].flags & HOOK_SKIP_2))
|
||||
if (g_hook_method == 2 && (hooks[i].data[x].flags & SKIP_HOOK2))
|
||||
continue;
|
||||
|
||||
if (g_hook_method == 3 && (hooks[i].data[x].flags & SKIP_HOOK3))
|
||||
continue;
|
||||
|
||||
DetourTransactionBegin();
|
||||
|
|
@ -547,7 +358,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook)
|
|||
}
|
||||
#endif
|
||||
|
||||
if (g_config.hook == 3 || g_config.hook == 4)
|
||||
if (g_hook_method == 3 || g_hook_method == 4)
|
||||
{
|
||||
char game_exe_path[MAX_PATH] = { 0 };
|
||||
char game_dir[MAX_PATH] = { 0 };
|
||||
|
|
@ -560,64 +371,66 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook)
|
|||
char mod_dir[MAX_PATH] = { 0 };
|
||||
char mod_filename[MAX_PATH] = { 0 };
|
||||
HMODULE hmod = NULL;
|
||||
HANDLE process = NULL;
|
||||
|
||||
while ((hmod = util_enumerate_modules(hmod)))
|
||||
#ifndef _MSC_VER
|
||||
HMODULE mods[512];
|
||||
memset(mods, 0, sizeof(mods));
|
||||
process = GetCurrentProcess();
|
||||
EnumProcessModules(process, mods, sizeof(mods) - sizeof(mods[0]), NULL);
|
||||
for (int i = 0; i < sizeof(mods) / sizeof(mods[0]) && (hmod = mods[i]); i++)
|
||||
#else
|
||||
while (hmod = DetourEnumerateModules(hmod))
|
||||
#endif
|
||||
{
|
||||
if (hmod == g_ddraw_module)
|
||||
continue;
|
||||
|
||||
if (GetModuleFileNameA(hmod, mod_path, MAX_PATH))
|
||||
{
|
||||
if (initial_hook)
|
||||
{
|
||||
TRACE("Module %s = %p\n", mod_path, hmod);
|
||||
}
|
||||
TRACE_EXT("Module %s = %p\n", mod_path, hmod);
|
||||
|
||||
_splitpath(mod_path, NULL, mod_dir, mod_filename, NULL);
|
||||
|
||||
/* Don't hook reshade/swiftshader/mesa3d */
|
||||
if (_strcmpi(mod_filename, "opengl32") == 0 ||
|
||||
_strcmpi(mod_filename, "libgallium_wgl") == 0 ||
|
||||
_strcmpi(mod_filename, "libglapi") == 0 ||
|
||||
_strcmpi(mod_filename, "d3d9") == 0 ||
|
||||
_strcmpi(mod_filename, "mdraw") == 0 ||
|
||||
_strcmpi(mod_filename, "SH33W32") == 0 ||
|
||||
_strcmpi(mod_filename, "Shw32") == 0)
|
||||
continue;
|
||||
|
||||
BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0;
|
||||
BOOL wine_hook = IsWine() && _strcmpi(mod_filename, "mciavi32") == 0;
|
||||
|
||||
if (is_local ||
|
||||
wine_hook ||
|
||||
_strcmpi(mod_filename, "QuickTime") == 0 ||
|
||||
_strcmpi(mod_filename, "MSVFW32") == 0 ||
|
||||
if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 ||
|
||||
_strcmpi(mod_filename, "quartz") == 0 ||
|
||||
_strcmpi(mod_filename, "winmm") == 0)
|
||||
{
|
||||
hook_patch_iat_list(hmod, FALSE, hooks, is_local);
|
||||
hook_patch_iat_list(hmod, FALSE, hooks);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (process)
|
||||
CloseHandle(process);
|
||||
}
|
||||
}
|
||||
|
||||
if (g_config.hook == 1)
|
||||
if (g_hook_method == 1)
|
||||
{
|
||||
hook_patch_iat_list(GetModuleHandle(NULL), FALSE, hooks, TRUE);
|
||||
hook_patch_iat_list(GetModuleHandle(NULL), FALSE, hooks);
|
||||
}
|
||||
}
|
||||
|
||||
void hook_revert(HOOKLIST* hooks)
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
if (g_config.hook == 2)
|
||||
if (g_hook_method == 2 || g_hook_method == 3)
|
||||
{
|
||||
for (int i = 0; hooks[i].module_name[0]; i++)
|
||||
{
|
||||
for (int x = 0; hooks[i].data[x].function_name[0]; x++)
|
||||
{
|
||||
if ((hooks[i].data[x].flags & HOOK_SKIP_2))
|
||||
if (g_hook_method == 2 && (hooks[i].data[x].flags & SKIP_HOOK2))
|
||||
continue;
|
||||
|
||||
if (g_hook_method == 3 && (hooks[i].data[x].flags & SKIP_HOOK3))
|
||||
continue;
|
||||
|
||||
DetourTransactionBegin();
|
||||
|
|
@ -629,7 +442,7 @@ void hook_revert(HOOKLIST* hooks)
|
|||
}
|
||||
#endif
|
||||
|
||||
if (g_config.hook == 3 || g_config.hook == 4)
|
||||
if (g_hook_method == 3 || g_hook_method == 4)
|
||||
{
|
||||
char game_exe_path[MAX_PATH] = { 0 };
|
||||
char game_dir[MAX_PATH] = { 0 };
|
||||
|
|
@ -642,8 +455,17 @@ void hook_revert(HOOKLIST* hooks)
|
|||
char mod_dir[MAX_PATH] = { 0 };
|
||||
char mod_filename[MAX_PATH] = { 0 };
|
||||
HMODULE hmod = NULL;
|
||||
HANDLE process = NULL;
|
||||
|
||||
while ((hmod = util_enumerate_modules(hmod)))
|
||||
#ifndef _MSC_VER
|
||||
HMODULE mods[512];
|
||||
memset(mods, 0, sizeof(mods));
|
||||
process = GetCurrentProcess();
|
||||
EnumProcessModules(process, mods, sizeof(mods) - sizeof(mods[0]), NULL);
|
||||
for (int i = 0; i < sizeof(mods) / sizeof(mods[0]) && (hmod = mods[i]); i++)
|
||||
#else
|
||||
while (hmod = DetourEnumerateModules(hmod))
|
||||
#endif
|
||||
{
|
||||
if (hmod == g_ddraw_module)
|
||||
continue;
|
||||
|
|
@ -652,88 +474,182 @@ void hook_revert(HOOKLIST* hooks)
|
|||
{
|
||||
_splitpath(mod_path, NULL, mod_dir, mod_filename, NULL);
|
||||
|
||||
BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0;
|
||||
BOOL wine_hook = IsWine() && _strcmpi(mod_filename, "mciavi32") == 0;
|
||||
|
||||
if (is_local ||
|
||||
wine_hook ||
|
||||
_strcmpi(mod_filename, "QuickTime") == 0 ||
|
||||
_strcmpi(mod_filename, "MSVFW32") == 0 ||
|
||||
if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 ||
|
||||
_strcmpi(mod_filename, "quartz") == 0 ||
|
||||
_strcmpi(mod_filename, "winmm") == 0)
|
||||
{
|
||||
hook_patch_iat_list(hmod, TRUE, hooks, is_local);
|
||||
hook_patch_iat_list(hmod, TRUE, hooks);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (process)
|
||||
CloseHandle(process);
|
||||
}
|
||||
}
|
||||
|
||||
if (g_config.hook == 1)
|
||||
if (g_hook_method == 1)
|
||||
{
|
||||
hook_patch_iat_list(GetModuleHandle(NULL), TRUE, hooks, TRUE);
|
||||
hook_patch_iat_list(GetModuleHandle(NULL), TRUE, hooks);
|
||||
}
|
||||
}
|
||||
|
||||
void hook_init()
|
||||
{
|
||||
if (!g_hook_active)
|
||||
if (!g_hook_active || g_hook_method == 3 || g_hook_method == 4)
|
||||
{
|
||||
if (g_config.hook == 4 && hook_got_ddraw_import(GetModuleHandleA(NULL), TRUE))
|
||||
{
|
||||
/* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */
|
||||
g_config.hook = 3;
|
||||
BOOL initial_hook = !g_hook_active;
|
||||
|
||||
TRACE("Switched to hook 3\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (!g_hook_active || g_config.hook == 3 || g_config.hook == 4)
|
||||
{
|
||||
#if defined(_DEBUG) && defined(_MSC_VER)
|
||||
if (!g_hook_active)
|
||||
if (initial_hook)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter);
|
||||
DetourAttach((PVOID*)&real_CreateFontIndirectA, (PVOID)fake_CreateFontIndirectA);
|
||||
DetourTransactionCommit();
|
||||
|
||||
if (!IsDebuggerPresent())
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach((PVOID*)&real_CreateFontA, (PVOID)fake_CreateFontA);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
|
||||
#ifdef _MSC_VER
|
||||
if (initial_hook && g_hook_dinput)
|
||||
{
|
||||
real_DirectInputCreateA =
|
||||
(DIRECTINPUTCREATEAPROC)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateA");
|
||||
|
||||
if (real_DirectInputCreateA)
|
||||
{
|
||||
patch_ljmp((void*)_invoke_watson, (void*)dbg_invoke_watson);
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach((PVOID*)&real_DirectInputCreateA, (PVOID)fake_DirectInputCreateA);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
real_DirectInputCreateW =
|
||||
(DIRECTINPUTCREATEWPROC)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateW");
|
||||
|
||||
if (real_DirectInputCreateW)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach((PVOID*)&real_DirectInputCreateW, (PVOID)fake_DirectInputCreateW);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
real_DirectInputCreateEx =
|
||||
(DIRECTINPUTCREATEEXPROC)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateEx");
|
||||
|
||||
if (real_DirectInputCreateEx)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach((PVOID*)&real_DirectInputCreateEx, (PVOID)fake_DirectInputCreateEx);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
real_DirectInput8Create =
|
||||
(DIRECTINPUT8CREATEPROC)GetProcAddress(LoadLibraryA("dinput8.dll"), "DirectInput8Create");
|
||||
|
||||
if (real_DirectInput8Create)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach((PVOID*)&real_DirectInput8Create, (PVOID)fake_DirectInput8Create);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!g_hook_active)
|
||||
{
|
||||
hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA);
|
||||
}
|
||||
|
||||
hook_create((HOOKLIST*)&g_hook_hooklist, !g_hook_active);
|
||||
|
||||
g_hook_active = TRUE;
|
||||
|
||||
hook_create((HOOKLIST*)&g_hooks, initial_hook);
|
||||
}
|
||||
}
|
||||
|
||||
void hook_early_init()
|
||||
{
|
||||
/*
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach((PVOID*)&real_CoCreateInstance, (PVOID)fake_CoCreateInstance);
|
||||
DetourTransactionCommit();
|
||||
*/
|
||||
|
||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance);
|
||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA);
|
||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW);
|
||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx);
|
||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create);
|
||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "GetClientRect", (PROC)fake_GetClientRect); //anno 1602
|
||||
hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA);
|
||||
hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA);
|
||||
}
|
||||
|
||||
void hook_exit()
|
||||
{
|
||||
if (g_hook_active)
|
||||
{
|
||||
g_hook_active = FALSE;
|
||||
|
||||
hook_revert((HOOKLIST*)&g_hook_hooklist);
|
||||
|
||||
#if defined(_DEBUG)
|
||||
#if defined(_MSC_VER)
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourDetach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter);
|
||||
DetourDetach((PVOID*)&real_CreateFontIndirectA, (PVOID)fake_CreateFontIndirectA);
|
||||
DetourTransactionCommit();
|
||||
#endif
|
||||
real_SetUnhandledExceptionFilter(g_dbg_exception_filter);
|
||||
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourDetach((PVOID*)&real_CreateFontA, (PVOID)fake_CreateFontA);
|
||||
DetourTransactionCommit();
|
||||
|
||||
#ifdef _MSC_VER
|
||||
if (g_hook_dinput)
|
||||
{
|
||||
if (real_DirectInputCreateA)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourDetach((PVOID*)&real_DirectInputCreateA, (PVOID)fake_DirectInputCreateA);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
if (real_DirectInputCreateW)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourDetach((PVOID*)&real_DirectInputCreateW, (PVOID)fake_DirectInputCreateW);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
if (real_DirectInputCreateEx)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourDetach((PVOID*)&real_DirectInputCreateEx, (PVOID)fake_DirectInputCreateEx);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
if (real_DirectInput8Create)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourDetach((PVOID*)&real_DirectInput8Create, (PVOID)fake_DirectInput8Create);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
hook_patch_iat(GetModuleHandle("AcGenral"), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA);
|
||||
hook_revert((HOOKLIST*)&g_hooks);
|
||||
}
|
||||
|
||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance);
|
||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA);
|
||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW);
|
||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx);
|
||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create);
|
||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "GetClientRect", (PROC)fake_GetClientRect); //anno 1602
|
||||
hook_patch_iat(GetModuleHandle("AcGenral"), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA);
|
||||
hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA);
|
||||
}
|
||||
|
|
|
|||
61
src/indeo.c
61
src/indeo.c
|
|
@ -1,61 +0,0 @@
|
|||
#include <windows.h>
|
||||
|
||||
|
||||
void indeo_enable()
|
||||
{
|
||||
HKEY hkey;
|
||||
LONG status =
|
||||
RegCreateKeyExA(
|
||||
HKEY_CURRENT_USER,
|
||||
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32",
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
KEY_WRITE | KEY_QUERY_VALUE,
|
||||
NULL,
|
||||
&hkey,
|
||||
NULL);
|
||||
|
||||
if (status == ERROR_SUCCESS)
|
||||
{
|
||||
LPCTSTR iv31 = "ir32_32.dll";
|
||||
RegSetValueExA(hkey, "vidc.iv31", 0, REG_SZ, (const BYTE*)iv31, strlen(iv31) + 1);
|
||||
|
||||
LPCTSTR iv32 = "ir32_32.dll";
|
||||
RegSetValueExA(hkey, "vidc.iv32", 0, REG_SZ, (const BYTE*)iv32, strlen(iv32) + 1);
|
||||
|
||||
LPCTSTR iv41 = "ir41_32.ax";
|
||||
RegSetValueExA(hkey, "vidc.iv41", 0, REG_SZ, (const BYTE*)iv41, strlen(iv41) + 1);
|
||||
|
||||
LPCTSTR iv50 = "ir50_32.dll";
|
||||
RegSetValueExA(hkey, "vidc.iv50", 0, REG_SZ, (const BYTE*)iv50, strlen(iv50) + 1);
|
||||
|
||||
RegCloseKey(hkey);
|
||||
}
|
||||
}
|
||||
|
||||
void indeo_disable()
|
||||
{
|
||||
HKEY hkey;
|
||||
LONG status =
|
||||
RegCreateKeyExA(
|
||||
HKEY_CURRENT_USER,
|
||||
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32",
|
||||
0,
|
||||
NULL,
|
||||
REG_OPTION_NON_VOLATILE,
|
||||
KEY_WRITE | KEY_QUERY_VALUE,
|
||||
NULL,
|
||||
&hkey,
|
||||
NULL);
|
||||
|
||||
if (status == ERROR_SUCCESS)
|
||||
{
|
||||
RegDeleteValueA(hkey, "vidc.iv31");
|
||||
RegDeleteValueA(hkey, "vidc.iv32");
|
||||
RegDeleteValueA(hkey, "vidc.iv41");
|
||||
RegDeleteValueA(hkey, "vidc.iv50");
|
||||
|
||||
RegCloseKey(hkey);
|
||||
}
|
||||
}
|
||||
217
src/ini.c
217
src/ini.c
|
|
@ -1,217 +0,0 @@
|
|||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include "debug.h"
|
||||
#include "config.h"
|
||||
#include "crc32.h"
|
||||
#include "ini.h"
|
||||
|
||||
// Microsoft: The maximum profile section size is 32,767 characters.
|
||||
#define BUF_SIZE (8192)
|
||||
|
||||
void ini_create(INIFILE* ini, char* filename)
|
||||
{
|
||||
if (!ini || !filename || !filename[0])
|
||||
return;
|
||||
|
||||
ini->sections = calloc(sizeof(ini->sections[0]), 1);
|
||||
if (ini->sections)
|
||||
{
|
||||
strncpy(ini->filename, filename, sizeof(ini->filename) - 1);
|
||||
ini->filename[sizeof(ini->filename) - 1] = 0;
|
||||
|
||||
char* names = calloc(BUF_SIZE, 1);
|
||||
if (names)
|
||||
{
|
||||
if (GetPrivateProfileSectionNamesA(names, BUF_SIZE, filename) > 0)
|
||||
{
|
||||
char* name = names;
|
||||
|
||||
for (int i = 0; *name; i++)
|
||||
{
|
||||
ini->sections = realloc(ini->sections, sizeof(ini->sections[0]) * (i + 2));
|
||||
|
||||
if (!ini->sections)
|
||||
return;
|
||||
|
||||
memset(&ini->sections[i + 1], 0, sizeof(ini->sections[0]));
|
||||
|
||||
char* buf = malloc(BUF_SIZE);
|
||||
if (buf)
|
||||
{
|
||||
DWORD size = GetPrivateProfileSectionA(name, buf, BUF_SIZE, filename);
|
||||
if (size > 0)
|
||||
{
|
||||
ini->sections[i].data = malloc(size + 2);
|
||||
if (ini->sections[i].data)
|
||||
{
|
||||
memcpy(ini->sections[i].data, buf, size + 2);
|
||||
}
|
||||
}
|
||||
|
||||
free(buf);
|
||||
}
|
||||
|
||||
size_t len = strlen(name);
|
||||
|
||||
for (char* p = name; *p; ++p)
|
||||
*p = tolower(*p);
|
||||
|
||||
ini->sections[i].hash = Crc32_ComputeBuf(0, name, len);
|
||||
|
||||
name += len + 1;
|
||||
}
|
||||
}
|
||||
|
||||
free(names);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BOOL ini_section_exists(INIFILE* ini, LPCSTR section)
|
||||
{
|
||||
if (!ini || !ini->sections || !section || strlen(section) == 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
char s[MAX_PATH];
|
||||
strncpy(s, section, sizeof(s) - 1);
|
||||
s[sizeof(s) - 1] = 0;
|
||||
|
||||
for (char* p = s; *p; ++p)
|
||||
*p = tolower(*p);
|
||||
|
||||
unsigned long hash = Crc32_ComputeBuf(0, s, strlen(s));
|
||||
|
||||
for (int i = 0; ini->sections[i].hash; i++)
|
||||
{
|
||||
if (ini->sections[i].hash == hash)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR buf, DWORD size)
|
||||
{
|
||||
if (!buf || size == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!ini || !ini->sections || !section || !key)
|
||||
{
|
||||
goto end;
|
||||
}
|
||||
|
||||
size_t key_len = strlen(key);
|
||||
|
||||
if (key_len == 0 || strlen(section) == 0)
|
||||
{
|
||||
goto end;
|
||||
}
|
||||
|
||||
char s[MAX_PATH];
|
||||
strncpy(s, section, sizeof(s) - 1);
|
||||
s[sizeof(s) - 1] = 0;
|
||||
|
||||
for (char* p = s; *p; ++p)
|
||||
*p = tolower(*p);
|
||||
|
||||
unsigned long hash = Crc32_ComputeBuf(0, s, strlen(s));
|
||||
|
||||
for (int i = 0; ini->sections[i].hash; i++)
|
||||
{
|
||||
if (ini->sections[i].hash == hash)
|
||||
{
|
||||
if (!ini->sections[i].data)
|
||||
break;
|
||||
|
||||
for (char* p = ini->sections[i].data; *p; p += strlen(p) + 1)
|
||||
{
|
||||
if (_strnicmp(key, p, key_len) == 0 && p[key_len] == '=')
|
||||
{
|
||||
strncpy(buf, &p[key_len + 1], size - 1);
|
||||
buf[size - 1] = 0;
|
||||
return strlen(buf);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
end:
|
||||
if (def)
|
||||
{
|
||||
strncpy(buf, def, size - 1);
|
||||
buf[size - 1] = 0;
|
||||
return strlen(buf);
|
||||
}
|
||||
|
||||
buf[0] = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
BOOL ini_get_bool(INIFILE* ini, LPCSTR section, LPCSTR key, BOOL def)
|
||||
{
|
||||
char value[8];
|
||||
ini_get_string(ini, section, key, def ? "Yes" : "No", value, sizeof(value));
|
||||
|
||||
return (_stricmp(value, "yes") == 0 || _stricmp(value, "true") == 0 || _stricmp(value, "1") == 0);
|
||||
}
|
||||
|
||||
int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def)
|
||||
{
|
||||
char def_str[32];
|
||||
_snprintf(def_str, sizeof(def_str) - 1, "%d", def);
|
||||
|
||||
char value[32];
|
||||
ini_get_string(ini, section, key, def_str, value, sizeof(value));
|
||||
|
||||
if (strstr(value, "0x"))
|
||||
{
|
||||
return strtol(value, NULL, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return atoi(value);
|
||||
}
|
||||
}
|
||||
|
||||
float ini_get_float(INIFILE* ini, LPCSTR section, LPCSTR key, float def)
|
||||
{
|
||||
char def_str[32];
|
||||
_snprintf(def_str, sizeof(def_str) - 1, "%f", def);
|
||||
|
||||
char value[32];
|
||||
ini_get_string(ini, section, key, def_str, value, sizeof(value));
|
||||
|
||||
return (float)atof(value);
|
||||
}
|
||||
|
||||
void ini_free(INIFILE* ini)
|
||||
{
|
||||
if (!ini)
|
||||
return;
|
||||
|
||||
ini->filename[0] = 0;
|
||||
|
||||
if (ini->sections)
|
||||
{
|
||||
for (int i = 0; ini->sections[i].hash; i++)
|
||||
{
|
||||
if (ini->sections[i].data)
|
||||
{
|
||||
free(ini->sections[i].data);
|
||||
ini->sections[i].data = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
free(ini->sections);
|
||||
ini->sections = NULL;
|
||||
}
|
||||
}
|
||||
132
src/keyboard.c
132
src/keyboard.c
|
|
@ -1,132 +0,0 @@
|
|||
#include <windows.h>
|
||||
#include "debug.h"
|
||||
#include "hook.h"
|
||||
#include "dd.h"
|
||||
#include "utils.h"
|
||||
#include "config.h"
|
||||
#include "keyboard.h"
|
||||
#include "mouse.h"
|
||||
#include "screenshot.h"
|
||||
|
||||
|
||||
HHOOK g_keyboard_hook;
|
||||
|
||||
void keyboard_hook_init()
|
||||
{
|
||||
if (g_keyboard_hook && UnhookWindowsHookEx(g_keyboard_hook))
|
||||
{
|
||||
g_keyboard_hook = NULL;
|
||||
}
|
||||
|
||||
if (!g_ddraw.gui_thread_id)
|
||||
return;
|
||||
|
||||
g_keyboard_hook =
|
||||
real_SetWindowsHookExA(
|
||||
WH_KEYBOARD,
|
||||
keyboard_hook_proc,
|
||||
NULL,
|
||||
g_ddraw.gui_thread_id);
|
||||
}
|
||||
|
||||
void keyboard_hook_exit()
|
||||
{
|
||||
if (g_keyboard_hook)
|
||||
{
|
||||
UnhookWindowsHookEx(g_keyboard_hook);
|
||||
}
|
||||
}
|
||||
|
||||
LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (code < 0 || !wParam)
|
||||
return CallNextHookEx(g_keyboard_hook, code, wParam, lParam);
|
||||
|
||||
BOOL alt_down = !!(lParam & (1 << 29));
|
||||
BOOL key_down = !(lParam & (1 << 31));
|
||||
BOOL key_released = !!(lParam & (1 << 31));
|
||||
BOOL key_triggered = !(lParam & (1 << 30));
|
||||
|
||||
//TRACE("kbhook code=%u, wParam=%u, triggered=%u, released=%u, alt_down=%u\n", code, wParam, key_triggered, key_released, alt_down);
|
||||
|
||||
if (wParam == VK_MENU && (key_released || key_triggered)) /* Fix for alt key being stuck on alt+tab in some games */
|
||||
{
|
||||
g_ddraw.alt_key_down = alt_down;
|
||||
}
|
||||
|
||||
if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down && key_down)
|
||||
{
|
||||
if (key_triggered)
|
||||
util_toggle_fullscreen();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (wParam == g_config.hotkeys.toggle_fullscreen2)
|
||||
{
|
||||
if (key_triggered)
|
||||
util_toggle_fullscreen();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (wParam == g_config.hotkeys.toggle_maximize && alt_down && key_down)
|
||||
{
|
||||
if (key_triggered)
|
||||
util_toggle_maximize();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (wParam == g_config.hotkeys.toggle_maximize2)
|
||||
{
|
||||
if (key_triggered)
|
||||
util_toggle_maximize();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (wParam == g_config.hotkeys.screenshot)
|
||||
{
|
||||
// VK_SNAPSHOT does not have a KEYDOWN event...
|
||||
if (g_config.hotkeys.screenshot == VK_SNAPSHOT)
|
||||
{
|
||||
if (key_released)
|
||||
{
|
||||
ss_take_screenshot(g_ddraw.primary);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if (key_triggered)
|
||||
{
|
||||
ss_take_screenshot(g_ddraw.primary);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (wParam == g_config.hotkeys.unlock_cursor1 || wParam == VK_CONTROL)
|
||||
{
|
||||
if ((real_GetAsyncKeyState(VK_CONTROL) & 0x8000) &&
|
||||
(real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000))
|
||||
{
|
||||
mouse_unlock();
|
||||
|
||||
if (key_down)
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (wParam == g_config.hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL)
|
||||
{
|
||||
if ((real_GetAsyncKeyState(VK_RMENU) & 0x8000) &&
|
||||
(real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000))
|
||||
{
|
||||
mouse_unlock();
|
||||
|
||||
if (key_down)
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return CallNextHookEx(g_keyboard_hook, code, wParam, lParam);
|
||||
}
|
||||
58
src/mouse.c
58
src/mouse.c
|
|
@ -3,22 +3,19 @@
|
|||
#include "winapi_hooks.h"
|
||||
#include "dd.h"
|
||||
#include "hook.h"
|
||||
#include "utils.h"
|
||||
#include "config.h"
|
||||
|
||||
|
||||
BOOL g_mouse_locked;
|
||||
HHOOK g_mouse_hook;
|
||||
HOOKPROC g_mouse_proc;
|
||||
|
||||
void mouse_lock()
|
||||
{
|
||||
if (g_config.devmode || g_ddraw.bnet_active || !g_ddraw.hwnd)
|
||||
if (g_ddraw->devmode || g_ddraw->bnet_active)
|
||||
return;
|
||||
|
||||
if (g_hook_active && !g_mouse_locked && !util_is_minimized(g_ddraw.hwnd))
|
||||
if (g_hook_active && !g_ddraw->locked && !IsIconic(g_ddraw->hwnd))
|
||||
{
|
||||
int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw.show_cursor_count, 0);
|
||||
int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0);
|
||||
int cur_count = real_ShowCursor(TRUE) - 1;
|
||||
real_ShowCursor(FALSE);
|
||||
|
||||
|
|
@ -31,53 +28,50 @@ void mouse_lock()
|
|||
while (real_ShowCursor(TRUE) < game_count);
|
||||
}
|
||||
|
||||
real_SetCursor((HCURSOR)InterlockedExchangeAdd((LONG*)&g_ddraw.old_cursor, 0));
|
||||
real_SetCursor((HCURSOR)InterlockedExchangeAdd((LONG*)&g_ddraw->old_cursor, 0));
|
||||
|
||||
RECT rc = { 0 };
|
||||
real_GetClientRect(g_ddraw.hwnd, &rc);
|
||||
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
||||
OffsetRect(&rc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y);
|
||||
real_GetClientRect(g_ddraw->hwnd, &rc);
|
||||
real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
||||
OffsetRect(&rc, g_ddraw->render.viewport.x, g_ddraw->render.viewport.y);
|
||||
|
||||
int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0);
|
||||
int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0);
|
||||
int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0);
|
||||
int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0);
|
||||
|
||||
real_SetCursorPos(
|
||||
g_config.adjmouse ? (int)(rc.left + (cur_x * g_ddraw.mouse.scale_x)) : rc.left + cur_x,
|
||||
g_config.adjmouse ? (int)(rc.top + (cur_y * g_ddraw.mouse.scale_y)) : rc.top + cur_y);
|
||||
g_ddraw->adjmouse ? (int)(rc.left + (cur_x * g_ddraw->render.scale_w)) : rc.left + cur_x,
|
||||
g_ddraw->adjmouse ? (int)(rc.top + (cur_y * g_ddraw->render.scale_h)) : rc.top + cur_y);
|
||||
|
||||
CopyRect(&rc, &g_ddraw.mouse.rc);
|
||||
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
||||
CopyRect(&rc, &g_ddraw->mouse.rc);
|
||||
real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
||||
real_ClipCursor(&rc);
|
||||
|
||||
g_mouse_locked = TRUE;
|
||||
g_ddraw->locked = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
void mouse_unlock()
|
||||
{
|
||||
if (g_config.devmode || !g_hook_active || !g_ddraw.hwnd)
|
||||
if (g_ddraw->devmode || !g_hook_active)
|
||||
return;
|
||||
|
||||
if (g_mouse_locked)
|
||||
if (g_ddraw->locked)
|
||||
{
|
||||
g_mouse_locked = FALSE;
|
||||
g_ddraw->locked = FALSE;
|
||||
|
||||
real_ClipCursor(NULL);
|
||||
ReleaseCapture();
|
||||
|
||||
RECT rc = { 0 };
|
||||
real_GetClientRect(g_ddraw.hwnd, &rc);
|
||||
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
||||
OffsetRect(&rc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y);
|
||||
real_GetClientRect(g_ddraw->hwnd, &rc);
|
||||
real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
|
||||
OffsetRect(&rc, g_ddraw->render.viewport.x, g_ddraw->render.viewport.y);
|
||||
|
||||
int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0);
|
||||
int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0);
|
||||
int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0);
|
||||
int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0);
|
||||
|
||||
real_SetCursorPos(
|
||||
(int)(rc.left + (cur_x * g_ddraw.mouse.scale_x)),
|
||||
(int)(rc.top + (cur_y * g_ddraw.mouse.scale_y)));
|
||||
|
||||
real_SetCursor(LoadCursor(NULL, IDC_ARROW));
|
||||
(int)(rc.left + (cur_x * g_ddraw->render.scale_w)),
|
||||
(int)(rc.top + (cur_y * g_ddraw->render.scale_h)));
|
||||
|
||||
while (real_ShowCursor(TRUE) < 0);
|
||||
}
|
||||
|
|
@ -85,10 +79,10 @@ void mouse_unlock()
|
|||
|
||||
LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (!g_ddraw.ref)
|
||||
if (!g_ddraw)
|
||||
return g_mouse_proc(Code, wParam, lParam);
|
||||
|
||||
if (Code < 0 || (!g_config.devmode && !g_mouse_locked))
|
||||
if (Code < 0 || (!g_ddraw->devmode && !g_ddraw->locked))
|
||||
return CallNextHookEx(g_mouse_hook, Code, wParam, lParam);
|
||||
|
||||
fake_GetCursorPos(&((MOUSEHOOKSTRUCT*)lParam)->pt);
|
||||
|
|
|
|||
|
|
@ -2,10 +2,6 @@
|
|||
#include <stdio.h>
|
||||
#include "opengl_utils.h"
|
||||
#include "dd.h"
|
||||
#include "debug.h"
|
||||
#include "hook.h"
|
||||
#include "config.h"
|
||||
#include "versionhelpers.h"
|
||||
|
||||
PFNWGLCREATECONTEXTPROC xwglCreateContext;
|
||||
PFNWGLDELETECONTEXTPROC xwglDeleteContext;
|
||||
|
|
@ -88,46 +84,43 @@ PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT;
|
|||
PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB;
|
||||
PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB;
|
||||
PFNGLTEXBUFFERPROC glTexBuffer;
|
||||
PFNGLGETINTEGERVPROC glGetIntegerv;
|
||||
PFNGLGETSTRINGIPROC glGetStringi;
|
||||
|
||||
HMODULE g_oglu_hmodule;
|
||||
BOOL g_oglu_got_version2;
|
||||
BOOL g_oglu_got_version3;
|
||||
char g_oglu_version[128];
|
||||
char g_oglu_version_long[128];
|
||||
|
||||
BOOL oglu_load_dll()
|
||||
{
|
||||
if (!g_oglu_hmodule)
|
||||
g_oglu_hmodule = real_LoadLibraryA("opengl32.dll");
|
||||
g_oglu_hmodule = LoadLibrary("opengl32.dll");
|
||||
|
||||
if (g_oglu_hmodule)
|
||||
{
|
||||
xwglCreateContext = (PFNWGLCREATECONTEXTPROC)real_GetProcAddress(g_oglu_hmodule, "wglCreateContext");
|
||||
xwglDeleteContext = (PFNWGLDELETECONTEXTPROC)real_GetProcAddress(g_oglu_hmodule, "wglDeleteContext");
|
||||
xwglGetProcAddress = (PFNWGLGETPROCADDRESSPROC)real_GetProcAddress(g_oglu_hmodule, "wglGetProcAddress");
|
||||
xwglMakeCurrent = (PFNWGLMAKECURRENTPROC)real_GetProcAddress(g_oglu_hmodule, "wglMakeCurrent");
|
||||
xwglCreateContext = (PFNWGLCREATECONTEXTPROC)GetProcAddress(g_oglu_hmodule, "wglCreateContext");
|
||||
xwglDeleteContext = (PFNWGLDELETECONTEXTPROC)GetProcAddress(g_oglu_hmodule, "wglDeleteContext");
|
||||
xwglGetProcAddress = (PFNWGLGETPROCADDRESSPROC)GetProcAddress(g_oglu_hmodule, "wglGetProcAddress");
|
||||
xwglMakeCurrent = (PFNWGLMAKECURRENTPROC)GetProcAddress(g_oglu_hmodule, "wglMakeCurrent");
|
||||
|
||||
glViewport = (PFNGLVIEWPORTPROC)real_GetProcAddress(g_oglu_hmodule, "glViewport");
|
||||
glBindTexture = (PFNGLBINDTEXTUREPROC)real_GetProcAddress(g_oglu_hmodule, "glBindTexture");
|
||||
glGenTextures = (PFNGLGENTEXTURESPROC)real_GetProcAddress(g_oglu_hmodule, "glGenTextures");
|
||||
glTexParameteri = (PFNGLTEXPARAMETERIPROC)real_GetProcAddress(g_oglu_hmodule, "glTexParameteri");
|
||||
glDeleteTextures = (PFNGLDELETETEXTURESPROC)real_GetProcAddress(g_oglu_hmodule, "glDeleteTextures");
|
||||
glTexImage2D = (PFNGLTEXIMAGE2DPROC)real_GetProcAddress(g_oglu_hmodule, "glTexImage2D");
|
||||
glDrawElements = (PFNGLDRAWELEMENTSPROC)real_GetProcAddress(g_oglu_hmodule, "glDrawElements");
|
||||
glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)real_GetProcAddress(g_oglu_hmodule, "glTexSubImage2D");
|
||||
glGetError = (PFNGLGETERRORPROC)real_GetProcAddress(g_oglu_hmodule, "glGetError");
|
||||
glGetString = (PFNGLGETSTRINGPROC)real_GetProcAddress(g_oglu_hmodule, "glGetString");
|
||||
glGetTexImage = (PFNGLGETTEXIMAGEPROC)real_GetProcAddress(g_oglu_hmodule, "glGetTexImage");
|
||||
glPixelStorei = (PFNGLPIXELSTOREIPROC)real_GetProcAddress(g_oglu_hmodule, "glPixelStorei");
|
||||
glEnable = (PFNGLENABLEPROC)real_GetProcAddress(g_oglu_hmodule, "glEnable");
|
||||
glClear = (PFNGLCLEARPROC)real_GetProcAddress(g_oglu_hmodule, "glClear");
|
||||
glViewport = (PFNGLVIEWPORTPROC)GetProcAddress(g_oglu_hmodule, "glViewport");
|
||||
glBindTexture = (PFNGLBINDTEXTUREPROC)GetProcAddress(g_oglu_hmodule, "glBindTexture");
|
||||
glGenTextures = (PFNGLGENTEXTURESPROC)GetProcAddress(g_oglu_hmodule, "glGenTextures");
|
||||
glTexParameteri = (PFNGLTEXPARAMETERIPROC)GetProcAddress(g_oglu_hmodule, "glTexParameteri");
|
||||
glDeleteTextures = (PFNGLDELETETEXTURESPROC)GetProcAddress(g_oglu_hmodule, "glDeleteTextures");
|
||||
glTexImage2D = (PFNGLTEXIMAGE2DPROC)GetProcAddress(g_oglu_hmodule, "glTexImage2D");
|
||||
glDrawElements = (PFNGLDRAWELEMENTSPROC)GetProcAddress(g_oglu_hmodule, "glDrawElements");
|
||||
glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)GetProcAddress(g_oglu_hmodule, "glTexSubImage2D");
|
||||
glGetError = (PFNGLGETERRORPROC)GetProcAddress(g_oglu_hmodule, "glGetError");
|
||||
glGetString = (PFNGLGETSTRINGPROC)GetProcAddress(g_oglu_hmodule, "glGetString");
|
||||
glGetTexImage = (PFNGLGETTEXIMAGEPROC)GetProcAddress(g_oglu_hmodule, "glGetTexImage");
|
||||
glPixelStorei = (PFNGLPIXELSTOREIPROC)GetProcAddress(g_oglu_hmodule, "glPixelStorei");
|
||||
glEnable = (PFNGLENABLEPROC)GetProcAddress(g_oglu_hmodule, "glEnable");
|
||||
glClear = (PFNGLCLEARPROC)GetProcAddress(g_oglu_hmodule, "glClear");
|
||||
|
||||
glBegin = (PFNGLBEGINPROC)real_GetProcAddress(g_oglu_hmodule, "glBegin");
|
||||
glEnd = (PFNGLENDPROC)real_GetProcAddress(g_oglu_hmodule, "glEnd");
|
||||
glTexCoord2f = (PFNGLTEXCOORD2FPROC)real_GetProcAddress(g_oglu_hmodule, "glTexCoord2f");
|
||||
glVertex2f = (PFNGLVERTEX2FPROC)real_GetProcAddress(g_oglu_hmodule, "glVertex2f");
|
||||
glBegin = (PFNGLBEGINPROC)GetProcAddress(g_oglu_hmodule, "glBegin");
|
||||
glEnd = (PFNGLENDPROC)GetProcAddress(g_oglu_hmodule, "glEnd");
|
||||
glTexCoord2f = (PFNGLTEXCOORD2FPROC)GetProcAddress(g_oglu_hmodule, "glTexCoord2f");
|
||||
glVertex2f = (PFNGLVERTEX2FPROC)GetProcAddress(g_oglu_hmodule, "glVertex2f");
|
||||
}
|
||||
|
||||
return xwglCreateContext && xwglDeleteContext && xwglGetProcAddress && xwglMakeCurrent && glViewport &&
|
||||
|
|
@ -195,16 +188,13 @@ void oglu_init()
|
|||
wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)xwglGetProcAddress("wglGetExtensionsStringARB");
|
||||
|
||||
glTexBuffer = (PFNGLTEXBUFFERPROC)xwglGetProcAddress("glTexBuffer");
|
||||
glGetIntegerv = (PFNGLGETINTEGERVPROC)xwglGetProcAddress("glGetIntegerv");
|
||||
glGetStringi = (PFNGLGETSTRINGIPROC)xwglGetProcAddress("glGetStringi");
|
||||
|
||||
char* glversion = (char*)glGetString(GL_VERSION);
|
||||
if (glversion)
|
||||
{
|
||||
strncpy(g_oglu_version, glversion, sizeof(g_oglu_version) - 1);
|
||||
strncpy(g_oglu_version_long, glversion, sizeof(g_oglu_version_long) - 1);
|
||||
g_oglu_version[sizeof(g_oglu_version) - 1] = '\0'; /* strncpy fix */
|
||||
strtok(g_oglu_version, " ");
|
||||
const char deli[2] = " ";
|
||||
strtok(g_oglu_version, deli);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -219,46 +209,20 @@ void oglu_init()
|
|||
glEnableVertexAttribArray && glUniform2fv && glUniformMatrix4fv && glGenVertexArrays && glBindVertexArray &&
|
||||
glGetUniformLocation;
|
||||
|
||||
if (IsWine() && glversion && glversion[0] == '2') // macOS
|
||||
if (g_ddraw->wine && glversion && glversion[0] == '2') // macOS
|
||||
{
|
||||
g_oglu_got_version3 = FALSE;
|
||||
wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB");
|
||||
}
|
||||
|
||||
if (g_config.opengl_core)
|
||||
{
|
||||
wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB");
|
||||
}
|
||||
}
|
||||
|
||||
BOOL oglu_ext_exists(char* ext, HDC hdc)
|
||||
{
|
||||
BOOL got_num_extensions = FALSE;
|
||||
char* glext = (char*)glGetString(GL_EXTENSIONS);
|
||||
|
||||
if (glGetIntegerv && glGetStringi)
|
||||
if (glext)
|
||||
{
|
||||
GLint n = 0;
|
||||
glGetIntegerv(GL_NUM_EXTENSIONS, &n);
|
||||
|
||||
if (glGetError() == GL_NO_ERROR)
|
||||
{
|
||||
got_num_extensions = TRUE;
|
||||
|
||||
for (GLint i = 0; i < n; i++)
|
||||
{
|
||||
char* glext = (char*)glGetStringi(GL_EXTENSIONS, i);
|
||||
|
||||
if (glext && strcmp(glext, ext) == 0)
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!got_num_extensions)
|
||||
{
|
||||
char* glext = (char*)glGetString(GL_EXTENSIONS);
|
||||
|
||||
if (glext && strstr(glext, ext))
|
||||
if (strstr(glext, ext))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -276,41 +240,20 @@ BOOL oglu_ext_exists(char* ext, HDC hdc)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
GLuint oglu_build_program(GLchar* vert_source, GLchar* frag_source, BOOL core_profile)
|
||||
GLuint oglu_build_program(const GLchar* vert_source, const GLchar* frag_source)
|
||||
{
|
||||
if (!glCreateShader || !glShaderSource || !glCompileShader || !glCreateProgram ||
|
||||
!glAttachShader || !glLinkProgram || !glUseProgram || !glDetachShader ||
|
||||
!vert_source || !frag_source)
|
||||
!glAttachShader || !glLinkProgram || !glUseProgram || !glDetachShader)
|
||||
return 0;
|
||||
|
||||
char* version_start = strstr(vert_source, "#version");
|
||||
if (version_start && core_profile)
|
||||
{
|
||||
if (_strnicmp(version_start, "#version 130", 12) == 0 ||
|
||||
_strnicmp(version_start, "#version 140", 12) == 0)
|
||||
{
|
||||
memcpy(version_start, "#version 150", 12);
|
||||
}
|
||||
}
|
||||
|
||||
version_start = strstr(frag_source, "#version");
|
||||
if (version_start && core_profile)
|
||||
{
|
||||
if (_strnicmp(version_start, "#version 130", 12) == 0 ||
|
||||
_strnicmp(version_start, "#version 140", 12) == 0)
|
||||
{
|
||||
memcpy(version_start, "#version 150", 12);
|
||||
}
|
||||
}
|
||||
|
||||
GLuint vert_shader = glCreateShader(GL_VERTEX_SHADER);
|
||||
GLuint frag_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
|
||||
if (!vert_shader || !frag_shader)
|
||||
return 0;
|
||||
|
||||
glShaderSource(vert_shader, 1, (const GLchar**)&vert_source, NULL);
|
||||
glShaderSource(frag_shader, 1, (const GLchar**)&frag_source, NULL);
|
||||
glShaderSource(vert_shader, 1, &vert_source, NULL);
|
||||
glShaderSource(frag_shader, 1, &frag_source, NULL);
|
||||
|
||||
GLint is_compiled = 0;
|
||||
|
||||
|
|
@ -320,22 +263,6 @@ GLuint oglu_build_program(GLchar* vert_source, GLchar* frag_source, BOOL core_pr
|
|||
glGetShaderiv(vert_shader, GL_COMPILE_STATUS, &is_compiled);
|
||||
if (is_compiled == GL_FALSE)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
GLint len = 0;
|
||||
glGetShaderiv(vert_shader, GL_INFO_LOG_LENGTH, &len);
|
||||
if (len > 0)
|
||||
{
|
||||
char* log = calloc(len + 50, 1);
|
||||
|
||||
if (log)
|
||||
{
|
||||
glGetShaderInfoLog(vert_shader, len, &len, &log[0]);
|
||||
TRACE("glGetShaderInfoLog (Vertex):\n%s", log);
|
||||
free(log);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (glDeleteShader)
|
||||
glDeleteShader(vert_shader);
|
||||
|
||||
|
|
@ -349,22 +276,6 @@ GLuint oglu_build_program(GLchar* vert_source, GLchar* frag_source, BOOL core_pr
|
|||
glGetShaderiv(frag_shader, GL_COMPILE_STATUS, &is_compiled);
|
||||
if (is_compiled == GL_FALSE)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
GLint len = 0;
|
||||
glGetShaderiv(frag_shader, GL_INFO_LOG_LENGTH, &len);
|
||||
if (len > 0)
|
||||
{
|
||||
char* log = calloc(len + 50, 1);
|
||||
|
||||
if (log)
|
||||
{
|
||||
glGetShaderInfoLog(frag_shader, len, &len, &log[0]);
|
||||
TRACE("glGetShaderInfoLog (Fragment):\n%s", log);
|
||||
free(log);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (glDeleteShader)
|
||||
{
|
||||
glDeleteShader(frag_shader);
|
||||
|
|
@ -451,7 +362,7 @@ GLuint oglu_build_program_from_file(const char* file_path, BOOL core_profile)
|
|||
strcat(vert_source, version + strlen(version) + 1);
|
||||
strcat(frag_source, version + strlen(version) + 1);
|
||||
|
||||
program = oglu_build_program(vert_source, frag_source, core_profile);
|
||||
program = oglu_build_program(vert_source, frag_source);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -462,7 +373,7 @@ GLuint oglu_build_program_from_file(const char* file_path, BOOL core_profile)
|
|||
strcat(vert_source, source);
|
||||
strcat(frag_source, source);
|
||||
|
||||
program = oglu_build_program(vert_source, frag_source, core_profile);
|
||||
program = oglu_build_program(vert_source, frag_source);
|
||||
}
|
||||
|
||||
free(vert_source);
|
||||
|
|
|
|||
|
|
@ -8,24 +8,10 @@
|
|||
#include "render_d3d9.h"
|
||||
#include "utils.h"
|
||||
#include "wndproc.h"
|
||||
#include "blt.h"
|
||||
#include "debug.h"
|
||||
#include "d3d9types.h"
|
||||
#include "hook.h"
|
||||
#include "config.h"
|
||||
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define FAILEDX(stmt) d3d9_check_failed(stmt, #stmt)
|
||||
#define SUCCEEDEDX(stmt) d3d9_check_succeeded(stmt, #stmt)
|
||||
static BOOL d3d9_check_failed(HRESULT hr, const char* stmt);
|
||||
static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt);
|
||||
#else
|
||||
#define FAILEDX(stmt) FAILED(stmt)
|
||||
#define SUCCEEDEDX(stmt) SUCCEEDED(stmt)
|
||||
#endif
|
||||
|
||||
static BOOL d3d9_create_resources();
|
||||
static BOOL d3d9_create_resouces();
|
||||
static BOOL d3d9_set_states();
|
||||
static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch);
|
||||
|
||||
|
|
@ -35,29 +21,13 @@ BOOL d3d9_is_available()
|
|||
{
|
||||
LPDIRECT3D9 d3d9 = NULL;
|
||||
|
||||
if ((g_d3d9.hmodule = real_LoadLibraryA("d3d9.dll")))
|
||||
if ((g_d3d9.hmodule = LoadLibrary("d3d9.dll")))
|
||||
{
|
||||
if (g_config.d3d9on12)
|
||||
{
|
||||
D3D9ON12_ARGS args;
|
||||
memset(&args, 0, sizeof(args));
|
||||
args.Enable9On12 = TRUE;
|
||||
IDirect3D9* (WINAPI * d3d_create9)(UINT) =
|
||||
(IDirect3D9 * (WINAPI*)(UINT))GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9");
|
||||
|
||||
IDirect3D9* (WINAPI * d3d_create9on12)(INT, D3D9ON12_ARGS*, UINT) =
|
||||
(void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9On12");
|
||||
|
||||
if (d3d_create9on12 && (d3d9 = d3d_create9on12(D3D_SDK_VERSION, &args, 1)))
|
||||
IDirect3D9_Release(d3d9);
|
||||
}
|
||||
|
||||
if (!d3d9)
|
||||
{
|
||||
IDirect3D9* (WINAPI * d3d_create9)(UINT) =
|
||||
(IDirect3D9 * (WINAPI*)(UINT))real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9");
|
||||
|
||||
if (d3d_create9 && (d3d9 = d3d_create9(D3D_SDK_VERSION)))
|
||||
IDirect3D9_Release(d3d9);
|
||||
}
|
||||
if (d3d_create9 && (d3d9 = d3d_create9(D3D_SDK_VERSION)))
|
||||
IDirect3D9_Release(d3d9);
|
||||
}
|
||||
|
||||
return d3d9 != NULL;
|
||||
|
|
@ -65,107 +35,61 @@ BOOL d3d9_is_available()
|
|||
|
||||
BOOL d3d9_create()
|
||||
{
|
||||
if (g_d3d9.hwnd == g_ddraw.hwnd && d3d9_create_resources() && d3d9_reset(g_config.windowed))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
d3d9_release();
|
||||
if (!d3d9_release())
|
||||
return FALSE;
|
||||
|
||||
if (!g_d3d9.hmodule)
|
||||
g_d3d9.hmodule = real_LoadLibraryA("d3d9.dll");
|
||||
g_d3d9.hmodule = LoadLibrary("d3d9.dll");
|
||||
|
||||
if (g_d3d9.hmodule)
|
||||
{
|
||||
LPDIRECT3D9 d3d9on12 = NULL;
|
||||
D3D9ON12_ARGS args;
|
||||
memset(&args, 0, sizeof(args));
|
||||
args.Enable9On12 = TRUE;
|
||||
|
||||
IDirect3D9* (WINAPI * d3d_create9on12)(INT, D3D9ON12_ARGS*, UINT) = NULL;
|
||||
IDirect3D9* (WINAPI * d3d_create9)(UINT) = (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9");
|
||||
|
||||
if (g_config.d3d9on12)
|
||||
if (g_ddraw->nonexclusive)
|
||||
{
|
||||
d3d_create9on12 = (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9On12");
|
||||
int (WINAPI * d3d9_enable_shim)(BOOL) =
|
||||
(int (WINAPI*)(BOOL))GetProcAddress(g_d3d9.hmodule, "Direct3D9EnableMaximizedWindowedModeShim");
|
||||
|
||||
if (d3d9_enable_shim)
|
||||
d3d9_enable_shim(TRUE);
|
||||
}
|
||||
|
||||
if ((d3d_create9on12 && (d3d9on12 = g_d3d9.instance = d3d_create9on12(D3D_SDK_VERSION, &args, 1))) ||
|
||||
(d3d_create9 && (g_d3d9.instance = d3d_create9(D3D_SDK_VERSION))))
|
||||
IDirect3D9* (WINAPI * d3d_create9)(UINT) =
|
||||
(IDirect3D9 * (WINAPI*)(UINT))GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9");
|
||||
|
||||
if (d3d_create9 && (g_d3d9.instance = d3d_create9(D3D_SDK_VERSION)))
|
||||
{
|
||||
#if _DEBUG
|
||||
D3DADAPTER_IDENTIFIER9 ai = {0};
|
||||
D3DCAPS9 caps = { 0 };
|
||||
HRESULT adapter_hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, D3DADAPTER_DEFAULT, 0, &ai);
|
||||
HRESULT devcaps_hr = IDirect3D9_GetDeviceCaps(g_d3d9.instance, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
|
||||
|
||||
if (SUCCEEDEDX(adapter_hr))
|
||||
{
|
||||
TRACE("+--Direct3D9-------------------------------------\n");
|
||||
TRACE("| D3D9On12: %s (%p)\n", d3d9on12 != NULL ? "True" : "False", GetModuleHandleA("d3d9on12.dll"));
|
||||
TRACE("| VendorId: 0x%x\n", ai.VendorId);
|
||||
TRACE("| DeviceId: 0x%x\n", ai.DeviceId);
|
||||
TRACE("| Revision: 0x%x\n", ai.Revision);
|
||||
TRACE("| SubSysId: 0x%x\n", ai.SubSysId);
|
||||
TRACE("| Version: %hu.%hu.%hu.%hu\n",
|
||||
HIWORD(ai.DriverVersion.HighPart),
|
||||
LOWORD(ai.DriverVersion.HighPart),
|
||||
HIWORD(ai.DriverVersion.LowPart),
|
||||
LOWORD(ai.DriverVersion.LowPart));
|
||||
|
||||
TRACE("| Driver: %s\n", ai.Driver);
|
||||
TRACE("| Description: %s\n", ai.Description);
|
||||
|
||||
if (SUCCEEDEDX(devcaps_hr))
|
||||
{
|
||||
TRACE("| MaxTextureWidth: %d\n", caps.MaxTextureWidth);
|
||||
TRACE("| MaxTextureHeight: %d\n", caps.MaxTextureHeight);
|
||||
|
||||
TRACE("| VertexShaderVersion: %d.%d\n",
|
||||
(caps.VertexShaderVersion >> 8) & 0xFF,
|
||||
caps.VertexShaderVersion & 0xFF);
|
||||
|
||||
TRACE("| PixelShaderVersion: %d.%d\n",
|
||||
(caps.PixelShaderVersion >> 8) & 0xFF,
|
||||
caps.PixelShaderVersion & 0xFF);
|
||||
}
|
||||
TRACE("+------------------------------------------------\n");
|
||||
}
|
||||
#endif
|
||||
g_d3d9.hwnd = g_ddraw.hwnd;
|
||||
g_d3d9.bits_per_pixel = g_ddraw->render.bpp ? g_ddraw->render.bpp : g_ddraw->mode.dmBitsPerPel;
|
||||
|
||||
memset(&g_d3d9.params, 0, sizeof(g_d3d9.params));
|
||||
|
||||
g_d3d9.params.Windowed = g_config.windowed || g_config.nonexclusive;
|
||||
g_d3d9.params.Windowed = g_ddraw->windowed;
|
||||
g_d3d9.params.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
||||
g_d3d9.params.hDeviceWindow = g_ddraw.hwnd;
|
||||
g_d3d9.params.PresentationInterval = g_config.vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;
|
||||
g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw.render.width;
|
||||
g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw.render.height;
|
||||
g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate;
|
||||
g_d3d9.params.BackBufferFormat = g_ddraw.mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8;
|
||||
g_d3d9.params.hDeviceWindow = g_ddraw->hwnd;
|
||||
g_d3d9.params.PresentationInterval = g_ddraw->vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;
|
||||
g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width;
|
||||
g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height;
|
||||
g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8;
|
||||
g_d3d9.params.BackBufferCount = 1;
|
||||
|
||||
DWORD behavior_flags[] = {
|
||||
D3DCREATE_MULTITHREADED | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE | D3DCREATE_FPU_PRESERVE,
|
||||
D3DCREATE_MULTITHREADED | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE | D3DCREATE_FPU_PRESERVE,
|
||||
D3DCREATE_MULTITHREADED | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE,
|
||||
D3DCREATE_MULTITHREADED | D3DCREATE_MIXED_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE,
|
||||
D3DCREATE_MULTITHREADED | D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE,
|
||||
D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE,
|
||||
D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE,
|
||||
D3DCREATE_HARDWARE_VERTEXPROCESSING,
|
||||
D3DCREATE_MIXED_VERTEXPROCESSING,
|
||||
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
|
||||
};
|
||||
|
||||
for (int i = 0; i < sizeof(behavior_flags) / sizeof(behavior_flags[0]); i++)
|
||||
{
|
||||
if (SUCCEEDEDX(
|
||||
if (SUCCEEDED(
|
||||
IDirect3D9_CreateDevice(
|
||||
g_d3d9.instance,
|
||||
D3DADAPTER_DEFAULT,
|
||||
D3DDEVTYPE_HAL,
|
||||
g_ddraw.hwnd,
|
||||
behavior_flags[i],
|
||||
g_ddraw->hwnd,
|
||||
D3DCREATE_MULTITHREADED | behavior_flags[i],
|
||||
&g_d3d9.params,
|
||||
&g_d3d9.device)))
|
||||
return g_d3d9.device && d3d9_create_resources() && d3d9_set_states();
|
||||
return g_d3d9.device && d3d9_create_resouces() && d3d9_set_states();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -173,67 +97,32 @@ BOOL d3d9_create()
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
static BOOL d3d9_check_failed(HRESULT hr, const char* stmt)
|
||||
{
|
||||
if (FAILED(hr))
|
||||
{
|
||||
TRACE("Direct3D9 error %s [%08x] (%s)\n", dbg_d3d9_hr_to_str(hr), hr, stmt);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt)
|
||||
{
|
||||
if (!SUCCEEDED(hr))
|
||||
{
|
||||
TRACE("Direct3D9 error %s [%08x] (%s)\n", dbg_d3d9_hr_to_str(hr), hr, stmt);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
BOOL d3d9_on_device_lost()
|
||||
{
|
||||
if (g_d3d9.device && IDirect3DDevice9_TestCooperativeLevel(g_d3d9.device) == D3DERR_DEVICENOTRESET)
|
||||
{
|
||||
return d3d9_reset(g_config.windowed);
|
||||
return d3d9_reset();
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL d3d9_reset(BOOL windowed)
|
||||
BOOL d3d9_reset()
|
||||
{
|
||||
g_d3d9.params.Windowed = windowed || g_config.nonexclusive;
|
||||
g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw.render.width;
|
||||
g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw.render.height;
|
||||
g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate;
|
||||
g_d3d9.params.BackBufferFormat = g_ddraw.mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8;
|
||||
g_d3d9.params.Windowed = g_ddraw->windowed;
|
||||
g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width;
|
||||
g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height;
|
||||
g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8;
|
||||
|
||||
if (g_d3d9.device && SUCCEEDEDX(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params)))
|
||||
if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params)))
|
||||
{
|
||||
BOOL result = d3d9_set_states();
|
||||
|
||||
if (result)
|
||||
{
|
||||
InterlockedExchange(&g_ddraw.render.palette_updated, TRUE);
|
||||
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
|
||||
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||
}
|
||||
|
||||
return result;
|
||||
return d3d9_set_states();
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL d3d9_release_resources()
|
||||
BOOL d3d9_release()
|
||||
{
|
||||
if (g_d3d9.pixel_shader)
|
||||
{
|
||||
|
|
@ -241,10 +130,10 @@ BOOL d3d9_release_resources()
|
|||
g_d3d9.pixel_shader = NULL;
|
||||
}
|
||||
|
||||
if (g_d3d9.pixel_shader_upscale)
|
||||
if (g_d3d9.pixel_shader_bilinear)
|
||||
{
|
||||
IDirect3DPixelShader9_Release(g_d3d9.pixel_shader_upscale);
|
||||
g_d3d9.pixel_shader_upscale = NULL;
|
||||
IDirect3DPixelShader9_Release(g_d3d9.pixel_shader_bilinear);
|
||||
g_d3d9.pixel_shader_bilinear = NULL;
|
||||
}
|
||||
|
||||
for (int i = 0; i < D3D9_TEXTURE_COUNT; i++)
|
||||
|
|
@ -268,39 +157,27 @@ BOOL d3d9_release_resources()
|
|||
g_d3d9.vertex_buf = NULL;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL d3d9_release()
|
||||
{
|
||||
d3d9_release_resources();
|
||||
|
||||
if (g_d3d9.device)
|
||||
{
|
||||
while (IDirect3DDevice9_Release(g_d3d9.device));
|
||||
IDirect3DDevice9_Release(g_d3d9.device);
|
||||
g_d3d9.device = NULL;
|
||||
}
|
||||
|
||||
if (g_d3d9.instance)
|
||||
{
|
||||
while (IDirect3D9_Release(g_d3d9.instance));
|
||||
IDirect3D9_Release(g_d3d9.instance);
|
||||
g_d3d9.instance = NULL;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL d3d9_create_resources()
|
||||
static BOOL d3d9_create_resouces()
|
||||
{
|
||||
if (!g_d3d9.device)
|
||||
return FALSE;
|
||||
|
||||
d3d9_release_resources();
|
||||
|
||||
BOOL err = FALSE;
|
||||
|
||||
int width = g_ddraw.width;
|
||||
int height = g_ddraw.height;
|
||||
int width = g_ddraw->width;
|
||||
int height = g_ddraw->height;
|
||||
|
||||
g_d3d9.tex_width =
|
||||
width <= 1024 ? 1024 : width <= 2048 ? 2048 : width <= 4096 ? 4096 : width;
|
||||
|
|
@ -313,7 +190,7 @@ static BOOL d3d9_create_resources()
|
|||
g_d3d9.scale_w = (float)width / g_d3d9.tex_width;;
|
||||
g_d3d9.scale_h = (float)height / g_d3d9.tex_height;
|
||||
|
||||
err = err || FAILEDX(
|
||||
err = err || FAILED(
|
||||
IDirect3DDevice9_CreateVertexBuffer(
|
||||
g_d3d9.device,
|
||||
sizeof(CUSTOMVERTEX) * 4, 0,
|
||||
|
|
@ -322,88 +199,27 @@ static BOOL d3d9_create_resources()
|
|||
&g_d3d9.vertex_buf,
|
||||
NULL));
|
||||
|
||||
err = err || !d3d9_update_vertices(InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0), TRUE);
|
||||
err = err || !d3d9_update_vertices(InterlockedExchangeAdd(&g_ddraw->upscale_hack_active, 0), TRUE);
|
||||
|
||||
for (int i = 0; i < D3D9_TEXTURE_COUNT; i++)
|
||||
{
|
||||
if (g_ddraw.bpp == 16 && g_config.rgb555)
|
||||
{
|
||||
BOOL error = FAILEDX(
|
||||
IDirect3DDevice9_CreateTexture(
|
||||
g_d3d9.device,
|
||||
g_d3d9.tex_width,
|
||||
g_d3d9.tex_height,
|
||||
1,
|
||||
0,
|
||||
D3DFMT_X1R5G5B5,
|
||||
D3DPOOL_MANAGED,
|
||||
&g_d3d9.surface_tex[i],
|
||||
0));
|
||||
|
||||
if (error)
|
||||
{
|
||||
err = err || FAILEDX(
|
||||
IDirect3DDevice9_CreateTexture(
|
||||
g_d3d9.device,
|
||||
g_d3d9.tex_width,
|
||||
g_d3d9.tex_height,
|
||||
1,
|
||||
0,
|
||||
D3DFMT_A1R5G5B5,
|
||||
D3DPOOL_MANAGED,
|
||||
&g_d3d9.surface_tex[i],
|
||||
0));
|
||||
}
|
||||
}
|
||||
else if (g_ddraw.bpp == 32)
|
||||
{
|
||||
BOOL error = FAILEDX(
|
||||
IDirect3DDevice9_CreateTexture(
|
||||
g_d3d9.device,
|
||||
g_d3d9.tex_width,
|
||||
g_d3d9.tex_height,
|
||||
1,
|
||||
0,
|
||||
D3DFMT_X8R8G8B8,
|
||||
D3DPOOL_MANAGED,
|
||||
&g_d3d9.surface_tex[i],
|
||||
0));
|
||||
|
||||
if (error)
|
||||
{
|
||||
err = err || FAILEDX(
|
||||
IDirect3DDevice9_CreateTexture(
|
||||
g_d3d9.device,
|
||||
g_d3d9.tex_width,
|
||||
g_d3d9.tex_height,
|
||||
1,
|
||||
0,
|
||||
D3DFMT_A8R8G8B8,
|
||||
D3DPOOL_MANAGED,
|
||||
&g_d3d9.surface_tex[i],
|
||||
0));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
err = err || FAILEDX(
|
||||
IDirect3DDevice9_CreateTexture(
|
||||
g_d3d9.device,
|
||||
g_d3d9.tex_width,
|
||||
g_d3d9.tex_height,
|
||||
1,
|
||||
0,
|
||||
g_ddraw.bpp == 16 ? D3DFMT_R5G6B5 : D3DFMT_L8,
|
||||
D3DPOOL_MANAGED,
|
||||
&g_d3d9.surface_tex[i],
|
||||
0));
|
||||
}
|
||||
err = err || FAILED(
|
||||
IDirect3DDevice9_CreateTexture(
|
||||
g_d3d9.device,
|
||||
g_d3d9.tex_width,
|
||||
g_d3d9.tex_height,
|
||||
1,
|
||||
0,
|
||||
g_ddraw->bpp == 16 ? D3DFMT_R5G6B5 : g_ddraw->bpp == 32 ? D3DFMT_X8R8G8B8 : D3DFMT_L8,
|
||||
D3DPOOL_MANAGED,
|
||||
&g_d3d9.surface_tex[i],
|
||||
0));
|
||||
|
||||
err = err || !g_d3d9.surface_tex[i];
|
||||
|
||||
if (g_ddraw.bpp == 8)
|
||||
if (g_ddraw->bpp == 8)
|
||||
{
|
||||
BOOL error = FAILEDX(
|
||||
err = err || FAILED(
|
||||
IDirect3DDevice9_CreateTexture(
|
||||
g_d3d9.device,
|
||||
256,
|
||||
|
|
@ -415,143 +231,85 @@ static BOOL d3d9_create_resources()
|
|||
&g_d3d9.palette_tex[i],
|
||||
0));
|
||||
|
||||
if (error)
|
||||
{
|
||||
err = err || FAILEDX(
|
||||
IDirect3DDevice9_CreateTexture(
|
||||
g_d3d9.device,
|
||||
256,
|
||||
256,
|
||||
1,
|
||||
0,
|
||||
D3DFMT_A8R8G8B8,
|
||||
D3DPOOL_MANAGED,
|
||||
&g_d3d9.palette_tex[i],
|
||||
0));
|
||||
}
|
||||
|
||||
err = err || !g_d3d9.palette_tex[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (g_ddraw.bpp == 8)
|
||||
if (g_ddraw->bpp == 8)
|
||||
{
|
||||
err = err || FAILEDX(
|
||||
err = err || FAILED(
|
||||
IDirect3DDevice9_CreatePixelShader(g_d3d9.device, (DWORD*)D3D9_PALETTE_SHADER, &g_d3d9.pixel_shader));
|
||||
|
||||
IDirect3DDevice9_CreatePixelShader(
|
||||
g_d3d9.device,
|
||||
(DWORD*)D3D9_PALETTE_SHADER_BILINEAR,
|
||||
&g_d3d9.pixel_shader_upscale);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (g_config.d3d9_filter == FILTER_LANCZOS)
|
||||
{
|
||||
BOOL error = FAILEDX(
|
||||
IDirect3DDevice9_CreatePixelShader(
|
||||
g_d3d9.device,
|
||||
(DWORD*)D3D9_LANCZOS2_SHADER,
|
||||
&g_d3d9.pixel_shader_upscale));
|
||||
|
||||
if (error || !g_d3d9.pixel_shader_upscale)
|
||||
{
|
||||
g_config.d3d9_filter = FILTER_CUBIC;
|
||||
}
|
||||
}
|
||||
|
||||
if (g_config.d3d9_filter == FILTER_CUBIC)
|
||||
{
|
||||
IDirect3DDevice9_CreatePixelShader(
|
||||
g_d3d9.device,
|
||||
(DWORD*)D3D9_CATMULL_ROM_SHADER,
|
||||
&g_d3d9.pixel_shader_upscale);
|
||||
}
|
||||
&g_d3d9.pixel_shader_bilinear);
|
||||
}
|
||||
|
||||
return g_d3d9.vertex_buf && (g_d3d9.pixel_shader || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !err;
|
||||
return g_d3d9.vertex_buf && (g_d3d9.pixel_shader || g_ddraw->bpp == 16 || g_ddraw->bpp == 32) && !err;
|
||||
}
|
||||
|
||||
static BOOL d3d9_set_states()
|
||||
{
|
||||
BOOL err = FALSE;
|
||||
|
||||
err = err || FAILEDX(IDirect3DDevice9_SetFVF(g_d3d9.device, D3DFVF_XYZRHW | D3DFVF_TEX1));
|
||||
err = err || FAILEDX(IDirect3DDevice9_SetStreamSource(g_d3d9.device, 0, g_d3d9.vertex_buf, 0, sizeof(CUSTOMVERTEX)));
|
||||
err = err || FAILEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[0]));
|
||||
err = err || FAILED(IDirect3DDevice9_SetFVF(g_d3d9.device, D3DFVF_XYZRHW | D3DFVF_TEX1));
|
||||
err = err || FAILED(IDirect3DDevice9_SetStreamSource(g_d3d9.device, 0, g_d3d9.vertex_buf, 0, sizeof(CUSTOMVERTEX)));
|
||||
err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[0]));
|
||||
|
||||
if (g_ddraw.bpp == 8)
|
||||
if (g_ddraw->bpp == 8)
|
||||
{
|
||||
err = err || FAILEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0]));
|
||||
err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0]));
|
||||
|
||||
BOOL bilinear =
|
||||
g_config.d3d9_filter &&
|
||||
g_d3d9.pixel_shader_upscale &&
|
||||
(g_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height || g_config.vhack);
|
||||
g_ddraw->d3d9linear &&
|
||||
g_d3d9.pixel_shader_bilinear &&
|
||||
(g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height);
|
||||
|
||||
err = err || FAILEDX(
|
||||
err = err || FAILED(
|
||||
IDirect3DDevice9_SetPixelShader(
|
||||
g_d3d9.device,
|
||||
bilinear ? g_d3d9.pixel_shader_upscale : g_d3d9.pixel_shader));
|
||||
bilinear ? g_d3d9.pixel_shader_bilinear : g_d3d9.pixel_shader));
|
||||
|
||||
if (bilinear)
|
||||
{
|
||||
float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 };
|
||||
err = err || FAILEDX(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1));
|
||||
err = err || FAILED(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (g_config.d3d9_filter)
|
||||
if (g_ddraw->d3d9linear)
|
||||
{
|
||||
if (g_config.d3d9_filter == FILTER_LANCZOS &&
|
||||
g_d3d9.pixel_shader_upscale &&
|
||||
(g_ddraw.render.viewport.width != g_ddraw.width ||
|
||||
g_ddraw.render.viewport.height != g_ddraw.height) &&
|
||||
SUCCEEDEDX(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale)))
|
||||
{
|
||||
float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 };
|
||||
err = err || FAILEDX(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1));
|
||||
}
|
||||
else if (
|
||||
SUCCEEDEDX(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) &&
|
||||
SUCCEEDEDX(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) &&
|
||||
g_config.d3d9_filter == FILTER_CUBIC &&
|
||||
g_d3d9.pixel_shader_upscale &&
|
||||
(g_ddraw.render.viewport.width != g_ddraw.width ||
|
||||
g_ddraw.render.viewport.height != g_ddraw.height) &&
|
||||
SUCCEEDEDX(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale)))
|
||||
{
|
||||
float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 };
|
||||
err = err || FAILEDX(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1));
|
||||
}
|
||||
IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
|
||||
IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
D3DVIEWPORT9 view_data = {
|
||||
g_ddraw.render.viewport.x,
|
||||
g_ddraw.render.viewport.y,
|
||||
g_ddraw.render.viewport.width,
|
||||
g_ddraw.render.viewport.height,
|
||||
g_ddraw->render.viewport.x,
|
||||
g_ddraw->render.viewport.y,
|
||||
g_ddraw->render.viewport.width,
|
||||
g_ddraw->render.viewport.height,
|
||||
0.0f,
|
||||
1.0f };
|
||||
|
||||
err = err || FAILEDX(IDirect3DDevice9_SetViewport(g_d3d9.device, &view_data));
|
||||
err = err || FAILED(IDirect3DDevice9_SetViewport(g_d3d9.device, &view_data));
|
||||
*/
|
||||
return !err;
|
||||
}
|
||||
|
||||
static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch)
|
||||
{
|
||||
float vp_x = stretch ? (float)g_ddraw.render.viewport.x : 0.0f;
|
||||
float vp_y = stretch ? (float)g_ddraw.render.viewport.y : 0.0f;
|
||||
float vp_x = stretch ? (float)g_ddraw->render.viewport.x : 0.0f;
|
||||
float vp_y = stretch ? (float)g_ddraw->render.viewport.y : 0.0f;
|
||||
|
||||
float vp_w = stretch ? (float)(g_ddraw.render.viewport.width + g_ddraw.render.viewport.x) : (float)g_ddraw.width;
|
||||
float vp_h = stretch ? (float)(g_ddraw.render.viewport.height + g_ddraw.render.viewport.y) : (float)g_ddraw.height;
|
||||
float vp_w = stretch ? (float)(g_ddraw->render.viewport.width + g_ddraw->render.viewport.x) : (float)g_ddraw->width;
|
||||
float vp_h = stretch ? (float)(g_ddraw->render.viewport.height + g_ddraw->render.viewport.y) : (float)g_ddraw->height;
|
||||
|
||||
float s_h = upscale_hack ? g_d3d9.scale_h * ((float)g_ddraw.upscale_hack_height / g_ddraw.height) : g_d3d9.scale_h;
|
||||
float s_w = upscale_hack ? g_d3d9.scale_w * ((float)g_ddraw.upscale_hack_width / g_ddraw.width) : g_d3d9.scale_w;
|
||||
float s_h = upscale_hack ? g_d3d9.scale_h * ((float)g_ddraw->upscale_hack_height / g_ddraw->height) : g_d3d9.scale_h;
|
||||
float s_w = upscale_hack ? g_d3d9.scale_w * ((float)g_ddraw->upscale_hack_width / g_ddraw->width) : g_d3d9.scale_w;
|
||||
|
||||
CUSTOMVERTEX vertices[] =
|
||||
{
|
||||
|
|
@ -562,7 +320,7 @@ static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch)
|
|||
};
|
||||
|
||||
void* data;
|
||||
if (g_d3d9.vertex_buf && SUCCEEDEDX(IDirect3DVertexBuffer9_Lock(g_d3d9.vertex_buf, 0, 0, (void**)&data, 0)))
|
||||
if (g_d3d9.vertex_buf && SUCCEEDED(IDirect3DVertexBuffer9_Lock(g_d3d9.vertex_buf, 0, 0, (void**)&data, 0)))
|
||||
{
|
||||
memcpy(data, vertices, sizeof(vertices));
|
||||
|
||||
|
|
@ -575,17 +333,17 @@ static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch)
|
|||
|
||||
DWORD WINAPI d3d9_render_main(void)
|
||||
{
|
||||
Sleep(250);
|
||||
Sleep(500);
|
||||
|
||||
fpsl_init();
|
||||
|
||||
BOOL needs_update = FALSE;
|
||||
LONG clear_count = 0;
|
||||
|
||||
DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE;
|
||||
DWORD timeout = g_ddraw->render.minfps > 0 ? g_ddraw->render.minfps_tick_len : 200;
|
||||
|
||||
while (g_ddraw.render.run &&
|
||||
(g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) &&
|
||||
g_ddraw.render.run)
|
||||
while (g_ddraw->render.run &&
|
||||
(g_ddraw->render.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED))
|
||||
{
|
||||
#if _DEBUG
|
||||
dbg_draw_frame_info_start();
|
||||
|
|
@ -593,87 +351,84 @@ DWORD WINAPI d3d9_render_main(void)
|
|||
|
||||
static int tex_index = 0, pal_index = 0;
|
||||
|
||||
if (InterlockedExchange(&g_ddraw->render.clear_screen, FALSE))
|
||||
clear_count = 10;
|
||||
|
||||
fpsl_frame_start();
|
||||
|
||||
EnterCriticalSection(&g_ddraw.cs);
|
||||
EnterCriticalSection(&g_ddraw->cs);
|
||||
|
||||
if (g_ddraw.primary &&
|
||||
g_ddraw.primary->bpp == g_ddraw.bpp &&
|
||||
g_ddraw.primary->width == g_ddraw.width &&
|
||||
g_ddraw.primary->height == g_ddraw.height &&
|
||||
(g_ddraw.bpp == 16 || g_ddraw.bpp == 32 || g_ddraw.primary->palette))
|
||||
if (g_ddraw->primary &&
|
||||
g_ddraw->primary->bpp == g_ddraw->bpp &&
|
||||
(g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette))
|
||||
{
|
||||
if (g_config.lock_surfaces)
|
||||
EnterCriticalSection(&g_ddraw.primary->cs);
|
||||
|
||||
if (g_config.vhack)
|
||||
if (g_ddraw->vhack)
|
||||
{
|
||||
if (util_detect_low_res_screen())
|
||||
{
|
||||
if (!InterlockedExchange(&g_ddraw.upscale_hack_active, TRUE))
|
||||
if (!InterlockedExchange(&g_ddraw->upscale_hack_active, TRUE))
|
||||
d3d9_update_vertices(TRUE, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE))
|
||||
if (InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE))
|
||||
d3d9_update_vertices(FALSE, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
D3DLOCKED_RECT lock_rc;
|
||||
|
||||
if (InterlockedExchange(&g_ddraw.render.surface_updated, FALSE) || g_config.minfps == -2)
|
||||
if (InterlockedExchange(&g_ddraw->render.surface_updated, FALSE) || g_ddraw->render.minfps == -2)
|
||||
{
|
||||
if (++tex_index >= D3D9_TEXTURE_COUNT)
|
||||
tex_index = 0;
|
||||
|
||||
RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height };
|
||||
RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height };
|
||||
|
||||
if (SUCCEEDEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[tex_index])) &&
|
||||
SUCCEEDEDX(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0)))
|
||||
if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[tex_index])) &&
|
||||
SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0)))
|
||||
{
|
||||
blt_clean(
|
||||
lock_rc.pBits,
|
||||
0,
|
||||
0,
|
||||
g_ddraw.primary->width,
|
||||
g_ddraw.primary->height,
|
||||
lock_rc.Pitch,
|
||||
g_ddraw.primary->surface,
|
||||
0,
|
||||
0,
|
||||
g_ddraw.primary->pitch,
|
||||
g_ddraw.primary->bpp);
|
||||
unsigned char* src = (unsigned char*)g_ddraw->primary->surface;
|
||||
unsigned char* dst = (unsigned char*)lock_rc.pBits;
|
||||
|
||||
int i;
|
||||
for (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);
|
||||
}
|
||||
}
|
||||
|
||||
if (g_ddraw.bpp == 8 &&
|
||||
(InterlockedExchange(&g_ddraw.render.palette_updated, FALSE) || g_config.minfps == -2))
|
||||
if (g_ddraw->bpp == 8 &&
|
||||
(InterlockedExchange(&g_ddraw->render.palette_updated, FALSE) || g_ddraw->render.minfps == -2))
|
||||
{
|
||||
if (++pal_index >= D3D9_TEXTURE_COUNT)
|
||||
pal_index = 0;
|
||||
|
||||
RECT rc = { 0,0,256,1 };
|
||||
|
||||
if (SUCCEEDEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[pal_index])) &&
|
||||
SUCCEEDEDX(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[pal_index], 0, &lock_rc, &rc, 0)))
|
||||
if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[pal_index])) &&
|
||||
SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[pal_index], 0, &lock_rc, &rc, 0)))
|
||||
{
|
||||
memcpy(lock_rc.pBits, g_ddraw.primary->palette->data_rgb, 256 * sizeof(int));
|
||||
memcpy(lock_rc.pBits, g_ddraw->primary->palette->data_rgb, 256 * sizeof(int));
|
||||
|
||||
IDirect3DTexture9_UnlockRect(g_d3d9.palette_tex[pal_index], 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (g_config.fixchilds)
|
||||
if (g_ddraw->fixchilds)
|
||||
{
|
||||
g_ddraw.child_window_exists = FALSE;
|
||||
EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary);
|
||||
g_ddraw->child_window_exists = FALSE;
|
||||
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)
|
||||
if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height)
|
||||
{
|
||||
if (g_ddraw.child_window_exists)
|
||||
if (g_ddraw->child_window_exists)
|
||||
{
|
||||
IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
|
||||
|
||||
|
|
@ -688,14 +443,35 @@ DWORD WINAPI d3d9_render_main(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (g_config.lock_surfaces)
|
||||
LeaveCriticalSection(&g_ddraw.primary->cs);
|
||||
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);
|
||||
LeaveCriticalSection(&g_ddraw->cs);
|
||||
|
||||
if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0)
|
||||
if (clear_count > 0)
|
||||
{
|
||||
clear_count--;
|
||||
IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
|
||||
}
|
||||
|
||||
|
|
@ -703,30 +479,11 @@ 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;
|
||||
SendMessageTimeout(g_ddraw.hwnd, WM_D3D9DEVICELOST, 0, 0, 0, 1000, &result);
|
||||
|
||||
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
|
||||
Sleep(50);
|
||||
SendMessageTimeout(g_ddraw->hwnd, WM_D3D9DEVICELOST, 0, 0, 0, 1000, &result);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Force redraw for GDI games (ClueFinders) */
|
||||
if (!g_ddraw.primary)
|
||||
{
|
||||
RedrawWindow(g_ddraw.hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
|
||||
}
|
||||
}
|
||||
|
||||
if (!g_ddraw.render.run)
|
||||
break;
|
||||
|
||||
#if _DEBUG
|
||||
dbg_draw_frame_info_end();
|
||||
|
|
@ -735,8 +492,8 @@ DWORD WINAPI d3d9_render_main(void)
|
|||
fpsl_frame_end();
|
||||
}
|
||||
|
||||
if (g_config.vhack)
|
||||
InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE);
|
||||
if (g_ddraw->vhack)
|
||||
InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
183
src/render_gdi.c
183
src/render_gdi.c
|
|
@ -6,9 +6,7 @@
|
|||
#include "opengl_utils.h"
|
||||
#include "utils.h"
|
||||
#include "wndproc.h"
|
||||
#include "hook.h"
|
||||
#include "debug.h"
|
||||
#include "config.h"
|
||||
|
||||
|
||||
DWORD WINAPI gdi_render_main(void)
|
||||
|
|
@ -16,20 +14,18 @@ DWORD WINAPI gdi_render_main(void)
|
|||
static DWORD warning_end_tick = 0;
|
||||
static char warning_text[512] = { 0 };
|
||||
|
||||
if (g_ddraw.show_driver_warning)
|
||||
if (g_ddraw->show_driver_warning)
|
||||
{
|
||||
g_ddraw.show_driver_warning = FALSE;
|
||||
|
||||
TRACE(" Switched to GDI renderer\n");
|
||||
g_ddraw->show_driver_warning = FALSE;
|
||||
|
||||
warning_end_tick = timeGetTime() + (15 * 1000);
|
||||
|
||||
if (!g_config.windowed)
|
||||
PostMessage(g_ddraw.hwnd, WM_AUTORENDERER, 0, 0);
|
||||
if (!g_ddraw->windowed)
|
||||
PostMessage(g_ddraw->hwnd, WM_AUTORENDERER, 0, 0);
|
||||
|
||||
_snprintf(
|
||||
warning_text,
|
||||
sizeof(warning_text) - 1,
|
||||
sizeof(warning_text),
|
||||
"-WARNING- Using slow software rendering, please update your graphics card driver (%s)",
|
||||
strlen(g_oglu_version) > 10 ? "" : g_oglu_version);
|
||||
}
|
||||
|
|
@ -38,11 +34,10 @@ DWORD WINAPI gdi_render_main(void)
|
|||
|
||||
fpsl_init();
|
||||
|
||||
DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE;
|
||||
DWORD timeout = g_ddraw->render.minfps > 0 ? g_ddraw->render.minfps_tick_len : INFINITE;
|
||||
|
||||
while (g_ddraw.render.run &&
|
||||
(g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) &&
|
||||
g_ddraw.render.run)
|
||||
while (g_ddraw->render.run &&
|
||||
(g_ddraw->render.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED))
|
||||
{
|
||||
#if _DEBUG
|
||||
dbg_draw_frame_info_start();
|
||||
|
|
@ -50,25 +45,20 @@ DWORD WINAPI gdi_render_main(void)
|
|||
|
||||
fpsl_frame_start();
|
||||
|
||||
EnterCriticalSection(&g_ddraw.cs);
|
||||
EnterCriticalSection(&g_ddraw->cs);
|
||||
|
||||
if (g_ddraw.primary &&
|
||||
g_ddraw.primary->bpp == g_ddraw.bpp &&
|
||||
g_ddraw.primary->width == g_ddraw.width &&
|
||||
g_ddraw.primary->height == g_ddraw.height &&
|
||||
(g_ddraw.bpp == 16 || g_ddraw.bpp == 32 || g_ddraw.primary->palette))
|
||||
if (g_ddraw->primary &&
|
||||
g_ddraw->primary->bpp == g_ddraw->bpp &&
|
||||
(g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette))
|
||||
{
|
||||
if (g_config.lock_surfaces)
|
||||
EnterCriticalSection(&g_ddraw.primary->cs);
|
||||
|
||||
if (warning_end_tick)
|
||||
{
|
||||
if (timeGetTime() < warning_end_tick)
|
||||
{
|
||||
HDC primary_dc;
|
||||
dds_GetDC(g_ddraw.primary, &primary_dc);
|
||||
dds_GetDC(g_ddraw->primary, &primary_dc);
|
||||
|
||||
RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height };
|
||||
RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height };
|
||||
DrawText(primary_dc, warning_text, -1, &rc, DT_NOCLIP | DT_CENTER);
|
||||
}
|
||||
else
|
||||
|
|
@ -77,103 +67,124 @@ DWORD WINAPI gdi_render_main(void)
|
|||
}
|
||||
}
|
||||
|
||||
BOOL upscale_hack = g_config.vhack && util_detect_low_res_screen();
|
||||
BOOL upscale_hack = g_ddraw->vhack && util_detect_low_res_screen();
|
||||
|
||||
if (g_config.vhack)
|
||||
InterlockedExchange(&g_ddraw.upscale_hack_active, upscale_hack);
|
||||
if (g_ddraw->vhack)
|
||||
InterlockedExchange(&g_ddraw->upscale_hack_active, upscale_hack);
|
||||
|
||||
if (g_config.fixchilds)
|
||||
if (g_ddraw->fixchilds)
|
||||
{
|
||||
g_ddraw.child_window_exists = FALSE;
|
||||
EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary);
|
||||
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.bpp == 8 && g_ddraw.primary->palette)
|
||||
if (g_ddraw->primary->palette)
|
||||
{
|
||||
memcpy(&g_ddraw.primary->bmi->bmiColors[0], g_ddraw.primary->palette->data_rgb, 256 * sizeof(int));
|
||||
memcpy(&g_ddraw->primary->bmi->bmiColors[0], g_ddraw->primary->palette->data_rgb, 256 * sizeof(int));
|
||||
}
|
||||
|
||||
if (InterlockedExchange(&g_ddraw.render.clear_screen, FALSE) || g_ddraw.child_window_exists)
|
||||
if (InterlockedExchange(&g_ddraw->render.clear_screen, FALSE))
|
||||
{
|
||||
RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height };
|
||||
FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
|
||||
RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height };
|
||||
FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
|
||||
}
|
||||
|
||||
int lines_copied = 0;
|
||||
|
||||
if (g_ddraw.bnet_active)
|
||||
if (g_ddraw->gdilinear)
|
||||
{
|
||||
RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height };
|
||||
FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
|
||||
lines_copied = 1;
|
||||
SetStretchBltMode(g_ddraw->render.hdc, HALFTONE);
|
||||
SetBrushOrgEx(g_ddraw->render.hdc, 0, 0, NULL);
|
||||
}
|
||||
|
||||
if (g_ddraw->bnet_active)
|
||||
{
|
||||
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)
|
||||
{
|
||||
lines_copied = real_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,
|
||||
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,
|
||||
g_ddraw.height - g_ddraw.upscale_hack_height,
|
||||
g_ddraw.upscale_hack_width,
|
||||
g_ddraw.upscale_hack_height,
|
||||
g_ddraw.primary->surface,
|
||||
g_ddraw.primary->bmi,
|
||||
g_ddraw->height - g_ddraw->upscale_hack_height,
|
||||
g_ddraw->upscale_hack_width,
|
||||
g_ddraw->upscale_hack_height,
|
||||
g_ddraw->primary->surface,
|
||||
g_ddraw->primary->bmi,
|
||||
DIB_RGB_COLORS,
|
||||
SRCCOPY);
|
||||
}
|
||||
else if (!g_ddraw.child_window_exists &&
|
||||
(g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height))
|
||||
else if (!g_ddraw->child_window_exists &&
|
||||
(g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height))
|
||||
{
|
||||
lines_copied = real_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,
|
||||
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->surface,
|
||||
g_ddraw.primary->bmi,
|
||||
g_ddraw->width,
|
||||
g_ddraw->height,
|
||||
g_ddraw->primary->surface,
|
||||
g_ddraw->primary->bmi,
|
||||
DIB_RGB_COLORS,
|
||||
SRCCOPY);
|
||||
}
|
||||
|
||||
if (lines_copied == 0 || lines_copied == GDI_ERROR)
|
||||
else
|
||||
{
|
||||
real_SetDIBitsToDevice(
|
||||
g_ddraw.render.hdc,
|
||||
SetDIBitsToDevice(
|
||||
g_ddraw->render.hdc,
|
||||
0,
|
||||
0,
|
||||
g_ddraw.width,
|
||||
g_ddraw.height,
|
||||
g_ddraw->width,
|
||||
g_ddraw->height,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
g_ddraw.height,
|
||||
g_ddraw.primary->surface,
|
||||
g_ddraw.primary->bmi,
|
||||
g_ddraw->height,
|
||||
g_ddraw->primary->surface,
|
||||
g_ddraw->primary->bmi,
|
||||
DIB_RGB_COLORS);
|
||||
}
|
||||
|
||||
if (g_config.lock_surfaces)
|
||||
LeaveCriticalSection(&g_ddraw.primary->cs);
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&g_ddraw.cs);
|
||||
|
||||
/* Force redraw for GDI games (ClueFinders) */
|
||||
if (!g_ddraw.primary)
|
||||
{
|
||||
RedrawWindow(g_ddraw.hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
|
||||
}
|
||||
|
||||
if (!g_ddraw.render.run)
|
||||
break;
|
||||
LeaveCriticalSection(&g_ddraw->cs);
|
||||
|
||||
#if _DEBUG
|
||||
dbg_draw_frame_info_end();
|
||||
|
|
|
|||
1238
src/render_ogl.c
1238
src/render_ogl.c
File diff suppressed because it is too large
Load diff
196
src/screenshot.c
196
src/screenshot.c
|
|
@ -6,10 +6,7 @@
|
|||
#include "ddpalette.h"
|
||||
#include "ddsurface.h"
|
||||
#include "lodepng.h"
|
||||
#include "blt.h"
|
||||
#include "config.h"
|
||||
|
||||
static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src);
|
||||
|
||||
static BOOL ss_screenshot_8bit(char* filename, IDirectDrawSurfaceImpl* src)
|
||||
{
|
||||
|
|
@ -32,15 +29,7 @@ static BOOL ss_screenshot_8bit(char* filename, IDirectDrawSurfaceImpl* src)
|
|||
|
||||
unsigned char* dst_buf = NULL;
|
||||
size_t dst_buf_size = 0;
|
||||
|
||||
unsigned int error =
|
||||
lodepng_encode(
|
||||
&dst_buf,
|
||||
&dst_buf_size,
|
||||
dds_GetBuffer(src),
|
||||
src->pitch / src->bytes_pp, /* can't specify pitch so we use bitmap real width */
|
||||
src->height,
|
||||
&state);
|
||||
unsigned int error = lodepng_encode(&dst_buf, &dst_buf_size, dds_GetBuffer(src), src->width, src->height, &state);
|
||||
|
||||
if (!error && dst_buf)
|
||||
lodepng_save_file(dst_buf, dst_buf_size, filename);
|
||||
|
|
@ -56,42 +45,31 @@ static BOOL ss_screenshot_8bit(char* filename, IDirectDrawSurfaceImpl* src)
|
|||
static BOOL ss_screenshot_16bit(char* filename, IDirectDrawSurfaceImpl* src)
|
||||
{
|
||||
unsigned int error = TRUE;
|
||||
unsigned int* buf = malloc(src->width * src->height * 4);
|
||||
unsigned int* dst_buf = malloc(src->width * src->height * 4);
|
||||
|
||||
if (buf)
|
||||
if (dst_buf)
|
||||
{
|
||||
if (g_config.rgb555)
|
||||
unsigned short* src_buf = (unsigned short*)dds_GetBuffer(src);
|
||||
|
||||
for (int y = 0; y < src->height; y++)
|
||||
{
|
||||
blt_rgb555_to_rgba8888(
|
||||
buf,
|
||||
0,
|
||||
0,
|
||||
src->width,
|
||||
src->height,
|
||||
src->width * 4,
|
||||
dds_GetBuffer(src),
|
||||
0,
|
||||
0,
|
||||
src->pitch);
|
||||
}
|
||||
else
|
||||
{
|
||||
blt_rgb565_to_rgba8888(
|
||||
buf,
|
||||
0,
|
||||
0,
|
||||
src->width,
|
||||
src->height,
|
||||
src->width * 4,
|
||||
dds_GetBuffer(src),
|
||||
0,
|
||||
0,
|
||||
src->pitch);
|
||||
int dst_row = y * src->width;
|
||||
|
||||
for (int x = 0; x < src->width; x++)
|
||||
{
|
||||
unsigned short pixel = src_buf[dst_row + x];
|
||||
|
||||
BYTE red = ((pixel & 0xF800) >> 11) << 3;
|
||||
BYTE green = ((pixel & 0x07E0) >> 5) << 2;
|
||||
BYTE blue = ((pixel & 0x001F)) << 3;
|
||||
|
||||
dst_buf[dst_row + x] = (0xFF << 24) | (blue << 16) | (green << 8) | red;
|
||||
}
|
||||
}
|
||||
|
||||
error = lodepng_encode32_file(filename, (unsigned char*)buf, src->width, src->height);
|
||||
error = lodepng_encode32_file(filename, (unsigned char*)dst_buf, src->width, src->height);
|
||||
|
||||
free(buf);
|
||||
free(dst_buf);
|
||||
}
|
||||
|
||||
return !error;
|
||||
|
|
@ -100,25 +78,31 @@ static BOOL ss_screenshot_16bit(char* filename, IDirectDrawSurfaceImpl* src)
|
|||
static BOOL ss_screenshot_32bit(char* filename, IDirectDrawSurfaceImpl* src)
|
||||
{
|
||||
unsigned int error = TRUE;
|
||||
unsigned int* buf = malloc(src->width * src->height * 4);
|
||||
unsigned int* dst_buf = malloc(src->width * src->height * 4);
|
||||
|
||||
if (buf)
|
||||
if (dst_buf)
|
||||
{
|
||||
blt_bgra8888_to_rgba8888(
|
||||
buf,
|
||||
0,
|
||||
0,
|
||||
src->width,
|
||||
src->height,
|
||||
src->width * 4,
|
||||
dds_GetBuffer(src),
|
||||
0,
|
||||
0,
|
||||
src->pitch);
|
||||
unsigned int* src_buf = (unsigned int*)dds_GetBuffer(src);
|
||||
|
||||
error = lodepng_encode32_file(filename, (unsigned char*)buf, src->width, src->height);
|
||||
for (int y = 0; y < src->height; y++)
|
||||
{
|
||||
int dst_row = y * src->width;
|
||||
|
||||
free(buf);
|
||||
for (int x = 0; x < src->width; x++)
|
||||
{
|
||||
unsigned int pixel = src_buf[dst_row + x];
|
||||
|
||||
BYTE red = (pixel >> 16) & 0xFF;
|
||||
BYTE green = (pixel >> 8) & 0xFF;
|
||||
BYTE blue = pixel & 0xFF;
|
||||
|
||||
dst_buf[dst_row + x] = (0xFF << 24) | (blue << 16) | (green << 8) | red;
|
||||
}
|
||||
}
|
||||
|
||||
error = lodepng_encode32_file(filename, (unsigned char*)dst_buf, src->width, src->height);
|
||||
|
||||
free(dst_buf);
|
||||
}
|
||||
|
||||
return !error;
|
||||
|
|
@ -126,7 +110,7 @@ static BOOL ss_screenshot_32bit(char* filename, IDirectDrawSurfaceImpl* src)
|
|||
|
||||
BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src)
|
||||
{
|
||||
if (!src || !dds_GetBuffer(src) || !src->width || !src->height)
|
||||
if (!src || !dds_GetBuffer(src))
|
||||
return FALSE;
|
||||
|
||||
char title[128];
|
||||
|
|
@ -134,7 +118,7 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src)
|
|||
char str_time[64];
|
||||
time_t t = time(NULL);
|
||||
|
||||
strncpy(title, g_ddraw.title, sizeof(g_ddraw.title));
|
||||
strncpy(title, g_ddraw->title, sizeof(g_ddraw->title));
|
||||
|
||||
for (int i = 0; i < strlen(title); i++)
|
||||
{
|
||||
|
|
@ -148,105 +132,21 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src)
|
|||
}
|
||||
}
|
||||
|
||||
CreateDirectoryA(g_config.screenshot_dir, NULL);
|
||||
|
||||
strftime(str_time, sizeof(str_time), "%Y-%m-%d_%H-%M-%S", localtime(&t));
|
||||
_snprintf(filename, sizeof(filename) - 1, "%s%s_%s.png", g_config.screenshot_dir, title, str_time);
|
||||
|
||||
if (FILE_EXISTS(filename))
|
||||
return FALSE;
|
||||
_snprintf(filename, sizeof(filename), "%s_%s.png", title, str_time);
|
||||
|
||||
if (src->bpp == 8 && src->palette)
|
||||
{
|
||||
if (!ss_screenshot_8bit(filename, src))
|
||||
{
|
||||
memcpy(&src->bmi->bmiColors[0], src->palette->data_rgb, 256 * sizeof(int));
|
||||
|
||||
return ss_screenshot_bmp(filename, src);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return ss_screenshot_8bit(filename, src);
|
||||
}
|
||||
else if (src->bpp == 16)
|
||||
{
|
||||
if (!ss_screenshot_16bit(filename, src))
|
||||
return ss_screenshot_bmp(filename, src);
|
||||
|
||||
return TRUE;
|
||||
return ss_screenshot_16bit(filename, src);
|
||||
}
|
||||
else if (src->bpp == 32)
|
||||
{
|
||||
if (!ss_screenshot_32bit(filename, src))
|
||||
return ss_screenshot_bmp(filename, src);
|
||||
|
||||
return TRUE;
|
||||
return ss_screenshot_32bit(filename, src);
|
||||
}
|
||||
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src)
|
||||
{
|
||||
BOOL result = TRUE;
|
||||
|
||||
// make sure file extension is correct
|
||||
char* ext = filename + strlen(filename) - 4;
|
||||
|
||||
if (_strcmpi(ext, ".png") == 0)
|
||||
{
|
||||
strncpy(ext, ".bmp", 5);
|
||||
}
|
||||
|
||||
// Create the .BMP file.
|
||||
HANDLE hf = CreateFile(
|
||||
filename,
|
||||
GENERIC_READ | GENERIC_WRITE,
|
||||
0,
|
||||
NULL,
|
||||
CREATE_ALWAYS,
|
||||
FILE_ATTRIBUTE_NORMAL,
|
||||
(HANDLE)NULL);
|
||||
|
||||
if (hf == INVALID_HANDLE_VALUE)
|
||||
return FALSE;
|
||||
|
||||
PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER)src->bmi;
|
||||
BITMAPFILEHEADER hdr;
|
||||
|
||||
hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"
|
||||
// Compute the size of the entire file.
|
||||
hdr.bfSize = (DWORD)(sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage);
|
||||
hdr.bfReserved1 = 0;
|
||||
hdr.bfReserved2 = 0;
|
||||
|
||||
// Compute the offset to the array of color indices.
|
||||
hdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD);
|
||||
|
||||
// Copy the BITMAPFILEHEADER into the .BMP file.
|
||||
DWORD tmp;
|
||||
if (!WriteFile(hf, (LPVOID)&hdr, sizeof(BITMAPFILEHEADER), (LPDWORD)&tmp, NULL))
|
||||
{
|
||||
result = FALSE;
|
||||
}
|
||||
|
||||
// Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
|
||||
if (!WriteFile(hf, (LPVOID)pbih, sizeof(BITMAPINFOHEADER) + pbih->biClrUsed * sizeof(RGBQUAD), (LPDWORD)&tmp, (NULL)))
|
||||
{
|
||||
result = FALSE;
|
||||
}
|
||||
|
||||
// Copy the array of color indices into the .BMP file.
|
||||
DWORD cb = pbih->biSizeImage;
|
||||
if (!WriteFile(hf, (LPSTR)dds_GetBuffer(src), (int)cb, (LPDWORD)&tmp, NULL))
|
||||
{
|
||||
result = FALSE;
|
||||
}
|
||||
|
||||
// Close the .BMP file.
|
||||
if (!CloseHandle(hf))
|
||||
{
|
||||
result = FALSE;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
818
src/utils.c
818
src/utils.c
File diff suppressed because it is too large
Load diff
|
|
@ -1,36 +0,0 @@
|
|||
#include <windows.h>
|
||||
#include "versionhelpers.h"
|
||||
#include "delay_imports.h"
|
||||
|
||||
|
||||
BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask)
|
||||
{
|
||||
return delay_RtlVerifyVersionInfo ?
|
||||
delay_RtlVerifyVersionInfo(versionInfo, typeMask, conditionMask) == 0 :
|
||||
VerifyVersionInfoW(versionInfo, typeMask, conditionMask);
|
||||
}
|
||||
|
||||
ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition)
|
||||
{
|
||||
return delay_VerSetConditionMask ? delay_VerSetConditionMask(ConditionMask, TypeMask, Condition) : 0;
|
||||
}
|
||||
|
||||
const char* verhelp_wine_get_version()
|
||||
{
|
||||
return delay_wine_get_version ? delay_wine_get_version() : NULL;
|
||||
}
|
||||
|
||||
void verhelp_wine_get_host_version(const char** sysname, const char** release)
|
||||
{
|
||||
if (delay_wine_get_host_version)
|
||||
{
|
||||
delay_wine_get_host_version(sysname, release);
|
||||
return;
|
||||
}
|
||||
|
||||
if (sysname)
|
||||
*sysname = NULL;
|
||||
|
||||
if (release)
|
||||
*release = NULL;
|
||||
}
|
||||
2135
src/winapi_hooks.c
2135
src/winapi_hooks.c
File diff suppressed because it is too large
Load diff
694
src/wndproc.c
694
src/wndproc.c
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue