Compare commits

..

47 commits

Author SHA1 Message Date
FunkyFr3sh
666a3ad0e3 only use shader if upscaling is enabled 2024-12-07 05:29:10 +01:00
FunkyFr3sh
6d44a0b122 fix issue where game is shifted towards the bottom right after joining the lobby twice 2024-12-07 05:01:22 +01:00
FunkyFr3sh
2ec028e87a allow alt+enter with fullscreen upscaled mode 2024-12-04 22:05:38 +01:00
FunkyFr3sh
292af455b6 set new toggle_fullscreen bool 2024-12-04 21:57:59 +01:00
FunkyFr3sh
952fe4fe1a add support for alt+enter in fullscreen upscaled mode 2024-12-04 21:57:52 +01:00
FunkyFr3sh
eeefbb9b71 add support for alt+enter in fullscreen upscaled mode 2024-12-04 21:57:27 +01:00
FunkyFr3sh
f2a613ff2a new .ini setting #toggle_borderless 2024-12-04 21:40:33 +01:00
FunkyFr3sh
a4e95ac6a0 force pos 0,0 in borderless mode 2024-12-04 21:31:17 +01:00
FunkyFr3sh
6987d1a773 remove unneeded function 2024-12-04 20:54:41 +01:00
FunkyFr3sh
da0ccd99e8 try to use translated key names 2024-12-04 20:54:33 +01:00
FunkyFr3sh
f0816d26a6 use english key names for now 2024-12-04 20:51:46 +01:00
FunkyFr3sh
02aa3bc0d9 remove fixwndprochook setting 2024-10-17 22:09:19 +02:00
FunkyFr3sh
418df16446 fix mousei input issues in diablo 1 2024-05-22 04:55:27 +02:00
FunkyFr3sh
51d9ef58d9 always use full path to avoid issues with working directories in wine 2024-04-03 00:37:24 +02:00
FunkyFr3sh
bf7a3d021a fix screenshot names 2024-03-07 17:44:34 +01:00
FunkyFr3sh
6ead8985be fix screenshot names 2024-03-07 17:42:36 +01:00
FunkyFr3sh
608cb6fa68 add 1024x576 to config 2024-02-17 03:49:32 +01:00
FunkyFr3sh
b9eead1947 fix url 2024-02-16 04:22:53 +01:00
FunkyFr3sh
0a88e48e60 reset resolution to default 2024-02-16 04:21:13 +01:00
FunkyFr3sh
6aae09eea9 increase dropdowncount 2024-02-16 01:46:54 +01:00
FunkyFr3sh
de2e3bb266 add new resolution settings 2024-02-16 01:45:41 +01:00
FunkyFr3sh
93c6e120b6 restore original .ini file name 2024-02-03 21:06:24 +01:00
FunkyFr3sh
3997c03d70 add 16:10 resolutions 2024-01-17 23:17:21 +01:00
FunkyFr3sh
88e9566ccf adjust ini file name and settings 2024-01-17 23:00:08 +01:00
FunkyFr3sh
02d300c519 change default settings 2023-09-03 00:18:32 +02:00
FunkyFr3sh
19ed60642f add Resolution setting 2023-09-03 00:08:14 +02:00
FunkyFr3sh
c9d5e1015c remove new filter settings to keep config compatible with old cnc-ddraw build 2023-09-02 23:22:04 +02:00
FunkyFr3sh
971bcb3985 update config to latest version 2023-09-02 23:11:51 +02:00
FunkyFr3sh
b50f9fff7b add hooks to fix blurry fonts 2023-08-16 14:21:26 +02:00
FunkyFr3sh
9b028e6376 disable debug code 2023-04-09 20:07:43 +02:00
FunkyFr3sh
50d4c0aa81 hook SetForegroundWindow for profile links 2023-04-09 20:06:51 +02:00
FunkyFr3sh
8643372afe fix for non working links in profile 2023-04-09 19:32:24 +02:00
FunkyFr3sh
6e9307a422 give bnet lobby a name to make OBS auto scene switcher working with the game 2021-11-28 12:49:13 +01:00
FunkyFr3sh
6a38496bf7 fix cursor lock on alt+tab 2021-11-27 17:38:22 +01:00
FunkyFr3sh
a71528f35f add workaround for multi-monitor setups 2021-11-27 12:51:35 +01:00
FunkyFr3sh
bf3d21c835 add exports for game patching 2021-11-20 03:45:05 +01:00
FunkyFr3sh
aa1ba9f6ec make lowest resolutio check less strict 2021-11-12 02:05:39 +01:00
FunkyFr3sh
e38222053b clear bnet surface on alt+enter 2021-11-12 02:00:40 +01:00
FunkyFr3sh
a4725e7b2d leave fullscreen exclusive on bnet 2021-11-11 23:19:26 +01:00
FunkyFr3sh
fce6319137 re-enable d3d9 but only for windowed/borderless - default to opengl 2021-11-08 03:18:28 +01:00
FunkyFr3sh
87d3fb169a center in windowed mode + clear 2021-11-08 02:36:28 +01:00
FunkyFr3sh
8c6b2814a9 redraw only top window for better performance 2021-11-07 23:22:46 +01:00
FunkyFr3sh
6a241ca0ae add OBS game capture support for bnet lobby 2021-11-07 22:42:55 +01:00
FunkyFr3sh
b4cb502f6a don't enable nonexclusive 2021-11-06 20:12:15 +01:00
FunkyFr3sh
f7d5d6a46e don't change display settings for original war2 2021-11-06 18:51:07 +01:00
FunkyFr3sh
2e23e4309c run lobby in fullscreen with opengl/gdi renderer 2021-11-06 17:12:02 +01:00
FunkyFr3sh
483a64c7e3 change default settings and rename ddraw.ini for high res pach tests 2021-11-06 17:11:23 +01:00
91 changed files with 4414 additions and 17879 deletions

View file

@ -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
View file

@ -1,6 +1,4 @@
inc/git.h
# C++ Builder
__astcache/

View file

@ -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

View file

@ -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
View file

@ -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.
&nbsp;
### 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).
&nbsp;
**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
&nbsp;
**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`.
&nbsp;
**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)
&nbsp;
@ -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
&nbsp;
### 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://img.shields.io/github/downloads/FunkyFr3sh/cnc-ddraw/total)](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.

View file

@ -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
View 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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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%" &gt; %DST_FILE%
echo #define GIT_BRANCH "%GIT_BRANCH%" &gt;&gt; %DST_FILE%
</Command>
</PreBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
@ -268,75 +197,11 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" &gt;&gt; %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%" &gt; %DST_FILE%
echo #define GIT_BRANCH "%GIT_BRANCH%" &gt;&gt; %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%" &gt; %DST_FILE%
echo #define GIT_BRANCH "%GIT_BRANCH%" &gt;&gt; %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%" &gt;&gt; %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%" &gt; %DST_FILE%
echo #define GIT_BRANCH "%GIT_BRANCH%" &gt;&gt; %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%" &gt; %DST_FILE%
echo #define GIT_BRANCH "%GIT_BRANCH%" &gt;&gt; %DST_FILE%
</Command>
</PreBuildEvent>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View file

@ -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>

View file

@ -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);
}

View file

@ -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

View file

@ -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

View file

@ -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>

View file

@ -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;
}
//---------------------------------------------------------------------------

View file

@ -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"

View file

@ -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
View 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
}
}

View file

@ -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);

View file

@ -14,9 +14,6 @@ typedef struct IDirectDrawClipperImpl
struct IDirectDrawClipperImplVtbl* lpVtbl;
ULONG ref;
HWND hwnd;
HRGN region;
CRITICAL_SECTION cs;
} IDirectDrawClipperImpl;

View file

@ -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
View file

@ -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

View file

@ -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

View file

@ -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

File diff suppressed because it is too large Load diff

View file

@ -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
View file

@ -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

View file

@ -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

View file

@ -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);

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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();

View file

@ -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);

View file

@ -1,7 +0,0 @@
#ifndef INDEO_H
#define INDEO_H
void indeo_enable();
void indeo_disable();
#endif

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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();

View file

@ -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
View 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

View file

@ -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();

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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
View file

@ -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
}
}

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;
}

View file

@ -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;

View file

@ -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);

View file

@ -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
View file

@ -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];
}
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -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
\*----------------------------------------------------------------------------*/

1638
src/dd.c

File diff suppressed because it is too large Load diff

View file

@ -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;

View file

@ -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;

File diff suppressed because it is too large Load diff

View file

@ -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*)&timestamp)));
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;

View file

@ -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");
}
}

View file

@ -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
}

View file

@ -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);
}

View file

@ -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 };

View file

@ -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);
}

View file

@ -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
View file

@ -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;
}
}

View file

@ -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);
}

View file

@ -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);

View file

@ -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);

View file

@ -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;
}

View file

@ -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();

File diff suppressed because it is too large Load diff

View file

@ -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;
}

File diff suppressed because it is too large Load diff

View file

@ -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;
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff