Compare commits

..

9 commits

Author SHA1 Message Date
FunkyFr3sh
798c281453 only create opengl core context once 2024-08-03 08:23:03 +02:00
FunkyFr3sh
bb08a08af0 adjust preset 2024-07-28 04:39:22 +02:00
FunkyFr3sh
5919c0e150 fix ValidateRect hook 2024-07-27 09:52:08 +02:00
FunkyFr3sh
889cfd92fa hook ValidateRect and InvalidateRect 2024-07-27 09:42:18 +02:00
FunkyFr3sh
ec0dbeca6b add workaround for flickering (black frames) during zoom 2024-07-26 08:29:43 +02:00
FunkyFr3sh
918037dd3e fix jumping cursor while zooming 2024-07-26 08:27:42 +02:00
FunkyFr3sh
fa14a8b60a fix downscaling with GDI renderer 2024-07-26 08:26:08 +02:00
FunkyFr3sh
72549b9610 disable some hooks to avoid conflicts with voobly patches 2024-07-26 08:25:36 +02:00
FunkyFr3sh
8b4f94dcd8 reduce delay for new zoom feature 2024-07-26 08:24:49 +02:00
69 changed files with 911 additions and 4873 deletions

View file

@ -4,6 +4,7 @@ on:
push: push:
branches: branches:
- 'master' - 'master'
- 'develop'
- 'github-action' - 'github-action'
jobs: jobs:
@ -68,8 +69,6 @@ jobs:
- name: Prepare artifact - name: Prepare artifact
run: | run: |
: :
mkdir -p cnc-ddraw-experimental
if [[ -f "${{ steps.build-release.outputs.release }}" ]]; then if [[ -f "${{ steps.build-release.outputs.release }}" ]]; then
mkdir -p cnc-ddraw-release mkdir -p cnc-ddraw-release
@ -81,11 +80,6 @@ jobs:
mkdir -p cnc-ddraw-releasexp mkdir -p cnc-ddraw-releasexp
cp "${{ steps.build-releasexp.outputs.releasexp }}" 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 fi
if [[ -f "${{ steps.build-debug.outputs.debug }}" ]]; then if [[ -f "${{ steps.build-debug.outputs.debug }}" ]]; then
@ -100,8 +94,6 @@ jobs:
cp "${{ steps.build-debuglogxp.outputs.debuglogxp }}" cnc-ddraw-debuglogxp cp "${{ steps.build-debuglogxp.outputs.debuglogxp }}" cnc-ddraw-debuglogxp
cp "${{ steps.build-debuglogxp.outputs.debuglogxp-pdb }}" 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 fi
if [[ -f "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" ]]; then if [[ -f "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" ]]; then
@ -118,37 +110,32 @@ jobs:
with: with:
name: cnc-ddraw-release name: cnc-ddraw-release
path: cnc-ddraw-release path: cnc-ddraw-release
retention-days: 14
- name: Upload artifacts cnc-ddraw-releasexp - name: Upload artifacts cnc-ddraw-releasexp
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: cnc-ddraw-releasexp name: cnc-ddraw-releasexp
path: cnc-ddraw-releasexp path: cnc-ddraw-releasexp
retention-days: 14
- name: Upload artifacts cnc-ddraw-debug - name: Upload artifacts cnc-ddraw-debug
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: cnc-ddraw-debug name: cnc-ddraw-debug
path: cnc-ddraw-debug path: cnc-ddraw-debug
retention-days: 14
- name: Upload artifacts cnc-ddraw-debuglogxp - name: Upload artifacts cnc-ddraw-debuglogxp
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: cnc-ddraw-debuglogxp name: cnc-ddraw-debuglogxp
path: cnc-ddraw-debuglogxp path: cnc-ddraw-debuglogxp
retention-days: 14
- name: Upload artifacts cnc-ddraw-debuglogminixp - name: Upload artifacts cnc-ddraw-debuglogminixp
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: cnc-ddraw-debuglogminixp name: cnc-ddraw-debuglogminixp
path: cnc-ddraw-debuglogminixp path: cnc-ddraw-debuglogminixp
retention-days: 14
- 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 # C++ Builder
__astcache/ __astcache/

View file

@ -1,48 +1,28 @@
-include config.mk -include config.mk
TARGET ?= ddraw.dll TARGET = ddraw.dll
LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared
CFLAGS = -Iinc -O2 -march=i486 -Wall
LIBS = -lgdi32 -lwinmm -ldbghelp -lole32
LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared CC = i686-w64-mingw32-gcc
CFLAGS ?= -Iinc -O2 -Wall -std=c99 WINDRES ?= i686-w64-mingw32-windres
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 ifdef DEBUG
CFLAGS += -D _DEBUG -D _DEBUG_X CFLAGS += -D _DEBUG -D _DEBUG_X
endif endif
ifdef _WIN32_WINNT SRCS := $(wildcard src/*.c) $(wildcard src/*/*.c)
CFLAGS += -march=i486 -D _WIN32_WINNT=$(_WIN32_WINNT) OBJS := $(SRCS:c=o) res.o
endif
CC = i686-w64-mingw32-gcc
WINDRES ?= i686-w64-mingw32-windres
SRCS := $(wildcard src/*.c) $(wildcard src/*/*.c) res.rc
OBJS := $(addsuffix .o, $(basename $(SRCS)))
.PHONY: clean all .PHONY: clean all
all: $(TARGET) all: $(TARGET)
%.o: %.rc %.o: %.rc
$(WINDRES) -J rc $< $@ || windres -J rc $< $@ $(WINDRES) -J rc $< $@
$(TARGET): $(OBJS) $(TARGET): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ exports.def $(LIBS) $(CC) $(LDFLAGS) -o $@ $^ exports.def $(LIBS)
clean: clean:
$(RM) $(TARGET) $(OBJS) || del $(TARGET) $(subst /,\\,$(OBJS)) $(RM) $(TARGET) $(OBJS)

186
README.md
View file

@ -1,11 +1,11 @@
# cnc-ddraw # 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 2D games, such as black screen, bad performance, crashes or defective Alt+Tab.
&nbsp; &nbsp;
### Features ### 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/Android) and Virtual Machines
- GDI / OpenGL / Direct3D 9 renderer (With automatic renderer selection) - GDI / OpenGL / Direct3D 9 renderer (With automatic renderer selection)
- Upscaling via glsl shaders - https://imgur.com/a/kxsM1oY | https://imgur.com/a/wjrhpFV - Upscaling via glsl shaders - https://imgur.com/a/kxsM1oY | https://imgur.com/a/wjrhpFV
- Windowed Mode / Fullscreen Exclusive Mode / Borderless Mode - Windowed Mode / Fullscreen Exclusive Mode / Borderless Mode
@ -24,16 +24,31 @@ 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 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 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/Android) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) manually or run cnc-ddraw config.exe once.
&nbsp; &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 &nbsp;
- **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) **If the game starts but it doesn't work perfectly** then open the config program and check the **Compatibility settings**.
- 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;
**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;
Need help and don't have a github account? Ask your questions on [Discord](https://discord.gg/afWXJNDDF5) (No registration required)
&nbsp; &nbsp;
@ -46,10 +61,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
&nbsp; &nbsp;
### Supported Games ### Supported Games
- 101: The Airborne Invasion of Normandy
- 7th Legion
- Abomination - The Nemesis Project
- Addiction Pinball
- Age of Empires - Age of Empires
- Age of Empires II - Age of Empires II
- Age of Empires II: The Conquerors - Age of Empires II: The Conquerors
@ -57,24 +68,14 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
- Age of Wonders - Age of Wonders
- Age of Wonders 2 - Age of Wonders 2
- Age of Wonders: Shadow Magic - Age of Wonders: Shadow Magic
- Agharta the Hollow Earth
- Airline 69: Return to Casablanca
- Airline Tycoon Deluxe - Airline Tycoon Deluxe
- Alien Nations - Alien Nations
- American Conquest (Steam+GOG) - American Conquest (Steam+GOG)
- American Girls Dress Designer - American Girls Dress Designer
- Amerzone - Amerzone
- Ancient Conquest
- Ancient Evil
- Anno 1602: Creation of a New World - Anno 1602: Creation of a New World
- Another War
- Anstoss 3 - Anstoss 3
- Arcanum: Of Steamworks and Magick Obscura - 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 Pet Chase
- Arthur's Sand Castle Contest - Arthur's Sand Castle Contest
- Arthur's Wilderness Rescue - Arthur's Wilderness Rescue
@ -86,31 +87,23 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
- Baldr Force EXE - Baldr Force EXE
- Baldur's Gate - Baldur's Gate
- Baldur's Gate 2 - Baldur's Gate 2
- Balls of Steel v1.2
- Barbie(R) Photo Designer
- Barbie(tm) Beach Vacation(tm) - Barbie(tm) Beach Vacation(tm)
- Barbie(R) Photo Designer
- Batman: Justice Unbalanced - Batman: Justice Unbalanced
- Batman: Toxic Chill - Batman: Toxic Chill
- Bejeweled 2 Deluxe
- Birthright: The Gorgons Alliance
- Blade & Sword - Blade & Sword
- Blood II - The Chosen - Blood II - The Chosen
- Blue's 123 Time Activities - Blue's 123 Time Activities
- Blue's Treasure Hunt - Blue's Treasure Hunt
- Broken Sword
- Broken Sword 2: The Smoking Mirror
- Caesar III (Sierra - 1998) - Caesar III (Sierra - 1998)
- Call To Power 2 - Call To Power 2
- Callus 95 - CPS-1 (Capcom Play System 1) emulator
- Capitalism II - Capitalism II
- Capitalism Lab - Capitalism Lab
- Captain Claw - Captain Claw
- Carmageddon - Carmageddon
- Carmageddon 2 - Carmageddon 2
- Casino Empire (AKA Hoyle Casino) - Casino Empire (AKA Hoyle Casino)
- Championship Manager 99-00
- Chaos Gate - Chaos Gate
- Clans
- Close Combat 2: A Bridge Too Far - Close Combat 2: A Bridge Too Far
- Close Combat 3: The Russian Front - Close Combat 3: The Russian Front
- Close Combat 4: The Battle of the Bulge - Close Combat 4: The Battle of the Bulge
@ -134,41 +127,24 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
- Commandos - Commandos
- Commandos - Beyond The Call Of Duty - Commandos - Beyond The Call Of Duty
- Commandos 2 - Commandos 2
- Commando 2004 (only with /ddraw command line parameter)
- Constructor
- Corsairs Gold - Corsairs Gold
- Cossacks (Steam+GOG) - Cossacks (Steam+GOG)
- Cultures - The Discovery of Vinland - Cultures - The Discovery of Vinland
- Cultures 2 - Cultures 2
- Cyber Gladiators (needs CyberGladiators_Patch_Win_EN_WinXP.zip)
- Cyberchase Carnival Chaos - Cyberchase Carnival Chaos
- Cyberchase Castleblanca Quest - 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 Reign: The Future of War
- Dark Secret of Africa
- Day Of The Tentacle
- Daytona
- Daytona USA (Sega - 1996) - Daytona USA (Sega - 1996)
- Deadlock 2 - Deadlock 2
- Deadly Tide
- Delta Force
- Desperados: Wanted Dead or Alive - Desperados: Wanted Dead or Alive
- Diablo - Diablo
- Diablo 2 - Diablo 2
- Diablo 2: Lord of Destruction - Diablo 2: Lord of Destruction
- Diablo: Hellfire - Diablo: Hellfire
- Die by the Sword
- Disciples - Disciples
- Disciples 2 - Rise of the Elves - Disciples 2 - Rise of the Elves
- Discoworld Noir
- Divine Divinity - Divine Divinity
- Dominion - Storm Over Gift 3
- Doom 95
- Dracula
- Dragon Throne: Battle of Red Cliffs - Dragon Throne: Battle of Red Cliffs
- Dreams to Realty
- DuelSavior - DuelSavior
- DuelSavior: Justice - DuelSavior: Justice
- Dune 2000 - Dune 2000
@ -179,19 +155,13 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
- Emperor: Rise of the Middle Kingdom - Emperor: Rise of the Middle Kingdom
- Enemy Infestation - Enemy Infestation
- Escape Velocity Nova - Escape Velocity Nova
- Excalibur 2555AD
- F-16 Agressor
- F-16 Multirole Fighter - F-16 Multirole Fighter
- F-22 Raptor - F-22 Raptor
- Fable
- Fairy Tale About Father Frost, Ivan and Nastya - Fairy Tale About Father Frost, Ivan and Nastya
- Falcon 4.0 (Microprose version)
- Fallout - Fallout
- Fallout 2 - Fallout 2
- Fallout Tactics: Brotherhood of Steel
- Final fantasy VII - Final fantasy VII
- Final fantasy VIII - Final fantasy VIII
- Final Liberation: Warhammer Epic 40000 (GOG)
- Freddi Fish - Freddi Fish
- Freddi Fish 4 - Freddi Fish 4
- Freddi Fish's One-Stop Fun Shop - Freddi Fish's One-Stop Fun Shop
@ -200,41 +170,24 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
- Freddi Fish: The Case of the Haunted Schoolhouse - Freddi Fish: The Case of the Haunted Schoolhouse
- Freddi Fish: The Case of the Hogfish Rustlers of Briny Gulch - Freddi Fish: The Case of the Hogfish Rustlers of Briny Gulch
- Freddi Water Worries - Freddi Water Worries
- Full Throttle
- Future Cop L.A.P.D - Future Cop L.A.P.D
- G-Police - G-Police
- Gateway (Remake)
- Geneforge
- Gilbert Goodmate And The Mushroom Of Phungoria
- Gorasul: The Legacy of the Dragon
- Grand Theft Auto - Grand Theft Auto
- Grand Theft Auto: London 1961 - Grand Theft Auto: London 1961
- Grand Theft Auto: London 1969 - Grand Theft Auto: London 1969
- Gromada Revenge
- Gruntz - Gruntz
- Gorasul: The Legacy of the Dragon
- Hamtaro: Wake Up Snoozer! - Hamtaro: Wake Up Snoozer!
- Handkerchief
- Hard Truck: Road to Victory - Hard Truck: Road to Victory
- Heart of Darkness
- Hearts of Iron 2 - 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 II
- Heroes of Might and Magic III - Heroes of Might and Magic III
- Heroes of Might and Magic IV - Heroes of Might and Magic IV
- Hexen 95
- Hooligans: Storm over Europe - Hooligans: Storm over Europe
- Hugo Gold - Hugo Gold
- Hugo Wild River - Hugo Wild River
- Icewind Dale - Icewind Dale
- Icewind Dale 2 - 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 - Infantry Online
- Interstate 76 - Interstate 76
- Invictus: In the Shadow of Olympus - Invictus: In the Shadow of Olympus
@ -242,8 +195,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
- Jagged Alliance 2: Unfinished Business - Jagged Alliance 2: Unfinished Business
- Jagged Alliance 2: Wildfire - Jagged Alliance 2: Wildfire
- Jazz Jackrabbit 2 - Jazz Jackrabbit 2
- Jeff Wayne's The War of the Worlds
- Karma Immortal Wrath
- Killing Time - Killing Time
- Kings Quest 8: Mask of Eternity - Kings Quest 8: Mask of Eternity
- KKND Xtreme - KKND Xtreme
@ -253,10 +204,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
- Kohan: Immortal Sovereigns - Kohan: Immortal Sovereigns
- Konung - Konung
- Konung 2 - 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 - Lionheart - Legacy of the Crusader
- Little Bear Kindergarten Thinking Adventures - Little Bear Kindergarten Thinking Adventures
- Little Bear Preschool Thinking Adventures - Little Bear Preschool Thinking Adventures
@ -264,27 +211,17 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
- Little Bear Toddler Discovery Adventures - Little Bear Toddler Discovery Adventures
- Locomotion - Locomotion
- Lode Runner 2 - Lode Runner 2
- Lost Vikings 2
- M.A.X. 2 Mechanized Assault & Exploration
- Madeline 1st Grade Math - Madeline 1st Grade Math
- Madeline 2nd Grade Math - Madeline 2nd Grade Math
- Mageslayer
- Majesty Gold - Majesty Gold
- Majesty Gold HD - Majesty Gold HD
- Mario Sorb 3 - M.A.X. 2 Mechanized Assault & Exploration
- Meat Puppet
- Mech Warrior 3 - Mech Warrior 3
- Megaman X4 - Megaman X4
- Metal Gear Solid - Metal Gear Solid
- Metal Knight
- Mob Rule (AKA Constructor: Street Wars / Street Wars: Constructor Underworld)
- Moorhuhn - Moorhuhn
- Moorhuhn 2 - Moorhuhn 2
- Moorhuhn Adventure: Fluch des Goldes
- Moorhuhn Adventure: Schatz des Pharao and Fluch des Goldes)
- Moorhuhn Winter Editon - Moorhuhn Winter Editon
- MiG-29 Fulcrum
- Mission Deliver Kindness
- Moto Racer - Moto Racer
- Moto Racer 2 - Moto Racer 2
- Nancy Drew: Danger on Deception Island - Nancy Drew: Danger on Deception Island
@ -294,37 +231,27 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
- Nancy Drew: Stay Tuned For Danger - Nancy Drew: Stay Tuned For Danger
- Nancy Drew: The Secret of Shadow Ranch - Nancy Drew: The Secret of Shadow Ranch
- Nancy Drew: Treasure in the Royal Tower - Nancy Drew: Treasure in the Royal Tower
- NBA Action '98
- NBA Full Court Press
- Need For Speed III: Hot Pursuit - Need For Speed III: Hot Pursuit
- Need For Speed: High Stakes - Need For Speed: High Stakes
- Neo Sonic Universe
- New Robinson - New Robinson
- NexusTk - NexusTk
- Nightmare Creatures
- Ninja Jonder Deluxe
- Nox (Westwood - 2000) - Nox (Westwood - 2000)
- Oddworld: Abe's Exoddus - Oddworld: Abe's Exoddus
- Oddworld: Abe's Oddysee - Oddworld: Abe's Oddysee
- Original War
- Outlaws - Outlaws
- Outlive - Outlive
- Outwars (software mode)
- Pacific General - Pacific General
- Pajama Sam - Pajama Sam
- Pajama Sam 3 - 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 Games to Play on Any Day
- Pajama Sam's One-Stop Fun Shop - Pajama Sam's One-Stop Fun Shop
- Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm) - Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm)
- Pajama Sam: No Need to Hide When It's Dark Outside - Pajama Sam: No Need to Hide When It's Dark Outside
- Pandora's Box Puzzle Game - Pajama Sam 3: You Are What You Eat From Your Head To Your Feet
- Panzer Dragoon
- Patrician 3 - Patrician 3
- Pax Imperia - Pax Imperia
- Pharaoh (Sierra - 1999) - Pharaoh (Sierra - 1999)
- Pizza Syndicate (AKA Fast Food Tycoon) - Pizza Syndicate (AKA Fast Food Tycoon)
- Platypus
- Populous: The Beginning - Populous: The Beginning
- Poseidon: Master of Atlantis - Poseidon: Master of Atlantis
- Pro Pinball - Big Race USA - Pro Pinball - Big Race USA
@ -337,7 +264,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
- Putt-Putt: Pep's Birthday Surprise - Putt-Putt: Pep's Birthday Surprise
- Putt-Putt: Travels Through Time - Putt-Putt: Travels Through Time
- Quest for Glory 5 - Quest for Glory 5
- Rage of Mages
- Rage of Mages 2 - Rage of Mages 2
- Railroad Tycoon II - Railroad Tycoon II
- Reader Rabbit 1st Grade - Reader Rabbit 1st Grade
@ -353,21 +279,15 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
- Reader Rabbit Thinking Ages 4-6 (US) - Reader Rabbit Thinking Ages 4-6 (US)
- Reader Rabbit Toddler - Reader Rabbit Toddler
- Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Reader Rabbit's(R) Math Ages 6 - 9 (2002)
- Real War
- Red Baron 3D - 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 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 UFO (Reksio i Ufo)
- Reksio and the Wizards (Reksio i Czarodzieje) - Reksio and the Wizards (Reksio i Czarodzieje)
- Rent-A-Hero - Reksio and the Time Machine (Reksio i Wehikuł Czasu)
- Resurrection - The Return of the Black Dragon (software mode) - Reksio and Captain Nemo (Reksio i Kapitan Nemo)
- Return to Krondor - Reksio and Kretes in Action (Reksio i Kretes w Akcji!)
- Rising Lands (patched)
- Road Rash - Road Rash
- Robin Hood - The Legend of Sherwood - Robin Hood - The Legend of Sherwood
- Roland Garros 98 (software mode)
- RollerCoaster Tycoon - RollerCoaster Tycoon
- Sanitarium - Sanitarium
- Scooby-Doo(TM), Case File #2 The Scary Stone Dragon - Scooby-Doo(TM), Case File #2 The Scary Stone Dragon
@ -377,39 +297,23 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
- Sega Touring Car - Sega Touring Car
- Septerra Core - Septerra Core
- Settlers 3 - Settlers 3
- Seven Kingdoms II
- Shadow Flare - Shadow Flare
- Shadow Watch - Shadow Watch
- Shogo - Mobile Armor Division - Shogo - Mobile Armor Division
- Silver (needs "SilverUK GeForce2 And Radeon Patch")
- Sim City 3000 - Sim City 3000
- Sim Copter - Sim Copter
- SimTunes
- Sim Theme Park (aka Theme Park World) - Sim Theme Park (aka Theme Park World)
- SimCoaster / Theme Park Inc - SimCoaster / Theme Park Inc
- Simon the Sorcerer 1/2 (windows 95 version)
- Sonic 3D Blast - Sonic 3D Blast
- Soldiers At War
- Space Rangers - Space Rangers
- Spec Ops - Ranger Assault (software mode)
- SpongeBob SquarePants: Typing - SpongeBob SquarePants: Typing
- SPY Fox : Some Assembly Required - SPY Fox : Some Assembly Required
- SPY Fox in Dry Cereal - SPY Fox in Dry Cereal
- SPY Fox: Hold the Mustard - SPY Fox: Hold the Mustard
- SPY Fox: Operation Ozone - 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 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
- Star Wars: Galactic Battlegrounds: Clone Campaigns - Star Wars: Galactic Battlegrounds: Clone Campaigns
- Star Wars: Pit Droids
- StarCraft - StarCraft
- StarCraft: Broodwars - StarCraft: Broodwars
- StarFlyers Alien Space Chase - StarFlyers Alien Space Chase
@ -422,68 +326,40 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine
- Stronghold Crusader HD - Stronghold Crusader HD
- Stronghold HD - Stronghold HD
- Sudden Strike 2 - 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 Missing on Lost Island
- The Neverhood
- The Next Worlds
- The Powerpuff Girls - Princess Snorebucks - The Powerpuff Girls - Princess Snorebucks
- The Powerpuff Girls(TM) Mojo Jojo's Clone Zone - The Powerpuff Girls(TM) Mojo Jojo's Clone Zone
- The Rocky Interactive Horror Show
- The Sex Files
- The X-Files DVD - The X-Files DVD
- Theme Hospital - Theme Hospital
- Three Kingdoms: Fate of the Dragon - Three Kingdoms: Fate of the Dragon
- Throne of Darkness - Throne of Darkness
- Thunder Brigade
- TianLong BaBu
- Tone Rebellion
- Total Annihilation - Total Annihilation
- Total Annihilation (Unofficial Beta Patch v3.9.02) - Total Annihilation (Unofficial Beta Patch v3.9.02)
- Total Annihilation: Kingdoms - Total Annihilation: Kingdoms
- Toy Story
- Tridonis
- Twisted Metal - Twisted Metal
- Twisted Metal 2 - Twisted Metal 2
- Tzar: The Burden of the Crown - Tzar: The Burden of the Crown
- Unreal
- Uprising 2: Lead and Destroy - Uprising 2: Lead and Destroy
- Uprising: Join or Die - Uprising: Join or Die
- Vermeer - Vermeer
- Virtua Cop
- Virtua Cop 2
- Virtua Fighter 2
- Virtua Fighter PC - Virtua Fighter PC
- Virtual Springfield
- Virtual On: Cyber Troopers
- WarGames
- War Wind - War Wind
- War Wind II - Human Onslaught - War Wind II - Human Onslaught
- Warcraft 2 - Warcraft 2
- WarCraft 2000: Nuclear Epidemic
- Warlords 3: Darklords Rising - Warlords 3: Darklords Rising
- Warlords Battlecry - Warlords Battlecry
- Warlords Battlecry 2 - Warlords Battlecry 2
- Warlords Battlecry 3 - Warlords Battlecry 3
- Weird War
- Wheel Of Fortune
- Wing Commander - The Kilrathi Saga
- Wizardry 8 - Wizardry 8
- Wizards and Warriors - Wizards and Warriors
- Worms 2 - Worms 2
- Worms Armageddon - Worms Armageddon
- Z & Z Expansion Kit
- Zeus: Master of Olympus - Zeus: Master of Olympus
- Zoombinis Island Odyssey - Zoombinis Island Odyssey
- Zoombinis Logical Journey - Zoombinis Logical Journey
- Zoombinis Mountain Rescue - Zoombinis Mountain Rescue
- Zork Nemesis
- Zuma Deluxe - 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. 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.

View file

@ -11,7 +11,7 @@
# uses: phobos2077/sfall@develop # uses: phobos2077/sfall@develop
# with: # with:
# release-xp: true # release-xp: true
# #
# - name: Copy sfall to mod directory # - name: Copy sfall to mod directory
# run: copy "${{ steps.sfall.outputs.release-xp }}" "my/mod/directory/ddraw.dll" # run: copy "${{ steps.sfall.outputs.release-xp }}" "my/mod/directory/ddraw.dll"
# #
@ -46,16 +46,10 @@ outputs:
release: release:
description: 'Full path to ddraw.dll built with Release configuration' description: 'Full path to ddraw.dll built with Release configuration'
value: ${{ steps.build-release.outputs.ddraw-dll }} 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: releasexp:
description: 'Full path to ddraw.dll built with ReleaseXP configuration' description: 'Full path to ddraw.dll built with ReleaseXP configuration'
value: ${{ steps.build-releasexp.outputs.ddraw-dll }} 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: debug:
description: 'Full path to ddraw.dll built with Debug configuration' description: 'Full path to ddraw.dll built with Debug configuration'
@ -125,7 +119,6 @@ runs:
"${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Release -p:Platform=x86 -p:PlatformToolset=v142 "${{ 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-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::" echo "::endgroup::"
fi fi
@ -144,7 +137,6 @@ runs:
"${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=ReleaseXP -p:Platform=x86 -p:PlatformToolset=v141_xp "${{ 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-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::" echo "::endgroup::"
fi fi

View file

@ -1,15 +1,9 @@
@echo off @echo off
REM
set GIT1=C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ REM patch environment config
set GIT2=C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ REM
set GIT3=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ set PATH=C:\w64devkit\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 clean
make _WIN32_WINNT=0x0400 make
REM make DEBUG=1
pause 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

@ -27,7 +27,6 @@
<ClCompile Include="src\crc32.c" /> <ClCompile Include="src\crc32.c" />
<ClCompile Include="src\ddclipper.c" /> <ClCompile Include="src\ddclipper.c" />
<ClCompile Include="src\debug.c" /> <ClCompile Include="src\debug.c" />
<ClCompile Include="src\delay_imports.c" />
<ClCompile Include="src\detours\creatwth.cpp" /> <ClCompile Include="src\detours\creatwth.cpp" />
<ClCompile Include="src\detours\detours.cpp" /> <ClCompile Include="src\detours\detours.cpp" />
<ClCompile Include="src\detours\disasm.cpp" /> <ClCompile Include="src\detours\disasm.cpp" />
@ -52,7 +51,6 @@
<ClCompile Include="src\IDirectDraw\IDirectDrawGammaControl.c" /> <ClCompile Include="src\IDirectDraw\IDirectDrawGammaControl.c" />
<ClCompile Include="src\indeo.c" /> <ClCompile Include="src\indeo.c" />
<ClCompile Include="src\ini.c" /> <ClCompile Include="src\ini.c" />
<ClCompile Include="src\keyboard.c" />
<ClCompile Include="src\utils.c" /> <ClCompile Include="src\utils.c" />
<ClCompile Include="src\hook.c" /> <ClCompile Include="src\hook.c" />
<ClCompile Include="src\IDirectDraw\IDirectDraw.c" /> <ClCompile Include="src\IDirectDraw\IDirectDraw.c" />
@ -78,10 +76,8 @@
<ClInclude Include="inc\blt.h" /> <ClInclude Include="inc\blt.h" />
<ClInclude Include="inc\crc32.h" /> <ClInclude Include="inc\crc32.h" />
<ClInclude Include="inc\d3d9shader.h" /> <ClInclude Include="inc\d3d9shader.h" />
<ClInclude Include="inc\d3dcaps.h" />
<ClInclude Include="inc\ddclipper.h" /> <ClInclude Include="inc\ddclipper.h" />
<ClInclude Include="inc\ddraw.h" /> <ClInclude Include="inc\ddraw.h" />
<ClInclude Include="inc\delay_imports.h" />
<ClInclude Include="inc\directinput.h" /> <ClInclude Include="inc\directinput.h" />
<ClInclude Include="inc\dllmain.h" /> <ClInclude Include="inc\dllmain.h" />
<ClInclude Include="inc\fps_limiter.h" /> <ClInclude Include="inc\fps_limiter.h" />
@ -91,8 +87,6 @@
<ClInclude Include="inc\IDirectDrawGammaControl.h" /> <ClInclude Include="inc\IDirectDrawGammaControl.h" />
<ClInclude Include="inc\indeo.h" /> <ClInclude Include="inc\indeo.h" />
<ClInclude Include="inc\ini.h" /> <ClInclude Include="inc\ini.h" />
<ClInclude Include="inc\keyboard.h" />
<ClInclude Include="inc\palette.h" />
<ClInclude Include="inc\patch.h" /> <ClInclude Include="inc\patch.h" />
<ClInclude Include="inc\utils.h" /> <ClInclude Include="inc\utils.h" />
<ClInclude Include="inc\hook.h" /> <ClInclude Include="inc\hook.h" />
@ -226,7 +220,7 @@
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <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> <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>exports.def</ModuleDefinitionFile> <ModuleDefinitionFile>exports.def</ModuleDefinitionFile>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
@ -236,21 +230,6 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe
) )
</Command> </Command>
</PostBuildEvent> </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>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile> <ClCompile>
@ -268,7 +247,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" &gt;&gt; %DST_FILE%
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <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> <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>exports.def</ModuleDefinitionFile> <ModuleDefinitionFile>exports.def</ModuleDefinitionFile>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
@ -278,21 +257,6 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe
) )
</Command> </Command>
</PostBuildEvent> </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>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseXP|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseXP|Win32'">
<ClCompile> <ClCompile>
@ -310,7 +274,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" &gt;&gt; %DST_FILE%
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <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> <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>exports.def</ModuleDefinitionFile> <ModuleDefinitionFile>exports.def</ModuleDefinitionFile>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
@ -320,21 +284,6 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe
) )
</Command> </Command>
</PostBuildEvent> </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>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogXP|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogXP|Win32'">
<ClCompile> <ClCompile>
@ -352,7 +301,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" &gt;&gt; %DST_FILE%
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <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> <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>exports.def</ModuleDefinitionFile> <ModuleDefinitionFile>exports.def</ModuleDefinitionFile>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
@ -362,21 +311,6 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe
) )
</Command> </Command>
</PostBuildEvent> </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>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogMiniXP|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugLogMiniXP|Win32'">
<ClCompile> <ClCompile>
@ -394,7 +328,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" &gt;&gt; %DST_FILE%
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <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> <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>exports.def</ModuleDefinitionFile> <ModuleDefinitionFile>exports.def</ModuleDefinitionFile>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
@ -404,21 +338,6 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe
) )
</Command> </Command>
</PostBuildEvent> </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>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets" /> <ImportGroup Label="ExtensionTargets" />

View file

@ -165,12 +165,6 @@
<ClCompile Include="src\indeo.c"> <ClCompile Include="src\indeo.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="src\keyboard.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\delay_imports.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="inc\debug.h"> <ClInclude Include="inc\debug.h">
@ -293,18 +287,6 @@
<ClInclude Include="inc\indeo.h"> <ClInclude Include="inc\indeo.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </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>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="res.rc"> <ResourceCompile Include="res.rc">

View file

@ -131,31 +131,31 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
ConfigForm->Caption = L"cnc-ddraw 配置"; ConfigForm->Caption = L"cnc-ddraw 配置";
DisplayBtn->Caption = L"显示设置"; DisplayBtn->Caption = L"显示设置";
AdvancedBtn->Caption = L"高级设置"; AdvancedBtn->Caption = L"高级设置";
HotkeyBtn->Caption = L"快捷键设置"; HotkeyBtn->Caption = L"键设置";
CompatibilityBtn->Caption = L"兼容性设置"; CompatibilityBtn->Caption = L"兼容性设置";
RestoreDefaultsBtn->Caption = L"恢复默认设置"; RestoreDefaultsBtn->Caption = L"恢复默认设置";
PresentationLbl->Caption = L"显示方式"; PresentationLbl->Caption = L"显示方式";
MaintasLbl->Caption = L"保持宽高"; MaintasLbl->Caption = L"保持纵横";
VsyncLbl->Caption = L"启用垂直同步"; VsyncLbl->Caption = L"打开垂直同步";
AdjmouseLbl->Caption = L"调整鼠标灵敏度"; AdjmouseLbl->Caption = L"调整鼠标灵敏度";
DevmodeLbl->Caption = L"将光标锁定到窗口/屏幕"; DevmodeLbl->Caption = L"锁定光标到窗口/屏幕";
RendererLbl->Caption = L"渲染器"; RendererLbl->Caption = L"渲染器";
BorderLbl->Caption = L"在窗口模式下显示窗口边框"; BorderLbl->Caption = L"在窗口模式下显示窗口边框";
SavesettingsLbl->Caption = L"记住窗口位置和大小"; SavesettingsLbl->Caption = L"记住窗口位置和大小";
ShaderLbl->Caption = L"OpenGL 着色器"; ShaderLbl->Caption = L"OpenGL着色器";
MaxfpsLbl->Caption = L"限制帧"; MaxfpsLbl->Caption = L"限制帧";
BoxingLbl->Caption = L"启用整数缩放"; BoxingLbl->Caption = L"打开窗盒显示/整数缩放";
ToggleWindowedLbl->Caption = L"切换窗口模式"; ToggleWindowedLbl->Caption = L"切换窗口模式";
MaximizeWindowLbl->Caption = L"最大化窗口"; MaximizeWindowLbl->Caption = L"最大化窗口";
UnlockCursor1Lbl->Caption = L"解锁光标 1"; UnlockCursor1Lbl->Caption = L"解锁光标 1";
UnlockCursor2Lbl->Caption = L"解锁光标 2"; UnlockCursor2Lbl->Caption = L"解锁光标 2";
ScreenshotLbl->Caption = L""; ScreenshotLbl->Caption = L"";
MaxgameticksLbl->Caption = L"限制游戏速"; MaxgameticksLbl->Caption = L"限制游戏速";
NoactivateappLbl->Caption = L"修复损坏的Alt+Tab功能"; NoactivateappLbl->Caption = L"修复损坏的Alt+Tab功能";
ResolutionsLbl->Caption = L"解锁额外的屏幕分辨率"; ResolutionsLbl->Caption = L"解锁其他屏幕分辨率";
MinfpsLbl->Caption = L"强制高 FPS / 修复 Freesync/G-Sync 卡顿"; MinfpsLbl->Caption = L"强制高FPS / 修复使用Freesync/G-Sync的卡顿问题";
SinglecpuLbl->Caption = L"修复性能和声音问题"; SinglecpuLbl->Caption = L"修复性能不佳和声音问题";
NonexclusiveLbl->Caption = L"修复不显示的视频/UI 元素"; NonexclusiveLbl->Caption = L"修复不显示的视频/UI元素";
RendererCbx->Items->Clear(); RendererCbx->Items->Clear();
RendererCbx->AddItem(L"自动", NULL); RendererCbx->AddItem(L"自动", NULL);
@ -172,26 +172,25 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
MaxgameticksCbx->Items->Clear(); MaxgameticksCbx->Items->Clear();
MaxgameticksCbx->AddItem(L"无限制", NULL); MaxgameticksCbx->AddItem(L"无限制", NULL);
MaxgameticksCbx->AddItem(L"与显示器刷新率同步", NULL); MaxgameticksCbx->AddItem(L"与显示器刷新率同步", NULL);
MaxgameticksCbx->AddItem(L"模拟 60hz 刷新率显示器", NULL); MaxgameticksCbx->AddItem(L"模拟60hz刷新率显示器", NULL);
MaxgameticksCbx->AddItem(L"1000每秒", NULL); MaxgameticksCbx->AddItem(L"1000tick每秒", NULL);
MaxgameticksCbx->AddItem(L"500每秒", NULL); MaxgameticksCbx->AddItem(L"500tick每秒", NULL);
MaxgameticksCbx->AddItem(L"250每秒", NULL); MaxgameticksCbx->AddItem(L"250tick每秒", NULL);
MaxgameticksCbx->AddItem(L"125每秒", NULL); MaxgameticksCbx->AddItem(L"125tick每秒", NULL);
MaxgameticksCbx->AddItem(L"60每秒", NULL); MaxgameticksCbx->AddItem(L"60tick每秒", NULL);
MaxgameticksCbx->AddItem(L"30每秒", NULL); MaxgameticksCbx->AddItem(L"30tick每秒", NULL);
MaxgameticksCbx->AddItem(L"25每秒", NULL); MaxgameticksCbx->AddItem(L"25tick每秒", NULL);
MaxgameticksCbx->AddItem(L"15每秒", NULL); MaxgameticksCbx->AddItem(L"15tick每秒", NULL);
System::UnicodeString shaderHint = System::UnicodeString shaderHint =
L"一些着色器只有在启用放大时才有效。\n\n"; L"某些着色器仅在打开放大功能时生效。\n\n";
System::UnicodeString upscaleHint = System::UnicodeString upscaleHint =
L"必须启用放大才能使此设置生效。\n\n"; L"必须打开放大功能才能使此设置生效。\n\n";
System::UnicodeString enableUpscaleHint = System::UnicodeString enableUpscaleHint =
L"要启用放大,请将显示方式设置为“无边框” \n" L"要打开放大功能,请将显示方式设置为‘无边框’或‘拉伸至全屏’。\n"
"或“拉伸至全屏”。对于“窗口化”, \n" "对于‘窗口化’显示方式,您必须调整窗口大小或最大化窗口。";
"你必须调整窗口大小或将窗口开启最大化。";
ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderLbl->Hint = shaderHint + enableUpscaleHint;
ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint;
@ -306,7 +305,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
SavesettingsLbl->Caption = L"Fensterposition und Größe merken"; SavesettingsLbl->Caption = L"Fensterposition und Größe merken";
ShaderLbl->Caption = L"OpenGL Shader"; ShaderLbl->Caption = L"OpenGL Shader";
MaxfpsLbl->Caption = L"Limitiere Aktualisierungsrate"; 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"; ToggleWindowedLbl->Caption = L"Fenstermodus umschalten";
MaximizeWindowLbl->Caption = L"Fenster maximieren"; MaximizeWindowLbl->Caption = L"Fenster maximieren";
UnlockCursor1Lbl->Caption = L"Cursor entsperren 1"; UnlockCursor1Lbl->Caption = L"Cursor entsperren 1";
@ -671,177 +670,15 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
MaxgameticksCbx->AddItem(L"15 tick al secondo", NULL); MaxgameticksCbx->AddItem(L"15 tick al secondo", NULL);
System::UnicodeString shaderHint = System::UnicodeString shaderHint =
L"Alcuni shader funzionano solo quando il ridimensionamento dell'immagine è abilitato. \n\n"; L"Alcuni shader funzionano solo quando l'upscaling è abilitato. \n\n";
System::UnicodeString upscaleHint = System::UnicodeString upscaleHint =
L"Affinché questa impostazione funzioni, è necessario abilitare il ridimensionamento dell'immagine. \n\n"; L"Affinché questa impostazione funzioni, è necessario abilitare l'upscaling. \n\n";
System::UnicodeString enableUpscaleHint = System::UnicodeString enableUpscaleHint =
L"Per abilitare il ridimensionamento dell'immagine, imposta la modalità di presentazione \n" L"Per abilitare l'ingrandimento, imposta la presentazione su 'Senza Bordi' \n"
"su 'Senza Bordi o 'Schermo Intero Ridimensionato'. Per la modalità 'In Finestra', \n" "o 'Schermo Intero Ridimensionato'. Per la presentazione 'In Finestra', \n"
"è necessario ridimensionare o ingrandire la finestra manualmente."; "è necessario ridimensionare o ingrandire la finestra.";
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; ShaderLbl->Hint = shaderHint + enableUpscaleHint;
ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint;
@ -900,18 +737,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini)
LanguageImg->Picture->Graphic = png; LanguageImg->Picture->Graphic = png;
LanguageImg->Visible = true; 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 (...) { } catch (...) {
} }
@ -1274,7 +1099,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender)
MinfpsChk->State = Minfps != 0 ? tssOn : tssOff; MinfpsChk->State = Minfps != 0 ? tssOn : tssOff;
SinglecpuChk->State = GetBool(ini, "singlecpu", true) ? tssOff : tssOn; 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); CompatibilityBtn->Visible = !GetBool(ini, "hide_compat_tab", false);

View file

@ -2677,7 +2677,7 @@ object ConfigForm: TConfigForm
61C0650530766087F0B9DE67A1EF3B173173597F3B695CC608E0B202F8FC22D7 61C0650530766087F0B9DE67A1EF3B173173597F3B695CC608E0B202F8FC22D7
BBBF4CD8CBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCB BBBF4CD8CBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCB
B88CB18EFF1FA2974C1C31AF16A40000000049454E44AE426082} B88CB18EFF1FA2974C1C31AF16A40000000049454E44AE426082}
Position = poScreenCenter Position = poDesktopCenter
OnActivate = FormActivate OnActivate = FormActivate
OnCreate = FormCreate OnCreate = FormCreate
DesignSize = ( DesignSize = (
@ -2696,6 +2696,8 @@ object ConfigForm: TConfigForm
ShowCaption = False ShowCaption = False
TabOrder = 1 TabOrder = 1
StyleElements = [seFont, seBorder] StyleElements = [seFont, seBorder]
ExplicitWidth = 495
ExplicitHeight = 464
DesignSize = ( DesignSize = (
499 499
465) 465)
@ -2883,6 +2885,7 @@ object ConfigForm: TConfigForm
TabOrder = 5 TabOrder = 5
StyleElements = [seFont, seBorder] StyleElements = [seFont, seBorder]
OnClick = ThemePnlClick OnClick = ThemePnlClick
ExplicitLeft = 471
end end
end end
object CompatibilityPnl: TPanel object CompatibilityPnl: TPanel
@ -2898,6 +2901,8 @@ object ConfigForm: TConfigForm
TabOrder = 3 TabOrder = 3
Visible = False Visible = False
StyleElements = [seFont, seBorder] StyleElements = [seFont, seBorder]
ExplicitWidth = 495
ExplicitHeight = 464
object MaxgameticksLbl: TLabel object MaxgameticksLbl: TLabel
Left = 40 Left = 40
Top = 28 Top = 28
@ -3078,6 +3083,8 @@ object ConfigForm: TConfigForm
TabOrder = 2 TabOrder = 2
Visible = False Visible = False
StyleElements = [seFont, seBorder] StyleElements = [seFont, seBorder]
ExplicitWidth = 495
ExplicitHeight = 464
object RendererLbl: TLabel object RendererLbl: TLabel
Left = 40 Left = 40
Top = 28 Top = 28
@ -3302,6 +3309,8 @@ object ConfigForm: TConfigForm
TabOrder = 4 TabOrder = 4
Visible = False Visible = False
StyleElements = [seFont, seBorder] StyleElements = [seFont, seBorder]
ExplicitWidth = 495
ExplicitHeight = 464
object ToggleWindowedLbl: TLabel object ToggleWindowedLbl: TLabel
Left = 40 Left = 40
Top = 27 Top = 27
@ -3529,6 +3538,7 @@ object ConfigForm: TConfigForm
Color = clMenu Color = clMenu
ParentBackground = False ParentBackground = False
TabOrder = 0 TabOrder = 0
ExplicitHeight = 467
DesignSize = ( DesignSize = (
233 233
468) 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"> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<ProjectGuid>{E020D5C7-AE07-4DB9-9688-6D289E9FFF1A}</ProjectGuid> <ProjectGuid>{E020D5C7-AE07-4DB9-9688-6D289E9FFF1A}</ProjectGuid>
<ProjectVersion>20.1</ProjectVersion> <ProjectVersion>19.5</ProjectVersion>
<FrameworkType>VCL</FrameworkType> <FrameworkType>VCL</FrameworkType>
<AppType>Application</AppType> <AppType>Application</AppType>
<MainSource>cnc-ddraw config.cpp</MainSource> <MainSource>cnc-ddraw config.cpp</MainSource>
@ -10,7 +10,6 @@
<Platform Condition="'$(Platform)'==''">Win32</Platform> <Platform Condition="'$(Platform)'==''">Win32</Platform>
<TargetedPlatforms>1</TargetedPlatforms> <TargetedPlatforms>1</TargetedPlatforms>
<CC_Suffix Condition="'$(CC_Suffix)'==''">c</CC_Suffix> <CC_Suffix Condition="'$(CC_Suffix)'==''">c</CC_Suffix>
<ProjectName Condition="'$(ProjectName)'==''">cnc-ddraw config</ProjectName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base> <Base>true</Base>
@ -25,11 +24,6 @@
<CfgParent>Base</CfgParent> <CfgParent>Base</CfgParent>
<Base>true</Base> <Base>true</Base>
</PropertyGroup> </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)'!=''"> <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1> <Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent> <CfgParent>Base</CfgParent>
@ -47,12 +41,6 @@
<Cfg_1>true</Cfg_1> <Cfg_1>true</Cfg_1>
<Base>true</Base> <Base>true</Base>
</PropertyGroup> </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)'!=''"> <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2> <Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent> <CfgParent>Base</CfgParent>
@ -70,12 +58,6 @@
<Cfg_2>true</Cfg_2> <Cfg_2>true</Cfg_2>
<Base>true</Base> <Base>true</Base>
</PropertyGroup> </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)'!=''"> <PropertyGroup Condition="'$(Base)'!=''">
<DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput> <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
<DynamicRTL>true</DynamicRTL> <DynamicRTL>true</DynamicRTL>
@ -119,14 +101,6 @@
<VerInfo_Locale>1033</VerInfo_Locale> <VerInfo_Locale>1033</VerInfo_Locale>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File> <Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
</PropertyGroup> </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)'!=''"> <PropertyGroup Condition="'$(Cfg_1)'!=''">
<BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed> <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
<BCC_DisableOptimizations>true</BCC_DisableOptimizations> <BCC_DisableOptimizations>true</BCC_DisableOptimizations>
@ -167,9 +141,6 @@
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''"> <PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode> <AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win64x)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''"> <PropertyGroup Condition="'$(Cfg_2)'!=''">
<Defines>NDEBUG;$(Defines)</Defines> <Defines>NDEBUG;$(Defines)</Defines>
<TASM_Debugging>None</TASM_Debugging> <TASM_Debugging>None</TASM_Debugging>
@ -190,9 +161,6 @@
<PropertyGroup Condition="'$(Cfg_2_Win64)'!=''"> <PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode> <AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win64x)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<CppCompile Include="cnc-ddraw config.cpp"> <CppCompile Include="cnc-ddraw config.cpp">
<BuildOrder>0</BuildOrder> <BuildOrder>0</BuildOrder>
@ -227,10 +195,6 @@
<ResourceType>RCDATA</ResourceType> <ResourceType>RCDATA</ResourceType>
<ResourceId>PngImage_IT</ResourceId> <ResourceId>PngImage_IT</ResourceId>
</RcItem> </RcItem>
<RcItem Include="Resources\pl.png">
<ResourceType>RCDATA</ResourceType>
<ResourceId>PngImage_PL</ResourceId>
</RcItem>
<RcItem Include="Resources\RU.png"> <RcItem Include="Resources\RU.png">
<ResourceType>RCDATA</ResourceType> <ResourceType>RCDATA</ResourceType>
<ResourceId>PngImage_RU</ResourceId> <ResourceId>PngImage_RU</ResourceId>
@ -239,10 +203,6 @@
<ResourceType>RCDATA</ResourceType> <ResourceType>RCDATA</ResourceType>
<ResourceId>PngImage_US</ResourceId> <ResourceId>PngImage_US</ResourceId>
</RcItem> </RcItem>
<RcItem Include="Resources\VN.png">
<ResourceType>RCDATA</ResourceType>
<ResourceId>PngImage_VN</ResourceId>
</RcItem>
<FormResources Include="ConfigFormUnit.dfm"/> <FormResources Include="ConfigFormUnit.dfm"/>
<BuildConfiguration Include="Base"> <BuildConfiguration Include="Base">
<Key>Base</Key> <Key>Base</Key>
@ -305,16 +265,6 @@
<Overwrite>true</Overwrite> <Overwrite>true</Overwrite>
</Platform> </Platform>
</DeployFile> </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"> <DeployFile Condition="'$(UsingDelphiRTL)'=='true'" LocalName="$(BDS)\bin\borlndmm.dll" Class="DependencyModule">
<Platform Name="Win32"> <Platform Name="Win32">
<Overwrite>true</Overwrite> <Overwrite>true</Overwrite>
@ -332,16 +282,6 @@
<Overwrite>true</Overwrite> <Overwrite>true</Overwrite>
</Platform> </Platform>
</DeployFile> </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\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\cc32c260mt.dll" Class="DependencyModule"/>
<DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'!='true'" LocalName="$(BDS)\bin\cc32c280.dll" Class="DependencyModule"> <DeployFile Condition="'$(DynamicRTL)'=='true' And '$(Multithreaded)'!='true'" LocalName="$(BDS)\bin\cc32c280.dll" Class="DependencyModule">
@ -354,92 +294,16 @@
<Overwrite>true</Overwrite> <Overwrite>true</Overwrite>
</Platform> </Platform>
</DeployFile> </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\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"/>
<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"/>
<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"/>
<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"/>
<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"/>
<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"/>
<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"/>
<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"/>
<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"/>
<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"> <DeployClass Name="AdditionalDebugSymbols">
<Platform Name="iOSSimulator"> <Platform Name="iOSSimulator">
<Operation>1</Operation> <Operation>1</Operation>
@ -530,16 +394,6 @@
<Operation>1</Operation> <Operation>1</Operation>
</Platform> </Platform>
</DeployClass> </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"> <DeployClass Name="AndroidSplashStyles">
<Platform Name="Android"> <Platform Name="Android">
<RemoteDir>res\values</RemoteDir> <RemoteDir>res\values</RemoteDir>
@ -560,66 +414,6 @@
<Operation>1</Operation> <Operation>1</Operation>
</Platform> </Platform>
</DeployClass> </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"> <DeployClass Name="Android_Colors">
<Platform Name="Android"> <Platform Name="Android">
<RemoteDir>res\values</RemoteDir> <RemoteDir>res\values</RemoteDir>
@ -630,16 +424,6 @@
<Operation>1</Operation> <Operation>1</Operation>
</Platform> </Platform>
</DeployClass> </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"> <DeployClass Name="Android_DefaultAppIcon">
<Platform Name="Android"> <Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir> <RemoteDir>res\drawable</RemoteDir>
@ -810,56 +594,6 @@
<Operation>1</Operation> <Operation>1</Operation>
</Platform> </Platform>
</DeployClass> </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"> <DeployClass Name="DebugSymbols">
<Platform Name="iOSSimulator"> <Platform Name="iOSSimulator">
<Operation>1</Operation> <Operation>1</Operation>
@ -1100,9 +834,6 @@
<Platform Name="Win64"> <Platform Name="Win64">
<Operation>1</Operation> <Operation>1</Operation>
</Platform> </Platform>
<Platform Name="Win64x">
<Operation>1</Operation>
</Platform>
</DeployClass> </DeployClass>
<DeployClass Name="ProjectiOSDeviceDebug"> <DeployClass Name="ProjectiOSDeviceDebug">
<Platform Name="iOSDevice32"> <Platform Name="iOSDevice32">
@ -1173,10 +904,6 @@
<RemoteDir>Assets</RemoteDir> <RemoteDir>Assets</RemoteDir>
<Operation>1</Operation> <Operation>1</Operation>
</Platform> </Platform>
<Platform Name="Win64x">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass> </DeployClass>
<DeployClass Name="UWP_CppLogo44"> <DeployClass Name="UWP_CppLogo44">
<Platform Name="Win32"> <Platform Name="Win32">
@ -1187,10 +914,6 @@
<RemoteDir>Assets</RemoteDir> <RemoteDir>Assets</RemoteDir>
<Operation>1</Operation> <Operation>1</Operation>
</Platform> </Platform>
<Platform Name="Win64x">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass> </DeployClass>
<DeployClass Name="iOS_AppStore1024"> <DeployClass Name="iOS_AppStore1024">
<Platform Name="iOSDevice64"> <Platform Name="iOSDevice64">
@ -1404,12 +1127,10 @@
<ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME).app"/> <ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/> <ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/> <ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Win64x" Name="$(PROJECTNAME)"/>
</Deployment> </Deployment>
<Platforms> <Platforms>
<Platform value="Win32">True</Platform> <Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform> <Platform value="Win64">False</Platform>
<Platform value="Win64x">False</Platform>
</Platforms> </Platforms>
</BorlandProject> </BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion> <ProjectFileVersion>12</ProjectFileVersion>

View file

@ -11,6 +11,7 @@
#include <Vcl.Themes.hpp> #include <Vcl.Themes.hpp>
USEFORM("ConfigFormUnit.cpp", ConfigForm); USEFORM("ConfigFormUnit.cpp", ConfigForm);
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\") #define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\")
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
@ -67,15 +68,4 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
} }
return 0; 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_FR RCDATA "Resources\\fr.png"
PngImage_HU RCDATA "Resources\\hu.png" PngImage_HU RCDATA "Resources\\hu.png"
PngImage_IT RCDATA "Resources\\IT.png" PngImage_IT RCDATA "Resources\\IT.png"
PngImage_PL RCDATA "Resources\\pl.png"
PngImage_RU RCDATA "Resources\\RU.png" PngImage_RU RCDATA "Resources\\RU.png"
PngImage_US RCDATA "Resources\\US.png" PngImage_US RCDATA "Resources\\US.png"
PngImage_VN RCDATA "Resources\\VN.png"

View file

@ -3,7 +3,6 @@
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
#include "d3dcaps.h"
DEFINE_GUID(IID_IDirect3D, 0x3BBA0080, 0x2421, 0x11CF, 0xA3, 0x1A, 0x00, 0xAA, 0x00, 0xB9, 0x33, 0x56); 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_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_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 { \ #define DECLARE_D3D_INTERFACE(iface) typedef struct iface { \
struct iface##Vtbl FAR* lpVtbl; \ struct iface##Vtbl FAR* lpVtbl; \
ULONG ref; \ ULONG ref; \
@ -21,6 +17,7 @@ DEFINE_GUID(IID_IDirect3DNullDevice, 0x8767df22, 0xbacc, 0x11d1, 0x89, 0x69, 0x0
typedef struct iface##Vtbl iface##Vtbl; \ typedef struct iface##Vtbl iface##Vtbl; \
struct iface##Vtbl struct iface##Vtbl
/* IID_IDirect3D */ /* IID_IDirect3D */
DECLARE_D3D_INTERFACE(IDirect3DImpl) DECLARE_D3D_INTERFACE(IDirect3DImpl)
@ -30,7 +27,7 @@ DECLARE_D3D_INTERFACE(IDirect3DImpl)
ULONG(__stdcall * Release) (IDirect3DImpl*); ULONG(__stdcall * Release) (IDirect3DImpl*);
HRESULT(__stdcall * Initialize)(IDirect3DImpl*, int); 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 * CreateLight)(IDirect3DImpl*, int, int);
HRESULT(__stdcall * CreateMaterial)(IDirect3DImpl*, int, int); HRESULT(__stdcall * CreateMaterial)(IDirect3DImpl*, int, int);
HRESULT(__stdcall * CreateViewport)(IDirect3DImpl*, int, int); HRESULT(__stdcall * CreateViewport)(IDirect3DImpl*, int, int);
@ -47,7 +44,7 @@ DECLARE_D3D_INTERFACE(IDirect3D2Impl)
ULONG(__stdcall * AddRef) (IDirect3D2Impl*); ULONG(__stdcall * AddRef) (IDirect3D2Impl*);
ULONG(__stdcall * Release) (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 * CreateLight)(IDirect3D2Impl*, int, int);
HRESULT(__stdcall * CreateMaterial)(IDirect3D2Impl*, int, int); HRESULT(__stdcall * CreateMaterial)(IDirect3D2Impl*, int, int);
HRESULT(__stdcall * CreateViewport)(IDirect3D2Impl*, int, int); HRESULT(__stdcall * CreateViewport)(IDirect3D2Impl*, int, int);
@ -65,7 +62,7 @@ DECLARE_D3D_INTERFACE(IDirect3D3Impl)
ULONG(__stdcall * AddRef) (IDirect3D3Impl*); ULONG(__stdcall * AddRef) (IDirect3D3Impl*);
ULONG(__stdcall * Release) (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 * CreateLight)(IDirect3D3Impl*, int, int);
HRESULT(__stdcall * CreateMaterial)(IDirect3D3Impl*, int, int); HRESULT(__stdcall * CreateMaterial)(IDirect3D3Impl*, int, int);
HRESULT(__stdcall * CreateViewport)(IDirect3D3Impl*, int, int); HRESULT(__stdcall * CreateViewport)(IDirect3D3Impl*, int, int);
@ -86,7 +83,7 @@ DECLARE_D3D_INTERFACE(IDirect3D7Impl)
ULONG(__stdcall * AddRef) (IDirect3D7Impl*); ULONG(__stdcall * AddRef) (IDirect3D7Impl*);
ULONG(__stdcall * Release) (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 * CreateDevice)(IDirect3D7Impl*, int, int, int);
HRESULT(__stdcall * CreateVertexBuffer)(IDirect3D7Impl*, int, int, int); HRESULT(__stdcall * CreateVertexBuffer)(IDirect3D7Impl*, int, int, int);
HRESULT(__stdcall * EnumZBufferFormats)(IDirect3D7Impl*, int, int, int); HRESULT(__stdcall * EnumZBufferFormats)(IDirect3D7Impl*, int, int, int);

View file

@ -9,11 +9,6 @@
#include "IDirectDraw.h" #include "IDirectDraw.h"
typedef struct DDBITMAPINFO{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[256];
} DDBITMAPINFO;
struct IDirectDrawSurfaceImpl; struct IDirectDrawSurfaceImpl;
struct IDirectDrawSurfaceImplVtbl; struct IDirectDrawSurfaceImplVtbl;
@ -23,9 +18,9 @@ typedef struct IDirectDrawSurfaceImpl
ULONG ref; ULONG ref;
DWORD bpp;
DWORD width; DWORD width;
DWORD height; DWORD height;
DWORD bpp;
DWORD size; DWORD size;
DWORD flags; DWORD flags;
DWORD caps; DWORD caps;
@ -33,8 +28,6 @@ typedef struct IDirectDrawSurfaceImpl
CRITICAL_SECTION cs; CRITICAL_SECTION cs;
IDirectDrawPaletteImpl* palette; IDirectDrawPaletteImpl* palette;
PALETTEENTRY selected_pal[256];
UINT selected_pal_count;
void* surface; void* surface;
HANDLE mapping; HANDLE mapping;
@ -45,7 +38,6 @@ typedef struct IDirectDrawSurfaceImpl
PBITMAPINFO bmi; PBITMAPINFO bmi;
HBITMAP bitmap; HBITMAP bitmap;
HDC hdc; HDC hdc;
int dc_state;
DDCOLORKEY color_key; DDCOLORKEY color_key;
DWORD last_flip_tick; DWORD last_flip_tick;
DWORD last_blt_tick; DWORD last_blt_tick;

View file

@ -22,13 +22,12 @@ typedef struct CNCDDRAWCONFIG
INIFILE ini; INIFILE ini;
BOOL d3d9on12; BOOL d3d9on12;
BOOL opengl_core; BOOL opengl_core;
/* Optional settings */ /* Optional settings */
BOOL fullscreen; BOOL fullscreen;
BOOL windowed; BOOL windowed;
BOOL maintas; BOOL maintas;
char aspect_ratio[16];
BOOL boxing; BOOL boxing;
int maxfps; int maxfps;
BOOL vsync; BOOL vsync;
@ -40,10 +39,6 @@ typedef struct CNCDDRAWCONFIG
int save_settings; int save_settings;
BOOL resizable; BOOL resizable;
int d3d9_filter; int d3d9_filter;
int anti_aliased_fonts_min_size;
int min_font_size;
int center_window;
char inject_resolution[128];
BOOL vhack; BOOL vhack;
char screenshot_dir[MAX_PATH]; char screenshot_dir[MAX_PATH];
BOOL toggle_borderless; BOOL toggle_borderless;
@ -60,36 +55,39 @@ typedef struct CNCDDRAWCONFIG
int resolutions; int resolutions;
int fixchilds; int fixchilds;
BOOL hook_peekmessage; BOOL hook_peekmessage;
BOOL hook_getmessage;
/* Undocumented settings */ /* Undocumented settings */
BOOL fix_alt_key_stuck; BOOL releasealt;
BOOL fix_not_responding; BOOL fixnotresponding;
BOOL no_compat_warning; int hook;
int guard_lines; int guard_lines;
int max_resolutions; int max_resolutions;
BOOL lock_surfaces; BOOL lock_surfaces;
BOOL allow_wmactivate;
BOOL flipclear; BOOL flipclear;
BOOL fixmousehook;
BOOL rgb555; BOOL rgb555;
BOOL no_dinput_hook; BOOL no_dinput_hook;
int refresh_rate;
int anti_aliased_fonts_min_size;
int custom_width;
int custom_height;
int min_font_size;
BOOL direct3d_passthrough;
BOOL center_cursor_fix; BOOL center_cursor_fix;
char fake_mode[128]; char fake_mode[128];
BOOL wine_allow_resize;
BOOL lock_mouse_top_left; BOOL lock_mouse_top_left;
char win_version[32]; BOOL no_compat_warning;
int hook;
BOOL limit_gdi_handles;
BOOL remove_menu;
int refresh_rate;
int terminate_process;
/* Hotkeys */ /* Hotkeys */
struct struct
{ {
int toggle_fullscreen; int toggle_fullscreen;
int toggle_fullscreen2;
int toggle_maximize; int toggle_maximize;
int toggle_maximize2;
int unlock_cursor1; int unlock_cursor1;
int unlock_cursor2; int unlock_cursor2;
int screenshot; int screenshot;
@ -97,16 +95,16 @@ typedef struct CNCDDRAWCONFIG
/* Game specific settings */ /* Game specific settings */
BOOL remove_menu;
BOOL armadahack; BOOL armadahack;
BOOL tshack; BOOL tshack;
BOOL infantryhack; BOOL infantryhack;
BOOL stronghold_hack; BOOL stronghold_hack;
BOOL mgs_hack; BOOL mgs_hack;
BOOL tlc_hack; BOOL tlc_hack;
BOOL homm_hack;
BOOL carma95_hack; BOOL carma95_hack;
BOOL sirtech_hack;
BOOL flightsim98_hack;
BOOL darkcolony_hack;
} CNCDDRAWCONFIG; } CNCDDRAWCONFIG;

View file

@ -6,6 +6,5 @@
unsigned long Crc32_ComputeBuf(unsigned long inCrc32, const void* buf, size_t bufLen); unsigned long Crc32_ComputeBuf(unsigned long inCrc32, const void* buf, size_t bufLen);
unsigned long Crc32_FromFile(unsigned long crc32, char* filename);
#endif #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,15 +15,15 @@ typedef HRESULT(WINAPI* DIRECTDRAWCREATEPROC)(GUID FAR*, LPDIRECTDRAW FAR*, IUnk
ULONG dd_AddRef(); ULONG dd_AddRef();
ULONG dd_Release(); ULONG dd_Release();
HRESULT dd_EnumDisplayModes(DWORD dwFlags, LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext, LPDDENUMMODESCALLBACK lpEnumModesCallback); 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_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps);
HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc); HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc);
HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq); 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_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree);
HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB);
HRESULT dd_TestCooperativeLevel(); HRESULT dd_TestCooperativeLevel();
HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID riid); HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID riid);
HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter); HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter);
@ -32,7 +32,6 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute
#define FIX_CHILDS_DETECT 1 #define FIX_CHILDS_DETECT 1
#define FIX_CHILDS_DETECT_PAINT 2 #define FIX_CHILDS_DETECT_PAINT 2
#define FIX_CHILDS_DETECT_HIDE 3 #define FIX_CHILDS_DETECT_HIDE 3
#define FIX_CHILDS_DETECT_HIDE_NOSCALE 4
#define RESLIST_NORMAL 0 #define RESLIST_NORMAL 0
#define RESLIST_MINI 1 #define RESLIST_MINI 1
@ -50,12 +49,6 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute
#define LIMIT_AUTO 0 #define LIMIT_AUTO 0
#define LIMIT_TESTCOOP 1 #define LIMIT_TESTCOOP 1
#define LIMIT_BLTFAST 2 #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 #ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION
#define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002 #define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002
@ -65,18 +58,6 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute
#define CREATE_WAITABLE_TIMER_MANUAL_RESET 0x00000001 #define CREATE_WAITABLE_TIMER_MANUAL_RESET 0x00000001
#endif #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 typedef struct SPEEDLIMITER
{ {
DWORD tick_length; DWORD tick_length;
@ -127,7 +108,6 @@ typedef struct CNCDDRAW
LONG palette_updated; LONG palette_updated;
LONG surface_updated; LONG surface_updated;
LONG clear_screen; LONG clear_screen;
LONG screen_updated;
float scale_w; float scale_w;
float scale_h; float scale_h;
@ -169,15 +149,14 @@ typedef struct CNCDDRAW
void* last_freed_palette; /* Dungeon Keeper hack */ void* last_freed_palette; /* Dungeon Keeper hack */
void* last_freed_surface; /* Nox hack */ void* last_freed_surface; /* Nox hack */
BOOL child_window_exists; BOOL child_window_exists;
HWND video_window_hwnd;
BOOL got_child_windows; BOOL got_child_windows;
DWORD last_set_window_pos_tick; /* WINE hack */ DWORD last_set_window_pos_tick; /* WINE hack */
DWORD last_msg_pull_tick;
SPEEDLIMITER ticks_limiter; SPEEDLIMITER ticks_limiter;
SPEEDLIMITER flip_limiter; SPEEDLIMITER flip_limiter;
DWORD minfps_tick_len; DWORD minfps_tick_len;
DWORD gui_thread_id; DWORD gui_thread_id;
BOOL show_driver_warning; BOOL show_driver_warning;
BOOL windowed_hack;
struct struct
{ {
@ -186,8 +165,10 @@ typedef struct CNCDDRAW
int y; int y;
} textbox; /* Age Of Empires 2 textbox align */ } textbox; /* Age Of Empires 2 textbox align */
struct struct
{ {
LONG frame_skip;
BOOL enabled; BOOL enabled;
} zoom; } zoom;
} CNCDDRAW; } CNCDDRAW;

View file

@ -7,8 +7,6 @@
#include "IDirectDrawPalette.h" #include "IDirectDrawPalette.h"
#include "dd.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_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 ddp_SetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries);
HRESULT dd_CreatePalette(DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, IDirectDrawPaletteImpl** lpDDPalette, IUnknown FAR* unkOuter); HRESULT dd_CreatePalette(DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, IDirectDrawPaletteImpl** lpDDPalette, IUnknown FAR* unkOuter);

View file

@ -6,7 +6,6 @@
#include <intrin.h> #include <intrin.h>
LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception); LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception);
LONG WINAPI dbg_vectored_exception_handler(EXCEPTION_POINTERS* exception);
void dbg_counter_start(); void dbg_counter_start();
double dbg_counter_stop(); double dbg_counter_stop();
void dbg_debug_string(const char* format, ...); void dbg_debug_string(const char* format, ...);
@ -27,16 +26,11 @@ void dbg_dump_dds_caps(DWORD caps);
void dbg_dump_dds_flags(DWORD flags); void dbg_dump_dds_flags(DWORD flags);
void dbg_dump_dds_blt_fast_flags(DWORD flags); void dbg_dump_dds_blt_fast_flags(DWORD flags);
void dbg_dump_dds_lock_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); 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 double g_dbg_frame_time;
extern DWORD g_dbg_frame_count; extern DWORD g_dbg_frame_count;
extern LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; extern LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter;
extern PVOID g_dbg_exception_handle;
#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ #if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */
#undef _ReturnAddress #undef _ReturnAddress

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* SETPROCESSDPIAWAREPROC)();
typedef BOOL(__stdcall* SETPROCESSDPIAWARENESSCONTEXTPROC)(DPI_AWARENESS_CONTEXT); typedef BOOL(__stdcall* SETPROCESSDPIAWARENESSCONTEXTPROC)(DPI_AWARENESS_CONTEXT);
#if (_WIN32_WINNT < _WIN32_WINNT_WINXP)
#define SetThreadExecutionState(a)
#endif
#endif #endif

View file

@ -2,12 +2,10 @@
#define HOOK_H #define HOOK_H
#include <windows.h> #include <windows.h>
#include <vfw.h>
#define HOOK_SKIP_2 0x00000001l #define HOOK_SKIP_2 0x00000001l
#define HOOK_LOCAL_ONLY 0x00000002l #define HOOK_LOCAL_ONLY 0x00000002l
#define HOOK_SYSTEM_ONLY 0x00000004l
typedef struct HOOKLISTDATA { typedef struct HOOKLISTDATA {
char function_name[32]; char function_name[32];
@ -18,7 +16,7 @@ typedef struct HOOKLISTDATA {
HMODULE mod; HMODULE mod;
} HOOKLISTDATA; } HOOKLISTDATA;
typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[39]; } HOOKLIST; typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[34]; } HOOKLIST;
typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT);
typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*);
@ -37,7 +35,6 @@ typedef BOOL(WINAPI* SETWINDOWPOSPROC)(HWND, HWND, int, int, int, int, UINT);
typedef BOOL(WINAPI* MOVEWINDOWPROC)(HWND, int, int, int, int, BOOL); typedef BOOL(WINAPI* MOVEWINDOWPROC)(HWND, int, int, int, int, BOOL);
typedef LRESULT(WINAPI* SENDMESSAGEAPROC)(HWND, UINT, WPARAM, LPARAM); typedef LRESULT(WINAPI* SENDMESSAGEAPROC)(HWND, UINT, WPARAM, LPARAM);
typedef LONG(WINAPI* SETWINDOWLONGAPROC)(HWND, int, LONG); typedef LONG(WINAPI* SETWINDOWLONGAPROC)(HWND, int, LONG);
typedef LONG(WINAPI* SETWINDOWLONGWPROC)(HWND, int, LONG);
typedef LONG(WINAPI* GETWINDOWLONGAPROC)(HWND, int); typedef LONG(WINAPI* GETWINDOWLONGAPROC)(HWND, int);
typedef BOOL(WINAPI* ENABLEWINDOWPROC)(HWND, BOOL); typedef BOOL(WINAPI* ENABLEWINDOWPROC)(HWND, BOOL);
typedef HWND(WINAPI* CREATEWINDOWEXAPROC)(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID); typedef HWND(WINAPI* CREATEWINDOWEXAPROC)(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID);
@ -60,35 +57,26 @@ typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD);
typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT); typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT);
typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT); typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT);
typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*); typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*);
typedef BOOL(WINAPI* SETWINDOWPLACEMENTPROC)(HWND, const WINDOWPLACEMENT*);
typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*); typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*);
typedef LRESULT(WINAPI* DEFWINDOWPROCAPROC)(HWND, UINT, WPARAM, LPARAM);
typedef HWND(WINAPI* SETPARENTPROC)(HWND, HWND); typedef BOOL(WINAPI* VALIDATERECTPROC)(HWND, const RECT*);
typedef HDC (WINAPI* BEGINPAINTPROC)(HWND, LPPAINTSTRUCT); typedef BOOL(WINAPI* INVALIDATERECTPROC)(HWND, const RECT*, BOOL);
typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETKEYSTATEPROC)(int);
typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int);
typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int);
typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*); 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 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* LOADLIBRARYAPROC)(LPCSTR);
typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR); typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR);
typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD); typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD);
typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD); typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD);
typedef FARPROC(WINAPI* GETPROCADDRESSPROC)(HMODULE, LPCSTR); typedef FARPROC(WINAPI* GETPROCADDRESSPROC)(HMODULE, LPCSTR);
typedef BOOL(WINAPI* GETDISKFREESPACEAPROC)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); 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 HRESULT(WINAPI* COCREATEINSTANCEPROC)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*);
typedef MCIERROR(WINAPI* MCISENDCOMMANDAPROC)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR); typedef MCIERROR(WINAPI* MCISENDCOMMANDAPROC)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR);
typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER); typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER);
typedef PGETFRAME (WINAPI* AVISTREAMGETFRAMEOPENPROC)(PAVISTREAM, LPBITMAPINFOHEADER);
extern GETCURSORPOSPROC real_GetCursorPos; extern GETCURSORPOSPROC real_GetCursorPos;
extern CLIPCURSORPROC real_ClipCursor; extern CLIPCURSORPROC real_ClipCursor;
extern SHOWCURSORPROC real_ShowCursor; extern SHOWCURSORPROC real_ShowCursor;
@ -106,7 +94,6 @@ extern SETWINDOWPOSPROC real_SetWindowPos;
extern MOVEWINDOWPROC real_MoveWindow; extern MOVEWINDOWPROC real_MoveWindow;
extern SENDMESSAGEAPROC real_SendMessageA; extern SENDMESSAGEAPROC real_SendMessageA;
extern SETWINDOWLONGAPROC real_SetWindowLongA; extern SETWINDOWLONGAPROC real_SetWindowLongA;
extern SETWINDOWLONGWPROC real_SetWindowLongW;
extern GETWINDOWLONGAPROC real_GetWindowLongA; extern GETWINDOWLONGAPROC real_GetWindowLongA;
extern ENABLEWINDOWPROC real_EnableWindow; extern ENABLEWINDOWPROC real_EnableWindow;
extern CREATEWINDOWEXAPROC real_CreateWindowExA; extern CREATEWINDOWEXAPROC real_CreateWindowExA;
@ -124,31 +111,23 @@ extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA;
extern PEEKMESSAGEAPROC real_PeekMessageA; extern PEEKMESSAGEAPROC real_PeekMessageA;
extern GETMESSAGEAPROC real_GetMessageA; extern GETMESSAGEAPROC real_GetMessageA;
extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement;
extern SETWINDOWPLACEMENTPROC real_SetWindowPlacement;
extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA;
extern DEFWINDOWPROCAPROC real_DefWindowProcA; extern VALIDATERECTPROC real_ValidateRect;
extern SETPARENTPROC real_SetParent; extern INVALIDATERECTPROC real_InvalidateRect;
extern BEGINPAINTPROC real_BeginPaint;
extern GETKEYSTATEPROC real_GetKeyState; extern GETKEYSTATEPROC real_GetKeyState;
extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState;
extern GETDEVICECAPSPROC real_GetDeviceCaps; extern GETDEVICECAPSPROC real_GetDeviceCaps;
extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA; extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA;
extern CREATEFONTAPROC real_CreateFontA; extern CREATEFONTAPROC real_CreateFontA;
extern GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries;
extern SELECTPALETTEPROC real_SelectPalette;
extern REALIZEPALETTEPROC real_RealizePalette;
extern LOADLIBRARYAPROC real_LoadLibraryA; extern LOADLIBRARYAPROC real_LoadLibraryA;
extern LOADLIBRARYWPROC real_LoadLibraryW; extern LOADLIBRARYWPROC real_LoadLibraryW;
extern LOADLIBRARYEXAPROC real_LoadLibraryExA; extern LOADLIBRARYEXAPROC real_LoadLibraryExA;
extern LOADLIBRARYEXWPROC real_LoadLibraryExW; extern LOADLIBRARYEXWPROC real_LoadLibraryExW;
extern GETPROCADDRESSPROC real_GetProcAddress; extern GETPROCADDRESSPROC real_GetProcAddress;
extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA; extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA;
extern GETVERSIONPROC real_GetVersion;
extern GETVERSIONEXAPROC real_GetVersionExA;
extern COCREATEINSTANCEPROC real_CoCreateInstance; extern COCREATEINSTANCEPROC real_CoCreateInstance;
extern MCISENDCOMMANDAPROC real_mciSendCommandA; extern MCISENDCOMMANDAPROC real_mciSendCommandA;
extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter;
extern AVISTREAMGETFRAMEOPENPROC real_AVIStreamGetFrameOpen;
extern BOOL g_hook_active; extern BOOL g_hook_active;
extern HOOKLIST g_hook_hooklist[]; extern HOOKLIST g_hook_hooklist[];

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 PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
extern PFNGLTEXBUFFERPROC glTexBuffer; extern PFNGLTEXBUFFERPROC glTexBuffer;
extern PFNGLGETINTEGERVPROC glGetIntegerv;
extern PFNGLGETSTRINGIPROC glGetStringi;
extern HMODULE g_oglu_hmodule; extern HMODULE g_oglu_hmodule;
extern BOOL g_oglu_got_version2; extern BOOL g_oglu_got_version2;
extern BOOL g_oglu_got_version3; extern BOOL g_oglu_got_version3;
extern char g_oglu_version[]; extern char g_oglu_version[];
extern char g_oglu_version_long[];
#endif #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

@ -6,10 +6,6 @@
HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); 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); FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name);
BOOL util_caller_is_ddraw_wrapper(void* return_address); BOOL util_caller_is_ddraw_wrapper(void* return_address);
BOOL util_is_bad_read_ptr(void* p); BOOL util_is_bad_read_ptr(void* p);

View file

@ -4,10 +4,10 @@
#define str(s) #s #define str(s) #s
#define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d)
#define VERSION_MAJOR 7 #define VERSION_MAJOR 6
#define VERSION_MINOR 1 #define VERSION_MINOR 7
#define VERSION_BUILD 0 #define VERSION_BUILD 0
#define VERSION_REVISION 1 #define VERSION_REVISION 3
#define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION
#define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION)

View file

@ -28,13 +28,9 @@
#define _WIN32_WINNT_WIN11 0x0A00 #define _WIN32_WINNT_WIN11 0x0A00
#endif #endif
#if (_WIN32_WINNT < _WIN32_WINNT_WIN2K)
#define VerifyVersionInfoW(a,b,c) 0
#define VerSetConditionMask verhelp_set_mask
#endif
void verhelp_init();
BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask); 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(); const char* verhelp_wine_get_version();
void verhelp_wine_get_host_version(const char** sysname, const char** release); void verhelp_wine_get_host_version(const char** sysname, const char** release);
@ -60,17 +56,6 @@ VERSIONHELPERAPI IsWindowsVersion(DWORD major, DWORD minor, DWORD build, WORD se
VER_SERVICEPACKMAJOR, VER_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) VERSIONHELPERAPI IsWindowsVersionAnySP(DWORD major, DWORD minor, DWORD build)
{ {
RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},0 }; RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},0 };
@ -82,10 +67,6 @@ VERSIONHELPERAPI IsWindowsVersionAnySP(DWORD major, DWORD minor, DWORD build)
VER_SERVICEPACKMAJOR, 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) { VERSIONHELPERAPI IsWindowsXPOrGreater(void) {
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0); return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0);
} }
@ -146,19 +127,11 @@ VERSIONHELPERAPI IsWindows11OrGreater(void) {
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0); 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) { VERSIONHELPERAPI IsWindowsServer(void) {
OSVERSIONINFOEXW vi = {sizeof(vi),0,0,0,0,{0},0,0,0,VER_NT_WORKSTATION}; 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)); 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) { VERSIONHELPERAPI IsWindowsXP(void) {
return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0); return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0);
} }
@ -227,10 +200,6 @@ VERSIONHELPERAPI IsWindows11(void) {
return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0); 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) { VERSIONHELPERAPI IsWine(void) {
return verhelp_wine_get_version() != NULL; return verhelp_wine_get_version() != NULL;
} }
@ -251,16 +220,4 @@ VERSIONHELPERAPI IsLinux(void) {
return sysname && _strcmpi(sysname, "Linux") == 0; 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 #endif

View file

@ -2,7 +2,6 @@
#define WINAPI_HOOKS_H #define WINAPI_HOOKS_H
#include <windows.h> #include <windows.h>
#include <vfw.h>
BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint); 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); 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); 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_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); LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex);
BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable); BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable);
BOOL WINAPI fake_DestroyWindow(HWND hWnd); BOOL WINAPI fake_DestroyWindow(HWND hWnd);
@ -35,15 +33,12 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D
BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg); 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_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl); 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); BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode);
LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); BOOL WINAPI fake_ValidateRect(HWND hWnd, const RECT* lpRect);
HWND WINAPI fake_SetParent(HWND hWndChild, HWND hWndNewParent); BOOL WINAPI fake_InvalidateRect(HWND hWnd, const RECT* lpRect, BOOL bErase);
HDC WINAPI fake_BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);
SHORT WINAPI fake_GetKeyState(int nVirtKey); SHORT WINAPI fake_GetKeyState(int nVirtKey);
SHORT WINAPI fake_GetAsyncKeyState(int vKey); SHORT WINAPI fake_GetAsyncKeyState(int vKey);
int WINAPI fake_GetDeviceCaps(HDC hdc, int index); int WINAPI fake_GetDeviceCaps(HDC hdc, int index);
int WINAPI fake_GetDeviceCaps_system(HDC hdc, int index);
BOOL WINAPI fake_StretchBlt( 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); HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop);
@ -65,9 +60,6 @@ int WINAPI fake_StretchDIBits(
HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA*); HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA*);
HFONT WINAPI fake_CreateFontA(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); 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_LoadLibraryA(LPCSTR lpLibFileName);
HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName);
@ -82,9 +74,6 @@ BOOL WINAPI fake_GetDiskFreeSpaceA(
LPDWORD lpNumberOfFreeClusters, LPDWORD lpNumberOfFreeClusters,
LPDWORD lpTotalNumberOfClusters); LPDWORD lpTotalNumberOfClusters);
DWORD WINAPI fake_GetVersion(void);
BOOL WINAPI fake_GetVersionExA(LPOSVERSIONINFOA lpVersionInformation);
HWND WINAPI fake_CreateWindowExA( HWND WINAPI fake_CreateWindowExA(
DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y,
int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);
@ -97,6 +86,4 @@ MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter(
LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);
PGETFRAME WINAPI fake_AVIStreamGetFrameOpen(PAVISTREAM pavi, LPBITMAPINFOHEADER lpbiWanted);
#endif #endif

View file

@ -12,15 +12,10 @@
#define WM_RESTORE_STYLE WM_APP+119 #define WM_RESTORE_STYLE WM_APP+119
#define IDT_TIMER_LEAVE_BNET 541287654 #define IDT_TIMER_LEAVE_BNET 541287654
#define IDT_TIMER_LINUX_FIX_WINDOW_SIZE 345267753
#define CNC_DDRAW_SET_FULLSCREEN 1 #define CNC_DDRAW_SET_FULLSCREEN 1
#define CNC_DDRAW_SET_WINDOWED 2 #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); LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
#endif #endif

6
res.rc
View file

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

View file

@ -14,11 +14,6 @@ HRESULT __stdcall IDirect3D__QueryInterface(IDirect3DImpl* This, REFIID riid, vo
HRESULT ret = E_FAIL; HRESULT ret = E_FAIL;
if (riid)
{
TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1);
}
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
} }
@ -56,20 +51,10 @@ HRESULT __stdcall IDirect3D__Initialize(IDirect3DImpl* This, int a)
return ret; return ret;
} }
HRESULT __stdcall IDirect3D__EnumDevices( HRESULT __stdcall IDirect3D__EnumDevices(IDirect3DImpl* This, int a, int b)
IDirect3DImpl* This,
LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
LPVOID lpUserArg)
{ {
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
HRESULT ret = S_OK; HRESULT ret = E_FAIL;
if (lpEnumDevicesCallback)
{
D3DDEVICEDESC desc = { 0 };
lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg);
}
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
} }

View file

@ -14,11 +14,6 @@ HRESULT __stdcall IDirect3D2__QueryInterface(IDirect3D2Impl* This, REFIID riid,
HRESULT ret = E_FAIL; HRESULT ret = E_FAIL;
if (riid)
{
TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1);
}
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
} }
@ -48,20 +43,10 @@ ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This)
return ret; return ret;
} }
HRESULT __stdcall IDirect3D2__EnumDevices( HRESULT __stdcall IDirect3D2__EnumDevices(IDirect3D2Impl* This, int a, int b)
IDirect3D2Impl* This,
LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
LPVOID lpUserArg)
{ {
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
HRESULT ret = S_OK; HRESULT ret = E_FAIL;
if (lpEnumDevicesCallback)
{
//D3DDEVICEDESC desc = { 0 };
//lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg);
}
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
} }

View file

@ -14,11 +14,6 @@ HRESULT __stdcall IDirect3D3__QueryInterface(IDirect3D3Impl* This, REFIID riid,
HRESULT ret = E_FAIL; HRESULT ret = E_FAIL;
if (riid)
{
TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1);
}
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
} }
@ -48,20 +43,10 @@ ULONG __stdcall IDirect3D3__Release(IDirect3D3Impl* This)
return ret; return ret;
} }
HRESULT __stdcall IDirect3D3__EnumDevices( HRESULT __stdcall IDirect3D3__EnumDevices(IDirect3D3Impl* This, int a, int b)
IDirect3D3Impl* This,
LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
LPVOID lpUserArg)
{ {
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
HRESULT ret = S_OK; HRESULT ret = E_FAIL;
if (lpEnumDevicesCallback)
{
//D3DDEVICEDESC desc = { 0 };
//lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg);
}
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
} }

View file

@ -14,11 +14,6 @@ HRESULT __stdcall IDirect3D7__QueryInterface(IDirect3D7Impl* This, REFIID riid,
HRESULT ret = E_FAIL; HRESULT ret = E_FAIL;
if (riid)
{
TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1);
}
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
} }
@ -48,20 +43,10 @@ ULONG __stdcall IDirect3D7__Release(IDirect3D7Impl* This)
return ret; return ret;
} }
HRESULT __stdcall IDirect3D7__EnumDevices( HRESULT __stdcall IDirect3D7__EnumDevices(IDirect3D7Impl* This, int a, int b)
IDirect3D7Impl* This,
LPD3DENUMDEVICESCALLBACK7 lpEnumDevicesCallback,
LPVOID lpUserArg)
{ {
TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
HRESULT ret = S_OK; HRESULT ret = E_FAIL;
if (lpEnumDevicesCallback)
{
//D3DDEVICEDESC7 desc = { 0 };
//lpEnumDevicesCallback("NULL", "NULL", &desc, lpUserArg);
}
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
} }

View file

@ -18,11 +18,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid
HRESULT ret = E_NOINTERFACE; HRESULT ret = E_NOINTERFACE;
if (!ppvObj) if (riid)
{
ret = E_INVALIDARG;
}
else if (riid)
{ {
if (IsEqualGUID(&IID_IDirectDraw2, riid) || if (IsEqualGUID(&IID_IDirectDraw2, riid) ||
IsEqualGUID(&IID_IDirectDraw4, riid) || IsEqualGUID(&IID_IDirectDraw4, riid) ||
@ -56,7 +52,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid
ret = S_OK; ret = S_OK;
} }
else if (IsEqualGUID(&IID_IDirect3D, riid)) else if (IsEqualGUID(&IID_IDirect3D, riid) && !g_config.direct3d_passthrough)
{ {
IDirect3DImpl* d3d = IDirect3DImpl* d3d =
(IDirect3DImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DImpl)); (IDirect3DImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DImpl));
@ -70,7 +66,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid
ret = S_OK; ret = S_OK;
} }
else if (IsEqualGUID(&IID_IDirect3D2, riid)) else if (IsEqualGUID(&IID_IDirect3D2, riid) && !g_config.direct3d_passthrough)
{ {
IDirect3D2Impl* d3d = IDirect3D2Impl* d3d =
(IDirect3D2Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D2Impl)); (IDirect3D2Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D2Impl));
@ -84,7 +80,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid
ret = S_OK; ret = S_OK;
} }
else if (IsEqualGUID(&IID_IDirect3D3, riid)) else if (IsEqualGUID(&IID_IDirect3D3, riid) && !g_config.direct3d_passthrough)
{ {
IDirect3D3Impl* d3d = IDirect3D3Impl* d3d =
(IDirect3D3Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D3Impl)); (IDirect3D3Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D3Impl));
@ -98,7 +94,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid
ret = S_OK; ret = S_OK;
} }
else if (IsEqualGUID(&IID_IDirect3D7, riid)) else if (IsEqualGUID(&IID_IDirect3D7, riid) && !g_config.direct3d_passthrough)
{ {
IDirect3D7Impl* d3d = IDirect3D7Impl* d3d =
(IDirect3D7Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D7Impl)); (IDirect3D7Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D7Impl));
@ -132,12 +128,6 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid
ret = S_OK; 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 else
{ {
TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1);
@ -328,18 +318,8 @@ HRESULT __stdcall IDirectDraw__EnumSurfaces(
LPVOID lpContext, LPVOID lpContext,
LPDDENUMSURFACESCALLBACK7 lpEnumSurfacesCallback) LPDDENUMSURFACESCALLBACK7 lpEnumSurfacesCallback)
{ {
TRACE( TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress());
"NOT_IMPLEMENTED -> %s(This=%p, dwFlags=%08X, lpDDSurfaceDesc=%p, lpContext=%p, lpEnumSurfacesCallback=%p) [%p]\n",
__FUNCTION__,
This,
dwFlags,
lpDDSurfaceDesc,
lpContext,
lpEnumSurfacesCallback,
_ReturnAddress());
HRESULT ret = DD_OK; HRESULT ret = DD_OK;
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
} }

View file

@ -14,12 +14,6 @@ HRESULT __stdcall IDirectDrawClipper__QueryInterface(IDirectDrawClipperImpl* Thi
_ReturnAddress()); _ReturnAddress());
HRESULT ret = E_NOINTERFACE; HRESULT ret = E_NOINTERFACE;
if (!ppvObj)
{
ret = E_INVALIDARG;
}
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
} }

View file

@ -13,12 +13,6 @@ HRESULT __stdcall IDirectDrawGammaControl__QueryInterface(IDirectDrawGammaContro
_ReturnAddress()); _ReturnAddress());
HRESULT ret = E_NOINTERFACE; HRESULT ret = E_NOINTERFACE;
if (!ppvObj)
{
ret = E_INVALIDARG;
}
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
} }

View file

@ -15,12 +15,6 @@ HRESULT __stdcall IDirectDrawPalette__QueryInterface(IDirectDrawPaletteImpl* Thi
_ReturnAddress()); _ReturnAddress());
HRESULT ret = E_NOINTERFACE; HRESULT ret = E_NOINTERFACE;
if (!ppvObj)
{
ret = E_INVALIDARG;
}
TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
return ret; return ret;
} }

View file

@ -11,11 +11,7 @@ HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* Thi
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) [%p]\n", __FUNCTION__, This, (unsigned int)riid, ppvObj, _ReturnAddress());
HRESULT ret = S_OK; HRESULT ret = S_OK;
if (!ppvObj) if (riid)
{
ret = E_INVALIDARG;
}
else if (riid)
{ {
if (IsEqualGUID(&IID_IDirectDrawSurface, riid) || if (IsEqualGUID(&IID_IDirectDrawSurface, riid) ||
IsEqualGUID(&IID_IDirectDrawSurface2, riid) || IsEqualGUID(&IID_IDirectDrawSurface2, riid) ||
@ -340,7 +336,7 @@ HRESULT __stdcall IDirectDrawSurface__GetDC(IDirectDrawSurfaceImpl* This, HDC FA
HRESULT __stdcall IDirectDrawSurface__GetFlipStatus(IDirectDrawSurfaceImpl* This, DWORD dwFlags) 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) [%p]\n", __FUNCTION__, This, _ReturnAddress());
HRESULT ret = DD_OK; HRESULT ret = DD_OK;
TRACE_EXT("<- %s\n", __FUNCTION__); TRACE_EXT("<- %s\n", __FUNCTION__);
return ret; return ret;

View file

@ -518,7 +518,7 @@ void blt_colorfill(
if (bpp == 8 || if (bpp == 8 ||
(bpp == 16 && (bpp == 16 &&
(color & 0xFF) == ((color >> 8) & 0xFF)) || (color & 0xFF) == ((color >> 8) & 0xFF)) ||
((bpp == 32 || bpp == 24) && (bpp == 32 &&
(color & 0xFF) == ((color >> 8) & 0xFF) && (color & 0xFF) == ((color >> 8) & 0xFF) &&
(color & 0xFF) == ((color >> 16) & 0xFF) && (color & 0xFF) == ((color >> 16) & 0xFF) &&
(color & 0xFF) == ((color >> 24) & 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 ); 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 * END OF MODULE: crc32.c
\*----------------------------------------------------------------------------*/ \*----------------------------------------------------------------------------*/

251
src/dd.c
View file

@ -6,7 +6,6 @@
#include "hook.h" #include "hook.h"
#include "config.h" #include "config.h"
#include "mouse.h" #include "mouse.h"
#include "keyboard.h"
#include "wndproc.h" #include "wndproc.h"
#include "render_d3d9.h" #include "render_d3d9.h"
#include "render_gdi.h" #include "render_gdi.h"
@ -28,7 +27,6 @@ HRESULT dd_EnumDisplayModes(
{ {
dbg_dump_edm_flags(dwFlags); dbg_dump_edm_flags(dwFlags);
DDSURFACEDESC2 s = { 0 };
DWORD bpp_filter = 0; DWORD bpp_filter = 0;
if (lpDDSurfaceDesc) if (lpDDSurfaceDesc)
@ -48,48 +46,12 @@ HRESULT dd_EnumDisplayModes(
bpp_filter = lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount; bpp_filter = lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount;
break; break;
} }
if ((lpDDSurfaceDesc->dwFlags & DDSD_WIDTH) && (lpDDSurfaceDesc->dwFlags & DDSD_HEIGHT))
{
TRACE(" dwWidth=%u, dwHeight=%u\n", lpDDSurfaceDesc->dwWidth, lpDDSurfaceDesc->dwHeight);
s.dwSize = sizeof(DDSURFACEDESC);
s.dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT;
s.dwRefreshRate = 60;
s.dwHeight = lpDDSurfaceDesc->dwHeight;
s.dwWidth = lpDDSurfaceDesc->dwWidth;
s.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
s.ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB;
s.ddpfPixelFormat.dwRGBBitCount = 8;
if (lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount == 16)
{
s.ddpfPixelFormat.dwFlags = DDPF_RGB;
s.ddpfPixelFormat.dwRGBBitCount = 16;
s.ddpfPixelFormat.dwRBitMask = 0xF800;
s.ddpfPixelFormat.dwGBitMask = 0x07E0;
s.ddpfPixelFormat.dwBBitMask = 0x001F;
}
else if (lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount == 32)
{
s.ddpfPixelFormat.dwFlags = DDPF_RGB;
s.ddpfPixelFormat.dwRGBBitCount = 32;
s.ddpfPixelFormat.dwRBitMask = 0xFF0000;
s.ddpfPixelFormat.dwGBitMask = 0x00FF00;
s.ddpfPixelFormat.dwBBitMask = 0x0000FF;
}
s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3;
lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext);
return DD_OK;
}
} }
} }
DWORD i = 0; DWORD i = 0;
DWORD res_count = 0; DWORD res_count = 0;
DDSURFACEDESC2 s;
/* Some games crash when you feed them with too many resolutions so we have to keep the list short */ /* Some games crash when you feed them with too many resolutions so we have to keep the list short */
@ -113,11 +75,6 @@ HRESULT dd_EnumDisplayModes(
while (--max_w % 8); while (--max_w % 8);
} }
char* ires = &g_config.inject_resolution[0];
unsigned long custom_width = strtoul(ires, &ires, 0);
unsigned long custom_height = strtoul(ires + 1, &ires, 0);
BOOL rlf = g_config.resolutions == RESLIST_FULL; BOOL rlf = g_config.resolutions == RESLIST_FULL;
BOOL rlm = g_config.resolutions == RESLIST_MINI; BOOL rlm = g_config.resolutions == RESLIST_MINI;
@ -154,7 +111,7 @@ HRESULT dd_EnumDisplayModes(
{ rlf ? 1720 : 0, rlf ? 720 : 0 }, { rlf ? 1720 : 0, rlf ? 720 : 0 },
{ rlf ? 2560 : 0, rlf ? 1080 : 0 }, { rlf ? 2560 : 0, rlf ? 1080 : 0 },
/* Inject custom resolution */ /* Inject custom resolution */
{ custom_width, custom_height }, { g_config.custom_width, g_config.custom_height },
{ max_w, max_h }, { max_w, max_h },
}; };
@ -167,8 +124,7 @@ HRESULT dd_EnumDisplayModes(
} }
} }
if (((g_ddraw.bpp && !g_ddraw.windowed_hack) && g_config.resolutions == RESLIST_NORMAL) || if ((g_ddraw.bpp && g_config.resolutions == RESLIST_NORMAL) || g_config.resolutions == RESLIST_FULL)
g_config.resolutions == RESLIST_FULL)
{ {
TRACE(" g_ddraw.bpp=%u\n", g_ddraw.bpp); TRACE(" g_ddraw.bpp=%u\n", g_ddraw.bpp);
@ -233,10 +189,10 @@ HRESULT dd_EnumDisplayModes(
while (--m.dmPelsWidth % 8); while (--m.dmPelsWidth % 8);
} }
if (!custom_res_injected && custom_width && custom_height) if (!custom_res_injected && g_config.custom_width && g_config.custom_height)
{ {
m.dmPelsWidth = custom_width; m.dmPelsWidth = g_config.custom_width;
m.dmPelsHeight = custom_height; m.dmPelsHeight = g_config.custom_height;
custom_res_injected = TRUE; custom_res_injected = TRUE;
} }
@ -345,14 +301,14 @@ HRESULT dd_EnumDisplayModes(
} }
} }
if (!g_ddraw.bpp || g_config.resolutions != RESLIST_NORMAL || g_ddraw.windowed_hack) if (!g_ddraw.bpp || g_config.resolutions != RESLIST_NORMAL)
{ {
for (i = 0; i < sizeof(resolutions) / sizeof(resolutions[0]); i++) for (i = 0; i < sizeof(resolutions) / sizeof(resolutions[0]); i++)
{ {
if (!resolutions[i].cx || !resolutions[i].cy) if (!resolutions[i].cx || !resolutions[i].cy)
continue; continue;
if (!(resolutions[i].cx == custom_width && resolutions[i].cy == custom_height) && if (!(resolutions[i].cx == g_config.custom_width && resolutions[i].cy == g_config.custom_height) &&
((max_w && resolutions[i].cx > max_w) || (max_h && resolutions[i].cy > max_h))) ((max_w && resolutions[i].cx > max_w) || (max_h && resolutions[i].cy > max_h)))
{ {
DEVMODE m; DEVMODE m;
@ -492,18 +448,7 @@ HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps)
lpDDDriverCaps->dwVidMemTotal = 16777216; lpDDDriverCaps->dwVidMemTotal = 16777216;
lpDDDriverCaps->dwVidMemFree = 16777216; lpDDDriverCaps->dwVidMemFree = 16777216;
lpDDDriverCaps->ddsCaps.dwCaps = DDSCAPS_FLIP;
lpDDDriverCaps->ddsCaps.dwCaps =
DDSCAPS_BACKBUFFER |
DDSCAPS_COMPLEX |
DDSCAPS_FLIP |
DDSCAPS_FRONTBUFFER |
DDSCAPS_OFFSCREENPLAIN |
DDSCAPS_PRIMARYSURFACE |
DDSCAPS_VIDEOMEMORY |
DDSCAPS_OWNDC |
DDSCAPS_LOCALVIDMEM |
DDSCAPS_NONLOCALVIDMEM;
} }
if (lpDDEmulCaps) if (lpDDEmulCaps)
@ -518,7 +463,6 @@ HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps)
memset(lpDDEmulCaps, 0, size); memset(lpDDEmulCaps, 0, size);
lpDDEmulCaps->dwSize = size; lpDDEmulCaps->dwSize = size;
lpDDEmulCaps->dwCaps = DDCAPS_BLTSTRETCH;
} }
return DD_OK; return DD_OK;
@ -560,7 +504,7 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc)
lpDDSurfaceDesc->dwWidth = width; lpDDSurfaceDesc->dwWidth = width;
lpDDSurfaceDesc->dwHeight = height; lpDDSurfaceDesc->dwHeight = height;
if (bpp == 32 || bpp == 24) if (bpp == 32)
{ {
lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB;
lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xFF0000; lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xFF0000;
@ -595,29 +539,6 @@ HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq)
return DD_OK; return DD_OK;
} }
HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB)
{
if (!lpbIsInVB)
return DDERR_INVALIDPARAMS;
static DWORD last_vb;
DWORD tick = GetTickCount();
if (last_vb + 16 > tick)
{
*lpbIsInVB = FALSE;
}
else
{
last_vb = tick;
*lpbIsInVB = TRUE;
}
TRACE(" lpbIsInVB = %s\n", *lpbIsInVB ? "TRUE" : "FALSE");
return DD_OK;
}
HRESULT dd_RestoreDisplayMode() HRESULT dd_RestoreDisplayMode()
{ {
if (!g_ddraw.render.run) if (!g_ddraw.render.run)
@ -649,8 +570,6 @@ HRESULT dd_RestoreDisplayMode()
} }
} }
//real_ShowWindow(g_ddraw.hwnd, SW_MINIMIZE);
return DD_OK; return DD_OK;
} }
@ -711,14 +630,9 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
g_ddraw.render.height = g_config.window_rect.bottom; g_ddraw.render.height = g_config.window_rect.bottom;
/* temporary fix: center window for games that keep changing their resolution */ /* temporary fix: center window for games that keep changing their resolution */
if (g_config.center_window && if ((g_ddraw.width || g_config.infantryhack) &&
(g_ddraw.width || g_config.infantryhack || g_config.center_window == CENTER_WINDOW_ALWAYS) &&
(g_ddraw.width != dwWidth || g_ddraw.height != dwHeight) && (g_ddraw.width != dwWidth || g_ddraw.height != dwHeight) &&
( (dwWidth > g_config.window_rect.right || dwHeight > g_config.window_rect.bottom))
dwWidth > g_config.window_rect.right ||
dwHeight > g_config.window_rect.bottom ||
g_config.center_window == CENTER_WINDOW_ALWAYS)
)
{ {
g_config.window_rect.left = -32000; g_config.window_rect.left = -32000;
g_config.window_rect.top = -32000; g_config.window_rect.top = -32000;
@ -728,8 +642,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
g_ddraw.height = dwHeight; g_ddraw.height = dwHeight;
g_ddraw.bpp = dwBPP; g_ddraw.bpp = dwBPP;
InterlockedExchange((LONG*)&g_ddraw.cursor.x, dwWidth / 2); //InterlockedExchange((LONG*)&g_ddraw.cursor.x, dwWidth / 2);
InterlockedExchange((LONG*)&g_ddraw.cursor.y, dwHeight / 2); //InterlockedExchange((LONG*)&g_ddraw.cursor.y, dwHeight / 2);
BOOL border = g_config.border; BOOL border = g_config.border;
BOOL nonexclusive = FALSE; BOOL nonexclusive = FALSE;
@ -890,7 +804,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
g_config.windowed = TRUE; g_config.windowed = TRUE;
g_config.fullscreen = TRUE; g_config.fullscreen = TRUE;
g_config.toggle_borderless = TRUE;
border = FALSE; border = FALSE;
/* prevent OpenGL from going automatically into fullscreen exclusive mode */ /* prevent OpenGL from going automatically into fullscreen exclusive mode */
@ -928,12 +841,15 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
if (g_config.boxing) if (g_config.boxing)
{ {
g_ddraw.render.viewport.width = g_ddraw.width;
g_ddraw.render.viewport.height = g_ddraw.height;
for (int i = 20; i-- > 1;) for (int i = 20; i-- > 1;)
{ {
if (g_ddraw.width * i <= g_ddraw.render.width && g_ddraw.height * i <= g_ddraw.render.height) if (g_ddraw.width * i <= g_ddraw.render.width && g_ddraw.height * i <= g_ddraw.render.height)
{ {
g_ddraw.render.viewport.width = i * g_ddraw.width; g_ddraw.render.viewport.width *= i;
g_ddraw.render.viewport.height = i * g_ddraw.height; g_ddraw.render.viewport.height *= i;
break; break;
} }
} }
@ -943,22 +859,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
} }
else if (g_config.maintas) else if (g_config.maintas)
{ {
double dst_ar; double dst_ar = (double)g_ddraw.height / g_ddraw.width;
double src_ar = (double)g_ddraw.render.height / g_ddraw.render.width;; double src_ar = (double)g_ddraw.render.height / g_ddraw.render.width;
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;
}
g_ddraw.render.viewport.width = g_ddraw.render.width; g_ddraw.render.viewport.width = g_ddraw.render.width;
g_ddraw.render.viewport.height = (int)round(dst_ar * g_ddraw.render.viewport.width); g_ddraw.render.viewport.height = (int)round(dst_ar * g_ddraw.render.viewport.width);
@ -1035,15 +937,9 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) if (g_config.remove_menu && GetMenu(g_ddraw.hwnd))
SetMenu(g_ddraw.hwnd, NULL); SetMenu(g_ddraw.hwnd, NULL);
if (!g_config.fix_not_responding && if (!IsWine())
g_ddraw.last_msg_pull_tick &&
g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() &&
GetCurrentThreadId() == g_ddraw.gui_thread_id &&
!IsWine())
{ {
/* workaround for "Not Responding" window problem in cnc games */ MSG msg; /* workaround for "Not Responding" window problem in cnc games */
g_ddraw.last_msg_pull_tick = timeGetTime();
MSG msg;
real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT);
} }
@ -1062,12 +958,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
g_ddraw.hwnd, g_ddraw.hwnd,
GWL_STYLE, GWL_STYLE,
(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE)); (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE));
DWORD class_sytle = GetClassLongA(g_ddraw.hwnd, GCL_STYLE);
if (class_sytle & CS_NOCLOSE)
{
SetClassLongA(g_ddraw.hwnd, GCL_STYLE, class_sytle & ~CS_NOCLOSE);
}
} }
LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE);
@ -1084,14 +974,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE));
} }
if (IsWine()) if (!g_config.wine_allow_resize && IsWine())
{ {
LONG remove_flags = !g_config.resizable ? (WS_MAXIMIZEBOX | WS_THICKFRAME) : 0;
real_SetWindowLongA( real_SetWindowLongA(
g_ddraw.hwnd, g_ddraw.hwnd,
GWL_STYLE, GWL_STYLE,
(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(remove_flags)); (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX | WS_THICKFRAME));
} }
/* center the window with correct dimensions */ /* center the window with correct dimensions */
@ -1167,7 +1055,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
if (GetMenu(g_ddraw.hwnd)) if (GetMenu(g_ddraw.hwnd))
{ {
if (1) // g_config.remove_menu || !g_config.nonexclusive) if (g_config.remove_menu || !g_config.nonexclusive)
{ {
SetMenu(g_ddraw.hwnd, NULL); SetMenu(g_ddraw.hwnd, NULL);
} }
@ -1254,7 +1142,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
g_ddraw.render.run = FALSE; g_ddraw.render.run = FALSE;
g_config.windowed = TRUE; g_config.windowed = TRUE;
g_config.fullscreen = TRUE; g_config.fullscreen = TRUE;
g_config.toggle_borderless = TRUE;
return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags);
} }
@ -1262,7 +1149,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
Fix wayland bug: Fix wayland bug:
ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed
*/ */
if (IsWine() && !IsSteamDeck() && if (IsWine() &&
(g_ddraw.render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || (g_ddraw.render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) ||
g_ddraw.render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) g_ddraw.render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN)))
{ {
@ -1271,7 +1158,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
g_ddraw.render.run = FALSE; g_ddraw.render.run = FALSE;
g_config.windowed = TRUE; g_config.windowed = TRUE;
g_config.fullscreen = TRUE; g_config.fullscreen = TRUE;
g_config.toggle_borderless = TRUE;
return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags);
} }
} }
@ -1341,8 +1227,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
DWORD tid; g_ddraw.render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_ddraw.renderer, NULL, 0, NULL);
g_ddraw.render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_ddraw.renderer, NULL, 0, &tid);
SetThreadPriority(g_ddraw.render.thread, THREAD_PRIORITY_ABOVE_NORMAL); SetThreadPriority(g_ddraw.render.thread, THREAD_PRIORITY_ABOVE_NORMAL);
} }
@ -1352,21 +1237,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
real_SendMessageA(g_ddraw.hwnd, WM_DISPLAYCHANGE_DDRAW, g_ddraw.bpp, MAKELPARAM(g_ddraw.width, g_ddraw.height)); real_SendMessageA(g_ddraw.hwnd, WM_DISPLAYCHANGE_DDRAW, g_ddraw.bpp, MAKELPARAM(g_ddraw.width, g_ddraw.height));
} }
TRACE(
" render res=%ux%u (viewport res=%ux%u, x=%d, y=%d)\n",
g_ddraw.render.width,
g_ddraw.render.height,
g_ddraw.render.viewport.width,
g_ddraw.render.viewport.height,
g_ddraw.render.viewport.x,
g_ddraw.render.viewport.y);
TRACE(
" windowed=%s, fullscreen=%s, adjmouse=%s\n",
g_config.windowed ? "true" : "false",
g_config.fullscreen ? "true" : "false",
g_config.adjmouse ? "true" : "false");
return DD_OK; return DD_OK;
} }
@ -1402,8 +1272,6 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags)
g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc); g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc);
g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL); g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL);
keyboard_hook_init();
if (!g_ddraw.render.hdc) if (!g_ddraw.render.hdc)
{ {
g_ddraw.render.hdc = GetDC(g_ddraw.hwnd); g_ddraw.render.hdc = GetDC(g_ddraw.hwnd);
@ -1426,7 +1294,10 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags)
if (!g_config.devmode) if (!g_config.devmode)
{ {
InterlockedExchange((LONG*)&g_ddraw.old_cursor, (LONG)real_SetCursor(LoadCursor(NULL, IDC_ARROW))); HCURSOR cursor = real_SetCursor(LoadCursor(NULL, IDC_ARROW));
if (cursor != LoadCursor(NULL, IDC_WAIT))
InterlockedExchange((LONG*)&g_ddraw.old_cursor, (LONG)cursor);
} }
int cursor_count = real_ShowCursor(TRUE) - 1; int cursor_count = real_ShowCursor(TRUE) - 1;
@ -1530,7 +1401,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags)
} }
} }
if ((dwFlags & DDSCL_NORMAL) && !(dwFlags & DDSCL_FULLSCREEN)) if (dwFlags & DDSCL_NORMAL)
{ {
if (g_config.fake_mode[0]) if (g_config.fake_mode[0])
{ {
@ -1542,25 +1413,6 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags)
dd_SetDisplayMode(width, height, bpp, 0); dd_SetDisplayMode(width, height, bpp, 0);
} }
else if (!g_ddraw.width)
{
RECT rc = { 0 };
real_GetClientRect(hwnd, &rc);
BOOL popup = real_GetWindowLongA(hwnd, GWL_STYLE) & WS_POPUP;
if ((rc.right < real_GetSystemMetrics(SM_CXSCREEN) && rc.bottom < real_GetSystemMetrics(SM_CYSCREEN)) || !popup)
{
TRACE(" client rect=%dx%d\n", rc.right, rc.bottom);
g_ddraw.windowed_hack = TRUE;
dd_SetDisplayMode(rc.right, rc.bottom, 16, 0);
}
}
}
else
{
g_ddraw.windowed_hack = FALSE;
} }
return DD_OK; return DD_OK;
@ -1570,8 +1422,17 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent)
{ {
if (g_config.maxgameticks == -2) if (g_config.maxgameticks == -2)
{ {
if (fpsl_wait_for_vblank()) /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */
return DD_OK; if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater())
{
if (fpsl_wait_for_vblank())
return DD_OK;
}
else
{
if (fpsl_dwm_flush() || fpsl_wait_for_vblank())
return DD_OK;
}
} }
if (!g_ddraw.flip_limiter.tick_length) if (!g_ddraw.flip_limiter.tick_length)
@ -1704,9 +1565,9 @@ ULONG dd_Release()
DeleteCriticalSection(&g_ddraw.cs); DeleteCriticalSection(&g_ddraw.cs);
if (g_ddraw.hwnd && IsWindow(g_ddraw.hwnd)) /* restore old wndproc, subsequent ddraw creation will otherwise fail */
if (g_ddraw.hwnd)
{ {
/* restore old wndproc, subsequent ddraw creation will otherwise fail */
real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)g_ddraw.wndproc); real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)g_ddraw.wndproc);
} }
@ -1735,6 +1596,14 @@ HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpd
return DD_OK; return DD_OK;
} }
HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB)
{
if (lpbIsInVB)
*lpbIsInVB = TRUE;
return DD_OK;
}
HRESULT dd_TestCooperativeLevel() HRESULT dd_TestCooperativeLevel()
{ {
if (g_config.limiter_type == LIMIT_TESTCOOP && g_ddraw.ticks_limiter.tick_length > 0) if (g_config.limiter_type == LIMIT_TESTCOOP && g_ddraw.ticks_limiter.tick_length > 0)
@ -1828,17 +1697,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute
if (g_config.singlecpu) if (g_config.singlecpu)
{ {
if (!IsWine() && IsWindows11Version24H2OrGreater()) SetProcessAffinityMask(proc, 1);
{
if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity))
SetProcessAffinityMask(proc, system_affinity);
util_set_process_affinity();
}
else
{
SetProcessAffinityMask(proc, 1);
}
} }
else if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) else if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity))
{ {

View file

@ -3,7 +3,6 @@
#include "IDirectDrawClipper.h" #include "IDirectDrawClipper.h"
#include "ddclipper.h" #include "ddclipper.h"
#include "debug.h" #include "debug.h"
#include "dd.h"
HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSiz) HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSiz)
@ -169,12 +168,6 @@ HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd)
*/ */
This->hwnd = hWnd; 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); LeaveCriticalSection(&This->cs);
return DD_OK; return DD_OK;
} }

View file

@ -14,15 +14,11 @@ HRESULT ddp_GetEntries(
DWORD dwNumEntries, DWORD dwNumEntries,
LPPALETTEENTRY lpEntries) LPPALETTEENTRY lpEntries)
{ {
if (!lpEntries) for (int i = dwBase, x = 0; i < dwBase + dwNumEntries; i++, x++)
return DDERR_INVALIDPARAMS;
for (int i = dwBase, x = 0; i < dwBase + dwNumEntries && i < 256; i++, x++)
{ {
lpEntries[x].peRed = This->data_rgb[i].rgbRed; lpEntries[x].peRed = This->data_rgb[i].rgbRed;
lpEntries[x].peGreen = This->data_rgb[i].rgbGreen; lpEntries[x].peGreen = This->data_rgb[i].rgbGreen;
lpEntries[x].peBlue = This->data_rgb[i].rgbBlue; lpEntries[x].peBlue = This->data_rgb[i].rgbBlue;
lpEntries[x].peFlags = 0;
} }
return DD_OK; return DD_OK;
@ -35,17 +31,7 @@ HRESULT ddp_SetEntries(
DWORD dwCount, DWORD dwCount,
LPPALETTEENTRY lpEntries) LPPALETTEENTRY lpEntries)
{ {
if (!lpEntries) for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount; i++, x++)
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++)
{ {
This->data_bgr[i] = (lpEntries[x].peBlue << 16) | (lpEntries[x].peGreen << 8) | lpEntries[x].peRed; This->data_bgr[i] = (lpEntries[x].peBlue << 16) | (lpEntries[x].peGreen << 8) | lpEntries[x].peRed;
@ -71,17 +57,6 @@ HRESULT ddp_SetEntries(
This->data_rgb[255].rgbReserved = 0; This->data_rgb[255].rgbReserved = 0;
} }
if ((dwFlags & DDPCAPS_REFRESH_CHANGED_ONLY))
{
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) if (g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette == This && g_ddraw.render.run)
{ {
InterlockedExchange(&g_ddraw.render.palette_updated, TRUE); InterlockedExchange(&g_ddraw.render.palette_updated, TRUE);

View file

@ -12,10 +12,7 @@
#include "blt.h" #include "blt.h"
#include "config.h" #include "config.h"
#include "ddclipper.h" #include "ddclipper.h"
#include "utils.h"
#include "versionhelpers.h" #include "versionhelpers.h"
#include "ddpalette.h"
#include "palette.h"
LONG g_dds_gdi_handles; LONG g_dds_gdi_handles;
@ -50,20 +47,9 @@ HRESULT dds_Blt(
DWORD dwFlags, DWORD dwFlags,
LPDDBLTFX lpDDBltFx) 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_flags(dwFlags);
dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0); dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0);
util_pull_messages();
if (g_ddraw.ref && if (g_ddraw.ref &&
g_ddraw.iskkndx && g_ddraw.iskkndx &&
(dwFlags & DDBLT_COLORFILL) && (dwFlags & DDBLT_COLORFILL) &&
@ -85,16 +71,10 @@ HRESULT dds_Blt(
RECT dst_rect = { 0, 0, This->width, This->height }; RECT dst_rect = { 0, 0, This->width, This->height };
if (lpSrcRect && src_surface) if (lpSrcRect && src_surface)
{ memcpy(&src_rect, lpSrcRect, sizeof(src_rect));
//dbg_print_rect("lpSrcRect", lpSrcRect);
src_rect = *lpSrcRect;
}
if (lpDestRect) if (lpDestRect)
{ memcpy(&dst_rect, lpDestRect, sizeof(dst_rect));
//dbg_print_rect("lpDestRect", lpDestRect);
dst_rect = *lpDestRect;
}
int src_w = src_rect.right - src_rect.left; int src_w = src_rect.right - src_rect.left;
int src_h = src_rect.bottom - src_rect.top; int src_h = src_rect.bottom - src_rect.top;
@ -236,11 +216,6 @@ HRESULT dds_Blt(
if (dst_buf && (dwFlags & DDBLT_COLORFILL) && lpDDBltFx && dst_w > 0 && dst_h > 0) 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( blt_colorfill(
dst_buf, dst_buf,
dst_x, dst_x,
@ -264,10 +239,7 @@ HRESULT dds_Blt(
BOOL mirror_left_right = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORLEFTRIGHT); BOOL mirror_left_right = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORLEFTRIGHT);
BOOL mirror_up_down = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORUPDOWN); BOOL mirror_up_down = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORUPDOWN);
if (This->bpp != src_surface->bpp || if (This->bpp != src_surface->bpp)
This->bpp == 24 ||
src_surface->bpp == 24 ||
(is_stretch_blt && This == src_surface))
{ {
TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp); TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp);
@ -277,13 +249,13 @@ HRESULT dds_Blt(
HDC src_dc; HDC src_dc;
dds_GetDC(src_surface, &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 = UINT color =
(dwFlags & DDBLT_KEYSRCOVERRIDE) ? (dwFlags & DDBLT_KEYSRCOVERRIDE) ?
lpDDBltFx->ddckSrcColorkey.dwColorSpaceLowValue : src_surface->color_key.dwColorSpaceLowValue; 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; color = color & 0xFFFFFF;
} }
@ -335,7 +307,7 @@ HRESULT dds_Blt(
*/ */
} }
else if ( else if (
((dwFlags & DDBLT_KEYSRC) && (src_surface->flags & DDSD_CKSRCBLT)) || (dwFlags & DDBLT_KEYSRC) ||
(dwFlags & DDBLT_KEYSRCOVERRIDE) || (dwFlags & DDBLT_KEYSRCOVERRIDE) ||
mirror_left_right || mirror_left_right ||
mirror_up_down) mirror_up_down)
@ -446,8 +418,10 @@ HRESULT dds_Blt(
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run)
{ {
if (!(dwFlags & DDBLT_COLORFILL))
InterlockedExchange(&g_ddraw.zoom.frame_skip, 0);
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
InterlockedExchange(&g_ddraw.render.screen_updated, TRUE);
if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime()) if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime())
{ {
@ -456,7 +430,7 @@ HRESULT dds_Blt(
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
SwitchToThread(); 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.dds_unlock_limiter_disabled = TRUE;
util_limit_game_ticks(); util_limit_game_ticks();
@ -482,10 +456,7 @@ HRESULT dds_BltFast(
RECT src_rect = { 0, 0, src_surface ? src_surface->width : 0, src_surface ? src_surface->height : 0 }; RECT src_rect = { 0, 0, src_surface ? src_surface->width : 0, src_surface ? src_surface->height : 0 };
if (lpSrcRect && src_surface) if (lpSrcRect && src_surface)
{ memcpy(&src_rect, lpSrcRect, sizeof(src_rect));
//dbg_print_rect("lpSrcRect", lpSrcRect);
src_rect = *lpSrcRect;
}
int dst_x = dwX; int dst_x = dwX;
int dst_y = dwY; int dst_y = dwY;
@ -569,9 +540,7 @@ HRESULT dds_BltFast(
if (src_surface && dst_w > 0 && dst_h > 0) if (src_surface && dst_w > 0 && dst_h > 0)
{ {
if (This->bpp != src_surface->bpp || if (This->bpp != src_surface->bpp)
This->bpp == 24 ||
src_surface->bpp == 24)
{ {
TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp); TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp);
@ -581,11 +550,11 @@ HRESULT dds_BltFast(
HDC src_dc; HDC src_dc;
dds_GetDC(src_surface, &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; UINT color = src_surface->color_key.dwColorSpaceLowValue;
if (src_surface->bpp == 32 || src_surface->bpp == 24) if (src_surface->bpp == 32)
{ {
color = color & 0xFFFFFF; color = color & 0xFFFFFF;
} }
@ -634,7 +603,7 @@ HRESULT dds_BltFast(
SRCCOPY); SRCCOPY);
*/ */
} }
else if ((dwFlags & DDBLTFAST_SRCCOLORKEY) && (src_surface->flags & DDSD_CKSRCBLT)) else if (dwFlags & DDBLTFAST_SRCCOLORKEY)
{ {
blt_colorkey( blt_colorkey(
dst_buf, dst_buf,
@ -686,7 +655,6 @@ HRESULT dds_BltFast(
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run)
{ {
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
InterlockedExchange(&g_ddraw.render.screen_updated, TRUE);
DWORD time = timeGetTime(); DWORD time = timeGetTime();
@ -733,7 +701,8 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur
DDSD_WIDTH | DDSD_WIDTH |
DDSD_HEIGHT | DDSD_HEIGHT |
DDSD_PITCH | DDSD_PITCH |
DDSD_PIXELFORMAT; DDSD_PIXELFORMAT |
DDSD_LPSURFACE;
lpDDSurfaceDesc->dwWidth = This->width; lpDDSurfaceDesc->dwWidth = This->width;
lpDDSurfaceDesc->dwHeight = This->height; lpDDSurfaceDesc->dwHeight = This->height;
@ -767,7 +736,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur
lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x07E0; lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x07E0;
lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x001F; lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x001F;
} }
else if (This->bpp == 32 || This->bpp == 24) else if (This->bpp == 32)
{ {
lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xFF0000; lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xFF0000;
lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x00FF00; lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x00FF00;
@ -844,7 +813,6 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa
This->last_flip_tick = timeGetTime(); This->last_flip_tick = timeGetTime();
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
InterlockedExchange(&g_ddraw.render.screen_updated, TRUE);
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
SwitchToThread(); SwitchToThread();
@ -853,7 +821,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa
dd_WaitForVerticalBlank(DDWAITVB_BLOCKEND, NULL); 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.dds_unlock_limiter_disabled = TRUE;
util_limit_game_ticks(); util_limit_game_ticks();
@ -909,11 +877,6 @@ HRESULT dds_GetClipper(IDirectDrawSurfaceImpl* This, IDirectDrawClipperImpl** lp
HRESULT dds_GetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey) HRESULT dds_GetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey)
{ {
if (!(This->flags & DDSD_CKSRCBLT))
{
return DDERR_NOCOLORKEY;
}
if (dwFlags != DDCKEY_SRCBLT || !lpColorKey) if (dwFlags != DDCKEY_SRCBLT || !lpColorKey)
{ {
TRACE(" NOT_IMPLEMENTED dwFlags=%08X, lpColorKey=%p\n", dwFlags, lpColorKey); TRACE(" NOT_IMPLEMENTED dwFlags=%08X, lpColorKey=%p\n", dwFlags, lpColorKey);
@ -954,9 +917,6 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC)
if (lpHDC) if (lpHDC)
*lpHDC = dc; *lpHDC = dc;
if (!(This->caps & DDSCAPS_OWNDC))
InterlockedExchange((LONG*)&This->dc_state, SaveDC(dc));
return DD_OK; return DD_OK;
} }
@ -998,7 +958,7 @@ HRESULT dds_GetPixelFormat(IDirectDrawSurfaceImpl* This, LPDDPIXELFORMAT ddpfPix
ddpfPixelFormat->dwGBitMask = 0x07E0; ddpfPixelFormat->dwGBitMask = 0x07E0;
ddpfPixelFormat->dwBBitMask = 0x001F; ddpfPixelFormat->dwBBitMask = 0x001F;
} }
else if (This->bpp == 32 || This->bpp == 24) else if (This->bpp == 32)
{ {
ddpfPixelFormat->dwRBitMask = 0xFF0000; ddpfPixelFormat->dwRBitMask = 0xFF0000;
ddpfPixelFormat->dwGBitMask = 0x00FF00; ddpfPixelFormat->dwGBitMask = 0x00FF00;
@ -1023,7 +983,11 @@ HRESULT dds_Lock(
dbg_dump_dds_lock_flags(dwFlags); dbg_dump_dds_lock_flags(dwFlags);
util_pull_messages(); if (g_ddraw.ref && g_config.fixnotresponding && !IsWine())
{
MSG msg; /* workaround for "Not Responding" window problem */
real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE);
}
HRESULT ret = dds_GetSurfaceDesc(This, lpDDSurfaceDesc); HRESULT ret = dds_GetSurfaceDesc(This, lpDDSurfaceDesc);
@ -1053,7 +1017,6 @@ 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.ref && g_ddraw.render.run)
{ {
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
InterlockedExchange(&g_ddraw.render.screen_updated, TRUE);
DWORD time = timeGetTime(); DWORD time = timeGetTime();
@ -1064,9 +1027,6 @@ HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC)
} }
} }
if (!(This->caps & DDSCAPS_OWNDC))
RestoreDC(hDC, InterlockedExchangeAdd((LONG*)&This->dc_state, 0));
return DD_OK; return DD_OK;
} }
@ -1119,13 +1079,11 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKE
HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpDDPalette) HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpDDPalette)
{ {
if (This->bpp != 8)
return DDERR_INVALIDPIXELFORMAT;
if (lpDDPalette) if (lpDDPalette)
IDirectDrawPalette_AddRef(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.ref)
{ {
@ -1144,9 +1102,6 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD
This->palette = lpDDPalette; This->palette = lpDDPalette;
} }
if (old_palette)
IDirectDrawPalette_Release(old_palette);
return DD_OK; return DD_OK;
} }
@ -1239,7 +1194,6 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run)
{ {
InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); InterlockedExchange(&g_ddraw.render.surface_updated, TRUE);
InterlockedExchange(&g_ddraw.render.screen_updated, TRUE);
DWORD time = timeGetTime(); DWORD time = timeGetTime();
@ -1248,12 +1202,8 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect)
{ {
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
if (g_ddraw.ticks_limiter.tick_length > 0 && if (g_ddraw.ticks_limiter.tick_length > 0 && !g_ddraw.ticks_limiter.dds_unlock_limiter_disabled)
g_config.limiter_type != LIMIT_PEEKMESSAGE &&
(!g_ddraw.ticks_limiter.dds_unlock_limiter_disabled || g_config.limiter_type == LIMIT_UNLOCK))
{
util_limit_game_ticks(); util_limit_game_ticks();
}
} }
} }
@ -1329,8 +1279,7 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD
This->bpp = 16; This->bpp = 16;
break; break;
case 24: case 24:
This->bpp = 24; TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount);
break;
case 32: case 32:
This->bpp = 32; This->bpp = 32;
break; break;
@ -1443,8 +1392,7 @@ HRESULT dd_CreateSurface(
dst_surface->bpp = 16; dst_surface->bpp = 16;
break; break;
case 24: case 24:
dst_surface->bpp = 24; TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount);
break;
case 32: case 32:
dst_surface->bpp = 32; dst_surface->bpp = 32;
break; break;
@ -1468,8 +1416,8 @@ HRESULT dd_CreateSurface(
dst_surface->caps |= DDSCAPS_VISIBLE; dst_surface->caps |= DDSCAPS_VISIBLE;
dst_surface->width = g_ddraw.width == 0 ? 1024 : g_ddraw.width; dst_surface->width = g_ddraw.width;
dst_surface->height = g_ddraw.height == 0 ? 768 : g_ddraw.height; dst_surface->height = g_ddraw.height;
} }
else else
{ {
@ -1498,24 +1446,23 @@ HRESULT dd_CreateSurface(
DWORD aligned_width = dst_surface->pitch / dst_surface->bytes_pp; 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); 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.biSize = sizeof(BITMAPINFOHEADER);
dst_surface->bmi->bmiHeader.biWidth = aligned_width; dst_surface->bmi->bmiHeader.biWidth = aligned_width;
dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + g_config.guard_lines); dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + g_config.guard_lines);
dst_surface->bmi->bmiHeader.biPlanes = 1; dst_surface->bmi->bmiHeader.biPlanes = 1;
dst_surface->bmi->bmiHeader.biBitCount = dst_surface->bpp; 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); WORD clr_bits = (WORD)(dst_surface->bmi->bmiHeader.biPlanes * dst_surface->bmi->bmiHeader.biBitCount);
dst_surface->bmi->bmiHeader.biClrUsed = if (clr_bits < 24)
dst_surface->bpp == 8 ? 256 : {
dst_surface->bpp == 16 ? 3 : dst_surface->bmi->bmiHeader.biClrUsed = (1 << clr_bits);
dst_surface->bpp == 24 ? 0 : }
dst_surface->bpp == 32 ? 0 :
0;
dst_surface->bmi->bmiHeader.biSizeImage = dst_surface->bmi->bmiHeader.biSizeImage =
((aligned_width * clr_bits + 63) & ~63) / 8 * dst_surface->height; ((aligned_width * clr_bits + 63) & ~63) / 8 * dst_surface->height;
@ -1542,9 +1489,15 @@ HRESULT dd_CreateSurface(
((DWORD*)dst_surface->bmi->bmiColors)[1] = 0x07E0; ((DWORD*)dst_surface->bmi->bmiColors)[1] = 0x07E0;
((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x001F; ((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 */ /* 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) || if (InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 4000 ||
(dst_surface->width == g_ddraw.width && dst_surface->height == g_ddraw.height) || (dst_surface->width == g_ddraw.width && dst_surface->height == g_ddraw.height) ||
(dst_surface->width == 128 && dst_surface->height == 128)) (dst_surface->width == 128 && dst_surface->height == 128))
{ {
@ -1553,18 +1506,17 @@ HRESULT dd_CreateSurface(
if (dst_surface->hdc) if (dst_surface->hdc)
InterlockedIncrement(&g_dds_gdi_handles); 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 = dst_surface->mapping =
CreateFileMappingA( CreateFileMappingA(
INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE,
NULL, NULL,
PAGE_READWRITE | SEC_COMMIT, PAGE_READWRITE | SEC_COMMIT,
0, 0,
bmp_size + 256 + map_offset, bmp_size + 256,
NULL); NULL);
DWORD map_offset = 0;
if (dst_surface->mapping) if (dst_surface->mapping)
{ {
LPVOID data = MapViewOfFile(dst_surface->mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); LPVOID data = MapViewOfFile(dst_surface->mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
@ -1610,16 +1562,6 @@ HRESULT dd_CreateSurface(
{ {
g_ddraw.primary = dst_surface; g_ddraw.primary = dst_surface;
FakePrimarySurface = dst_surface->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);
}
} }
} }

View file

@ -1,9 +1,6 @@
#include <windows.h> #include <windows.h>
#include <dbghelp.h> #include <dbghelp.h>
#include <stdio.h> #include <stdio.h>
#include <d3d9.h>
#include <time.h>
#include "directinput.h"
#include "ddraw.h" #include "ddraw.h"
#include "dd.h" #include "dd.h"
#include "ddsurface.h" #include "ddsurface.h"
@ -11,28 +8,16 @@
#include "debug.h" #include "debug.h"
#include "hook.h" #include "hook.h"
#include "version.h" #include "version.h"
#include "git.h"
#include "versionhelpers.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; double g_dbg_frame_time = 0;
DWORD g_dbg_frame_count = 0; DWORD g_dbg_frame_count = 0;
LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter;
PVOID g_dbg_exception_handle;
static LONGLONG g_dbg_counter_start_time = 0; static LONGLONG g_dbg_counter_start_time = 0;
static double g_dbg_counter_freq = 0.0; static double g_dbg_counter_freq = 0.0;
static FILE* g_dbg_log_file; 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; static BOOL g_dbg_log_rotate;
#ifdef _DEBUG #ifdef _DEBUG
@ -42,47 +27,36 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception)
{ {
g_dbg_crash_count++; g_dbg_crash_count++;
BOOL(WINAPI * MiniDumpWriteDumpProc)( char filename[MAX_PATH] = { 0 };
HANDLE, _snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.dmp", g_dbg_crash_count == 1 ? 1 : 2);
DWORD,
HANDLE,
MINIDUMP_TYPE,
PMINIDUMP_EXCEPTION_INFORMATION,
PMINIDUMP_USER_STREAM_INFORMATION,
PMINIDUMP_CALLBACK_INFORMATION
);
MiniDumpWriteDumpProc = (void*)real_GetProcAddress(real_LoadLibraryA("Dbghelp.dll"), "MiniDumpWriteDump"); HANDLE dmp =
if (MiniDumpWriteDumpProc) CreateFile(
filename,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ,
0,
CREATE_ALWAYS,
0,
0);
if (dmp != INVALID_HANDLE_VALUE)
{ {
HANDLE dmp = MINIDUMP_EXCEPTION_INFORMATION info;
CreateFile( info.ThreadId = GetCurrentThreadId();
g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, info.ExceptionPointers = exception;
GENERIC_READ | GENERIC_WRITE, info.ClientPointers = TRUE;
FILE_SHARE_WRITE | FILE_SHARE_READ,
0,
CREATE_ALWAYS,
0,
0);
if (dmp != INVALID_HANDLE_VALUE) MiniDumpWriteDump(
{ GetCurrentProcess(),
MINIDUMP_EXCEPTION_INFORMATION info; GetCurrentProcessId(),
info.ThreadId = GetCurrentThreadId(); dmp,
info.ExceptionPointers = exception; 0,
info.ClientPointers = TRUE; &info,
NULL,
NULL);
MiniDumpWriteDumpProc( CloseHandle(dmp);
GetCurrentProcess(),
GetCurrentProcessId(),
dmp,
0,
&info,
NULL,
NULL);
CloseHandle(dmp);
}
} }
if (exception && exception->ExceptionRecord) if (exception && exception->ExceptionRecord)
@ -90,7 +64,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception)
HMODULE mod = NULL; HMODULE mod = NULL;
char filename[MAX_PATH] = { 0 }; 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, GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
exception->ExceptionRecord->ExceptionAddress, exception->ExceptionRecord->ExceptionAddress,
&mod)) &mod))
@ -112,66 +86,8 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception)
return EXCEPTION_EXECUTE_HANDLER; 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 #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() void dbg_init()
{ {
static BOOL once = 0; static BOOL once = 0;
@ -180,88 +96,40 @@ void dbg_init()
{ {
once = TRUE; once = TRUE;
char exe_path[MAX_PATH] = { 0 }; remove("cnc-ddraw-1.dmp");
if (GetModuleFileNameA(NULL, exe_path, sizeof(exe_path) - 1) > 0) remove("cnc-ddraw-2.dmp");
{
char filename[MAX_PATH] = { 0 };
char drive[MAX_PATH] = { 0 };
char dir[MAX_PATH] = { 0 };
_splitpath(exe_path, drive, dir, filename, NULL);
char game_path[MAX_PATH] = { 0 }; remove("cnc-ddraw-1.log");
_makepath(game_path, drive, dir, NULL, NULL); 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); g_dbg_log_file = fopen("cnc-ddraw-1.log", "w");
_snprintf(g_dbg_dmp_path2, sizeof(g_dbg_dmp_path2) - 1, "%scnc-ddraw-%s-2.dmp", game_path, filename); 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); TRACE("cnc-ddraw version = %d.%d.%d.%d\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION);
_snprintf(g_dbg_log_path2, sizeof(g_dbg_log_path2) - 1, "%scnc-ddraw-%s-2.log", game_path, filename);
_snprintf(g_dbg_log_path3, sizeof(g_dbg_log_path3) - 1, "%scnc-ddraw-%s-3.log", game_path, filename);
}
remove(g_dbg_dmp_path1); HKEY hkey;
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;
LONG status = LONG status =
RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0L, KEY_READ, &hkey); 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) if (status == ERROR_SUCCESS)
RegCloseKey(hkey); {
char name[256] = { 0 };
DWORD name_size = sizeof(name);
RegQueryValueExA(hkey, "ProductName", NULL, NULL, (PVOID)&name, &name_size);
if (status9x == ERROR_SUCCESS) char dversion[256] = { 0 };
RegCloseKey(hkey9x); 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);
}
if (IsWine()) if (IsWine())
{ {
@ -273,14 +141,6 @@ void dbg_init()
TRACE("Wine sysname = %s, release = %s\n", 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 +184,12 @@ void dbg_printf(const char* fmt, ...)
if (g_dbg_log_file && ftell(g_dbg_log_file) >= 1024 * 1024 * 100) /* rotate every 100MB */ if (g_dbg_log_file && ftell(g_dbg_log_file) >= 1024 * 1024 * 100) /* rotate every 100MB */
{ {
g_dbg_log_file = char filename[MAX_PATH] = { 0 };
freopen( _snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.log", g_dbg_log_rotate ? 3 : 2);
g_dbg_log_rotate ? g_dbg_log_path3 : g_dbg_log_path2,
"w",
g_dbg_log_file);
g_dbg_log_rotate = !g_dbg_log_rotate; 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); setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024);
} }
@ -1091,111 +948,6 @@ void dbg_dump_dds_lock_flags(DWORD flags)
#endif #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) char* dbg_mes_to_str(int id)
{ {
switch (id) switch (id)

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 "dd.h"
#include "mouse.h" #include "mouse.h"
#include "config.h" #include "config.h"
#include "utils.h"
#ifdef _MSC_VER #ifdef _MSC_VER
#include "detours.h" #include "detours.h"
@ -55,12 +54,10 @@ static PROC hook_func(PROC* org_func, PROC new_func)
static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HWND hwnd, DWORD dwFlags) 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("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);
if (This == g_mouse_device && (dwFlags & DISCL_EXCLUSIVE)) if (This == g_mouse_device && g_ddraw.ref && (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); while (real_ShowCursor(FALSE) >= 0);
} }
@ -78,25 +75,13 @@ static HRESULT WINAPI fake_did_GetDeviceData(
LPDWORD pdwInOut, LPDWORD pdwInOut,
DWORD dwFlags) DWORD dwFlags)
{ {
/* //TRACE("DirectInput GetDeviceData [%p]\n", _ReturnAddress());
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);
HRESULT result = real_did_GetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags); HRESULT result = real_did_GetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags);
if (SUCCEEDED(result)) if (SUCCEEDED(result) && This == g_mouse_device && !g_mouse_locked && !g_config.devmode)
{ {
if ((block_mouse || in_background) && pdwInOut) if (pdwInOut)
{ {
if (rgdod && *pdwInOut > 0 && cbObjectData > 0) if (rgdod && *pdwInOut > 0 && cbObjectData > 0)
{ {
@ -112,16 +97,13 @@ static HRESULT WINAPI fake_did_GetDeviceData(
static HRESULT WINAPI fake_did_GetDeviceState(IDirectInputDeviceA* This, DWORD cbData, LPVOID lpvData) 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()); //TRACE("DirectInput GetDeviceState [%p]\n", _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);
HRESULT result = real_did_GetDeviceState(This, cbData, lpvData); HRESULT result = real_did_GetDeviceState(This, cbData, lpvData);
if (SUCCEEDED(result)) if (SUCCEEDED(result) && This == g_mouse_device && !g_mouse_locked && !g_config.devmode)
{ {
if ((block_mouse || in_background) && cbData > 0 && lpvData) if (cbData > 0 && lpvData)
{ {
memset(lpvData, 0, cbData); memset(lpvData, 0, cbData);
} }
@ -142,14 +124,9 @@ static HRESULT WINAPI fake_di_CreateDevice(
if (SUCCEEDED(result)) if (SUCCEEDED(result))
{ {
if (rguid) if (rguid && IsEqualGUID(&GUID_SysMouse, rguid))
{ {
TRACE(" GUID = %08X\n", ((GUID*)rguid)->Data1); g_mouse_device = *lplpDIDevice;
if (IsEqualGUID(&GUID_SysMouse, rguid))
{
g_mouse_device = *lplpDIDevice;
}
} }
if (!real_did_SetCooperativeLevel) if (!real_did_SetCooperativeLevel)
@ -187,14 +164,9 @@ static HRESULT WINAPI fake_di_CreateDeviceEx(
if (SUCCEEDED(result)) if (SUCCEEDED(result))
{ {
if (rguid) if (rguid && IsEqualGUID(&GUID_SysMouse, rguid))
{ {
TRACE(" GUID = %08X\n", ((GUID*)rguid)->Data1); g_mouse_device = *lplpDIDevice;
if (IsEqualGUID(&GUID_SysMouse, rguid))
{
g_mouse_device = *lplpDIDevice;
}
} }
if (!real_did_SetCooperativeLevel) if (!real_did_SetCooperativeLevel)

View file

@ -12,8 +12,6 @@
#include "indeo.h" #include "indeo.h"
#include "utils.h" #include "utils.h"
#include "versionhelpers.h" #include "versionhelpers.h"
#include "delay_imports.h"
#include "keyboard.h"
/* export for cncnet cnc games */ /* export for cncnet cnc games */
@ -24,7 +22,6 @@ PVOID FakePrimarySurface;
HMODULE g_ddraw_module; HMODULE g_ddraw_module;
static BOOL g_screensaver_disabled;
BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
{ {
@ -34,9 +31,9 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
{ {
g_ddraw_module = hDll; g_ddraw_module = hDll;
delay_imports_init(); verhelp_init();
if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0)) if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0))
{ {
cfg_load(); cfg_load();
return TRUE; return TRUE;
@ -44,19 +41,12 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
#ifdef _DEBUG #ifdef _DEBUG
dbg_init(); dbg_init();
TRACE("cnc-ddraw = %p\n", hDll);
g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler);
#endif #endif
cfg_load(); cfg_load();
PVOID(WINAPI * add_handler)(ULONG, PVECTORED_EXCEPTION_HANDLER) =
(void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "AddVectoredExceptionHandler");
if (add_handler)
{
g_dbg_exception_handle = add_handler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler);
}
char buf[1024]; char buf[1024];
if (GetEnvironmentVariable("__COMPAT_LAYER", buf, sizeof(buf))) if (GetEnvironmentVariable("__COMPAT_LAYER", buf, sizeof(buf)))
@ -75,14 +65,13 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
if (_strcmpi(s, "WIN95") == 0 || _strcmpi(s, "WIN98") == 0 || _strcmpi(s, "NT4SP5") == 0) if (_strcmpi(s, "WIN95") == 0 || _strcmpi(s, "WIN98") == 0 || _strcmpi(s, "NT4SP5") == 0)
{ {
char mes[280] = { 0 }; char mes[128] = { 0 };
_snprintf( _snprintf(
mes, mes,
sizeof(mes) - 1, sizeof(mes) - 1,
"Warning: Compatibility modes detected. \n\nIf there are issues with the game then try to " "Please disable the '%s' compatibility mode for all game executables and "
"disable the '%s' compatibility mode for all game executables.\n\n" "then try to start the game again.",
"Note: You can disable this warning via ddraw.ini -> 'no_compat_warning=true'",
s); s);
if (!g_config.no_compat_warning) if (!g_config.no_compat_warning)
@ -133,19 +122,6 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
set_aware(); set_aware();
} }
/* Make sure screensaver will stay off and monitors will stay on */
SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED);
/* WINE does not support SetThreadExecutionState so we'll have to use SPI_SETSCREENSAVEACTIVE instead */
BOOL screensaver_enabled = FALSE;
SystemParametersInfoA(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_enabled, 0);
if (screensaver_enabled)
{
SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);
g_screensaver_disabled = TRUE;
}
indeo_enable(); indeo_enable();
timeBeginPeriod(1); timeBeginPeriod(1);
hook_init(); hook_init();
@ -153,7 +129,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
} }
case DLL_PROCESS_DETACH: case DLL_PROCESS_DETACH:
{ {
if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0)) if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0))
return TRUE; return TRUE;
TRACE("cnc-ddraw DLL_PROCESS_DETACH\n"); TRACE("cnc-ddraw DLL_PROCESS_DETACH\n");
@ -162,35 +138,10 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
indeo_disable(); indeo_disable();
timeEndPeriod(1); timeEndPeriod(1);
keyboard_hook_exit();
dinput_hook_exit(); dinput_hook_exit();
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; break;
} }
case DLL_THREAD_ATTACH:
{
if (g_config.singlecpu && !IsWine() && IsWindows11Version24H2OrGreater())
{
util_set_thread_affinity(GetCurrentThreadId());
}
}
} }
return TRUE; return TRUE;
@ -201,6 +152,7 @@ void DDEnableZoom()
TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress());
g_ddraw.zoom.enabled = TRUE; g_ddraw.zoom.enabled = TRUE;
InterlockedExchange(&g_ddraw.zoom.frame_skip, 20);
} }
BOOL DDIsWindowed() BOOL DDIsWindowed()
@ -223,7 +175,7 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk
HRESULT ret; HRESULT ret;
if (util_caller_is_ddraw_wrapper(_ReturnAddress()) || g_config.flightsim98_hack) if (util_caller_is_ddraw_wrapper(_ReturnAddress()))
{ {
if (lplpDD) if (lplpDD)
*lplpDD = NULL; *lplpDD = NULL;
@ -268,7 +220,7 @@ HRESULT WINAPI DirectDrawCreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnk
HRESULT ret; HRESULT ret;
if (util_caller_is_ddraw_wrapper(_ReturnAddress()) || g_config.flightsim98_hack) if (util_caller_is_ddraw_wrapper(_ReturnAddress()))
{ {
if (lplpDD) if (lplpDD)
*lplpDD = NULL; *lplpDD = NULL;

View file

@ -120,9 +120,16 @@ BOOL fpsl_wait_for_vblank()
BOOL fpsl_dwm_flush() BOOL fpsl_dwm_flush()
{ {
if (g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush && !IsWine()) if (g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush)
{ {
return SUCCEEDED(g_fpsl.DwmFlush()); HRESULT x = g_fpsl.DwmFlush();
if (!SUCCEEDED(x))
{
//TRACE(" ERROR %s(result=%08X)\n", __FUNCTION__, x);
}
return SUCCEEDED(x);
} }
return FALSE; return FALSE;

View file

@ -8,7 +8,6 @@
#include "dllmain.h" #include "dllmain.h"
#include "config.h" #include "config.h"
#include "utils.h" #include "utils.h"
#include "patch.h"
#include "versionhelpers.h" #include "versionhelpers.h"
#ifdef _MSC_VER #ifdef _MSC_VER
@ -51,37 +50,23 @@ SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA;
PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA;
GETMESSAGEAPROC real_GetMessageA = GetMessageA; GETMESSAGEAPROC real_GetMessageA = GetMessageA;
GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement;
SETWINDOWPLACEMENTPROC real_SetWindowPlacement = SetWindowPlacement;
ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA;
DEFWINDOWPROCAPROC real_DefWindowProcA = DefWindowProcA; VALIDATERECTPROC real_ValidateRect = ValidateRect;
SETPARENTPROC real_SetParent = SetParent; INVALIDATERECTPROC real_InvalidateRect = InvalidateRect;
BEGINPAINTPROC real_BeginPaint = BeginPaint;
GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETKEYSTATEPROC real_GetKeyState = GetKeyState;
GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState;
GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps;
CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA; CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA;
CREATEFONTAPROC real_CreateFontA = CreateFontA; CREATEFONTAPROC real_CreateFontA = CreateFontA;
GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries = GetSystemPaletteEntries;
SELECTPALETTEPROC real_SelectPalette = SelectPalette;
REALIZEPALETTEPROC real_RealizePalette = RealizePalette;
LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA;
LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW;
LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA;
LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW;
GETPROCADDRESSPROC real_GetProcAddress = GetProcAddress; GETPROCADDRESSPROC real_GetProcAddress = GetProcAddress;
GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA; GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA;
GETVERSIONPROC real_GetVersion = GetVersion;
GETVERSIONEXAPROC real_GetVersionExA = GetVersionExA;
COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance;
MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA; MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA;
SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; 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[] = HOOKLIST g_hook_hooklist[] =
{ {
@ -113,23 +98,16 @@ HOOKLIST g_hook_hooklist[] =
{ "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow, 0 }, { "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow, 0 },
{ "GetTopWindow", (PROC)fake_GetTopWindow, (PROC*)&real_GetTopWindow, 0 }, { "GetTopWindow", (PROC)fake_GetTopWindow, (PROC*)&real_GetTopWindow, 0 },
{ "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 }, { "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 },
{ "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 }, //{ "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 },
{ "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 }, //{ "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 },
{ "GetWindowPlacement", (PROC)fake_GetWindowPlacement, (PROC*)&real_GetWindowPlacement, 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 }, { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 },
{ "DefWindowProcA", (PROC)fake_DefWindowProcA, (PROC*)&real_DefWindowProcA, 0 }, { "ValidateRect", (PROC)fake_ValidateRect, (PROC*)&real_ValidateRect, 0 },
{ "SetParent", (PROC)fake_SetParent, (PROC*)&real_SetParent, 0 }, { "InvalidateRect", (PROC)fake_InvalidateRect, (PROC*)&real_InvalidateRect, 0 },
{ "BeginPaint", (PROC)fake_BeginPaint, (PROC*)&real_BeginPaint, 0 },
{ "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 },
{ "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 },
{ "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 },
{ "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA, (PROC*)&real_SetWindowsHookExA, 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 } { "", NULL, NULL, 0 }
} }
}, },
@ -147,13 +125,6 @@ HOOKLIST g_hook_hooklist[] =
{ "", NULL, NULL, 0 } { "", NULL, NULL, 0 }
} }
}, },
{
"Avifil32.dll",
{
{ "AVIStreamGetFrameOpen", (PROC)fake_AVIStreamGetFrameOpen, (PROC*)&real_AVIStreamGetFrameOpen, 0 },
{ "", NULL, NULL, 0 }
}
},
{ {
"dinput.dll", "dinput.dll",
{ {
@ -178,11 +149,7 @@ HOOKLIST g_hook_hooklist[] =
{ "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, HOOK_SKIP_2 }, { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, HOOK_SKIP_2 },
{ "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, 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, (PROC*)&real_GetDeviceCaps, HOOK_LOCAL_ONLY },
{ "GetDeviceCaps", (PROC)fake_GetDeviceCaps_system, NULL, HOOK_SYSTEM_ONLY },
{ "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, { "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 }, { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 },
{ "", NULL, NULL, 0 } { "", NULL, NULL, 0 }
} }
@ -190,22 +157,20 @@ HOOKLIST g_hook_hooklist[] =
{ {
"WING32.DLL", "WING32.DLL",
{ {
{ "WinGBitBlt", (PROC)fake_WinGBitBlt, NULL, 0 }, { "WinGBitBlt", (PROC)fake_WinGBitBlt, NULL, HOOK_SKIP_2 },
{ "WinGStretchBlt", (PROC)fake_WinGStretchBlt, NULL, 0 }, { "WinGStretchBlt", (PROC)fake_WinGStretchBlt, NULL, HOOK_SKIP_2 },
{ "", NULL, NULL, 0 } { "", NULL, NULL, 0 }
} }
}, },
{ {
"kernel32.dll", "kernel32.dll",
{ {
{ "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, HOOK_SKIP_2 }, //{ "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, HOOK_SKIP_2 },
{ "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, HOOK_SKIP_2 }, { "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, HOOK_SKIP_2 },
{ "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, HOOK_SKIP_2 }, { "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, HOOK_SKIP_2 },
{ "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 }, { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 },
{ "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, HOOK_SKIP_2 }, { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, HOOK_SKIP_2 },
{ "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, 0 }, { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, HOOK_SKIP_2 },
{ "GetVersion", (PROC)fake_GetVersion, (PROC*)&real_GetVersion, 0 },
{ "GetVersionExA", (PROC)fake_GetVersionExA, (PROC*)&real_GetVersionExA, 0 },
#if defined(_DEBUG) && defined(__GNUC__) #if defined(_DEBUG) && defined(__GNUC__)
{ "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter, (PROC*)&real_SetUnhandledExceptionFilter, 0 }, { "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter, (PROC*)&real_SetUnhandledExceptionFilter, 0 },
#endif #endif
@ -244,15 +209,17 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks,
if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
return; 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) if (nt_headers->Signature != IMAGE_NT_SIGNATURE)
return; return;
DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; 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; 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) while (import_desc->FirstThunk)
{ {
@ -264,13 +231,13 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks,
for (int i = 0; hooks[i].module_name[0]; i++) 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) if (_stricmp(imp_module_name, hooks[i].module_name) == 0)
{ {
HMODULE cur_mod = GetModuleHandleA(hooks[i].module_name); HMODULE cur_mod = GetModuleHandleA(hooks[i].module_name);
PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)hmod + import_desc->FirstThunk); PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk);
while (first_thunk->u1.Function) while (first_thunk->u1.Function)
{ {
@ -294,9 +261,6 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks,
if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY))
continue; continue;
if (is_local && (hooks[i].data[x].flags & HOOK_SYSTEM_ONLY))
continue;
if (unhook) if (unhook)
{ {
if (first_thunk->u1.Function == (DWORD)hooks[i].data[x].new_function) if (first_thunk->u1.Function == (DWORD)hooks[i].data[x].new_function)
@ -367,15 +331,17 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc
if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
return; 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) if (nt_headers->Signature != IMAGE_NT_SIGNATURE)
return; return;
DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; 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; 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) while (import_desc->FirstThunk)
{ {
@ -387,12 +353,12 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc
for (int i = 0; hooks[i].module_name[0]; i++) 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) if (_stricmp(imp_module_name, hooks[i].module_name) == 0)
{ {
PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)hmod + import_desc->FirstThunk); PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk);
PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)hmod + import_desc->OriginalFirstThunk); PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)dos_header + import_desc->OriginalFirstThunk);
while (first_thunk->u1.Function) while (first_thunk->u1.Function)
{ {
@ -415,9 +381,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)) if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY))
continue; continue;
if (is_local && (hooks[i].data[x].flags & HOOK_SYSTEM_ONLY))
continue;
#if defined(__GNUC__) #if defined(__GNUC__)
if (util_is_bad_read_ptr((void*)import->Name)) if (util_is_bad_read_ptr((void*)import->Name))
continue; continue;
@ -486,25 +449,27 @@ BOOL hook_got_ddraw_import(HMODULE mod, BOOL check_imported_dlls)
if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
return FALSE; 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) if (nt_headers->Signature != IMAGE_NT_SIGNATURE)
return FALSE; return FALSE;
DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; 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 FALSE; return FALSE;
PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)mod + import_desc_rva); PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva);
while (import_desc->FirstThunk) while (import_desc->FirstThunk)
{ {
if (import_desc->Name) if (import_desc->Name)
{ {
char* imp_module_name = (char*)((DWORD)mod + import_desc->Name); char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name);
if (_stricmp(imp_module_name, "ddraw.dll") == 0) if (_stricmp(imp_module_name, "ddraw.dll") == 0)
{ {
PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)mod + import_desc->FirstThunk); PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk);
if (first_thunk->u1.Function) if (first_thunk->u1.Function)
return TRUE; return TRUE;
@ -581,7 +546,6 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook)
_strcmpi(mod_filename, "libglapi") == 0 || _strcmpi(mod_filename, "libglapi") == 0 ||
_strcmpi(mod_filename, "d3d9") == 0 || _strcmpi(mod_filename, "d3d9") == 0 ||
_strcmpi(mod_filename, "mdraw") == 0 || _strcmpi(mod_filename, "mdraw") == 0 ||
_strcmpi(mod_filename, "SH33W32") == 0 ||
_strcmpi(mod_filename, "Shw32") == 0) _strcmpi(mod_filename, "Shw32") == 0)
continue; continue;
@ -683,8 +647,6 @@ void hook_init()
{ {
/* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */
g_config.hook = 3; g_config.hook = 3;
TRACE("Switched to hook 3\n");
} }
} }
@ -697,11 +659,6 @@ void hook_init()
DetourUpdateThread(GetCurrentThread()); DetourUpdateThread(GetCurrentThread());
DetourAttach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); DetourAttach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter);
DetourTransactionCommit(); DetourTransactionCommit();
if (!IsDebuggerPresent())
{
patch_ljmp((void*)_invoke_watson, (void*)dbg_invoke_watson);
}
} }
#endif #endif

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

@ -38,12 +38,35 @@ void mouse_lock()
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
OffsetRect(&rc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y); OffsetRect(&rc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y);
int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); POINT pt;
int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); real_GetCursorPos(&pt);
if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt))
{
if (pt.x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width ||
pt.x < g_ddraw.render.viewport.x ||
pt.y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height ||
pt.y < g_ddraw.render.viewport.y)
{
pt.x = g_ddraw.width / 2;
pt.y = g_ddraw.height / 2;
}
else
{
pt.x = (DWORD)((pt.x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x);
pt.y = (DWORD)((pt.y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y);
}
pt.x = min(pt.x, g_ddraw.width - 1);
pt.y = min(pt.y, g_ddraw.height - 1);
InterlockedExchange((LONG*)&g_ddraw.cursor.x, pt.x);
InterlockedExchange((LONG*)&g_ddraw.cursor.y, pt.y);
}
real_SetCursorPos( real_SetCursorPos(
g_config.adjmouse ? (int)(rc.left + (cur_x * g_ddraw.mouse.scale_x)) : rc.left + cur_x, g_config.adjmouse ? (int)(rc.left + (pt.x * g_ddraw.mouse.scale_x)) : rc.left + pt.x,
g_config.adjmouse ? (int)(rc.top + (cur_y * g_ddraw.mouse.scale_y)) : rc.top + cur_y); g_config.adjmouse ? (int)(rc.top + (pt.y * g_ddraw.mouse.scale_y)) : rc.top + pt.y);
CopyRect(&rc, &g_ddraw.mouse.rc); CopyRect(&rc, &g_ddraw.mouse.rc);
real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2);
@ -63,7 +86,7 @@ void mouse_unlock()
g_mouse_locked = FALSE; g_mouse_locked = FALSE;
real_ClipCursor(NULL); real_ClipCursor(NULL);
ReleaseCapture(); //ReleaseCapture();
RECT rc = { 0 }; RECT rc = { 0 };
real_GetClientRect(g_ddraw.hwnd, &rc); real_GetClientRect(g_ddraw.hwnd, &rc);

View file

@ -88,14 +88,11 @@ PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT;
PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB; PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB;
PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB; PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB;
PFNGLTEXBUFFERPROC glTexBuffer; PFNGLTEXBUFFERPROC glTexBuffer;
PFNGLGETINTEGERVPROC glGetIntegerv;
PFNGLGETSTRINGIPROC glGetStringi;
HMODULE g_oglu_hmodule; HMODULE g_oglu_hmodule;
BOOL g_oglu_got_version2; BOOL g_oglu_got_version2;
BOOL g_oglu_got_version3; BOOL g_oglu_got_version3;
char g_oglu_version[128]; char g_oglu_version[128];
char g_oglu_version_long[128];
BOOL oglu_load_dll() BOOL oglu_load_dll()
{ {
@ -195,14 +192,11 @@ void oglu_init()
wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)xwglGetProcAddress("wglGetExtensionsStringARB"); wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)xwglGetProcAddress("wglGetExtensionsStringARB");
glTexBuffer = (PFNGLTEXBUFFERPROC)xwglGetProcAddress("glTexBuffer"); glTexBuffer = (PFNGLTEXBUFFERPROC)xwglGetProcAddress("glTexBuffer");
glGetIntegerv = (PFNGLGETINTEGERVPROC)xwglGetProcAddress("glGetIntegerv");
glGetStringi = (PFNGLGETSTRINGIPROC)xwglGetProcAddress("glGetStringi");
char* glversion = (char*)glGetString(GL_VERSION); char* glversion = (char*)glGetString(GL_VERSION);
if (glversion) if (glversion)
{ {
strncpy(g_oglu_version, glversion, sizeof(g_oglu_version) - 1); 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 */ g_oglu_version[sizeof(g_oglu_version) - 1] = '\0'; /* strncpy fix */
strtok(g_oglu_version, " "); strtok(g_oglu_version, " ");
} }
@ -233,32 +227,11 @@ void oglu_init()
BOOL oglu_ext_exists(char* ext, HDC hdc) 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; if (strstr(glext, ext))
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))
return TRUE; return TRUE;
} }

View file

@ -15,16 +15,6 @@
#include "config.h" #include "config.h"
#ifdef _DEBUG
#define FAILEDX(stmt) d3d9_check_failed(stmt, #stmt)
#define SUCCEEDEDX(stmt) d3d9_check_succeeded(stmt, #stmt)
static BOOL d3d9_check_failed(HRESULT hr, const char* stmt);
static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt);
#else
#define FAILEDX(stmt) FAILED(stmt)
#define SUCCEEDEDX(stmt) SUCCEEDED(stmt)
#endif
static BOOL d3d9_create_resources(); static BOOL d3d9_create_resources();
static BOOL d3d9_set_states(); static BOOL d3d9_set_states();
static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch); static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch);
@ -96,10 +86,10 @@ BOOL d3d9_create()
#if _DEBUG #if _DEBUG
D3DADAPTER_IDENTIFIER9 ai = {0}; D3DADAPTER_IDENTIFIER9 ai = {0};
D3DCAPS9 caps = { 0 }; D3DCAPS9 caps = { 0 };
HRESULT adapter_hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, D3DADAPTER_DEFAULT, 0, &ai); HRESULT hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, D3DADAPTER_DEFAULT, 0, &ai);
HRESULT devcaps_hr = IDirect3D9_GetDeviceCaps(g_d3d9.instance, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); HRESULT hr2 = IDirect3D9_GetDeviceCaps(g_d3d9.instance, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
if (SUCCEEDEDX(adapter_hr)) if (SUCCEEDED(hr))
{ {
TRACE("+--Direct3D9-------------------------------------\n"); TRACE("+--Direct3D9-------------------------------------\n");
TRACE("| D3D9On12: %s (%p)\n", d3d9on12 != NULL ? "True" : "False", GetModuleHandleA("d3d9on12.dll")); TRACE("| D3D9On12: %s (%p)\n", d3d9on12 != NULL ? "True" : "False", GetModuleHandleA("d3d9on12.dll"));
@ -116,7 +106,7 @@ BOOL d3d9_create()
TRACE("| Driver: %s\n", ai.Driver); TRACE("| Driver: %s\n", ai.Driver);
TRACE("| Description: %s\n", ai.Description); TRACE("| Description: %s\n", ai.Description);
if (SUCCEEDEDX(devcaps_hr)) if (SUCCEEDED(hr2))
{ {
TRACE("| MaxTextureWidth: %d\n", caps.MaxTextureWidth); TRACE("| MaxTextureWidth: %d\n", caps.MaxTextureWidth);
TRACE("| MaxTextureHeight: %d\n", caps.MaxTextureHeight); TRACE("| MaxTextureHeight: %d\n", caps.MaxTextureHeight);
@ -156,7 +146,7 @@ BOOL d3d9_create()
for (int i = 0; i < sizeof(behavior_flags) / sizeof(behavior_flags[0]); i++) for (int i = 0; i < sizeof(behavior_flags) / sizeof(behavior_flags[0]); i++)
{ {
if (SUCCEEDEDX( if (SUCCEEDED(
IDirect3D9_CreateDevice( IDirect3D9_CreateDevice(
g_d3d9.instance, g_d3d9.instance,
D3DADAPTER_DEFAULT, D3DADAPTER_DEFAULT,
@ -173,31 +163,6 @@ BOOL d3d9_create()
return FALSE; 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() BOOL d3d9_on_device_lost()
{ {
if (g_d3d9.device && IDirect3DDevice9_TestCooperativeLevel(g_d3d9.device) == D3DERR_DEVICENOTRESET) if (g_d3d9.device && IDirect3DDevice9_TestCooperativeLevel(g_d3d9.device) == D3DERR_DEVICENOTRESET)
@ -216,7 +181,7 @@ BOOL d3d9_reset(BOOL windowed)
g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate; 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(); BOOL result = d3d9_set_states();
@ -313,7 +278,7 @@ static BOOL d3d9_create_resources()
g_d3d9.scale_w = (float)width / g_d3d9.tex_width;; g_d3d9.scale_w = (float)width / g_d3d9.tex_width;;
g_d3d9.scale_h = (float)height / g_d3d9.tex_height; g_d3d9.scale_h = (float)height / g_d3d9.tex_height;
err = err || FAILEDX( err = err || FAILED(
IDirect3DDevice9_CreateVertexBuffer( IDirect3DDevice9_CreateVertexBuffer(
g_d3d9.device, g_d3d9.device,
sizeof(CUSTOMVERTEX) * 4, 0, sizeof(CUSTOMVERTEX) * 4, 0,
@ -328,7 +293,7 @@ static BOOL d3d9_create_resources()
{ {
if (g_ddraw.bpp == 16 && g_config.rgb555) if (g_ddraw.bpp == 16 && g_config.rgb555)
{ {
BOOL error = FAILEDX( BOOL error = FAILED(
IDirect3DDevice9_CreateTexture( IDirect3DDevice9_CreateTexture(
g_d3d9.device, g_d3d9.device,
g_d3d9.tex_width, g_d3d9.tex_width,
@ -342,7 +307,7 @@ static BOOL d3d9_create_resources()
if (error) if (error)
{ {
err = err || FAILEDX( err = err || FAILED(
IDirect3DDevice9_CreateTexture( IDirect3DDevice9_CreateTexture(
g_d3d9.device, g_d3d9.device,
g_d3d9.tex_width, g_d3d9.tex_width,
@ -357,7 +322,7 @@ static BOOL d3d9_create_resources()
} }
else if (g_ddraw.bpp == 32) else if (g_ddraw.bpp == 32)
{ {
BOOL error = FAILEDX( BOOL error = FAILED(
IDirect3DDevice9_CreateTexture( IDirect3DDevice9_CreateTexture(
g_d3d9.device, g_d3d9.device,
g_d3d9.tex_width, g_d3d9.tex_width,
@ -371,7 +336,7 @@ static BOOL d3d9_create_resources()
if (error) if (error)
{ {
err = err || FAILEDX( err = err || FAILED(
IDirect3DDevice9_CreateTexture( IDirect3DDevice9_CreateTexture(
g_d3d9.device, g_d3d9.device,
g_d3d9.tex_width, g_d3d9.tex_width,
@ -386,7 +351,7 @@ static BOOL d3d9_create_resources()
} }
else else
{ {
err = err || FAILEDX( err = err || FAILED(
IDirect3DDevice9_CreateTexture( IDirect3DDevice9_CreateTexture(
g_d3d9.device, g_d3d9.device,
g_d3d9.tex_width, g_d3d9.tex_width,
@ -403,7 +368,7 @@ static BOOL d3d9_create_resources()
if (g_ddraw.bpp == 8) if (g_ddraw.bpp == 8)
{ {
BOOL error = FAILEDX( BOOL error = FAILED(
IDirect3DDevice9_CreateTexture( IDirect3DDevice9_CreateTexture(
g_d3d9.device, g_d3d9.device,
256, 256,
@ -417,7 +382,7 @@ static BOOL d3d9_create_resources()
if (error) if (error)
{ {
err = err || FAILEDX( err = err || FAILED(
IDirect3DDevice9_CreateTexture( IDirect3DDevice9_CreateTexture(
g_d3d9.device, g_d3d9.device,
256, 256,
@ -436,7 +401,7 @@ static BOOL d3d9_create_resources()
if (g_ddraw.bpp == 8) if (g_ddraw.bpp == 8)
{ {
err = err || FAILEDX( err = err || FAILED(
IDirect3DDevice9_CreatePixelShader(g_d3d9.device, (DWORD*)D3D9_PALETTE_SHADER, &g_d3d9.pixel_shader)); IDirect3DDevice9_CreatePixelShader(g_d3d9.device, (DWORD*)D3D9_PALETTE_SHADER, &g_d3d9.pixel_shader));
IDirect3DDevice9_CreatePixelShader( IDirect3DDevice9_CreatePixelShader(
@ -448,7 +413,7 @@ static BOOL d3d9_create_resources()
{ {
if (g_config.d3d9_filter == FILTER_LANCZOS) if (g_config.d3d9_filter == FILTER_LANCZOS)
{ {
BOOL error = FAILEDX( BOOL error = FAILED(
IDirect3DDevice9_CreatePixelShader( IDirect3DDevice9_CreatePixelShader(
g_d3d9.device, g_d3d9.device,
(DWORD*)D3D9_LANCZOS2_SHADER, (DWORD*)D3D9_LANCZOS2_SHADER,
@ -476,20 +441,20 @@ static BOOL d3d9_set_states()
{ {
BOOL err = FALSE; BOOL err = FALSE;
err = err || FAILEDX(IDirect3DDevice9_SetFVF(g_d3d9.device, D3DFVF_XYZRHW | D3DFVF_TEX1)); err = err || FAILED(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 || FAILED(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_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 = BOOL bilinear =
g_config.d3d9_filter && g_config.d3d9_filter &&
g_d3d9.pixel_shader_upscale && 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 || g_config.vhack);
err = err || FAILEDX( err = err || FAILED(
IDirect3DDevice9_SetPixelShader( IDirect3DDevice9_SetPixelShader(
g_d3d9.device, g_d3d9.device,
bilinear ? g_d3d9.pixel_shader_upscale : g_d3d9.pixel_shader)); bilinear ? g_d3d9.pixel_shader_upscale : g_d3d9.pixel_shader));
@ -497,7 +462,7 @@ static BOOL d3d9_set_states()
if (bilinear) if (bilinear)
{ {
float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; 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 else
@ -508,22 +473,22 @@ static BOOL d3d9_set_states()
g_d3d9.pixel_shader_upscale && g_d3d9.pixel_shader_upscale &&
(g_ddraw.render.viewport.width != g_ddraw.width || (g_ddraw.render.viewport.width != g_ddraw.width ||
g_ddraw.render.viewport.height != g_ddraw.height) && g_ddraw.render.viewport.height != g_ddraw.height) &&
SUCCEEDEDX(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) 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 }; 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 ( else if (
SUCCEEDEDX(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) && SUCCEEDED(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_MINFILTER, D3DTEXF_LINEAR)) &&
g_config.d3d9_filter == FILTER_CUBIC && g_config.d3d9_filter == FILTER_CUBIC &&
g_d3d9.pixel_shader_upscale && g_d3d9.pixel_shader_upscale &&
(g_ddraw.render.viewport.width != g_ddraw.width || (g_ddraw.render.viewport.width != g_ddraw.width ||
g_ddraw.render.viewport.height != g_ddraw.height) && g_ddraw.render.viewport.height != g_ddraw.height) &&
SUCCEEDEDX(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) 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 }; 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));
} }
} }
} }
@ -537,7 +502,7 @@ static BOOL d3d9_set_states()
0.0f, 0.0f,
1.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; return !err;
} }
@ -562,7 +527,7 @@ static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch)
}; };
void* data; 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)); memcpy(data, vertices, sizeof(vertices));
@ -575,7 +540,7 @@ static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch)
DWORD WINAPI d3d9_render_main(void) DWORD WINAPI d3d9_render_main(void)
{ {
Sleep(250); //Sleep(250);
fpsl_init(); fpsl_init();
@ -587,6 +552,9 @@ DWORD WINAPI d3d9_render_main(void)
(g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) && (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) &&
g_ddraw.render.run) g_ddraw.render.run)
{ {
if (InterlockedDecrement(&g_ddraw.zoom.frame_skip) > 0)
continue;
#if _DEBUG #if _DEBUG
dbg_draw_frame_info_start(); dbg_draw_frame_info_start();
#endif #endif
@ -629,8 +597,8 @@ DWORD WINAPI d3d9_render_main(void)
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])) && if (SUCCEEDED(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))) SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0)))
{ {
blt_clean( blt_clean(
lock_rc.pBits, lock_rc.pBits,
@ -657,8 +625,8 @@ DWORD WINAPI d3d9_render_main(void)
RECT rc = { 0,0,256,1 }; RECT rc = { 0,0,256,1 };
if (SUCCEEDEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[pal_index])) && if (SUCCEEDED(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))) 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));
@ -669,6 +637,7 @@ DWORD WINAPI d3d9_render_main(void)
if (g_config.fixchilds) if (g_config.fixchilds)
{ {
g_ddraw.child_window_exists = FALSE; g_ddraw.child_window_exists = FALSE;
InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL);
EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary); 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)
@ -716,14 +685,6 @@ DWORD WINAPI d3d9_render_main(void)
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
Sleep(50); 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) if (!g_ddraw.render.run)
break; break;

View file

@ -37,6 +37,7 @@ DWORD WINAPI gdi_render_main(void)
Sleep(500); Sleep(500);
fpsl_init(); fpsl_init();
SetStretchBltMode(g_ddraw.render.hdc, COLORONCOLOR);
DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE;
@ -85,6 +86,7 @@ DWORD WINAPI gdi_render_main(void)
if (g_config.fixchilds) if (g_config.fixchilds)
{ {
g_ddraw.child_window_exists = FALSE; g_ddraw.child_window_exists = FALSE;
InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL);
EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary); EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary);
} }
@ -99,17 +101,14 @@ DWORD WINAPI gdi_render_main(void)
FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); 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 }; RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height };
FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
lines_copied = 1;
} }
else if (upscale_hack) else if (upscale_hack)
{ {
lines_copied = real_StretchDIBits( real_StretchDIBits(
g_ddraw.render.hdc, g_ddraw.render.hdc,
g_ddraw.render.viewport.x, g_ddraw.render.viewport.x,
g_ddraw.render.viewport.y, g_ddraw.render.viewport.y,
@ -127,7 +126,7 @@ DWORD WINAPI gdi_render_main(void)
else if (!g_ddraw.child_window_exists && else if (!g_ddraw.child_window_exists &&
(g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height)) (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height))
{ {
lines_copied = real_StretchDIBits( real_StretchDIBits(
g_ddraw.render.hdc, g_ddraw.render.hdc,
g_ddraw.render.viewport.x, g_ddraw.render.viewport.x,
g_ddraw.render.viewport.y, g_ddraw.render.viewport.y,
@ -142,8 +141,7 @@ DWORD WINAPI gdi_render_main(void)
DIB_RGB_COLORS, DIB_RGB_COLORS,
SRCCOPY); SRCCOPY);
} }
else
if (lines_copied == 0 || lines_copied == GDI_ERROR)
{ {
real_SetDIBitsToDevice( real_SetDIBitsToDevice(
g_ddraw.render.hdc, g_ddraw.render.hdc,
@ -166,12 +164,6 @@ DWORD WINAPI gdi_render_main(void)
LeaveCriticalSection(&g_ddraw.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) if (!g_ddraw.render.run)
break; break;

View file

@ -63,10 +63,6 @@ BOOL ogl_create()
TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
TRACE("+------------------------------------------------\n"); TRACE("+------------------------------------------------\n");
#ifdef _DEBUG
while (glGetError() != GL_NO_ERROR); /* Ignore errors from glGetString */
#endif
GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc)); GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc));
} }
else else
@ -94,7 +90,7 @@ BOOL ogl_create()
DWORD WINAPI ogl_render_main(void) DWORD WINAPI ogl_render_main(void)
{ {
Sleep(250); //Sleep(250);
g_ogl.got_error = g_ogl.use_opengl = FALSE; g_ogl.got_error = g_ogl.use_opengl = FALSE;
GLenum err = GL_NO_ERROR; GLenum err = GL_NO_ERROR;
BOOL made_current = FALSE; BOOL made_current = FALSE;
@ -111,8 +107,6 @@ DWORD WINAPI ogl_render_main(void)
{ {
GL_CHECK(oglu_init()); GL_CHECK(oglu_init());
g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR;
BOOL got_swap_ctrl; BOOL got_swap_ctrl;
GL_CHECK(got_swap_ctrl = oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc)); GL_CHECK(got_swap_ctrl = oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc));
@ -126,11 +120,9 @@ DWORD WINAPI ogl_render_main(void)
GL_CHECK(ogl_init_shader1_program()); GL_CHECK(ogl_init_shader1_program());
GL_CHECK(ogl_init_shader2_program()); GL_CHECK(ogl_init_shader2_program());
//GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test());
//GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_shader_test());
g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR; g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR;
GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test());
GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_shader_test());
g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR;
g_ogl.use_opengl = (g_ogl.main_program || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !g_ogl.got_error; g_ogl.use_opengl = (g_ogl.main_program || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !g_ogl.got_error;
GL_CHECK(ogl_render()); GL_CHECK(ogl_render());
@ -248,15 +240,6 @@ static void ogl_build_programs()
_snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.dll_path, g_config.shader); _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.dll_path, g_config.shader);
} }
/* Hack for Intel HD 4000 driver bug - force default shader */
if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0 ||
_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.5161") == 0)
{
//shader_path[0] = 0;
//g_config.shader[0] = 0;
}
/* detect common upscaling shaders and disable them if no upscaling is required */ /* detect common upscaling shaders and disable them if no upscaling is required */
BOOL is_upscaler = BOOL is_upscaler =
@ -274,9 +257,7 @@ static void ogl_build_programs()
{ {
g_ogl.shader1_program = oglu_build_program_from_file(shader_path, core_profile); g_ogl.shader1_program = oglu_build_program_from_file(shader_path, core_profile);
if (g_ogl.shader1_program && if (g_ogl.shader1_program && strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL)
(strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL ||
strstr(g_config.shader, "-pass1scale") != NULL))
{ {
g_ogl.shader2_upscale = TRUE; g_ogl.shader2_upscale = TRUE;
} }
@ -605,10 +586,8 @@ static void ogl_init_shader1_program()
glUseProgram(g_ogl.shader1_program); glUseProgram(g_ogl.shader1_program);
GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "VertexCoord"); GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "VertexCoord");
if (vertex_coord_attr_loc == -1) // dosbox staging
vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "a_position");
g_ogl.shader1_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "TexCoord"); g_ogl.shader1_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "TexCoord");
g_ogl.shader1_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "FrameCount");
glGenBuffers(3, g_ogl.shader1_vbos); glGenBuffers(3, g_ogl.shader1_vbos);
@ -665,13 +644,10 @@ static void ogl_init_shader1_program()
glEnableVertexAttribArray(vertex_coord_attr_loc); glEnableVertexAttribArray(vertex_coord_attr_loc);
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
if (g_ogl.shader1_tex_coord_attr_loc != -1) glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]);
{ glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc);
glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); glBindBuffer(GL_ARRAY_BUFFER, 0);
glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ogl.shader1_vbos[2]); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ogl.shader1_vbos[2]);
static const GLushort indices[] = static const GLushort indices[] =
@ -693,44 +669,24 @@ static void ogl_init_shader1_program()
output_size[1] = (float)g_ddraw.render.viewport.height; output_size[1] = (float)g_ddraw.render.viewport.height;
GLint loc = glGetUniformLocation(g_ogl.shader1_program, "OutputSize"); GLint loc = glGetUniformLocation(g_ogl.shader1_program, "OutputSize");
if (loc == -1)
loc = glGetUniformLocation(g_ogl.shader1_program, "rubyOutputSize");
if (loc != -1) if (loc != -1)
glUniform2fv(loc, 1, output_size); glUniform2fv(loc, 1, output_size);
loc = glGetUniformLocation(g_ogl.shader1_program, "TextureSize"); loc = glGetUniformLocation(g_ogl.shader1_program, "TextureSize");
if (loc == -1)
loc = glGetUniformLocation(g_ogl.shader1_program, "rubyTextureSize");
if (loc != -1) if (loc != -1)
glUniform2fv(loc, 1, texture_size); glUniform2fv(loc, 1, texture_size);
loc = glGetUniformLocation(g_ogl.shader1_program, "InputSize"); loc = glGetUniformLocation(g_ogl.shader1_program, "InputSize");
if (loc == -1)
loc = glGetUniformLocation(g_ogl.shader1_program, "rubyInputSize");
if (loc != -1) if (loc != -1)
glUniform2fv(loc, 1, input_size); glUniform2fv(loc, 1, input_size);
loc = glGetUniformLocation(g_ogl.shader1_program, "Texture");
if (loc == -1)
loc = glGetUniformLocation(g_ogl.shader1_program, "rubyTexture");
if (loc != -1)
glUniform1i(loc, 0);
loc = glGetUniformLocation(g_ogl.shader1_program, "FrameDirection"); loc = glGetUniformLocation(g_ogl.shader1_program, "FrameDirection");
if (loc != -1) if (loc != -1)
glUniform1i(loc, 1); glUniform1i(loc, 1);
g_ogl.shader1_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "FrameCount"); loc = glGetUniformLocation(g_ogl.shader1_program, "Texture");
if (g_ogl.shader1_frame_count_uni_loc == -1) if (loc != -1)
g_ogl.shader1_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "rubyFrameCount"); glUniform1i(loc, 0);
const float mvp_matrix[16] = { const float mvp_matrix[16] = {
1,0,0,0, 1,0,0,0,
@ -738,10 +694,7 @@ static void ogl_init_shader1_program()
0,0,1,0, 0,0,1,0,
0,0,0,1, 0,0,0,1,
}; };
glUniformMatrix4fv(glGetUniformLocation(g_ogl.shader1_program, "MVPMatrix"), 1, GL_FALSE, mvp_matrix);
loc = glGetUniformLocation(g_ogl.shader1_program, "MVPMatrix");
if (loc != -1)
glUniformMatrix4fv(loc, 1, GL_FALSE, mvp_matrix);
glGenFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); glGenFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id);
glGenTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); glGenTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id);
@ -847,10 +800,8 @@ static void ogl_init_shader2_program()
glUseProgram(g_ogl.shader2_program); glUseProgram(g_ogl.shader2_program);
GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "VertexCoord"); GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "VertexCoord");
if (vertex_coord_attr_loc == -1)
vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "a_position");
g_ogl.shader2_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "TexCoord"); g_ogl.shader2_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "TexCoord");
g_ogl.shader2_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader2_program, "FrameCount");
glGenBuffers(3, g_ogl.shader2_vbos); glGenBuffers(3, g_ogl.shader2_vbos);
@ -885,13 +836,10 @@ static void ogl_init_shader2_program()
glEnableVertexAttribArray(vertex_coord_attr_loc); glEnableVertexAttribArray(vertex_coord_attr_loc);
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
if (g_ogl.shader2_tex_coord_attr_loc != -1) glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[1]);
{ glVertexAttribPointer(g_ogl.shader2_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[1]); glEnableVertexAttribArray(g_ogl.shader2_tex_coord_attr_loc);
glVertexAttribPointer(g_ogl.shader2_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); glBindBuffer(GL_ARRAY_BUFFER, 0);
glEnableVertexAttribArray(g_ogl.shader2_tex_coord_attr_loc);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ogl.shader2_vbos[2]); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ogl.shader2_vbos[2]);
static const GLushort indices[] = static const GLushort indices[] =
@ -913,37 +861,25 @@ static void ogl_init_shader2_program()
output_size[1] = (float)g_ddraw.render.viewport.height; output_size[1] = (float)g_ddraw.render.viewport.height;
GLint loc = glGetUniformLocation(g_ogl.shader2_program, "OutputSize"); GLint loc = glGetUniformLocation(g_ogl.shader2_program, "OutputSize");
if (loc == -1)
loc = glGetUniformLocation(g_ogl.shader2_program, "rubyOutputSize");
if (loc != -1) if (loc != -1)
glUniform2fv(loc, 1, output_size); glUniform2fv(loc, 1, output_size);
loc = glGetUniformLocation(g_ogl.shader2_program, "TextureSize"); loc = glGetUniformLocation(g_ogl.shader2_program, "TextureSize");
if (loc == -1)
loc = glGetUniformLocation(g_ogl.shader2_program, "rubyTextureSize");
if (loc != -1) if (loc != -1)
glUniform2fv(loc, 1, texture_size); glUniform2fv(loc, 1, texture_size);
loc = glGetUniformLocation(g_ogl.shader2_program, "InputSize"); loc = glGetUniformLocation(g_ogl.shader2_program, "InputSize");
if (loc == -1)
loc = glGetUniformLocation(g_ogl.shader2_program, "rubyInputSize");
if (loc != -1) if (loc != -1)
glUniform2fv(loc, 1, input_size); glUniform2fv(loc, 1, input_size);
loc = glGetUniformLocation(g_ogl.shader2_program, "FrameDirection");
if (loc != -1)
glUniform1i(loc, 1);
loc = glGetUniformLocation(g_ogl.shader2_program, "Texture"); loc = glGetUniformLocation(g_ogl.shader2_program, "Texture");
if (loc == -1)
loc = glGetUniformLocation(g_ogl.shader2_program, "rubyTexture");
if (loc != -1) if (loc != -1)
glUniform1i(loc, 0); glUniform1i(loc, 0);
loc = glGetUniformLocation(g_ogl.shader2_program, "PassPrev2Texture"); loc = glGetUniformLocation(g_ogl.shader2_program, "PassPrev2Texture");
if (loc != -1) if (loc != -1)
glUniform1i(loc, 1); glUniform1i(loc, 1);
@ -952,24 +888,13 @@ static void ogl_init_shader2_program()
if (loc != -1) if (loc != -1)
glUniform2fv(loc, 1, texture_size); glUniform2fv(loc, 1, texture_size);
loc = glGetUniformLocation(g_ogl.shader2_program, "FrameDirection");
if (loc != -1)
glUniform1i(loc, 1);
g_ogl.shader2_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader2_program, "FrameCount");
if (g_ogl.shader2_frame_count_uni_loc == -1)
g_ogl.shader2_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader2_program, "rubyFrameCount");
const float mvp_matrix[16] = { const float mvp_matrix[16] = {
1,0,0,0, 1,0,0,0,
0,1,0,0, 0,1,0,0,
0,0,1,0, 0,0,1,0,
0,0,0,1, 0,0,0,1,
}; };
glUniformMatrix4fv(glGetUniformLocation(g_ogl.shader2_program, "MVPMatrix"), 1, GL_FALSE, mvp_matrix);
loc = glGetUniformLocation(g_ogl.shader2_program, "MVPMatrix");
if (loc != -1)
glUniformMatrix4fv(loc, 1, GL_FALSE, mvp_matrix);
} }
static void ogl_render() static void ogl_render()
@ -990,11 +915,6 @@ static void ogl_render()
{ {
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
} }
else // 8 bpp only works with a shader (opengl 2.0 or above)
{
g_ogl.use_opengl = FALSE;
return;
}
DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE;
@ -1002,6 +922,9 @@ static void ogl_render()
(g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) && (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) &&
g_ddraw.render.run) g_ddraw.render.run)
{ {
if (InterlockedDecrement(&g_ddraw.zoom.frame_skip) > 0)
continue;
#if _DEBUG #if _DEBUG
dbg_draw_frame_info_start(); dbg_draw_frame_info_start();
#endif #endif
@ -1110,6 +1033,7 @@ static void ogl_render()
if (g_config.fixchilds) if (g_config.fixchilds)
{ {
g_ddraw.child_window_exists = FALSE; g_ddraw.child_window_exists = FALSE;
InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL);
EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary); 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)
@ -1161,11 +1085,8 @@ static void ogl_render()
0.0f, g_ogl.scale_h, 0.0f, g_ogl.scale_h,
}; };
glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW);
if (g_ogl.shader2_tex_coord_attr_loc != -1) glVertexAttribPointer(g_ogl.shader2_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
{ glEnableVertexAttribArray(g_ogl.shader2_tex_coord_attr_loc);
glVertexAttribPointer(g_ogl.shader2_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(g_ogl.shader2_tex_coord_attr_loc);
}
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0); glBindVertexArray(0);
} }
@ -1180,11 +1101,8 @@ static void ogl_render()
g_ogl.scale_w, 0.0f, g_ogl.scale_w, 0.0f,
}; };
glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW);
if (g_ogl.shader1_tex_coord_attr_loc != -1) glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
{ glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc);
glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc);
}
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0); glBindVertexArray(0);
} }
@ -1199,11 +1117,8 @@ static void ogl_render()
0.0f, g_ogl.scale_h, 0.0f, g_ogl.scale_h,
}; };
glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW);
if (g_ogl.shader1_tex_coord_attr_loc != -1) glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
{ glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc);
glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc);
}
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0); glBindVertexArray(0);
} }
@ -1225,9 +1140,7 @@ static void ogl_render()
} }
} }
if (glActiveTexture) glActiveTexture(GL_TEXTURE0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]); glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]);
if (g_ddraw.bpp == 8) if (g_ddraw.bpp == 8)
@ -1379,12 +1292,6 @@ static void ogl_render()
SwapBuffers(g_ogl.hdc); SwapBuffers(g_ogl.hdc);
/* 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) if (!g_ddraw.render.run)
break; break;
@ -1642,16 +1549,13 @@ static BOOL ogl_shader_test()
glBindTexture(GL_TEXTURE_2D, fbo_tex_id); glBindTexture(GL_TEXTURE_2D, fbo_tex_id);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface_tex); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface_tex);
if (glGetError() == GL_NO_ERROR) int i;
for (i = 0; i < g_ogl.surface_tex_height * g_ogl.surface_tex_width; i++)
{ {
int i; if (surface_tex[i] != 0x80808080)
for (i = 0; i < g_ogl.surface_tex_height * g_ogl.surface_tex_width; i++)
{ {
if (surface_tex[i] != 0x80808080) result = FALSE;
{ break;
result = FALSE;
break;
}
} }
} }
} }
@ -1666,8 +1570,6 @@ static BOOL ogl_shader_test()
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
} }
while (glGetError() != GL_NO_ERROR);
HeapFree(GetProcessHeap(), 0, surface_tex); HeapFree(GetProcessHeap(), 0, surface_tex);
return result; return result;
} }

View file

@ -153,9 +153,6 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src)
strftime(str_time, sizeof(str_time), "%Y-%m-%d_%H-%M-%S", localtime(&t)); 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); _snprintf(filename, sizeof(filename) - 1, "%s%s_%s.png", g_config.screenshot_dir, title, str_time);
if (FILE_EXISTS(filename))
return FALSE;
if (src->bpp == 8 && src->palette) if (src->bpp == 8 && src->palette)
{ {
if (!ss_screenshot_8bit(filename, src)) if (!ss_screenshot_8bit(filename, src))

View file

@ -1,8 +1,6 @@
#include <windows.h> #include <windows.h>
#include <intrin.h> #include <intrin.h>
#include <stdio.h>
#include <math.h> #include <math.h>
#include <tlhelp32.h>
#include "ddraw.h" #include "ddraw.h"
#include "debug.h" #include "debug.h"
#include "dd.h" #include "dd.h"
@ -12,8 +10,6 @@
#include "render_d3d9.h" #include "render_d3d9.h"
#include "utils.h" #include "utils.h"
#include "config.h" #include "config.h"
#include "versionhelpers.h"
#include "delay_imports.h"
/* /*
@ -73,123 +69,6 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast)
return NULL; 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) FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name)
{ {
if (!mod || mod == INVALID_HANDLE_VALUE) if (!mod || mod == INVALID_HANDLE_VALUE)
@ -201,15 +80,17 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name)
if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
return NULL; return NULL;
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) if (nt_headers->Signature != IMAGE_NT_SIGNATURE)
return NULL; return NULL;
DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; 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 NULL; return NULL;
PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)mod + import_desc_rva); PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva);
while (import_desc->FirstThunk) while (import_desc->FirstThunk)
{ {
@ -219,12 +100,12 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name)
continue; continue;
} }
char* imp_module_name = (char*)((DWORD)mod + import_desc->Name); char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name);
if (_stricmp(imp_module_name, module_name) == 0) if (_stricmp(imp_module_name, module_name) == 0)
{ {
PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)mod + import_desc->FirstThunk); PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk);
PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)mod + import_desc->OriginalFirstThunk); PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)dos_header + import_desc->OriginalFirstThunk);
while (first_thunk->u1.Function) while (first_thunk->u1.Function)
{ {
@ -235,7 +116,7 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name)
continue; continue;
} }
PIMAGE_IMPORT_BY_NAME import = (void*)((DWORD)mod + o_first_thunk->u1.AddressOfData); PIMAGE_IMPORT_BY_NAME import = (void*)((DWORD)dos_header + o_first_thunk->u1.AddressOfData);
if ((o_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) if ((o_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0)
{ {
@ -267,7 +148,10 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name)
BOOL util_caller_is_ddraw_wrapper(void* return_address) BOOL util_caller_is_ddraw_wrapper(void* return_address)
{ {
if (!delay_GetModuleHandleExA) BOOL (WINAPI *getModuleHandleExA)(DWORD, LPCSTR, HMODULE*) =
(void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "GetModuleHandleExA");
if (!getModuleHandleExA)
return FALSE; return FALSE;
void* directDrawCreate = (void*)util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate"); void* directDrawCreate = (void*)util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate");
@ -281,9 +165,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address)
HMODULE D3dHook_dll = GetModuleHandleA("D3dHook.dll"); HMODULE D3dHook_dll = GetModuleHandleA("D3dHook.dll");
if (D3dHook_dll) if (D3dHook_dll)
{ {
if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == D3dHook_dll) || if ((getModuleHandleExA(flags, return_address, &mod) && mod == D3dHook_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == D3dHook_dll) || (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == D3dHook_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == D3dHook_dll)) (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == D3dHook_dll))
{ {
MessageBoxA( MessageBoxA(
NULL, NULL,
@ -299,9 +183,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address)
HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll"); HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll");
if (wndmode_dll) if (wndmode_dll)
{ {
if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == wndmode_dll) || if ((getModuleHandleExA(flags, return_address, &mod) && mod == wndmode_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == wndmode_dll) || (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == wndmode_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == wndmode_dll)) (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == wndmode_dll))
{ {
MessageBoxA( MessageBoxA(
NULL, NULL,
@ -317,9 +201,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address)
HMODULE windmode_dll = GetModuleHandleA("windmode.dll"); HMODULE windmode_dll = GetModuleHandleA("windmode.dll");
if (windmode_dll) if (windmode_dll)
{ {
if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == windmode_dll) || if ((getModuleHandleExA(flags, return_address, &mod) && mod == windmode_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == windmode_dll) || (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == windmode_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == windmode_dll)) (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == windmode_dll))
{ {
MessageBoxA( MessageBoxA(
NULL, NULL,
@ -335,9 +219,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address)
HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll"); HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll");
if (dxwnd_dll) if (dxwnd_dll)
{ {
if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == dxwnd_dll) || if ((getModuleHandleExA(flags, return_address, &mod) && mod == dxwnd_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == dxwnd_dll) || (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == dxwnd_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == dxwnd_dll)) (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == dxwnd_dll))
{ {
MessageBoxA( MessageBoxA(
NULL, NULL,
@ -353,9 +237,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address)
HMODULE age_dll = GetModuleHandleA("age.dll"); HMODULE age_dll = GetModuleHandleA("age.dll");
if (age_dll) if (age_dll)
{ {
if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == age_dll) || if ((getModuleHandleExA(flags, return_address, &mod) && mod == age_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) || (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) ||
(delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll)) (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll))
{ {
HKEY hkey; HKEY hkey;
LONG status = LONG status =
@ -689,13 +573,6 @@ BOOL util_get_lowest_resolution(
void util_toggle_maximize() 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 client_rc;
RECT dst_rc; RECT dst_rc;
@ -745,23 +622,9 @@ void util_toggle_maximize()
int w = dst_rc.right - dst_rc.left; int w = dst_rc.right - dst_rc.left;
int h = dst_rc.bottom - dst_rc.top; int h = dst_rc.bottom - dst_rc.top;
double dst_ar; double dst_ar = (double)g_ddraw.height / g_ddraw.width;
double src_ar = (double)h / w; 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.top = 0;
dst_rc.left = 0; dst_rc.left = 0;
dst_rc.right = w; dst_rc.right = w;
@ -797,11 +660,7 @@ void util_toggle_maximize()
void util_toggle_fullscreen() void util_toggle_fullscreen()
{ {
/* Disable ALT+ENTER on battle.net and Infantry Online Zone List Window */ /* 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))) if (g_ddraw.bnet_active || (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)
return; return;
if (g_config.toggle_borderless && g_config.windowed) if (g_config.toggle_borderless && g_config.windowed)
@ -988,9 +847,6 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam)
return TRUE; return TRUE;
if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || 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 ||
strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "VideoRenderer") == 0 ||
strcmp(class_name, "MCIQTZ_Window") == 0 || strcmp(class_name, "MCIQTZ_Window") == 0 ||
strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "MCIAVI") == 0 ||
@ -998,9 +854,9 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam)
strcmp(class_name, "MCIWndClass") == 0 || strcmp(class_name, "MCIWndClass") == 0 ||
strcmp(class_name, "AVI Window") == 0) strcmp(class_name, "AVI Window") == 0)
{ {
if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE_NOSCALE) if (g_config.fixchilds != FIX_CHILDS_DETECT_HIDE)
{ {
g_ddraw.got_child_windows = g_ddraw.child_window_exists = TRUE; InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, hwnd);
} }
if (!(exstyle & WS_EX_TRANSPARENT)) if (!(exstyle & WS_EX_TRANSPARENT))

View file

@ -1,30 +1,43 @@
#include <windows.h> #include <windows.h>
#include "versionhelpers.h" #include "versionhelpers.h"
#include "delay_imports.h"
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);
static RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo;
static WINE_GET_VERSIONPROC wine_get_version;
static WINE_GET_HOST_VERSIONPROC wine_get_host_version;
/* GetProcAddress is rather slow so we use a function to initialize it once on startup */
void verhelp_init()
{
HMODULE mod = GetModuleHandleA("ntdll.dll");
if (mod)
{
RtlVerifyVersionInfo = (RTLVERIFYVERSIONINFOPROC)GetProcAddress(mod, "RtlVerifyVersionInfo");
wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version");
wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version");
}
}
BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask) BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask)
{ {
return delay_RtlVerifyVersionInfo ? return RtlVerifyVersionInfo ?
delay_RtlVerifyVersionInfo(versionInfo, typeMask, conditionMask) == 0 : RtlVerifyVersionInfo(versionInfo, typeMask, conditionMask) == 0 :
VerifyVersionInfoW(versionInfo, typeMask, conditionMask); 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() const char* verhelp_wine_get_version()
{ {
return delay_wine_get_version ? delay_wine_get_version() : NULL; return wine_get_version ? wine_get_version() : NULL;
} }
void verhelp_wine_get_host_version(const char** sysname, const char** release) void verhelp_wine_get_host_version(const char** sysname, const char** release)
{ {
if (delay_wine_get_host_version) if (wine_get_host_version)
{ {
delay_wine_get_host_version(sysname, release); wine_get_host_version(sysname, release);
return; return;
} }

File diff suppressed because it is too large Load diff

View file

@ -22,7 +22,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 && 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_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_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( TRACE(
" uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d, LO=%d HI=%d)\n", " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d, LO=%d HI=%d)\n",
@ -42,16 +42,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
switch (uMsg) switch (uMsg)
{ {
case WM_NULL:
case WM_MOVING: case WM_MOVING:
case WM_NCLBUTTONDOWN: case WM_NCLBUTTONDOWN:
case WM_NCLBUTTONUP: case WM_NCLBUTTONUP:
case WM_NCPAINT: case WM_NCPAINT:
case WM_CANCELMODE: case WM_CANCELMODE:
case WM_DISPLAYCHANGE: case WM_DISPLAYCHANGE:
case WM_NCCALCSIZE:
{ {
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
} }
case WM_GETMINMAXINFO: case WM_GETMINMAXINFO:
{ {
@ -89,48 +87,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
return 0; return 0;
} }
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
} }
case WM_KILLFOCUS:
case WM_NCACTIVATE: case WM_NCACTIVATE:
{ {
if (g_config.noactivateapp) if (g_config.noactivateapp)
{ {
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
} }
break; break;
} }
case WM_NCHITTEST: case WM_NCHITTEST:
{ {
if (g_mouse_locked || g_config.devmode) LRESULT result = DefWindowProc(hWnd, uMsg, wParam, lParam);
{
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);
if (!g_config.resizable) if (!g_config.resizable)
{ {
@ -175,7 +145,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
case HTTOP: case HTTOP:
case HTTOPLEFT: case HTTOPLEFT:
case HTTOPRIGHT: case HTTOPRIGHT:
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
case HTCLIENT: case HTCLIENT:
if (!g_mouse_locked && !g_config.devmode) if (!g_mouse_locked && !g_config.devmode)
{ {
@ -245,12 +215,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
return 0; 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; break;
} }
@ -353,24 +317,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
real_GetWindowLongA(hWnd, GWL_EXSTYLE)) && real_GetWindowLongA(hWnd, GWL_EXSTYLE)) &&
SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top)) SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top))
{ {
double scale_h; double scaleH = (double)g_ddraw.height / g_ddraw.width;
double scale_w; double scaleW = (double)g_ddraw.width / g_ddraw.height;
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;
}
switch (wParam) switch (wParam)
{ {
@ -379,19 +327,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
case WMSZ_LEFT: case WMSZ_LEFT:
case WMSZ_RIGHT: case WMSZ_RIGHT:
{ {
windowrc->bottom += (LONG)round(scale_h * clientrc.right - clientrc.bottom); windowrc->bottom += (LONG)round(scaleH * clientrc.right - clientrc.bottom);
break; break;
} }
case WMSZ_TOP: case WMSZ_TOP:
case WMSZ_BOTTOM: case WMSZ_BOTTOM:
{ {
windowrc->right += (LONG)round(scale_w * clientrc.bottom - clientrc.right); windowrc->right += (LONG)round(scaleW * clientrc.bottom - clientrc.right);
break; break;
} }
case WMSZ_TOPRIGHT: case WMSZ_TOPRIGHT:
case WMSZ_TOPLEFT: case WMSZ_TOPLEFT:
{ {
windowrc->top -= (LONG)round(scale_h * clientrc.right - clientrc.bottom); windowrc->top -= (LONG)round(scaleH * clientrc.right - clientrc.bottom);
break; break;
} }
} }
@ -476,70 +424,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
{ {
if (g_config.windowed) if (g_config.windowed)
{ {
WORD width = LOWORD(lParam);
WORD height = HIWORD(lParam);
if (wParam == SIZE_RESTORED) if (wParam == SIZE_RESTORED)
{ {
/* macOS maximize hack */
if (in_size_move && g_ddraw.render.thread && IsMacOS())
{
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;
}
if (in_size_move && !g_ddraw.render.thread) if (in_size_move && !g_ddraw.render.thread)
{ {
g_config.window_rect.right = width; g_config.window_rect.right = LOWORD(lParam);
g_config.window_rect.bottom = height; g_config.window_rect.bottom = HIWORD(lParam);
} }
else if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && IsLinux()) else if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && g_config.wine_allow_resize && IsLinux())
{ {
if (width != g_ddraw.render.width || height != g_ddraw.render.height) g_config.window_rect.right = LOWORD(lParam);
{ g_config.window_rect.bottom = HIWORD(lParam);
KillTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE);
g_config.window_rect.right = width;
g_config.window_rect.bottom = height;
if (g_config.window_rect.right != g_ddraw.render.width || g_config.window_rect.bottom != g_ddraw.render.height)
dd_SetDisplayMode(0, 0, 0, 0); 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);
}
}
} }
} }
} }
@ -550,7 +448,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); 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: case WM_MOVE:
{ {
@ -564,7 +462,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
util_update_bnet_pos(x, y); util_update_bnet_pos(x, y);
} }
if (in_size_move || (IsLinux() && !g_config.fullscreen && g_ddraw.render.thread)) if (in_size_move || (IsWine() && !g_config.fullscreen && g_ddraw.render.thread))
{ {
if (x != -32000) if (x != -32000)
g_config.window_rect.left = x; /* -32000 = Exit/Minimize */ g_config.window_rect.left = x; /* -32000 = Exit/Minimize */
@ -577,7 +475,7 @@ 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); 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_RESTORE_STYLE:
{ {
@ -607,9 +505,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
if (wParam == SC_MAXIMIZE) if (wParam == SC_MAXIMIZE)
{ {
if (IsWine())
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam);
if (g_config.resizable) if (g_config.resizable)
{ {
util_toggle_maximize(); util_toggle_maximize();
@ -620,18 +515,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
if (wParam == SC_CLOSE && !GameHandlesClose) if (wParam == SC_CLOSE && !GameHandlesClose)
{ {
if (g_config.terminate_process) _exit(0);
g_config.terminate_process = 2;
ExitProcess(0);
//_exit(0);
} }
if (wParam == SC_KEYMENU && GetMenu(g_ddraw.hwnd) == NULL) if (wParam == SC_KEYMENU && GetMenu(g_ddraw.hwnd) == NULL)
return 0; return 0;
if (!GameHandlesClose) if (!GameHandlesClose)
return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); return DefWindowProc(hWnd, uMsg, wParam, lParam);
break; break;
} }
@ -666,13 +557,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
} }
case WM_ACTIVATE: 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); RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
} }
if (LOWORD(wParam) == WA_INACTIVE) if (wParam == WA_INACTIVE)
{ {
if (g_config.windowed && !g_config.fullscreen && lParam && GetParent((HWND)lParam) == hWnd) if (g_config.windowed && !g_config.fullscreen && lParam && GetParent((HWND)lParam) == hWnd)
{ {
@ -709,21 +600,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
} }
} }
if (g_config.windowed || g_config.noactivateapp) //if (g_ddraw.windowed || g_ddraw.noactivateapp)
{
/* let it pass through once (Atrox) */
static BOOL one_time;
if (!one_time)
{
one_time = TRUE;
if (LOWORD(wParam))
break;
}
if (!g_config.allow_wmactivate)
return 0; return 0;
}
break; break;
} }
@ -767,7 +647,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
} }
} }
if (wParam && g_config.fix_alt_key_stuck) if (wParam && g_config.releasealt)
{ {
INPUT ip; INPUT ip;
memset(&ip, 0, sizeof(ip)); memset(&ip, 0, sizeof(ip));
@ -799,11 +679,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
break; break;
} }
if (wParam && g_ddraw.alt_key_down && !g_config.fix_alt_key_stuck) if (wParam && g_ddraw.alt_key_down && !g_config.releasealt)
{
PostMessageA(g_ddraw.hwnd, WM_SYSKEYUP, VK_MENU, 0); PostMessageA(g_ddraw.hwnd, WM_SYSKEYUP, VK_MENU, 0);
g_ddraw.alt_key_down = FALSE;
}
return 0; return 0;
} }
@ -854,28 +731,102 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
} }
case WM_SYSKEYDOWN: 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.toggle_upscaled || (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; break;
} }
case WM_SYSKEYUP: 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; break;
} }
case WM_KEYDOWN: case WM_KEYDOWN:
{ {
if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */
{
util_toggle_fullscreen();
return 0;
}
if (g_config.hotkeys.unlock_cursor1 &&
(wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1))
{
if (real_GetAsyncKeyState(VK_CONTROL) & 0x8000 && real_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 ((real_GetAsyncKeyState(VK_RMENU) & 0x8000) && real_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; break;
} }
case WM_KEYUP: case WM_KEYUP:
{ {
if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */
return 0;
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; break;
} }
/* button up messages reactivate cursor lock */ /* button up messages reactivate cursor lock */
@ -967,6 +918,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
lParam = MAKELPARAM(x, 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; break;
} }
case WM_PARENTNOTIFY: case WM_PARENTNOTIFY: