Compare commits

..

38 commits

Author SHA1 Message Date
FunkyFr3sh
3c3af81cd9 try fpsl_wait_for_vblank first 2024-12-16 02:34:10 +01:00
FunkyFr3sh
92c0b2a3ed don't use DwmFlush in wine 2024-12-16 02:33:25 +01:00
FunkyFr3sh
c77a6ce19e use HKLM for wine 2024-12-06 22:09:53 +01:00
FunkyFr3sh
4b9bd890a4 fix for last commit 2024-12-06 20:02:09 +01:00
FunkyFr3sh
721cf6616a make emoon's patch working on windows as well 2024-12-06 20:01:49 +01:00
FunkyFr3sh
896c2f5def keep old maintas setting working for cutscenes 2024-12-06 20:00:58 +01:00
FunkyFr3sh
a556262670
Merge pull request #362 from EmoonX/claw-movie-hq-widescreen-fix
Fix stretched HQ cutscene videos on widescreen Claw
2024-12-06 19:57:22 +01:00
EmoonX
1e61ebc099 Fix stretched HQ cutscene videos on Claw 2024-12-06 14:55:50 -03:00
FunkyFr3sh
ff9edf3e92 fix some warnings 2024-12-06 06:21:51 +01:00
FunkyFr3sh
3624008099 copy IAT hook changes from master branch 2024-12-06 06:19:03 +01:00
FunkyFr3sh
0a7f877c8f fix build on linux 2024-12-06 05:58:32 +01:00
FunkyFr3sh
411f043827 update makefile 2024-12-06 05:35:12 +01:00
FunkyFr3sh
0f575b40ea enable singlecpu by default 2024-10-01 21:02:02 +02:00
FunkyFr3sh
9f58e7925d fix for last commit 2024-10-01 20:59:42 +02:00
FunkyFr3sh
5ee245651e enable maintain aspect ratio by default 2024-10-01 20:58:00 +02:00
FunkyFr3sh
ef0fff19bd don't emulate 60hz vblank if we are running at 60hz already 2024-10-01 20:57:02 +02:00
FunkyFr3sh
f3e69355e5 fix cutscene playback in some games 2024-06-01 22:56:17 +02:00
FunkyFr3sh
0100459248 fix cutscene playbakc issues on windows 7 2024-06-01 22:30:38 +02:00
FunkyFr3sh
c8ef48c2c9 fix wayland bug (linux) 2024-02-17 07:59:57 +01:00
FunkyFr3sh
393627ee39 make sure we forward the right mouse coords to video window 2023-10-16 03:19:13 +02:00
FunkyFr3sh
ddfae6cd67 forward all input to video window 2023-10-16 03:08:29 +02:00
FunkyFr3sh
65969de0bd allow cursor unlock while video is playing 2023-10-16 02:18:22 +02:00
FunkyFr3sh
743907669e allow cursor lock while playing videos 2023-10-16 02:14:06 +02:00
FunkyFr3sh
e874a7e305 ignore mouse input while dvd video is playing 2023-10-16 02:12:29 +02:00
FunkyFr3sh
4d7fc88d37 block all keys except Esc while a dvd video is playing 2023-10-16 02:08:38 +02:00
FunkyFr3sh
b63410c444 add fix for custom levels 2023-10-08 11:59:09 +02:00
FunkyFr3sh
e3142956dc add support for xvid 2023-09-26 22:48:30 +02:00
FunkyFr3sh
7b7fefcad1 create registry key if it doesn't exist 2023-09-26 19:35:12 +02:00
FunkyFr3sh
3ad8a5bd0e add new hook flag for local hooks 2023-09-26 10:41:20 +02:00
FunkyFr3sh
68bd087cf0 re-enable hook 2023-09-26 10:02:01 +02:00
FunkyFr3sh
c8c7ead36e bump version 2023-09-26 07:18:41 +02:00
FunkyFr3sh
4d8181099c don't lock on WM_PAINT 2023-09-26 06:50:48 +02:00
FunkyFr3sh
2cf14bf2ef fix random freezing 2023-09-26 06:16:45 +02:00
FunkyFr3sh
e414568af4 fix color issues 2023-09-26 04:50:12 +02:00
FunkyFr3sh
e5fb4a061a fix upscaling on win10 2023-09-26 04:49:02 +02:00
FunkyFr3sh
a119eddd53 adjust default settings for claw 2023-09-26 02:27:00 +02:00
FunkyFr3sh
453d266d76 add temporary game patches for testing 2023-09-26 01:50:58 +02:00
FunkyFr3sh
b4b3e95832 dvd movie tests 2023-09-26 00:51:53 +02:00
81 changed files with 2575 additions and 11046 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

@ -3,36 +3,13 @@
TARGET ?= ddraw.dll
LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared
CFLAGS ?= -Iinc -O2 -Wall -std=c99
LIBS = -lgdi32 -lwinmm -lole32 -lmsimg32 -lavifil32 -luuid
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
CFLAGS ?= -Iinc -O2 -Wall -std=c99 -Wno-incompatible-pointer-types
LIBS = -lgdi32 -lwinmm -lole32 -lmsimg32 -lpsapi
CC = i686-w64-mingw32-gcc
WINDRES ?= i686-w64-mingw32-windres
SRCS := $(wildcard src/*.c) $(wildcard src/*/*.c) res.rc
SRCS := $(wildcard src/*.c) $(wildcard src/*/*.c) ddraw.rc
OBJS := $(addsuffix .o, $(basename $(SRCS)))
.PHONY: clean all
@ -42,7 +19,7 @@ all: $(TARGET)
$(WINDRES) -J rc $< $@ || windres -J rc $< $@
$(TARGET): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ exports.def $(LIBS)
$(CC) $(LDFLAGS) -o $@ $^ ddraw.def $(LIBS)
clean:
$(RM) $(TARGET) $(OBJS) || del $(TARGET) $(subst /,\\,$(OBJS))

496
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 2000, XP, Vista, 7, 8, 10, 11, Wine (Linux/macOS) and Virtual Machines
- 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
@ -24,16 +24,27 @@ cnc-ddraw can fix compatibility issues in older 2D games, such as black screen,
1. Download [cnc-ddraw.zip](https://github.com/FunkyFr3sh/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.
Wine (Linux/macOS) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries)
&nbsp;
**Important**
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. You can enable windowed mode via cnc-ddraw config.exe instead.
- **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;
**If the game starts but it doesn't work perfectly** then open the config program and check the **Compatibility settings**.
&nbsp;
**cnc-ddraw does not support Direct3D/Glide**, it will only work with games that use a **DirectDraw (Software)** renderer. Usually you can tell by the look of the game if it's a 3D game or not, but you can also let cnc-ddraw generate a debug log and search for "IDirect3D" - Link: https://github.com/FunkyFr3sh/cnc-ddraw/issues/44
&nbsp;
Some games may require additional steps before they can be used with cnc-ddraw, please check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) for more details.
&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/FunkyFr3sh/cnc-ddraw/issues/44)
&nbsp;
@ -46,446 +57,37 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
&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
- Captain Claw
- 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
- ...
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.
[![](https://img.shields.io/github/downloads/FunkyFr3sh/cnc-ddraw/total)](https://github.com/FunkyFr3sh/cnc-ddraw/releases/latest/download/cnc-ddraw.zip)

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:\w64devkit\bin
make clean
make
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

@ -8,22 +8,22 @@ EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
DebugLogMiniXP|x86 = DebugLogMiniXP|x86
DebugLogXP|x86 = DebugLogXP|x86
DebugLog|x86 = DebugLog|x86
DebugLogMini|x86 = DebugLogMini|x86
Release|x86 = Release|x86
ReleaseXP|x86 = ReleaseXP|x86
ReleaseWin2000|x86 = ReleaseWin2000|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}.DebugLogMini|x86.ActiveCfg = DebugLogMini|Win32
{96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMini|x86.Build.0 = DebugLogMini|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
{96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseWin2000|x86.ActiveCfg = ReleaseWin2000|Win32
{96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseWin2000|x86.Build.0 = ReleaseWin2000|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View file

@ -1,20 +1,20 @@
<?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>
<ProjectConfiguration Include="DebugLogMini|Win32">
<Configuration>DebugLogMini</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>
<ProjectConfiguration Include="ReleaseWin2000|Win32">
<Configuration>ReleaseWin2000</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
@ -27,7 +27,6 @@
<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 +49,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,7 +66,6 @@
<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>
@ -78,10 +73,8 @@
<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 +82,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" />
@ -115,49 +104,50 @@
<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>
<MASM Condition="'$(Configuration)|$(Platform)'=='ReleaseWin2000|Win32'" Include="src\win2000.asm" />
</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>
<PlatformToolset>v141_xp</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseXP|Win32'" Label="Configuration">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWin2000|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">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugLog|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)'=='DebugLogMini|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141_xp</PlatformToolset>
@ -165,7 +155,9 @@
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings" />
<ImportGroup Label="ExtensionSettings">
<Import Condition="'$(Configuration)|$(Platform)'=='ReleaseWin2000|Win32'" Project="$(VCTargetsPath)\BuildCustomizations\masm.props" />
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@ -174,13 +166,13 @@
<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">
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWin2000|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">
<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>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogMiniXP|Win32'" Label="PropertySheets">
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogMini|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 +188,21 @@
<LinkIncremental>false</LinkIncremental>
<TargetName>ddraw</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseXP|Win32'">
<OutDir>$(SolutionDir)bin\ReleaseXP\</OutDir>
<IntDir>$(SolutionDir)bin\ReleaseXP\</IntDir>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWin2000|Win32'">
<OutDir>$(SolutionDir)bin\ReleaseWin2000\</OutDir>
<IntDir>$(SolutionDir)bin\ReleaseWin2000\</IntDir>
<LinkIncremental>false</LinkIncremental>
<TargetName>ddraw</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogXP|Win32'">
<OutDir>$(SolutionDir)bin\DebugLogXP\</OutDir>
<IntDir>$(SolutionDir)bin\DebugLogXP\</IntDir>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugLog|Win32'">
<OutDir>$(SolutionDir)bin\DebugLog\</OutDir>
<IntDir>$(SolutionDir)bin\DebugLog\</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)'=='DebugLogMini|Win32'">
<OutDir>$(SolutionDir)bin\DebugLogMini\</OutDir>
<IntDir>$(SolutionDir)bin\DebugLogMini\</IntDir>
<LinkIncremental>false</LinkIncremental>
<TargetName>ddraw</TargetName>
</PropertyGroup>
@ -220,37 +212,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,33 +245,18 @@ 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)" (
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'">
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWin2000|Win32'">
<ClCompile>
<WarningLevel>Level2</WarningLevel>
<PrecompiledHeader>
@ -305,38 +267,27 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" &gt;&gt; %DST_FILE%
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalIncludeDirectories>inc;src\detours</AdditionalIncludeDirectories>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
</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>
<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)" (
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>
<MASM>
<AdditionalOptions>/safeseh %(AdditionalOptions)</AdditionalOptions>
</MASM>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogXP|Win32'">
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugLog|Win32'">
<ClCompile>
<WarningLevel>Level2</WarningLevel>
<PrecompiledHeader>
@ -352,33 +303,18 @@ 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)" (
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'">
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogMini|Win32'">
<ClCompile>
<WarningLevel>Level2</WarningLevel>
<PrecompiledHeader>
@ -394,32 +330,19 @@ 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)" (
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">
<Import Condition="'$(Configuration)|$(Platform)'=='ReleaseWin2000|Win32'" Project="$(VCTargetsPath)\BuildCustomizations\masm.targets" />
</ImportGroup>
</Project>

View file

@ -156,21 +156,6 @@
<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">
@ -284,30 +269,9 @@
<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

@ -24,8 +24,6 @@ int Savesettings;
int Resolutions;
int Minfps;
#define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\")
//---------------------------------------------------------------------------
__fastcall TConfigForm::TConfigForm(TComponent* Owner)
: TForm(Owner)
@ -43,12 +41,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(".\\ddraw.ini");
ini->WriteString("ddraw", "configlang", IsEnglish ? "auto" : "english");
delete ini;
@ -65,12 +58,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(".\\ddraw.ini");
auto theme =
ThemePnl->Color == (TColor)RGB(31, 31, 31) ? "Cobalt XEMedia" : "Windows10";
@ -99,10 +87,7 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender)
return;
}
auto iniPath = System::Sysutils::GetEnvironmentVariable(
"CNC_DDRAW_CONFIG_FILE");
DeleteFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini");
DeleteFile(".\\ddraw.ini");
ShellExecute(
NULL,
@ -117,9 +102,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 +113,31 @@ 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"启用垂直同步";
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 +154,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;
@ -262,28 +222,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;
@ -306,7 +244,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 +281,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;
@ -426,28 +341,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;
@ -507,28 +400,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;
@ -588,28 +459,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;
@ -669,190 +518,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 +565,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 (...) {
}
@ -970,28 +623,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,16 +669,12 @@ 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(".\\ddraw.dll") && !FileExists(".\\ddraw.ini")) {
SetEnvironmentVariableW(L"cnc_ddraw_config_init", L"1");
HMODULE ddraw = LoadLibraryW((GAME_PATH + "ddraw.dll").w_str());
HMODULE ddraw = LoadLibraryW(L".\\ddraw.dll");
if (ddraw) {
@ -1067,8 +694,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender)
}
}
auto *ini =
new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini");
auto *ini = new TIniFile(".\\ddraw.ini");
if (ini->ReadString("ddraw", "configtheme", "Windows10") == "Cobalt XEMedia") {
@ -1144,9 +770,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(
@ -1274,13 +897,13 @@ 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(".\\ddraw.dll") &&
FileExists(".\\ddraw.ini") &&
GetBool(ini, "allow_reset", true);
delete ini;
@ -1293,11 +916,7 @@ 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(".\\ddraw.ini");
/* Display Settings */
@ -1306,19 +925,15 @@ void TConfigForm::SaveSettings()
ini->WriteString("ddraw", "windowed", "false");
ini->WriteString("ddraw", "fullscreen", "false");
ini->WriteString("ddraw", "toggle_borderless", "false");
ini->WriteString("ddraw", "toggle_upscaled", "false");
break;
case 1:
ini->WriteString("ddraw", "windowed", "false");
ini->WriteString("ddraw", "fullscreen", "true");
ini->WriteString("ddraw", "toggle_borderless", "false");
ini->WriteString("ddraw", "toggle_upscaled", "true");
break;
case 2:
ini->WriteString("ddraw", "windowed", "true");
ini->WriteString("ddraw", "fullscreen", "true");
ini->WriteString("ddraw", "toggle_borderless", "true");
ini->WriteString("ddraw", "toggle_upscaled", "false");
break;
case 3:
ini->WriteString("ddraw", "windowed", "true");
@ -1733,9 +1348,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 =

View file

@ -2677,7 +2677,7 @@ object ConfigForm: TConfigForm
61C0650530766087F0B9DE67A1EF3B173173597F3B695CC608E0B202F8FC22D7
BBBF4CD8CBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCB
B88CB18EFF1FA2974C1C31AF16A40000000049454E44AE426082}
Position = poScreenCenter
Position = poDesktopCenter
OnActivate = FormActivate
OnCreate = FormCreate
DesignSize = (
@ -2696,6 +2696,8 @@ object ConfigForm: TConfigForm
ShowCaption = False
TabOrder = 1
StyleElements = [seFont, seBorder]
ExplicitWidth = 495
ExplicitHeight = 464
DesignSize = (
499
465)
@ -2725,8 +2727,6 @@ object ConfigForm: TConfigForm
Font.Name = 'Segoe UI'
Font.Style = []
ParentFont = False
ParentShowHint = False
ShowHint = True
end
object VsyncLbl: TLabel
Left = 40
@ -2755,8 +2755,6 @@ object ConfigForm: TConfigForm
Font.Name = 'Segoe UI'
Font.Style = []
ParentFont = False
ParentShowHint = False
ShowHint = True
end
object DevmodeLbl: TLabel
Left = 40
@ -2836,8 +2834,6 @@ object ConfigForm: TConfigForm
Top = 132
Width = 50
Height = 20
ParentShowHint = False
ShowHint = True
ShowStateCaption = False
TabOrder = 0
OnClick = MaintasChkClick
@ -2856,8 +2852,6 @@ object ConfigForm: TConfigForm
Top = 268
Width = 50
Height = 20
ParentShowHint = False
ShowHint = True
ShowStateCaption = False
TabOrder = 3
OnClick = AdjmouseChkClick
@ -2883,6 +2877,7 @@ object ConfigForm: TConfigForm
TabOrder = 5
StyleElements = [seFont, seBorder]
OnClick = ThemePnlClick
ExplicitLeft = 471
end
end
object CompatibilityPnl: TPanel
@ -2898,6 +2893,8 @@ object ConfigForm: TConfigForm
TabOrder = 3
Visible = False
StyleElements = [seFont, seBorder]
ExplicitWidth = 495
ExplicitHeight = 464
object MaxgameticksLbl: TLabel
Left = 40
Top = 28
@ -3078,6 +3075,8 @@ object ConfigForm: TConfigForm
TabOrder = 2
Visible = False
StyleElements = [seFont, seBorder]
ExplicitWidth = 495
ExplicitHeight = 464
object RendererLbl: TLabel
Left = 40
Top = 28
@ -3118,8 +3117,6 @@ object ConfigForm: TConfigForm
Font.Name = 'Segoe UI'
Font.Style = []
ParentFont = False
ParentShowHint = False
ShowHint = True
end
object MaxfpsLbl: TLabel
Left = 40
@ -3162,8 +3159,6 @@ object ConfigForm: TConfigForm
Font.Name = 'Segoe UI'
Font.Style = []
ParentFont = False
ParentShowHint = False
ShowHint = True
end
object RendererPbox: TPaintBox
Left = 40
@ -3195,8 +3190,6 @@ object ConfigForm: TConfigForm
Font.Name = 'Segoe UI'
Font.Style = []
ParentFont = False
ParentShowHint = False
ShowHint = True
TabOrder = 6
Visible = False
OnChange = ShaderD3DCbxChange
@ -3256,15 +3249,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 +3273,6 @@ object ConfigForm: TConfigForm
Top = 277
Width = 50
Height = 20
ParentShowHint = False
ShowHint = True
ShowStateCaption = False
TabOrder = 5
OnClick = BoxingChkClick
@ -3302,6 +3291,8 @@ object ConfigForm: TConfigForm
TabOrder = 4
Visible = False
StyleElements = [seFont, seBorder]
ExplicitWidth = 495
ExplicitHeight = 464
object ToggleWindowedLbl: TLabel
Left = 40
Top = 27
@ -3529,6 +3520,7 @@ object ConfigForm: TConfigForm
Color = clMenu
ParentBackground = False
TabOrder = 0
ExplicitHeight = 467
DesignSize = (
233
468)

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

@ -3,7 +3,6 @@
#include <vcl.h>
#pragma hdrstop
#include <IniFiles.hpp>
#include <IOUtils.hpp>
#include <System.Hash.hpp>
#include <tchar.h>
//---------------------------------------------------------------------------
@ -11,8 +10,6 @@
#include <Vcl.Themes.hpp>
USEFORM("ConfigFormUnit.cpp", ConfigForm);
//---------------------------------------------------------------------------
#define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\")
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
try
@ -34,12 +31,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(".\\ddraw.ini");
auto theme = ini->ReadString("ddraw", "configtheme", "Windows10");
TStyleManager::TrySetStyle(
@ -67,15 +59,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

@ -20,6 +20,3 @@ EXPORTS
DirectInput8Create = fake_DirectInput8Create
GameHandlesClose DATA
pvBmpBits = FakePrimarySurface DATA
DDIsWindowed
DDGetProcAddress
DDEnableZoom

View file

@ -1,6 +1,4 @@
#include "inc/version.h"
#include "inc/git.h"
1 VERSIONINFO
FILEVERSION VERSION
@ -12,13 +10,13 @@ PRODUCTVERSION VERSION
{
VALUE "CompanyName", "github.com/FunkyFr3sh"
VALUE "FileDescription", "DirectDraw replacement"
VALUE "FileVersion", VERSION_STRING " (git~" GIT_COMMIT ", " GIT_BRANCH ")"
VALUE "FileVersion", VERSION_STRING
VALUE "InternalName", "ddraw"
VALUE "LegalCopyright", "Copyright (c) 2010-2024"
VALUE "LegalCopyright", "Copyright (c) 2010-2023"
VALUE "LegalTrademarks", ""
VALUE "OriginalFileName", "ddraw.dll"
VALUE "ProductName", "cnc-ddraw"
VALUE "ProductVersion", VERSION_STRING " (git~" GIT_COMMIT ", " GIT_BRANCH ")"
VALUE "ProductVersion", VERSION_STRING
VALUE "Comments", "https://github.com/FunkyFr3sh/cnc-ddraw"
}
}

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

@ -16,7 +16,6 @@ typedef struct IDirectDrawClipperImpl
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,9 +18,9 @@ typedef struct IDirectDrawSurfaceImpl
ULONG ref;
DWORD bpp;
DWORD width;
DWORD height;
DWORD bpp;
DWORD size;
DWORD flags;
DWORD caps;
@ -33,8 +28,6 @@ typedef struct IDirectDrawSurfaceImpl
CRITICAL_SECTION cs;
IDirectDrawPaletteImpl* palette;
PALETTEENTRY selected_pal[256];
UINT selected_pal_count;
void* surface;
HANDLE mapping;
@ -45,12 +38,10 @@ typedef struct IDirectDrawSurfaceImpl
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;

View file

@ -1,34 +1,25 @@
#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
{
RECT window_rect;
int window_state;
int upscaled_state;
int borderless_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;
@ -40,20 +31,14 @@ typedef struct CNCDDRAWCONFIG
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;
@ -63,33 +48,30 @@ typedef struct CNCDDRAWCONFIG
/* Undocumented settings */
BOOL fix_alt_key_stuck;
BOOL fix_not_responding;
BOOL no_compat_warning;
BOOL releasealt;
BOOL fixnotresponding;
int hook;
int guard_lines;
int max_resolutions;
BOOL limit_bltfast;
BOOL lock_surfaces;
BOOL allow_wmactivate;
BOOL flipclear;
BOOL fixmousehook;
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;
int anti_aliased_fonts_min_size;
int custom_width;
int custom_height;
int min_font_size;
/* Hotkeys */
struct
{
int toggle_fullscreen;
int toggle_fullscreen2;
int toggle_maximize;
int toggle_maximize2;
int unlock_cursor1;
int unlock_cursor2;
int screenshot;
@ -97,16 +79,13 @@ typedef struct CNCDDRAWCONFIG
/* Game specific settings */
BOOL remove_menu;
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;

View file

@ -6,6 +6,5 @@
unsigned long Crc32_ComputeBuf(unsigned long inCrc32, const void* buf, size_t bufLen);
unsigned long Crc32_FromFile(unsigned long crc32, char* filename);
#endif

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_ */

View file

@ -15,16 +15,15 @@ typedef HRESULT(WINAPI* DIRECTDRAWCREATEPROC)(GUID FAR*, LPDIRECTDRAW FAR*, IUnk
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,7 +31,6 @@ 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
@ -47,52 +45,22 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute
#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;
@ -127,7 +95,6 @@ typedef struct CNCDDRAW
LONG palette_updated;
LONG surface_updated;
LONG clear_screen;
LONG screen_updated;
float scale_w;
float scale_h;
@ -156,8 +123,8 @@ typedef struct CNCDDRAW
BOOL isredalert;
BOOL iscnc1;
BOOL iskkndx;
BOOL isworms2;
LONG upscale_hack_active;
BOOL wine;
HCURSOR old_cursor;
int show_cursor_count;
BOOL alt_key_down;
@ -169,27 +136,17 @@ typedef struct CNCDDRAW
void* last_freed_palette; /* Dungeon Keeper hack */
void* last_freed_surface; /* Nox hack */
BOOL child_window_exists;
HWND video_window_hwnd;
BOOL got_child_windows;
DWORD last_set_window_pos_tick; /* WINE hack */
DWORD last_msg_pull_tick;
SPEEDLIMITER ticks_limiter;
SPEEDLIMITER flip_limiter;
DWORD minfps_tick_len;
DWORD gui_thread_id;
BOOL show_driver_warning;
BOOL windowed_hack;
BOOL d3d9on12;
BOOL opengl_core;
struct
{
HWND hwnd;
int x;
int y;
} textbox; /* Age Of Empires 2 textbox align */
struct
{
BOOL enabled;
} zoom;
} CNCDDRAW;
#endif

View file

@ -12,7 +12,6 @@ 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

@ -3,10 +3,8 @@
#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, ...);
@ -15,7 +13,6 @@ void dbg_draw_frame_info_start();
void dbg_draw_frame_info_end();
void 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);
@ -27,25 +24,11 @@ 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

@ -29,8 +29,4 @@ 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,13 @@ typedef struct FPSLIMITER
D3DKMTCLOSEADAPTERPROC D3DKMTCloseAdapter;
BOOL got_adapter;
BOOL initialized;
CRITICAL_SECTION cs;
BOOL cs_initialized;
BOOL is_wine;
} 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

@ -2,23 +2,12 @@
#define HOOK_H
#include <windows.h>
#include <vfw.h>
#define HOOK_SKIP_2 0x00000001l
#define HOOK_LOCAL_ONLY 0x00000002l
#define HOOK_SYSTEM_ONLY 0x00000004l
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[30]; } HOOKLIST;
typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT);
typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*);
@ -37,7 +26,6 @@ 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);
@ -47,7 +35,6 @@ 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);
@ -55,39 +42,24 @@ typedef int (WINAPI* SETDIBITSTODEVICEPROC)(
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);
typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER);
extern GETCURSORPOSPROC real_GetCursorPos;
extern CLIPCURSORPROC real_ClipCursor;
@ -106,7 +78,6 @@ 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;
@ -116,44 +87,28 @@ 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 BOOL g_hook_active;
extern HOOKLIST g_hook_hooklist[];
void hook_init();
void hook_init(BOOL initial_hook);
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);

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

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

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

@ -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,16 @@ 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 filter_bilinear;
BOOL shader2_upscale;
} OGLRENDERER;
DWORD WINAPI ogl_render_main(void);
BOOL ogl_create();
BOOL ogl_release();
#endif

View file

@ -5,16 +5,7 @@
#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);
@ -23,7 +14,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

@ -4,10 +4,10 @@
#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_MAJOR 5
#define VERSION_MINOR 7
#define VERSION_BUILD 0
#define VERSION_REVISION 1
#define VERSION_REVISION 7
#define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION
#define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION)

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

@ -2,7 +2,6 @@
#define WINAPI_HOOKS_H
#include <windows.h>
#include <vfw.h>
BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint);
@ -22,7 +21,6 @@ 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);
@ -33,30 +31,11 @@ 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);
@ -65,9 +44,6 @@ int WINAPI fake_StretchDIBits(
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);
HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName);
HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName);
@ -82,9 +58,6 @@ BOOL WINAPI fake_GetDiskFreeSpaceA(
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);
@ -97,6 +70,4 @@ MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR
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,8 @@
#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
LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

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

@ -9,20 +9,15 @@
#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;
if (!ppvObj)
{
ret = E_INVALIDARG;
}
else if (riid)
if (riid)
{
if (IsEqualGUID(&IID_IDirectDraw2, riid) ||
IsEqualGUID(&IID_IDirectDraw4, riid) ||
@ -132,30 +127,24 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid
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 = real_LoadLibraryA("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*)real_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;
}
@ -168,22 +157,16 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid
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 +177,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 +185,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 +198,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 +219,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 +240,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 +263,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 +277,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 +303,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 +319,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 +327,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 +335,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 +343,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());
TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This);
HRESULT ret = DD_OK;
*lplpGDIDDSurface = (LPDIRECTDRAWSURFACE7)g_ddraw.primary;
*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 +360,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 +368,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,7 +376,7 @@ 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("-> %s(This=%p)\n", __FUNCTION__, This);
HRESULT ret = DD_OK;
TRACE("<- %s\n", __FUNCTION__);
return ret;
@ -426,7 +384,7 @@ HRESULT __stdcall IDirectDraw__Initialize(IDirectDrawImpl* This, GUID* lpGUID)
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 +392,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 +400,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 +415,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 +432,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 +445,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 +460,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 +468,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,15 +476,15 @@ 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("-> %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__);
return ret;
@ -544,7 +492,7 @@ HRESULT __stdcall IDirectDraw__GetDeviceIdentifier(IDirectDrawImpl* This, LPDDDE
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 +500,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;
@ -45,8 +31,6 @@ ULONG __stdcall IDirectDrawClipper__Release(IDirectDrawClipperImpl* This)
if (This->region)
DeleteObject(This->region);
DeleteCriticalSection(&This->cs);
HeapFree(GetProcessHeap(), 0, This);
}
@ -61,23 +45,22 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList(
LPDWORD lpdwSiz)
{
TRACE(
"-> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p) [%p]\n",
"NOT_IMPLEMENTED -> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n",
__FUNCTION__,
This,
lpRect,
lpClipList,
lpdwSiz,
_ReturnAddress());
lpdwSiz);
HRESULT ret = ddc_GetClipList(This, lpRect, lpClipList, lpdwSiz);
TRACE("<- %s\n", __FUNCTION__);
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());
TRACE("-> %s(This=%p, lphWnd=%p)\n", __FUNCTION__, This, lphWnd);
HRESULT ret = ddc_GetHWnd(This, lphWnd);
TRACE("<- %s\n", __FUNCTION__);
return ret;
@ -85,7 +68,7 @@ HRESULT __stdcall IDirectDrawClipper__GetHWnd(IDirectDrawClipperImpl* This, HWND
HRESULT __stdcall IDirectDrawClipper__Initialize(IDirectDrawClipperImpl* This, LPDIRECTDRAW lpDD, DWORD dwFlags)
{
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;
@ -93,7 +76,7 @@ HRESULT __stdcall IDirectDrawClipper__Initialize(IDirectDrawClipperImpl* This, L
HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged)
{
TRACE("-> %s(This=%p, lpbChanged=%p) [%p]\n", __FUNCTION__, This, lpbChanged, _ReturnAddress());
TRACE("-> %s(This=%p, lpbChanged=%p)\n", __FUNCTION__, This, lpbChanged);
HRESULT ret = ddc_IsClipListChanged(This, lpbChanged);
TRACE("<- %s\n", __FUNCTION__);
return ret;
@ -101,15 +84,15 @@ HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl*
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());
TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags);
HRESULT ret = ddc_SetClipList(This, lpClipList, dwFlags);
TRACE("<- %s\n", __FUNCTION__);
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());
TRACE("-> %s(This=%p, dwFlags=%08X, hWnd=%p)\n", __FUNCTION__, This, dwFlags, hWnd);
HRESULT ret = ddc_SetHWnd(This, dwFlags, hWnd);
TRACE("<- %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,7 +76,7 @@ HRESULT __stdcall IDirectDrawPalette__Initialize(
DWORD dwFlags,
LPPALETTEENTRY lpDDColorTable)
{
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;
@ -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) ||
@ -64,7 +60,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,7 +68,7 @@ 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;
@ -86,11 +82,11 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This)
{
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)
@ -115,7 +111,7 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This)
if (This->mapping)
CloseHandle(This->mapping);
if (This->backbuffer && (!g_ddraw.ref || (void*)This->backbuffer != g_ddraw.last_freed_surface))
if (This->backbuffer && (!g_ddraw || (void*)This->backbuffer != g_ddraw->last_freed_surface))
{
IDirectDrawSurface_Release(This->backbuffer);
}
@ -123,15 +119,15 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This)
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;
if (g_ddraw)
g_ddraw->last_freed_surface = This;
HeapFree(GetProcessHeap(), 0, This);
}
@ -142,7 +138,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 +146,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 +161,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 +182,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 +197,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 +217,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 +229,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 +247,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 +259,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 +276,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 +300,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 +308,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 +316,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 +324,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 +332,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 +340,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 +348,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 +356,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,7 +367,7 @@ HRESULT __stdcall IDirectDrawSurface__Initialize(
LPDIRECTDRAW lpDD,
LPDDSURFACEDESC2 lpDDSurfaceDesc)
{
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;
@ -391,7 +375,7 @@ HRESULT __stdcall IDirectDrawSurface__Initialize(
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__);
return ret;
@ -405,14 +389,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 +405,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 +413,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 +421,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 +429,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 +437,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 +445,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 +453,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 +467,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 +475,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 +486,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 +494,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 +502,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 +510,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,7 +518,7 @@ 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());
TRACE("-> %s(This=%p, lpDDSD=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpDDSD, dwFlags);
HRESULT ret = dds_SetSurfaceDesc(This, lpDDSD, dwFlags);
TRACE("<- %s\n", __FUNCTION__);
return ret;
@ -548,7 +531,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 +543,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 +551,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 +559,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 +567,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 +575,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 +583,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 +591,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 +599,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;

View file

@ -518,7 +518,7 @@ void blt_colorfill(
if (bpp == 8 ||
(bpp == 16 &&
(color & 0xFF) == ((color >> 8) & 0xFF)) ||
((bpp == 32 || bpp == 24) &&
(bpp == 32 &&
(color & 0xFF) == ((color >> 8) & 0xFF) &&
(color & 0xFF) == ((color >> 16) & 0xFF) &&
(color & 0xFF) == ((color >> 24) & 0xFF)))

File diff suppressed because it is too large Load diff

View file

@ -77,29 +77,6 @@ unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf,
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
\*----------------------------------------------------------------------------*/

1171
src/dd.c

File diff suppressed because it is too large Load diff

View file

@ -3,24 +3,15 @@
#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;
@ -29,16 +20,11 @@ HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA l
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;
}
}
@ -53,142 +39,63 @@ HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA l
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);
/* Keep this commented out until we found a game that actually needs it
if (This->hwnd)
{
LeaveCriticalSection(&This->cs);
return DDERR_CLIPPERISUSINGHWND;
}
if (This->region)
DeleteObject(This->region);
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]);
This->region = ExtCreateRegion(NULL, 0, lpClipList);
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;
}
@ -204,7 +111,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 && 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;

View file

@ -11,11 +11,6 @@
#include "utils.h"
#include "blt.h"
#include "config.h"
#include "ddclipper.h"
#include "utils.h"
#include "versionhelpers.h"
#include "ddpalette.h"
#include "palette.h"
LONG g_dds_gdi_handles;
@ -50,22 +45,11 @@ HRESULT dds_Blt(
DWORD dwFlags,
LPDDBLTFX lpDDBltFx)
{
if (lpDDSrcSurface &&
lpDDSrcSurface->bpp != 8 &&
lpDDSrcSurface->bpp != 16 &&
lpDDSrcSurface->bpp != 24 &&
lpDDSrcSurface->bpp != 32)
{
return DDERR_INVALIDPARAMS;
}
dbg_dump_dds_blt_flags(dwFlags);
dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0);
util_pull_messages();
if (g_ddraw.ref &&
g_ddraw.iskkndx &&
if (g_ddraw &&
g_ddraw->iskkndx &&
(dwFlags & DDBLT_COLORFILL) &&
lpDestRect &&
lpDestRect->right == 640 &&
@ -85,16 +69,10 @@ HRESULT dds_Blt(
RECT dst_rect = { 0, 0, This->width, This->height };
if (lpSrcRect && src_surface)
{
//dbg_print_rect("lpSrcRect", lpSrcRect);
src_rect = *lpSrcRect;
}
memcpy(&src_rect, lpSrcRect, sizeof(src_rect));
if (lpDestRect)
{
//dbg_print_rect("lpDestRect", lpDestRect);
dst_rect = *lpDestRect;
}
memcpy(&dst_rect, lpDestRect, sizeof(dst_rect));
int src_w = src_rect.right - src_rect.left;
int src_h = src_rect.bottom - src_rect.top;
@ -107,19 +85,18 @@ HRESULT dds_Blt(
BOOL is_stretch_blt = src_w != dst_w || src_h != dst_h;
if (This->clipper && !This->clipper->hwnd && !(dwFlags & DDBLT_NO_CLIP) && dst_w > 0 && dst_h > 0)
/* Disable this for now (needs more testing)
if (This->clipper && !(dwFlags & DDBLT_NO_CLIP) && dst_w > 0 && dst_h > 0)
{
DWORD size = 0;
HRESULT result = ddc_GetClipList(This->clipper, &dst_rect, NULL, &size);
if (SUCCEEDED(result))
if (SUCCEEDED(IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, NULL, &size)))
{
RGNDATA* list = (RGNDATA*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
if (list)
{
if (SUCCEEDED(ddc_GetClipList(This->clipper, &dst_rect, list, &size)))
if (SUCCEEDED(IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, list, &size)))
{
RECT* dst_c_rect = (RECT*)list->Buffer;
@ -144,17 +121,8 @@ HRESULT dds_Blt(
return DD_OK;
}
}
else if (result == DDERR_NOCLIPLIST)
{
TRACE(" DDERR_NOCLIPLIST\n");
//return DDERR_NOCLIPLIST;
}
else
{
TRACE(" DDERR_INVALIDCLIPLIST\n");
//return DDERR_INVALIDCLIPLIST;
}
}
*/
if (dst_rect.right < 0)
dst_rect.right = 0;
@ -236,11 +204,6 @@ HRESULT dds_Blt(
if (dst_buf && (dwFlags & DDBLT_COLORFILL) && lpDDBltFx && dst_w > 0 && dst_h > 0)
{
if (This->bpp == 24)
{
TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, dwFillColor=%08X\n", This->bpp, lpDDBltFx->dwFillColor);
}
blt_colorfill(
dst_buf,
dst_x,
@ -264,10 +227,7 @@ HRESULT dds_Blt(
BOOL mirror_left_right = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORLEFTRIGHT);
BOOL mirror_up_down = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORUPDOWN);
if (This->bpp != src_surface->bpp ||
This->bpp == 24 ||
src_surface->bpp == 24 ||
(is_stretch_blt && This == src_surface))
if (This->bpp != src_surface->bpp)
{
TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp);
@ -277,13 +237,13 @@ HRESULT dds_Blt(
HDC src_dc;
dds_GetDC(src_surface, &src_dc);
if (((dwFlags & DDBLT_KEYSRC) && (src_surface->flags & DDSD_CKSRCBLT)) || (dwFlags & DDBLT_KEYSRCOVERRIDE))
if ((dwFlags & DDBLT_KEYSRC) || (dwFlags & DDBLT_KEYSRCOVERRIDE))
{
UINT color =
(dwFlags & DDBLT_KEYSRCOVERRIDE) ?
lpDDBltFx->ddckSrcColorkey.dwColorSpaceLowValue : src_surface->color_key.dwColorSpaceLowValue;
if (src_surface->bpp == 32 || src_surface->bpp == 24)
if (src_surface->bpp == 32)
{
color = color & 0xFFFFFF;
}
@ -301,7 +261,7 @@ HRESULT dds_Blt(
{
RGBQUAD* quad =
src_surface->palette ? src_surface->palette->data_rgb :
g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette ? g_ddraw.primary->palette->data_rgb :
g_ddraw && g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb :
NULL;
if (quad)
@ -335,7 +295,7 @@ HRESULT dds_Blt(
*/
}
else if (
((dwFlags & DDBLT_KEYSRC) && (src_surface->flags & DDSD_CKSRCBLT)) ||
(dwFlags & DDBLT_KEYSRC) ||
(dwFlags & DDBLT_KEYSRCOVERRIDE) ||
mirror_left_right ||
mirror_up_down)
@ -444,21 +404,20 @@ HRESULT dds_Blt(
}
}
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run)
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run)
{
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
InterlockedExchange(&g_ddraw.render.screen_updated, TRUE);
InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);
if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime())
{
This->last_blt_tick = timeGetTime();
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
SwitchToThread();
if (g_ddraw.ticks_limiter.tick_length > 0 && g_config.limiter_type != LIMIT_PEEKMESSAGE)
if (g_ddraw->ticks_limiter.tick_length > 0)
{
g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE;
g_ddraw->ticks_limiter.use_blt_or_flip = TRUE;
util_limit_game_ticks();
}
}
@ -482,10 +441,7 @@ HRESULT dds_BltFast(
RECT src_rect = { 0, 0, src_surface ? src_surface->width : 0, src_surface ? src_surface->height : 0 };
if (lpSrcRect && src_surface)
{
//dbg_print_rect("lpSrcRect", lpSrcRect);
src_rect = *lpSrcRect;
}
memcpy(&src_rect, lpSrcRect, sizeof(src_rect));
int dst_x = dwX;
int dst_y = dwY;
@ -569,9 +525,7 @@ HRESULT dds_BltFast(
if (src_surface && dst_w > 0 && dst_h > 0)
{
if (This->bpp != src_surface->bpp ||
This->bpp == 24 ||
src_surface->bpp == 24)
if (This->bpp != src_surface->bpp)
{
TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp);
@ -581,11 +535,11 @@ HRESULT dds_BltFast(
HDC src_dc;
dds_GetDC(src_surface, &src_dc);
if ((dwFlags & DDBLTFAST_SRCCOLORKEY) && (src_surface->flags & DDSD_CKSRCBLT))
if (dwFlags & DDBLTFAST_SRCCOLORKEY)
{
UINT color = src_surface->color_key.dwColorSpaceLowValue;
if (src_surface->bpp == 32 || src_surface->bpp == 24)
if (src_surface->bpp == 32)
{
color = color & 0xFFFFFF;
}
@ -603,7 +557,7 @@ HRESULT dds_BltFast(
{
RGBQUAD* quad =
src_surface->palette ? src_surface->palette->data_rgb :
g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette ? g_ddraw.primary->palette->data_rgb :
g_ddraw && g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb :
NULL;
if (quad)
@ -618,11 +572,11 @@ HRESULT dds_BltFast(
}
else
{
real_BitBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, SRCCOPY);
BitBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, SRCCOPY);
}
/*
real_BitBlt(
BitBlt(
dst_dc,
dwX,
dwY,
@ -634,7 +588,7 @@ HRESULT dds_BltFast(
SRCCOPY);
*/
}
else if ((dwFlags & DDBLTFAST_SRCCOLORKEY) && (src_surface->flags & DDSD_CKSRCBLT))
else if (dwFlags & DDBLTFAST_SRCCOLORKEY)
{
blt_colorkey(
dst_buf,
@ -683,21 +637,20 @@ HRESULT dds_BltFast(
}
}
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run)
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run)
{
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
InterlockedExchange(&g_ddraw.render.screen_updated, TRUE);
InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);
DWORD time = timeGetTime();
if (!(This->flags & DDSD_BACKBUFFERCOUNT) ||
(This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time))
{
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
if (g_config.limiter_type == LIMIT_BLTFAST && g_ddraw.ticks_limiter.tick_length > 0)
if (g_config.limit_bltfast && g_ddraw->ticks_limiter.tick_length > 0)
{
g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE;
g_ddraw->ticks_limiter.use_blt_or_flip = TRUE;
util_limit_game_ticks();
}
}
@ -733,7 +686,8 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur
DDSD_WIDTH |
DDSD_HEIGHT |
DDSD_PITCH |
DDSD_PIXELFORMAT;
DDSD_PIXELFORMAT |
DDSD_LPSURFACE;
lpDDSurfaceDesc->dwWidth = This->width;
lpDDSurfaceDesc->dwHeight = This->height;
@ -750,13 +704,6 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur
lpDDSurfaceDesc->dwBackBufferCount = This->backbuffer_count;
}
if (This->flags & DDSD_CKSRCBLT)
{
lpDDSurfaceDesc->dwFlags |= DDSD_CKSRCBLT;
lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceHighValue = This->color_key.dwColorSpaceHighValue;
lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceLowValue = This->color_key.dwColorSpaceLowValue;
}
if (This->bpp == 8)
{
lpDDSurfaceDesc->ddpfPixelFormat.dwFlags |= DDPF_PALETTEINDEXED8;
@ -767,7 +714,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur
lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x07E0;
lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x001F;
}
else if (This->bpp == 32 || This->bpp == 24)
else if (This->bpp == 32)
{
lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xFF0000;
lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x00FF00;
@ -789,17 +736,8 @@ HRESULT dds_EnumAttachedSurfaces(
if (This->backbuffer)
{
/* Hack for carmageddon 1 lowres mode */
if (g_config.carma95_hack && g_ddraw.height == 200)
{
dds_GetSurfaceDesc(This, (LPDDSURFACEDESC)&desc);
lpEnumSurfacesCallback((LPDIRECTDRAWSURFACE)This, (LPDDSURFACEDESC)&desc, lpContext);
}
else
{
dds_GetSurfaceDesc(This->backbuffer, (LPDDSURFACEDESC)&desc);
lpEnumSurfacesCallback((LPDIRECTDRAWSURFACE)This->backbuffer, (LPDDSURFACEDESC)&desc, lpContext);
}
dds_GetSurfaceDesc(This->backbuffer, (LPDDSURFACEDESC)&desc);
lpEnumSurfacesCallback((LPDIRECTDRAWSURFACE)This->backbuffer, (LPDDSURFACEDESC)&desc, lpContext);
}
return DD_OK;
@ -809,27 +747,27 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa
{
dbg_dump_dds_flip_flags(dwFlags);
if (This->backbuffer && !This->skip_flip && !(g_config.carma95_hack && g_ddraw.height == 200))
if (This->backbuffer)
{
EnterCriticalSection(&g_ddraw.cs);
EnterCriticalSection(&g_ddraw->cs);
IDirectDrawSurfaceImpl* backbuffer = lpDDSurfaceTargetOverride ? lpDDSurfaceTargetOverride : This->backbuffer;
void* buf = InterlockedExchangePointer(&This->surface, backbuffer->surface);
HBITMAP bitmap = (HBITMAP)InterlockedExchangePointer((void*)&This->bitmap, backbuffer->bitmap);
HDC dc = (HDC)InterlockedExchangePointer((void*)&This->hdc, backbuffer->hdc);
HBITMAP bitmap = (HBITMAP)InterlockedExchangePointer(&This->bitmap, backbuffer->bitmap);
HDC dc = (HDC)InterlockedExchangePointer(&This->hdc, backbuffer->hdc);
HANDLE map = (HANDLE)InterlockedExchangePointer(&This->mapping, backbuffer->mapping);
InterlockedExchangePointer(&backbuffer->surface, buf);
InterlockedExchangePointer((void*)&backbuffer->bitmap, bitmap);
InterlockedExchangePointer((void*)&backbuffer->hdc, dc);
InterlockedExchangePointer(&backbuffer->bitmap, bitmap);
InterlockedExchangePointer(&backbuffer->hdc, dc);
InterlockedExchangePointer(&backbuffer->mapping, map);
if (g_config.flipclear && (This->caps & DDSCAPS_PRIMARYSURFACE))
if (g_config.flipclear)
{
blt_clear(buf, 0, backbuffer->size);
}
LeaveCriticalSection(&g_ddraw.cs);
LeaveCriticalSection(&g_ddraw->cs);
if (!lpDDSurfaceTargetOverride && This->backbuffer->backbuffer)
{
@ -837,15 +775,12 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa
}
}
This->skip_flip = FALSE;
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run)
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run)
{
This->last_flip_tick = timeGetTime();
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
InterlockedExchange(&g_ddraw.render.screen_updated, TRUE);
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
SwitchToThread();
if ((g_config.maxgameticks == 0 && (dwFlags & DDFLIP_WAIT)) || g_config.maxgameticks == -2)
@ -853,9 +788,9 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa
dd_WaitForVerticalBlank(DDWAITVB_BLOCKEND, NULL);
}
if (g_ddraw.ticks_limiter.tick_length > 0 && g_config.limiter_type != LIMIT_PEEKMESSAGE)
if (g_ddraw->ticks_limiter.tick_length > 0)
{
g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE;
g_ddraw->ticks_limiter.use_blt_or_flip = TRUE;
util_limit_game_ticks();
}
}
@ -865,13 +800,18 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa
HRESULT dds_GetAttachedSurface(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDdsCaps, IDirectDrawSurfaceImpl** lpDDsurface)
{
if (!lpDdsCaps || !lpDDsurface)
return DDERR_INVALIDPARAMS;
if (This->backbuffer && (This->backbuffer->caps & lpDdsCaps->dwCaps) == lpDdsCaps->dwCaps)
if (lpDdsCaps->dwCaps & DDSCAPS_BACKBUFFER)
{
IDirectDrawSurface_AddRef(This->backbuffer);
*lpDDsurface = This->backbuffer;
if (This->backbuffer)
{
IDirectDrawSurface_AddRef(This->backbuffer);
*lpDDsurface = This->backbuffer;
}
else
{
IDirectDrawSurface_AddRef(This);
*lpDDsurface = This;
}
return DD_OK;
}
@ -909,11 +849,6 @@ HRESULT dds_GetClipper(IDirectDrawSurfaceImpl* This, IDirectDrawClipperImpl** lp
HRESULT dds_GetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey)
{
if (!(This->flags & DDSD_CKSRCBLT))
{
return DDERR_NOCOLORKEY;
}
if (dwFlags != DDCKEY_SRCBLT || !lpColorKey)
{
TRACE(" NOT_IMPLEMENTED dwFlags=%08X, lpColorKey=%p\n", dwFlags, lpColorKey);
@ -940,7 +875,7 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC)
RGBQUAD* data =
This->palette ? This->palette->data_rgb :
g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette ? g_ddraw.primary->palette->data_rgb :
g_ddraw && g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb :
NULL;
HDC dc = This->hdc;
@ -954,9 +889,6 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC)
if (lpHDC)
*lpHDC = dc;
if (!(This->caps & DDSCAPS_OWNDC))
InterlockedExchange((LONG*)&This->dc_state, SaveDC(dc));
return DD_OK;
}
@ -998,7 +930,7 @@ HRESULT dds_GetPixelFormat(IDirectDrawSurfaceImpl* This, LPDDPIXELFORMAT ddpfPix
ddpfPixelFormat->dwGBitMask = 0x07E0;
ddpfPixelFormat->dwBBitMask = 0x001F;
}
else if (This->bpp == 32 || This->bpp == 24)
else if (This->bpp == 32)
{
ddpfPixelFormat->dwRBitMask = 0xFF0000;
ddpfPixelFormat->dwGBitMask = 0x00FF00;
@ -1023,7 +955,11 @@ HRESULT dds_Lock(
dbg_dump_dds_lock_flags(dwFlags);
util_pull_messages();
if (g_ddraw && g_config.fixnotresponding && !g_ddraw->wine)
{
MSG msg; /* workaround for "Not Responding" window problem */
real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE);
}
HRESULT ret = dds_GetSurfaceDesc(This, lpDDSurfaceDesc);
@ -1036,8 +972,6 @@ HRESULT dds_Lock(
lpDestRect->right > This->width ||
lpDestRect->bottom > This->height)
{
lpDDSurfaceDesc->lpSurface = NULL;
return DDERR_INVALIDPARAMS;
}
@ -1050,23 +984,19 @@ HRESULT dds_Lock(
HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC)
{
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run)
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run)
{
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
InterlockedExchange(&g_ddraw.render.screen_updated, TRUE);
InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);
DWORD time = timeGetTime();
if (!(This->flags & DDSD_BACKBUFFERCOUNT) ||
(This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time))
{
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
}
}
if (!(This->caps & DDSCAPS_OWNDC))
RestoreDC(hDC, InterlockedExchangeAdd((LONG*)&This->dc_state, 0));
return DD_OK;
}
@ -1078,8 +1008,12 @@ HRESULT dds_SetClipper(IDirectDrawSurfaceImpl* This, IDirectDrawClipperImpl* lpC
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && lpClipper->hwnd)
{
if (lpClipper->region)
DeleteObject(lpClipper->region);
RECT rc = { 0, 0, This->width, This->height };
ddc_SetClipRect(lpClipper, &rc);
lpClipper->region = CreateRectRgnIndirect(&rc);
}
}
@ -1100,18 +1034,8 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKE
if (lpColorKey)
{
This->flags |= DDSD_CKSRCBLT;
This->color_key.dwColorSpaceHighValue = lpColorKey->dwColorSpaceHighValue;
This->color_key.dwColorSpaceLowValue = lpColorKey->dwColorSpaceLowValue;
if (dwFlags & DDCKEY_COLORSPACE)
{
This->color_key.dwColorSpaceHighValue = lpColorKey->dwColorSpaceHighValue;
}
else
{
This->color_key.dwColorSpaceHighValue = lpColorKey->dwColorSpaceLowValue;
}
}
return DD_OK;
@ -1119,24 +1043,22 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKE
HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpDDPalette)
{
if (This->bpp != 8)
return DDERR_INVALIDPIXELFORMAT;
if (lpDDPalette)
IDirectDrawPalette_AddRef(lpDDPalette);
IDirectDrawPaletteImpl* old_palette = This->palette;
if (This->palette)
IDirectDrawPalette_Release(This->palette);
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref)
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw)
{
EnterCriticalSection(&g_ddraw.cs);
EnterCriticalSection(&g_ddraw->cs);
This->palette = lpDDPalette;
LeaveCriticalSection(&g_ddraw.cs);
LeaveCriticalSection(&g_ddraw->cs);
if (g_ddraw.render.run)
if (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);
}
}
else
@ -1144,16 +1066,13 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD
This->palette = lpDDPalette;
}
if (old_palette)
IDirectDrawPalette_Release(old_palette);
return DD_OK;
}
HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
{
/* Hack for Warcraft II BNE and Diablo */
HWND hwnd = g_ddraw.ref && g_ddraw.bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL;
HWND hwnd = g_ddraw && g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL;
if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE))
{
@ -1198,12 +1117,17 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
if (erase)
{
blt_clear(This->surface, 0xFE, This->size);
BOOL x = g_ddraw->ticks_limiter.use_blt_or_flip;
DDBLTFX fx = { .dwFillColor = 0xFE };
IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx);
g_ddraw->ticks_limiter.use_blt_or_flip = x;
}
}
/* Hack for Star Trek Armada */
hwnd = g_ddraw.ref && g_config.armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL;
hwnd = g_ddraw && g_config.armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL;
if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE))
{
@ -1232,28 +1156,28 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
ReleaseDC(hwnd, hdc);
}
blt_clear(This->surface, 0x00, This->size);
BOOL x = g_ddraw->ticks_limiter.use_blt_or_flip;
DDBLTFX fx = { .dwFillColor = 0 };
IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx);
g_ddraw->ticks_limiter.use_blt_or_flip = x;
}
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run)
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run)
{
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
InterlockedExchange(&g_ddraw.render.screen_updated, TRUE);
InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);
DWORD time = timeGetTime();
if (!(This->flags & DDSD_BACKBUFFERCOUNT) ||
(This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time))
{
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
if (g_ddraw.ticks_limiter.tick_length > 0 &&
g_config.limiter_type != LIMIT_PEEKMESSAGE &&
(!g_ddraw.ticks_limiter.dds_unlock_limiter_disabled || g_config.limiter_type == LIMIT_UNLOCK))
{
if (g_ddraw->ticks_limiter.tick_length > 0 && !g_ddraw->ticks_limiter.use_blt_or_flip)
util_limit_game_ticks();
}
}
}
@ -1279,7 +1203,9 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD
dbg_dump_dds_flags(lpDDSD->dwFlags);
dbg_dump_dds_caps(lpDDSD->ddsCaps.dwCaps);
if ((lpDDSD->dwFlags & DDSD_LPSURFACE) == 0)
DWORD req_flags = DDSD_LPSURFACE | DDSD_PITCH | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
if ((lpDDSD->dwFlags & req_flags) != req_flags)
return DDERR_UNSUPPORTED;
@ -1314,52 +1240,32 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD
This->mapping = NULL;
}
if (lpDDSD->dwFlags & DDSD_PIXELFORMAT)
switch (lpDDSD->ddpfPixelFormat.dwRGBBitCount)
{
switch (lpDDSD->ddpfPixelFormat.dwRGBBitCount)
{
case 0:
break;
case 8:
This->bpp = 8;
break;
case 15:
TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount);
case 16:
This->bpp = 16;
break;
case 24:
This->bpp = 24;
break;
case 32:
This->bpp = 32;
break;
default:
TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount);
break;
}
}
if (lpDDSD->dwFlags & DDSD_WIDTH)
{
This->width = lpDDSD->dwWidth;
}
if (lpDDSD->dwFlags & DDSD_HEIGHT)
{
This->height = lpDDSD->dwHeight;
}
if (lpDDSD->dwFlags & DDSD_PITCH)
{
This->pitch = lpDDSD->lPitch;
}
if (lpDDSD->dwFlags & DDSD_LPSURFACE)
{
This->surface = lpDDSD->lpSurface;
case 8:
This->bpp = 8;
break;
case 15:
TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount);
case 16:
This->bpp = 16;
break;
case 24:
TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount);
case 32:
This->bpp = 32;
break;
default:
This->bpp = 8;
TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount);
break;
}
This->width = lpDDSD->dwWidth;
This->height = lpDDSD->dwHeight;
This->surface = lpDDSD->lpSurface;
This->pitch = lpDDSD->lPitch;
This->bytes_pp = This->bpp / 8;
This->size = This->pitch * This->height;
This->custom_buf = TRUE;
@ -1390,22 +1296,20 @@ HRESULT dd_CreateSurface(
if (lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_OVERLAY)
return DDERR_UNSUPPORTED;
if (!(lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) &&
if (!(lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) &&
(lpDDSurfaceDesc->dwWidth > 16384 || lpDDSurfaceDesc->dwHeight > 16384))
{
return DDERR_INVALIDPARAMS;
}
if ((lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) &&
g_ddraw.primary &&
g_ddraw.primary->width == g_ddraw.width &&
g_ddraw.primary->height == g_ddraw.height &&
g_ddraw.primary->bpp == g_ddraw.bpp)
g_ddraw->primary &&
g_ddraw->primary->width == g_ddraw->width &&
g_ddraw->primary->height == g_ddraw->height &&
g_ddraw->primary->bpp == g_ddraw->bpp)
{
g_ddraw.primary->skip_flip = TRUE;
*lpDDSurface = g_ddraw.primary;
IDirectDrawSurface_AddRef(g_ddraw.primary);
*lpDDSurface = g_ddraw->primary;
IDirectDrawSurface_AddRef(g_ddraw->primary);
return DD_OK;
}
@ -1419,17 +1323,11 @@ HRESULT dd_CreateSurface(
InitializeCriticalSection(&dst_surface->cs);
dst_surface->bpp = g_ddraw.bpp == 0 ? 16 : g_ddraw.bpp;
dst_surface->bpp = g_ddraw->bpp == 0 ? 16 : g_ddraw->bpp;
dst_surface->flags = lpDDSurfaceDesc->dwFlags;
dst_surface->caps = lpDDSurfaceDesc->ddsCaps.dwCaps;
dst_surface->ddraw = This;
if (dst_surface->flags & DDSD_CKSRCBLT)
{
dst_surface->color_key.dwColorSpaceHighValue = lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceHighValue;
dst_surface->color_key.dwColorSpaceLowValue = lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceLowValue;
}
if (dst_surface->flags & DDSD_PIXELFORMAT)
{
switch (lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount)
@ -1443,8 +1341,7 @@ HRESULT dd_CreateSurface(
dst_surface->bpp = 16;
break;
case 24:
dst_surface->bpp = 24;
break;
TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount);
case 32:
dst_surface->bpp = 32;
break;
@ -1461,15 +1358,10 @@ HRESULT dd_CreateSurface(
dst_surface->caps |= DDSCAPS_FRONTBUFFER;
}
if (!(dst_surface->caps & DDSCAPS_SYSTEMMEMORY))
{
dst_surface->caps |= DDSCAPS_VIDEOMEMORY;
}
dst_surface->width = g_ddraw->width;
dst_surface->height = g_ddraw->height;
dst_surface->caps |= DDSCAPS_VISIBLE;
dst_surface->width = g_ddraw.width == 0 ? 1024 : g_ddraw.width;
dst_surface->height = g_ddraw.height == 0 ? 768 : g_ddraw.height;
dst_surface->caps |= DDSCAPS_VIDEOMEMORY;
}
else
{
@ -1493,32 +1385,31 @@ HRESULT dd_CreateSurface(
else if (dst_surface->width && dst_surface->height)
{
dst_surface->bytes_pp = dst_surface->bpp / 8;
dst_surface->pitch = ((dst_surface->width * dst_surface->bpp + 63) & ~63) >> 3;
dst_surface->pitch = ((dst_surface->width * dst_surface->bpp + 31) & ~31) >> 3;
dst_surface->size = dst_surface->pitch * dst_surface->height;
DWORD aligned_width = dst_surface->pitch / dst_surface->bytes_pp;
DWORD bmi_size = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256;
DWORD bmp_size = dst_surface->pitch * (dst_surface->height + g_config.guard_lines);
dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DDBITMAPINFO));
dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmi_size);
dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
dst_surface->bmi->bmiHeader.biWidth = aligned_width;
dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + g_config.guard_lines);
dst_surface->bmi->bmiHeader.biPlanes = 1;
dst_surface->bmi->bmiHeader.biBitCount = dst_surface->bpp;
dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 16 ? BI_BITFIELDS : BI_RGB;
dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 8 ? BI_RGB : BI_BITFIELDS;
WORD clr_bits = (WORD)(dst_surface->bmi->bmiHeader.biPlanes * dst_surface->bmi->bmiHeader.biBitCount);
dst_surface->bmi->bmiHeader.biClrUsed =
dst_surface->bpp == 8 ? 256 :
dst_surface->bpp == 16 ? 3 :
dst_surface->bpp == 24 ? 0 :
dst_surface->bpp == 32 ? 0 :
0;
if (clr_bits < 24)
{
dst_surface->bmi->bmiHeader.biClrUsed = (1 << clr_bits);
}
dst_surface->bmi->bmiHeader.biSizeImage =
((aligned_width * clr_bits + 63) & ~63) / 8 * dst_surface->height;
((aligned_width * clr_bits + 31) & ~31) / 8 * dst_surface->height;
if (dst_surface->bpp == 8)
{
@ -1542,29 +1433,34 @@ HRESULT dd_CreateSurface(
((DWORD*)dst_surface->bmi->bmiColors)[1] = 0x07E0;
((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x001F;
}
else if (dst_surface->bpp == 32)
{
((DWORD*)dst_surface->bmi->bmiColors)[0] = 0xFF0000;
((DWORD*)dst_surface->bmi->bmiColors)[1] = 0x00FF00;
((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x0000FF;
}
/* Claw hack: 128x128 surfaces need a DC for custom levels to work properly */
if ((!g_config.limit_gdi_handles && InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 9000) ||
(dst_surface->width == g_ddraw.width && dst_surface->height == g_ddraw.height) ||
if (InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 4000 ||
(dst_surface->width == g_ddraw->width && dst_surface->height == g_ddraw->height) ||
(dst_surface->width == 128 && dst_surface->height == 128))
{
dst_surface->hdc = CreateCompatibleDC(g_ddraw.render.hdc);
dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc);
if (dst_surface->hdc)
InterlockedIncrement(&g_dds_gdi_handles);
// CreateDIBSection cannot handle values higher than a WORD - 0xFF00 (guard lines);
DWORD map_offset = min(65280, dst_surface->pitch * g_config.guard_lines);
dst_surface->mapping =
CreateFileMappingA(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE | SEC_COMMIT,
0,
bmp_size + 256 + map_offset,
bmp_size + 256,
NULL);
DWORD map_offset = 0;
if (dst_surface->mapping)
{
LPVOID data = MapViewOfFile(dst_surface->mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
@ -1608,18 +1504,8 @@ HRESULT dd_CreateSurface(
if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE)
{
g_ddraw.primary = dst_surface;
g_ddraw->primary = dst_surface;
FakePrimarySurface = dst_surface->surface;
if (dst_surface->bpp == 8)
{
IDirectDrawPaletteImpl* lpDDPalette;
dd_CreatePalette(DDPCAPS_ALLOW256, g_ddp_default_palette, &lpDDPalette, NULL);
dds_SetPalette(dst_surface, lpDDPalette);
// Make sure temp palette will be released once replaced
IDirectDrawPalette_Release(lpDDPalette);
}
}
}
@ -1650,21 +1536,11 @@ HRESULT dd_CreateSurface(
desc.ddsCaps.dwCaps |= DDSCAPS_FLIP;
}
if (dst_surface->caps & DDSCAPS_COMPLEX)
{
desc.ddsCaps.dwCaps |= DDSCAPS_COMPLEX;
}
if (dst_surface->caps & DDSCAPS_VIDEOMEMORY)
{
desc.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY;
}
if (dst_surface->caps & DDSCAPS_SYSTEMMEMORY)
{
desc.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;
}
desc.dwWidth = dst_surface->width;
desc.dwHeight = dst_surface->height;

View file

@ -1,9 +1,6 @@
#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"
@ -11,78 +8,53 @@
#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 int g_dbg_crash_count = 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++;
BOOL(WINAPI * MiniDumpWriteDumpProc)(
HANDLE,
DWORD,
HANDLE,
MINIDUMP_TYPE,
PMINIDUMP_EXCEPTION_INFORMATION,
PMINIDUMP_USER_STREAM_INFORMATION,
PMINIDUMP_CALLBACK_INFORMATION
);
char filename[MAX_PATH] = { 0 };
_snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.dmp", g_dbg_crash_count == 1 ? 1 : 2);
MiniDumpWriteDumpProc = (void*)real_GetProcAddress(real_LoadLibraryA("Dbghelp.dll"), "MiniDumpWriteDump");
if (MiniDumpWriteDumpProc)
HANDLE dmp =
CreateFile(
filename,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ,
0,
CREATE_ALWAYS,
0,
0);
if (dmp != INVALID_HANDLE_VALUE)
{
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)
@ -90,7 +62,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception)
HMODULE mod = NULL;
char filename[MAX_PATH] = { 0 };
if (delay_GetModuleHandleExA && delay_GetModuleHandleExA(
if (GetModuleHandleExA(
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
exception->ExceptionRecord->ExceptionAddress,
&mod))
@ -112,66 +84,8 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* 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;
@ -180,107 +94,61 @@ void dbg_init()
{
once = TRUE;
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);
remove("cnc-ddraw-1.dmp");
remove("cnc-ddraw-2.dmp");
char game_path[MAX_PATH] = { 0 };
_makepath(game_path, drive, dir, NULL, NULL);
remove("cnc-ddraw-1.log");
remove("cnc-ddraw-2.log");
remove("cnc-ddraw-3.log");
_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);
g_dbg_log_file = fopen("cnc-ddraw-1.log", "w");
setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024);
_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);
}
TRACE("cnc-ddraw version = %d.%d.%d.%d\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION);
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);
char dversion[256] = { 0 };
DWORD dversion_size = sizeof(dversion);
RegQueryValueExA(hkey, "DisplayVersion", NULL, NULL, (PVOID)&dversion, &dversion_size);
char build[256] = { 0 };
DWORD build_size = sizeof(build);
RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size);
TRACE("%s %s (%s)\n", name, dversion, build);
RegCloseKey(hkey);
}
const char* (CDECL * wine_get_version)() =
(void*)real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version");
if (wine_get_version)
{
TRACE("Wine version = %s\n", wine_get_version());
}
void (CDECL* wine_get_host_version)(const char** sysname, const char** release) =
(void*)real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_host_version");
if (wine_get_host_version)
{
const char* sysname = NULL;
const char* release = NULL;
verhelp_wine_get_host_version(&sysname, &release);
wine_get_host_version(&sysname, &release);
TRACE("Wine sysname = %s, release = %s\n", sysname, release);
}
TRACE("crc32 = %08X\n", Crc32_FromFile(0, exe_path));
DWORD timestamp = util_get_timestamp(GetModuleHandleA(NULL));
if (timestamp)
{
TRACE("timestamp = %s", asctime(_gmtime32((const long*)&timestamp)));
}
}
}
@ -324,15 +192,12 @@ void dbg_printf(const char* fmt, ...)
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);
char filename[MAX_PATH] = { 0 };
_snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.log", g_dbg_log_rotate ? 3 : 2);
g_dbg_log_rotate = !g_dbg_log_rotate;
if (g_dbg_log_file)
if ((g_dbg_log_file = freopen(filename, "w", g_dbg_log_file)))
{
setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024);
}
@ -386,12 +251,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,145 +286,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
@ -1091,111 +817,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)
@ -1881,8 +1502,6 @@ char* dbg_mes_to_str(int id)
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

@ -6,7 +6,6 @@
#include "dd.h"
#include "mouse.h"
#include "config.h"
#include "utils.h"
#ifdef _MSC_VER
#include "detours.h"
@ -24,20 +23,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 +43,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(This=%p, hwnd=%p, dwFlags=0x%08X)\n", This, hwnd, dwFlags);
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_mouse_locked || g_config.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 +65,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_mouse_locked)
{
if ((block_mouse || in_background) && pdwInOut)
if (pdwInOut)
{
if (rgdod && *pdwInOut > 0 && cbObjectData > 0)
{
@ -112,16 +87,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_mouse_locked)
{
if ((block_mouse || in_background) && cbData > 0 && lpvData)
if (cbData > 0 && lpvData)
{
memset(lpvData, 0, cbData);
}
@ -136,38 +108,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 +145,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,12 +181,12 @@ 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)real_GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateA");
if (real_DirectInputCreateA == fake_DirectInputCreateA)
{
@ -248,10 +204,8 @@ HRESULT WINAPI fake_DirectInputCreateA(
if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook)
{
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,12 +217,12 @@ 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)real_GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateW");
if (real_DirectInputCreateW == fake_DirectInputCreateW)
{
@ -286,10 +240,8 @@ HRESULT WINAPI fake_DirectInputCreateW(
if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook)
{
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,12 +254,12 @@ 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)real_GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateEx");
if (real_DirectInputCreateEx == fake_DirectInputCreateEx)
{
@ -325,10 +277,8 @@ HRESULT WINAPI fake_DirectInputCreateEx(
if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook)
{
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) &&
@ -337,10 +287,8 @@ HRESULT WINAPI fake_DirectInputCreateEx(
(IsEqualGUID(&IID_IDirectInput7A, riidltf) || IsEqualGUID(&IID_IDirectInput7W, riidltf))
&& !g_config.no_dinput_hook)
{
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,12 +301,12 @@ 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)real_GetProcAddress(GetModuleHandle("dinput8.dll"), "DirectInput8Create");
if (real_DirectInput8Create == fake_DirectInput8Create)
{
@ -376,10 +324,8 @@ HRESULT WINAPI fake_DirectInput8Create(
if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook)
{
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;
@ -437,12 +383,6 @@ void dinput_hook_init()
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)
{

View file

@ -9,11 +9,7 @@
#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"
#include "patch.h"
/* export for cncnet cnc games */
@ -24,7 +20,6 @@ PVOID FakePrimarySurface;
HMODULE g_ddraw_module;
static BOOL g_screensaver_disabled;
BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
{
@ -32,31 +27,82 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
{
case DLL_PROCESS_ATTACH:
{
g_ddraw_module = hDll;
cfg_load();
delay_imports_init();
if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0))
{
cfg_load();
if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0))
return TRUE;
}
#ifdef _DEBUG
dbg_init();
TRACE("cnc-ddraw = %p\n", hDll);
g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler);
#endif
g_ddraw_module = hDll;
cfg_load();
PVOID(WINAPI * add_handler)(ULONG, PVECTORED_EXCEPTION_HANDLER) =
(void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "AddVectoredExceptionHandler");
if (add_handler)
/* Claw DVD Movie experiments */
/* change file extension .vob to .avi */
HMODULE game_exe = GetModuleHandleA(NULL);
PIMAGE_DOS_HEADER dos_hdr = (void*)game_exe;
PIMAGE_NT_HEADERS nt_hdr = (void*)((char*)game_exe + dos_hdr->e_lfanew);
for (int i = 0; i < nt_hdr->FileHeader.NumberOfSections; i++)
{
g_dbg_exception_handle = add_handler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler);
PIMAGE_SECTION_HEADER sct_hdr = IMAGE_FIRST_SECTION(nt_hdr) + i;
if (strcmp(".data", (char*)sct_hdr->Name) == 0)
{
char* s = (char*)((char*)game_exe + sct_hdr->VirtualAddress);
int s_len = sct_hdr->Misc.VirtualSize;
for (int i = 0; i < s_len; i++, s++)
{
if (*s == '.' && memcmp(s, "\x2E\x76\x6F\x62\x00", 5) == 0) /* .vob */
{
memcpy(s, "\x2E\x61\x76\x69", 4); /* .avi */
}
}
break;
}
sct_hdr++;
}
/* add registry key for x264vfw */
BOOL is_wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0;
HKEY hkey;
LONG status =
RegCreateKeyExA(
is_wine ? HKEY_LOCAL_MACHINE : 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 x264 = "x264vfw.dll";
RegSetValueExA(hkey,"vidc.x264", 0, REG_SZ, (const BYTE*)x264, strlen(x264) + 1);
LPCTSTR xvid = "xvidvfw.dll";
RegSetValueExA(hkey, "vidc.xvid", 0, REG_SZ, (const BYTE*)xvid, strlen(xvid) + 1);
RegCloseKey(hkey);
}
char buf[1024];
if (GetEnvironmentVariable("__COMPAT_LAYER", buf, sizeof(buf)))
@ -67,26 +113,18 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
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;
}
@ -133,160 +171,56 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
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_init(TRUE);
break;
}
case DLL_PROCESS_DETACH:
{
if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0))
if (GetEnvironmentVariableW(L"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 +231,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 +242,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 +253,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 +264,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 +272,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 +280,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 +288,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 +296,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,7 +304,7 @@ 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;

View file

@ -4,9 +4,6 @@
#include "debug.h"
#include "hook.h"
#include "config.h"
#include "render_ogl.h"
#include "versionhelpers.h"
FPSLIMITER g_fpsl;
@ -17,8 +14,8 @@ void fpsl_init()
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_config.vsync)
max_fps = g_ddraw->mode.dmDisplayFrequency;
if (max_fps > 1000)
max_fps = 0;
@ -38,12 +35,6 @@ 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");
@ -84,29 +75,24 @@ void fpsl_init()
(D3DKMTCLOSEADAPTERPROC)real_GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTCloseAdapter");
}
g_fpsl.is_wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0;
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 +106,12 @@ 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 &&
!g_fpsl.is_wine &&
SUCCEEDED(g_fpsl.DwmFlush());
}
BOOL fpsl_dwm_is_enabled()
@ -146,27 +132,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_config.maxfps < 0 || g_config.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_config.vsync)
{
WaitForSingleObject(g_fpsl.htimer, g_fpsl.tick_length * 2);
LARGE_INTEGER due_time = { .QuadPart = -g_fpsl.tick_length_ns };

View file

@ -1,5 +1,6 @@
#include <windows.h>
#include <stdio.h>
#include <psapi.h>
#include "directinput.h"
#include "dd.h"
#include "winapi_hooks.h"
@ -7,9 +8,6 @@
#include "debug.h"
#include "dllmain.h"
#include "config.h"
#include "utils.h"
#include "patch.h"
#include "versionhelpers.h"
#ifdef _MSC_VER
#include "detours.h"
@ -43,45 +41,23 @@ 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[] =
{
@ -114,22 +90,8 @@ HOOKLIST g_hook_hooklist[] =
{ "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 }
}
},
@ -140,20 +102,13 @@ HOOKLIST g_hook_hooklist[] =
{ "", 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",
{
@ -173,28 +128,15 @@ HOOKLIST g_hook_hooklist[] =
{
"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 },
{ "", NULL, NULL, 0 }
}
},
{
"kernel32.dll",
{
@ -203,12 +145,7 @@ HOOKLIST g_hook_hooklist[] =
{ "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
{ "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, HOOK_SKIP_2 },
{ "", NULL, NULL, 0 }
}
},
@ -244,15 +181,17 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks,
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)
DWORD import_desc_size = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size;
if (import_desc_rva == 0 || import_desc_size == 0)
return;
PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)hmod + import_desc_rva);
PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva);
while (import_desc->FirstThunk)
{
@ -264,29 +203,26 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks,
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)real_GetProcAddress(
cur_mod,
hooks[i].data[x].function_name);
if (!hooks[i].data[x].new_function || !org_function)
continue;
@ -294,9 +230,6 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks,
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,9 +273,8 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks,
}
first_thunk++;
original_first_thunk++;
}
break;
}
}
@ -367,15 +299,17 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc
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)
DWORD import_desc_size = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size;
if (import_desc_rva == 0 || import_desc_size == 0)
return;
PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)hmod + import_desc_rva);
PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva);
while (import_desc->FirstThunk)
{
@ -387,17 +321,17 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc
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 + 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 = (void*)((DWORD)dos_header + import_desc->FirstThunk);
PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)dos_header + import_desc->OriginalFirstThunk);
while (first_thunk->u1.Function)
{
if (!o_first_thunk->u1.AddressOfData)
{
{
first_thunk++;
o_first_thunk++;
continue;
@ -415,14 +349,6 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc
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)
{
DWORD op;
@ -437,7 +363,7 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc
{
DWORD org =
(DWORD)real_GetProcAddress(
GetModuleHandleA(hooks[i].module_name),
GetModuleHandle(hooks[i].module_name),
hooks[i].data[x].function_name);
if (org && first_thunk->u1.Function != org)
@ -462,8 +388,6 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc
first_thunk++;
o_first_thunk++;
}
break;
}
}
@ -475,45 +399,33 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc
}
}
BOOL hook_got_ddraw_import(HMODULE mod, BOOL check_imported_dlls)
BOOL hook_got_ddraw_import()
{
if (!mod)
return FALSE;
__try
{
PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)mod;
HMODULE hmod = GetModuleHandleA(NULL);
PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)hmod;
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);
PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (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)dos_header +
(DWORD)(nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress));
PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)mod + import_desc_rva);
if (import_desc == (PIMAGE_IMPORT_DESCRIPTOR)nt_headers)
return FALSE;
while (import_desc->FirstThunk)
{
if (import_desc->Name)
char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name));
if (_stricmp(imp_module_name, "ddraw.dll") == 0)
{
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;
}
return TRUE;
}
import_desc++;
@ -560,8 +472,17 @@ 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;
@ -577,20 +498,17 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook)
/* 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;
BOOL is_wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0;
BOOL wine_hook = is_wine && _strcmpi(mod_filename, "mciavi32") == 0;
if (is_local ||
wine_hook ||
_strcmpi(mod_filename, "QuickTime") == 0 ||
_strcmpi(mod_filename, "MSVFW32") == 0 ||
_strcmpi(mod_filename, "quartz") == 0 ||
_strcmpi(mod_filename, "winmm") == 0)
@ -599,6 +517,9 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook)
}
}
}
if (process)
CloseHandle(process);
}
}
@ -642,8 +563,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;
@ -653,11 +583,12 @@ 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;
BOOL is_wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0;
BOOL wine_hook = is_wine && _strcmpi(mod_filename, "mciavi32") == 0;
if (is_local ||
wine_hook ||
_strcmpi(mod_filename, "QuickTime") == 0 ||
_strcmpi(mod_filename, "MSVFW32") == 0 ||
_strcmpi(mod_filename, "quartz") == 0 ||
_strcmpi(mod_filename, "winmm") == 0)
@ -666,6 +597,9 @@ void hook_revert(HOOKLIST* hooks)
}
}
}
if (process)
CloseHandle(process);
}
}
@ -675,42 +609,35 @@ void hook_revert(HOOKLIST* hooks)
}
}
void hook_init()
void hook_init(BOOL initial_hook)
{
if (!g_hook_active)
if (initial_hook)
{
if (g_config.hook == 4 && hook_got_ddraw_import(GetModuleHandleA(NULL), TRUE))
if (g_config.hook == 4 && hook_got_ddraw_import())
{
/* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */
g_config.hook = 3;
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);
DetourTransactionCommit();
if (!IsDebuggerPresent())
{
patch_ljmp((void*)_invoke_watson, (void*)dbg_invoke_watson);
}
}
#endif
if (!g_hook_active)
if (initial_hook)
{
hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA);
}
hook_create((HOOKLIST*)&g_hook_hooklist, !g_hook_active);
hook_create((HOOKLIST*)&g_hook_hooklist, initial_hook);
g_hook_active = TRUE;
}
@ -724,13 +651,12 @@ void hook_exit()
hook_revert((HOOKLIST*)&g_hook_hooklist);
#if defined(_DEBUG)
#if defined(_MSC_VER)
#if defined(_DEBUG) && defined(_MSC_VER)
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter);
DetourTransactionCommit();
#endif
real_SetUnhandledExceptionFilter(g_dbg_exception_filter);
#endif

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

@ -13,12 +13,12 @@ HOOKPROC g_mouse_proc;
void mouse_lock()
{
if (g_config.devmode || g_ddraw.bnet_active || !g_ddraw.hwnd)
if (g_config.devmode || g_ddraw->bnet_active || !g_ddraw->hwnd)
return;
if (g_hook_active && !g_mouse_locked && !util_is_minimized(g_ddraw.hwnd))
if (g_hook_active && !g_mouse_locked && !util_is_minimized(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,22 +31,22 @@ 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_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);
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;
@ -55,7 +55,7 @@ void mouse_lock()
void mouse_unlock()
{
if (g_config.devmode || !g_hook_active || !g_ddraw.hwnd)
if (g_config.devmode || !g_hook_active || !g_ddraw->hwnd)
return;
if (g_mouse_locked)
@ -63,19 +63,19 @@ void mouse_unlock()
g_mouse_locked = FALSE;
real_ClipCursor(NULL);
ReleaseCapture();
//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)));
(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));
@ -85,7 +85,7 @@ 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))

View file

@ -4,8 +4,6 @@
#include "dd.h"
#include "debug.h"
#include "hook.h"
#include "config.h"
#include "versionhelpers.h"
PFNWGLCREATECONTEXTPROC xwglCreateContext;
PFNWGLDELETECONTEXTPROC xwglDeleteContext;
@ -88,14 +86,11 @@ 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()
{
@ -195,16 +190,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,13 +211,13 @@ 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)
if (g_ddraw->opengl_core)
{
wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB");
}
@ -233,32 +225,11 @@ void oglu_init()
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;
}

View file

@ -15,16 +15,6 @@
#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_set_states();
static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch);
@ -37,27 +27,11 @@ BOOL d3d9_is_available()
if ((g_d3d9.hmodule = real_LoadLibraryA("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))real_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,7 +39,7 @@ BOOL d3d9_is_available()
BOOL d3d9_create()
{
if (g_d3d9.hwnd == g_ddraw.hwnd && d3d9_create_resources() && d3d9_reset(g_config.windowed))
if (g_d3d9.hwnd == g_ddraw->hwnd && d3d9_create_resources() && d3d9_reset(g_config.windowed))
{
return TRUE;
}
@ -85,7 +59,7 @@ BOOL d3d9_create()
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->d3d9on12)
{
d3d_create9on12 = (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9On12");
}
@ -96,13 +70,13 @@ BOOL d3d9_create()
#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);
HRESULT hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, D3DADAPTER_DEFAULT, 0, &ai);
HRESULT hr2 = IDirect3D9_GetDeviceCaps(g_d3d9.instance, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
if (SUCCEEDEDX(adapter_hr))
if (SUCCEEDED(hr))
{
TRACE("+--Direct3D9-------------------------------------\n");
TRACE("| D3D9On12: %s (%p)\n", d3d9on12 != NULL ? "True" : "False", GetModuleHandleA("d3d9on12.dll"));
TRACE("| D3D9On12: %s\n", d3d9on12 != NULL ? "True" : "False");
TRACE("| VendorId: 0x%x\n", ai.VendorId);
TRACE("| DeviceId: 0x%x\n", ai.DeviceId);
TRACE("| Revision: 0x%x\n", ai.Revision);
@ -116,7 +90,7 @@ BOOL d3d9_create()
TRACE("| Driver: %s\n", ai.Driver);
TRACE("| Description: %s\n", ai.Description);
if (SUCCEEDEDX(devcaps_hr))
if (SUCCEEDED(hr2))
{
TRACE("| MaxTextureWidth: %d\n", caps.MaxTextureWidth);
TRACE("| MaxTextureHeight: %d\n", caps.MaxTextureHeight);
@ -132,18 +106,18 @@ BOOL d3d9_create()
TRACE("+------------------------------------------------\n");
}
#endif
g_d3d9.hwnd = g_ddraw.hwnd;
g_d3d9.hwnd = g_ddraw->hwnd;
memset(&g_d3d9.params, 0, sizeof(g_d3d9.params));
g_d3d9.params.Windowed = g_config.windowed || g_config.nonexclusive;
g_d3d9.params.SwapEffect = D3DSWAPEFFECT_DISCARD;
g_d3d9.params.hDeviceWindow = g_ddraw.hwnd;
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.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.BackBufferFormat = g_ddraw->mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8;
g_d3d9.params.BackBufferCount = 1;
DWORD behavior_flags[] = {
@ -156,12 +130,12 @@ BOOL d3d9_create()
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,
g_ddraw->hwnd,
behavior_flags[i],
&g_d3d9.params,
&g_d3d9.device)))
@ -173,31 +147,6 @@ 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)
@ -211,20 +160,20 @@ BOOL d3d9_on_device_lost()
BOOL d3d9_reset(BOOL windowed)
{
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.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.BackBufferFormat = g_ddraw->mode.dmBitsPerPel == 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);
InterlockedExchange(&g_ddraw->render.palette_updated, TRUE);
InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
}
return result;
@ -299,8 +248,8 @@ static BOOL d3d9_create_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 +262,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 +271,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 ? (g_config.rgb555 ? D3DFMT_X1R5G5B5 : 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,28 +303,13 @@ 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(
@ -448,7 +321,7 @@ static BOOL d3d9_create_resources()
{
if (g_config.d3d9_filter == FILTER_LANCZOS)
{
BOOL error = FAILEDX(
BOOL error = FAILED(
IDirect3DDevice9_CreatePixelShader(
g_d3d9.device,
(DWORD*)D3D9_LANCZOS2_SHADER,
@ -469,27 +342,27 @@ static BOOL d3d9_create_resources()
}
}
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->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));
@ -497,7 +370,7 @@ static BOOL d3d9_set_states()
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
@ -506,52 +379,52 @@ static BOOL d3d9_set_states()
{
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)))
(g_ddraw->render.viewport.width != g_ddraw->width ||
g_ddraw->render.viewport.height != g_ddraw->height) &&
SUCCEEDED(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));
err = err || FAILED(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)) &&
SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) &&
SUCCEEDED(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)))
(g_ddraw->render.viewport.width != g_ddraw->width ||
g_ddraw->render.viewport.height != g_ddraw->height) &&
SUCCEEDED(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));
err = err || FAILED(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1));
}
}
}
/*
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 +435,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));
@ -581,11 +454,10 @@ DWORD WINAPI d3d9_render_main(void)
BOOL needs_update = FALSE;
DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE;
DWORD timeout = g_config.minfps > 0 ? g_ddraw->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_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED))
{
#if _DEBUG
dbg_draw_frame_info_start();
@ -595,72 +467,72 @@ DWORD WINAPI d3d9_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->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_config.lock_surfaces)
EnterCriticalSection(&g_ddraw.primary->cs);
EnterCriticalSection(&g_ddraw->primary->cs);
if (g_config.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_config.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,
g_ddraw->primary->width,
g_ddraw->primary->height,
lock_rc.Pitch,
g_ddraw.primary->surface,
g_ddraw->primary->surface,
0,
0,
g_ddraw.primary->pitch,
g_ddraw.primary->bpp);
g_ddraw->primary->pitch,
g_ddraw->primary->bpp);
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_config.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);
}
@ -668,12 +540,13 @@ DWORD WINAPI d3d9_render_main(void)
if (g_config.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;
InterlockedExchangePointer(&g_ddraw->video_window_hwnd, NULL);
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);
@ -689,12 +562,12 @@ DWORD WINAPI d3d9_render_main(void)
}
if (g_config.lock_surfaces)
LeaveCriticalSection(&g_ddraw.primary->cs);
LeaveCriticalSection(&g_ddraw->primary->cs);
}
LeaveCriticalSection(&g_ddraw.cs);
LeaveCriticalSection(&g_ddraw->cs);
if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0)
if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0)
{
IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
}
@ -703,7 +576,7 @@ 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)
if (g_ddraw->bnet_active)
{
IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
}
@ -711,22 +584,11 @@ DWORD WINAPI d3d9_render_main(void)
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);
SendMessageTimeout(g_ddraw->hwnd, WM_D3D9DEVICELOST, 0, 0, 0, 1000, &result);
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
Sleep(50);
}
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();
@ -736,7 +598,7 @@ DWORD WINAPI d3d9_render_main(void)
}
if (g_config.vhack)
InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE);
InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE);
return 0;
}

View file

@ -16,20 +16,20 @@ 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;
g_ddraw->show_driver_warning = FALSE;
TRACE(" Switched to GDI renderer\n");
warning_end_tick = timeGetTime() + (15 * 1000);
if (!g_config.windowed)
PostMessage(g_ddraw.hwnd, WM_AUTORENDERER, 0, 0);
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 +38,10 @@ DWORD WINAPI gdi_render_main(void)
fpsl_init();
DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE;
DWORD timeout = g_config.minfps > 0 ? g_ddraw->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_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED))
{
#if _DEBUG
dbg_draw_frame_info_start();
@ -50,25 +49,25 @@ 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->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_config.lock_surfaces)
EnterCriticalSection(&g_ddraw.primary->cs);
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
@ -80,100 +79,88 @@ DWORD WINAPI gdi_render_main(void)
BOOL upscale_hack = g_config.vhack && util_detect_low_res_screen();
if (g_config.vhack)
InterlockedExchange(&g_ddraw.upscale_hack_active, upscale_hack);
InterlockedExchange(&g_ddraw->upscale_hack_active, upscale_hack);
if (g_config.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;
InterlockedExchangePointer(&g_ddraw->video_window_hwnd, NULL);
EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary);
}
if (g_ddraw.bpp == 8 && g_ddraw.primary->palette)
if (g_ddraw->bpp == 8 && 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->bnet_active)
{
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;
RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height };
FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
}
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,
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,
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,
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,
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,
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->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

@ -9,7 +9,6 @@
#include "blt.h"
#include "config.h"
static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src);
static BOOL ss_screenshot_8bit(char* filename, IDirectDrawSurfaceImpl* src)
{
@ -134,7 +133,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++)
{
@ -150,103 +149,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;
strftime(str_time, sizeof(str_time), "%Y-%m-%d-%H_%M_%S", localtime(&t));
_snprintf(filename, sizeof(filename), "%s%s-%s.png", g_config.screenshot_dir, 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;
}

View file

@ -1,8 +1,5 @@
#include <windows.h>
#include <intrin.h>
#include <stdio.h>
#include <math.h>
#include <tlhelp32.h>
#include "ddraw.h"
#include "debug.h"
#include "dd.h"
@ -12,405 +9,8 @@
#include "render_d3d9.h"
#include "utils.h"
#include "config.h"
#include "versionhelpers.h"
#include "delay_imports.h"
/*
The following code is licensed under the MIT license:
DetourEnumerateModules
Copyright (c) Microsoft Corporation
https://github.com/microsoft/Detours
*/
#define MM_ALLOCATION_GRANULARITY 0x10000
HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast)
{
PBYTE pbLast = (PBYTE)hModuleLast + MM_ALLOCATION_GRANULARITY;
MEMORY_BASIC_INFORMATION mbi;
ZeroMemory(&mbi, sizeof(mbi));
// Find the next memory region that contains a mapped PE image.
//
for (;; pbLast = (PBYTE)mbi.BaseAddress + mbi.RegionSize) {
if (VirtualQuery(pbLast, &mbi, sizeof(mbi)) <= 0) {
break;
}
// Skip uncommitted regions and guard pages.
//
if ((mbi.State != MEM_COMMIT) ||
((mbi.Protect & 0xff) == PAGE_NOACCESS) ||
(mbi.Protect & PAGE_GUARD)) {
continue;
}
__try {
PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pbLast;
if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE ||
(DWORD)pDosHeader->e_lfanew > mbi.RegionSize ||
(DWORD)pDosHeader->e_lfanew < sizeof(*pDosHeader)) {
continue;
}
PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader +
pDosHeader->e_lfanew);
if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {
continue;
}
return (HMODULE)pDosHeader;
}
#if defined(_MSC_VER)
#pragma prefast(suppress:28940, "A bad pointer means this probably isn't a PE header.")
#endif
__except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
continue;
}
}
return NULL;
}
void util_set_process_affinity()
{
#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (snap == INVALID_HANDLE_VALUE)
return;
THREADENTRY32 entry = { 0 };
entry.dwSize = sizeof(THREADENTRY32);
if (!Thread32First(snap, &entry))
{
CloseHandle(snap);
return;
}
do
{
if (entry.th32OwnerProcessID == GetCurrentProcessId())
{
util_set_thread_affinity(entry.th32ThreadID);
}
} while (Thread32Next(snap, &entry));
CloseHandle(snap);
#endif
}
void util_set_thread_affinity(DWORD tid)
{
#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
HANDLE thread = OpenThread(THREAD_QUERY_INFORMATION | THREAD_SET_INFORMATION, FALSE, tid);
if (thread)
{
void* start = NULL;
NTSTATUS status = STATUS_PENDING;
if (delay_NtQueryInformationThread)
{
status =
delay_NtQueryInformationThread(thread, ThreadQuerySetWin32StartAddress, &start, sizeof(start), NULL);
}
if (status == STATUS_SUCCESS && start && delay_GetModuleHandleExA)
{
char game_exe_path[MAX_PATH] = { 0 };
char game_dir[MAX_PATH] = { 0 };
if (GetModuleFileNameA(NULL, game_exe_path, sizeof(game_exe_path)))
{
_splitpath(game_exe_path, NULL, game_dir, NULL, NULL);
char mod_path[MAX_PATH] = { 0 };
char mod_dir[MAX_PATH] = { 0 };
char mod_filename[MAX_PATH] = { 0 };
HMODULE mod = NULL;
if (delay_GetModuleHandleExA(
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, start, &mod))
{
if (GetModuleFileNameA(mod, mod_path, sizeof(mod_path)))
{
_splitpath(mod_path, NULL, mod_dir, mod_filename, NULL);
if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0) // _strcmpi(mod_filename, "WINMM") == 0
{
SetThreadAffinityMask(thread, 1);
}
}
}
}
}
else
{
SetThreadAffinityMask(thread, 1);
}
CloseHandle(thread);
}
#endif
}
void util_pull_messages()
{
if (g_config.fix_not_responding &&
g_ddraw.hwnd &&
g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() &&
GetCurrentThreadId() == g_ddraw.gui_thread_id &&
!IsWine())
{
/* workaround for "Not Responding" window problem */
//g_ddraw.last_msg_pull_tick = timeGetTime();
MSG msg;
if (real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessageA(&msg);
}
}
}
DWORD util_get_timestamp(HMODULE mod)
{
if (!mod || mod == INVALID_HANDLE_VALUE)
return 0;
PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)mod;
if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
return 0;
PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew);
if (nt_headers->Signature != IMAGE_NT_SIGNATURE)
return 0;
return nt_headers->FileHeader.TimeDateStamp;
}
FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name)
{
if (!mod || mod == INVALID_HANDLE_VALUE)
return NULL;
__try
{
PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)mod;
if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
return NULL;
PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)mod + (DWORD)dos_header->e_lfanew);
if (nt_headers->Signature != IMAGE_NT_SIGNATURE)
return NULL;
DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
if (!import_desc_rva)
return NULL;
PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)mod + import_desc_rva);
while (import_desc->FirstThunk)
{
if (!import_desc->OriginalFirstThunk || !import_desc->Name)
{
import_desc++;
continue;
}
char* imp_module_name = (char*)((DWORD)mod + import_desc->Name);
if (_stricmp(imp_module_name, module_name) == 0)
{
PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)mod + import_desc->FirstThunk);
PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)mod + import_desc->OriginalFirstThunk);
while (first_thunk->u1.Function)
{
if (!o_first_thunk->u1.AddressOfData)
{
first_thunk++;
o_first_thunk++;
continue;
}
PIMAGE_IMPORT_BY_NAME import = (void*)((DWORD)mod + o_first_thunk->u1.AddressOfData);
if ((o_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0)
{
#if defined(__GNUC__)
if (util_is_bad_read_ptr((void*)import->Name))
continue;
#endif
if (strcmp((const char*)import->Name, function_name) == 0 && first_thunk->u1.Function)
{
return (FARPROC)first_thunk->u1.Function;
}
}
first_thunk++;
o_first_thunk++;
}
}
import_desc++;
}
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
}
return NULL;
}
BOOL util_caller_is_ddraw_wrapper(void* return_address)
{
if (!delay_GetModuleHandleExA)
return FALSE;
void* directDrawCreate = (void*)util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate");
void* directDrawCreateEx = (void*)util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreateEx");
TRACE("%s directDrawCreate = %p, directDrawCreateEx = %p\n", __FUNCTION__, directDrawCreate, directDrawCreateEx);
HMODULE mod = NULL;
DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT;
HMODULE D3dHook_dll = GetModuleHandleA("D3dHook.dll");
if (D3dHook_dll)
{
if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == D3dHook_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == D3dHook_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == D3dHook_dll))
{
MessageBoxA(
NULL,
"Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n"
"Please disable D3DWindower and then try to start the game again.",
"Conflicting DirectDraw wrapper detected - cnc-ddraw",
MB_OK | MB_TOPMOST);
return TRUE;
}
}
HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll");
if (wndmode_dll)
{
if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == wndmode_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == wndmode_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == wndmode_dll))
{
MessageBoxA(
NULL,
"Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n"
"Please remove/disable wndmode.dll and then try to start the game again.",
"Conflicting DirectDraw wrapper detected - cnc-ddraw",
MB_OK | MB_TOPMOST);
return TRUE;
}
}
HMODULE windmode_dll = GetModuleHandleA("windmode.dll");
if (windmode_dll)
{
if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == windmode_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == windmode_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == windmode_dll))
{
MessageBoxA(
NULL,
"Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n"
"Please remove/disable windmode.dll and then try to start the game again.",
"Conflicting DirectDraw wrapper detected - cnc-ddraw",
MB_OK | MB_TOPMOST);
return TRUE;
}
}
HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll");
if (dxwnd_dll)
{
if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == dxwnd_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == dxwnd_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == dxwnd_dll))
{
MessageBoxA(
NULL,
"Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n"
"Please disable DxWnd and then try to start the game again.",
"Conflicting DirectDraw wrapper detected - cnc-ddraw",
MB_OK | MB_TOPMOST);
return TRUE;
}
}
HMODULE age_dll = GetModuleHandleA("age.dll");
if (age_dll)
{
if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == age_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll))
{
HKEY hkey;
LONG status =
RegOpenKeyExA(HKEY_CURRENT_USER, "SOFTWARE\\Voobly\\Voobly\\game\\13", 0L, KEY_READ, &hkey);
if (status == ERROR_SUCCESS)
{
char windowed[256] = { 0 };
DWORD size = sizeof(windowed);
RegQueryValueExA(hkey, "windowmode", NULL, NULL, (PVOID)&windowed, &size);
RegCloseKey(hkey);
if (tolower(windowed[0]) == 't')
{
MessageBoxA(
NULL,
"Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n"
"Please disable the other wrapper by clicking in the game room on the very top "
"on 'Game', now select 'DirectX' and disable 'Start in Window-Mode'.",
"Conflicting DirectDraw wrapper detected - cnc-ddraw",
MB_OK | MB_TOPMOST);
return TRUE;
}
}
}
}
return FALSE;
}
BOOL util_is_bad_read_ptr(void* p)
{
MEMORY_BASIC_INFORMATION mbi = { 0 };
if (VirtualQuery(p, &mbi, sizeof(mbi)))
{
DWORD mask = (
PAGE_READONLY |
PAGE_READWRITE |
PAGE_WRITECOPY |
PAGE_EXECUTE_READ |
PAGE_EXECUTE_READWRITE |
PAGE_EXECUTE_WRITECOPY);
BOOL b = !(mbi.Protect & mask);
if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS))
b = TRUE;
return b;
}
return TRUE;
}
BOOL util_is_minimized(HWND hwnd)
{
RECT rc = { 0 };
@ -418,13 +18,6 @@ BOOL util_is_minimized(HWND hwnd)
return IsIconic(hwnd) || (real_GetClientRect(hwnd, &rc) && (rc.right - rc.left == 0 || rc.bottom - rc.top == 0));
}
BOOL util_in_foreground()
{
DWORD process_id = 0;
return GetWindowThreadProcessId(real_GetForegroundWindow(), &process_id) && process_id == GetCurrentProcessId();
}
BOOL util_is_avx_supported()
{
const DWORD XMM_STATE_BIT = 1 << 1;
@ -470,59 +63,25 @@ BOOL util_is_avx_supported()
void util_limit_game_ticks()
{
if (GetCurrentThreadId() != g_ddraw.gui_thread_id)
if (GetCurrentThreadId() != g_ddraw->gui_thread_id)
return;
/*
static void (WINAPI * getSystemTimePreciseAsFileTime)(LPFILETIME);
if (!getSystemTimePreciseAsFileTime)
{
getSystemTimePreciseAsFileTime = GetProcAddress(LoadLibraryA("Kernel32.dll"), "GetSystemTimePreciseAsFileTime");
//if (!getSystemTimePreciseAsFileTime)
// getSystemTimePreciseAsFileTime = GetSystemTimeAsFileTime;
}
if (1)
{
FILETIME ft = { 0 };
getSystemTimePreciseAsFileTime(&ft);
if (CompareFileTime((FILETIME*)&g_ddraw.ticks_limiter.due_time, &ft) == -1)
{
memcpy(&g_ddraw.ticks_limiter.due_time, &ft, sizeof(LARGE_INTEGER));
}
else
{
while (TRUE)
{
getSystemTimePreciseAsFileTime(&ft);
if (CompareFileTime((FILETIME*)&g_ddraw.ticks_limiter.due_time, &ft) <= 0)
break;
}
}
g_ddraw.ticks_limiter.due_time.QuadPart += g_ddraw.ticks_limiter.tick_length_ns;
}
else */
if (g_ddraw.ticks_limiter.htimer)
if (g_ddraw->ticks_limiter.htimer)
{
FILETIME ft = { 0 };
GetSystemTimeAsFileTime(&ft);
if (CompareFileTime((FILETIME*)&g_ddraw.ticks_limiter.due_time, &ft) == -1)
if (CompareFileTime((FILETIME*)&g_ddraw->ticks_limiter.due_time, &ft) == -1)
{
memcpy(&g_ddraw.ticks_limiter.due_time, &ft, sizeof(LARGE_INTEGER));
memcpy(&g_ddraw->ticks_limiter.due_time, &ft, sizeof(LARGE_INTEGER));
}
else
{
WaitForSingleObject(g_ddraw.ticks_limiter.htimer, g_ddraw.ticks_limiter.tick_length * 2);
WaitForSingleObject(g_ddraw->ticks_limiter.htimer, g_ddraw->ticks_limiter.tick_length * 2);
}
g_ddraw.ticks_limiter.due_time.QuadPart += g_ddraw.ticks_limiter.tick_length_ns;
SetWaitableTimer(g_ddraw.ticks_limiter.htimer, &g_ddraw.ticks_limiter.due_time, 0, NULL, NULL, FALSE);
g_ddraw->ticks_limiter.due_time.QuadPart += g_ddraw->ticks_limiter.tick_length_ns;
SetWaitableTimer(g_ddraw->ticks_limiter.htimer, &g_ddraw->ticks_limiter.due_time, 0, NULL, NULL, FALSE);
}
else
{
@ -534,12 +93,12 @@ void util_limit_game_ticks()
return;
}
next_game_tick += g_ddraw.ticks_limiter.tick_length;
next_game_tick += g_ddraw->ticks_limiter.tick_length;
DWORD tick_count = timeGetTime();
int sleep_time = next_game_tick - tick_count;
if (sleep_time <= 0 || sleep_time > g_ddraw.ticks_limiter.tick_length)
if (sleep_time <= 0 || sleep_time > g_ddraw->ticks_limiter.tick_length)
{
next_game_tick = tick_count;
}
@ -555,7 +114,7 @@ void util_update_bnet_pos(int new_x, int new_y)
static int old_x = -32000;
static int old_y = -32000;
if (old_x == -32000 || old_y == -32000 || !g_ddraw.bnet_active)
if (old_x == -32000 || old_y == -32000 || !g_ddraw->bnet_active)
{
old_x = new_x;
old_y = new_y;
@ -563,10 +122,10 @@ void util_update_bnet_pos(int new_x, int new_y)
}
POINT pt = { 0, 0 };
real_ClientToScreen(g_ddraw.hwnd, &pt);
real_ClientToScreen(g_ddraw->hwnd, &pt);
RECT mainrc;
SetRect(&mainrc, pt.x, pt.y, pt.x + g_ddraw.width, pt.y + g_ddraw.height);
SetRect(&mainrc, pt.x, pt.y, pt.x + g_ddraw->width, pt.y + g_ddraw->height);
int adj_y = 0;
int adj_x = 0;
@ -589,7 +148,7 @@ void util_update_bnet_pos(int new_x, int new_y)
0,
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
if (rc.bottom - rc.top <= g_ddraw.height)
if (rc.bottom - rc.top <= g_ddraw->height)
{
if (rc.bottom > mainrc.bottom && abs(mainrc.bottom - rc.bottom) > abs(adj_y))
{
@ -601,7 +160,7 @@ void util_update_bnet_pos(int new_x, int new_y)
}
}
if (rc.right - rc.left <= g_ddraw.width)
if (rc.right - rc.left <= g_ddraw->width)
{
if (rc.right > mainrc.right && abs(mainrc.right - rc.right) > abs(adj_x))
{
@ -660,7 +219,7 @@ BOOL util_get_lowest_resolution(
memset(&m, 0, sizeof(DEVMODE));
m.dmSize = sizeof(DEVMODE);
while (real_EnumDisplaySettingsA(NULL, i, &m))
while (EnumDisplaySettings(NULL, i, &m))
{
if (m.dmPelsWidth >= min_width &&
m.dmPelsHeight >= min_height &&
@ -689,33 +248,26 @@ BOOL util_get_lowest_resolution(
void util_toggle_maximize()
{
if (!g_config.resizable || !g_config.windowed || g_config.fullscreen || !g_ddraw.width)
return;
/* Do not allow cnc-ddraw maximize while macOS maximize is active */
if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top)
return;
RECT client_rc;
RECT dst_rc;
LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE);
LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE);
BOOL got_menu = GetMenu(g_ddraw.hwnd) != NULL;
LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE);
LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE);
BOOL got_menu = GetMenu(g_ddraw->hwnd) != NULL;
if (real_GetClientRect(g_ddraw.hwnd, &client_rc) && SystemParametersInfo(SPI_GETWORKAREA, 0, &dst_rc, 0))
if (real_GetClientRect(g_ddraw->hwnd, &client_rc) && SystemParametersInfo(SPI_GETWORKAREA, 0, &dst_rc, 0))
{
int width = (dst_rc.right - dst_rc.left);
int height = (dst_rc.bottom - dst_rc.top);
int x = dst_rc.left;
int y = dst_rc.top;
if (client_rc.right != g_ddraw.width || client_rc.bottom != g_ddraw.height)
if (client_rc.right != g_ddraw->width || client_rc.bottom != g_ddraw->height)
{
dst_rc.left = 0;
dst_rc.top = 0;
dst_rc.right = g_ddraw.width;
dst_rc.bottom = g_ddraw.height;
dst_rc.right = g_ddraw->width;
dst_rc.bottom = g_ddraw->height;
AdjustWindowRectEx(&dst_rc, style, got_menu, exstyle);
}
@ -723,15 +275,15 @@ void util_toggle_maximize()
{
dst_rc.left = 0;
dst_rc.top = 0;
dst_rc.right = g_ddraw.width;
dst_rc.bottom = g_ddraw.height;
dst_rc.right = g_ddraw->width;
dst_rc.bottom = g_ddraw->height;
for (int i = 20; i-- > 1;)
{
if (width >= g_ddraw.width * i && height - 20 >= g_ddraw.height * i)
if (width >= g_ddraw->width * i && height - 20 >= g_ddraw->height * i)
{
dst_rc.right = g_ddraw.width * i;
dst_rc.bottom = g_ddraw.height * i;
dst_rc.right = g_ddraw->width * i;
dst_rc.bottom = g_ddraw->height * i;
break;
}
}
@ -745,31 +297,14 @@ void util_toggle_maximize()
int w = dst_rc.right - dst_rc.left;
int h = dst_rc.bottom - dst_rc.top;
double dst_ar;
double src_ar = (double)h / w;
if (g_config.aspect_ratio[0])
{
char* e = &g_config.aspect_ratio[0];
DWORD cx = strtoul(e, &e, 0);
DWORD cy = strtoul(e + 1, &e, 0);
dst_ar = (double)cy / cx;
}
else
{
dst_ar = (double)g_ddraw.height / g_ddraw.width;
}
dst_rc.top = 0;
dst_rc.left = 0;
dst_rc.right = w;
dst_rc.bottom = (LONG)round(dst_ar * w);
dst_rc.bottom = (LONG)(((float)g_ddraw->height / g_ddraw->width) * w);
if (src_ar < dst_ar)
if (dst_rc.bottom > h)
{
dst_rc.right = (LONG)round(((double)dst_rc.right / dst_rc.bottom) * h);
dst_rc.right = (LONG)(((float)dst_rc.right / dst_rc.bottom) * h);
dst_rc.bottom = h;
}
@ -796,12 +331,7 @@ void util_toggle_maximize()
void util_toggle_fullscreen()
{
/* Disable ALT+ENTER on battle.net and Infantry Online Zone List Window */
if (g_ddraw.bnet_active || !g_ddraw.width || (g_config.infantryhack && GetMenu(g_ddraw.hwnd)))
return;
/* Do not allow ALT+ENTER while macOS maximize is active */
if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top)
if (g_ddraw->bnet_active)
return;
if (g_config.toggle_borderless && g_config.windowed)
@ -810,8 +340,8 @@ void util_toggle_fullscreen()
{
mouse_unlock();
g_config.upscaled_state = g_config.fullscreen = TRUE;
dd_SetDisplayMode(0, 0, 0, 0);
g_config.borderless_state = g_config.fullscreen = TRUE;
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
mouse_lock();
}
@ -819,8 +349,8 @@ void util_toggle_fullscreen()
{
mouse_unlock();
g_config.upscaled_state = g_config.fullscreen = FALSE;
dd_SetDisplayMode(0, 0, 0, 0);
g_config.borderless_state = g_config.fullscreen = FALSE;
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
//mouse_lock();
}
@ -831,13 +361,8 @@ void util_toggle_fullscreen()
{
mouse_unlock();
if (g_config.toggle_upscaled)
{
g_config.upscaled_state = g_config.fullscreen = TRUE;
}
g_config.window_state = g_config.windowed = FALSE;
dd_SetDisplayMode(0, 0, 0, SDM_LEAVE_WINDOWED);
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED);
util_update_bnet_pos(0, 0);
mouse_lock();
@ -845,35 +370,29 @@ void util_toggle_fullscreen()
else
{
mouse_unlock();
if (g_config.toggle_upscaled)
{
g_config.upscaled_state = g_config.fullscreen = FALSE;
}
g_config.window_state = g_config.windowed = TRUE;
if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive)
if (g_ddraw->renderer == d3d9_render_main && !g_config.nonexclusive)
{
d3d9_reset(g_config.windowed);
}
else
{
if (g_ddraw.render.thread)
if (g_ddraw->render.thread)
{
EnterCriticalSection(&g_ddraw.cs);
g_ddraw.render.run = FALSE;
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
LeaveCriticalSection(&g_ddraw.cs);
EnterCriticalSection(&g_ddraw->cs);
g_ddraw->render.run = FALSE;
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
LeaveCriticalSection(&g_ddraw->cs);
WaitForSingleObject(g_ddraw.render.thread, INFINITE);
g_ddraw.render.thread = NULL;
WaitForSingleObject(g_ddraw->render.thread, INFINITE);
g_ddraw->render.thread = NULL;
}
ChangeDisplaySettings(NULL, g_ddraw.bnet_active ? CDS_FULLSCREEN : 0);
ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0);
}
dd_SetDisplayMode(0, 0, 0, SDM_LEAVE_FULLSCREEN);
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_FULLSCREEN);
//mouse_lock();
}
}
@ -901,15 +420,15 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags)
{
if (g_config.windowed)
{
if (g_ddraw.render.thread)
if (g_ddraw->render.thread)
{
EnterCriticalSection(&g_ddraw.cs);
g_ddraw.render.run = FALSE;
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
LeaveCriticalSection(&g_ddraw.cs);
EnterCriticalSection(&g_ddraw->cs);
g_ddraw->render.run = FALSE;
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
LeaveCriticalSection(&g_ddraw->cs);
WaitForSingleObject(g_ddraw.render.thread, INFINITE);
g_ddraw.render.thread = NULL;
WaitForSingleObject(g_ddraw->render.thread, INFINITE);
g_ddraw->render.thread = NULL;
}
if ((flags & SWP_NOMOVE) == 0)
@ -924,42 +443,10 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags)
g_config.window_rect.right = width;
}
dd_SetDisplayMode(0, 0, 0, 0);
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
}
}
BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam)
{
RECT size = { 0 };
real_GetClientRect(hwnd, &size);
LONG sytle = real_GetWindowLongA(hwnd, GWL_STYLE);
if (!g_ddraw.hwnd && !(sytle & WS_DISABLED) && size.right > 0 && size.bottom > 0)
g_ddraw.hwnd = hwnd;
#ifdef _DEBUG
char class[MAX_PATH] = { 0 };
GetClassNameA(hwnd, class, sizeof(class) - 1);
char title[MAX_PATH] = { 0 };
GetWindowTextA(hwnd, title, sizeof(title) - 1);
RECT pos = { 0 };
real_GetWindowRect(hwnd, &pos);
LONG exsytle = real_GetWindowLongA(hwnd, GWL_EXSTYLE);
TRACE(
"%s(class=%s, title=%s, X=%d, Y=%d, nWidth=%d, nHeight=%d)\n",
__FUNCTION__, class, title, pos.left, pos.top, size.right, size.bottom);
dbg_dump_wnd_styles(sytle, exsytle);
#endif
return TRUE;
}
BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam)
{
IDirectDrawSurfaceImpl* this = (IDirectDrawSurfaceImpl*)lparam;
@ -967,60 +454,41 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam)
RECT size;
RECT pos;
if (real_GetClientRect(hwnd, &size) && real_GetWindowRect(hwnd, &pos))
if (real_GetClientRect(hwnd, &size) && real_GetWindowRect(hwnd, &pos) && size.right > 1 && size.bottom > 1)
{
/*
TRACE(
" util_enum_child_proc right=%u, bottom=%u, left=%d, top=%d\n",
size.right,
size.bottom,
pos.left,
pos.top);
*/
char class_name[MAX_PATH] = { 0 };
GetClassNameA(hwnd, class_name, sizeof(class_name) - 1);
LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE);
HWND parent = GetParent(hwnd);
//TRACE_EXT(" AVIWINDOW class=%s\n", class_name);
#ifdef _DEBUG_X
LONG style = real_GetWindowLongA(hwnd, GWL_STYLE);
TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p, style=%08X\n",
class_name, hwnd, size.right, size.bottom, pos.left, pos.top, parent, style);
dbg_dump_wnd_styles(style, exstyle);
#endif
if (parent != g_ddraw.hwnd || size.right <= 1 || size.bottom <= 1 || _strcmpi(class_name, "Edit") == 0)
return TRUE;
if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE ||
g_config.fixchilds == FIX_CHILDS_DETECT_HIDE_NOSCALE ||
strcmp(class_name, "Cc2EditClassTh") == 0 ||
strcmp(class_name, "msctls_statusbar32") == 0 ||
if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE ||
strcmp(class_name, "VideoRenderer") == 0 ||
strcmp(class_name, "MCIQTZ_Window") == 0 ||
strcmp(class_name, "MCIAVI") == 0 ||
strcmp(class_name, "AVIWnd32") == 0 ||
strcmp(class_name, "MCIWndClass") == 0 ||
strcmp(class_name, "AVI Window") == 0)
strcmp(class_name, "AVIWnd32") == 0 ||
strcmp(class_name, "Afx:400000:3") == 0 ||
strcmp(class_name, "MCIWndClass") == 0)
{
if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE_NOSCALE)
{
g_ddraw.got_child_windows = g_ddraw.child_window_exists = TRUE;
}
InterlockedExchangePointer(&g_ddraw->video_window_hwnd, hwnd);
if (!(exstyle & WS_EX_TRANSPARENT))
{
real_SetWindowLongA(hwnd, GWL_EXSTYLE, exstyle | WS_EX_TRANSPARENT);
LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE);
real_SetWindowPos(
hwnd,
0,
0,
0,
0,
0,
SWP_ASYNCWINDOWPOS | SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER
);
if (!(style & WS_EX_TRANSPARENT))
{
real_SetWindowLongA(hwnd, GWL_EXSTYLE, style | WS_EX_TRANSPARENT);
}
}
else if (!(exstyle & WS_EX_TRANSPARENT))
else
{
g_ddraw.got_child_windows = g_ddraw.child_window_exists = TRUE;
g_ddraw->got_child_windows = g_ddraw->child_window_exists = TRUE;
if (g_config.fixchilds == FIX_CHILDS_DETECT_PAINT)
{
@ -1029,63 +497,36 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam)
dds_GetDC(this, &src_dc);
real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)&pos, 2);
real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)&pos, 2);
real_BitBlt(dst_dc, 0, 0, size.right, size.bottom, src_dc, pos.left, pos.top, SRCCOPY);
BitBlt(dst_dc, 0, 0, size.right, size.bottom, src_dc, pos.left, pos.top, SRCCOPY);
ReleaseDC(hwnd, dst_dc);
}
}
if (strcmp(class_name, "TMediaPlayer") == 0)
return TRUE;
}
#ifdef _DEBUG_X
return TRUE;
#else
return FALSE;
#endif
}
static unsigned char util_get_pixel(int x, int y)
{
return ((unsigned char*)dds_GetBuffer(
g_ddraw.primary))[y * g_ddraw.primary->pitch + x * g_ddraw.primary->bytes_pp];
g_ddraw->primary))[y * g_ddraw->primary->pitch + x * g_ddraw->primary->bytes_pp];
}
BOOL util_detect_low_res_screen()
{
/* struct Copied from wkReSolution */
typedef struct
{
PVOID UnkTable1;
DWORD Unk1, Unk2, Unk3, Unk4;
PVOID UnkDD, UnkTable2;
DWORD Unk5;
DWORD RenderWidth, RenderHeight;
DWORD Unk6, Unk7;
DWORD WidthRT, HeightRT;
DWORD HalfWidth, HalfHeight;
DWORD Unk8;
PCHAR UnkC;
LPDIRECTDRAW lpDD;
} * LPW2DDSTRUCT;
static int* in_movie = (int*)0x00665F58;
static int* is_vqa_640 = (int*)0x0065D7BC;
static BYTE* should_stretch = (BYTE*)0x00607D78;
static LPW2DDSTRUCT* pW2DS;
if (!pW2DS)
pW2DS = (LPW2DDSTRUCT*)((DWORD)GetModuleHandleA(NULL) + 0x799C4);
if (g_ddraw.width <= g_ddraw.upscale_hack_width || g_ddraw.height <= g_ddraw.upscale_hack_height)
if (g_ddraw->width <= g_ddraw->upscale_hack_width || g_ddraw->height <= g_ddraw->upscale_hack_height)
{
return FALSE;
}
if (g_ddraw.isredalert)
if (g_ddraw->isredalert)
{
if ((*in_movie && !*is_vqa_640) || *should_stretch)
{
@ -1094,32 +535,15 @@ BOOL util_detect_low_res_screen()
return FALSE;
}
else if (g_ddraw.iscnc1)
else if (g_ddraw->iscnc1)
{
return
util_get_pixel(g_ddraw.upscale_hack_width + 1, 0) == 0 ||
util_get_pixel(g_ddraw.upscale_hack_width + 5, 1) == 0;
util_get_pixel(g_ddraw->upscale_hack_width + 1, 0) == 0 ||
util_get_pixel(g_ddraw->upscale_hack_width + 5, 1) == 0;
}
else if (g_ddraw.iskkndx)
else if (g_ddraw->iskkndx)
{
return util_get_pixel(g_ddraw.width - 3, 3) == 0;
}
else if (g_ddraw.isworms2)
{
DWORD w2_width = *pW2DS ? (*pW2DS)->RenderWidth : 0;
DWORD w2_height = *pW2DS ? (*pW2DS)->RenderHeight : 0;
if (w2_width && w2_width < g_ddraw.width && w2_height && w2_height < g_ddraw.height)
{
if (g_ddraw.upscale_hack_width != w2_width || g_ddraw.upscale_hack_height != w2_height)
{
g_ddraw.upscale_hack_width = w2_width;
g_ddraw.upscale_hack_height = w2_height;
InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE);
}
return TRUE;
}
return util_get_pixel(g_ddraw->width - 3, 3) == 0;
}
return FALSE;

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

15
src/win2000.asm Normal file
View file

@ -0,0 +1,15 @@
.model flat
.data
__imp__EncodePointer@4 dd dummy
__imp__DecodePointer@4 dd dummy
EXTERNDEF __imp__EncodePointer@4 : DWORD
EXTERNDEF __imp__DecodePointer@4 : DWORD
.code
dummy proc
mov eax, [esp+4]
ret 4
dummy endp
end

File diff suppressed because it is too large Load diff

View file

@ -13,7 +13,6 @@
#include "wndproc.h"
#include "utils.h"
#include "debug.h"
#include "versionhelpers.h"
LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
@ -22,7 +21,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR &&
uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR && uMsg != WM_DEADCHAR && uMsg != WM_INPUT &&
uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP && uMsg != WM_TIMER &&
uMsg != WM_D3D9DEVICELOST && uMsg != WM_NULL)
uMsg != WM_D3D9DEVICELOST)
{
TRACE(
" uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d, LO=%d HI=%d)\n",
@ -42,30 +41,28 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
switch (uMsg)
{
case WM_NULL:
case WM_MOVING:
case WM_NCLBUTTONDOWN:
case WM_NCLBUTTONUP:
case WM_NCPAINT:
case WM_CANCELMODE:
case WM_DISPLAYCHANGE:
case WM_NCCALCSIZE:
{
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam);
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
case WM_GETMINMAXINFO:
{
MINMAXINFO* mmi = (MINMAXINFO*)lParam;
if (g_config.windowed && g_ddraw.width)
if (g_config.windowed && g_ddraw->width)
{
RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height };
RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height };
AdjustWindowRectEx(
&rc,
real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE),
GetMenu(g_ddraw.hwnd) != NULL,
real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE));
real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE),
GetMenu(g_ddraw->hwnd) != NULL,
real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE));
if (mmi->ptMaxTrackSize.x < rc.right - rc.left)
mmi->ptMaxTrackSize.x = rc.right - rc.left;
@ -74,13 +71,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
mmi->ptMaxTrackSize.y = rc.bottom - rc.top;
/*
RECT rcmin = { 0, 0, g_ddraw.width, g_ddraw.height };
RECT rcmin = { 0, 0, g_ddraw->width, g_ddraw->height };
AdjustWindowRectEx(
&rcmin,
real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE),
GetMenu(g_ddraw.hwnd) != NULL,
real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE));
real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE),
GetMenu(g_ddraw->hwnd) != NULL,
real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE));
mmi->ptMinTrackSize.x = rcmin.right - rcmin.left;
mmi->ptMinTrackSize.y = rcmin.bottom - rcmin.top;
@ -89,48 +86,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
return 0;
}
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam);
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
case WM_KILLFOCUS:
case WM_NCACTIVATE:
{
if (g_config.noactivateapp)
{
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam);
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
break;
}
case WM_NCHITTEST:
{
if (g_mouse_locked || g_config.devmode)
{
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt))
{
int x = max(pt.x - g_ddraw.mouse.x_adjust, 0);
int y = max(pt.y - g_ddraw.mouse.y_adjust, 0);
if (g_config.adjmouse)
{
x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x));
y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y));
}
pt.x = min(x, g_ddraw.width - 1);
pt.y = min(y, g_ddraw.height - 1);
}
else
{
pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0);
pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0);
}
CallWindowProcA(g_ddraw.wndproc, hWnd, uMsg, wParam, MAKELPARAM(pt.x, pt.y));
}
LRESULT result = real_DefWindowProcA(hWnd, uMsg, wParam, lParam);
LRESULT result = DefWindowProc(hWnd, uMsg, wParam, lParam);
if (!g_config.resizable)
{
@ -153,7 +122,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
case WM_SETCURSOR:
{
/* show resize cursor on window borders */
if ((HWND)wParam == g_ddraw.hwnd)
if ((HWND)wParam == g_ddraw->hwnd)
{
WORD message = HIWORD(lParam);
@ -175,7 +144,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
case HTTOP:
case HTTOPLEFT:
case HTTOPRIGHT:
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam);
return DefWindowProc(hWnd, uMsg, wParam, lParam);
case HTCLIENT:
if (!g_mouse_locked && !g_config.devmode)
{
@ -207,8 +176,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
}
case WM_D3D9DEVICELOST:
{
if (((!g_config.windowed && !g_config.nonexclusive) || !util_is_minimized(g_ddraw.hwnd)) &&
g_ddraw.renderer == d3d9_render_main &&
if (((!g_config.windowed && !g_config.nonexclusive) || !util_is_minimized(g_ddraw->hwnd)) &&
g_ddraw->renderer == d3d9_render_main &&
d3d9_on_device_lost())
{
if (!g_config.windowed)
@ -222,35 +191,29 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
{
case IDT_TIMER_LEAVE_BNET:
{
KillTimer(g_ddraw.hwnd, IDT_TIMER_LEAVE_BNET);
KillTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET);
if (!g_config.windowed)
g_ddraw.bnet_was_fullscreen = FALSE;
g_ddraw->bnet_was_fullscreen = FALSE;
if (!g_ddraw.bnet_active)
if (!g_ddraw->bnet_active)
{
if (g_ddraw.bnet_was_fullscreen)
if (g_ddraw->bnet_was_fullscreen)
{
int ws = g_config.window_state;
util_toggle_fullscreen();
g_config.window_state = ws;
g_ddraw.bnet_was_fullscreen = FALSE;
g_ddraw->bnet_was_fullscreen = FALSE;
}
else if (g_ddraw.bnet_was_upscaled)
else if (g_ddraw->bnet_was_upscaled)
{
util_set_window_rect(0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
g_ddraw.bnet_was_upscaled = FALSE;
g_ddraw->bnet_was_upscaled = FALSE;
}
}
return 0;
}
case IDT_TIMER_LINUX_FIX_WINDOW_SIZE:
{
KillTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE);
util_set_window_rect(0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
return 0;
}
}
break;
}
@ -265,12 +228,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy);
*/
if (IsWine() &&
if (g_ddraw->wine &&
!g_config.windowed &&
(pos->x > 0 || pos->y > 0) &&
g_ddraw.last_set_window_pos_tick + 500 < timeGetTime())
g_ddraw->last_set_window_pos_tick + 500 < timeGetTime())
{
PostMessage(g_ddraw.hwnd, WM_WINEFULLSCREEN, 0, 0);
PostMessage(g_ddraw->hwnd, WM_WINEFULLSCREEN, 0, 0);
}
break;
@ -279,26 +242,24 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
{
if (!g_config.windowed)
{
g_ddraw.last_set_window_pos_tick = timeGetTime();
int menu_height = GetMenu(g_ddraw.hwnd) ? real_GetSystemMetrics(SM_CYMENU) : 0;
g_ddraw->last_set_window_pos_tick = timeGetTime();
real_SetWindowPos(
g_ddraw.hwnd,
g_ddraw->hwnd,
HWND_TOPMOST,
1,
1,
g_ddraw.render.width,
g_ddraw.render.height + menu_height,
g_ddraw->render.width,
g_ddraw->render.height,
SWP_SHOWWINDOW);
real_SetWindowPos(
g_ddraw.hwnd,
g_ddraw->hwnd,
HWND_TOPMOST,
0,
0,
g_ddraw.render.width,
g_ddraw.render.height + menu_height,
g_ddraw->render.width,
g_ddraw->render.height,
SWP_SHOWWINDOW);
}
return 0;
@ -317,8 +278,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
{
in_size_move = FALSE;
if (!g_ddraw.render.thread)
dd_SetDisplayMode(0, 0, 0, 0);
if (!g_ddraw->render.thread)
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
}
break;
}
@ -330,15 +291,15 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
{
if (in_size_move)
{
if (g_ddraw.render.thread)
if (g_ddraw->render.thread)
{
EnterCriticalSection(&g_ddraw.cs);
g_ddraw.render.run = FALSE;
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
LeaveCriticalSection(&g_ddraw.cs);
EnterCriticalSection(&g_ddraw->cs);
g_ddraw->render.run = FALSE;
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
LeaveCriticalSection(&g_ddraw->cs);
WaitForSingleObject(g_ddraw.render.thread, INFINITE);
g_ddraw.render.thread = NULL;
WaitForSingleObject(g_ddraw->render.thread, INFINITE);
g_ddraw->render.thread = NULL;
}
RECT clientrc = { 0 };
@ -353,24 +314,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
real_GetWindowLongA(hWnd, GWL_EXSTYLE)) &&
SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top))
{
double scale_h;
double scale_w;
if (g_config.aspect_ratio[0])
{
char* e = &g_config.aspect_ratio[0];
DWORD cx = strtoul(e, &e, 0);
DWORD cy = strtoul(e + 1, &e, 0);
scale_h = (double)cy / cx;
scale_w = (double)cx / cy;
}
else
{
scale_h = (double)g_ddraw.height / g_ddraw.width;
scale_w = (double)g_ddraw.width / g_ddraw.height;
}
float scaleH = (float)g_ddraw->height / g_ddraw->width;
float scaleW = (float)g_ddraw->width / g_ddraw->height;
switch (wParam)
{
@ -379,19 +324,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
case WMSZ_LEFT:
case WMSZ_RIGHT:
{
windowrc->bottom += (LONG)round(scale_h * clientrc.right - clientrc.bottom);
windowrc->bottom += (LONG)(scaleH * clientrc.right - clientrc.bottom);
break;
}
case WMSZ_TOP:
case WMSZ_BOTTOM:
{
windowrc->right += (LONG)round(scale_w * clientrc.bottom - clientrc.right);
windowrc->right += (LONG)(scaleW * clientrc.bottom - clientrc.right);
break;
}
case WMSZ_TOPRIGHT:
case WMSZ_TOPLEFT:
{
windowrc->top -= (LONG)round(scale_h * clientrc.right - clientrc.bottom);
windowrc->top -= (LONG)(scaleH * clientrc.right - clientrc.bottom);
break;
}
}
@ -406,7 +351,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
real_GetWindowLongA(hWnd, GWL_EXSTYLE)) &&
SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top))
{
if (clientrc.right < g_ddraw.width)
if (clientrc.right < g_ddraw->width)
{
switch (wParam)
{
@ -416,20 +361,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
case WMSZ_BOTTOM:
case WMSZ_TOP:
{
windowrc->right += g_ddraw.width - clientrc.right;
windowrc->right += g_ddraw->width - clientrc.right;
break;
}
case WMSZ_TOPLEFT:
case WMSZ_BOTTOMLEFT:
case WMSZ_LEFT:
{
windowrc->left -= g_ddraw.width - clientrc.right;
windowrc->left -= g_ddraw->width - clientrc.right;
break;
}
}
}
if (clientrc.bottom < g_ddraw.height)
if (clientrc.bottom < g_ddraw->height)
{
switch (wParam)
{
@ -439,14 +384,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
case WMSZ_RIGHT:
case WMSZ_LEFT:
{
windowrc->bottom += g_ddraw.height - clientrc.bottom;
windowrc->bottom += g_ddraw->height - clientrc.bottom;
break;
}
case WMSZ_TOPLEFT:
case WMSZ_TOPRIGHT:
case WMSZ_TOP:
{
windowrc->top -= g_ddraw.height - clientrc.bottom;
windowrc->top -= g_ddraw->height - clientrc.bottom;
break;
}
}
@ -476,81 +421,32 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
{
if (g_config.windowed)
{
WORD width = LOWORD(lParam);
WORD height = HIWORD(lParam);
if (wParam == SIZE_RESTORED)
{
/* macOS maximize hack */
if (in_size_move && g_ddraw.render.thread && IsMacOS())
if (in_size_move && !g_ddraw->render.thread)
{
EnterCriticalSection(&g_ddraw.cs);
g_ddraw.render.run = FALSE;
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
LeaveCriticalSection(&g_ddraw.cs);
WaitForSingleObject(g_ddraw.render.thread, INFINITE);
g_ddraw.render.thread = NULL;
g_config.window_rect.right = LOWORD(lParam);
g_config.window_rect.bottom = HIWORD(lParam);
}
if (in_size_move && !g_ddraw.render.thread)
/*
else if (g_ddraw->wine)
{
g_config.window_rect.right = width;
g_config.window_rect.bottom = height;
}
else if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && IsLinux())
{
if (width != g_ddraw.render.width || height != g_ddraw.render.height)
{
KillTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE);
g_config.window_rect.right = width;
g_config.window_rect.bottom = height;
dd_SetDisplayMode(0, 0, 0, 0);
if (width < g_ddraw.width || height < g_ddraw.height)
{
/* Can't enforce minimum window size in linux because there is no WM_SIZING and
WM_GETMINMAXINFO is ignored for whatever reasons */
SetTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE, 1000, (TIMERPROC)NULL);
}
}
}
}
else if (wParam == SIZE_MAXIMIZED)
{
if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && IsLinux())
{
if (width != g_ddraw.render.width || height != g_ddraw.render.height)
{
KillTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE);
g_config.window_rect.right = width;
g_config.window_rect.bottom = height;
dd_SetDisplayMode(0, 0, 0, 0);
if (width < g_ddraw.width || height < g_ddraw.height)
{
/* Can't enforce minimum window size in linux because there is no WM_SIZING and
WM_GETMINMAXINFO is ignored for whatever reasons */
SetTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE, 1000, (TIMERPROC)NULL);
}
}
WindowRect.right = LOWORD(lParam);
WindowRect.bottom = HIWORD(lParam);
if (WindowRect.right != g_ddraw->render.width || WindowRect.bottom != g_ddraw->render.height)
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp);
}
*/
}
}
if (g_ddraw.got_child_windows)
if (g_ddraw->got_child_windows)
{
redraw_count = 2;
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
}
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */
return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */
}
case WM_MOVE:
{
@ -564,7 +460,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
util_update_bnet_pos(x, y);
}
if (in_size_move || (IsLinux() && !g_config.fullscreen && g_ddraw.render.thread))
if (in_size_move || (g_ddraw->wine && !g_config.fullscreen && g_ddraw->render.thread))
{
if (x != -32000)
g_config.window_rect.left = x; /* -32000 = Exit/Minimize */
@ -574,42 +470,38 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
}
}
if (g_ddraw.got_child_windows)
if (g_ddraw->got_child_windows)
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */
return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */
}
case WM_RESTORE_STYLE:
case WM_NCMOUSELEAVE:
{
if (!IsWine()) /* hack: disable aero snap */
if (!g_ddraw->wine) /* hack: disable aero snap */
{
LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE);
LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE);
if (!(style & WS_MAXIMIZEBOX))
{
real_SetWindowLongA(g_ddraw.hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX);
real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX);
}
}
return 0;
break;
}
case WM_SYSCOMMAND:
{
if ((wParam & ~0x0F) == SC_MOVE && !IsWine()) /* hack: disable aero snap */
if ((wParam & ~0x0F) == SC_MOVE && !g_ddraw->wine) /* hack: disable aero snap */
{
LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE);
LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE);
if ((style & WS_MAXIMIZEBOX))
{
real_SetWindowLongA(g_ddraw.hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX);
PostMessageA(g_ddraw.hwnd, WM_RESTORE_STYLE, 0, 0);
real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX);
}
}
if (wParam == SC_MAXIMIZE)
{
if (IsWine())
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam);
if (g_config.resizable)
{
util_toggle_maximize();
@ -620,18 +512,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
if (wParam == SC_CLOSE && !GameHandlesClose)
{
if (g_config.terminate_process)
g_config.terminate_process = 2;
ExitProcess(0);
//_exit(0);
exit(0);
}
if (wParam == SC_KEYMENU && GetMenu(g_ddraw.hwnd) == NULL)
if (wParam == SC_KEYMENU && GetMenu(g_ddraw->hwnd) == NULL)
return 0;
if (!GameHandlesClose)
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam);
return DefWindowProc(hWnd, uMsg, wParam, lParam);
break;
}
@ -653,7 +541,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
{
mouse_unlock();
if (real_GetForegroundWindow() == g_ddraw.hwnd)
if (real_GetForegroundWindow() == g_ddraw->hwnd)
mouse_lock();
}
}
@ -666,64 +554,16 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
}
case WM_ACTIVATE:
{
if (LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE)
if (wParam == WA_ACTIVE || wParam == WA_CLICKACTIVE)
{
if (g_ddraw.got_child_windows)
if (g_ddraw->got_child_windows)
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
}
if (LOWORD(wParam) == WA_INACTIVE)
{
if (g_config.windowed && !g_config.fullscreen && lParam && GetParent((HWND)lParam) == hWnd)
{
char class_name[MAX_PATH] = { 0 };
GetClassNameA((HWND)lParam, class_name, sizeof(class_name) - 1);
if (strcmp(class_name, "#32770") == 0) // dialog box
{
mouse_unlock();
/*
// Center to main window
RECT rc_main = { 0 };
RECT rc_dialog = { 0 };
RECT rc = { 0 };
real_GetWindowRect(hWnd, &rc_main);
real_GetWindowRect((HWND)lParam, &rc_dialog);
CopyRect(&rc, &rc_main);
OffsetRect(&rc_dialog, -rc_dialog.left, -rc_dialog.top);
OffsetRect(&rc, -rc.left, -rc.top);
OffsetRect(&rc, -rc_dialog.right, -rc_dialog.bottom);
real_SetWindowPos(
(HWND)lParam,
HWND_TOP,
rc_main.left + (rc.right / 2),
rc_main.top + (rc.bottom / 2),
0, 0,
SWP_NOSIZE);
*/
}
}
}
if (g_config.windowed || g_config.noactivateapp)
{
/* let it pass through once (Atrox) */
static BOOL one_time;
if (!one_time)
{
one_time = TRUE;
if (LOWORD(wParam))
break;
}
//if (g_ddraw->windowed || g_ddraw->noactivateapp)
if (!g_config.allow_wmactivate)
return 0;
}
break;
}
@ -733,19 +573,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
{
if (!g_config.windowed)
{
if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive)
if (g_ddraw->renderer != d3d9_render_main || g_config.nonexclusive)
{
ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN);
real_ShowWindow(g_ddraw.hwnd, SW_RESTORE);
ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN);
real_ShowWindow(g_ddraw->hwnd, SW_RESTORE);
mouse_lock();
}
}
else if (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd)
else if (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw->hwnd)
{
mouse_lock();
}
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
}
else
{
@ -754,20 +594,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
mouse_unlock();
if (IsWine() && g_ddraw.last_set_window_pos_tick + 500 > timeGetTime())
if (g_ddraw->wine && g_ddraw->last_set_window_pos_tick + 500 > timeGetTime())
return 0;
if (!g_config.windowed)
{
if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive)
if (g_ddraw->renderer != d3d9_render_main || g_config.nonexclusive)
{
real_ShowWindow(g_ddraw.hwnd, SW_MINIMIZE);
ChangeDisplaySettings(NULL, g_ddraw.bnet_active ? CDS_FULLSCREEN : 0);
real_ShowWindow(g_ddraw->hwnd, SW_MINIMIZE);
ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0);
}
}
}
if (wParam && g_config.fix_alt_key_stuck)
if (wParam && g_config.releasealt)
{
INPUT ip;
memset(&ip, 0, sizeof(ip));
@ -788,22 +628,17 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
if (g_config.windowed || g_config.noactivateapp)
{
/* let it pass through once (tiberian sun / ClueFinders) */
/* let it pass through once (tiberian sun) */
static BOOL one_time;
if (!one_time)
if (wParam && !one_time && g_config.tshack)
{
one_time = TRUE;
if (wParam)
break;
break;
}
if (wParam && g_ddraw.alt_key_down && !g_config.fix_alt_key_stuck)
{
PostMessageA(g_ddraw.hwnd, WM_SYSKEYUP, VK_MENU, 0);
g_ddraw.alt_key_down = FALSE;
}
if (wParam && g_ddraw->alt_key_down && !g_config.releasealt)
PostMessageA(g_ddraw->hwnd, WM_SYSKEYUP, VK_MENU, 0);
return 0;
}
@ -812,37 +647,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
case WM_AUTORENDERER:
{
mouse_unlock();
real_SetWindowPos(g_ddraw.hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
real_SetWindowPos(g_ddraw.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
real_SetWindowPos(g_ddraw->hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
real_SetWindowPos(g_ddraw->hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
mouse_lock();
return 0;
}
case WM_TOGGLE_FULLSCREEN:
{
if (!g_config.fullscreen || g_config.toggle_upscaled || (g_config.windowed && g_config.toggle_borderless))
{
/* Check if we are fullscreen/borderless already */
if (wParam == CNC_DDRAW_SET_FULLSCREEN && (!g_config.windowed || g_config.fullscreen))
return 0;
/* Check if we are windowed already */
if (wParam == CNC_DDRAW_SET_WINDOWED && g_config.windowed && !g_config.fullscreen)
return 0;
util_toggle_fullscreen();
}
return 0;
}
case WM_TOGGLE_MAXIMIZE:
{
if (g_config.resizable)
{
util_toggle_maximize();
}
return 0;
}
case WM_NCLBUTTONDBLCLK:
{
if (g_config.resizable)
@ -854,28 +663,93 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
}
case WM_SYSKEYDOWN:
{
if (wParam == VK_F4)
BOOL context_code = (lParam & (1 << 29)) != 0;
BOOL key_state = (lParam & (1 << 30)) != 0;
if (g_config.hotkeys.toggle_fullscreen &&
wParam == g_config.hotkeys.toggle_fullscreen &&
(!g_config.fullscreen || (g_config.windowed && g_config.toggle_borderless)) &&
context_code &&
!key_state)
{
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam);
util_toggle_fullscreen();
return 0;
}
if (g_config.hotkeys.toggle_maximize &&
wParam == g_config.hotkeys.toggle_maximize &&
g_config.resizable &&
g_config.windowed &&
!g_config.fullscreen)
{
util_toggle_maximize();
return 0;
}
if (wParam == VK_MENU)
{
g_ddraw->alt_key_down = TRUE;
}
break;
}
case WM_SYSKEYUP:
{
if (wParam == VK_TAB || (wParam && wParam == g_config.hotkeys.toggle_fullscreen))
if (wParam == VK_MENU)
{
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam);
g_ddraw->alt_key_down = FALSE;
}
if (wParam == VK_TAB || (g_config.hotkeys.toggle_fullscreen && wParam == g_config.hotkeys.toggle_fullscreen))
{
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
break;
}
case WM_KEYDOWN:
{
if (g_config.hotkeys.unlock_cursor1 &&
(wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1))
{
if (GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000)
{
mouse_unlock();
return 0;
}
}
if (g_config.hotkeys.unlock_cursor2 &&
(wParam == g_config.hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL))
{
if ((GetAsyncKeyState(VK_RMENU) & 0x8000) && GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000)
{
mouse_unlock();
return 0;
}
}
HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0);
if (video_hwnd)
{
PostMessageA(video_hwnd, uMsg, wParam, lParam);
return 0;
}
break;
}
case WM_KEYUP:
{
if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot)
ss_take_screenshot(g_ddraw->primary);
HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0);
if (video_hwnd)
{
PostMessageA(video_hwnd, uMsg, wParam, lParam);
return 0;
}
break;
}
/* button up messages reactivate cursor lock */
@ -888,25 +762,22 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam);
if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width ||
x < g_ddraw.render.viewport.x ||
y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height ||
y < g_ddraw.render.viewport.y)
if (x > g_ddraw->render.viewport.x + g_ddraw->render.viewport.width ||
x < g_ddraw->render.viewport.x ||
y > g_ddraw->render.viewport.y + g_ddraw->render.viewport.height ||
y < g_ddraw->render.viewport.y)
{
x = g_ddraw.width / 2;
y = g_ddraw.height / 2;
x = g_ddraw->width / 2;
y = g_ddraw->height / 2;
}
else
{
x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x);
y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y);
x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->mouse.unscale_x);
y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->mouse.unscale_y);
}
x = min(x, g_ddraw.width - 1);
y = min(y, g_ddraw.height - 1);
InterlockedExchange((LONG*)&g_ddraw.cursor.x, x);
InterlockedExchange((LONG*)&g_ddraw.cursor.y, y);
InterlockedExchange((LONG*)&g_ddraw->cursor.x, x);
InterlockedExchange((LONG*)&g_ddraw->cursor.y, y);
mouse_lock();
return 0;
@ -932,15 +803,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
return 0;
}
if (uMsg == WM_MOUSEWHEEL)
{
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
real_ScreenToClient(g_ddraw.hwnd, &pt);
lParam = MAKELPARAM(pt.x, pt.y);
}
int x = max(GET_X_LPARAM(lParam) - g_ddraw.mouse.x_adjust, 0);
int y = max(GET_Y_LPARAM(lParam) - g_ddraw.mouse.y_adjust, 0);
int x = max(GET_X_LPARAM(lParam) - g_ddraw->mouse.x_adjust, 0);
int y = max(GET_Y_LPARAM(lParam) - g_ddraw->mouse.y_adjust, 0);
if (g_config.adjmouse)
{
@ -954,19 +818,26 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
}
else
{
x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x));
y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y));
x = (DWORD)(roundf(x * g_ddraw->mouse.unscale_x));
y = (DWORD)(roundf(y * g_ddraw->mouse.unscale_y));
}
}
x = min(x, g_ddraw.width - 1);
y = min(y, g_ddraw.height - 1);
x = min(x, g_ddraw->width - 1);
y = min(y, g_ddraw->height - 1);
InterlockedExchange((LONG*)&g_ddraw.cursor.x, x);
InterlockedExchange((LONG*)&g_ddraw.cursor.y, y);
InterlockedExchange((LONG*)&g_ddraw->cursor.x, x);
InterlockedExchange((LONG*)&g_ddraw->cursor.y, y);
lParam = MAKELPARAM(x, y);
HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0);
if (video_hwnd)
{
PostMessageA(video_hwnd, uMsg, wParam, lParam);
return 0;
}
break;
}
case WM_PARENTNOTIFY:
@ -983,28 +854,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
{
if (!g_config.devmode && !g_mouse_locked)
{
int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam);
int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw->render.viewport.x) * g_ddraw->mouse.unscale_x);
int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw->render.viewport.y) * g_ddraw->mouse.unscale_y);
if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width ||
x < g_ddraw.render.viewport.x ||
y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height ||
y < g_ddraw.render.viewport.y)
{
x = g_ddraw.width / 2;
y = g_ddraw.height / 2;
}
else
{
x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x);
y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y);
}
x = min(x, g_ddraw.width - 1);
y = min(y, g_ddraw.height - 1);
InterlockedExchange((LONG*)&g_ddraw.cursor.x, x);
InterlockedExchange((LONG*)&g_ddraw.cursor.y, y);
InterlockedExchange((LONG*)&g_ddraw->cursor.x, x);
InterlockedExchange((LONG*)&g_ddraw->cursor.y, y);
mouse_lock();
}
@ -1021,23 +875,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
}
if (g_ddraw.primary)
{
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
}
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
break;
}
case WM_ERASEBKGND:
{
if (g_ddraw.primary && (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0))
if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0)
{
InterlockedExchange(&g_ddraw.render.clear_screen, TRUE);
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
InterlockedExchange(&g_ddraw->render.clear_screen, TRUE);
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
}
break;
}
}
return CallWindowProcA(g_ddraw.wndproc, hWnd, uMsg, wParam, lParam);
return CallWindowProcA(g_ddraw->wndproc, hWnd, uMsg, wParam, lParam);
}