diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 34c8dce..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,154 +0,0 @@ -name: Build - -on: - push: - branches: - - 'master' - - 'github-action' - -jobs: - Build: - runs-on: windows-2019 - steps: - -# - name: Install Windows XP Support for Visual Studio 2022 # windows-2022 # v141_xp # Installation takes more than 5 minutes -# run: | -# Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\" -# $InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise" -# $componentsToAdd = @( -# "Microsoft.VisualStudio.Component.WinXP" -# ) -# [string]$workloadArgs = $componentsToAdd | ForEach-Object {" --add " + $_} -# $Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache') -# $process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden -# if ($process.ExitCode -eq 0) -# { -# Write-Host "components have been successfully added" -# Get-ChildItem C:\ProgramData\Microsoft\VisualStudio\Packages\Microsoft.Windows.XPSupport.* -# } -# else -# { -# Write-Host "components were not installed" -# exit 1 -# } - - - name: Clone cnc-ddraw - uses: actions/checkout@v4 - - - name: Release build - id: build-release - uses: ./ - with: - release: true - - - name: ReleaseXP build - id: build-releasexp - uses: ./ - with: - releasexp: true - - - name: Debug build - id: build-debug - uses: ./ - with: - debug: true - - - name: DebugLogXP build - id: build-debuglogxp - uses: ./ - with: - debuglogxp: true - - - name: DebugLogMiniXP build - id: build-debuglogminixp - uses: ./ - with: - debuglogminixp: true - - - name: Prepare artifact - run: | - : - - mkdir -p cnc-ddraw-experimental - - if [[ -f "${{ steps.build-release.outputs.release }}" ]]; then - mkdir -p cnc-ddraw-release - - cp "${{ steps.build-release.outputs.release }}" cnc-ddraw-release - fi - - if [[ -f "${{ steps.build-releasexp.outputs.releasexp }}" ]]; then - mkdir -p cnc-ddraw-releasexp - - cp "${{ steps.build-releasexp.outputs.releasexp }}" cnc-ddraw-releasexp - - rundll32.exe ./cnc-ddraw-releasexp/ddraw.dll, DDIsWindowed - - cp "${{ steps.build-releasexp.outputs.releasexp-pdb }}" cnc-ddraw-experimental - 7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-release.zip" "./cnc-ddraw-releasexp/ddraw.*" - fi - - if [[ -f "${{ steps.build-debug.outputs.debug }}" ]]; then - mkdir -p cnc-ddraw-debug - - cp "${{ steps.build-debug.outputs.debug }}" cnc-ddraw-debug - cp "${{ steps.build-debug.outputs.debug-pdb }}" cnc-ddraw-debug - fi - - if [[ -f "${{ steps.build-debuglogxp.outputs.debuglogxp }}" ]]; then - mkdir -p cnc-ddraw-debuglogxp - - cp "${{ steps.build-debuglogxp.outputs.debuglogxp }}" cnc-ddraw-debuglogxp - cp "${{ steps.build-debuglogxp.outputs.debuglogxp-pdb }}" cnc-ddraw-debuglogxp - - 7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-debuglog.zip" "./cnc-ddraw-debuglogxp/*" - fi - - if [[ -f "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" ]]; then - mkdir -p cnc-ddraw-debuglogminixp - - cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" cnc-ddraw-debuglogminixp - cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp-pdb }}" cnc-ddraw-debuglogminixp - fi - - shell: bash - - - name: Upload artifacts cnc-ddraw-release - uses: actions/upload-artifact@v4 - with: - name: cnc-ddraw-release - path: cnc-ddraw-release - - - name: Upload artifacts cnc-ddraw-releasexp - uses: actions/upload-artifact@v4 - with: - name: cnc-ddraw-releasexp - path: cnc-ddraw-releasexp - - - name: Upload artifacts cnc-ddraw-debug - uses: actions/upload-artifact@v4 - with: - name: cnc-ddraw-debug - path: cnc-ddraw-debug - - - name: Upload artifacts cnc-ddraw-debuglogxp - uses: actions/upload-artifact@v4 - with: - name: cnc-ddraw-debuglogxp - path: cnc-ddraw-debuglogxp - - - name: Upload artifacts cnc-ddraw-debuglogminixp - uses: actions/upload-artifact@v4 - with: - name: cnc-ddraw-debuglogminixp - path: cnc-ddraw-debuglogminixp - - - name: Release experimental - uses: softprops/action-gh-release@v1 - with: - prerelease: true - name: experimental - tag_name: experimental - files: cnc-ddraw-experimental/* - fail_on_unmatched_files: true - draft: true diff --git a/.gitignore b/.gitignore index 46accfc..158b71e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,4 @@ -inc/git.h - # C++ Builder __astcache/ diff --git a/LICENSE b/LICENSE index e15366d..40417c9 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022 github.com/FunkyFr3sh +Copyright (c) 2020 CnCNet Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Makefile b/Makefile index c2f547b..7889b8e 100644 --- a/Makefile +++ b/Makefile @@ -1,48 +1,45 @@ -include config.mk -TARGET ?= ddraw.dll +WINDRES ?= windres +LDFLAGS = -Iinc -Wall -Wl,--enable-stdcall-fixup -s +CFLAGS = -std=c99 +LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 -LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared -CFLAGS ?= -Iinc -O2 -Wall -std=c99 -LIBS = -lgdi32 -lwinmm -lole32 -lmsimg32 -lavifil32 -luuid +FILES = src/IDirect3D/IDirect3D.c \ + src/IDirect3D/IDirect3D2.c \ + src/IDirect3D/IDirect3D3.c \ + src/IDirect3D/IDirect3D7.c \ + src/IDirectDraw/IDirectDraw.c \ + src/IDirectDraw/IDirectDrawPalette.c \ + src/IDirectDraw/IDirectDrawClipper.c \ + src/IDirectDraw/IDirectDrawSurface.c \ + src/IDirectDraw/IDirectDrawGammaControl.c \ + src/IAMMediaStream/IAMMediaStream.c \ + src/dd.c \ + src/ddpalette.c \ + src/ddsurface.c \ + src/ddclipper.c \ + src/render_ogl.c \ + src/render_gdi.c \ + src/render_d3d9.c \ + src/debug.c \ + src/mouse.c \ + src/winapi_hooks.c \ + src/screenshot.c \ + src/config.c \ + src/lodepng.c \ + src/directinput.c \ + src/hook.c \ + src/dllmain.c \ + src/wndproc.c \ + src/utils.c \ + src/fps_limiter.c \ + src/opengl_utils.c -COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) -BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) - -HASH := \# -ECHOTEST := $(shell echo \"\") -ifeq ($(ECHOTEST),\"\") - # Windows - ECOMMIT := $(shell echo $(HASH)define GIT_COMMIT "$(COMMIT)" > inc/git.h) - EBRANCH := $(shell echo $(HASH)define GIT_BRANCH "$(BRANCH)" >> inc/git.h) -else - # Either *nix or Windows with BusyBox (e.g. w64devkit) - ECOMMIT := $(shell echo "$(HASH)define GIT_COMMIT" \"$(COMMIT)\" > inc/git.h) - EBRANCH := $(shell echo "$(HASH)define GIT_BRANCH" \"$(BRANCH)\" >> inc/git.h) -endif - -ifdef DEBUG - CFLAGS += -D _DEBUG -D _DEBUG_X -endif - -ifdef _WIN32_WINNT - CFLAGS += -march=i486 -D _WIN32_WINNT=$(_WIN32_WINNT) -endif - -CC = i686-w64-mingw32-gcc -WINDRES ?= i686-w64-mingw32-windres - -SRCS := $(wildcard src/*.c) $(wildcard src/*/*.c) res.rc -OBJS := $(addsuffix .o, $(basename $(SRCS))) - -.PHONY: clean all -all: $(TARGET) - -%.o: %.rc - $(WINDRES) -J rc $< $@ || windres -J rc $< $@ - -$(TARGET): $(OBJS) - $(CC) $(LDFLAGS) -o $@ $^ exports.def $(LIBS) +all: + $(WINDRES) -J rc ddraw.rc ddraw.rc.o + $(CC) $(CFLAGS) $(LDFLAGS) -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) +# $(CC) $(CFLAGS) $(LDFLAGS) -nostdlib -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) -lkernel32 -luser32 -lmsvcrt clean: - $(RM) $(TARGET) $(OBJS) || del $(TARGET) $(subst /,\\,$(OBJS)) + $(RM) ddraw.dll ddraw.rc.o diff --git a/README.md b/README.md index 7485601..ea0747a 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # cnc-ddraw -cnc-ddraw can fix compatibility issues in older 2D games, such as black screen, bad performance, crashes or defective Alt+Tab. It does also add new features such as borderless mode, windowed mode and upscaling via shaders. +cnc-ddraw can fix compatibility issues in older games, such as black screen, bad performance, crashes or defective Alt+Tab.   ### Features - - Supports Windows ME, 2000, XP, Vista, 7, 8, 10, 11, Wine (Linux/macOS/Android) and Virtual Machines + - Supports Windows XP, Vista, 7, 8, 10, 11 and Wine - GDI / OpenGL / Direct3D 9 renderer (With automatic renderer selection) - Upscaling via glsl shaders - https://imgur.com/a/kxsM1oY | https://imgur.com/a/wjrhpFV - Windowed Mode / Fullscreen Exclusive Mode / Borderless Mode @@ -21,19 +21,37 @@ cnc-ddraw can fix compatibility issues in older 2D games, such as black screen, ### Instructions -1. Download [cnc-ddraw.zip](https://github.com/FunkyFr3sh/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) and extract it into your game folder +1. Download [cnc-ddraw.zip](https://github.com/CnCNet/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) and extract it into your game folder 2. Start the game -Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) manually or run `cnc-ddraw config.exe` once. + +Note: If you use cnc-ddraw with a game that got its own windowed mode built in then **make sure you disable the games own windowed mode** first. + +If you want to play in windowed mode then start the game once in fullscreen and then press Alt+Enter to enable the cnc-ddraw windowed mode (Or enable windowed mode in the config program without using Alt+Enter).   -**Important** +**If the game starts but it doesn't work perfectly** then open the config program and check the **Compatibility settings**. Alternatively you can also open ddraw.ini with notepad and modify the **Compatibility settings** in there. -- **The game must be set to fullscreen**. To enable windowed mode, use `cnc-ddraw config.exe` instead -- **cnc-ddraw does not support Direct3D games**, the game must have a **DirectDraw (Software)** renderer -- **If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/FunkyFr3sh/cnc-ddraw/issues/44) -- Some games require additional steps before they can be used with cnc-ddraw, check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) for details +  + +**Compatibility settings in ddraw.ini** + +- If there are **problems on Alt+Tab** then try to set `noactivateapp=true` - If it still doesn't work also try `renderer=opengl` or `renderer=gdi`. + +- If the **game is running too fast** then try to set `maxgameticks=60` - If it's still too fast, try a lower value. + +- If **windowed mode or upscaling are not working properly** then try to set `hook=2` and `renderer=gdi`. + +- If **videos or other UI elements are invisible** then try to set `nonexclusive=true`. + +- If some parts of the screen are **being displayed diagonally** then try to set `fixpitch=true`. + +- If the game is **stuttering on a Freesync/G-Sync monitor** then try to set `minfps=-1`. + +  + +**If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/CnCNet/cnc-ddraw/issues/44)   @@ -41,451 +59,37 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine * [Alt] + [Enter] = Switch between windowed and fullscreen mode * [Ctrl] + [Tab] = Unlock cursor * [Right Alt] + [Right Ctrl] = Unlock cursor -* [Alt] + [Page Down] = Maximize window   ### Supported Games -- 101: The Airborne Invasion of Normandy -- 7th Legion -- Abomination - The Nemesis Project -- Addiction Pinball -- Age of Empires -- Age of Empires II -- Age of Empires II: The Conquerors -- Age of Empires: The Rise of Rome -- Age of Wonders -- Age of Wonders 2 -- Age of Wonders: Shadow Magic -- Agharta the Hollow Earth -- Airline 69: Return to Casablanca -- Airline Tycoon Deluxe -- Alien Nations -- American Conquest (Steam+GOG) -- American Girls Dress Designer -- Amerzone -- Ancient Conquest -- Ancient Evil -- Anno 1602: Creation of a New World -- Another War -- Anstoss 3 -- Arcanum: Of Steamworks and Magick Obscura -- Arcatera the Dark Brotherhood -- Army Men 2 -- Army Men: Air Tactics -- Army Men: Toys in Space -- Army Men: World War / Army Men: Operation Meltdown -- Arthur's Pet Chase -- Arthur's Sand Castle Contest -- Arthur's Wilderness Rescue -- Atlantis 2: Beyond Atlantis -- Atlantis 3: The New World -- Atlantis: The Lost Tales -- Atomic Bomberman -- Atrox -- Baldr Force EXE -- Baldur's Gate -- Baldur's Gate 2 -- Balls of Steel v1.2 -- Barbie(R) Photo Designer -- Barbie(tm) Beach Vacation(tm) -- Batman: Justice Unbalanced -- Batman: Toxic Chill -- Bejeweled 2 Deluxe -- Birthright: The Gorgons Alliance -- Blade & Sword -- Blood II - The Chosen -- Blue's 123 Time Activities -- Blue's Treasure Hunt -- Broken Sword -- Broken Sword 2: The Smoking Mirror -- Caesar III (Sierra - 1998) -- Call To Power 2 -- Callus 95 - CPS-1 (Capcom Play System 1) emulator -- Capitalism II -- Capitalism Lab -- Captain Claw -- Carmageddon -- Carmageddon 2 -- Casino Empire (AKA Hoyle Casino) -- Championship Manager 99-00 -- Chaos Gate -- Clans -- Close Combat 2: A Bridge Too Far -- Close Combat 3: The Russian Front -- Close Combat 4: The Battle of the Bulge -- Close Combat 5: Invasion: Normandy -- ClueFinders 3rd Grade Adventures -- ClueFinders 4th Grade Adventures -- ClueFinders 5th Grade Adventures -- ClueFinders 6th Grade Adventures -- ClueFinders Math Adventures 1.0 -- ClueFinders Math Adventures 2.0 -- ClueFinders Mystery Mansion -- ClueFinders Search and Solve Adventures -- ClueFinders The Incredible Toy Store Adventure -- ClueFinders(R) Reading Adventures Ages 9-12 -- Command & Conquer Gold -- Command & Conquer: Red Alert -- Command & Conquer: Red Alert 2 -- Command & Conquer: Red Alert 2: Yuri's Revenge -- Command & Conquer: Sole Survivor -- Command & Conquer: Tiberian Sun -- Commandos -- Commandos - Beyond The Call Of Duty -- Commandos 2 -- Commando 2004 (only with /ddraw command line parameter) -- Constructor -- Corsairs Gold -- Cossacks (Steam+GOG) -- Cultures - The Discovery of Vinland -- Cultures 2 -- Cyber Gladiators (needs CyberGladiators_Patch_Win_EN_WinXP.zip) -- Cyberchase Carnival Chaos -- Cyberchase Castleblanca Quest -- Cydonia Mars - The First Manned Mission -- Cloud Kingdom 3 (only with /ddraw command line parameter) -- Dark Earth -- Dark Reign: The Future of War -- Dark Secret of Africa -- Day Of The Tentacle -- Daytona -- Daytona USA (Sega - 1996) -- Deadlock 2 -- Deadly Tide -- Delta Force -- Desperados: Wanted Dead or Alive -- Diablo -- Diablo 2 -- Diablo 2: Lord of Destruction -- Diablo: Hellfire -- Die by the Sword -- Disciples -- Disciples 2 - Rise of the Elves -- Discoworld Noir -- Divine Divinity -- Dominion - Storm Over Gift 3 -- Doom 95 -- Dracula -- Dragon Throne: Battle of Red Cliffs -- Dreams to Realty -- DuelSavior -- DuelSavior: Justice -- Dune 2000 -- Dungeon Keeper -- Dungeon Keeper 2 -- Economic War -- Eggsucker -- Emperor: Rise of the Middle Kingdom -- Enemy Infestation -- Escape Velocity Nova -- Excalibur 2555AD -- F-16 Agressor -- F-16 Multirole Fighter -- F-22 Raptor -- Fable -- Fairy Tale About Father Frost, Ivan and Nastya -- Falcon 4.0 (Microprose version) -- Fallout -- Fallout 2 -- Fallout Tactics: Brotherhood of Steel -- Final fantasy VII -- Final fantasy VIII -- Final Liberation: Warhammer Epic 40000 (GOG) -- Freddi Fish -- Freddi Fish 4 -- Freddi Fish's One-Stop Fun Shop -- Freddi Fish: Maze Madness -- Freddi Fish: The Case of the Creature of Coral Cove -- Freddi Fish: The Case of the Haunted Schoolhouse -- Freddi Fish: The Case of the Hogfish Rustlers of Briny Gulch -- Freddi Water Worries -- Full Throttle -- Future Cop L.A.P.D -- G-Police -- Gateway (Remake) -- Geneforge -- Gilbert Goodmate And The Mushroom Of Phungoria -- Gorasul: The Legacy of the Dragon -- Grand Theft Auto -- Grand Theft Auto: London 1961 -- Grand Theft Auto: London 1969 -- Gromada Revenge -- Gruntz -- Hamtaro: Wake Up Snoozer! -- Handkerchief -- Hard Truck: Road to Victory -- Heart of Darkness -- Hearts of Iron 2 -- Heroes Chronicles: Clash of the Dragons -- Heroes Chronicles: Conquest of the Underworld -- Heroes Chronicles: Masters of the Elements -- Heroes Chronicles: Warlords of the Wasteland -- Heroes of Might and Magic -- Heroes of Might and Magic II -- Heroes of Might and Magic III -- Heroes of Might and Magic IV -- Hexen 95 -- Hooligans: Storm over Europe -- Hugo Gold -- Hugo Wild River -- Icewind Dale -- Icewind Dale 2 -- Ignition -- Imperialism 2: The Age of Exploration -- Indiana Jones and the Fate of Atlantis -- Indiana Jones and the Last Crusade -- Infantry Online -- Interstate 76 -- Invictus: In the Shadow of Olympus -- Jagged Alliance 2 -- Jagged Alliance 2: Unfinished Business -- Jagged Alliance 2: Wildfire -- Jazz Jackrabbit 2 -- Jeff Wayne's The War of the Worlds -- Karma Immortal Wrath -- Killing Time -- Kings Quest 8: Mask of Eternity -- KKND Xtreme -- KKND2: Krossfire -- Knights and Merchants: The Peasants Rebellion -- Knights and Merchants: The Shattered Kingdom -- Kohan: Immortal Sovereigns -- Konung -- Konung 2 -- Lands of Lore 2 Guardian of Destiny (Software mode only) -- Lapis (lapis.mgame.com) -- Last Bronx -- Links Extreme -- Lionheart - Legacy of the Crusader -- Little Bear Kindergarten Thinking Adventures -- Little Bear Preschool Thinking Adventures -- Little Bear Rainy Day Activities -- Little Bear Toddler Discovery Adventures -- Locomotion -- Lode Runner 2 -- Lost Vikings 2 -- M.A.X. 2 Mechanized Assault & Exploration -- Madeline 1st Grade Math -- Madeline 2nd Grade Math -- Mageslayer -- Majesty Gold -- Majesty Gold HD -- Mario Sorb 3 -- Meat Puppet -- Mech Warrior 3 -- Megaman X4 -- Metal Gear Solid -- Metal Knight -- Mob Rule (AKA Constructor: Street Wars / Street Wars: Constructor Underworld) -- Moorhuhn -- Moorhuhn 2 -- Moorhuhn Adventure: Fluch des Goldes -- Moorhuhn Adventure: Schatz des Pharao and Fluch des Goldes) -- Moorhuhn Winter Editon -- MiG-29 Fulcrum -- Mission Deliver Kindness -- Moto Racer -- Moto Racer 2 -- Nancy Drew: Danger on Deception Island -- Nancy Drew: Last Train to Blue Moon Canyon -- Nancy Drew: Message in a Haunted Mansion -- Nancy Drew: Secrets Can Kill -- Nancy Drew: Stay Tuned For Danger -- Nancy Drew: The Secret of Shadow Ranch -- Nancy Drew: Treasure in the Royal Tower -- NBA Action '98 -- NBA Full Court Press -- Need For Speed III: Hot Pursuit -- Need For Speed: High Stakes -- Neo Sonic Universe -- New Robinson -- NexusTk -- Nightmare Creatures -- Ninja Jonder Deluxe -- Nox (Westwood - 2000) -- Oddworld: Abe's Exoddus -- Oddworld: Abe's Oddysee -- Original War -- Outlaws -- Outlive -- Outwars (software mode) -- Pacific General -- Pajama Sam -- Pajama Sam 3 -- Pajama Sam 3: You Are What You Eat From Your Head To Your Feet -- Pajama Sam's Games to Play on Any Day -- Pajama Sam's One-Stop Fun Shop -- Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm) -- Pajama Sam: No Need to Hide When It's Dark Outside -- Pandora's Box Puzzle Game -- Panzer Dragoon -- Patrician 3 -- Pax Imperia -- Pharaoh (Sierra - 1999) -- Pizza Syndicate (AKA Fast Food Tycoon) -- Platypus -- Populous: The Beginning -- Poseidon: Master of Atlantis -- Pro Pinball - Big Race USA -- Pro Pinball - Fantastic Journey -- Putt-Putt and Pep's Balloon-o-Rama -- Putt-Putt and Pep's Dog On A Stick -- Putt-Putt Joins the Circus -- Putt-Putt Saves The Zoo -- Putt-Putt's One-Stop Fun Shop -- Putt-Putt: Pep's Birthday Surprise -- Putt-Putt: Travels Through Time -- Quest for Glory 5 -- Rage of Mages -- Rage of Mages 2 -- Railroad Tycoon II -- Reader Rabbit 1st Grade -- Reader Rabbit 2nd Grade -- Reader Rabbit Dreamship Tales -- Reader Rabbit Kindergarten -- Reader Rabbit Learn To Read With Phonics -- Reader Rabbit Learning Creations -- Reader Rabbit Math Ages 4-6 -- Reader Rabbit Preschool 2002 -- Reader Rabbit Reading Ages 4-6 -- Reader Rabbit Reading Ages 6-9 -- Reader Rabbit Thinking Ages 4-6 (US) -- Reader Rabbit Toddler -- Reader Rabbit's(R) Math Ages 6 - 9 (2002) -- Real War -- Red Baron 3D -- Reksio and Captain Nemo (Reksio i Kapitan Nemo) -- Reksio and Kretes in Action (Reksio i Kretes w Akcji!) -- Reksio and the Pirate Treasure (Reksio i Skarb Piratów) -- Reksio and the Time Machine (Reksio i Wehikuł Czasu) -- Reksio and the UFO (Reksio i Ufo) -- Reksio and the Wizards (Reksio i Czarodzieje) -- Rent-A-Hero -- Resurrection - The Return of the Black Dragon (software mode) -- Return to Krondor -- Rising Lands (patched) -- Road Rash -- Robin Hood - The Legend of Sherwood -- Roland Garros 98 (software mode) -- RollerCoaster Tycoon -- Sanitarium -- Scooby-Doo(TM), Case File #2 The Scary Stone Dragon -- Scooby-Doo(TM), Phantom of the Knight(TM) -- Scooby-Doo(TM), Showdown in Ghost Town(TM) -- Sega Rally -- Sega Touring Car -- Septerra Core -- Settlers 3 -- Seven Kingdoms II -- Shadow Flare -- Shadow Watch -- Shogo - Mobile Armor Division -- Silver (needs "SilverUK GeForce2 And Radeon Patch") -- Sim City 3000 -- Sim Copter -- SimTunes -- Sim Theme Park (aka Theme Park World) -- SimCoaster / Theme Park Inc -- Simon the Sorcerer 1/2 (windows 95 version) -- Sonic 3D Blast -- Soldiers At War -- Space Rangers -- Spec Ops - Ranger Assault (software mode) -- SpongeBob SquarePants: Typing -- SPY Fox : Some Assembly Required -- SPY Fox in Dry Cereal -- SPY Fox: Hold the Mustard -- SPY Fox: Operation Ozone -- Squad Leader -- Star Trek Away Team -- Star Trek Generations -- Star Wars Anakin's Speedway -- Star Wars Early Learning Activity Center -- Star Wars Episode I: The Gungan Frontier -- Star Wars Jedi Knight: Dark Forces II -- Star Wars Rebellion -- Star Wars Yoda's Challenge -- Star Wars: Droid Works -- Star Wars: Galactic Battlegrounds -- Star Wars: Galactic Battlegrounds: Clone Campaigns -- Star Wars: Pit Droids -- StarCraft -- StarCraft: Broodwars -- StarFlyers Alien Space Chase -- StarFlyers Royal Jewel Rescue -- Starship Titanic -- Start Trek Armada -- Steel Panthers: World At War -- Strawberry Shortcake: Amazing Cookie Party -- Stronghold Crusader Extreme HD -- Stronghold Crusader HD -- Stronghold HD -- Sudden Strike 2 -- Superbike 2000 -- Swarog -- The Jungle Book Groove Party -- The Curse Of Monkey Island -- The Dig -- The Last Express -- The Missing on Lost Island -- The Neverhood -- The Next Worlds -- The Powerpuff Girls - Princess Snorebucks -- The Powerpuff Girls(TM) Mojo Jojo's Clone Zone -- The Rocky Interactive Horror Show -- The Sex Files -- The X-Files DVD -- Theme Hospital -- Three Kingdoms: Fate of the Dragon -- Throne of Darkness -- Thunder Brigade -- TianLong BaBu -- Tone Rebellion -- Total Annihilation -- Total Annihilation (Unofficial Beta Patch v3.9.02) -- Total Annihilation: Kingdoms -- Toy Story -- Tridonis -- Twisted Metal -- Twisted Metal 2 -- Tzar: The Burden of the Crown -- Unreal -- Uprising 2: Lead and Destroy -- Uprising: Join or Die -- Vermeer -- Virtua Cop -- Virtua Cop 2 -- Virtua Fighter 2 -- Virtua Fighter PC -- Virtual Springfield -- Virtual On: Cyber Troopers -- WarGames -- War Wind -- War Wind II - Human Onslaught -- Warcraft 2 -- WarCraft 2000: Nuclear Epidemic -- Warlords 3: Darklords Rising -- Warlords Battlecry -- Warlords Battlecry 2 -- Warlords Battlecry 3 -- Weird War -- Wheel Of Fortune -- Wing Commander - The Kilrathi Saga -- Wizardry 8 -- Wizards and Warriors -- Worms 2 -- Worms Armageddon -- Z & Z Expansion Kit -- Zeus: Master of Olympus -- Zoombinis Island Odyssey -- Zoombinis Logical Journey -- Zoombinis Mountain Rescue -- Zork Nemesis -- Zuma Deluxe -- ... -There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) and the instructions above. + - Command & Conquer Gold + - Command & Conquer: Red Alert + - Command & Conquer: Tiberian Sun + - Command & Conquer: Red Alert 2 + - Carmageddon + - Carmageddon 2 + - Warcraft 2 + - StarCraft + - Diablo + - Diablo 2 + - Age of Empires + - Age of Empires II + - Theme Hospital + - Populous: The Beginning + - Outlaws + - Dungeon Keeper + - Dark Reign: The Future of War + - Star Wars: Galactic Battlegrounds + - Atomic Bomberman + - Dune 2000 + - Oddworld: Abe's Oddysee + - Commandos + - Red Baron 3D + - F-16 Multirole Fighter + - F-22 Raptor + - Nox + - ... - -[![](https://img.shields.io/github/downloads/FunkyFr3sh/cnc-ddraw/total)](https://github.com/FunkyFr3sh/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) +There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the instructions above. diff --git a/action.yml b/action.yml deleted file mode 100644 index f2a0b38..0000000 --- a/action.yml +++ /dev/null @@ -1,211 +0,0 @@ -#name: 'sfall' -#description: 'Builds sfall binaries' -#author: '@wipe2238' - -### -# -# Example: -# -# - name: Build sfall -# id: sfall -# uses: phobos2077/sfall@develop -# with: -# release-xp: true -# -# - name: Copy sfall to mod directory -# run: copy "${{ steps.sfall.outputs.release-xp }}" "my/mod/directory/ddraw.dll" -# -### - -# While both inputs are marked as required, users needs to set only one of them (at minimum) to 'true' for action to work -inputs: - - release: - description: 'Set to true to enable building with Release configuration' - required: true - - releasexp: - description: 'Set to true to enable building with ReleaseXP configuration' - required: true - - debug: - description: 'Set to true to enable building with Debug configuration' - required: true - - debuglogxp: - description: 'Set to true to enable building with DebugLogXP configuration' - required: true - - debuglogminixp: - description: 'Set to true to enable building with DebugLogMiniXP configuration' - required: true - -# Outputs are always using Windows directory separator (`\`) -outputs: - - release: - description: 'Full path to ddraw.dll built with Release configuration' - value: ${{ steps.build-release.outputs.ddraw-dll }} - release-pdb: - description: 'Full path to ddraw.pdb built with Release configuration' - value: ${{ steps.build-release.outputs.ddraw-pdb }} - - releasexp: - description: 'Full path to ddraw.dll built with ReleaseXP configuration' - value: ${{ steps.build-releasexp.outputs.ddraw-dll }} - releasexp-pdb: - description: 'Full path to ddraw.pdb built with ReleaseXP configuration' - value: ${{ steps.build-releasexp.outputs.ddraw-pdb }} - - debug: - description: 'Full path to ddraw.dll built with Debug configuration' - value: ${{ steps.build-debug.outputs.ddraw-dll }} - debug-pdb: - description: 'Full path to ddraw.pdb built with Debug configuration' - value: ${{ steps.build-debug.outputs.ddraw-pdb }} - - debuglogxp: - description: 'Full path to ddraw.dll built with DebugLogXP configuration' - value: ${{ steps.build-debuglogxp.outputs.ddraw-dll }} - debuglogxp-pdb: - description: 'Full path to ddraw.pdb built with DebugLogXP configuration' - value: ${{ steps.build-debuglogxp.outputs.ddraw-pdb }} - - debuglogminixp: - description: 'Full path to ddraw.dll built with DebugLogMiniXP configuration' - value: ${{ steps.build-debuglogminixp.outputs.ddraw-dll }} - debuglogminixp-pdb: - description: 'Full path to ddraw.pdb built with DebugLogMiniXP configuration' - value: ${{ steps.build-debuglogminixp.outputs.ddraw-pdb }} - -runs: - using: 'composite' - steps: - - # Quick check for things which should never happen - - name: Sanity checks - run: | - if [[ "${{ runner.os }}" != "Windows" ]]; then - echo "[ERROR] This action can only be used on Windows" - exit 1 - elif [[ "${{ inputs.release }}" != "true" ]] && [[ "${{ inputs.releasexp }}" != "true" ]] && [[ "${{ inputs.debug }}" != "true" ]] && [[ "${{ inputs.debuglogxp }}" != "true" ]] && [[ "${{ inputs.debuglogminixp }}" != "true" ]]; then - echo "[ERROR] At least one of following inputs must be set to 'true' -- 'release', 'releasexp', 'debug', 'debuglogxp', 'debuglogminixp'" - exit 1 - # - elif [[ ! -f "$(cygpath --unix "$GITHUB_ACTION_PATH/cnc-ddraw.sln")" ]]; then - echo "[ERROR] Solution file not found -- '\\cnc-ddraw.sln'" - exit 1 - fi - # - shell: bash - - # MSBuild is not in PATH on Windows machines - # Using `::set-output` to make sure workflow environment remains unchanged - - name: Prepare MSBuild - id: msbuild - run: | - echo "::group::Prepare MSBuild" - - MSBUILD_EXE="$("/c/Program Files (x86)/Microsoft Visual Studio/Installer/vswhere.exe" -latest -requires Microsoft.Component.MSBuild -find MSBuild/**/Bin/MSBuild.exe)" - echo "exe=$MSBUILD_EXE" >> $GITHUB_OUTPUT - - echo "::endgroup::" - shell: bash - - # Creating empty `PostBuild.cmd` to avoid false-positive build error - - name: Build Release - id: build-release - run: | - if false; then - #if [[ "${{ inputs.release }}" == "true" ]]; then - echo ::group::Build Release - - # - # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Release -p:Platform=x86 -p:PlatformToolset=v142 - # - echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Release/ddraw.dll")" >> $GITHUB_OUTPUT - echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Release/ddraw.pdb")" >> $GITHUB_OUTPUT - - echo "::endgroup::" - fi - shell: bash - - # Creating empty `PostBuild.cmd` to avoid false-positive build error - - name: Build ReleaseXP - id: build-releasexp - run: | - #if false; then - if [[ "${{ inputs.releasexp }}" == "true" ]]; then - echo ::group::Build ReleaseXP - - # - # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=ReleaseXP -p:Platform=x86 -p:PlatformToolset=v141_xp - # - echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/ReleaseXP/ddraw.dll")" >> $GITHUB_OUTPUT - echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/ReleaseXP/ddraw.pdb")" >> $GITHUB_OUTPUT - - echo "::endgroup::" - fi - shell: bash - - # Creating empty `PostBuild.cmd` to avoid false-positive build error - - name: Build Debug - id: build-debug - run: | - : - if false; then - #if [[ "${{ inputs.debug }}" == "true" ]]; then - echo "::group::Build Debug" - - # - # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Debug -p:Platform=x86 -p:PlatformToolset=v142 - # - echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.dll")" >> $GITHUB_OUTPUT - echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.pdb")" >> $GITHUB_OUTPUT - - echo "::endgroup::" - fi - shell: bash - - # Creating empty `PostBuild.cmd` to avoid false-positive build error - - name: Build DebugLogXP - id: build-debuglogxp - run: | - : - #if false; then - if [[ "${{ inputs.debuglogxp }}" == "true" ]]; then - echo "::group::Build DebugLogXP" - - # - # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLogXP -p:Platform=x86 -p:PlatformToolset=v141_xp - # - echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogXP/ddraw.dll")" >> $GITHUB_OUTPUT - echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogXP/ddraw.pdb")" >> $GITHUB_OUTPUT - - echo "::endgroup::" - fi - shell: bash - - # Creating empty `PostBuild.cmd` to avoid false-positive build error - - name: Build DebugLogMiniXP - id: build-debuglogminixp - run: | - : - if false; then - #if [[ "${{ inputs.debuglogminixp }}" == "true" ]]; then - echo "::group::Build DebugLogMiniXP" - - # - # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLogMiniXP -p:Platform=x86 -p:PlatformToolset=v141_xp - # - echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMiniXP/ddraw.dll")" >> $GITHUB_OUTPUT - echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMiniXP/ddraw.pdb")" >> $GITHUB_OUTPUT - - echo "::endgroup::" - fi - shell: bash diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..85a89a6 --- /dev/null +++ b/build.bat @@ -0,0 +1,8 @@ +@echo off +REM +REM cnc-patch environment config +REM +set PATH=C:\win-builds-patch-32\bin +gmake clean +gmake +pause diff --git a/build.cmd b/build.cmd deleted file mode 100644 index 801abe4..0000000 --- a/build.cmd +++ /dev/null @@ -1,15 +0,0 @@ -@echo off - -set GIT1=C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ -set GIT2=C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ -set GIT3=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ -set GIT4=C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ -set GIT5=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ -set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ - -set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% - -make clean -make _WIN32_WINNT=0x0400 - -pause diff --git a/build_debug.cmd b/build_debug.cmd deleted file mode 100644 index 4e43145..0000000 --- a/build_debug.cmd +++ /dev/null @@ -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 diff --git a/cnc-ddraw.sln b/cnc-ddraw.sln index eca7295..d5267c8 100644 --- a/cnc-ddraw.sln +++ b/cnc-ddraw.sln @@ -1,29 +1,23 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.6.33829.357 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30503.244 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cnc-ddraw", "cnc-ddraw.vcxproj", "{96094551-5D52-4EBD-BE4C-5291A03507FC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x86 = Debug|x86 - DebugLogMiniXP|x86 = DebugLogMiniXP|x86 - DebugLogXP|x86 = DebugLogXP|x86 + DebugLog|x86 = DebugLog|x86 Release|x86 = Release|x86 - ReleaseXP|x86 = ReleaseXP|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.ActiveCfg = Debug|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.Build.0 = Debug|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.ActiveCfg = DebugLogMiniXP|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.Build.0 = DebugLogMiniXP|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.ActiveCfg = DebugLogXP|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.Build.0 = DebugLogXP|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLog|x86.ActiveCfg = DebugLog|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLog|x86.Build.0 = DebugLog|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.ActiveCfg = Release|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.Build.0 = Release|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseXP|x86.ActiveCfg = ReleaseXP|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseXP|x86.Build.0 = ReleaseXP|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 3f5d12d..aebb0ee 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -1,33 +1,22 @@  - - DebugLogMiniXP - Win32 - - - DebugLogXP + + DebugLog Win32 Debug Win32 - - ReleaseXP - Win32 - Release Win32 - - - @@ -50,9 +39,6 @@ - - - @@ -70,18 +56,13 @@ - - - - - @@ -89,10 +70,6 @@ - - - - @@ -111,53 +88,37 @@ + - - - + - cnc_ddraw - $([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0')) + 7.0 {96094551-5D52-4EBD-BE4C-5291A03507FC} DynamicLibrary true - $(DefaultPlatformToolset) + v141_xp MultiByte - DynamicLibrary - false - $(DefaultPlatformToolset) - true - MultiByte - - DynamicLibrary false v141_xp true MultiByte - - DynamicLibrary - false - v141_xp - true - MultiByte - - + DynamicLibrary false v141_xp @@ -165,7 +126,8 @@ MultiByte - + + @@ -174,13 +136,7 @@ - - - - - - - + @@ -196,21 +152,9 @@ false ddraw - - $(SolutionDir)bin\ReleaseXP\ - $(SolutionDir)bin\ReleaseXP\ - false - ddraw - - - $(SolutionDir)bin\DebugLogXP\ - $(SolutionDir)bin\DebugLogXP\ - false - ddraw - - - $(SolutionDir)bin\DebugLogMiniXP\ - $(SolutionDir)bin\DebugLogMiniXP\ + + $(SolutionDir)bin\DebugLog\ + $(SolutionDir)bin\DebugLog\ false ddraw @@ -220,37 +164,22 @@ Level2 Disabled - _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_DEBUG_X;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) MultiThreadedDebug inc;src\detours Windows - 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) - exports.def + 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) + ddraw.def -if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( +if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" ) - - -set DST_FILE="inc/git.h" -set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" - -if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" -if not exist %GIT_PATH% set GIT_PATH=git.exe - -for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I -for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I - -echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% -echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% - - @@ -268,75 +197,11 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - 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) - exports.def + 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) + ddraw.def - - -if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( - copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" -) - - - - -set DST_FILE="inc/git.h" -set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" - -if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" -if not exist %GIT_PATH% set GIT_PATH=git.exe - -for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I -for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I - -echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% -echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% - - - - - Level2 - - - MaxSpeed - true - true - _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - MultiThreaded - inc;src\detours - - - Windows - true - true - 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) - exports.def - - - -if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( - copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" -) - - - - -set DST_FILE="inc/git.h" -set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" - -if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" -if not exist %GIT_PATH% set GIT_PATH=git.exe - -for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I -for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I - -echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% -echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% - - - - + Level2 @@ -352,74 +217,11 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - 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) - exports.def + 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) + ddraw.def - - -if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( - copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" -) - - - - -set DST_FILE="inc/git.h" -set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" - -if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" -if not exist %GIT_PATH% set GIT_PATH=git.exe - -for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I -for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I - -echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% -echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% - - - - - - Level2 - - - MaxSpeed - true - true - _DEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - MultiThreaded - inc;src\detours - - - Windows - true - true - 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) - exports.def - - - -if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( - copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" -) - - - - -set DST_FILE="inc/git.h" -set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" - -if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" -if not exist %GIT_PATH% set GIT_PATH=git.exe - -for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I -for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I - -echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% -echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% - - - + + \ No newline at end of file diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index b15230e..fa979dc 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -150,27 +150,6 @@ Source Files - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - @@ -191,6 +170,9 @@ Header Files + + Header Files + Header Files @@ -275,39 +257,9 @@ Header Files - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - + Resource Files diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 7d40a88..35c99f4 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -43,12 +43,7 @@ void __fastcall TConfigForm::CreateParams(TCreateParams & Params) void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) { - auto iniPath = System::Sysutils::GetEnvironmentVariable( - "CNC_DDRAW_CONFIG_FILE"); - - auto *ini = - new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); - + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); ini->WriteString("ddraw", "configlang", IsEnglish ? "auto" : "english"); delete ini; @@ -65,12 +60,7 @@ void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) void __fastcall TConfigForm::ThemePnlClick(TObject *Sender) { - auto iniPath = System::Sysutils::GetEnvironmentVariable( - "CNC_DDRAW_CONFIG_FILE"); - - auto *ini = - new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); - + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); auto theme = ThemePnl->Color == (TColor)RGB(31, 31, 31) ? "Cobalt XEMedia" : "Windows10"; @@ -99,10 +89,15 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) return; } - auto iniPath = System::Sysutils::GetEnvironmentVariable( - "CNC_DDRAW_CONFIG_FILE"); + auto *ini = new TIniFile(GAME_PATH + "Warcraft II BNE.ini"); - DeleteFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); + ini->WriteString("Game", "Resolution", "4"); + ini->WriteString("Game", "Width", "0"); + ini->WriteString("Game", "Height", "0"); + + delete ini; + + DeleteFile(GAME_PATH + "ddraw.ini"); ShellExecute( NULL, @@ -117,9 +112,6 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) void TConfigForm::ApplyTranslation(TIniFile *ini) { - Application->HintHidePause = 100 * 1000; - Application->HintPause = 0; - auto lang = LowerCase(ini->ReadString("ddraw", "configlang", "auto")); int priID = SysLocale.PriLangID; @@ -131,31 +123,32 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"cnc-ddraw 配置"; DisplayBtn->Caption = L"显示设置"; AdvancedBtn->Caption = L"高级设置"; - HotkeyBtn->Caption = L"快捷键设置"; + HotkeyBtn->Caption = L"热键设置"; CompatibilityBtn->Caption = L"兼容性设置"; RestoreDefaultsBtn->Caption = L"恢复默认设置"; PresentationLbl->Caption = L"显示方式"; - MaintasLbl->Caption = L"保持宽高比"; - VsyncLbl->Caption = L"启用垂直同步"; + ResolutionLbl->Caption = L"解决"; + MaintasLbl->Caption = L"保持纵横比"; + VsyncLbl->Caption = L"打开垂直同步"; AdjmouseLbl->Caption = L"调整鼠标灵敏度"; - DevmodeLbl->Caption = L"将光标锁定到窗口/屏幕"; + DevmodeLbl->Caption = L"锁定光标到窗口/屏幕"; RendererLbl->Caption = L"渲染器"; BorderLbl->Caption = L"在窗口模式下显示窗口边框"; SavesettingsLbl->Caption = L"记住窗口位置和大小"; - ShaderLbl->Caption = L"OpenGL 着色器"; - MaxfpsLbl->Caption = L"限制帧速率"; - BoxingLbl->Caption = L"启用整数缩放"; + ShaderLbl->Caption = L"OpenGL着色器"; + MaxfpsLbl->Caption = L"限制帧率"; + BoxingLbl->Caption = L"打开窗盒显示/整数缩放"; ToggleWindowedLbl->Caption = L"切换窗口模式"; MaximizeWindowLbl->Caption = L"最大化窗口"; UnlockCursor1Lbl->Caption = L"解锁光标 1"; UnlockCursor2Lbl->Caption = L"解锁光标 2"; - ScreenshotLbl->Caption = L"截图"; - MaxgameticksLbl->Caption = L"限制游戏速度"; + ScreenshotLbl->Caption = L"截屏"; + MaxgameticksLbl->Caption = L"限制游戏速率"; NoactivateappLbl->Caption = L"修复损坏的Alt+Tab功能"; - ResolutionsLbl->Caption = L"解锁额外的屏幕分辨率"; - MinfpsLbl->Caption = L"强制高 FPS / 修复 Freesync/G-Sync 卡顿"; - SinglecpuLbl->Caption = L"修复低性能和声音问题"; - NonexclusiveLbl->Caption = L"修复不显示的视频/UI 元素"; + ResolutionsLbl->Caption = L"解锁其他屏幕分辨率"; + MinfpsLbl->Caption = L"强制高FPS / 修复使用Freesync/G-Sync的卡顿问题"; + SinglecpuLbl->Caption = L"修复性能不佳和声音问题"; + NonexclusiveLbl->Caption = L"修复不显示的视频/UI元素"; RendererCbx->Items->Clear(); RendererCbx->AddItem(L"自动", NULL); @@ -172,37 +165,15 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->Items->Clear(); MaxgameticksCbx->AddItem(L"无限制", NULL); MaxgameticksCbx->AddItem(L"与显示器刷新率同步", NULL); - MaxgameticksCbx->AddItem(L"模拟 60hz 刷新率显示器", NULL); - MaxgameticksCbx->AddItem(L"1000 次每秒", NULL); - MaxgameticksCbx->AddItem(L"500 次每秒", NULL); - MaxgameticksCbx->AddItem(L"250 次每秒", NULL); - MaxgameticksCbx->AddItem(L"125 次每秒", NULL); - MaxgameticksCbx->AddItem(L"60 次每秒", NULL); - MaxgameticksCbx->AddItem(L"30 次每秒", NULL); - MaxgameticksCbx->AddItem(L"25 次每秒", NULL); - MaxgameticksCbx->AddItem(L"15 次每秒", NULL); - - System::UnicodeString shaderHint = - L"一些着色器只有在启用放大时才有效。\n\n"; - - System::UnicodeString upscaleHint = - L"必须启用放大才能使此设置生效。\n\n"; - - System::UnicodeString enableUpscaleHint = - L"要启用放大,请将显示方式设置为“无边框” \n" - "或“拉伸至全屏”。对于“窗口化”, \n" - "你必须调整窗口大小或将窗口开启最大化。"; - - ShaderLbl->Hint = shaderHint + enableUpscaleHint; - ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; - ShaderCbx->Hint = shaderHint + enableUpscaleHint; - - MaintasLbl->Hint = upscaleHint + enableUpscaleHint; - MaintasChk->Hint = upscaleHint + enableUpscaleHint; - AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; - AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; - BoxingLbl->Hint = upscaleHint + enableUpscaleHint; - BoxingChk->Hint = upscaleHint + enableUpscaleHint; + MaxgameticksCbx->AddItem(L"模拟60hz刷新率显示器", NULL); + MaxgameticksCbx->AddItem(L"1000tick每秒", NULL); + MaxgameticksCbx->AddItem(L"500tick每秒", NULL); + MaxgameticksCbx->AddItem(L"250tick每秒", NULL); + MaxgameticksCbx->AddItem(L"125tick每秒", NULL); + MaxgameticksCbx->AddItem(L"60tick每秒", NULL); + MaxgameticksCbx->AddItem(L"30tick每秒", NULL); + MaxgameticksCbx->AddItem(L"25tick每秒", NULL); + MaxgameticksCbx->AddItem(L"15tick每秒", NULL); } else if (lang == "spanish" || (lang == "auto" && priID == LANG_SPANISH)) { LanguageImg->Visible = true; @@ -216,6 +187,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"Ajustes de compatibilidad"; RestoreDefaultsBtn->Caption = L"Restaurar la configuración predeterminada"; PresentationLbl->Caption = L"Presentación"; + ResolutionLbl->Caption = L"Resolución"; MaintasLbl->Caption = L"Mantener la relación de aspecto"; VsyncLbl->Caption = L"Activar VSync"; AdjmouseLbl->Caption = L"Ajustar sensibilidad de ratón"; @@ -262,28 +234,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"25 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"15 tics por segundo", NULL); - - System::UnicodeString shaderHint = - L"Algunos de los sombreadores solo funcionan cuando la ampliación está habilitada. \n\n"; - - System::UnicodeString upscaleHint = - L"La ampliación debe estar habilitada para que esta configuración funcione. \n\n"; - - System::UnicodeString enableUpscaleHint = - L"Para habilitar la mejora, configure su presentación en 'Sin bordes' \n" - "o 'Pantalla completa ampliada'. Para la presentación 'Ventana', \n" - "debe cambiar el tamaño o maximizar la ventana."; - - ShaderLbl->Hint = shaderHint + enableUpscaleHint; - ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; - ShaderCbx->Hint = shaderHint + enableUpscaleHint; - - MaintasLbl->Hint = upscaleHint + enableUpscaleHint; - MaintasChk->Hint = upscaleHint + enableUpscaleHint; - AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; - AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; - BoxingLbl->Hint = upscaleHint + enableUpscaleHint; - BoxingChk->Hint = upscaleHint + enableUpscaleHint; } else if (lang == "german" || (lang == "auto" && priID == LANG_GERMAN)) { LanguageImg->Visible = true; @@ -297,6 +247,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"Kompatibilitätseinstellungen"; RestoreDefaultsBtn->Caption = L"Standardeinstellungen wiederherstellen"; PresentationLbl->Caption = L"Darstellung"; + ResolutionLbl->Caption = L"Auflösung"; MaintasLbl->Caption = L"Seitenverhältnis beibehalten"; VsyncLbl->Caption = L"VSync aktiveren"; AdjmouseLbl->Caption = L"Mausempfindlichkeit anpassen"; @@ -306,7 +257,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) SavesettingsLbl->Caption = L"Fensterposition und Größe merken"; ShaderLbl->Caption = L"OpenGL Shader"; MaxfpsLbl->Caption = L"Limitiere Aktualisierungsrate"; - BoxingLbl->Caption = L"Windowboxing / Integer Skalierung aktivieren"; //Not 100% sure if "windowboxing" can be translated better. + BoxingLbl->Caption = L"Fensterboxing / Integer Skalierung aktivieren"; //Not 100% sure if "windowboxing" can be translated better. ToggleWindowedLbl->Caption = L"Fenstermodus umschalten"; MaximizeWindowLbl->Caption = L"Fenster maximieren"; UnlockCursor1Lbl->Caption = L"Cursor entsperren 1"; @@ -343,29 +294,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"25 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"15 Ticks pro Sekunde", NULL); - - System::UnicodeString shaderHint = - L"Einige der Shader funktionieren nur, wenn die Hochskalierung aktiviert ist. \n\n"; - - System::UnicodeString upscaleHint = - L"Damit diese Einstellung funktioniert, muss die Hochskalierung aktiviert sein. \n\n"; - - System::UnicodeString enableUpscaleHint = - L"Um die Hochskalierung zu aktivieren, stellen Sie Ihre Darstellung \n" - "entweder auf 'Ränderfreies Fenster' oder 'Hochskaliertes Vollbild' ein. \n" - "Für die 'Fenstermodus'-Darstellung müssen Sie die Größe des Fensters \n" - "ändern oder es maximieren."; - - ShaderLbl->Hint = shaderHint + enableUpscaleHint; - ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; - ShaderCbx->Hint = shaderHint + enableUpscaleHint; - - MaintasLbl->Hint = upscaleHint + enableUpscaleHint; - MaintasChk->Hint = upscaleHint + enableUpscaleHint; - AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; - AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; - BoxingLbl->Hint = upscaleHint + enableUpscaleHint; - BoxingChk->Hint = upscaleHint + enableUpscaleHint; } else if (lang == "russian" || (lang == "auto" && priID == LANG_RUSSIAN)) { LanguageImg->Visible = true; @@ -380,6 +308,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"Настройки совместимости"; RestoreDefaultsBtn->Caption = L"Восстановить настройки по умолчанию"; PresentationLbl->Caption = L"Отображение"; + ResolutionLbl->Caption = L"Разрешение"; MaintasLbl->Caption = L"Сохранять соотношение сторон"; VsyncLbl->Caption = L"Включить VSync"; AdjmouseLbl->Caption = L"Регулировка чувствительности мыши"; @@ -426,28 +355,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"25 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"15 тиков в секунду", NULL); - - System::UnicodeString shaderHint = - L"Некоторые шейдеры работают только при включенном масштабировании. \n\n"; - - System::UnicodeString upscaleHint = - L"Чтобы этот параметр работал, необходимо включить масштабирование. \n\n"; - - System::UnicodeString enableUpscaleHint = - L"Чтобы включить масштабирование, установите для презентации режим \n" - "'Без границ' или 'Полноэкранный масштабированный'. Для презентации в \n" - "'Оконный' режиме необходимо изменить размер или развернуть окно."; - - ShaderLbl->Hint = shaderHint + enableUpscaleHint; - ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; - ShaderCbx->Hint = shaderHint + enableUpscaleHint; - - MaintasLbl->Hint = upscaleHint + enableUpscaleHint; - MaintasChk->Hint = upscaleHint + enableUpscaleHint; - AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; - AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; - BoxingLbl->Hint = upscaleHint + enableUpscaleHint; - BoxingChk->Hint = upscaleHint + enableUpscaleHint; } else if (lang == "hungarian" || (lang == "auto" && priID == LANG_HUNGARIAN)) { LanguageImg->Visible = true; @@ -461,6 +368,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"Kompatibilitás Beállítások"; RestoreDefaultsBtn->Caption = L"Visszaállítja az alapértelmezett beállításokat"; PresentationLbl->Caption = L"Bemutató"; + ResolutionLbl->Caption = L"Felbontás"; MaintasLbl->Caption = L"Képarány megtartása"; VsyncLbl->Caption = L"VSync bekapcsolása"; AdjmouseLbl->Caption = L"Egérérzékenység beállítás"; @@ -507,28 +415,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"25 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"15 tick másodpercenként", NULL); - - System::UnicodeString shaderHint = - L"Néhány árnyékoló csak akkor működik, ha a felskálázás engedélyezve van. \n\n"; - - System::UnicodeString upscaleHint = - L"A beállítás működéséhez engedélyezni kell a felskálázást. \n\n"; - - System::UnicodeString enableUpscaleHint = - L"A felskálázás engedélyezéséhez állítsa a prezentációt 'Keret nélkül' \n" - "vagy 'Teljes képernyő felskálázva' értékre. Az 'Ablakban' bemutatóhoz \n" - "át kell méretezni vagy maximalizálni kell az ablakot."; - - ShaderLbl->Hint = shaderHint + enableUpscaleHint; - ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; - ShaderCbx->Hint = shaderHint + enableUpscaleHint; - - MaintasLbl->Hint = upscaleHint + enableUpscaleHint; - MaintasChk->Hint = upscaleHint + enableUpscaleHint; - AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; - AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; - BoxingLbl->Hint = upscaleHint + enableUpscaleHint; - BoxingChk->Hint = upscaleHint + enableUpscaleHint; } else if (lang == "french" || (lang == "auto" && priID == LANG_FRENCH)) { LanguageImg->Visible = true; @@ -542,6 +428,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"Paramètres de Compatibilité"; RestoreDefaultsBtn->Caption = L"Restaurer les paramètres par défaut"; PresentationLbl->Caption = L"Présentation"; + ResolutionLbl->Caption = L"Résolution"; MaintasLbl->Caption = L"Conserver les proportions de l'image"; VsyncLbl->Caption = L"Activer la synchro verticale (VSync)"; AdjmouseLbl->Caption = L"Ajuster la sensibilité souris"; @@ -588,28 +475,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"25 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"15 tics par seconde", NULL); - - System::UnicodeString shaderHint = - L"Certains shaders ne fonctionnent que lorsque la mise à l'échelle est activée. \n\n"; - - System::UnicodeString upscaleHint = - L"La mise à l'échelle doit être activée pour que ce paramètre fonctionne. \n\n"; - - System::UnicodeString enableUpscaleHint = - L"Pour activer la mise à l'échelle, définissez votre présentation \n" - "sur 'Sans Bordure' ou 'Plein Écran Mis à l'Échelle'. Pour la \n" - "présentation 'Fenêtré', vous devez redimensionner ou agrandir la fenêtre."; - - ShaderLbl->Hint = shaderHint + enableUpscaleHint; - ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; - ShaderCbx->Hint = shaderHint + enableUpscaleHint; - - MaintasLbl->Hint = upscaleHint + enableUpscaleHint; - MaintasChk->Hint = upscaleHint + enableUpscaleHint; - AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; - AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; - BoxingLbl->Hint = upscaleHint + enableUpscaleHint; - BoxingChk->Hint = upscaleHint + enableUpscaleHint; } else if (lang == "italian" || (lang == "auto" && priID == LANG_ITALIAN)) { LanguageImg->Visible = true; @@ -623,6 +488,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"Impostazioni di compatibilità"; RestoreDefaultsBtn->Caption = L"Ripristina le impostazioni predefinite"; PresentationLbl->Caption = L"Presentazione"; + ResolutionLbl->Caption = L"Risoluzione"; MaintasLbl->Caption = L"Mantieni il rapporto d'aspetto"; VsyncLbl->Caption = L"Abilita la sincronizzazione verticale (VSync)"; AdjmouseLbl->Caption = L"Regola la sensibilità del mouse"; @@ -669,190 +535,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 tick al secondo", NULL); MaxgameticksCbx->AddItem(L"25 tick al secondo", NULL); MaxgameticksCbx->AddItem(L"15 tick al secondo", NULL); - - System::UnicodeString shaderHint = - L"Alcuni shader funzionano solo quando il ridimensionamento dell'immagine è abilitato. \n\n"; - - System::UnicodeString upscaleHint = - L"Affinché questa impostazione funzioni, è necessario abilitare il ridimensionamento dell'immagine. \n\n"; - - System::UnicodeString enableUpscaleHint = - L"Per abilitare il ridimensionamento dell'immagine, imposta la modalità di presentazione \n" - "su 'Senza Bordi o 'Schermo Intero Ridimensionato'. Per la modalità 'In Finestra', \n" - "è necessario ridimensionare o ingrandire la finestra manualmente."; - - ShaderLbl->Hint = shaderHint + enableUpscaleHint; - ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; - ShaderCbx->Hint = shaderHint + enableUpscaleHint; - - MaintasLbl->Hint = upscaleHint + enableUpscaleHint; - MaintasChk->Hint = upscaleHint + enableUpscaleHint; - AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; - AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; - BoxingLbl->Hint = upscaleHint + enableUpscaleHint; - BoxingChk->Hint = upscaleHint + enableUpscaleHint; - } - else if (lang == "vietnamese" || (lang == "auto" && priID == LANG_VIETNAMESE)) { - LanguageImg->Visible = true; - - /* -vietnamese - made by TheBuck338 @ github */ - - ConfigForm->Caption = L"Thiết lập cnc-ddraw"; - DisplayBtn->Caption = L"Cài Đặt Hình Ảnh"; - AdvancedBtn->Caption = L"Cài Đặt Nâng Cao"; - HotkeyBtn->Caption = L"Cài Đặt Phím Tắt"; - CompatibilityBtn->Caption = L"Cài Đặt Tương Thích"; - RestoreDefaultsBtn->Caption = L"Khôi phục cài đặt gốc"; - PresentationLbl->Caption = L"Chế Độ Hiển Thị"; - MaintasLbl->Caption = L"Giữ nguyên tỉ lệ khung hình"; - VsyncLbl->Caption = L"Bật VSync"; - AdjmouseLbl->Caption = L"Điều chỉnh độ nhạy của chuột"; - DevmodeLbl->Caption = L"Khóa con trỏ vào cửa sổ / màn hình"; - RendererLbl->Caption = L"Trình kết xuất"; - BorderLbl->Caption = L"Hiển thị thanh tiêu đề trong chế độ cửa sổ"; - SavesettingsLbl->Caption = L"Ghi nhớ vị trí kích thước và cửa sổ"; - ShaderLbl->Caption = L"Shader OpenGL"; - MaxfpsLbl->Caption = L"Giới hạn tốc độ khung hình"; - BoxingLbl->Caption = L"Bật windowboxing / chia tỷ lệ theo số nguyên"; - ToggleWindowedLbl->Caption = L"Bật/tắt chế độ cửa sổ"; - MaximizeWindowLbl->Caption = L"Phóng to cửa sổ"; - UnlockCursor1Lbl->Caption = L"Mở khóa con trỏ 1"; - UnlockCursor2Lbl->Caption = L"Mở khóa con trỏ 2"; - ScreenshotLbl->Caption = L"Chụp màn hình"; - MaxgameticksLbl->Caption = L"Giới hạn tốc độ trò chơi"; - NoactivateappLbl->Caption = L"Sửa lỗi Alt+Tab"; - ResolutionsLbl->Caption = L"Mở khóa thêm độ phân giải màn hình"; - MinfpsLbl->Caption = L"Khắc phục hiện tượng giật hình khi sử dụng Freesync/G-Sync"; - SinglecpuLbl->Caption = L"Khắc phục các vấn đề về hiệu năng và âm thanh kém"; - NonexclusiveLbl->Caption = L"Sửa lỗi các video / phần tử UI không hiển thị"; - - RendererCbx->Items->Clear(); - RendererCbx->AddItem(L"Tự Động", NULL); - RendererCbx->AddItem(L"Direct3D 9", NULL); - RendererCbx->AddItem(L"OpenGL", NULL); - RendererCbx->AddItem(L"GDI", NULL); - - PresentationCbx->Items->Clear(); - PresentationCbx->AddItem(L"Toàn Màn Hình", NULL); - PresentationCbx->AddItem(L"Toàn Màn Hình Nâng Cao Độ Phân Giải", NULL); - PresentationCbx->AddItem(L"Toàn Màn Hình Không Viền", NULL); - PresentationCbx->AddItem(L"Cửa Sổ", NULL); - - MaxgameticksCbx->Items->Clear(); - MaxgameticksCbx->AddItem(L"Không giới hạn", NULL); - MaxgameticksCbx->AddItem(L"Đồng bộ hóa với tần số quét màn hình", NULL); - MaxgameticksCbx->AddItem(L"Mô phỏng màn hình với tần số quét 60Hz", NULL); - MaxgameticksCbx->AddItem(L"1000 ticks mỗi giây", NULL); - MaxgameticksCbx->AddItem(L"500 ticks mỗi giây", NULL); - MaxgameticksCbx->AddItem(L"250 ticks mỗi giây", NULL); - MaxgameticksCbx->AddItem(L"125 ticks mỗi giây", NULL); - MaxgameticksCbx->AddItem(L"60 ticks mỗi giây", NULL); - MaxgameticksCbx->AddItem(L"30 ticks mỗi giây", NULL); - MaxgameticksCbx->AddItem(L"25 ticks mỗi giây", NULL); - MaxgameticksCbx->AddItem(L"15 ticks mỗi giây", NULL); - - System::UnicodeString shaderHint = - L"Một số shader chỉ hoạt động khi bật chế độ nâng cao độ phân giải. \n\n"; - - System::UnicodeString upscaleHint = - L"Phải bật chế độ nâng cao độ phân giải để cài đặt này hoạt động. \n\n"; - - System::UnicodeString enableUpscaleHint = - L"Để bật chế độ nâng cao độ phân giải, hãy đặt chế độ hiển thị của bạn\n" - "thành 'Toàn Màn Hình Không Viền' hoặc 'Toàn Màn Hình Nâng Cao Độ Phân Giải'.\n" - "Đối với chế độ 'Cửa Sổ', bạn phải thay đổi kích thước hoặc phóng to cửa sổ."; - - ShaderLbl->Hint = shaderHint + enableUpscaleHint; - ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; - ShaderCbx->Hint = shaderHint + enableUpscaleHint; - - MaintasLbl->Hint = upscaleHint + enableUpscaleHint; - MaintasChk->Hint = upscaleHint + enableUpscaleHint; - AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; - AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; - BoxingLbl->Hint = upscaleHint + enableUpscaleHint; - BoxingChk->Hint = upscaleHint + enableUpscaleHint; - } - else if (lang == "polish" || (lang == "auto" && priID == LANG_POLISH)) { - LanguageImg->Visible = true; - - /* -polish - made by WaRzillA @ github */ - - ConfigForm->Caption = L"Konfiguracja cnc-ddraw"; - DisplayBtn->Caption = L"Ustawienia wyświetlania"; - AdvancedBtn->Caption = L"Ustawienia zaawansowane"; - HotkeyBtn->Caption = L"Skróty klawiaturowe"; - CompatibilityBtn->Caption = L"Ustawienia kompatybilności"; - RestoreDefaultsBtn->Caption = L"Przywróć ustawienia domyślne"; - PresentationLbl->Caption = L"Tryb wyświetlania"; - MaintasLbl->Caption = L"Zachowaj proporcje obrazu"; - VsyncLbl->Caption = L"Włącz VSync"; - AdjmouseLbl->Caption = L"Dostosuj czułość myszy"; - DevmodeLbl->Caption = L"Zablokuj kursor w oknie/na ekranie"; - RendererLbl->Caption = L"Silnik renderowania"; - BorderLbl->Caption = L"Pokaż ramki okna w trybie okienkowym"; - SavesettingsLbl->Caption = L"Zapamiętaj pozycję i rozmiar okna"; - ShaderLbl->Caption = L"Shader OpenGL"; - MaxfpsLbl->Caption = L"Ogranicz liczbę klatek na sekundę"; - BoxingLbl->Caption = L"Włącz windowboxing / integer scaling "; - ToggleWindowedLbl->Caption = L"Przełącz na tryb okienkowy"; - MaximizeWindowLbl->Caption = L"Maksymalizuj okno"; - UnlockCursor1Lbl->Caption = L"Odblokuj kursor 1"; - UnlockCursor2Lbl->Caption = L"Odblokuj kursor 2"; - ScreenshotLbl->Caption = L"Zrzut ekranu"; - MaxgameticksLbl->Caption = L"Ogranicz prędkość gry"; - NoactivateappLbl->Caption = L"Napraw nieprawidłowe działanie Alt+Tab"; - ResolutionsLbl->Caption = L"Odblokuj dodatkowe rozdzielczości ekranu"; - MinfpsLbl->Caption = L"Wymuś wysokie FPS / Napraw zacinanie Freesync/G-Sync"; - SinglecpuLbl->Caption = L"Napraw problemy z wydajnością i dźwiękiem"; - NonexclusiveLbl->Caption = L"Napraw niewidoczne filmy / elementy interfejsu"; - - RendererCbx->Items->Clear(); - RendererCbx->AddItem(L"Automatyczny", NULL); - RendererCbx->AddItem(L"Direct3D 9", NULL); - RendererCbx->AddItem(L"OpenGL", NULL); - RendererCbx->AddItem(L"GDI", NULL); - - PresentationCbx->Items->Clear(); - PresentationCbx->AddItem(L"Pełny ekran", NULL); - PresentationCbx->AddItem(L"Pełny ekran z upscalingiem", NULL); - PresentationCbx->AddItem(L"Tryb bezramkowy", NULL); - PresentationCbx->AddItem(L"Tryb okienkowy", NULL); - - MaxgameticksCbx->Items->Clear(); - MaxgameticksCbx->AddItem(L"Bez limitu", NULL); - MaxgameticksCbx->AddItem(L"Synchronizacja z odświeżaniem monitora", NULL); - MaxgameticksCbx->AddItem(L"Symulacja monitora 60 Hz", NULL); - MaxgameticksCbx->AddItem(L"1000 tików na sekundę", NULL); - MaxgameticksCbx->AddItem(L"500 tików na sekundę", NULL); - MaxgameticksCbx->AddItem(L"250 tików na sekundę", NULL); - MaxgameticksCbx->AddItem(L"125 tików na sekundę", NULL); - MaxgameticksCbx->AddItem(L"60 tików na sekundę", NULL); - MaxgameticksCbx->AddItem(L"30 tików na sekundę", NULL); - MaxgameticksCbx->AddItem(L"25 tików na sekundę", NULL); - MaxgameticksCbx->AddItem(L"15 tików na sekundę", NULL); - - System::UnicodeString shaderHint = - L"Niektóre shadery działają tylko wtedy, gdy włączone jest skalowanie. \n\n"; - - System::UnicodeString upscaleHint = - L"Skalowanie musi być włączone, aby ta opcja działała. \n\n"; - - System::UnicodeString enableUpscaleHint = - L"Aby włączyć skalowanie, ustaw tryb wyświetlania na 'Tryb bezramkowy' \n" - "lub 'Pełny ekran z upscalingiem'. Dla 'Tryb okienkowy' \n" - "musisz zmienić rozmiar lub zmaksymalizować okno."; - - ShaderLbl->Hint = shaderHint + enableUpscaleHint; - ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; - ShaderCbx->Hint = shaderHint + enableUpscaleHint; - - MaintasLbl->Hint = upscaleHint + enableUpscaleHint; - MaintasChk->Hint = upscaleHint + enableUpscaleHint; - AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; - AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; - BoxingLbl->Hint = upscaleHint + enableUpscaleHint; - BoxingChk->Hint = upscaleHint + enableUpscaleHint; } else { IsEnglish = true; @@ -900,18 +582,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) LanguageImg->Picture->Graphic = png; LanguageImg->Visible = true; } - else if (priID == LANG_VIETNAMESE) { - TPngImage *png = new TPngImage(); - png->LoadFromResourceName((int)HInstance, "PngImage_VN"); - LanguageImg->Picture->Graphic = png; - LanguageImg->Visible = true; - } - else if (priID == LANG_POLISH) { - TPngImage *png = new TPngImage(); - png->LoadFromResourceName((int)HInstance, "PngImage_PL"); - LanguageImg->Picture->Graphic = png; - LanguageImg->Visible = true; - } } catch (...) { } @@ -923,6 +593,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) CompatibilityBtn->Caption = L"Compatibility Settings"; RestoreDefaultsBtn->Caption = L"Restore default settings"; PresentationLbl->Caption = L"Presentation"; + ResolutionLbl->Caption = L"Resolution"; MaintasLbl->Caption = L"Maintain aspect ratio"; VsyncLbl->Caption = L"Enable VSync"; AdjmouseLbl->Caption = L"Adjust mouse sensitivity"; @@ -970,28 +641,6 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 ticks per second", NULL); MaxgameticksCbx->AddItem(L"15 ticks per second", NULL); */ - - System::UnicodeString shaderHint = - L"Some of the shaders only work when upscaling is enabled. \n\n"; - - System::UnicodeString upscaleHint = - L"Upscaling must be enabled for this setting to work. \n\n"; - - System::UnicodeString enableUpscaleHint = - L"To enable upscaling, set your presentation to either 'Borderless' \n" - "or 'Fullscreen Upscaled'. For the 'Windowed' presentation, \n" - "you must resize or maximize the window."; - - ShaderLbl->Hint = shaderHint + enableUpscaleHint; - ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; - ShaderCbx->Hint = shaderHint + enableUpscaleHint; - - MaintasLbl->Hint = upscaleHint + enableUpscaleHint; - MaintasChk->Hint = upscaleHint + enableUpscaleHint; - AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; - AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; - BoxingLbl->Hint = upscaleHint + enableUpscaleHint; - BoxingChk->Hint = upscaleHint + enableUpscaleHint; } ToggleWindowedKeyLbl->Caption = GetKeyText(VK_MENU) + L" +"; @@ -1038,12 +687,8 @@ void __fastcall TConfigForm::CompatibilityBtnClick(TObject *Sender) void __fastcall TConfigForm::FormCreate(TObject *Sender) { - auto iniPath = System::Sysutils::GetEnvironmentVariable( - "CNC_DDRAW_CONFIG_FILE"); - /* Let cnc-ddraw create a new ddraw.ini if it doesn't exist */ - if (FileExists(GAME_PATH + "ddraw.dll") && - !FileExists(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini")) { + if (FileExists(GAME_PATH + "ddraw.dll") && !FileExists(GAME_PATH + "ddraw.ini")) { SetEnvironmentVariableW(L"cnc_ddraw_config_init", L"1"); @@ -1067,8 +712,8 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) } } - auto *ini = - new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); + auto *hd_ini = new TIniFile(GAME_PATH + "Warcraft II BNE.ini"); if (ini->ReadString("ddraw", "configtheme", "Windows10") == "Cobalt XEMedia") { @@ -1102,6 +747,18 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) PresentationCbx->ItemIndex = 0; } + int cwidth = hd_ini->ReadInteger("Game", "Width", 0); + int cheight = hd_ini->ReadInteger("Game", "Height", 0); + int reso = hd_ini->ReadInteger("Game", "Resolution", 4); + + if (!cwidth || !cheight) { + ResolutionCbx->ItemIndex = reso <= 11 ? reso : 4; + } + else { + ResolutionCbx->AddItem(IntToStr(cwidth) + "x" + IntToStr(cheight), NULL); + ResolutionCbx->ItemIndex = ResolutionCbx->Items->Count - 1; + } + MaintasChk->State = GetBool(ini, "maintas", false) ? tssOn : tssOff; VsyncChk->State = GetBool(ini, "vsync", false) ? tssOn : tssOff; AdjmouseChk->State = GetBool(ini, "adjmouse", true) ? tssOn : tssOff; @@ -1144,9 +801,6 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) RendererCbx->ItemIndex = 0; } - ShaderD3DCbx->Enabled = !ContainsStr(RendererCbx->Text, "GDI"); - ShaderCbx->Enabled = ShaderD3DCbx->Enabled; - try { TStringDynArray list = TDirectory::GetFiles( @@ -1159,15 +813,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) } catch (...) { - } - - if (ShaderCbx->Items->Count == 0) { - ShaderCbx->AddItem("Nearest neighbor", NULL); - ShaderCbx->AddItem("Bilinear", NULL); - ShaderCbx->AddItem("Bicubic", NULL); - ShaderCbx->AddItem("Lanczos", NULL); - ShaderCbx->AddItem("xBR-lv2", NULL); - } + } auto shader = ini->ReadString("ddraw", "shader", "Bicubic"); ShaderCbx->ItemIndex = ShaderCbx->Items->IndexOf(shader); @@ -1177,24 +823,15 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) ShaderCbx->ItemIndex = ShaderCbx->Items->Count - 1; } - int d3d9_filter = ini->ReadInteger("ddraw", "d3d9_filter", 2); + bool d3d9_filter = GetBool(ini, "d3d9linear", true); - switch (d3d9_filter) { - case 0: - ShaderD3DCbx->ItemIndex = 0; - break; - case 1: + if (d3d9_filter) { ShaderD3DCbx->ItemIndex = 1; - break; - case 2: - default: - ShaderD3DCbx->ItemIndex = 2; - break; - case 3: - ShaderD3DCbx->ItemIndex = 3; - break; } - + else { + ShaderD3DCbx->ItemIndex = 0; + } + Maxfps = ini->ReadInteger("ddraw", "maxfps", -1); MaxfpsChk->State = Maxfps != 0 ? tssOn : tssOff; @@ -1274,16 +911,17 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) MinfpsChk->State = Minfps != 0 ? tssOn : tssOff; SinglecpuChk->State = GetBool(ini, "singlecpu", true) ? tssOff : tssOn; - NonexclusiveChk->State = GetBool(ini, "nonexclusive", true) ? tssOn : tssOff; + NonexclusiveChk->State = GetBool(ini, "nonexclusive", false) ? tssOn : tssOff; CompatibilityBtn->Visible = !GetBool(ini, "hide_compat_tab", false); RestoreDefaultsBtn->Visible = FileExists(GAME_PATH + "ddraw.dll") && - FileExists(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini") && + FileExists(GAME_PATH + "ddraw.ini") && GetBool(ini, "allow_reset", true); delete ini; + delete hd_ini; Initialized = true; } @@ -1293,11 +931,8 @@ void TConfigForm::SaveSettings() if (!Initialized) return; - auto iniPath = System::Sysutils::GetEnvironmentVariable( - "CNC_DDRAW_CONFIG_FILE"); - - auto *ini = - new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); + auto *hd_ini = new TIniFile(GAME_PATH + "Warcraft II BNE.ini"); /* Display Settings */ @@ -1328,6 +963,17 @@ void TConfigForm::SaveSettings() break; } + if (ResolutionCbx->ItemIndex <= 11) { + hd_ini->WriteInteger("Game", "Resolution", ResolutionCbx->ItemIndex); + + hd_ini->WriteInteger("Game", "Width", 0); + hd_ini->WriteInteger("Game", "Height", 0); + + if (ResolutionCbx->Items->Count == 13) { + ResolutionCbx->Items->Delete(12); + } + } + ini->WriteString( "ddraw", "maintas", @@ -1377,8 +1023,13 @@ void TConfigForm::SaveSettings() ini->WriteString("ddraw", "shader", ShaderCbx->Text); - ini->WriteInteger("ddraw", "d3d9_filter", ShaderD3DCbx->ItemIndex); - + if (ShaderD3DCbx->ItemIndex == 0) { + ini->WriteString("ddraw", "d3d9linear", "false"); + } + else { + ini->WriteString("ddraw", "d3d9linear", "true"); + } + int maxfps = Maxfps == 0 ? -1 : Maxfps; ini->WriteInteger( @@ -1510,15 +1161,10 @@ void TConfigForm::SaveSettings() NonexclusiveChk->State == tssOn ? "true" : "false"); delete ini; + delete hd_ini; } void __fastcall TConfigForm::FormActivate(TObject *Sender) -{ - DisableGameUX(); - AddDllOverride(); -} - -void TConfigForm::AddDllOverride() { /* Detect wine (Linux/macOS) and create the needed dll override */ if (!GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "wine_get_version")) @@ -1558,47 +1204,6 @@ void TConfigForm::AddDllOverride() reg->Free(); } -void TConfigForm::DisableGameUX() -{ - /* Prevent bug where some games don't start properly and run in the background */ - if (!(TOSVersion::Major == 6 && TOSVersion::Minor == 1)) - return; - - TRegistry* reg = new TRegistry(KEY_READ); - reg->RootKey = HKEY_CLASSES_ROOT; - - if (reg->OpenKey( - "Local Settings\\Software\\Microsoft\\Windows\\GameUX\\ServiceLocation\\", - false)) { - - if (reg->ValueExists("Games") && - reg->ReadString("Games") != "127.0.0.1" && - LowerCase(reg->ReadString("Games")) != "localhost") { - - reg->CloseKey(); - - reg->Access = KEY_WRITE; - - if (reg->OpenKey( - "Local Settings\\Software\\Microsoft\\Windows\\GameUX\\ServiceLocation\\", - false)) { - - try { - reg->WriteString("Games", "127.0.0.1"); - } catch (...) { - /* maybe restart with admin rights here? */ - } - - reg->CloseKey(); - } - } - else - reg->CloseKey(); - } - - reg->Free(); -} - void __fastcall TConfigForm::HotkeyEdtKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { TEdit *edit = static_cast(Sender); @@ -1733,9 +1338,6 @@ void __fastcall TConfigForm::DevmodeChkClick(TObject *Sender) void __fastcall TConfigForm::RendererCbxChange(TObject *Sender) { - ShaderD3DCbx->Enabled = !ContainsStr(RendererCbx->Text, "GDI"); - ShaderCbx->Enabled = ShaderD3DCbx->Enabled; - if (ContainsStr(RendererCbx->Text, "Direct3D")) { ShaderLbl->Caption = @@ -1825,3 +1427,4 @@ void __fastcall TConfigForm::PboxPaint(TObject *Sender) //pbox->Canvas->Rectangle(pbox->ClientRect); } + diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 4f108df..62c57de 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -4,8 +4,8 @@ object ConfigForm: TConfigForm BorderIcons = [biSystemMenu, biMinimize] BorderStyle = bsSingle Caption = 'cnc-ddraw config' - ClientHeight = 476 - ClientWidth = 741 + ClientHeight = 475 + ClientWidth = 737 Color = clMenu Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -2677,219 +2677,18 @@ object ConfigForm: TConfigForm 61C0650530766087F0B9DE67A1EF3B173173597F3B695CC608E0B202F8FC22D7 BBBF4CD8CBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCB B88CB18EFF1FA2974C1C31AF16A40000000049454E44AE426082} - Position = poScreenCenter + Position = poDesktopCenter OnActivate = FormActivate OnCreate = FormCreate DesignSize = ( - 741 - 476) + 737 + 475) TextHeight = 13 - object DisplayPnl: TPanel - Left = 233 - Top = 8 - Width = 499 - Height = 465 - Anchors = [akLeft, akTop, akRight, akBottom] - BevelOuter = bvNone - Color = clWhite - ParentBackground = False - ShowCaption = False - TabOrder = 1 - StyleElements = [seFont, seBorder] - DesignSize = ( - 499 - 465) - object PresentationLbl: TLabel - Left = 40 - Top = 28 - Width = 87 - Height = 21 - Caption = 'Presentation' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - end - object MaintasLbl: TLabel - Left = 40 - Top = 105 - Width = 145 - Height = 21 - Margins.Top = 18 - Caption = 'Maintain aspect ratio' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - ParentShowHint = False - ShowHint = True - end - object VsyncLbl: TLabel - Left = 40 - Top = 173 - Width = 93 - Height = 21 - Margins.Top = 18 - Caption = 'Enable VSync' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - end - object AdjmouseLbl: TLabel - Left = 40 - Top = 241 - Width = 168 - Height = 21 - Margins.Top = 18 - Caption = 'Adjust mouse sensitivity' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - ParentShowHint = False - ShowHint = True - end - object DevmodeLbl: TLabel - Left = 40 - Top = 309 - Width = 216 - Height = 21 - Margins.Top = 18 - Caption = 'Lock cursor to window / screen' - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - end - object PresentationPbox: TPaintBox - Left = 40 - Top = 54 - Width = 282 - Height = 31 - OnPaint = PboxPaint - end - object LanguageImg: TImage - Left = 453 - Top = 8 - Width = 16 - Height = 11 - Anchors = [akTop, akRight] - Picture.Data = { - 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000100000 - 000B0802000000F9809A6E0000000467414D410000AFC837058AE90000001974 - 455874536F6674776172650041646F626520496D616765526561647971C9653C - 000001B34944415478DA4D51DF4B5451109EB3B95010813E583ED8D28B7F8356 - 6A1A2BD5530F81AE108837E9414390681F841235FF00115C0A5A82AD1E7C1172 - B7A050597C102C05E5C2222CE5A2D8522CABBBDD7BEEF935CE5DF1E2F031F30D - C37C67660EB39EAE4160C68051000200C9BF897C47E7FFBFBF7F283735508D51 - C3DBF9B65416639DE6E34AA8BF1DDF67D9E3DB2AB95A37D8A51101D12005F049 - 26B3E03774C65A3F658D3640100A35FA842BFC09E3502AC3F111542BE038ACFF - 7EEEC71A35AC74F4B6F7DDD23DAF59262EA3D375E917CE9DE94B3683D24B61CE - ACBE7ED475E76D7B8B5943D98ED8CDE432BDE06B2B091EA20D9E7236D4E11C09 - 43B58A9C8310A1C187EBF626B3ACAF89C4DDEE576629CEA35317D3F1E36B33E2 - F798691ED92E25DB4EE56907F2E5AB8D797F07EB4B6B5FF4DD374DC246C20E16 - B597833D0D05ADAECCF8DA9E4720121AEEFD9CCFB14221DFD4745D4A19289D27 - 01775DF74618E616534C4F3E63F71E617A198B45289769621F9C234D2F040644 - CA0BCF073EECFF62BBBB3B91484B251CBE2C7870F5F3A694E4BC01605F6BD330 - 3BC10E9E3CA0E3041F0967840354009C1A642D3DAD9E00C53A4C480864283400 - 00000049454E44AE426082} - Stretch = True - Visible = False - OnClick = LanguageImgClick - end - object PresentationCbx: TComboBox - Left = 41 - Top = 55 - Width = 280 - Height = 29 - BevelEdges = [] - BevelInner = bvNone - BevelOuter = bvSpace - Style = csDropDownList - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -16 - Font.Name = 'Segoe UI' - Font.Style = [] - ParentFont = False - TabOrder = 1 - OnChange = PresentationCbxChange - Items.Strings = ( - 'Fullscreen' - 'Fullscreen Upscaled' - 'Borderless' - 'Windowed') - end - object MaintasChk: TToggleSwitch - Left = 40 - Top = 132 - Width = 50 - Height = 20 - ParentShowHint = False - ShowHint = True - ShowStateCaption = False - TabOrder = 0 - OnClick = MaintasChkClick - end - object VsyncChk: TToggleSwitch - Left = 40 - Top = 200 - Width = 50 - Height = 20 - ShowStateCaption = False - TabOrder = 2 - OnClick = VsyncChkClick - end - object AdjmouseChk: TToggleSwitch - Left = 40 - Top = 268 - Width = 50 - Height = 20 - ParentShowHint = False - ShowHint = True - ShowStateCaption = False - TabOrder = 3 - OnClick = AdjmouseChkClick - end - object DevmodeChk: TToggleSwitch - Left = 40 - Top = 336 - Width = 50 - Height = 20 - ShowStateCaption = False - TabOrder = 4 - OnClick = DevmodeChkClick - end - object ThemePnl: TPanel - Left = 475 - Top = 8 - Width = 16 - Height = 11 - Anchors = [akTop, akRight] - BevelOuter = bvNone - Color = 2039583 - ParentBackground = False - TabOrder = 5 - StyleElements = [seFont, seBorder] - OnClick = ThemePnlClick - end - end object CompatibilityPnl: TPanel Left = 233 Top = 8 - Width = 499 - Height = 465 + Width = 495 + Height = 464 Anchors = [akLeft, akTop, akRight, akBottom] BevelOuter = bvNone Color = clWhite @@ -2898,6 +2697,8 @@ object ConfigForm: TConfigForm TabOrder = 3 Visible = False StyleElements = [seFont, seBorder] + ExplicitWidth = 491 + ExplicitHeight = 463 object MaxgameticksLbl: TLabel Left = 40 Top = 28 @@ -3068,8 +2869,8 @@ object ConfigForm: TConfigForm object AdvancedPnl: TPanel Left = 233 Top = 8 - Width = 499 - Height = 465 + Width = 495 + Height = 464 Anchors = [akLeft, akTop, akRight, akBottom] BevelOuter = bvNone Color = clWhite @@ -3078,6 +2879,8 @@ object ConfigForm: TConfigForm TabOrder = 2 Visible = False StyleElements = [seFont, seBorder] + ExplicitWidth = 491 + ExplicitHeight = 463 object RendererLbl: TLabel Left = 40 Top = 28 @@ -3118,8 +2921,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - ParentShowHint = False - ShowHint = True end object MaxfpsLbl: TLabel Left = 40 @@ -3162,8 +2963,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - ParentShowHint = False - ShowHint = True end object RendererPbox: TPaintBox Left = 40 @@ -3195,8 +2994,6 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - ParentShowHint = False - ShowHint = True TabOrder = 6 Visible = False OnChange = ShaderD3DCbxChange @@ -3256,15 +3053,13 @@ object ConfigForm: TConfigForm BevelInner = bvNone BevelOuter = bvSpace Style = csDropDownList - DropDownCount = 13 + DropDownCount = 10 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False - ParentShowHint = False - ShowHint = True TabOrder = 3 OnChange = ShaderCbxChange end @@ -3282,8 +3077,6 @@ object ConfigForm: TConfigForm Top = 277 Width = 50 Height = 20 - ParentShowHint = False - ShowHint = True ShowStateCaption = False TabOrder = 5 OnClick = BoxingChkClick @@ -3292,8 +3085,8 @@ object ConfigForm: TConfigForm object HotkeyPnl: TPanel Left = 233 Top = 8 - Width = 499 - Height = 465 + Width = 495 + Height = 464 Anchors = [akLeft, akTop, akRight, akBottom] BevelOuter = bvNone Color = clWhite @@ -3302,6 +3095,8 @@ object ConfigForm: TConfigForm TabOrder = 4 Visible = False StyleElements = [seFont, seBorder] + ExplicitWidth = 491 + ExplicitHeight = 463 object ToggleWindowedLbl: TLabel Left = 40 Top = 27 @@ -3519,19 +3314,269 @@ object ConfigForm: TConfigForm OnKeyUp = HotkeyEdtKeyUp end end + object DisplayPnl: TPanel + Left = 233 + Top = 8 + Width = 495 + Height = 464 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + Color = clWhite + ParentBackground = False + ShowCaption = False + TabOrder = 1 + StyleElements = [seFont, seBorder] + ExplicitWidth = 491 + ExplicitHeight = 463 + DesignSize = ( + 495 + 464) + object PresentationLbl: TLabel + Left = 40 + Top = 28 + Width = 87 + Height = 21 + Caption = 'Presentation' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object MaintasLbl: TLabel + Left = 40 + Top = 182 + Width = 145 + Height = 21 + Margins.Top = 18 + Caption = 'Maintain aspect ratio' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object VsyncLbl: TLabel + Left = 40 + Top = 250 + Width = 93 + Height = 21 + Margins.Top = 18 + Caption = 'Enable VSync' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object AdjmouseLbl: TLabel + Left = 40 + Top = 318 + Width = 168 + Height = 21 + Margins.Top = 18 + Caption = 'Adjust mouse sensitivity' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object DevmodeLbl: TLabel + Left = 40 + Top = 386 + Width = 216 + Height = 21 + Margins.Top = 18 + Caption = 'Lock cursor to window / screen' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object PresentationPbox: TPaintBox + Left = 40 + Top = 54 + Width = 282 + Height = 31 + OnPaint = PboxPaint + end + object LanguageImg: TImage + Left = 449 + Top = 8 + Width = 16 + Height = 11 + Anchors = [akTop, akRight] + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000100000 + 000B0802000000F9809A6E0000000467414D410000AFC837058AE90000001974 + 455874536F6674776172650041646F626520496D616765526561647971C9653C + 000001B34944415478DA4D51DF4B5451109EB3B95010813E583ED8D28B7F8356 + 6A1A2BD5530F81AE108837E9414390681F841235FF00115C0A5A82AD1E7C1172 + B7A050597C102C05E5C2222CE5A2D8522CABBBDD7BEEF935CE5DF1E2F031F30D + C37C67660EB39EAE4160C68051000200C9BF897C47E7FFBFBF7F283735508D51 + C3DBF9B65416639DE6E34AA8BF1DDF67D9E3DB2AB95A37D8A51101D12005F049 + 26B3E03774C65A3F658D3640100A35FA842BFC09E3502AC3F111542BE038ACFF + 7EEEC71A35AC74F4B6F7DDD23DAF59262EA3D375E917CE9DE94B3683D24B61CE + ACBE7ED475E76D7B8B5943D98ED8CDE432BDE06B2B091EA20D9E7236D4E11C09 + 43B58A9C8310A1C187EBF626B3ACAF89C4DDEE576629CEA35317D3F1E36B33E2 + F798691ED92E25DB4EE56907F2E5AB8D797F07EB4B6B5FF4DD374DC246C20E16 + B597833D0D05ADAECCF8DA9E4720121AEEFD9CCFB14221DFD4745D4A19289D27 + 01775DF74618E616534C4F3E63F71E617A198B45289769621F9C234D2F040644 + CA0BCF073EECFF62BBBB3B91484B251CBE2C7870F5F3A694E4BC01605F6BD330 + 3BC10E9E3CA0E3041F0967840354009C1A642D3DAD9E00C53A4C480864283400 + 00000049454E44AE426082} + Stretch = True + Visible = False + OnClick = LanguageImgClick + ExplicitLeft = 453 + end + object ResolutionLbl: TLabel + Left = 40 + Top = 105 + Width = 74 + Height = 21 + Caption = 'Resolution' + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + end + object ResolutionPbox: TPaintBox + Left = 40 + Top = 131 + Width = 282 + Height = 31 + OnPaint = PboxPaint + end + object PresentationCbx: TComboBox + Left = 41 + Top = 55 + Width = 280 + Height = 29 + BevelEdges = [] + BevelInner = bvNone + BevelOuter = bvSpace + Style = csDropDownList + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + TabOrder = 1 + OnChange = PresentationCbxChange + Items.Strings = ( + 'Fullscreen' + 'Fullscreen Upscaled' + 'Borderless' + 'Windowed') + end + object MaintasChk: TToggleSwitch + Left = 40 + Top = 209 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 0 + OnClick = MaintasChkClick + end + object VsyncChk: TToggleSwitch + Left = 40 + Top = 277 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 2 + OnClick = VsyncChkClick + end + object AdjmouseChk: TToggleSwitch + Left = 40 + Top = 345 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 3 + OnClick = AdjmouseChkClick + end + object DevmodeChk: TToggleSwitch + Left = 40 + Top = 413 + Width = 50 + Height = 20 + ShowStateCaption = False + TabOrder = 4 + OnClick = DevmodeChkClick + end + object ThemePnl: TPanel + Left = 471 + Top = 8 + Width = 16 + Height = 11 + Anchors = [akTop, akRight] + BevelOuter = bvNone + Color = 2039583 + ParentBackground = False + TabOrder = 5 + StyleElements = [seFont, seBorder] + OnClick = ThemePnlClick + ExplicitLeft = 467 + end + object ResolutionCbx: TComboBox + Left = 41 + Top = 132 + Width = 280 + Height = 29 + BevelEdges = [] + BevelInner = bvNone + BevelOuter = bvSpace + Style = csDropDownList + DropDownCount = 13 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -16 + Font.Name = 'Segoe UI' + Font.Style = [] + ParentFont = False + TabOrder = 6 + OnChange = PresentationCbxChange + Items.Strings = ( + '640x480 (4:3)' + '800x608 (4:3)' + '1024x768 (4:3)' + '832x480 (16:9)' + '960x544 (16:9)' + '1024x576 (16:9)' + '1280x704 (16:9)' + '1120x480 (21:9)' + '1280x544 (21:9)' + '768x480 (16:10)' + '960x608 (16:10)' + '1280x800 (16:10)') + end + end object MenuPnl: TPanel Left = 0 Top = 8 Width = 233 - Height = 468 + Height = 467 Anchors = [akLeft, akTop, akBottom] BevelOuter = bvNone Color = clMenu ParentBackground = False TabOrder = 0 + ExplicitHeight = 466 DesignSize = ( 233 - 468) + 467) object DisplayBtn: TSpeedButton Left = 0 Top = 8 @@ -3598,7 +3643,7 @@ object ConfigForm: TConfigForm end object RestoreDefaultsBtn: TSpeedButton Left = 0 - Top = 440 + Top = 439 Width = 227 Height = 22 Anchors = [akLeft, akRight, akBottom] @@ -3611,6 +3656,7 @@ object ConfigForm: TConfigForm Font.Style = [] ParentFont = False OnClick = RestoreDefaultsBtnClick + ExplicitTop = 440 end end end diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 8a8a14c..3a77681 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -81,6 +81,9 @@ __published: // Von der IDE verwaltete Komponenten TComboBox *ShaderD3DCbx; TSpeedButton *RestoreDefaultsBtn; TPanel *ThemePnl; + TComboBox *ResolutionCbx; + TLabel *ResolutionLbl; + TPaintBox *ResolutionPbox; void __fastcall DisplayBtnClick(TObject *Sender); void __fastcall AdvancedBtnClick(TObject *Sender); void __fastcall CompatibilityBtnClick(TObject *Sender); @@ -122,8 +125,6 @@ private: // Benutzer-Deklarationen System::UnicodeString GetKeyText(WORD key); WORD GetKeyCode(System::UnicodeString text); System::UnicodeString KeyToText(WORD key); - void DisableGameUX(); - void AddDllOverride(); public: // Benutzer-Deklarationen __fastcall TConfigForm(TComponent* Owner); }; diff --git a/config/Resources/VN.png b/config/Resources/VN.png deleted file mode 100644 index ec7cd48..0000000 Binary files a/config/Resources/VN.png and /dev/null differ diff --git a/config/Resources/pl.png b/config/Resources/pl.png deleted file mode 100644 index d413d01..0000000 Binary files a/config/Resources/pl.png and /dev/null differ diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index 7792b8b..dbd448c 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -1,7 +1,7 @@  {E020D5C7-AE07-4DB9-9688-6D289E9FFF1A} - 20.1 + 19.5 VCL Application cnc-ddraw config.cpp @@ -10,7 +10,6 @@ Win32 1 c - cnc-ddraw config true @@ -25,11 +24,6 @@ Base true - - true - Base - true - true Base @@ -47,12 +41,6 @@ true true - - true - Cfg_1 - true - true - true Base @@ -70,12 +58,6 @@ true true - - true - Cfg_2 - true - true - JPHNE true @@ -119,14 +101,6 @@ 1033 $(BDS)\bin\default_app.manifest - - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - 1033 - $(BDS)\bin\default_app.manifest - false true @@ -167,9 +141,6 @@ PerMonitorV2 - - PerMonitorV2 - NDEBUG;$(Defines) None @@ -190,9 +161,6 @@ PerMonitorV2 - - PerMonitorV2 - 0 @@ -227,10 +195,6 @@ RCDATA PngImage_IT - - RCDATA - PngImage_PL - RCDATA PngImage_RU @@ -239,10 +203,6 @@ RCDATA PngImage_US - - RCDATA - PngImage_VN - Base @@ -305,16 +265,6 @@ true - - - true - - - - - true - - true @@ -332,16 +282,6 @@ true - - - true - - - - - true - - @@ -354,92 +294,16 @@ true - - - true - - - - - true - - - - - cnc-ddraw config.exe - true - - - - - .\ - true - - - - - .\ - true - - - - - .\ - true - - - - - .\ - true - - - - - .\ - true - - - - - .\ - true - - - - - .\ - true - - - - - .\ - true - - - - - .\ - true - - - - - .\ - true - - 1 @@ -530,16 +394,6 @@ 1 - - - res\drawable-anydpi-v21 - 1 - - - res\drawable-anydpi-v21 - 1 - - res\values @@ -560,66 +414,6 @@ 1 - - - res\values-v31 - 1 - - - res\values-v31 - 1 - - - - - res\drawable-anydpi-v26 - 1 - - - res\drawable-anydpi-v26 - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-anydpi-v33 - 1 - - - res\drawable-anydpi-v33 - 1 - - res\values @@ -630,16 +424,6 @@ 1 - - - res\values-night-v21 - 1 - - - res\values-night-v21 - 1 - - res\drawable @@ -810,56 +594,6 @@ 1 - - - res\drawable-anydpi-v24 - 1 - - - res\drawable-anydpi-v24 - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-night-anydpi-v21 - 1 - - - res\drawable-night-anydpi-v21 - 1 - - - - - res\drawable-anydpi-v31 - 1 - - - res\drawable-anydpi-v31 - 1 - - - - - res\drawable-night-anydpi-v31 - 1 - - - res\drawable-night-anydpi-v31 - 1 - - 1 @@ -1100,9 +834,6 @@ 1 - - 1 - @@ -1173,10 +904,6 @@ Assets 1 - - Assets - 1 - @@ -1187,10 +914,6 @@ Assets 1 - - Assets - 1 - @@ -1404,12 +1127,10 @@ - True False - False 12 diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index cef38b4..0760b13 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -11,6 +11,7 @@ #include USEFORM("ConfigFormUnit.cpp", ConfigForm); //--------------------------------------------------------------------------- + #define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\") int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) @@ -34,12 +35,7 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) return 0; } - auto iniPath = System::Sysutils::GetEnvironmentVariable( - "CNC_DDRAW_CONFIG_FILE"); - - auto *ini = - new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); - + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); auto theme = ini->ReadString("ddraw", "configtheme", "Windows10"); TStyleManager::TrySetStyle( @@ -67,15 +63,4 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) } return 0; } - -// dummy functions to avoid Wtsapi32.dll imports -EXTERN_C BOOL WINAPI WTSRegisterSessionNotification(HWND hWnd, DWORD dwFlags) -{ - return TRUE; -} - -EXTERN_C BOOL WINAPI WTSUnRegisterSessionNotification(HWND hWnd) -{ - return TRUE; -} //--------------------------------------------------------------------------- diff --git a/config/cnc-ddraw config_resources.rc b/config/cnc-ddraw config_resources.rc index b077d3a..a2ed1e5 100644 --- a/config/cnc-ddraw config_resources.rc +++ b/config/cnc-ddraw config_resources.rc @@ -4,7 +4,5 @@ PngImage_ES RCDATA "Resources\\ES.png" PngImage_FR RCDATA "Resources\\fr.png" PngImage_HU RCDATA "Resources\\hu.png" PngImage_IT RCDATA "Resources\\IT.png" -PngImage_PL RCDATA "Resources\\pl.png" PngImage_RU RCDATA "Resources\\RU.png" PngImage_US RCDATA "Resources\\US.png" -PngImage_VN RCDATA "Resources\\VN.png" diff --git a/exports.def b/ddraw.def similarity index 88% rename from exports.def rename to ddraw.def index 1e25f0f..3b4b6bb 100644 --- a/exports.def +++ b/ddraw.def @@ -18,8 +18,13 @@ EXPORTS DirectInputCreateW = fake_DirectInputCreateW DirectInputCreateEx = fake_DirectInputCreateEx DirectInput8Create = fake_DirectInput8Create + DDmemcpy + DDmemmove + DDmemset + DDZeroMemory + DDmemcpyStd + DDmemmoveStd + DDmemsetStd + DDZeroMemoryStd GameHandlesClose DATA pvBmpBits = FakePrimarySurface DATA - DDIsWindowed - DDGetProcAddress - DDEnableZoom diff --git a/ddraw.rc b/ddraw.rc new file mode 100644 index 0000000..6d17f10 --- /dev/null +++ b/ddraw.rc @@ -0,0 +1,37 @@ +#define str(s) #s +#define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) + +#define VERSION_MAJOR 4 +#define VERSION_MINOR 4 +#define VERSION_BUILD 5 +#define VERSION_REVISION 0 + +#define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION +#define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) + +1 VERSIONINFO +FILEVERSION VERSION +PRODUCTVERSION VERSION +{ + BLOCK "StringFileInfo" + { + BLOCK "040904B0" + { + VALUE "CompanyName", "cncnet.org" + VALUE "FileDescription", "DirectDraw replacement" + VALUE "FileVersion", VERSION_STRING + VALUE "InternalName", "ddraw" + VALUE "LegalCopyright", "Copyright (c) 2010-2021" + VALUE "LegalTrademarks", "" + VALUE "OriginalFileName", "ddraw.dll" + VALUE "ProductName", "cnc-ddraw" + VALUE "ProductVersion", VERSION_STRING + VALUE "Comments", "https://cncnet.org" + } + } + + BLOCK "VarFileInfo" + { + VALUE "Translation", 0x0409, 0x04B0 + } +} diff --git a/inc/IDirect3D.h b/inc/IDirect3D.h index aed4b3d..dd03465 100644 --- a/inc/IDirect3D.h +++ b/inc/IDirect3D.h @@ -3,7 +3,6 @@ #define WIN32_LEAN_AND_MEAN #include -#include "d3dcaps.h" DEFINE_GUID(IID_IDirect3D, 0x3BBA0080, 0x2421, 0x11CF, 0xA3, 0x1A, 0x00, 0xAA, 0x00, 0xB9, 0x33, 0x56); @@ -11,9 +10,6 @@ DEFINE_GUID(IID_IDirect3D2, 0x6aae1ec1, 0x662a, 0x11d0, 0x88, 0x9d, 0x00, 0xaa, DEFINE_GUID(IID_IDirect3D3, 0xbb223240, 0xe72b, 0x11d0, 0xa9, 0xb4, 0x00, 0xaa, 0x00, 0xc0, 0x99, 0x3e); DEFINE_GUID(IID_IDirect3D7, 0xf5049e77, 0x4861, 0x11d2, 0xa4, 0x7, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8); -DEFINE_GUID(IID_IDirect3DNullDevice, 0x8767df22, 0xbacc, 0x11d1, 0x89, 0x69, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8); - - #define DECLARE_D3D_INTERFACE(iface) typedef struct iface { \ struct iface##Vtbl FAR* lpVtbl; \ ULONG ref; \ @@ -21,6 +17,7 @@ DEFINE_GUID(IID_IDirect3DNullDevice, 0x8767df22, 0xbacc, 0x11d1, 0x89, 0x69, 0x0 typedef struct iface##Vtbl iface##Vtbl; \ struct iface##Vtbl + /* IID_IDirect3D */ DECLARE_D3D_INTERFACE(IDirect3DImpl) @@ -30,7 +27,7 @@ DECLARE_D3D_INTERFACE(IDirect3DImpl) ULONG(__stdcall * Release) (IDirect3DImpl*); HRESULT(__stdcall * Initialize)(IDirect3DImpl*, int); - HRESULT(__stdcall * EnumDevices)(IDirect3DImpl*, LPD3DENUMDEVICESCALLBACK, LPVOID); + HRESULT(__stdcall * EnumDevices)(IDirect3DImpl*, int, int); HRESULT(__stdcall * CreateLight)(IDirect3DImpl*, int, int); HRESULT(__stdcall * CreateMaterial)(IDirect3DImpl*, int, int); HRESULT(__stdcall * CreateViewport)(IDirect3DImpl*, int, int); @@ -47,7 +44,7 @@ DECLARE_D3D_INTERFACE(IDirect3D2Impl) ULONG(__stdcall * AddRef) (IDirect3D2Impl*); ULONG(__stdcall * Release) (IDirect3D2Impl*); - HRESULT(__stdcall * EnumDevices)(IDirect3D2Impl*, LPD3DENUMDEVICESCALLBACK, LPVOID); + HRESULT(__stdcall * EnumDevices)(IDirect3D2Impl*, int, int); HRESULT(__stdcall * CreateLight)(IDirect3D2Impl*, int, int); HRESULT(__stdcall * CreateMaterial)(IDirect3D2Impl*, int, int); HRESULT(__stdcall * CreateViewport)(IDirect3D2Impl*, int, int); @@ -65,7 +62,7 @@ DECLARE_D3D_INTERFACE(IDirect3D3Impl) ULONG(__stdcall * AddRef) (IDirect3D3Impl*); ULONG(__stdcall * Release) (IDirect3D3Impl*); - HRESULT(__stdcall * EnumDevices)(IDirect3D3Impl*, LPD3DENUMDEVICESCALLBACK, LPVOID); + HRESULT(__stdcall * EnumDevices)(IDirect3D3Impl*, int, int); HRESULT(__stdcall * CreateLight)(IDirect3D3Impl*, int, int); HRESULT(__stdcall * CreateMaterial)(IDirect3D3Impl*, int, int); HRESULT(__stdcall * CreateViewport)(IDirect3D3Impl*, int, int); @@ -86,7 +83,7 @@ DECLARE_D3D_INTERFACE(IDirect3D7Impl) ULONG(__stdcall * AddRef) (IDirect3D7Impl*); ULONG(__stdcall * Release) (IDirect3D7Impl*); - HRESULT(__stdcall * EnumDevices)(IDirect3D7Impl*, LPD3DENUMDEVICESCALLBACK7, LPVOID); + HRESULT(__stdcall * EnumDevices)(IDirect3D7Impl*, int, int); HRESULT(__stdcall * CreateDevice)(IDirect3D7Impl*, int, int, int); HRESULT(__stdcall * CreateVertexBuffer)(IDirect3D7Impl*, int, int, int); HRESULT(__stdcall * EnumZBufferFormats)(IDirect3D7Impl*, int, int, int); diff --git a/inc/IDirectDrawClipper.h b/inc/IDirectDrawClipper.h index 95510e6..c51648b 100644 --- a/inc/IDirectDrawClipper.h +++ b/inc/IDirectDrawClipper.h @@ -14,9 +14,6 @@ typedef struct IDirectDrawClipperImpl struct IDirectDrawClipperImplVtbl* lpVtbl; ULONG ref; - HWND hwnd; - HRGN region; - CRITICAL_SECTION cs; } IDirectDrawClipperImpl; diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index b96314a..1cb624d 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -9,11 +9,6 @@ #include "IDirectDraw.h" -typedef struct DDBITMAPINFO{ - BITMAPINFOHEADER bmiHeader; - RGBQUAD bmiColors[256]; -} DDBITMAPINFO; - struct IDirectDrawSurfaceImpl; struct IDirectDrawSurfaceImplVtbl; @@ -23,34 +18,28 @@ typedef struct IDirectDrawSurfaceImpl ULONG ref; - DWORD bpp; DWORD width; DWORD height; - DWORD size; + DWORD bpp; DWORD flags; DWORD caps; - DWORD backbuffer_count; - CRITICAL_SECTION cs; IDirectDrawPaletteImpl* palette; - PALETTEENTRY selected_pal[256]; - UINT selected_pal_count; void* surface; - HANDLE mapping; - DWORD pitch; - DWORD bytes_pp; - BOOL custom_buf; + DWORD l_pitch; + DWORD lx_pitch; + + void* bnet_surface; + HDC bnet_dc; + HBITMAP bnet_bitmap; PBITMAPINFO bmi; HBITMAP bitmap; HDC hdc; - int dc_state; DDCOLORKEY color_key; DWORD last_flip_tick; DWORD last_blt_tick; - BOOL queried; - BOOL skip_flip; /* Quest for Glory 5 */ struct IDirectDrawSurfaceImpl* backbuffer; struct IDirectDrawClipperImpl* clipper; diff --git a/inc/blt.h b/inc/blt.h deleted file mode 100644 index 8f35696..0000000 --- a/inc/blt.h +++ /dev/null @@ -1,141 +0,0 @@ -#ifndef BLT_H -#define BLT_H - -#define WIN32_LEAN_AND_MEAN -#include - - -extern BOOL g_blt_use_avx; - -void blt_copy( - unsigned char* dst, - unsigned char* src, - size_t size); - -void blt_clean( - unsigned char* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned char* src, - int src_x, - int src_y, - int src_p, - int bpp); - -void blt_overlap( - unsigned char* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned char* src, - int src_x, - int src_y, - int src_p, - int bpp); - -void blt_colorkey( - unsigned char* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned char* src, - int src_x, - int src_y, - int src_p, - unsigned int key_low, - unsigned int key_high, - int bpp); - -void blt_colorkey_mirror_stretch( - unsigned char* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned char* src, - int src_x, - int src_y, - int src_w, - int src_h, - int src_p, - unsigned int key_low, - unsigned int key_high, - BOOL mirror_up_down, - BOOL mirror_left_right, - int bpp); - -void blt_clear( - unsigned char* dst, - char color, - size_t size); - -void blt_colorfill( - unsigned char* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned int color, - int bpp); - -void blt_rgb565_to_rgba8888( - unsigned int* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned short* src, - int src_x, - int src_y, - int src_p); - -void blt_rgb555_to_rgba8888( - unsigned int* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned short* src, - int src_x, - int src_y, - int src_p); - -void blt_bgra8888_to_rgba8888( - unsigned int* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned int* src, - int src_x, - int src_y, - int src_p); - -void blt_stretch( - unsigned char* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned char* src, - int src_x, - int src_y, - int src_w, - int src_h, - int src_p, - int bpp); - -#endif diff --git a/inc/config.h b/inc/config.h index e15bece..2937e26 100644 --- a/inc/config.h +++ b/inc/config.h @@ -1,10 +1,9 @@ #ifndef CONFIG_H #define CONFIG_H +#define WIN32_LEAN_AND_MEAN #include -#include "ini.h" -#define FILE_EXISTS(a) (GetFileAttributes(a) != INVALID_FILE_ATTRIBUTES) typedef struct CNCDDRAWCONFIG { @@ -13,100 +12,8 @@ typedef struct CNCDDRAWCONFIG int upscaled_state; char ini_path[MAX_PATH]; char game_path[MAX_PATH]; - char dll_path[MAX_PATH]; char process_file_name[MAX_PATH]; - char dll_file_name[MAX_PATH]; - char process_file_ext[MAX_PATH]; - char dll_file_ext[MAX_PATH]; - char game_section[MAX_PATH]; - INIFILE ini; - BOOL d3d9on12; - BOOL opengl_core; - - /* Optional settings */ - - BOOL fullscreen; - BOOL windowed; - BOOL maintas; - char aspect_ratio[16]; - BOOL boxing; - int maxfps; - BOOL vsync; - BOOL adjmouse; - char shader[MAX_PATH]; - char renderer[256]; - BOOL devmode; - BOOL border; int save_settings; - BOOL resizable; - int d3d9_filter; - int anti_aliased_fonts_min_size; - int min_font_size; - int center_window; - char inject_resolution[128]; - BOOL vhack; - char screenshot_dir[MAX_PATH]; - BOOL toggle_borderless; - BOOL toggle_upscaled; - - /* Compatibility settings */ - - BOOL noactivateapp; - int maxgameticks; - int limiter_type; - int minfps; - BOOL nonexclusive; - BOOL singlecpu; - int resolutions; - int fixchilds; - BOOL hook_peekmessage; - - /* Undocumented settings */ - - BOOL fix_alt_key_stuck; - BOOL fix_not_responding; - BOOL no_compat_warning; - int guard_lines; - int max_resolutions; - BOOL lock_surfaces; - BOOL flipclear; - BOOL rgb555; - BOOL no_dinput_hook; - BOOL center_cursor_fix; - char fake_mode[128]; - BOOL lock_mouse_top_left; - char win_version[32]; - int hook; - BOOL limit_gdi_handles; - BOOL remove_menu; - int refresh_rate; - int terminate_process; - - /* Hotkeys */ - - struct - { - int toggle_fullscreen; - int toggle_fullscreen2; - int toggle_maximize; - int toggle_maximize2; - int unlock_cursor1; - int unlock_cursor2; - int screenshot; - } hotkeys; - - /* Game specific settings */ - - BOOL armadahack; - BOOL tshack; - BOOL infantryhack; - BOOL stronghold_hack; - BOOL mgs_hack; - BOOL tlc_hack; - BOOL carma95_hack; - BOOL sirtech_hack; - BOOL flightsim98_hack; - BOOL darkcolony_hack; } CNCDDRAWCONFIG; @@ -115,4 +22,8 @@ extern CNCDDRAWCONFIG g_config; void cfg_load(); void cfg_save(); +BOOL cfg_get_bool(LPCSTR key, BOOL default_value); +int cfg_get_int(LPCSTR key, int default_value); +DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size); + #endif diff --git a/inc/crc32.h b/inc/crc32.h deleted file mode 100644 index 9b0728d..0000000 --- a/inc/crc32.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef CRC32_H -#define CRC32_H - -#define WIN32_LEAN_AND_MEAN -#include - - -unsigned long Crc32_ComputeBuf(unsigned long inCrc32, const void* buf, size_t bufLen); -unsigned long Crc32_FromFile(unsigned long crc32, char* filename); - -#endif diff --git a/inc/d3d9shader.h b/inc/d3d9shader.h index 130d33f..963bf6d 100644 --- a/inc/d3d9shader.h +++ b/inc/d3d9shader.h @@ -2,6 +2,36 @@ #define D3D9SHADER_H #if 0 +// +// Generated by Microsoft (R) HLSL Shader Compiler 10.1 +// +// Parameters: +// +// sampler2D PaletteTex; +// sampler2D SurfaceTex; +// +// +// Registers: +// +// Name Reg Size +// ------------ ----- ---- +// SurfaceTex s0 1 +// PaletteTex s1 1 +// + + ps_2_0 + def c0, 0.99609375, 0.001953125, 0, 0 + dcl t0.xy + dcl_2d s0 + dcl_2d s1 + texld r0, t0, s0 + mad r0.x, r0.x, c0.x, c0.y + mov r0.y, c0.z + texld r0, r0, s1 + mov oC0, r0 + +// approximately 5 instruction slots used (2 texture, 3 arithmetic) + // fxc.exe /Tps_2_0 shader.hlsl /Fhshader.h /* uniform sampler2D SurfaceTex; @@ -77,6 +107,65 @@ const BYTE D3D9_PALETTE_SHADER[] = /* bilinear upscaling */ #if 0 +// +// Generated by Microsoft (R) HLSL Shader Compiler 10.1 +// +// Parameters: +// +// sampler2D PaletteTex; +// sampler2D SurfaceTex; +// float4 TextureSize; +// +// +// Registers: +// +// Name Reg Size +// ------------ ----- ---- +// TextureSize c0 1 +// SurfaceTex s0 1 +// PaletteTex s1 1 +// + + ps_2_0 + def c1, 0.5, 0, 0.99609375, 0.001953125 + dcl t0.xy + dcl_2d s0 + dcl_2d s1 + mov r0.y, c1.y + rcp r1.x, c0.x + rcp r1.y, c0.y + mul r0.zw, t0.wzyx, c0.wzyx + frc r0.zw, r0 + add r2.xy, -r0.wzyx, c1.x + mad r2.xy, r2, r1, t0 + add r3.xy, r1, r2 + mov r1.z, c1.y + add r4.x, r1.z, r2.x + add r4.y, r1.y, r2.y + add r1.x, r1.x, r2.x + add r1.y, r1.z, r2.y + texld r3, r3, s0 + texld r2, r2, s0 + texld r1, r1, s0 + texld r4, r4, s0 + mad r0.x, r3.x, c1.z, c1.w + mov r3.y, c1.y + mad r2.x, r2.x, c1.z, c1.w + mad r1.x, r1.x, c1.z, c1.w + mad r3.x, r4.x, c1.z, c1.w + mov r1.y, c1.y + mov r2.y, c1.y + texld r4, r0, s1 + texld r3, r3, s1 + texld r1, r1, s1 + texld r2, r2, s1 + lrp r5, r0.w, r4, r3 + lrp r3, r0.w, r1, r2 + lrp r1, r0.z, r5, r3 + mov oC0, r1 + +// approximately 32 instruction slots used (8 texture, 24 arithmetic) + // fxc.exe /Tps_2_0 shader.hlsl /Fhshader.h /* uniform sampler2D SurfaceTex; @@ -84,24 +173,18 @@ uniform sampler2D PaletteTex; float4 TextureSize : register(c0); -#define SourceSize float4(TextureSize.xy, 1.0 / TextureSize.xy) - float4 bilinear(float2 coord) { - float2 samplePos = coord * SourceSize.xy; - float2 texPos1 = floor(samplePos - 0.5f) + 0.5f; - float2 texPos2 = texPos1 + 1.0f; - - float2 f = samplePos - texPos1; - - texPos1 *= SourceSize.zw; - texPos2 *= SourceSize.zw; - - float tli = tex2D(SurfaceTex, float2(texPos1.x, texPos1.y)).r; - float tri = tex2D(SurfaceTex, float2(texPos2.x, texPos1.y)).r; - float bli = tex2D(SurfaceTex, float2(texPos1.x, texPos2.y)).r; - float bri = tex2D(SurfaceTex, float2(texPos2.x, texPos2.y)).r; - + float2 size = 1.0 / TextureSize.xy; + float2 f = frac(coord * TextureSize.xy); + + coord += (.5 - f) * size; + + float tli = tex2D(SurfaceTex, coord).r; + float tri = tex2D(SurfaceTex, coord + float2(size.x, 0.0) ).r; + float bli = tex2D(SurfaceTex, coord + float2(0.0, size.y)).r; + float bri = tex2D(SurfaceTex, coord + float2(size.x, size.y)).r; + float4 tl = tex2D(PaletteTex, float2(tli * (255./256) + (0.5/256), 0)); float4 tr = tex2D(PaletteTex, float2(tri * (255./256) + (0.5/256), 0)); float4 bl = tex2D(PaletteTex, float2(bli * (255./256) + (0.5/256), 0)); @@ -109,7 +192,7 @@ float4 bilinear(float2 coord) float4 top = lerp(tl, tr, f.x); float4 bot = lerp(bl, br, f.x); - + return lerp(top, bot, f.y); } @@ -121,1475 +204,141 @@ float4 main(float2 texCoords : TEXCOORD) : COLOR #endif const BYTE D3D9_PALETTE_SHADER_BILINEAR[] = - { - 0, 2, 255, 255, 254, 255, - 56, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 179, 0, - 0, 0, 0, 2, 255, 255, - 3, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 172, 0, 0, 0, 88, 0, - 0, 0, 3, 0, 1, 0, - 1, 0, 0, 0, 100, 0, - 0, 0, 0, 0, 0, 0, - 116, 0, 0, 0, 3, 0, - 0, 0, 1, 0, 0, 0, - 128, 0, 0, 0, 0, 0, - 0, 0, 144, 0, 0, 0, - 2, 0, 0, 0, 1, 0, - 2, 0, 156, 0, 0, 0, - 0, 0, 0, 0, 80, 97, - 108, 101, 116, 116, 101, 84, - 101, 120, 0, 171, 4, 0, - 12, 0, 1, 0, 1, 0, - 1, 0, 0, 0, 0, 0, - 0, 0, 83, 117, 114, 102, - 97, 99, 101, 84, 101, 120, - 0, 171, 4, 0, 12, 0, - 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 84, 101, 120, 116, 117, 114, - 101, 83, 105, 122, 101, 0, - 1, 0, 3, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 112, 115, - 95, 50, 95, 48, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 49, 48, - 46, 49, 0, 171, 81, 0, - 0, 5, 1, 0, 15, 160, - 0, 0, 0, 191, 0, 0, - 0, 63, 0, 0, 192, 63, - 0, 0, 0, 0, 81, 0, - 0, 5, 2, 0, 15, 160, - 0, 0, 127, 63, 0, 0, - 0, 59, 0, 0, 0, 0, - 0, 0, 0, 0, 31, 0, - 0, 2, 0, 0, 0, 128, - 0, 0, 3, 176, 31, 0, - 0, 2, 0, 0, 0, 144, - 0, 8, 15, 160, 31, 0, - 0, 2, 0, 0, 0, 144, - 1, 8, 15, 160, 1, 0, - 0, 2, 0, 0, 8, 128, - 1, 0, 0, 160, 4, 0, - 0, 4, 0, 0, 3, 128, - 0, 0, 228, 176, 0, 0, - 228, 160, 0, 0, 255, 128, - 19, 0, 0, 2, 0, 0, - 12, 128, 0, 0, 27, 128, - 2, 0, 0, 3, 0, 0, - 3, 128, 0, 0, 27, 129, - 0, 0, 228, 128, 2, 0, - 0, 3, 0, 0, 12, 128, - 0, 0, 27, 128, 1, 0, - 170, 160, 2, 0, 0, 3, - 0, 0, 3, 128, 0, 0, - 228, 128, 1, 0, 85, 160, - 6, 0, 0, 2, 1, 0, - 1, 128, 0, 0, 0, 160, - 6, 0, 0, 2, 1, 0, - 2, 128, 0, 0, 85, 160, - 5, 0, 0, 3, 2, 0, - 3, 128, 0, 0, 27, 128, - 1, 0, 228, 128, 5, 0, - 0, 3, 1, 0, 3, 128, - 0, 0, 228, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 3, 128, 0, 0, - 228, 176, 0, 0, 228, 160, - 0, 0, 228, 129, 1, 0, - 0, 2, 3, 0, 1, 128, - 2, 0, 0, 128, 1, 0, - 0, 2, 3, 0, 2, 128, - 1, 0, 85, 128, 1, 0, - 0, 2, 4, 0, 1, 128, - 1, 0, 0, 128, 1, 0, - 0, 2, 4, 0, 2, 128, - 2, 0, 85, 128, 66, 0, - 0, 3, 3, 0, 15, 128, - 3, 0, 228, 128, 0, 8, - 228, 160, 66, 0, 0, 3, - 1, 0, 15, 128, 1, 0, - 228, 128, 0, 8, 228, 160, - 66, 0, 0, 3, 2, 0, - 15, 128, 2, 0, 228, 128, - 0, 8, 228, 160, 66, 0, - 0, 3, 4, 0, 15, 128, - 4, 0, 228, 128, 0, 8, - 228, 160, 4, 0, 0, 4, - 3, 0, 1, 128, 3, 0, - 0, 128, 2, 0, 0, 160, - 2, 0, 85, 160, 1, 0, - 0, 2, 3, 0, 2, 128, - 1, 0, 255, 160, 4, 0, - 0, 4, 1, 0, 1, 128, - 1, 0, 0, 128, 2, 0, - 0, 160, 2, 0, 85, 160, - 1, 0, 0, 2, 1, 0, - 2, 128, 1, 0, 255, 160, - 4, 0, 0, 4, 2, 0, - 1, 128, 2, 0, 0, 128, - 2, 0, 0, 160, 2, 0, - 85, 160, 4, 0, 0, 4, - 4, 0, 1, 128, 4, 0, - 0, 128, 2, 0, 0, 160, - 2, 0, 85, 160, 1, 0, - 0, 2, 4, 0, 2, 128, - 1, 0, 255, 160, 1, 0, - 0, 2, 2, 0, 2, 128, - 1, 0, 255, 160, 66, 0, - 0, 3, 3, 0, 15, 128, - 3, 0, 228, 128, 1, 8, - 228, 160, 66, 0, 0, 3, - 1, 0, 15, 128, 1, 0, - 228, 128, 1, 8, 228, 160, - 66, 0, 0, 3, 4, 0, - 15, 128, 4, 0, 228, 128, - 1, 8, 228, 160, 66, 0, - 0, 3, 2, 0, 15, 128, - 2, 0, 228, 128, 1, 8, - 228, 160, 18, 0, 0, 4, - 5, 0, 15, 128, 0, 0, - 0, 128, 3, 0, 228, 128, - 1, 0, 228, 128, 18, 0, - 0, 4, 1, 0, 15, 128, - 0, 0, 0, 128, 2, 0, - 228, 128, 4, 0, 228, 128, - 18, 0, 0, 4, 2, 0, - 15, 128, 0, 0, 85, 128, - 1, 0, 228, 128, 5, 0, - 228, 128, 1, 0, 0, 2, - 0, 8, 15, 128, 2, 0, +{ + 0, 2, 255, 255, 254, 255, + 56, 0, 67, 84, 65, 66, + 28, 0, 0, 0, 179, 0, + 0, 0, 0, 2, 255, 255, + 3, 0, 0, 0, 28, 0, + 0, 0, 0, 1, 0, 0, + 172, 0, 0, 0, 88, 0, + 0, 0, 3, 0, 1, 0, + 1, 0, 0, 0, 100, 0, + 0, 0, 0, 0, 0, 0, + 116, 0, 0, 0, 3, 0, + 0, 0, 1, 0, 0, 0, + 128, 0, 0, 0, 0, 0, + 0, 0, 144, 0, 0, 0, + 2, 0, 0, 0, 1, 0, + 2, 0, 156, 0, 0, 0, + 0, 0, 0, 0, 80, 97, + 108, 101, 116, 116, 101, 84, + 101, 120, 0, 171, 4, 0, + 12, 0, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 0, + 0, 0, 83, 117, 114, 102, + 97, 99, 101, 84, 101, 120, + 0, 171, 4, 0, 12, 0, + 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, + 84, 101, 120, 116, 117, 114, + 101, 83, 105, 122, 101, 0, + 1, 0, 3, 0, 1, 0, + 4, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 112, 115, + 95, 50, 95, 48, 0, 77, + 105, 99, 114, 111, 115, 111, + 102, 116, 32, 40, 82, 41, + 32, 72, 76, 83, 76, 32, + 83, 104, 97, 100, 101, 114, + 32, 67, 111, 109, 112, 105, + 108, 101, 114, 32, 49, 48, + 46, 49, 0, 171, 81, 0, + 0, 5, 1, 0, 15, 160, + 0, 0, 0, 63, 0, 0, + 0, 0, 0, 0, 127, 63, + 0, 0, 0, 59, 31, 0, + 0, 2, 0, 0, 0, 128, + 0, 0, 3, 176, 31, 0, + 0, 2, 0, 0, 0, 144, + 0, 8, 15, 160, 31, 0, + 0, 2, 0, 0, 0, 144, + 1, 8, 15, 160, 1, 0, + 0, 2, 0, 0, 2, 128, + 1, 0, 85, 160, 6, 0, + 0, 2, 1, 0, 1, 128, + 0, 0, 0, 160, 6, 0, + 0, 2, 1, 0, 2, 128, + 0, 0, 85, 160, 5, 0, + 0, 3, 0, 0, 12, 128, + 0, 0, 27, 176, 0, 0, + 27, 160, 19, 0, 0, 2, + 0, 0, 12, 128, 0, 0, + 228, 128, 2, 0, 0, 3, + 2, 0, 3, 128, 0, 0, + 27, 129, 1, 0, 0, 160, + 4, 0, 0, 4, 2, 0, + 3, 128, 2, 0, 228, 128, + 1, 0, 228, 128, 0, 0, + 228, 176, 2, 0, 0, 3, + 3, 0, 3, 128, 1, 0, + 228, 128, 2, 0, 228, 128, + 1, 0, 0, 2, 1, 0, + 4, 128, 1, 0, 85, 160, + 2, 0, 0, 3, 4, 0, + 1, 128, 1, 0, 170, 128, + 2, 0, 0, 128, 2, 0, + 0, 3, 4, 0, 2, 128, + 1, 0, 85, 128, 2, 0, + 85, 128, 2, 0, 0, 3, + 1, 0, 1, 128, 1, 0, + 0, 128, 2, 0, 0, 128, + 2, 0, 0, 3, 1, 0, + 2, 128, 1, 0, 170, 128, + 2, 0, 85, 128, 66, 0, + 0, 3, 3, 0, 15, 128, + 3, 0, 228, 128, 0, 8, + 228, 160, 66, 0, 0, 3, + 2, 0, 15, 128, 2, 0, + 228, 128, 0, 8, 228, 160, + 66, 0, 0, 3, 1, 0, + 15, 128, 1, 0, 228, 128, + 0, 8, 228, 160, 66, 0, + 0, 3, 4, 0, 15, 128, + 4, 0, 228, 128, 0, 8, + 228, 160, 4, 0, 0, 4, + 0, 0, 1, 128, 3, 0, + 0, 128, 1, 0, 170, 160, + 1, 0, 255, 160, 1, 0, + 0, 2, 3, 0, 2, 128, + 1, 0, 85, 160, 4, 0, + 0, 4, 2, 0, 1, 128, + 2, 0, 0, 128, 1, 0, + 170, 160, 1, 0, 255, 160, + 4, 0, 0, 4, 1, 0, + 1, 128, 1, 0, 0, 128, + 1, 0, 170, 160, 1, 0, + 255, 160, 4, 0, 0, 4, + 3, 0, 1, 128, 4, 0, + 0, 128, 1, 0, 170, 160, + 1, 0, 255, 160, 1, 0, + 0, 2, 1, 0, 2, 128, + 1, 0, 85, 160, 1, 0, + 0, 2, 2, 0, 2, 128, + 1, 0, 85, 160, 66, 0, + 0, 3, 4, 0, 15, 128, + 0, 0, 228, 128, 1, 8, + 228, 160, 66, 0, 0, 3, + 3, 0, 15, 128, 3, 0, + 228, 128, 1, 8, 228, 160, + 66, 0, 0, 3, 1, 0, + 15, 128, 1, 0, 228, 128, + 1, 8, 228, 160, 66, 0, + 0, 3, 2, 0, 15, 128, + 2, 0, 228, 128, 1, 8, + 228, 160, 18, 0, 0, 4, + 5, 0, 15, 128, 0, 0, + 255, 128, 4, 0, 228, 128, + 3, 0, 228, 128, 18, 0, + 0, 4, 3, 0, 15, 128, + 0, 0, 255, 128, 1, 0, + 228, 128, 2, 0, 228, 128, + 18, 0, 0, 4, 1, 0, + 15, 128, 0, 0, 170, 128, + 5, 0, 228, 128, 3, 0, + 228, 128, 1, 0, 0, 2, + 0, 8, 15, 128, 1, 0, 228, 128, 255, 255, 0, 0 - }; - - -/* catmull rom upscaling */ - -#if 0 -// fxc.exe /Tps_2_0 shader.hlsl /Fhshader.h -/* -// The following code is licensed under the MIT license: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae -// Ported from code: https://gist.github.com/TheRealMJP/c83b8c0f46b63f3a88a5986f4fa982b1 -// Samples a texture with Catmull-Rom filtering, using 9 texture fetches instead of 16. -// See http://vec3.ca/bicubic-filtering-in-fewer-taps/ for more details - -// Modified to use 5 texture fetches - -uniform sampler2D SurfaceTex; - -float4 TextureSize : register(c0); - -#define SourceSize float4(TextureSize.xy, 1.0 / TextureSize.xy) - -float4 catmull_rom(float2 coord) -{ - float2 samplePos = coord * SourceSize.xy; - float2 texPos1 = floor(samplePos - 0.5f) + 0.5f; - - float2 f = samplePos - texPos1; - - float2 w0 = f * (-0.5f + f * (1.0f - 0.5f * f)); - float2 w1 = 1.0f + f * f * (-2.5f + 1.5f * f); - float2 w2 = f * (0.5f + f * (2.0f - 1.5f * f)); - float2 w3 = f * f * (-0.5f + 0.5f * f); - - float2 w12 = w1 + w2; - float2 offset12 = w2 / (w1 + w2); - - float2 texPos0 = texPos1 - 1; - float2 texPos3 = texPos1 + 2; - float2 texPos12 = texPos1 + offset12; - - texPos0 *= SourceSize.zw; - texPos3 *= SourceSize.zw; - texPos12 *= SourceSize.zw; - - float wtm = w12.x * w0.y; - float wml = w0.x * w12.y; - float wmm = w12.x * w12.y; - float wmr = w3.x * w12.y; - float wbm = w12.x * w3.y; - - float3 result = 0.0f; - - result += tex2D(SurfaceTex, float2(texPos12.x, texPos0.y)).rgb * wtm; - result += tex2D(SurfaceTex, float2(texPos0.x, texPos12.y)).rgb * wml; - result += tex2D(SurfaceTex, float2(texPos12.x, texPos12.y)).rgb * wmm; - result += tex2D(SurfaceTex, float2(texPos3.x, texPos12.y)).rgb * wmr; - result += tex2D(SurfaceTex, float2(texPos12.x, texPos3.y)).rgb * wbm; - - return float4(result * (1./(wtm+wml+wmm+wmr+wbm)), 1.0); -} - -float4 main(float2 texCoords : TEXCOORD) : COLOR -{ - return catmull_rom(texCoords); -} - -*/ -#endif - -const BYTE D3D9_CATMULL_ROM_SHADER[] = - { - 0, 2, 255, 255, 254, 255, - 44, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 131, 0, - 0, 0, 0, 2, 255, 255, - 2, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 124, 0, 0, 0, 68, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 80, 0, - 0, 0, 0, 0, 0, 0, - 96, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 2, 0, - 108, 0, 0, 0, 0, 0, - 0, 0, 83, 117, 114, 102, - 97, 99, 101, 84, 101, 120, - 0, 171, 4, 0, 12, 0, - 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 84, 101, 120, 116, 117, 114, - 101, 83, 105, 122, 101, 0, - 1, 0, 3, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 112, 115, - 95, 50, 95, 48, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 49, 48, - 46, 49, 0, 171, 81, 0, - 0, 5, 1, 0, 15, 160, - 0, 0, 0, 191, 0, 0, - 0, 63, 0, 0, 128, 63, - 0, 0, 32, 64, 81, 0, - 0, 5, 2, 0, 15, 160, - 0, 0, 192, 63, 0, 0, - 32, 192, 0, 0, 0, 64, - 0, 0, 0, 0, 31, 0, - 0, 2, 0, 0, 0, 128, - 0, 0, 3, 176, 31, 0, - 0, 2, 0, 0, 0, 144, - 0, 8, 15, 160, 1, 0, - 0, 2, 0, 0, 8, 128, - 1, 0, 0, 160, 4, 0, - 0, 4, 0, 0, 3, 128, - 0, 0, 228, 176, 0, 0, - 228, 160, 0, 0, 255, 128, - 19, 0, 0, 2, 0, 0, - 12, 128, 0, 0, 27, 128, - 2, 0, 0, 3, 0, 0, - 3, 128, 0, 0, 27, 129, - 0, 0, 228, 128, 2, 0, - 0, 3, 0, 0, 12, 128, - 0, 0, 27, 128, 1, 0, - 0, 160, 6, 0, 0, 2, - 1, 0, 1, 128, 0, 0, - 0, 160, 6, 0, 0, 2, - 1, 0, 2, 128, 0, 0, - 85, 160, 5, 0, 0, 3, - 2, 0, 3, 128, 0, 0, - 27, 128, 1, 0, 228, 128, - 1, 0, 0, 2, 3, 0, - 1, 128, 2, 0, 0, 128, - 2, 0, 0, 3, 0, 0, - 12, 128, 0, 0, 27, 128, - 1, 0, 85, 160, 2, 0, - 0, 3, 0, 0, 3, 128, - 0, 0, 228, 128, 1, 0, - 255, 160, 5, 0, 0, 3, - 0, 0, 3, 128, 1, 0, - 228, 128, 0, 0, 228, 128, - 4, 0, 0, 4, 1, 0, - 12, 128, 0, 0, 27, 176, - 0, 0, 27, 160, 0, 0, - 228, 129, 4, 0, 0, 4, - 2, 0, 12, 128, 1, 0, - 228, 128, 2, 0, 0, 161, - 2, 0, 170, 160, 4, 0, - 0, 4, 2, 0, 12, 128, - 1, 0, 228, 128, 2, 0, - 228, 128, 1, 0, 85, 160, - 5, 0, 0, 3, 3, 0, - 12, 128, 1, 0, 228, 128, - 2, 0, 228, 128, 4, 0, - 0, 4, 4, 0, 3, 128, - 1, 0, 27, 128, 2, 0, - 0, 160, 2, 0, 85, 160, - 5, 0, 0, 3, 4, 0, - 12, 128, 1, 0, 228, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 4, 0, 3, 128, - 4, 0, 27, 128, 4, 0, - 228, 128, 1, 0, 170, 160, - 4, 0, 0, 4, 2, 0, - 12, 128, 1, 0, 228, 128, - 2, 0, 228, 128, 4, 0, - 27, 128, 6, 0, 0, 2, - 4, 0, 1, 128, 2, 0, - 255, 128, 6, 0, 0, 2, - 4, 0, 2, 128, 2, 0, - 170, 128, 4, 0, 0, 4, - 0, 0, 12, 128, 3, 0, - 228, 128, 4, 0, 27, 128, - 0, 0, 228, 128, 5, 0, - 0, 3, 1, 0, 3, 128, - 1, 0, 228, 128, 0, 0, - 27, 128, 1, 0, 0, 2, - 3, 0, 2, 128, 1, 0, - 85, 128, 1, 0, 0, 2, - 4, 0, 2, 128, 3, 0, - 85, 128, 1, 0, 0, 2, - 2, 0, 1, 128, 1, 0, - 0, 128, 1, 0, 0, 2, - 5, 0, 1, 128, 2, 0, - 0, 128, 1, 0, 0, 2, - 4, 0, 1, 128, 0, 0, - 0, 128, 1, 0, 0, 2, - 5, 0, 2, 128, 0, 0, - 85, 128, 66, 0, 0, 3, - 0, 0, 15, 128, 3, 0, - 228, 128, 0, 8, 228, 160, - 66, 0, 0, 3, 3, 0, - 15, 128, 1, 0, 228, 128, - 0, 8, 228, 160, 66, 0, - 0, 3, 6, 0, 15, 128, - 2, 0, 228, 128, 0, 8, - 228, 160, 66, 0, 0, 3, - 5, 0, 15, 128, 5, 0, - 228, 128, 0, 8, 228, 160, - 66, 0, 0, 3, 7, 0, - 15, 128, 4, 0, 228, 128, - 0, 8, 228, 160, 4, 0, - 0, 4, 1, 0, 3, 128, - 1, 0, 27, 128, 1, 0, - 85, 161, 1, 0, 170, 160, - 4, 0, 0, 4, 1, 0, - 3, 128, 1, 0, 27, 128, - 1, 0, 228, 128, 1, 0, - 0, 160, 5, 0, 0, 3, - 1, 0, 3, 128, 1, 0, - 228, 128, 1, 0, 27, 128, - 4, 0, 0, 4, 1, 0, - 12, 128, 1, 0, 228, 128, - 1, 0, 85, 160, 1, 0, - 0, 160, 5, 0, 0, 3, - 1, 0, 12, 128, 1, 0, - 228, 128, 4, 0, 228, 128, - 5, 0, 0, 3, 0, 0, - 8, 128, 2, 0, 170, 128, - 1, 0, 0, 128, 5, 0, - 0, 3, 0, 0, 7, 128, - 0, 0, 255, 128, 0, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 8, 128, 2, 0, - 255, 128, 1, 0, 85, 128, - 0, 0, 255, 128, 5, 0, - 0, 3, 3, 0, 8, 128, - 1, 0, 85, 128, 2, 0, - 255, 128, 4, 0, 0, 4, - 0, 0, 8, 128, 2, 0, - 255, 128, 2, 0, 170, 128, - 0, 0, 255, 128, 4, 0, - 0, 4, 0, 0, 8, 128, - 1, 0, 255, 128, 2, 0, - 170, 128, 0, 0, 255, 128, - 4, 0, 0, 4, 0, 0, - 8, 128, 2, 0, 255, 128, - 1, 0, 170, 128, 0, 0, - 255, 128, 6, 0, 0, 2, - 0, 0, 8, 128, 0, 0, - 255, 128, 4, 0, 0, 4, - 0, 0, 7, 128, 6, 0, - 228, 128, 3, 0, 255, 128, - 0, 0, 228, 128, 5, 0, - 0, 3, 3, 0, 8, 128, - 2, 0, 170, 128, 2, 0, - 255, 128, 4, 0, 0, 4, - 0, 0, 7, 128, 3, 0, - 228, 128, 3, 0, 255, 128, - 0, 0, 228, 128, 5, 0, - 0, 3, 5, 0, 8, 128, - 2, 0, 170, 128, 1, 0, - 255, 128, 5, 0, 0, 3, - 7, 0, 8, 128, 1, 0, - 170, 128, 2, 0, 255, 128, - 4, 0, 0, 4, 0, 0, - 7, 128, 7, 0, 228, 128, - 5, 0, 255, 128, 0, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 7, 128, 5, 0, - 228, 128, 7, 0, 255, 128, - 0, 0, 228, 128, 5, 0, - 0, 3, 0, 0, 7, 128, - 0, 0, 255, 128, 0, 0, - 228, 128, 1, 0, 0, 2, - 0, 0, 8, 128, 1, 0, - 170, 160, 1, 0, 0, 2, - 0, 8, 15, 128, 0, 0, - 228, 128, 255, 255, 0, 0 - }; - - -/* lanczos2 upscaling */ - -#if 0 -// fxc.exe /Tps_3_0 shader.hlsl /Fhshader.h -/* -// The following code is licensed under the MIT license: -// Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader -// Copyright (C) 2011-2016 Hyllian/Jararaca - sergiogdb@gmail.com -// Ported from: https://github.com/libretro/glsl-shaders/blob/09e2942efbab2f51b60ff0b93b7761b0b0570910/windowed/shaders/lanczos2-sharp.glsl - -uniform sampler2D SurfaceTex; - -float4 TextureSize : register(c0); - -#define JINC2_WINDOW_SINC 0.5 -#define JINC2_SINC 1.0 -#define JINC2_AR_STRENGTH 0.8 - -static const float pi = 3.1415926535897932384626433832795; -static const float wa = JINC2_WINDOW_SINC*pi; -static const float wb = JINC2_SINC*pi; - -// Calculates the distance between two points -float d(float2 pt1, float2 pt2) -{ - float2 v = pt2 - pt1; - return sqrt(dot(v,v)); -} - -float3 min4(float3 a, float3 b, float3 c, float3 d) -{ - return min(a, min(b, min(c, d))); -} - -float3 max4(float3 a, float3 b, float3 c, float3 d) -{ - return max(a, max(b, max(c, d))); -} - -float4 resampler(float4 x) -{ - float4 res; - - res.x = (x.x==0.0) ? wa*wb : sin(x.x*wa)*sin(x.x*wb)/(x.x*x.x); - res.y = (x.y==0.0) ? wa*wb : sin(x.y*wa)*sin(x.y*wb)/(x.y*x.y); - res.z = (x.z==0.0) ? wa*wb : sin(x.z*wa)*sin(x.z*wb)/(x.z*x.z); - res.w = (x.w==0.0) ? wa*wb : sin(x.w*wa)*sin(x.w*wb)/(x.w*x.w); - - return res; -} - -float4 lanczos2(float2 coord) -{ - float3 color; - float4 weights[4]; - - float2 dx = float2(1.0, 0.0); - float2 dy = float2(0.0, 1.0); - - float2 pc = coord*TextureSize.xy; - - float2 tc = (floor(pc-float2(0.5,0.5))+float2(0.5,0.5)); - - weights[0] = resampler(float4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy))); - weights[1] = resampler(float4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx ))); - weights[2] = resampler(float4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy))); - weights[3] = resampler(float4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy))); - - dx = dx/TextureSize.xy; - dy = dy/TextureSize.xy; - tc = tc/TextureSize.xy; - - float3 c00 = tex2D(SurfaceTex, tc -dx -dy).xyz; - float3 c10 = tex2D(SurfaceTex, tc -dy).xyz; - float3 c20 = tex2D(SurfaceTex, tc +dx -dy).xyz; - float3 c30 = tex2D(SurfaceTex, tc+2.0*dx -dy).xyz; - float3 c01 = tex2D(SurfaceTex, tc -dx ).xyz; - float3 c11 = tex2D(SurfaceTex, tc ).xyz; - float3 c21 = tex2D(SurfaceTex, tc +dx ).xyz; - float3 c31 = tex2D(SurfaceTex, tc+2.0*dx ).xyz; - float3 c02 = tex2D(SurfaceTex, tc -dx +dy).xyz; - float3 c12 = tex2D(SurfaceTex, tc +dy).xyz; - float3 c22 = tex2D(SurfaceTex, tc +dx +dy).xyz; - float3 c32 = tex2D(SurfaceTex, tc+2.0*dx +dy).xyz; - float3 c03 = tex2D(SurfaceTex, tc -dx+2.0*dy).xyz; - float3 c13 = tex2D(SurfaceTex, tc +2.0*dy).xyz; - float3 c23 = tex2D(SurfaceTex, tc +dx+2.0*dy).xyz; - float3 c33 = tex2D(SurfaceTex, tc+2.0*dx+2.0*dy).xyz; - - color = tex2D(SurfaceTex, coord).xyz; - - // Get min/max samples - float3 min_sample = min4(c11, c21, c12, c22); - float3 max_sample = max4(c11, c21, c12, c22); - - color = float3(dot(weights[0], float4(c00.x, c10.x, c20.x, c30.x)), dot(weights[0], float4(c00.y, c10.y, c20.y, c30.y)), dot(weights[0], float4(c00.z, c10.z, c20.z, c30.z))); - color+= float3(dot(weights[1], float4(c01.x, c11.x, c21.x, c31.x)), dot(weights[1], float4(c01.y, c11.y, c21.y, c31.y)), dot(weights[1], float4(c01.z, c11.z, c21.z, c31.z))); - color+= float3(dot(weights[2], float4(c02.x, c12.x, c22.x, c32.x)), dot(weights[2], float4(c02.y, c12.y, c22.y, c32.y)), dot(weights[2], float4(c02.z, c12.z, c22.z, c32.z))); - color+= float3(dot(weights[3], float4(c03.x, c13.x, c23.x, c33.x)), dot(weights[3], float4(c03.y, c13.y, c23.y, c33.y)), dot(weights[3], float4(c03.z, c13.z, c23.z, c33.z))); - color = color/(dot(weights[0], float4(1,1,1,1)) + dot(weights[1], float4(1,1,1,1)) + dot(weights[2], float4(1,1,1,1)) + dot(weights[3], float4(1,1,1,1))); - - // Anti-ringing - float3 aux = color; - color = clamp(color, min_sample, max_sample); - color = lerp(aux, color, JINC2_AR_STRENGTH); - - // final sum and weight normalization - return float4(color, 1.0); -} - -float4 main(float2 texCoords : TEXCOORD) : COLOR -{ - return lanczos2(texCoords); -} - -*/ -#endif - -const BYTE D3D9_LANCZOS2_SHADER[] = - { - 0, 3, 255, 255, 254, 255, - 44, 0, 67, 84, 65, 66, - 28, 0, 0, 0, 131, 0, - 0, 0, 0, 3, 255, 255, - 2, 0, 0, 0, 28, 0, - 0, 0, 0, 1, 0, 0, - 124, 0, 0, 0, 68, 0, - 0, 0, 3, 0, 0, 0, - 1, 0, 0, 0, 80, 0, - 0, 0, 0, 0, 0, 0, - 96, 0, 0, 0, 2, 0, - 0, 0, 1, 0, 2, 0, - 108, 0, 0, 0, 0, 0, - 0, 0, 83, 117, 114, 102, - 97, 99, 101, 84, 101, 120, - 0, 171, 4, 0, 12, 0, - 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, - 84, 101, 120, 116, 117, 114, - 101, 83, 105, 122, 101, 0, - 1, 0, 3, 0, 1, 0, - 4, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 112, 115, - 95, 51, 95, 48, 0, 77, - 105, 99, 114, 111, 115, 111, - 102, 116, 32, 40, 82, 41, - 32, 72, 76, 83, 76, 32, - 83, 104, 97, 100, 101, 114, - 32, 67, 111, 109, 112, 105, - 108, 101, 114, 32, 49, 48, - 46, 49, 0, 171, 81, 0, - 0, 5, 1, 0, 15, 160, - 230, 233, 157, 64, 0, 0, - 0, 0, 0, 0, 128, 63, - 0, 0, 0, 64, 81, 0, - 0, 5, 2, 0, 15, 160, - 0, 0, 128, 62, 0, 0, - 0, 63, 219, 15, 201, 64, - 219, 15, 73, 192, 81, 0, - 0, 5, 3, 0, 15, 160, - 0, 0, 0, 191, 0, 0, - 0, 63, 0, 0, 0, 0, - 0, 0, 192, 63, 81, 0, - 0, 5, 4, 0, 15, 160, - 0, 0, 32, 64, 0, 0, - 0, 191, 0, 0, 192, 63, - 0, 0, 0, 63, 81, 0, - 0, 5, 5, 0, 15, 160, - 205, 204, 76, 63, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 31, 0, - 0, 2, 5, 0, 0, 128, - 0, 0, 3, 144, 31, 0, - 0, 2, 0, 0, 0, 144, - 0, 8, 15, 160, 1, 0, - 0, 2, 0, 0, 1, 128, - 3, 0, 0, 160, 4, 0, - 0, 4, 0, 0, 3, 128, - 0, 0, 228, 144, 0, 0, - 228, 160, 0, 0, 0, 128, - 19, 0, 0, 2, 0, 0, - 12, 128, 0, 0, 68, 128, - 2, 0, 0, 3, 0, 0, - 3, 128, 0, 0, 238, 129, - 0, 0, 228, 128, 2, 0, - 0, 3, 0, 0, 12, 128, - 0, 0, 68, 128, 3, 0, - 0, 160, 4, 0, 0, 4, - 0, 0, 12, 128, 0, 0, - 68, 144, 0, 0, 68, 161, - 0, 0, 228, 128, 90, 0, - 0, 4, 0, 0, 4, 128, - 0, 0, 238, 128, 0, 0, - 238, 128, 3, 0, 170, 160, - 7, 0, 0, 2, 0, 0, - 4, 128, 0, 0, 170, 128, - 6, 0, 0, 2, 0, 0, - 4, 128, 0, 0, 170, 128, - 4, 0, 0, 4, 1, 0, - 3, 128, 0, 0, 170, 128, - 2, 0, 228, 160, 2, 0, - 85, 160, 19, 0, 0, 2, - 1, 0, 3, 128, 1, 0, - 228, 128, 4, 0, 0, 4, - 1, 0, 3, 128, 1, 0, - 228, 128, 2, 0, 170, 160, - 2, 0, 255, 160, 37, 0, - 0, 2, 2, 0, 2, 128, - 1, 0, 0, 128, 37, 0, - 0, 2, 3, 0, 2, 128, - 1, 0, 85, 128, 5, 0, - 0, 3, 0, 0, 8, 128, - 2, 0, 85, 128, 3, 0, - 85, 128, 5, 0, 0, 3, - 1, 0, 1, 128, 0, 0, - 170, 128, 0, 0, 170, 128, - 6, 0, 0, 2, 1, 0, - 1, 128, 1, 0, 0, 128, - 5, 0, 0, 3, 0, 0, - 8, 128, 0, 0, 255, 128, - 1, 0, 0, 128, 88, 0, - 0, 4, 1, 0, 1, 128, - 0, 0, 170, 129, 1, 0, - 0, 160, 0, 0, 255, 128, - 4, 0, 0, 4, 0, 0, - 12, 128, 0, 0, 68, 144, - 0, 0, 68, 161, 0, 0, - 68, 128, 2, 0, 0, 3, - 2, 0, 15, 128, 0, 0, - 68, 128, 3, 0, 84, 160, - 2, 0, 0, 3, 3, 0, - 15, 128, 0, 0, 238, 128, - 3, 0, 49, 160, 90, 0, - 0, 4, 0, 0, 1, 128, - 3, 0, 228, 128, 3, 0, - 228, 128, 3, 0, 170, 160, - 90, 0, 0, 4, 0, 0, - 2, 128, 3, 0, 238, 128, - 3, 0, 238, 128, 3, 0, - 170, 160, 7, 0, 0, 2, - 0, 0, 2, 128, 0, 0, - 85, 128, 6, 0, 0, 2, - 0, 0, 2, 128, 0, 0, - 85, 128, 7, 0, 0, 2, - 0, 0, 1, 128, 0, 0, - 0, 128, 6, 0, 0, 2, - 0, 0, 1, 128, 0, 0, - 0, 128, 4, 0, 0, 4, - 3, 0, 3, 128, 0, 0, - 0, 128, 2, 0, 228, 160, - 2, 0, 85, 160, 19, 0, - 0, 2, 3, 0, 3, 128, - 3, 0, 228, 128, 4, 0, - 0, 4, 3, 0, 3, 128, - 3, 0, 228, 128, 2, 0, - 170, 160, 2, 0, 255, 160, - 37, 0, 0, 2, 4, 0, - 2, 128, 3, 0, 0, 128, - 37, 0, 0, 2, 5, 0, - 2, 128, 3, 0, 85, 128, - 5, 0, 0, 3, 3, 0, - 1, 128, 4, 0, 85, 128, - 5, 0, 85, 128, 5, 0, - 0, 3, 3, 0, 2, 128, - 0, 0, 0, 128, 0, 0, - 0, 128, 6, 0, 0, 2, - 3, 0, 2, 128, 3, 0, - 85, 128, 5, 0, 0, 3, - 3, 0, 1, 128, 3, 0, - 85, 128, 3, 0, 0, 128, - 88, 0, 0, 4, 1, 0, - 2, 128, 0, 0, 0, 129, - 1, 0, 0, 160, 3, 0, - 0, 128, 4, 0, 0, 4, - 3, 0, 3, 128, 0, 0, - 85, 128, 2, 0, 228, 160, - 2, 0, 85, 160, 19, 0, - 0, 2, 3, 0, 3, 128, - 3, 0, 228, 128, 4, 0, - 0, 4, 3, 0, 3, 128, - 3, 0, 228, 128, 2, 0, - 170, 160, 2, 0, 255, 160, - 37, 0, 0, 2, 4, 0, - 2, 128, 3, 0, 0, 128, - 37, 0, 0, 2, 5, 0, - 2, 128, 3, 0, 85, 128, - 5, 0, 0, 3, 0, 0, - 1, 128, 4, 0, 85, 128, - 5, 0, 85, 128, 5, 0, - 0, 3, 3, 0, 1, 128, - 0, 0, 85, 128, 0, 0, - 85, 128, 6, 0, 0, 2, - 3, 0, 1, 128, 3, 0, - 0, 128, 5, 0, 0, 3, - 0, 0, 1, 128, 0, 0, - 0, 128, 3, 0, 0, 128, - 88, 0, 0, 4, 1, 0, - 4, 128, 0, 0, 85, 129, - 1, 0, 0, 160, 0, 0, - 0, 128, 2, 0, 0, 3, - 3, 0, 15, 128, 0, 0, - 238, 128, 4, 0, 228, 160, - 90, 0, 0, 4, 0, 0, - 1, 128, 3, 0, 228, 128, - 3, 0, 228, 128, 3, 0, - 170, 160, 90, 0, 0, 4, - 0, 0, 2, 128, 3, 0, - 238, 128, 3, 0, 238, 128, - 3, 0, 170, 160, 7, 0, - 0, 2, 0, 0, 2, 128, - 0, 0, 85, 128, 6, 0, - 0, 2, 0, 0, 2, 128, - 0, 0, 85, 128, 7, 0, - 0, 2, 0, 0, 1, 128, - 0, 0, 0, 128, 6, 0, - 0, 2, 0, 0, 1, 128, - 0, 0, 0, 128, 4, 0, - 0, 4, 3, 0, 3, 128, - 0, 0, 0, 128, 2, 0, - 228, 160, 2, 0, 85, 160, - 19, 0, 0, 2, 3, 0, - 3, 128, 3, 0, 228, 128, - 4, 0, 0, 4, 3, 0, - 3, 128, 3, 0, 228, 128, - 2, 0, 170, 160, 2, 0, - 255, 160, 37, 0, 0, 2, - 4, 0, 2, 128, 3, 0, - 0, 128, 37, 0, 0, 2, - 5, 0, 2, 128, 3, 0, - 85, 128, 5, 0, 0, 3, - 3, 0, 1, 128, 4, 0, - 85, 128, 5, 0, 85, 128, - 5, 0, 0, 3, 3, 0, - 2, 128, 0, 0, 0, 128, - 0, 0, 0, 128, 6, 0, - 0, 2, 3, 0, 2, 128, - 3, 0, 85, 128, 5, 0, - 0, 3, 3, 0, 1, 128, - 3, 0, 85, 128, 3, 0, - 0, 128, 88, 0, 0, 4, - 1, 0, 8, 128, 0, 0, - 0, 129, 1, 0, 0, 160, - 3, 0, 0, 128, 1, 0, - 0, 2, 3, 0, 2, 128, - 3, 0, 170, 160, 6, 0, - 0, 2, 4, 0, 1, 128, - 0, 0, 0, 160, 1, 0, - 0, 2, 3, 0, 1, 128, - 4, 0, 0, 128, 6, 0, - 0, 2, 4, 0, 2, 128, - 0, 0, 85, 160, 4, 0, - 0, 4, 3, 0, 12, 128, - 2, 0, 228, 128, 4, 0, - 68, 128, 3, 0, 68, 129, - 4, 0, 0, 4, 3, 0, - 3, 128, 2, 0, 238, 128, - 4, 0, 228, 128, 3, 0, - 228, 128, 4, 0, 0, 4, - 4, 0, 12, 128, 4, 0, - 68, 128, 1, 0, 148, 161, - 3, 0, 228, 128, 66, 0, - 0, 3, 5, 0, 15, 128, - 4, 0, 238, 128, 0, 8, - 228, 160, 1, 0, 0, 2, - 6, 0, 1, 128, 5, 0, - 0, 128, 4, 0, 0, 4, - 4, 0, 12, 128, 4, 0, - 68, 128, 1, 0, 148, 161, - 3, 0, 68, 128, 66, 0, - 0, 3, 7, 0, 15, 128, - 4, 0, 238, 128, 0, 8, - 228, 160, 1, 0, 0, 2, - 6, 0, 4, 128, 7, 0, - 0, 128, 5, 0, 0, 3, - 4, 0, 12, 128, 2, 0, - 228, 128, 4, 0, 68, 128, - 4, 0, 0, 4, 5, 0, - 9, 128, 4, 0, 100, 128, - 1, 0, 103, 160, 4, 0, - 230, 128, 66, 0, 0, 3, - 8, 0, 15, 128, 4, 0, - 238, 128, 0, 8, 228, 160, - 4, 0, 0, 4, 4, 0, - 12, 128, 4, 0, 68, 128, - 1, 0, 148, 161, 5, 0, - 196, 128, 66, 0, 0, 3, - 9, 0, 15, 128, 4, 0, - 238, 128, 0, 8, 228, 160, - 1, 0, 0, 2, 6, 0, - 8, 128, 9, 0, 0, 128, - 5, 0, 0, 3, 4, 0, - 12, 128, 4, 0, 68, 128, - 1, 0, 148, 160, 4, 0, - 0, 4, 9, 0, 9, 128, - 2, 0, 230, 128, 4, 0, - 100, 128, 4, 0, 230, 129, - 4, 0, 0, 4, 4, 0, - 12, 128, 2, 0, 228, 128, - 4, 0, 68, 128, 4, 0, - 228, 128, 66, 0, 0, 3, - 10, 0, 15, 128, 4, 0, - 238, 128, 0, 8, 228, 160, - 66, 0, 0, 3, 11, 0, - 15, 128, 9, 0, 236, 128, - 0, 8, 228, 160, 1, 0, - 0, 2, 6, 0, 2, 128, - 11, 0, 0, 128, 9, 0, - 0, 3, 6, 0, 1, 128, - 1, 0, 228, 128, 6, 0, - 228, 128, 1, 0, 0, 2, - 12, 0, 1, 128, 5, 0, - 85, 128, 1, 0, 0, 2, - 7, 0, 1, 128, 5, 0, - 170, 128, 1, 0, 0, 2, - 12, 0, 4, 128, 7, 0, - 85, 128, 1, 0, 0, 2, - 12, 0, 2, 128, 11, 0, - 85, 128, 1, 0, 0, 2, - 7, 0, 2, 128, 11, 0, - 170, 128, 1, 0, 0, 2, - 12, 0, 8, 128, 9, 0, - 85, 128, 1, 0, 0, 2, - 7, 0, 8, 128, 9, 0, - 170, 128, 9, 0, 0, 3, - 6, 0, 4, 128, 1, 0, - 228, 128, 7, 0, 228, 128, - 9, 0, 0, 3, 6, 0, - 2, 128, 1, 0, 228, 128, - 12, 0, 228, 128, 9, 0, - 0, 3, 0, 0, 1, 128, - 1, 0, 228, 128, 1, 0, - 170, 160, 4, 0, 0, 4, - 1, 0, 15, 128, 0, 0, - 68, 144, 0, 0, 68, 161, - 2, 0, 228, 128, 90, 0, - 0, 4, 1, 0, 1, 128, - 1, 0, 228, 128, 1, 0, - 228, 128, 3, 0, 170, 160, - 90, 0, 0, 4, 1, 0, - 2, 128, 1, 0, 238, 128, - 1, 0, 238, 128, 3, 0, - 170, 160, 7, 0, 0, 2, - 1, 0, 2, 128, 1, 0, - 85, 128, 6, 0, 0, 2, - 1, 0, 2, 128, 1, 0, - 85, 128, 7, 0, 0, 2, - 1, 0, 1, 128, 1, 0, - 0, 128, 6, 0, 0, 2, - 1, 0, 1, 128, 1, 0, - 0, 128, 4, 0, 0, 4, - 1, 0, 12, 128, 1, 0, - 0, 128, 2, 0, 68, 160, - 2, 0, 85, 160, 19, 0, - 0, 2, 1, 0, 12, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 1, 0, 12, 128, - 1, 0, 228, 128, 2, 0, - 170, 160, 2, 0, 255, 160, - 37, 0, 0, 2, 7, 0, - 2, 128, 1, 0, 170, 128, - 37, 0, 0, 2, 9, 0, - 2, 128, 1, 0, 255, 128, - 5, 0, 0, 3, 1, 0, - 4, 128, 7, 0, 85, 128, - 9, 0, 85, 128, 5, 0, - 0, 3, 1, 0, 8, 128, - 1, 0, 0, 128, 1, 0, - 0, 128, 6, 0, 0, 2, - 1, 0, 8, 128, 1, 0, - 255, 128, 5, 0, 0, 3, - 1, 0, 4, 128, 1, 0, - 255, 128, 1, 0, 170, 128, - 88, 0, 0, 4, 7, 0, - 1, 128, 1, 0, 0, 129, - 1, 0, 0, 160, 1, 0, - 170, 128, 4, 0, 0, 4, - 1, 0, 5, 128, 1, 0, - 85, 128, 2, 0, 212, 160, - 2, 0, 85, 160, 19, 0, - 0, 2, 1, 0, 5, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 1, 0, 5, 128, - 1, 0, 228, 128, 2, 0, - 170, 160, 2, 0, 255, 160, - 37, 0, 0, 2, 9, 0, - 2, 128, 1, 0, 0, 128, - 37, 0, 0, 2, 11, 0, - 2, 128, 1, 0, 170, 128, - 5, 0, 0, 3, 1, 0, - 1, 128, 9, 0, 85, 128, - 11, 0, 85, 128, 5, 0, - 0, 3, 1, 0, 4, 128, - 1, 0, 85, 128, 1, 0, - 85, 128, 6, 0, 0, 2, - 1, 0, 4, 128, 1, 0, - 170, 128, 5, 0, 0, 3, - 1, 0, 1, 128, 1, 0, - 170, 128, 1, 0, 0, 128, - 88, 0, 0, 4, 7, 0, - 2, 128, 1, 0, 85, 129, - 1, 0, 0, 160, 1, 0, - 0, 128, 4, 0, 0, 4, - 1, 0, 3, 128, 0, 0, - 85, 128, 2, 0, 228, 160, - 2, 0, 85, 160, 19, 0, - 0, 2, 1, 0, 3, 128, - 1, 0, 228, 128, 4, 0, - 0, 4, 1, 0, 3, 128, - 1, 0, 228, 128, 2, 0, - 170, 160, 2, 0, 255, 160, - 37, 0, 0, 2, 9, 0, - 2, 128, 1, 0, 0, 128, - 37, 0, 0, 2, 11, 0, - 2, 128, 1, 0, 85, 128, - 5, 0, 0, 3, 1, 0, - 1, 128, 9, 0, 85, 128, - 11, 0, 85, 128, 5, 0, - 0, 3, 1, 0, 2, 128, - 0, 0, 85, 128, 0, 0, - 85, 128, 6, 0, 0, 2, - 1, 0, 2, 128, 1, 0, - 85, 128, 5, 0, 0, 3, - 1, 0, 1, 128, 1, 0, - 85, 128, 1, 0, 0, 128, - 88, 0, 0, 4, 7, 0, - 4, 128, 0, 0, 85, 129, - 1, 0, 0, 160, 1, 0, - 0, 128, 2, 0, 0, 3, - 1, 0, 15, 128, 0, 0, - 238, 128, 4, 0, 156, 160, - 90, 0, 0, 4, 0, 0, - 2, 128, 1, 0, 228, 128, - 1, 0, 228, 128, 3, 0, - 170, 160, 90, 0, 0, 4, - 1, 0, 1, 128, 1, 0, - 238, 128, 1, 0, 238, 128, - 3, 0, 170, 160, 7, 0, - 0, 2, 1, 0, 1, 128, - 1, 0, 0, 128, 6, 0, - 0, 2, 1, 0, 1, 128, - 1, 0, 0, 128, 7, 0, - 0, 2, 0, 0, 2, 128, - 0, 0, 85, 128, 6, 0, - 0, 2, 0, 0, 2, 128, - 0, 0, 85, 128, 4, 0, - 0, 4, 1, 0, 6, 128, - 0, 0, 85, 128, 2, 0, - 208, 160, 2, 0, 85, 160, - 19, 0, 0, 2, 1, 0, - 6, 128, 1, 0, 228, 128, - 4, 0, 0, 4, 1, 0, - 6, 128, 1, 0, 228, 128, - 2, 0, 170, 160, 2, 0, - 255, 160, 37, 0, 0, 2, - 9, 0, 2, 128, 1, 0, - 85, 128, 37, 0, 0, 2, - 11, 0, 2, 128, 1, 0, - 170, 128, 5, 0, 0, 3, - 1, 0, 2, 128, 9, 0, - 85, 128, 11, 0, 85, 128, - 5, 0, 0, 3, 1, 0, - 4, 128, 0, 0, 85, 128, - 0, 0, 85, 128, 6, 0, - 0, 2, 1, 0, 4, 128, - 1, 0, 170, 128, 5, 0, - 0, 3, 1, 0, 2, 128, - 1, 0, 170, 128, 1, 0, - 85, 128, 88, 0, 0, 4, - 7, 0, 8, 128, 0, 0, - 85, 129, 1, 0, 0, 160, - 1, 0, 85, 128, 66, 0, - 0, 3, 9, 0, 15, 128, - 3, 0, 238, 128, 0, 8, - 228, 160, 1, 0, 0, 2, - 11, 0, 1, 128, 9, 0, - 0, 128, 66, 0, 0, 3, - 12, 0, 15, 128, 3, 0, - 228, 128, 0, 8, 228, 160, - 1, 0, 0, 2, 11, 0, - 4, 128, 12, 0, 0, 128, - 66, 0, 0, 3, 13, 0, - 15, 128, 5, 0, 236, 128, - 0, 8, 228, 160, 1, 0, - 0, 2, 11, 0, 8, 128, - 13, 0, 0, 128, 1, 0, - 0, 2, 11, 0, 2, 128, - 8, 0, 0, 128, 9, 0, - 0, 3, 11, 0, 1, 128, - 7, 0, 228, 128, 11, 0, - 228, 128, 1, 0, 0, 2, - 14, 0, 1, 128, 9, 0, - 85, 128, 1, 0, 0, 2, - 9, 0, 1, 128, 9, 0, - 170, 128, 1, 0, 0, 2, - 14, 0, 8, 128, 13, 0, - 85, 128, 1, 0, 0, 2, - 9, 0, 8, 128, 13, 0, - 170, 128, 1, 0, 0, 2, - 14, 0, 4, 128, 12, 0, - 85, 128, 1, 0, 0, 2, - 14, 0, 2, 128, 8, 0, - 85, 128, 9, 0, 0, 3, - 11, 0, 2, 128, 7, 0, - 228, 128, 14, 0, 228, 128, - 1, 0, 0, 2, 9, 0, - 4, 128, 12, 0, 170, 128, - 1, 0, 0, 2, 9, 0, - 2, 128, 8, 0, 170, 128, - 9, 0, 0, 3, 11, 0, - 4, 128, 7, 0, 228, 128, - 9, 0, 228, 128, 9, 0, - 0, 3, 0, 0, 2, 128, - 7, 0, 228, 128, 1, 0, - 170, 160, 2, 0, 0, 3, - 0, 0, 1, 128, 0, 0, - 85, 128, 0, 0, 0, 128, - 2, 0, 0, 3, 1, 0, - 14, 128, 6, 0, 144, 128, - 11, 0, 144, 128, 4, 0, - 0, 4, 2, 0, 3, 128, - 1, 0, 0, 128, 2, 0, - 228, 160, 2, 0, 85, 160, - 19, 0, 0, 2, 2, 0, - 3, 128, 2, 0, 228, 128, - 4, 0, 0, 4, 2, 0, - 3, 128, 2, 0, 228, 128, - 2, 0, 170, 160, 2, 0, - 255, 160, 37, 0, 0, 2, - 6, 0, 2, 128, 2, 0, - 0, 128, 37, 0, 0, 2, - 7, 0, 2, 128, 2, 0, - 85, 128, 5, 0, 0, 3, - 0, 0, 2, 128, 6, 0, - 85, 128, 7, 0, 85, 128, - 5, 0, 0, 3, 2, 0, - 1, 128, 1, 0, 0, 128, - 1, 0, 0, 128, 6, 0, - 0, 2, 2, 0, 1, 128, - 2, 0, 0, 128, 5, 0, - 0, 3, 0, 0, 2, 128, - 0, 0, 85, 128, 2, 0, - 0, 128, 88, 0, 0, 4, - 6, 0, 1, 128, 1, 0, - 0, 129, 1, 0, 0, 160, - 0, 0, 85, 128, 2, 0, - 0, 3, 7, 0, 15, 128, - 0, 0, 238, 128, 3, 0, - 253, 160, 90, 0, 0, 4, - 0, 0, 2, 128, 7, 0, - 228, 128, 7, 0, 228, 128, - 3, 0, 170, 160, 90, 0, - 0, 4, 1, 0, 1, 128, - 7, 0, 238, 128, 7, 0, - 238, 128, 3, 0, 170, 160, - 7, 0, 0, 2, 1, 0, - 1, 128, 1, 0, 0, 128, - 6, 0, 0, 2, 1, 0, - 1, 128, 1, 0, 0, 128, - 7, 0, 0, 2, 0, 0, - 2, 128, 0, 0, 85, 128, - 6, 0, 0, 2, 0, 0, - 2, 128, 0, 0, 85, 128, - 4, 0, 0, 4, 2, 0, - 3, 128, 0, 0, 85, 128, - 2, 0, 228, 160, 2, 0, - 85, 160, 19, 0, 0, 2, - 2, 0, 3, 128, 2, 0, - 228, 128, 4, 0, 0, 4, - 2, 0, 3, 128, 2, 0, - 228, 128, 2, 0, 170, 160, - 2, 0, 255, 160, 37, 0, - 0, 2, 7, 0, 2, 128, - 2, 0, 0, 128, 37, 0, - 0, 2, 9, 0, 2, 128, - 2, 0, 85, 128, 5, 0, - 0, 3, 2, 0, 1, 128, - 7, 0, 85, 128, 9, 0, - 85, 128, 5, 0, 0, 3, - 2, 0, 2, 128, 0, 0, - 85, 128, 0, 0, 85, 128, - 6, 0, 0, 2, 2, 0, - 2, 128, 2, 0, 85, 128, - 5, 0, 0, 3, 2, 0, - 1, 128, 2, 0, 85, 128, - 2, 0, 0, 128, 88, 0, - 0, 4, 6, 0, 2, 128, - 0, 0, 85, 129, 1, 0, - 0, 160, 2, 0, 0, 128, - 4, 0, 0, 4, 2, 0, - 3, 128, 1, 0, 0, 128, - 2, 0, 228, 160, 2, 0, - 85, 160, 19, 0, 0, 2, - 2, 0, 3, 128, 2, 0, - 228, 128, 4, 0, 0, 4, - 2, 0, 3, 128, 2, 0, - 228, 128, 2, 0, 170, 160, - 2, 0, 255, 160, 37, 0, - 0, 2, 7, 0, 2, 128, - 2, 0, 0, 128, 37, 0, - 0, 2, 9, 0, 2, 128, - 2, 0, 85, 128, 5, 0, - 0, 3, 0, 0, 2, 128, - 7, 0, 85, 128, 9, 0, - 85, 128, 5, 0, 0, 3, - 2, 0, 1, 128, 1, 0, - 0, 128, 1, 0, 0, 128, - 6, 0, 0, 2, 2, 0, - 1, 128, 2, 0, 0, 128, - 5, 0, 0, 3, 0, 0, - 2, 128, 0, 0, 85, 128, - 2, 0, 0, 128, 88, 0, - 0, 4, 6, 0, 4, 128, - 1, 0, 0, 129, 1, 0, - 0, 160, 0, 0, 85, 128, - 2, 0, 0, 3, 7, 0, - 15, 128, 0, 0, 238, 128, - 4, 0, 24, 160, 90, 0, - 0, 4, 0, 0, 2, 128, - 7, 0, 228, 128, 7, 0, - 228, 128, 3, 0, 170, 160, - 90, 0, 0, 4, 1, 0, - 1, 128, 7, 0, 238, 128, - 7, 0, 238, 128, 3, 0, - 170, 160, 7, 0, 0, 2, - 1, 0, 1, 128, 1, 0, - 0, 128, 6, 0, 0, 2, - 1, 0, 1, 128, 1, 0, - 0, 128, 7, 0, 0, 2, - 0, 0, 2, 128, 0, 0, - 85, 128, 6, 0, 0, 2, - 0, 0, 2, 128, 0, 0, - 85, 128, 4, 0, 0, 4, - 2, 0, 3, 128, 0, 0, - 85, 128, 2, 0, 228, 160, - 2, 0, 85, 160, 19, 0, - 0, 2, 2, 0, 3, 128, - 2, 0, 228, 128, 4, 0, - 0, 4, 2, 0, 3, 128, - 2, 0, 228, 128, 2, 0, - 170, 160, 2, 0, 255, 160, - 37, 0, 0, 2, 7, 0, - 2, 128, 2, 0, 0, 128, - 37, 0, 0, 2, 9, 0, - 2, 128, 2, 0, 85, 128, - 5, 0, 0, 3, 2, 0, - 1, 128, 7, 0, 85, 128, - 9, 0, 85, 128, 5, 0, - 0, 3, 2, 0, 2, 128, - 0, 0, 85, 128, 0, 0, - 85, 128, 6, 0, 0, 2, - 2, 0, 2, 128, 2, 0, - 85, 128, 5, 0, 0, 3, - 2, 0, 1, 128, 2, 0, - 85, 128, 2, 0, 0, 128, - 88, 0, 0, 4, 6, 0, - 8, 128, 0, 0, 85, 129, - 1, 0, 0, 160, 2, 0, - 0, 128, 4, 0, 0, 4, - 2, 0, 3, 128, 4, 0, - 228, 128, 1, 0, 233, 160, - 3, 0, 238, 128, 4, 0, - 0, 4, 3, 0, 12, 128, - 4, 0, 68, 128, 1, 0, - 212, 160, 3, 0, 228, 128, - 66, 0, 0, 3, 7, 0, - 15, 128, 3, 0, 238, 128, - 0, 8, 228, 160, 66, 0, - 0, 3, 9, 0, 15, 128, - 2, 0, 228, 128, 0, 8, - 228, 160, 1, 0, 0, 2, - 11, 0, 1, 128, 9, 0, - 0, 128, 4, 0, 0, 4, - 2, 0, 3, 128, 4, 0, - 228, 128, 1, 0, 233, 160, - 5, 0, 236, 128, 4, 0, - 0, 4, 3, 0, 12, 128, - 4, 0, 68, 128, 1, 0, - 212, 160, 5, 0, 196, 128, - 66, 0, 0, 3, 5, 0, - 15, 128, 3, 0, 238, 128, - 0, 8, 228, 160, 66, 0, - 0, 3, 13, 0, 15, 128, - 2, 0, 228, 128, 0, 8, - 228, 160, 1, 0, 0, 2, - 11, 0, 8, 128, 13, 0, - 0, 128, 4, 0, 0, 4, - 2, 0, 3, 128, 4, 0, - 228, 128, 1, 0, 233, 160, - 3, 0, 228, 128, 4, 0, - 0, 4, 3, 0, 3, 128, - 4, 0, 228, 128, 1, 0, - 237, 160, 3, 0, 228, 128, - 66, 0, 0, 3, 3, 0, - 15, 128, 3, 0, 228, 128, - 0, 8, 228, 160, 66, 0, - 0, 3, 14, 0, 15, 128, - 2, 0, 228, 128, 0, 8, - 228, 160, 1, 0, 0, 2, - 11, 0, 4, 128, 14, 0, - 0, 128, 1, 0, 0, 2, - 11, 0, 2, 128, 10, 0, - 0, 128, 9, 0, 0, 3, - 11, 0, 1, 128, 6, 0, - 228, 128, 11, 0, 228, 128, - 1, 0, 0, 2, 15, 0, - 1, 128, 9, 0, 85, 128, - 1, 0, 0, 2, 9, 0, - 1, 128, 9, 0, 170, 128, - 1, 0, 0, 2, 15, 0, - 8, 128, 13, 0, 85, 128, - 1, 0, 0, 2, 9, 0, - 8, 128, 13, 0, 170, 128, - 1, 0, 0, 2, 15, 0, - 4, 128, 14, 0, 85, 128, - 1, 0, 0, 2, 15, 0, - 2, 128, 10, 0, 85, 128, - 9, 0, 0, 3, 11, 0, - 2, 128, 6, 0, 228, 128, - 15, 0, 228, 128, 1, 0, - 0, 2, 9, 0, 4, 128, - 14, 0, 170, 128, 1, 0, - 0, 2, 9, 0, 2, 128, - 10, 0, 170, 128, 9, 0, - 0, 3, 11, 0, 4, 128, - 6, 0, 228, 128, 9, 0, - 228, 128, 9, 0, 0, 3, - 0, 0, 2, 128, 6, 0, - 228, 128, 1, 0, 170, 160, - 2, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 85, 128, - 0, 0, 0, 128, 2, 0, - 0, 3, 1, 0, 14, 128, - 1, 0, 228, 128, 11, 0, - 144, 128, 5, 0, 0, 3, - 2, 0, 3, 128, 4, 0, - 228, 128, 1, 0, 237, 160, - 4, 0, 0, 4, 2, 0, - 3, 128, 2, 0, 238, 128, - 4, 0, 228, 128, 2, 0, - 228, 128, 66, 0, 0, 3, - 2, 0, 15, 128, 2, 0, - 228, 128, 0, 8, 228, 160, - 1, 0, 0, 2, 4, 0, - 2, 128, 2, 0, 0, 128, - 4, 0, 0, 4, 2, 0, - 9, 128, 1, 0, 0, 128, - 2, 0, 100, 160, 2, 0, - 85, 160, 19, 0, 0, 2, - 2, 0, 9, 128, 2, 0, - 228, 128, 4, 0, 0, 4, - 2, 0, 9, 128, 2, 0, - 228, 128, 2, 0, 170, 160, - 2, 0, 255, 160, 37, 0, - 0, 2, 6, 0, 2, 128, - 2, 0, 0, 128, 37, 0, - 0, 2, 9, 0, 2, 128, - 2, 0, 255, 128, 5, 0, - 0, 3, 0, 0, 2, 128, - 6, 0, 85, 128, 9, 0, - 85, 128, 5, 0, 0, 3, - 2, 0, 1, 128, 1, 0, - 0, 128, 1, 0, 0, 128, - 6, 0, 0, 2, 2, 0, - 1, 128, 2, 0, 0, 128, - 5, 0, 0, 3, 0, 0, - 2, 128, 0, 0, 85, 128, - 2, 0, 0, 128, 88, 0, - 0, 4, 6, 0, 1, 128, - 1, 0, 0, 129, 1, 0, - 0, 160, 0, 0, 85, 128, - 2, 0, 0, 3, 2, 0, - 9, 128, 0, 0, 230, 128, - 4, 0, 0, 160, 2, 0, - 0, 3, 9, 0, 15, 128, - 0, 0, 238, 128, 4, 0, - 35, 160, 90, 0, 0, 4, - 0, 0, 2, 128, 2, 0, - 236, 128, 2, 0, 236, 128, - 3, 0, 170, 160, 7, 0, - 0, 2, 0, 0, 2, 128, - 0, 0, 85, 128, 6, 0, - 0, 2, 0, 0, 2, 128, - 0, 0, 85, 128, 4, 0, - 0, 4, 0, 0, 12, 128, - 0, 0, 85, 128, 2, 0, - 68, 160, 2, 0, 85, 160, - 19, 0, 0, 2, 0, 0, - 12, 128, 0, 0, 228, 128, - 4, 0, 0, 4, 0, 0, - 12, 128, 0, 0, 228, 128, - 2, 0, 170, 160, 2, 0, - 255, 160, 37, 0, 0, 2, - 11, 0, 2, 128, 0, 0, - 170, 128, 37, 0, 0, 2, - 13, 0, 2, 128, 0, 0, - 255, 128, 5, 0, 0, 3, - 0, 0, 4, 128, 11, 0, - 85, 128, 13, 0, 85, 128, - 5, 0, 0, 3, 0, 0, - 8, 128, 0, 0, 85, 128, - 0, 0, 85, 128, 6, 0, - 0, 2, 0, 0, 8, 128, - 0, 0, 255, 128, 5, 0, - 0, 3, 0, 0, 4, 128, - 0, 0, 255, 128, 0, 0, - 170, 128, 88, 0, 0, 4, - 6, 0, 8, 128, 0, 0, - 85, 129, 1, 0, 0, 160, - 0, 0, 170, 128, 90, 0, - 0, 4, 0, 0, 2, 128, - 9, 0, 228, 128, 9, 0, - 228, 128, 3, 0, 170, 160, - 90, 0, 0, 4, 0, 0, - 4, 128, 9, 0, 238, 128, - 9, 0, 238, 128, 3, 0, - 170, 160, 7, 0, 0, 2, - 0, 0, 4, 128, 0, 0, - 170, 128, 6, 0, 0, 2, - 0, 0, 4, 128, 0, 0, - 170, 128, 7, 0, 0, 2, - 0, 0, 2, 128, 0, 0, - 85, 128, 6, 0, 0, 2, - 0, 0, 2, 128, 0, 0, - 85, 128, 4, 0, 0, 4, - 2, 0, 9, 128, 0, 0, - 85, 128, 2, 0, 100, 160, - 2, 0, 85, 160, 19, 0, - 0, 2, 2, 0, 9, 128, - 2, 0, 228, 128, 4, 0, - 0, 4, 2, 0, 9, 128, - 2, 0, 228, 128, 2, 0, - 170, 160, 2, 0, 255, 160, - 37, 0, 0, 2, 9, 0, - 2, 128, 2, 0, 0, 128, - 37, 0, 0, 2, 11, 0, - 2, 128, 2, 0, 255, 128, - 5, 0, 0, 3, 0, 0, - 8, 128, 9, 0, 85, 128, - 11, 0, 85, 128, 5, 0, - 0, 3, 1, 0, 1, 128, - 0, 0, 85, 128, 0, 0, - 85, 128, 6, 0, 0, 2, - 1, 0, 1, 128, 1, 0, - 0, 128, 5, 0, 0, 3, - 0, 0, 8, 128, 0, 0, - 255, 128, 1, 0, 0, 128, - 88, 0, 0, 4, 6, 0, - 2, 128, 0, 0, 85, 129, - 1, 0, 0, 160, 0, 0, - 255, 128, 4, 0, 0, 4, - 0, 0, 10, 128, 0, 0, - 170, 128, 2, 0, 96, 160, - 2, 0, 85, 160, 19, 0, - 0, 2, 0, 0, 10, 128, - 0, 0, 228, 128, 4, 0, - 0, 4, 0, 0, 10, 128, - 0, 0, 228, 128, 2, 0, - 170, 160, 2, 0, 255, 160, - 37, 0, 0, 2, 9, 0, - 2, 128, 0, 0, 85, 128, - 37, 0, 0, 2, 11, 0, - 2, 128, 0, 0, 255, 128, - 5, 0, 0, 3, 0, 0, - 2, 128, 9, 0, 85, 128, - 11, 0, 85, 128, 5, 0, - 0, 3, 0, 0, 8, 128, - 0, 0, 170, 128, 0, 0, - 170, 128, 6, 0, 0, 2, - 0, 0, 8, 128, 0, 0, - 255, 128, 5, 0, 0, 3, - 0, 0, 2, 128, 0, 0, - 255, 128, 0, 0, 85, 128, - 88, 0, 0, 4, 6, 0, - 4, 128, 0, 0, 170, 129, - 1, 0, 0, 160, 0, 0, - 85, 128, 1, 0, 0, 2, - 4, 0, 1, 128, 7, 0, - 0, 128, 1, 0, 0, 2, - 4, 0, 4, 128, 3, 0, - 0, 128, 1, 0, 0, 2, - 4, 0, 8, 128, 5, 0, - 0, 128, 9, 0, 0, 3, - 4, 0, 1, 128, 6, 0, - 228, 128, 4, 0, 228, 128, - 1, 0, 0, 2, 9, 0, - 1, 128, 7, 0, 85, 128, - 1, 0, 0, 2, 3, 0, - 1, 128, 7, 0, 170, 128, - 1, 0, 0, 2, 9, 0, - 4, 128, 3, 0, 85, 128, - 1, 0, 0, 2, 9, 0, - 8, 128, 5, 0, 85, 128, - 1, 0, 0, 2, 3, 0, - 8, 128, 5, 0, 170, 128, - 1, 0, 0, 2, 9, 0, - 2, 128, 2, 0, 85, 128, - 1, 0, 0, 2, 3, 0, - 2, 128, 2, 0, 170, 128, - 9, 0, 0, 3, 4, 0, - 4, 128, 6, 0, 228, 128, - 3, 0, 228, 128, 9, 0, - 0, 3, 4, 0, 2, 128, - 6, 0, 228, 128, 9, 0, - 228, 128, 9, 0, 0, 3, - 0, 0, 2, 128, 6, 0, - 228, 128, 1, 0, 170, 160, - 2, 0, 0, 3, 0, 0, - 1, 128, 0, 0, 85, 128, - 0, 0, 0, 128, 6, 0, - 0, 2, 0, 0, 1, 128, - 0, 0, 0, 128, 2, 0, - 0, 3, 0, 0, 14, 128, - 1, 0, 228, 128, 4, 0, - 144, 128, 5, 0, 0, 3, - 1, 0, 7, 128, 0, 0, - 0, 128, 0, 0, 249, 128, - 10, 0, 0, 3, 2, 0, - 7, 128, 14, 0, 228, 128, - 10, 0, 228, 128, 11, 0, - 0, 3, 3, 0, 7, 128, - 10, 0, 228, 128, 14, 0, - 228, 128, 11, 0, 0, 3, - 4, 0, 7, 128, 12, 0, - 228, 128, 3, 0, 228, 128, - 10, 0, 0, 3, 3, 0, - 7, 128, 2, 0, 228, 128, - 12, 0, 228, 128, 10, 0, - 0, 3, 2, 0, 7, 128, - 3, 0, 228, 128, 8, 0, - 228, 128, 11, 0, 0, 3, - 3, 0, 7, 128, 8, 0, - 228, 128, 4, 0, 228, 128, - 11, 0, 0, 3, 4, 0, - 7, 128, 1, 0, 228, 128, - 2, 0, 228, 128, 10, 0, - 0, 3, 2, 0, 7, 128, - 3, 0, 228, 128, 4, 0, - 228, 128, 4, 0, 0, 4, - 0, 0, 7, 128, 0, 0, - 249, 128, 0, 0, 0, 129, - 2, 0, 228, 128, 4, 0, - 0, 4, 0, 8, 7, 128, - 0, 0, 228, 128, 5, 0, - 0, 160, 1, 0, 228, 128, - 1, 0, 0, 2, 0, 8, - 8, 128, 1, 0, 170, 160, - 255, 255, 0, 0 - }; - - - +}; #endif diff --git a/inc/d3dcaps.h b/inc/d3dcaps.h deleted file mode 100644 index 4f86f61..0000000 --- a/inc/d3dcaps.h +++ /dev/null @@ -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_ */ - - diff --git a/inc/dd.h b/inc/dd.h index fe175f7..fb4af12 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -5,26 +5,21 @@ #include #include "ddraw.h" -#ifdef __GNUC__ -#define __try -#define __except(x) if (0) -#endif typedef HRESULT(WINAPI* DIRECTDRAWCREATEPROC)(GUID FAR*, LPDIRECTDRAW FAR*, IUnknown FAR*); ULONG dd_AddRef(); ULONG dd_Release(); HRESULT dd_EnumDisplayModes(DWORD dwFlags, LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext, LPDDENUMMODESCALLBACK lpEnumModesCallback); +HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent); +HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFlags); +HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags); +HRESULT dd_RestoreDisplayMode(); HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps); HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc); HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq); -HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB); -HRESULT dd_RestoreDisplayMode(); -HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags); -HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFlags); -HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent); HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree); -HRESULT dd_TestCooperativeLevel(); +HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB); HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID riid); HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter); @@ -32,76 +27,41 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define FIX_CHILDS_DETECT 1 #define FIX_CHILDS_DETECT_PAINT 2 #define FIX_CHILDS_DETECT_HIDE 3 -#define FIX_CHILDS_DETECT_HIDE_NOSCALE 4 #define RESLIST_NORMAL 0 #define RESLIST_MINI 1 #define RESLIST_FULL 2 -#define FILTER_NEAREST 0 -#define FILTER_LINEAR 1 -#define FILTER_CUBIC 2 -#define FILTER_LANCZOS 3 - #define SDM_MODE_SET_BY_GAME 0x00000001l #define SDM_LEAVE_WINDOWED 0x00000002l #define SDM_LEAVE_FULLSCREEN 0x00000004l -#define LIMIT_AUTO 0 -#define LIMIT_TESTCOOP 1 -#define LIMIT_BLTFAST 2 -#define LIMIT_UNLOCK 3 -#define LIMIT_PEEKMESSAGE 4 - -#define CENTER_WINDOW_NEVER 0 -#define CENTER_WINDOW_AUTO 1 -#define CENTER_WINDOW_ALWAYS 2 - -#ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION -#define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002 -#endif - -#ifndef CREATE_WAITABLE_TIMER_MANUAL_RESET -#define CREATE_WAITABLE_TIMER_MANUAL_RESET 0x00000001 -#endif - -#ifndef GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT -#define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 0x00000002 -#endif - -#ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS -#define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 0x00000004 -#endif - -#if (_WIN32_WINNT < _WIN32_WINNT_WIN2K) -#define GdiTransparentBlt TransparentBlt -#endif - typedef struct SPEEDLIMITER { DWORD tick_length; LONGLONG tick_length_ns; HANDLE htimer; LARGE_INTEGER due_time; - BOOL dds_unlock_limiter_disabled; + BOOL use_blt_or_flip; } SPEEDLIMITER; struct IDirectDrawSurfaceImpl; -extern struct CNCDDRAW g_ddraw; +extern struct CNCDDRAW* g_ddraw; typedef struct CNCDDRAW { - LONG ref; + ULONG ref; DWORD width; DWORD height; DWORD bpp; - + BOOL windowed; + BOOL border; + BOOL boxing; DEVMODE mode; struct IDirectDrawSurfaceImpl* primary; char title[128]; - CRITICAL_SECTION cs; /* real export from system32\ddraw.dll */ @@ -111,9 +71,12 @@ typedef struct CNCDDRAW struct { + int maxfps; + int minfps; + DWORD minfps_tick_len; int width; int height; - int opengl_y_align; + int bpp; HDC hdc; int* tex; @@ -127,7 +90,6 @@ typedef struct CNCDDRAW LONG palette_updated; LONG surface_updated; LONG clear_screen; - LONG screen_updated; float scale_w; float scale_h; @@ -137,59 +99,73 @@ typedef struct CNCDDRAW struct { - float scale_x; - float scale_y; - float unscale_x; - float unscale_y; - int y_adjust; int x_adjust; RECT rc; } mouse; - DWORD(WINAPI* renderer)(void); + struct + { + int toggle_fullscreen; + int toggle_maximize; + int unlock_cursor1; + int unlock_cursor2; + int screenshot; + } hotkeys; + HWND hwnd; WNDPROC wndproc; struct { DWORD x; DWORD y; } cursor; + BOOL locked; + BOOL adjmouse; + BOOL devmode; + BOOL vsync; + BOOL vhack; int upscale_hack_width; int upscale_hack_height; BOOL isredalert; BOOL iscnc1; BOOL iskkndx; - BOOL isworms2; LONG upscale_hack_active; + DWORD(WINAPI* renderer)(void); + BOOL fullscreen; + BOOL maintas; + BOOL noactivateapp; + char shader[MAX_PATH]; + BOOL wine; HCURSOR old_cursor; int show_cursor_count; + BOOL accurate_timers; + BOOL resizable; + BOOL toggle_borderless; + BOOL toggle_upscaled; + BOOL nonexclusive; + BOOL fixpitch; + int fixchilds; + BOOL fixnotresponding; + BOOL locktopleft; + BOOL d3d9linear; + BOOL gdilinear; + int resolutions; + BOOL armadahack; + BOOL tshack; + int maxgameticks; BOOL alt_key_down; + BOOL releasealt; BOOL bnet_active; BOOL bnet_was_fullscreen; BOOL bnet_was_upscaled; RECT bnet_win_rect; + DEVMODE bnet_mode; POINT bnet_pos; void* last_freed_palette; /* Dungeon Keeper hack */ - void* last_freed_surface; /* Nox hack */ BOOL child_window_exists; BOOL got_child_windows; DWORD last_set_window_pos_tick; /* WINE hack */ - DWORD last_msg_pull_tick; + BOOL show_driver_warning; SPEEDLIMITER ticks_limiter; SPEEDLIMITER flip_limiter; - DWORD minfps_tick_len; - DWORD gui_thread_id; - BOOL show_driver_warning; - BOOL windowed_hack; - struct - { - HWND hwnd; - int x; - int y; - } textbox; /* Age Of Empires 2 textbox align */ - - struct - { - BOOL enabled; - } zoom; } CNCDDRAW; #endif diff --git a/inc/ddclipper.h b/inc/ddclipper.h index 3f23c93..355e446 100644 --- a/inc/ddclipper.h +++ b/inc/ddclipper.h @@ -7,12 +7,6 @@ #include "IDirectDrawClipper.h" -HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSiz); -HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd); -HRESULT ddc_IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged); -HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags); -HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd); -HRESULT ddc_SetClipRect(IDirectDrawClipperImpl* This, LPRECT lpRect); HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper, IUnknown FAR* pUnkOuter); #endif diff --git a/inc/ddpalette.h b/inc/ddpalette.h index cfd46ff..7d264db 100644 --- a/inc/ddpalette.h +++ b/inc/ddpalette.h @@ -7,8 +7,6 @@ #include "IDirectDrawPalette.h" #include "dd.h" -#define DDPCAPS_REFRESH_CHANGED_ONLY (1 << 31) - HRESULT ddp_GetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpEntries); HRESULT ddp_SetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries); HRESULT dd_CreatePalette(DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, IDirectDrawPaletteImpl** lpDDPalette, IUnknown FAR* unkOuter); diff --git a/inc/ddsurface.h b/inc/ddsurface.h index 80e37ae..eae85f7 100644 --- a/inc/ddsurface.h +++ b/inc/ddsurface.h @@ -7,8 +7,6 @@ #include "IDirectDrawSurface.h" #include "IDirectDraw.h" -#define DDBLT_NO_CLIP (1 << 31) - /* enables redraw via blt/unlock if there wasn't any flip for X ms */ #define FLIP_REDRAW_TIMEOUT 1000 / 10 @@ -33,10 +31,9 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKE HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpDDPalette); HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect); HRESULT dds_GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD); -HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags); void* dds_GetBuffer(IDirectDrawSurfaceImpl* This); HRESULT dd_CreateSurface(IDirectDrawImpl* This, LPDDSURFACEDESC lpDDSurfaceDesc, IDirectDrawSurfaceImpl** lpDDSurface, IUnknown FAR* unkOuter); - -extern LONG g_dds_gdi_handles; +void dds_RedrawBnet(IDirectDrawSurfaceImpl* This, BOOL obs_hack); +void dds_RedrawArmada(IDirectDrawSurfaceImpl* This); #endif diff --git a/inc/debug.h b/inc/debug.h index fa70c85..84a269a 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -3,49 +3,25 @@ #define WIN32_LEAN_AND_MEAN #include -#include -LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception); -LONG WINAPI dbg_vectored_exception_handler(EXCEPTION_POINTERS* exception); +int dbg_exception_handler(EXCEPTION_POINTERS* exception); void dbg_counter_start(); double dbg_counter_stop(); void dbg_debug_string(const char* format, ...); -void dbg_print_rect(char* info, LPRECT rect); void dbg_draw_frame_info_start(); void dbg_draw_frame_info_end(); -void dbg_printf(const char* fmt, ...); +int dbg_printf(const char* fmt, ...); void dbg_init(); -void dbg_dump_wnd_styles(DWORD style, DWORD exstyle); -void dbg_dump_swp_flags(DWORD flags); -void dbg_dump_ddp_flags(DWORD flags); -void dbg_dump_scl_flags(DWORD flags); -void dbg_dump_edm_flags(DWORD flags); -void dbg_dump_dds_flip_flags(DWORD flags); void dbg_dump_dds_blt_flags(DWORD flags); void dbg_dump_dds_blt_fx_flags(DWORD flags); void dbg_dump_dds_caps(DWORD caps); void dbg_dump_dds_flags(DWORD flags); void dbg_dump_dds_blt_fast_flags(DWORD flags); void dbg_dump_dds_lock_flags(DWORD flags); -void dbg_dump_di_scm_flags(DWORD flags); -void dbg_dump_hook_type(int idHook); -char* dbg_d3d9_hr_to_str(HRESULT hr); char* dbg_mes_to_str(int id); -void __cdecl dbg_invoke_watson(wchar_t const*, wchar_t const*, wchar_t const*, unsigned int, uintptr_t); extern double g_dbg_frame_time; extern DWORD g_dbg_frame_count; -extern LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; -extern PVOID g_dbg_exception_handle; - -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ //#define _DEBUG 1 diff --git a/inc/delay_imports.h b/inc/delay_imports.h deleted file mode 100644 index ba654ed..0000000 --- a/inc/delay_imports.h +++ /dev/null @@ -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 diff --git a/inc/directinput.h b/inc/directinput.h index cc0f25a..0bd822c 100644 --- a/inc/directinput.h +++ b/inc/directinput.h @@ -14,8 +14,6 @@ typedef HRESULT(WINAPI* DIDSETCOOPERATIVELEVELPROC)(IDirectInputDeviceA*, HWND, typedef HRESULT(WINAPI* DIDGETDEVICEDATAPROC)(IDirectInputDeviceA*, DWORD, LPDIDEVICEOBJECTDATA, LPDWORD, DWORD); typedef HRESULT(WINAPI* DIDGETDEVICESTATEPROC)(IDirectInputDeviceA*, DWORD, LPVOID); -extern BOOL g_dinput_hook_active; - extern DIRECTINPUTCREATEAPROC real_DirectInputCreateA; extern DIRECTINPUTCREATEWPROC real_DirectInputCreateW; extern DIRECTINPUTCREATEEXPROC real_DirectInputCreateEx; @@ -26,7 +24,4 @@ HRESULT WINAPI fake_DirectInputCreateW(HINSTANCE hinst, DWORD dwVersion, LPDIREC HRESULT WINAPI fake_DirectInputCreateEx(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPDIRECTINPUT7A* ppvOut, LPUNKNOWN punkOuter); HRESULT WINAPI fake_DirectInput8Create(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPDIRECTINPUT8* ppvOut, LPUNKNOWN punkOuter); -void dinput_hook_init(); -void dinput_hook_exit(); - #endif diff --git a/inc/dllmain.h b/inc/dllmain.h index f7e028b..f23fef6 100644 --- a/inc/dllmain.h +++ b/inc/dllmain.h @@ -16,21 +16,15 @@ typedef enum PROCESS_DPI_AWARENESS { PROCESS_PER_MONITOR_DPI_AWARE = 2 } PROCESS_DPI_AWARENESS; -#ifndef _DPI_AWARENESS_CONTEXTS_ DECLARE_HANDLE(DPI_AWARENESS_CONTEXT); #define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1) #define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ((DPI_AWARENESS_CONTEXT)-2) #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ((DPI_AWARENESS_CONTEXT)-3) #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT)-4) #define DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED ((DPI_AWARENESS_CONTEXT)-5) -#endif typedef HRESULT(__stdcall* SETPROCESSDPIAWERENESSPROC)(PROCESS_DPI_AWARENESS); typedef BOOL(__stdcall* SETPROCESSDPIAWAREPROC)(); typedef BOOL(__stdcall* SETPROCESSDPIAWARENESSCONTEXTPROC)(DPI_AWARENESS_CONTEXT); -#if (_WIN32_WINNT < _WIN32_WINNT_WINXP) -#define SetThreadExecutionState(a) -#endif - #endif diff --git a/inc/fps_limiter.h b/inc/fps_limiter.h index ec0f7bc..5c8049f 100644 --- a/inc/fps_limiter.h +++ b/inc/fps_limiter.h @@ -48,14 +48,12 @@ typedef struct FPSLIMITER D3DKMTCLOSEADAPTERPROC D3DKMTCloseAdapter; BOOL got_adapter; BOOL initialized; - CRITICAL_SECTION cs; - BOOL cs_initialized; } FPSLIMITER; extern FPSLIMITER g_fpsl; void fpsl_init(); -BOOL fpsl_wait_for_vblank(); +BOOL fpsl_wait_for_vblank(BOOL open_adapter); BOOL fpsl_dwm_flush(); BOOL fpsl_dwm_is_enabled(); void fpsl_frame_start(); diff --git a/inc/hook.h b/inc/hook.h index 23de636..5a08f6b 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -1,24 +1,15 @@ #ifndef HOOK_H #define HOOK_H +#define WIN32_LEAN_AND_MEAN #include -#include -#define HOOK_SKIP_2 0x00000001l -#define HOOK_LOCAL_ONLY 0x00000002l -#define HOOK_SYSTEM_ONLY 0x00000004l +#define SKIP_HOOK2 0x00000001l +#define SKIP_HOOK3 0x00000002l -typedef struct HOOKLISTDATA { - char function_name[32]; - PROC new_function; - PROC* function; - DWORD flags; - PROC org_function; - HMODULE mod; -} HOOKLISTDATA; - -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[39]; } HOOKLIST; +typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[25]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -37,57 +28,22 @@ typedef BOOL(WINAPI* SETWINDOWPOSPROC)(HWND, HWND, int, int, int, int, UINT); typedef BOOL(WINAPI* MOVEWINDOWPROC)(HWND, int, int, int, int, BOOL); typedef LRESULT(WINAPI* SENDMESSAGEAPROC)(HWND, UINT, WPARAM, LPARAM); typedef LONG(WINAPI* SETWINDOWLONGAPROC)(HWND, int, LONG); -typedef LONG(WINAPI* SETWINDOWLONGWPROC)(HWND, int, LONG); typedef LONG(WINAPI* GETWINDOWLONGAPROC)(HWND, int); typedef BOOL(WINAPI* ENABLEWINDOWPROC)(HWND, BOOL); typedef HWND(WINAPI* CREATEWINDOWEXAPROC)(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID); typedef BOOL(WINAPI* DESTROYWINDOWPROC)(HWND); typedef int (WINAPI* MAPWINDOWPOINTSPROC)(HWND, HWND, LPPOINT, UINT); typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int); -typedef HWND(WINAPI* GETTOPWINDOWPROC)(HWND); -typedef HWND(WINAPI* GETFOREGROUNDWINDOWPROC)(); -typedef BOOL(WINAPI* STRETCHBLTPROC)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); -typedef BOOL(WINAPI* BITBLTPROC)(HDC, int, int, int, int, HDC, int, int, DWORD); - -typedef int (WINAPI* SETDIBITSTODEVICEPROC)( - HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); - -typedef int (WINAPI* STRETCHDIBITSPROC)( - HDC, int, int, int, int, int, int, int, int, const VOID*, const BITMAPINFO*, UINT, DWORD); - -typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND); +typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND hWnd); typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); -typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT); -typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT); -typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*); -typedef BOOL(WINAPI* SETWINDOWPLACEMENTPROC)(HWND, const WINDOWPLACEMENT*); -typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*); -typedef LRESULT(WINAPI* DEFWINDOWPROCAPROC)(HWND, UINT, WPARAM, LPARAM); -typedef HWND(WINAPI* SETPARENTPROC)(HWND, HWND); -typedef HDC (WINAPI* BEGINPAINTPROC)(HWND, LPPAINTSTRUCT); -typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); -typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); - typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*); typedef HFONT(WINAPI* CREATEFONTAPROC)(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); -typedef UINT(WINAPI* GETSYSTEMPALETTEENTRIESPROC)(HDC, UINT, UINT, LPPALETTEENTRY); -typedef HPALETTE(WINAPI* SELECTPALETTEPROC)(HDC, HPALETTE, BOOL); -typedef UINT (WINAPI* REALIZEPALETTEPROC)(HDC); - typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR); typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD); typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD); -typedef FARPROC(WINAPI* GETPROCADDRESSPROC)(HMODULE, LPCSTR); -typedef BOOL(WINAPI* GETDISKFREESPACEAPROC)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); -typedef DWORD(WINAPI* GETVERSIONPROC)(void); -typedef BOOL(WINAPI* GETVERSIONEXAPROC)(LPOSVERSIONINFOA); typedef HRESULT(WINAPI* COCREATEINSTANCEPROC)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*); -typedef MCIERROR(WINAPI* MCISENDCOMMANDAPROC)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR); -typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER); - -typedef PGETFRAME (WINAPI* AVISTREAMGETFRAMEOPENPROC)(PAVISTREAM, LPBITMAPINFOHEADER); extern GETCURSORPOSPROC real_GetCursorPos; extern CLIPCURSORPROC real_ClipCursor; @@ -106,57 +62,32 @@ extern SETWINDOWPOSPROC real_SetWindowPos; extern MOVEWINDOWPROC real_MoveWindow; extern SENDMESSAGEAPROC real_SendMessageA; extern SETWINDOWLONGAPROC real_SetWindowLongA; -extern SETWINDOWLONGWPROC real_SetWindowLongW; extern GETWINDOWLONGAPROC real_GetWindowLongA; extern ENABLEWINDOWPROC real_EnableWindow; extern CREATEWINDOWEXAPROC real_CreateWindowExA; extern DESTROYWINDOWPROC real_DestroyWindow; extern MAPWINDOWPOINTSPROC real_MapWindowPoints; extern SHOWWINDOWPROC real_ShowWindow; -extern GETTOPWINDOWPROC real_GetTopWindow; -extern GETFOREGROUNDWINDOWPROC real_GetForegroundWindow; -extern STRETCHBLTPROC real_StretchBlt; -extern BITBLTPROC real_BitBlt; -extern SETDIBITSTODEVICEPROC real_SetDIBitsToDevice; -extern STRETCHDIBITSPROC real_StretchDIBits; extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; -extern PEEKMESSAGEAPROC real_PeekMessageA; -extern GETMESSAGEAPROC real_GetMessageA; -extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; -extern SETWINDOWPLACEMENTPROC real_SetWindowPlacement; -extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; -extern DEFWINDOWPROCAPROC real_DefWindowProcA; -extern SETPARENTPROC real_SetParent; -extern BEGINPAINTPROC real_BeginPaint; -extern GETKEYSTATEPROC real_GetKeyState; -extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETDEVICECAPSPROC real_GetDeviceCaps; extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA; extern CREATEFONTAPROC real_CreateFontA; -extern GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries; -extern SELECTPALETTEPROC real_SelectPalette; -extern REALIZEPALETTEPROC real_RealizePalette; extern LOADLIBRARYAPROC real_LoadLibraryA; extern LOADLIBRARYWPROC real_LoadLibraryW; extern LOADLIBRARYEXAPROC real_LoadLibraryExA; extern LOADLIBRARYEXWPROC real_LoadLibraryExW; -extern GETPROCADDRESSPROC real_GetProcAddress; -extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA; -extern GETVERSIONPROC real_GetVersion; -extern GETVERSIONEXAPROC real_GetVersionExA; extern COCREATEINSTANCEPROC real_CoCreateInstance; -extern MCISENDCOMMANDAPROC real_mciSendCommandA; -extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; -extern AVISTREAMGETFRAMEOPENPROC real_AVIStreamGetFrameOpen; +extern int g_hook_method; +extern BOOL g_hook_dinput; extern BOOL g_hook_active; -extern HOOKLIST g_hook_hooklist[]; void hook_init(); +void hook_early_init(); void hook_exit(); void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function_name, PROC new_function); -void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local); +void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks); void hook_create(HOOKLIST* hooks, BOOL initial_hook); void hook_revert(HOOKLIST* hooks); diff --git a/inc/indeo.h b/inc/indeo.h deleted file mode 100644 index a83e007..0000000 --- a/inc/indeo.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef INDEO_H -#define INDEO_H - -void indeo_enable(); -void indeo_disable(); - -#endif diff --git a/inc/ini.h b/inc/ini.h deleted file mode 100644 index e3f073c..0000000 --- a/inc/ini.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef INI_H -#define INI_H - -typedef struct -{ - char filename[MAX_PATH]; - - struct { - unsigned long hash; - char* data; - }*sections; -} INIFILE; - -void ini_create(INIFILE* ini, char* filename); -BOOL ini_section_exists(INIFILE* ini, LPCSTR section); -DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR buf, DWORD size); -BOOL ini_get_bool(INIFILE* ini, LPCSTR section, LPCSTR key, BOOL def); -int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def); -float ini_get_float(INIFILE* ini, LPCSTR section, LPCSTR key, float def); -void ini_free(INIFILE* ini); - -#endif diff --git a/inc/keyboard.h b/inc/keyboard.h deleted file mode 100644 index 8962198..0000000 --- a/inc/keyboard.h +++ /dev/null @@ -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 diff --git a/inc/mouse.h b/inc/mouse.h index 1181ac2..4457c08 100644 --- a/inc/mouse.h +++ b/inc/mouse.h @@ -5,7 +5,6 @@ void mouse_lock(); void mouse_unlock(); LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam); -extern BOOL g_mouse_locked; extern HHOOK g_mouse_hook; extern HOOKPROC g_mouse_proc; diff --git a/inc/opengl_utils.h b/inc/opengl_utils.h index d84dd20..ccccb75 100644 --- a/inc/opengl_utils.h +++ b/inc/opengl_utils.h @@ -36,7 +36,7 @@ extern PFNGLVERTEX2FPROC glVertex2f; BOOL oglu_load_dll(); void oglu_init(); BOOL oglu_ext_exists(char* ext, HDC hdc); -GLuint oglu_build_program(GLchar* vert_source, GLchar* frag_source, BOOL core_profile); +GLuint oglu_build_program(const GLchar* vert_source, const GLchar* frag_source); GLuint oglu_build_program_from_file(const char* file_path, BOOL core_profile); extern PFNGLVIEWPORTPROC glViewport; @@ -108,13 +108,10 @@ extern PFNGLDRAWBUFFERSPROC glDrawBuffers; extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; extern PFNGLTEXBUFFERPROC glTexBuffer; -extern PFNGLGETINTEGERVPROC glGetIntegerv; -extern PFNGLGETSTRINGIPROC glGetStringi; extern HMODULE g_oglu_hmodule; extern BOOL g_oglu_got_version2; extern BOOL g_oglu_got_version3; extern char g_oglu_version[]; -extern char g_oglu_version_long[]; #endif diff --git a/inc/openglshader.h b/inc/openglshader.h index 33f94fd..58bea87 100644 --- a/inc/openglshader.h +++ b/inc/openglshader.h @@ -3,7 +3,7 @@ /* OpenGL 2.0 */ -static char PASSTHROUGH_VERT_SHADER_110[] = +const char PASSTHROUGH_VERT_SHADER_110[] = "#version 110\n" "varying vec2 TEX0; \n" "\n" @@ -13,34 +13,33 @@ static char PASSTHROUGH_VERT_SHADER_110[] = " TEX0 = gl_MultiTexCoord0.xy; \n" "}\n"; - -static char PALETTE_FRAG_SHADER_110[] = +const char PALETTE_FRAG_SHADER_110[] = "#version 110\n" - "uniform sampler2D Texture; \n" - "uniform sampler2D PaletteTexture; \n" + "uniform sampler2D SurfaceTex; \n" + "uniform sampler2D PaletteTex; \n" "varying vec2 TEX0; \n" "\n" "void main()\n" "{\n" - " vec4 pIndex = texture2D(Texture, TEX0); \n" - " gl_FragColor = texture2D(PaletteTexture, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0)); \n" + " vec4 pIndex = texture2D(SurfaceTex, TEX0); \n" + " gl_FragColor = texture2D(PaletteTex, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0)); \n" "}\n"; -static char PASSTHROUGH_FRAG_SHADER_110[] = +const char PASSTHROUGH_FRAG_SHADER_110[] = "#version 110\n" - "uniform sampler2D Texture; \n" + "uniform sampler2D SurfaceTex; \n" "varying vec2 TEX0; \n" "\n" "void main()\n" "{\n" - " vec4 texel = texture2D(Texture, TEX0); \n" + " vec4 texel = texture2D(SurfaceTex, TEX0); \n" " gl_FragColor = texel; \n" "}\n"; /* OpenGL 3.0 */ -static char PASSTHROUGH_VERT_SHADER[] = +const char PASSTHROUGH_VERT_SHADER[] = "#version 130\n" "in vec4 VertexCoord;\n" "in vec4 COLOR;\n" @@ -57,538 +56,75 @@ static char PASSTHROUGH_VERT_SHADER[] = "}\n"; -static char PALETTE_FRAG_SHADER[] = +const char PALETTE_FRAG_SHADER[] = "#version 130\n" "out vec4 FragColor;\n" - "uniform sampler2D Texture;\n" - "uniform sampler2D PaletteTexture;\n" + "uniform sampler2D SurfaceTex;\n" + "uniform sampler2D PaletteTex;\n" "in vec4 TEX0;\n" "\n" "void main()\n" "{\n" - " vec4 pIndex = texture(Texture, TEX0.xy);\n" - " FragColor = texture(PaletteTexture, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0));\n" + " vec4 pIndex = texture(SurfaceTex, TEX0.xy);\n" + " FragColor = texture(PaletteTex, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0));\n" "}\n"; -static char PASSTHROUGH_FRAG_SHADER[] = +const char PASSTHROUGH_FRAG_SHADER[] = "#version 130\n" "out vec4 FragColor;\n" - "uniform sampler2D Texture;\n" + "uniform sampler2D SurfaceTex;\n" "in vec4 TEX0;\n" "\n" "void main()\n" "{\n" - " vec4 texel = texture(Texture, TEX0.xy);\n" + " vec4 texel = texture(SurfaceTex, TEX0.xy);\n" " FragColor = texel;\n" "}\n"; +/* OpenGL 3.2 (Core Profile) */ -static char RGB555_FRAG_SHADER[] = - "#version 130\n" - "out vec4 FragColor;\n" - "uniform sampler2D Texture;\n" - "in vec4 TEX0;\n" - "\n" - "void main()\n" - "{\n" - " vec4 texel = texture(Texture, TEX0.xy);\n" - " int bytes = int(texel.r * 255.0 + 0.5) | int(texel.g * 255.0 + 0.5) << 8;\n" - " vec4 color;\n" - " color.r = float((bytes >> 10) & 31) / 31.0;\n" - " color.g = float((bytes >> 5) & 31) / 31.0;\n" - " color.b = float(bytes & 31) / 31.0;\n" - " color.a = 1.0;\n" - " FragColor = color;\n" - "}\n"; - - -/* -// The following code is licensed under the MIT license: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae -// Ported from code: https://gist.github.com/TheRealMJP/c83b8c0f46b63f3a88a5986f4fa982b1 -// Samples a texture with Catmull-Rom filtering, using 9 texture fetches instead of 16. -// See http://vec3.ca/bicubic-filtering-in-fewer-taps/ for more details -// Modified to use 5 texture fetches -*/ - -static char CATMULL_ROM_FRAG_SHADER[] = - "#version 130\n" - "out vec4 FragColor;\n" - "uniform int FrameDirection;\n" - "uniform int FrameCount;\n" - "uniform vec2 OutputSize;\n" - "uniform vec2 TextureSize;\n" - "uniform vec2 InputSize;\n" - "uniform sampler2D Texture;\n" - "in vec4 TEX0;\n" - "\n" - "#define SourceSize vec4(TextureSize, 1.0 / TextureSize)\n" - "\n" - "void main()\n" - "{\n" - " vec2 samplePos = TEX0.xy * SourceSize.xy;\n" - " vec2 texPos1 = floor(samplePos - 0.5) + 0.5;\n" - "\n" - " vec2 f = samplePos - texPos1;\n" - "\n" - " vec2 w0 = f * (-0.5 + f * (1.0 - 0.5 * f));\n" - " vec2 w1 = 1.0 + f * f * (-2.5 + 1.5 * f);\n" - " vec2 w2 = f * (0.5 + f * (2.0 - 1.5 * f));\n" - " vec2 w3 = f * f * (-0.5 + 0.5 * f);\n" - "\n" - " vec2 w12 = w1 + w2;\n" - " vec2 offset12 = w2 / (w1 + w2);\n" - "\n" - " vec2 texPos0 = texPos1 - 1.;\n" - " vec2 texPos3 = texPos1 + 2.;\n" - " vec2 texPos12 = texPos1 + offset12;\n" - "\n" - " texPos0 *= SourceSize.zw;\n" - " texPos3 *= SourceSize.zw;\n" - " texPos12 *= SourceSize.zw;\n" - "\n" - " float wtm = w12.x * w0.y;\n" - " float wml = w0.x * w12.y;\n" - " float wmm = w12.x * w12.y;\n" - " float wmr = w3.x * w12.y;\n" - " float wbm = w12.x * w3.y;\n" - "\n" - " vec3 result = vec3(0.0f);\n" - "\n" - " result += texture(Texture, vec2(texPos12.x, texPos0.y)).rgb * wtm;\n" - " result += texture(Texture, vec2(texPos0.x, texPos12.y)).rgb * wml;\n" - " result += texture(Texture, vec2(texPos12.x, texPos12.y)).rgb * wmm;\n" - " result += texture(Texture, vec2(texPos3.x, texPos12.y)).rgb * wmr;\n" - " result += texture(Texture, vec2(texPos12.x, texPos3.y)).rgb * wbm;\n" - "\n" - " FragColor = vec4(result * (1. / (wtm + wml + wmm + wmr + wbm)), 1.0);\n" - "}\n"; - - -/* -// The following code is licensed under the MIT license: -// Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader -// Copyright (C) 2011-2016 Hyllian/Jararaca - sergiogdb@gmail.com -// https://github.com/libretro/glsl-shaders/blob/09e2942efbab2f51b60ff0b93b7761b0b0570910/windowed/shaders/lanczos2-sharp.glsl -*/ - -static char LANCZOS2_FRAG_SHADER[] = - "#version 130\n" - "#define JINC2_WINDOW_SINC 0.5\n" - "#define JINC2_SINC 1.0\n" - "#define JINC2_AR_STRENGTH 0.8\n" - "\n" - "out vec4 FragColor;\n" - "uniform int FrameDirection;\n" - "uniform int FrameCount;\n" - "uniform vec2 OutputSize;\n" - "uniform vec2 TextureSize;\n" - "uniform vec2 InputSize;\n" - "uniform sampler2D Texture;\n" - "in vec4 TEX0;\n" - "\n" - "const float pi = 3.1415926535897932384626433832795;\n" - "const float wa = JINC2_WINDOW_SINC*pi;\n" - "const float wb = JINC2_SINC*pi;\n" - "\n" - "// Calculates the distance between two points\n" - "float d(vec2 pt1, vec2 pt2)\n" - "{\n" - " vec2 v = pt2 - pt1;\n" - " return sqrt(dot(v,v));\n" - "}\n" - "\n" - "vec3 min4(vec3 a, vec3 b, vec3 c, vec3 d)\n" - "{\n" - " return min(a, min(b, min(c, d)));\n" - "}\n" - "\n" - "vec3 max4(vec3 a, vec3 b, vec3 c, vec3 d)\n" - "{\n" - " return max(a, max(b, max(c, d)));\n" - "}\n" - "\n" - "vec4 resampler(vec4 x)\n" - "{\n" - " vec4 res;\n" - "\n" - " res.x = (x.x==0.0) ? wa*wb : sin(x.x*wa)*sin(x.x*wb)/(x.x*x.x);\n" - " res.y = (x.y==0.0) ? wa*wb : sin(x.y*wa)*sin(x.y*wb)/(x.y*x.y);\n" - " res.z = (x.z==0.0) ? wa*wb : sin(x.z*wa)*sin(x.z*wb)/(x.z*x.z);\n" - " res.w = (x.w==0.0) ? wa*wb : sin(x.w*wa)*sin(x.w*wb)/(x.w*x.w);\n" - "\n" - " return res;\n" - "}\n" - "\n" - "void main()\n" - "{\n" - " vec3 color;\n" - " vec4 weights[4];\n" - "\n" - " vec2 dx = vec2(1.0, 0.0);\n" - " vec2 dy = vec2(0.0, 1.0);\n" - "\n" - " vec2 pc = TEX0.xy*TextureSize;\n" - "\n" - " vec2 tc = (floor(pc-vec2(0.5,0.5))+vec2(0.5,0.5));\n" - " \n" - " weights[0] = resampler(vec4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy)));\n" - " weights[1] = resampler(vec4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx )));\n" - " weights[2] = resampler(vec4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy)));\n" - " weights[3] = resampler(vec4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy)));\n" - "\n" - " dx = dx/TextureSize;\n" - " dy = dy/TextureSize;\n" - " tc = tc/TextureSize;\n" - "\n" - " vec3 c00 = texture(Texture, tc -dx -dy).xyz;\n" - " vec3 c10 = texture(Texture, tc -dy).xyz;\n" - " vec3 c20 = texture(Texture, tc +dx -dy).xyz;\n" - " vec3 c30 = texture(Texture, tc+2.0*dx -dy).xyz;\n" - " vec3 c01 = texture(Texture, tc -dx ).xyz;\n" - " vec3 c11 = texture(Texture, tc ).xyz;\n" - " vec3 c21 = texture(Texture, tc +dx ).xyz;\n" - " vec3 c31 = texture(Texture, tc+2.0*dx ).xyz;\n" - " vec3 c02 = texture(Texture, tc -dx +dy).xyz;\n" - " vec3 c12 = texture(Texture, tc +dy).xyz;\n" - " vec3 c22 = texture(Texture, tc +dx +dy).xyz;\n" - " vec3 c32 = texture(Texture, tc+2.0*dx +dy).xyz;\n" - " vec3 c03 = texture(Texture, tc -dx+2.0*dy).xyz;\n" - " vec3 c13 = texture(Texture, tc +2.0*dy).xyz;\n" - " vec3 c23 = texture(Texture, tc +dx+2.0*dy).xyz;\n" - " vec3 c33 = texture(Texture, tc+2.0*dx+2.0*dy).xyz;\n" - " \n" - " // Get min/max samples\n" - " vec3 min_sample = min4(c11, c21, c12, c22);\n" - " vec3 max_sample = max4(c11, c21, c12, c22);\n" - " \n" - " color = vec3(dot(weights[0], vec4(c00.x, c10.x, c20.x, c30.x)), dot(weights[0], vec4(c00.y, c10.y, c20.y, c30.y)), dot(weights[0], vec4(c00.z, c10.z, c20.z, c30.z)));\n" - " color+= vec3(dot(weights[1], vec4(c01.x, c11.x, c21.x, c31.x)), dot(weights[1], vec4(c01.y, c11.y, c21.y, c31.y)), dot(weights[1], vec4(c01.z, c11.z, c21.z, c31.z)));\n" - " color+= vec3(dot(weights[2], vec4(c02.x, c12.x, c22.x, c32.x)), dot(weights[2], vec4(c02.y, c12.y, c22.y, c32.y)), dot(weights[2], vec4(c02.z, c12.z, c22.z, c32.z)));\n" - " color+= vec3(dot(weights[3], vec4(c03.x, c13.x, c23.x, c33.x)), dot(weights[3], vec4(c03.y, c13.y, c23.y, c33.y)), dot(weights[3], vec4(c03.z, c13.z, c23.z, c33.z)));\n" - " color = color/(dot(weights[0], vec4(1,1,1,1)) + dot(weights[1], vec4(1,1,1,1)) + dot(weights[2], vec4(1,1,1,1)) + dot(weights[3], vec4(1,1,1,1)));\n" - "\n" - " // Anti-ringing\n" - " vec3 aux = color;\n" - " color = clamp(color, min_sample, max_sample);\n" - " color = mix(aux, color, JINC2_AR_STRENGTH);\n" - "\n" - " // final sum and weight normalization\n" - " FragColor.xyz = color;\n" - "}\n"; - -/* -// The following code is licensed under the MIT license: -// Hyllian's xBR-lv2 Shader -// Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com -// https://github.com/libretro/glsl-shaders/blob/09e2942efbab2f51b60ff0b93b7761b0b0570910/xbr/shaders/xbr-lv2.glsl -*/ - -static char XBR_LV2_VERT_SHADER[] = - "#version 130\n" - "\n" - "#define texCoord TEX0\n" - "#define t1 TEX1\n" - "#define t2 TEX2\n" - "#define t3 TEX3\n" - "#define t4 TEX4\n" - "#define t5 TEX5\n" - "#define t6 TEX6\n" - "#define t7 TEX7\n" - "\n" +const char PASSTHROUGH_VERT_SHADER_CORE[] = + "#version 150\n" "in vec4 VertexCoord;\n" - "in vec4 Color;\n" - "in vec2 TexCoord;\n" - "\n" - "out vec4 color;\n" - "out vec2 texCoord;\n" - "out vec4 t1;\n" - "out vec4 t2;\n" - "out vec4 t3;\n" - "out vec4 t4;\n" - "out vec4 t5;\n" - "out vec4 t6;\n" - "out vec4 t7;\n" - "\n" + "in vec4 COLOR;\n" + "in vec4 TexCoord;\n" + "out vec4 COL0;\n" + "out vec4 TEX0;\n" "uniform mat4 MVPMatrix;\n" - "uniform int FrameDirection;\n" - "uniform int FrameCount;\n" - "uniform vec2 OutputSize;\n" - "uniform vec2 TextureSize;\n" - "uniform vec2 InputSize;\n" "\n" "void main()\n" "{\n" " gl_Position = MVPMatrix * VertexCoord;\n" - " color = Color;\n" - "\n" - " float dx = (1.0/TextureSize.x);\n" - " float dy = (1.0/TextureSize.y);\n" - "\n" - " texCoord = TexCoord;\n" - " texCoord.x *= 1.00000001;\n" - " t1 = TexCoord.xxxy + vec4( -dx, 0, dx,-2.0*dy); // A1 B1 C1\n" - " t2 = TexCoord.xxxy + vec4( -dx, 0, dx, -dy); // A B C\n" - " t3 = TexCoord.xxxy + vec4( -dx, 0, dx, 0); // D E F\n" - " t4 = TexCoord.xxxy + vec4( -dx, 0, dx, dy); // G H I\n" - " t5 = TexCoord.xxxy + vec4( -dx, 0, dx, 2.0*dy); // G5 H5 I5\n" - " t6 = TexCoord.xyyy + vec4(-2.0*dx,-dy, 0, dy); // A0 D0 G0\n" - " t7 = TexCoord.xyyy + vec4( 2.0*dx,-dy, 0, dy); // C4 F4 I4\n" + " COL0 = COLOR;\n" + " TEX0.xy = TexCoord.xy;\n" "}\n"; -static char XBR_LV2_FRAG_SHADER[] = - "#version 130\n" - "\n" - "//#pragma parameter XBR_SCALE \"xBR Scale\" 3.0 1.0 5.0 1.0\n" - "#pragma parameter XBR_Y_WEIGHT \"Y Weight\" 48.0 0.0 100.0 1.0\n" - "#pragma parameter XBR_EQ_THRESHOLD \"Eq Threshold\" 15.0 0.0 50.0 1.0\n" - "#pragma parameter XBR_LV1_COEFFICIENT \"Lv1 Coefficient\" 0.5 0.0 30.0 0.5\n" - "#pragma parameter XBR_LV2_COEFFICIENT \"Lv2 Coefficient\" 2.0 1.0 3.0 0.1\n" - "#pragma parameter small_details \"Preserve Small Details\" 0.0 0.0 1.0 1.0\n" - "\n" - "#define mul(a,b) (b*a)\n" - "\n" - "// Uncomment just one of the three params below to choose the corner detection\n" - "//#define CORNER_A\n" - "//#define CORNER_B\n" - "#define CORNER_C\n" - "//#define CORNER_D\n" - "\n" - "#ifndef CORNER_A\n" - " #define SMOOTH_TIPS\n" - "#endif\n" - "\n" - "#define XBR_SCALE 3.0\n" - "\n" - "#define lv2_cf XBR_LV2_COEFFICIENT\n" - "\n" - "#define texCoord TEX0\n" - "#define t1 TEX1\n" - "#define t2 TEX2\n" - "#define t3 TEX3\n" - "#define t4 TEX4\n" - "#define t5 TEX5\n" - "#define t6 TEX6\n" - "#define t7 TEX7\n" - "\n" + +const char PALETTE_FRAG_SHADER_CORE[] = + "#version 150\n" "out vec4 FragColor;\n" - "uniform int FrameDirection;\n" - "uniform int FrameCount;\n" - "uniform vec2 OutputSize;\n" - "uniform vec2 TextureSize;\n" - "uniform vec2 InputSize;\n" - "uniform sampler2D Texture;\n" - "in vec2 texCoord;\n" - "in vec4 t1;\n" - "in vec4 t2;\n" - "in vec4 t3;\n" - "in vec4 t4;\n" - "in vec4 t5;\n" - "in vec4 t6;\n" - "in vec4 t7;\n" - "\n" - "#ifdef PARAMETER_UNIFORM\n" - "uniform float XBR_Y_WEIGHT;\n" - "uniform float XBR_EQ_THRESHOLD;\n" - "uniform float XBR_LV1_COEFFICIENT;\n" - "uniform float XBR_LV2_COEFFICIENT;\n" - "uniform float small_details;\n" - "#else\n" - "#define XBR_Y_WEIGHT 48.0\n" - "#define XBR_EQ_THRESHOLD 15.0\n" - "#define XBR_LV1_COEFFICIENT 0.5\n" - "#define XBR_LV2_COEFFICIENT 2.0\n" - "#define small_details 0.0\n" - "#endif\n" - "// END PARAMETERS //\n" - "\n" - "const float coef = 2.0;\n" - "const vec3 rgbw = vec3(14.352, 28.176, 5.472);\n" - "const vec4 eq_threshold = vec4(15.0, 15.0, 15.0, 15.0);\n" - "\n" - "vec4 delta = vec4(1.0/XBR_SCALE, 1.0/XBR_SCALE, 1.0/XBR_SCALE, 1.0/XBR_SCALE);\n" - "vec4 delta_l = vec4(0.5/XBR_SCALE, 1.0/XBR_SCALE, 0.5/XBR_SCALE, 1.0/XBR_SCALE);\n" - "vec4 delta_u = delta_l.yxwz;\n" - "\n" - "const vec4 Ao = vec4( 1.0, -1.0, -1.0, 1.0 );\n" - "const vec4 Bo = vec4( 1.0, 1.0, -1.0,-1.0 );\n" - "const vec4 Co = vec4( 1.5, 0.5, -0.5, 0.5 );\n" - "const vec4 Ax = vec4( 1.0, -1.0, -1.0, 1.0 );\n" - "const vec4 Bx = vec4( 0.5, 2.0, -0.5,-2.0 );\n" - "const vec4 Cx = vec4( 1.0, 1.0, -0.5, 0.0 );\n" - "const vec4 Ay = vec4( 1.0, -1.0, -1.0, 1.0 );\n" - "const vec4 By = vec4( 2.0, 0.5, -2.0,-0.5 );\n" - "const vec4 Cy = vec4( 2.0, 0.0, -1.0, 0.5 );\n" - "const vec4 Ci = vec4(0.25, 0.25, 0.25, 0.25);\n" - "\n" - "const vec3 Y = vec3(0.2126, 0.7152, 0.0722);\n" - "\n" - "// Difference between vector components.\n" - "vec4 df(vec4 A, vec4 B)\n" - "{\n" - " return vec4(abs(A-B));\n" - "}\n" - "\n" - "// Compare two vectors and return their components are different.\n" - "vec4 diff(vec4 A, vec4 B)\n" - "{\n" - " return vec4(notEqual(A, B));\n" - "}\n" - "\n" - "// Determine if two vector components are equal based on a threshold.\n" - "vec4 eq(vec4 A, vec4 B)\n" - "{\n" - " return (step(df(A, B), vec4(XBR_EQ_THRESHOLD)));\n" - "}\n" - "\n" - "// Determine if two vector components are NOT equal based on a threshold.\n" - "vec4 neq(vec4 A, vec4 B)\n" - "{\n" - " return (vec4(1.0, 1.0, 1.0, 1.0) - eq(A, B));\n" - "}\n" - "\n" - "// Weighted distance.\n" - "vec4 wd(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h)\n" - "{\n" - " return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + 4.0*df(g,h));\n" - "}\n" - "\n" - "vec4 weighted_distance(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h, vec4 i, vec4 j, vec4 k, vec4 l)\n" - "{\n" - " return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + df(i,j) + df(k,l) + 2.0*df(g,h));\n" - "}\n" - "\n" - "float c_df(vec3 c1, vec3 c2) \n" - "{\n" - " vec3 df = abs(c1 - c2);\n" - " return df.r + df.g + df.b;\n" - "}\n" + "uniform sampler2D SurfaceTex;\n" + "uniform sampler2D PaletteTex;\n" + "in vec4 TEX0;\n" "\n" "void main()\n" "{\n" - " vec4 edri, edr, edr_l, edr_u, px; // px = pixel, edr = edge detection rule\n" - " vec4 irlv0, irlv1, irlv2l, irlv2u, block_3d;\n" - " vec4 fx, fx_l, fx_u; // inequations of straight lines.\n" + " vec4 pIndex = texture(SurfaceTex, TEX0.xy);\n" + " FragColor = texture(PaletteTex, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0));\n" + "}\n"; + + +const char PASSTHROUGH_FRAG_SHADER_CORE[] = + "#version 150\n" + "out vec4 FragColor;\n" + "uniform sampler2D SurfaceTex;\n" + "in vec4 TEX0;\n" "\n" - " vec2 fp = fract(texCoord*TextureSize);\n" - "\n" - " vec3 A1 = texture(Texture, t1.xw ).xyz;\n" - " vec3 B1 = texture(Texture, t1.yw ).xyz;\n" - " vec3 C1 = texture(Texture, t1.zw ).xyz;\n" - " vec3 A = texture(Texture, t2.xw ).xyz;\n" - " vec3 B = texture(Texture, t2.yw ).xyz;\n" - " vec3 C = texture(Texture, t2.zw ).xyz;\n" - " vec3 D = texture(Texture, t3.xw ).xyz;\n" - " vec3 E = texture(Texture, t3.yw ).xyz;\n" - " vec3 F = texture(Texture, t3.zw ).xyz;\n" - " vec3 G = texture(Texture, t4.xw ).xyz;\n" - " vec3 H = texture(Texture, t4.yw ).xyz;\n" - " vec3 I = texture(Texture, t4.zw ).xyz;\n" - " vec3 G5 = texture(Texture, t5.xw ).xyz;\n" - " vec3 H5 = texture(Texture, t5.yw ).xyz;\n" - " vec3 I5 = texture(Texture, t5.zw ).xyz;\n" - " vec3 A0 = texture(Texture, t6.xy ).xyz;\n" - " vec3 D0 = texture(Texture, t6.xz ).xyz;\n" - " vec3 G0 = texture(Texture, t6.xw ).xyz;\n" - " vec3 C4 = texture(Texture, t7.xy ).xyz;\n" - " vec3 F4 = texture(Texture, t7.xz ).xyz;\n" - " vec3 I4 = texture(Texture, t7.xw ).xyz;\n" - "\n" - " vec4 b = vec4(dot(B ,rgbw), dot(D ,rgbw), dot(H ,rgbw), dot(F ,rgbw));\n" - " vec4 c = vec4(dot(C ,rgbw), dot(A ,rgbw), dot(G ,rgbw), dot(I ,rgbw));\n" - " vec4 d = b.yzwx;\n" - " vec4 e = vec4(dot(E,rgbw));\n" - " vec4 f = b.wxyz;\n" - " vec4 g = c.zwxy;\n" - " vec4 h = b.zwxy;\n" - " vec4 i = c.wxyz;\n" - "\n" - " vec4 i4, i5, h5, f4;\n" - "\n" - " float y_weight = XBR_Y_WEIGHT;\n" - "\n" - " if (small_details < 0.5)\n" - " {\n" - " i4 = vec4(dot(I4,rgbw), dot(C1,rgbw), dot(A0,rgbw), dot(G5,rgbw));\n" - " i5 = vec4(dot(I5,rgbw), dot(C4,rgbw), dot(A1,rgbw), dot(G0,rgbw));\n" - " h5 = vec4(dot(H5,rgbw), dot(F4,rgbw), dot(B1,rgbw), dot(D0,rgbw));\n" - " }\n" - " else\n" - " {\n" - " i4 = mul( mat4x3(I4, C1, A0, G5), y_weight * Y );\n" - " i5 = mul( mat4x3(I5, C4, A1, G0), y_weight * Y );\n" - " h5 = mul( mat4x3(H5, F4, B1, D0), y_weight * Y );\n" - " }\n" - "\n" - " // These inequations define the line below which interpolation occurs.\n" - " fx = (Ao*fp.y+Bo*fp.x); \n" - " fx_l = (Ax*fp.y+Bx*fp.x);\n" - " fx_u = (Ay*fp.y+By*fp.x);\n" - "\n" - " irlv1 = irlv0 = diff(e,f) * diff(e,h);\n" - "\n" - "#ifdef CORNER_B\n" - " irlv1 = (irlv0 * ( neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c) ) );\n" - "#endif\n" - "#ifdef CORNER_D\n" - " vec4 c1 = i4.yzwx;\n" - " vec4 g0 = i5.wxyz;\n" - " irlv1 = (irlv0 * ( neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c) ) * (diff(f,f4) * diff(f,i) + diff(h,h5) * diff(h,i) + diff(h,g) + diff(f,c) + eq(b,c1) * eq(d,g0)));\n" - "#endif\n" - "#ifdef CORNER_C\n" - " irlv1 = (irlv0 * ( neq(f,b) * neq(f,c) + neq(h,d) * neq(h,g) + eq(e,i) * (neq(f,f4) * neq(f,i4) + neq(h,h5) * neq(h,i5)) + eq(e,g) + eq(e,c)) );\n" - "#endif\n" - "\n" - " irlv2l = diff(e,g) * diff(d,g);\n" - " irlv2u = diff(e,c) * diff(b,c);\n" - "\n" - " vec4 fx45i = clamp((fx + delta -Co - Ci)/(2.0*delta ), 0.0, 1.0);\n" - " vec4 fx45 = clamp((fx + delta -Co )/(2.0*delta ), 0.0, 1.0);\n" - " vec4 fx30 = clamp((fx_l + delta_l -Cx )/(2.0*delta_l), 0.0, 1.0);\n" - " vec4 fx60 = clamp((fx_u + delta_u -Cy )/(2.0*delta_u), 0.0, 1.0);\n" - "\n" - " vec4 wd1, wd2;\n" - " if (small_details < 0.5)\n" - " {\n" - " wd1 = wd( e, c, g, i, h5, f4, h, f);\n" - " wd2 = wd( h, d, i5, f, i4, b, e, i);\n" - " }\n" - " else\n" - " {\n" - " wd1 = weighted_distance( e, c, g, i, f4, h5, h, f, b, d, i4, i5);\n" - " wd2 = weighted_distance( h, d, i5, f, b, i4, e, i, g, h5, c, f4);\n" - " }\n" - "\n" - " edri = step(wd1, wd2) * irlv0;\n" - " edr = step(wd1 + vec4(0.1, 0.1, 0.1, 0.1), wd2) * step(vec4(0.5, 0.5, 0.5, 0.5), irlv1);\n" - " edr_l = step( lv2_cf*df(f,g), df(h,c) ) * irlv2l * edr;\n" - " edr_u = step( lv2_cf*df(h,c), df(f,g) ) * irlv2u * edr;\n" - "\n" - " fx45 = edr * fx45;\n" - " fx30 = edr_l * fx30;\n" - " fx60 = edr_u * fx60;\n" - " fx45i = edri * fx45i;\n" - "\n" - " px = step(df(e,f), df(e,h));\n" - "\n" - "#ifdef SMOOTH_TIPS\n" - " vec4 maximos = max(max(fx30, fx60), max(fx45, fx45i));\n" - "#endif\n" - "#ifndef SMOOTH_TIPS\n" - " vec4 maximos = max(max(fx30, fx60), fx45);\n" - "#endif\n" - "\n" - " vec3 res1 = E;\n" - " res1 = mix(res1, mix(H, F, px.x), maximos.x);\n" - " res1 = mix(res1, mix(B, D, px.z), maximos.z);\n" - " \n" - " vec3 res2 = E;\n" - " res2 = mix(res2, mix(F, B, px.y), maximos.y);\n" - " res2 = mix(res2, mix(D, H, px.w), maximos.w);\n" - " \n" - " vec3 res = mix(res1, res2, step(c_df(E, res1), c_df(E, res2)));\n" - "\n" - " FragColor.xyz = res;\n" + "void main()\n" + "{\n" + " vec4 texel = texture(SurfaceTex, TEX0.xy);\n" + " FragColor = texel;\n" "}\n"; #endif diff --git a/inc/palette.h b/inc/palette.h deleted file mode 100644 index 8e38ec4..0000000 --- a/inc/palette.h +++ /dev/null @@ -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 diff --git a/inc/render_d3d9.h b/inc/render_d3d9.h index 2de021c..0e653cb 100644 --- a/inc/render_d3d9.h +++ b/inc/render_d3d9.h @@ -13,36 +13,24 @@ typedef struct D3D9RENDERER { HMODULE hmodule; D3DPRESENT_PARAMETERS params; - HWND hwnd; LPDIRECT3D9 instance; LPDIRECT3DDEVICE9 device; LPDIRECT3DVERTEXBUFFER9 vertex_buf; IDirect3DTexture9* surface_tex[D3D9_TEXTURE_COUNT]; IDirect3DTexture9* palette_tex[D3D9_TEXTURE_COUNT]; IDirect3DPixelShader9* pixel_shader; - IDirect3DPixelShader9* pixel_shader_upscale; + IDirect3DPixelShader9* pixel_shader_bilinear; float scale_w; float scale_h; + int bits_per_pixel; int tex_width; int tex_height; } D3D9RENDERER; -#define MAX_D3D9ON12_QUEUES 2 - -typedef struct _D3D9ON12_ARGS -{ - BOOL Enable9On12; - IUnknown* pD3D12Device; - IUnknown* ppD3D12Queues[MAX_D3D9ON12_QUEUES]; - UINT NumQueues; - UINT NodeMask; -} D3D9ON12_ARGS; - BOOL d3d9_is_available(); DWORD WINAPI d3d9_render_main(void); BOOL d3d9_create(); -BOOL d3d9_reset(BOOL windowed); -BOOL d3d9_release_resources(); +BOOL d3d9_reset(); BOOL d3d9_release(); BOOL d3d9_on_device_lost(); diff --git a/inc/render_ogl.h b/inc/render_ogl.h index bc4d39f..efd4be9 100644 --- a/inc/render_ogl.h +++ b/inc/render_ogl.h @@ -5,28 +5,16 @@ #include "opengl_utils.h" #define TEXTURE_COUNT 4 -#define FBO_COUNT 2 - -#ifdef _DEBUG -#define GL_CHECK(stmt) do { \ - stmt; \ - ogl_check_error(#stmt); \ - } while (0) -#else -#define GL_CHECK(stmt) stmt -#endif typedef struct OGLRENDERER { - HWND hwnd; - HDC hdc; HGLRC context; GLuint main_program; - GLuint shader1_program; - GLuint shader2_program; + GLuint scale_program; BOOL got_error; int surface_tex_width; int surface_tex_height; + int* surface_tex; GLenum surface_format; GLenum surface_type; GLuint surface_tex_ids[TEXTURE_COUNT]; @@ -37,23 +25,17 @@ typedef struct OGLRENDERER GLint main_vertex_coord_attr_loc; GLuint main_vbos[3]; GLuint main_vao; - GLint shader1_frame_count_uni_loc; - GLint shader2_frame_count_uni_loc; - GLuint frame_buffer_id[FBO_COUNT]; - GLuint frame_buffer_tex_id[FBO_COUNT]; - GLint shader1_tex_coord_attr_loc; - GLint shader2_tex_coord_attr_loc; - GLuint shader1_vbos[3]; - GLuint shader2_vbos[3]; - GLuint shader1_vao; - GLuint shader2_vao; + GLint frame_count_uni_loc; + GLuint frame_buffer_id; + GLuint frame_buffer_tex_id; + GLint scale_tex_coord_attr_loc; + GLuint scale_vbos[3]; + GLuint scale_vao; BOOL use_opengl; + BOOL adjust_alignment; BOOL filter_bilinear; - BOOL shader2_upscale; } OGLRENDERER; DWORD WINAPI ogl_render_main(void); -BOOL ogl_create(); -BOOL ogl_release(); #endif diff --git a/inc/scale_pattern.h b/inc/scale_pattern.h new file mode 100644 index 0000000..a4027df --- /dev/null +++ b/inc/scale_pattern.h @@ -0,0 +1,18 @@ +#ifndef _SCALE_PATTERN_H +#define _SCALE_PATTERN_H + +typedef enum { + REPEAT, + SEQUENCE, + ONCE, + END +} SCALE_PATTERN_TYPE; + +typedef struct { + SCALE_PATTERN_TYPE type; + int dst_index; + int src_index; + int count; +} scale_pattern; + +#endif diff --git a/inc/utils.h b/inc/utils.h index 3833ede..1f8c54a 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -5,17 +5,6 @@ #include -HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); -void util_set_process_affinity(); -void util_set_thread_affinity(DWORD tid); -void util_pull_messages(); -DWORD util_get_timestamp(HMODULE mod); -FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name); -BOOL util_caller_is_ddraw_wrapper(void* return_address); -BOOL util_is_bad_read_ptr(void* p); -BOOL util_is_minimized(HWND hwnd); -BOOL util_in_foreground(); -BOOL util_is_avx_supported(); void util_limit_game_ticks(); void util_update_bnet_pos(int newX, int newY); BOOL util_get_lowest_resolution(float ratio, SIZE* outRes, DWORD minWidth, DWORD minHeight, DWORD maxWidth, DWORD maxHeight); @@ -23,7 +12,6 @@ void util_toggle_maximize(); void util_toggle_fullscreen(); BOOL util_unadjust_window_rect(LPRECT prc, DWORD dwStyle, BOOL fMenu, DWORD dwExStyle); void util_set_window_rect(int x, int y, int width, int height, UINT flags); -BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam); BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lParam); BOOL util_detect_low_res_screen(); diff --git a/inc/version.h b/inc/version.h deleted file mode 100644 index 29e19fa..0000000 --- a/inc/version.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef VERSION_H -#define VERSION_H - -#define str(s) #s -#define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) - -#define VERSION_MAJOR 7 -#define VERSION_MINOR 1 -#define VERSION_BUILD 0 -#define VERSION_REVISION 1 - -#define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION -#define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) - - -#endif diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h deleted file mode 100644 index 36f2dd6..0000000 --- a/inc/versionhelpers.h +++ /dev/null @@ -1,266 +0,0 @@ -/** - * This file is part of the mingw-w64 runtime package. - * No warranty is given; refer to the file DISCLAIMER within this package. - */ - -#ifndef _INC_VERSIONHELPERS -#define _INC_VERSIONHELPERS - -#ifdef __cplusplus -#define VERSIONHELPERAPI inline bool -#else -#define VERSIONHELPERAPI FORCEINLINE BOOL -#endif - -#ifndef _WIN32_WINNT_WIN8 -#define _WIN32_WINNT_WIN8 0x0602 -#endif -#ifndef _WIN32_WINNT_WINBLUE -#define _WIN32_WINNT_WINBLUE 0x0603 -#endif -#ifndef _WIN32_WINNT_WINTHRESHOLD -#define _WIN32_WINNT_WINTHRESHOLD 0x0A00 /* ABRACADABRA_THRESHOLD*/ -#endif -#ifndef _WIN32_WINNT_WIN10 -#define _WIN32_WINNT_WIN10 0x0A00 /* ABRACADABRA_THRESHOLD*/ -#endif -#ifndef _WIN32_WINNT_WIN11 -#define _WIN32_WINNT_WIN11 0x0A00 -#endif - -#if (_WIN32_WINNT < _WIN32_WINNT_WIN2K) -#define VerifyVersionInfoW(a,b,c) 0 -#define VerSetConditionMask verhelp_set_mask -#endif - -BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask); -ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition); -const char* verhelp_wine_get_version(); -void verhelp_wine_get_host_version(const char** sysname, const char** release); - -VERSIONHELPERAPI IsWindowsVersionOrGreater(DWORD major, DWORD minor, DWORD build, WORD servpack) -{ - RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack }; - return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, - VER_MAJORVERSION, VER_GREATER_EQUAL), - VER_MINORVERSION, VER_GREATER_EQUAL), - VER_BUILDNUMBER, VER_GREATER_EQUAL), - VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); -} - -VERSIONHELPERAPI IsWindowsVersion(DWORD major, DWORD minor, DWORD build, WORD servpack) -{ - RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack }; - return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, - VER_MAJORVERSION, VER_EQUAL), - VER_MINORVERSION, VER_EQUAL), - VER_BUILDNUMBER, VER_GREATER_EQUAL), - VER_SERVICEPACKMAJOR, VER_EQUAL)); -} - -VERSIONHELPERAPI IsWindowsVersionExcactBuild(DWORD major, DWORD minor, DWORD build, WORD servpack) -{ - RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack }; - return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, - VER_MAJORVERSION, VER_EQUAL), - VER_MINORVERSION, VER_EQUAL), - VER_BUILDNUMBER, VER_EQUAL), - VER_SERVICEPACKMAJOR, VER_EQUAL)); -} - -VERSIONHELPERAPI IsWindowsVersionAnySP(DWORD major, DWORD minor, DWORD build) -{ - RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},0 }; - return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, - VER_MAJORVERSION, VER_EQUAL), - VER_MINORVERSION, VER_EQUAL), - VER_BUILDNUMBER, VER_GREATER_EQUAL), - VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); -} - -VERSIONHELPERAPI IsWindows2000OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN2K), LOBYTE(_WIN32_WINNT_WIN2K), 0, 0); -} - -VERSIONHELPERAPI IsWindowsXPOrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0); -} - -VERSIONHELPERAPI IsWindowsXPSP1OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 1); -} - -VERSIONHELPERAPI IsWindowsXPSP2OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 2); -} - -VERSIONHELPERAPI IsWindowsXPSP3OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 3); -} - -VERSIONHELPERAPI IsWindowsVistaOrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 0); -} - -VERSIONHELPERAPI IsWindowsVistaSP1OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 1); -} - -VERSIONHELPERAPI IsWindowsVistaSP2OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 2); -} - -VERSIONHELPERAPI IsWindows7OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 0); -} - -VERSIONHELPERAPI IsWindows7SP1OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 1); -} - -VERSIONHELPERAPI IsWindows8OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0, 0); -} - -VERSIONHELPERAPI IsWindows8Point1OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0, 0); -} - -VERSIONHELPERAPI IsWindowsThresholdOrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINTHRESHOLD), LOBYTE(_WIN32_WINNT_WINTHRESHOLD), 0, 0); -} - -VERSIONHELPERAPI IsWindows10OrGreater(void) { - return IsWindowsThresholdOrGreater(); -} - -VERSIONHELPERAPI IsWindows10Version1803OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN10), LOBYTE(_WIN32_WINNT_WIN10), 17134, 0); -} - -VERSIONHELPERAPI IsWindows11OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0); -} - -VERSIONHELPERAPI IsWindows11Version24H2OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 26100, 0); -} - -VERSIONHELPERAPI IsWindowsServer(void) { - OSVERSIONINFOEXW vi = {sizeof(vi),0,0,0,0,{0},0,0,0,VER_NT_WORKSTATION}; - return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); -} - -VERSIONHELPERAPI IsWindows2000(void) { - return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WIN2K), LOBYTE(_WIN32_WINNT_WIN2K), 0); -} - -VERSIONHELPERAPI IsWindowsXP(void) { - return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0); -} - -VERSIONHELPERAPI IsWindowsXPRTM(void) { - return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0); -} - -VERSIONHELPERAPI IsWindowsXPSP1(void) { - return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 1); -} - -VERSIONHELPERAPI IsWindowsXPSP2(void) { - return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 2); -} - -VERSIONHELPERAPI IsWindowsXPSP3(void) { - return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 3); -} - -VERSIONHELPERAPI IsWindowsVista(void) { - return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0); -} - -VERSIONHELPERAPI IsWindowsVistaRTM(void) { - return IsWindowsVersion(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 0); -} - -VERSIONHELPERAPI IsWindowsVistaSP1(void) { - return IsWindowsVersion(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 1); -} - -VERSIONHELPERAPI IsWindowsVistaSP2(void) { - return IsWindowsVersion(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 2); -} - -VERSIONHELPERAPI IsWindows7(void) { - return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0); -} - -VERSIONHELPERAPI IsWindows7RTM(void) { - return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 0); -} - -VERSIONHELPERAPI IsWindows7SP1(void) { - return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 1); -} - -VERSIONHELPERAPI IsWindows8(void) { - return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0, 0); -} - -VERSIONHELPERAPI IsWindows8Point1(void) { - return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0, 0); -} - -VERSIONHELPERAPI IsWindowsThreshold(void) { - return IsWindows10OrGreater() && !IsWindows11OrGreater(); -} - -VERSIONHELPERAPI IsWindows10(void) { - return IsWindowsThreshold(); -} - -VERSIONHELPERAPI IsWindows11(void) { - return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0); -} - -VERSIONHELPERAPI IsWindows11Version24H2(void) { - return IsWindowsVersionExcactBuild(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 26100, 0); -} - -VERSIONHELPERAPI IsWine(void) { - return verhelp_wine_get_version() != NULL; -} - -VERSIONHELPERAPI IsMacOS(void) { - const char* sysname = NULL; - const char* release = NULL; - verhelp_wine_get_host_version(&sysname, &release); - - return sysname && _strcmpi(sysname, "Darwin") == 0; -} - -VERSIONHELPERAPI IsLinux(void) { - const char* sysname = NULL; - const char* release = NULL; - verhelp_wine_get_host_version(&sysname, &release); - - return sysname && _strcmpi(sysname, "Linux") == 0; -} - -VERSIONHELPERAPI IsAndroid(void) { - const char* sysname = NULL; - const char* release = NULL; - verhelp_wine_get_host_version(&sysname, &release); - - return release && strstr(release, "android") != NULL; -} - -VERSIONHELPERAPI IsSteamDeck(void) { - return IsWine() && GetEnvironmentVariable("STEAMDECK", NULL, 0); -} - -#endif diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index ad44c7e..9c0a5b4 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -1,8 +1,8 @@ #ifndef WINAPI_HOOKS_H #define WINAPI_HOOKS_H +#define WIN32_LEAN_AND_MEAN #include -#include BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint); @@ -22,81 +22,28 @@ BOOL WINAPI fake_SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint); LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong); -LONG WINAPI fake_SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong); LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex); BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable); BOOL WINAPI fake_DestroyWindow(HWND hWnd); int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints); BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow); -HWND WINAPI fake_GetTopWindow(HWND hWnd); -HWND WINAPI fake_GetForegroundWindow(void); BOOL WINAPI fake_SetForegroundWindow(HWND hWnd); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); -BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg); -BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); -BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl); -BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl); -BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode); -LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); -HWND WINAPI fake_SetParent(HWND hWndChild, HWND hWndNewParent); -HDC WINAPI fake_BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint); -SHORT WINAPI fake_GetKeyState(int nVirtKey); -SHORT WINAPI fake_GetAsyncKeyState(int vKey); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); -int WINAPI fake_GetDeviceCaps_system(HDC hdc, int index); - -BOOL WINAPI fake_StretchBlt( - HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop); - -BOOL WINAPI fake_WinGStretchBlt( - HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc); - -BOOL WINAPI fake_WinGBitBlt( - HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1); - -BOOL WINAPI fake_BitBlt( - HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, DWORD rop); - -int WINAPI fake_SetDIBitsToDevice( - HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); - -int WINAPI fake_StretchDIBits( - HDC, int, int, int, int, int, int, int, int, const VOID*, const BITMAPINFO*, UINT, DWORD); - -HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA*); -HFONT WINAPI fake_CreateFontA(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); -UINT WINAPI fake_GetSystemPaletteEntries(HDC, UINT, UINT, LPPALETTEENTRY); -HPALETTE WINAPI fake_SelectPalette(HDC, HPALETTE, BOOL); -UINT WINAPI fake_RealizePalette(HDC); +HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA* lplf); +HFONT WINAPI fake_CreateFontA(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, + DWORD fdwItalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet, + DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily, + LPCTSTR lpszFace); HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); -FARPROC WINAPI fake_GetProcAddress(HMODULE hModule, LPCSTR lpProcName); - -BOOL WINAPI fake_GetDiskFreeSpaceA( - LPCSTR lpRootPathName, - LPDWORD lpSectorsPerCluster, - LPDWORD lpBytesPerSector, - LPDWORD lpNumberOfFreeClusters, - LPDWORD lpTotalNumberOfClusters); - -DWORD WINAPI fake_GetVersion(void); -BOOL WINAPI fake_GetVersionExA(LPOSVERSIONINFOA lpVersionInformation); - HWND WINAPI fake_CreateWindowExA( DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); - HRESULT WINAPI fake_CoCreateInstance( REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv); -MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR fdwCommand, DWORD_PTR dwParam); - -LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( - LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); - -PGETFRAME WINAPI fake_AVIStreamGetFrameOpen(PAVISTREAM pavi, LPBITMAPINFOHEADER lpbiWanted); - #endif diff --git a/inc/wndproc.h b/inc/wndproc.h index 4af4f7e..d74dff7 100644 --- a/inc/wndproc.h +++ b/inc/wndproc.h @@ -7,19 +7,9 @@ #define WM_SIZE_DDRAW WM_APP+114 #define WM_MOVE_DDRAW WM_APP+115 #define WM_DISPLAYCHANGE_DDRAW WM_APP+116 -#define WM_TOGGLE_FULLSCREEN WM_APP+117 -#define WM_TOGGLE_MAXIMIZE WM_APP+118 -#define WM_RESTORE_STYLE WM_APP+119 #define IDT_TIMER_LEAVE_BNET 541287654 -#define IDT_TIMER_LINUX_FIX_WINDOW_SIZE 345267753 - -#define CNC_DDRAW_SET_FULLSCREEN 1 -#define CNC_DDRAW_SET_WINDOWED 2 - -#ifndef WM_UNICHAR -#define WM_UNICHAR 0x0109 -#endif +#define IDT_TIMER_REDRAW_BNET 541287655 LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); diff --git a/res.rc b/res.rc deleted file mode 100644 index 46f3908..0000000 --- a/res.rc +++ /dev/null @@ -1,30 +0,0 @@ -#include "inc/version.h" -#include "inc/git.h" - - -1 VERSIONINFO -FILEVERSION VERSION -PRODUCTVERSION VERSION -{ - BLOCK "StringFileInfo" - { - BLOCK "040904B0" - { - VALUE "CompanyName", "github.com/FunkyFr3sh" - VALUE "FileDescription", "DirectDraw replacement" - VALUE "FileVersion", VERSION_STRING " (git~" GIT_COMMIT ", " GIT_BRANCH ")" - VALUE "InternalName", "ddraw" - VALUE "LegalCopyright", "Copyright (c) 2010-2024" - VALUE "LegalTrademarks", "" - VALUE "OriginalFileName", "ddraw.dll" - VALUE "ProductName", "cnc-ddraw" - VALUE "ProductVersion", VERSION_STRING " (git~" GIT_COMMIT ", " GIT_BRANCH ")" - VALUE "Comments", "https://github.com/FunkyFr3sh/cnc-ddraw" - } - } - - BLOCK "VarFileInfo" - { - VALUE "Translation", 0x0409, 0x04B0 - } -} diff --git a/src/IDirect3D/IDirect3D.c b/src/IDirect3D/IDirect3D.c index e4b0ee5..352430f 100644 --- a/src/IDirect3D/IDirect3D.c +++ b/src/IDirect3D/IDirect3D.c @@ -4,28 +4,15 @@ HRESULT __stdcall IDirect3D__QueryInterface(IDirect3DImpl* This, REFIID riid, void** obj) { - TRACE( - "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", - __FUNCTION__, - This, - (unsigned int)riid, - obj, - _ReturnAddress()); - + TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj); HRESULT ret = E_FAIL; - - if (riid) - { - TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); - } - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirect3D__AddRef(IDirect3DImpl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -33,7 +20,7 @@ ULONG __stdcall IDirect3D__AddRef(IDirect3DImpl* This) ULONG __stdcall IDirect3D__Release(IDirect3DImpl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = --This->ref; @@ -50,33 +37,23 @@ ULONG __stdcall IDirect3D__Release(IDirect3DImpl* This) HRESULT __stdcall IDirect3D__Initialize(IDirect3DImpl* This, int a) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } -HRESULT __stdcall IDirect3D__EnumDevices( - IDirect3DImpl* This, - LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback, - LPVOID lpUserArg) +HRESULT __stdcall IDirect3D__EnumDevices(IDirect3DImpl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); - HRESULT ret = S_OK; - - if (lpEnumDevicesCallback) - { - D3DDEVICEDESC desc = { 0 }; - lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg); - } - + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirect3D__CreateLight(IDirect3DImpl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -84,7 +61,7 @@ HRESULT __stdcall IDirect3D__CreateLight(IDirect3DImpl* This, int a, int b) HRESULT __stdcall IDirect3D__CreateMaterial(IDirect3DImpl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -92,7 +69,7 @@ HRESULT __stdcall IDirect3D__CreateMaterial(IDirect3DImpl* This, int a, int b) HRESULT __stdcall IDirect3D__CreateViewport(IDirect3DImpl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -100,7 +77,7 @@ HRESULT __stdcall IDirect3D__CreateViewport(IDirect3DImpl* This, int a, int b) HRESULT __stdcall IDirect3D__FindDevice(IDirect3DImpl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index c4f93ab..d84598f 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -4,28 +4,15 @@ HRESULT __stdcall IDirect3D2__QueryInterface(IDirect3D2Impl* This, REFIID riid, void** obj) { - TRACE( - "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", - __FUNCTION__, - This, - (unsigned int)riid, - obj, - _ReturnAddress()); - + TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj); HRESULT ret = E_FAIL; - - if (riid) - { - TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); - } - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirect3D2__AddRef(IDirect3D2Impl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -33,7 +20,7 @@ ULONG __stdcall IDirect3D2__AddRef(IDirect3D2Impl* This) ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = --This->ref; @@ -48,27 +35,17 @@ ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This) return ret; } -HRESULT __stdcall IDirect3D2__EnumDevices( - IDirect3D2Impl* This, - LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback, - LPVOID lpUserArg) +HRESULT __stdcall IDirect3D2__EnumDevices(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); - HRESULT ret = S_OK; - - if (lpEnumDevicesCallback) - { - //D3DDEVICEDESC desc = { 0 }; - //lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg); - } - + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirect3D2__CreateLight(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -76,7 +53,7 @@ HRESULT __stdcall IDirect3D2__CreateLight(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateMaterial(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -84,7 +61,7 @@ HRESULT __stdcall IDirect3D2__CreateMaterial(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateViewport(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -92,7 +69,7 @@ HRESULT __stdcall IDirect3D2__CreateViewport(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__FindDevice(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -100,7 +77,7 @@ HRESULT __stdcall IDirect3D2__FindDevice(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateDevice(IDirect3D2Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index 8b6ff43..0978d4a 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -4,28 +4,15 @@ HRESULT __stdcall IDirect3D3__QueryInterface(IDirect3D3Impl* This, REFIID riid, void** obj) { - TRACE( - "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", - __FUNCTION__, - This, - (unsigned int)riid, - obj, - _ReturnAddress()); - + TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj); HRESULT ret = E_FAIL; - - if (riid) - { - TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); - } - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirect3D3__AddRef(IDirect3D3Impl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -33,7 +20,7 @@ ULONG __stdcall IDirect3D3__AddRef(IDirect3D3Impl* This) ULONG __stdcall IDirect3D3__Release(IDirect3D3Impl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = --This->ref; @@ -48,27 +35,17 @@ ULONG __stdcall IDirect3D3__Release(IDirect3D3Impl* This) return ret; } -HRESULT __stdcall IDirect3D3__EnumDevices( - IDirect3D3Impl* This, - LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback, - LPVOID lpUserArg) +HRESULT __stdcall IDirect3D3__EnumDevices(IDirect3D3Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); - HRESULT ret = S_OK; - - if (lpEnumDevicesCallback) - { - //D3DDEVICEDESC desc = { 0 }; - //lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg); - } - + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirect3D3__CreateLight(IDirect3D3Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -76,7 +53,7 @@ HRESULT __stdcall IDirect3D3__CreateLight(IDirect3D3Impl* This, int a, int b) HRESULT __stdcall IDirect3D3__CreateMaterial(IDirect3D3Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -84,7 +61,7 @@ HRESULT __stdcall IDirect3D3__CreateMaterial(IDirect3D3Impl* This, int a, int b) HRESULT __stdcall IDirect3D3__CreateViewport(IDirect3D3Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -92,7 +69,7 @@ HRESULT __stdcall IDirect3D3__CreateViewport(IDirect3D3Impl* This, int a, int b) HRESULT __stdcall IDirect3D3__FindDevice(IDirect3D3Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -100,7 +77,7 @@ HRESULT __stdcall IDirect3D3__FindDevice(IDirect3D3Impl* This, int a, int b) HRESULT __stdcall IDirect3D3__CreateDevice(IDirect3D3Impl* This, int a, int b, int c, int d) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -108,7 +85,7 @@ HRESULT __stdcall IDirect3D3__CreateDevice(IDirect3D3Impl* This, int a, int b, i HRESULT __stdcall IDirect3D3__CreateVertexBuffer(IDirect3D3Impl* This, int a, int b, int c, int d) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -116,7 +93,7 @@ HRESULT __stdcall IDirect3D3__CreateVertexBuffer(IDirect3D3Impl* This, int a, in HRESULT __stdcall IDirect3D3__EnumZBufferFormats(IDirect3D3Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -124,7 +101,7 @@ HRESULT __stdcall IDirect3D3__EnumZBufferFormats(IDirect3D3Impl* This, int a, in HRESULT __stdcall IDirect3D3__EvictManagedTextures(IDirect3D3Impl* This) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirect3D/IDirect3D7.c b/src/IDirect3D/IDirect3D7.c index 0102923..99c36bb 100644 --- a/src/IDirect3D/IDirect3D7.c +++ b/src/IDirect3D/IDirect3D7.c @@ -4,28 +4,15 @@ HRESULT __stdcall IDirect3D7__QueryInterface(IDirect3D7Impl* This, REFIID riid, void** obj) { - TRACE( - "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", - __FUNCTION__, - This, - (unsigned int)riid, - obj, - _ReturnAddress()); - + TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj); HRESULT ret = E_FAIL; - - if (riid) - { - TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); - } - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirect3D7__AddRef(IDirect3D7Impl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -33,7 +20,7 @@ ULONG __stdcall IDirect3D7__AddRef(IDirect3D7Impl* This) ULONG __stdcall IDirect3D7__Release(IDirect3D7Impl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = --This->ref; @@ -48,27 +35,17 @@ ULONG __stdcall IDirect3D7__Release(IDirect3D7Impl* This) return ret; } -HRESULT __stdcall IDirect3D7__EnumDevices( - IDirect3D7Impl* This, - LPD3DENUMDEVICESCALLBACK7 lpEnumDevicesCallback, - LPVOID lpUserArg) +HRESULT __stdcall IDirect3D7__EnumDevices(IDirect3D7Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); - HRESULT ret = S_OK; - - if (lpEnumDevicesCallback) - { - //D3DDEVICEDESC7 desc = { 0 }; - //lpEnumDevicesCallback("NULL", "NULL", &desc, lpUserArg); - } - + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirect3D7__CreateDevice(IDirect3D7Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -76,7 +53,7 @@ HRESULT __stdcall IDirect3D7__CreateDevice(IDirect3D7Impl* This, int a, int b, i HRESULT __stdcall IDirect3D7__CreateVertexBuffer(IDirect3D7Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -84,7 +61,7 @@ HRESULT __stdcall IDirect3D7__CreateVertexBuffer(IDirect3D7Impl* This, int a, in HRESULT __stdcall IDirect3D7__EnumZBufferFormats(IDirect3D7Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -92,7 +69,7 @@ HRESULT __stdcall IDirect3D7__EnumZBufferFormats(IDirect3D7Impl* This, int a, in HRESULT __stdcall IDirect3D7__EvictManagedTextures(IDirect3D7Impl* This) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 9384714..91609f1 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -1,4 +1,3 @@ -#include #include #include "IDirectDraw.h" #include "IDirect3D.h" @@ -8,21 +7,15 @@ #include "ddpalette.h" #include "ddsurface.h" #include "debug.h" -#include "hook.h" -#include "config.h" HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid, LPVOID FAR* ppvObj) { - TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", __FUNCTION__, This, (unsigned int)riid, ppvObj, _ReturnAddress()); + TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); - HRESULT ret = E_NOINTERFACE; + HRESULT ret = DDERR_UNSUPPORTED; - if (!ppvObj) - { - ret = E_INVALIDARG; - } - else if (riid) + if (riid) { if (IsEqualGUID(&IID_IDirectDraw2, riid) || IsEqualGUID(&IID_IDirectDraw4, riid) || @@ -111,14 +104,12 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid *ppvObj = d3d; ret = S_OK; - } - else if (IsEqualGUID(&IID_IMediaStream, riid) || IsEqualGUID(&IID_IAMMediaStream, riid)) + } + /* + else if ( + !g_ddraw->passthrough && + (IsEqualGUID(&IID_IMediaStream, riid) || IsEqualGUID(&IID_IAMMediaStream, riid))) { - TRACE("NOT_IMPLEMENTED GUID = %08X (IID_IXXMediaStream)\n", ((GUID*)riid)->Data1); - - ret = E_NOINTERFACE; - - /* IAMMediaStreamImpl* ms = (IAMMediaStreamImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IAMMediaStreamImpl)); @@ -127,63 +118,50 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ms->lpVtbl = &g_ms_vtbl; ms->lpVtbl->AddRef(ms); - *ppvObj = ms; + *obj = ms; ret = S_OK; - */ - } - else if (((GUID*)riid)->Data1 == 0 && ((GUID*)riid)->Data2 == 0 && ((GUID*)riid)->Data3 == 0) - { - TRACE("NOT_IMPLEMENTED GUID = 0 0 0\n"); - - ret = E_NOINTERFACE; } + */ else { TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); - if (!g_ddraw.real_dll) - g_ddraw.real_dll = real_LoadLibraryA("system32\\ddraw.dll"); + if (!g_ddraw->real_dll) + g_ddraw->real_dll = LoadLibrary("system32\\ddraw.dll"); - if (g_ddraw.real_dll && !g_ddraw.DirectDrawCreate) - g_ddraw.DirectDrawCreate = (void*)real_GetProcAddress(g_ddraw.real_dll, "DirectDrawCreate"); + if (g_ddraw->real_dll && !g_ddraw->DirectDrawCreate) + g_ddraw->DirectDrawCreate = (void*)GetProcAddress(g_ddraw->real_dll, "DirectDrawCreate"); - if (g_ddraw.DirectDrawCreate == DirectDrawCreate) - g_ddraw.DirectDrawCreate = NULL; + if (g_ddraw->DirectDrawCreate == DirectDrawCreate) + g_ddraw->DirectDrawCreate = NULL; - if (!g_ddraw.real_dd && g_ddraw.DirectDrawCreate) - g_ddraw.DirectDrawCreate(NULL, &g_ddraw.real_dd, NULL); + if (!g_ddraw->real_dd && g_ddraw->DirectDrawCreate) + g_ddraw->DirectDrawCreate(NULL, &g_ddraw->real_dd, NULL); - if (g_ddraw.real_dd) - ret = IDirectDraw_QueryInterface(g_ddraw.real_dd, riid, ppvObj); + if (g_ddraw->real_dd) + ret = IDirectDraw_QueryInterface(g_ddraw->real_dd, riid, ppvObj); else ret = E_NOINTERFACE; } - } - TRACE("<- %s(result=%08X)\n", __FUNCTION__, ret); + TRACE("<- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirectDraw__AddRef(IDirectDrawImpl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = ++This->ref; - -#ifdef _DEBUG ULONG glob_ref = dd_AddRef(); -#else - dd_AddRef(); -#endif - TRACE("<- %s(This ref=%u, global ref=%u)\n", __FUNCTION__, ret, glob_ref); return ret; } ULONG __stdcall IDirectDraw__Release(IDirectDrawImpl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = --This->ref; @@ -194,11 +172,7 @@ ULONG __stdcall IDirectDraw__Release(IDirectDrawImpl* This) HeapFree(GetProcessHeap(), 0, This); } -#ifdef _DEBUG ULONG glob_ref = dd_Release(); -#else - dd_Release(); -#endif TRACE("<- %s(This ref=%u, global ref=%u)\n", __FUNCTION__, ret, glob_ref); return ret; @@ -206,7 +180,7 @@ ULONG __stdcall IDirectDraw__Release(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__Compact(IDirectDrawImpl* This) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -219,13 +193,12 @@ HRESULT __stdcall IDirectDraw__CreateClipper( IUnknown FAR* pUnkOuter) { TRACE( - "-> %s(This=%p, dwFlags=%08X, lplpDDClipper=%p, unkOuter=%p) [%p]\n", + "-> %s(This=%p, dwFlags=%08X, lplpDDClipper=%p, unkOuter=%p)\n", __FUNCTION__, This, dwFlags, lplpDDClipper, - pUnkOuter, - _ReturnAddress()); + pUnkOuter); HRESULT ret = dd_CreateClipper(dwFlags, (IDirectDrawClipperImpl**)lplpDDClipper, pUnkOuter); @@ -241,14 +214,13 @@ HRESULT __stdcall IDirectDraw__CreatePalette( IUnknown FAR* unkOuter) { TRACE( - "-> %s(This=%p, dwFlags=%08X, lpDDColorArray=%p, lpDDPalette=%p, unkOuter=%p) [%p]\n", + "-> %s(This=%p, dwFlags=%08X, lpDDColorArray=%p, lpDDPalette=%p, unkOuter=%p)\n", __FUNCTION__, This, dwFlags, lpDDColorArray, lpDDPalette, - unkOuter, - _ReturnAddress()); + unkOuter); HRESULT ret = dd_CreatePalette(dwFlags, lpDDColorArray, (IDirectDrawPaletteImpl**)lpDDPalette, unkOuter); @@ -263,13 +235,12 @@ HRESULT __stdcall IDirectDraw__CreateSurface( IUnknown FAR* unkOuter) { TRACE( - "-> %s(This=%p, lpDDSurfaceDesc=%p, lpDDSurface=%p, unkOuter=%p) [%p]\n", + "-> %s(This=%p, lpDDSurfaceDesc=%p, lpDDSurface=%p, unkOuter=%p)\n", __FUNCTION__, This, lpDDSurfaceDesc, lpDDSurface, - unkOuter, - _ReturnAddress()); + unkOuter); HRESULT ret = dd_CreateSurface( @@ -287,7 +258,7 @@ HRESULT __stdcall IDirectDraw__DuplicateSurface( LPDIRECTDRAWSURFACE7 lpDDSrcSurface, LPDIRECTDRAWSURFACE7* lpDDDestSurface) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_CANTDUPLICATE; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -301,14 +272,13 @@ HRESULT __stdcall IDirectDraw__EnumDisplayModes( LPDDENUMMODESCALLBACK2 lpEnumModesCallback) { TRACE( - "-> %s(This=%p, dwFlags=%08X, lpDDSurfaceDesc=%p, lpContext=%p, lpEnumModesCallback=%p) [%p]\n", + "-> %s(This=%p, dwFlags=%08X, lpDDSurfaceDesc=%p, lpContext=%p, lpEnumModesCallback=%p)\n", __FUNCTION__, This, dwFlags, lpDDSurfaceDesc, lpContext, - lpEnumModesCallback, - _ReturnAddress()); + lpEnumModesCallback); HRESULT ret = dd_EnumDisplayModes( @@ -328,25 +298,15 @@ HRESULT __stdcall IDirectDraw__EnumSurfaces( LPVOID lpContext, LPDDENUMSURFACESCALLBACK7 lpEnumSurfacesCallback) { - TRACE( - "NOT_IMPLEMENTED -> %s(This=%p, dwFlags=%08X, lpDDSurfaceDesc=%p, lpContext=%p, lpEnumSurfacesCallback=%p) [%p]\n", - __FUNCTION__, - This, - dwFlags, - lpDDSurfaceDesc, - lpContext, - lpEnumSurfacesCallback, - _ReturnAddress()); - + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDraw__FlipToGDISurface(IDirectDrawImpl* This) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -354,14 +314,7 @@ HRESULT __stdcall IDirectDraw__FlipToGDISurface(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__GetCaps(IDirectDrawImpl* This, LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDEmulCaps) { - TRACE( - "-> %s(This=%p, lpDDDriverCaps=%p, lpDDEmulCaps=%p) [%p]\n", - __FUNCTION__, - This, - lpDDDriverCaps, - lpDDEmulCaps, - _ReturnAddress()); - + TRACE("-> %s(This=%p, lpDDDriverCaps=%p, lpDDEmulCaps=%p)\n", __FUNCTION__, This, lpDDDriverCaps, lpDDEmulCaps); HRESULT ret = dd_GetCaps((LPDDCAPS_DX1)lpDDDriverCaps, (LPDDCAPS_DX1)lpDDEmulCaps); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -369,7 +322,7 @@ HRESULT __stdcall IDirectDraw__GetCaps(IDirectDrawImpl* This, LPDDCAPS lpDDDrive HRESULT __stdcall IDirectDraw__GetDisplayMode(IDirectDrawImpl* This, LPDDSURFACEDESC2 lpDDSurfaceDesc) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = dd_GetDisplayMode((LPDDSURFACEDESC)lpDDSurfaceDesc); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -377,7 +330,7 @@ HRESULT __stdcall IDirectDraw__GetDisplayMode(IDirectDrawImpl* This, LPDDSURFACE HRESULT __stdcall IDirectDraw__GetFourCCCodes(IDirectDrawImpl* This, LPDWORD lpNumCodes, LPDWORD lpCodes) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -385,16 +338,16 @@ HRESULT __stdcall IDirectDraw__GetFourCCCodes(IDirectDrawImpl* This, LPDWORD lpN HRESULT __stdcall IDirectDraw__GetGDISurface(IDirectDrawImpl* This, LPDIRECTDRAWSURFACE7* lplpGDIDDSurface) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); - HRESULT ret = DD_OK; - *lplpGDIDDSurface = (LPDIRECTDRAWSURFACE7)g_ddraw.primary; + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = DDERR_NOTFOUND; + *lplpGDIDDSurface = (LPDIRECTDRAWSURFACE7)g_ddraw->primary; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDraw__GetMonitorFrequency(IDirectDrawImpl* This, LPDWORD lpdwFreq) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = dd_GetMonitorFrequency(lpdwFreq); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -402,7 +355,7 @@ HRESULT __stdcall IDirectDraw__GetMonitorFrequency(IDirectDrawImpl* This, LPDWOR HRESULT __stdcall IDirectDraw__GetScanLine(IDirectDrawImpl* This, LPDWORD lpdwScanLine) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_UNSUPPORTED; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -410,7 +363,7 @@ HRESULT __stdcall IDirectDraw__GetScanLine(IDirectDrawImpl* This, LPDWORD lpdwSc HRESULT __stdcall IDirectDraw__GetVerticalBlankStatus(IDirectDrawImpl* This, LPBOOL lpbIsInVB) { - TRACE("-> %s(This=%p, lpbIsInVB=%p) [%p]\n", __FUNCTION__, This, lpbIsInVB, _ReturnAddress()); + TRACE("-> %s(This=%p, lpbIsInVB=%p)\n", __FUNCTION__, This, lpbIsInVB); HRESULT ret = dd_GetVerticalBlankStatus(lpbIsInVB); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -418,15 +371,15 @@ HRESULT __stdcall IDirectDraw__GetVerticalBlankStatus(IDirectDrawImpl* This, LPB HRESULT __stdcall IDirectDraw__Initialize(IDirectDrawImpl* This, GUID* lpGUID) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDraw__RestoreDisplayMode(IDirectDrawImpl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = dd_RestoreDisplayMode(); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -434,7 +387,7 @@ HRESULT __stdcall IDirectDraw__RestoreDisplayMode(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__SetCooperativeLevel(IDirectDrawImpl* This, HWND hwnd, DWORD dwFlags) { - TRACE("-> %s(This=%p, hwnd=%p, dwFlags=0x%08X) [%p]\n", __FUNCTION__, This, hwnd, dwFlags, _ReturnAddress()); + TRACE("-> %s(This=%p, hwnd=%p, dwFlags=0x%08X)\n", __FUNCTION__, This, hwnd, dwFlags); HRESULT ret = dd_SetCooperativeLevel(hwnd, dwFlags); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -442,15 +395,7 @@ HRESULT __stdcall IDirectDraw__SetCooperativeLevel(IDirectDrawImpl* This, HWND h HRESULT __stdcall IDirectDraw__SetDisplayMode(IDirectDrawImpl* This, DWORD dwWidth, DWORD dwHeight, DWORD dwBPP) { - TRACE( - "-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d) [%p]\n", - __FUNCTION__, - This, - dwWidth, - dwHeight, - dwBPP, - _ReturnAddress()); - + TRACE("-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d)\n", __FUNCTION__, This, dwWidth, dwHeight, dwBPP); HRESULT ret = dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, SDM_MODE_SET_BY_GAME); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -465,15 +410,14 @@ HRESULT __stdcall IDirectDraw__SetDisplayModeX( DWORD dwFlags) { TRACE( - "-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d, refreshRate=%d, dwFlags=%d) [%p]\n", + "-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d, refreshRate=%d, dwFlags=%d)\n", __FUNCTION__, This, dwWidth, dwHeight, dwBPP, dwRefreshRate, - dwFlags, - _ReturnAddress()); + dwFlags); HRESULT ret = dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, SDM_MODE_SET_BY_GAME); @@ -483,7 +427,7 @@ HRESULT __stdcall IDirectDraw__SetDisplayModeX( HRESULT __stdcall IDirectDraw__WaitForVerticalBlank(IDirectDrawImpl* This, DWORD dwFlags, HANDLE hEvent) { - TRACE_EXT("-> %s(This=%p, dwFlags=%08X, hEvent=%p) [%p]\n", __FUNCTION__, This, dwFlags, hEvent, _ReturnAddress()); + TRACE_EXT("-> %s(This=%p, dwFlags=%08X, hEvent=%p)\n", __FUNCTION__, This, dwFlags, hEvent); HRESULT ret = dd_WaitForVerticalBlank(dwFlags, hEvent); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -496,13 +440,12 @@ HRESULT __stdcall IDirectDraw__GetAvailableVidMem( LPDWORD lpdwFree) { TRACE( - "-> %s(This=%p, lpDDCaps=%p, lpdwTotal=%p, lpdwFree=%p) [%p]\n", + "-> %s(This=%p, lpDDCaps=%p, lpdwTotal=%p, lpdwFree=%p)\n", __FUNCTION__, This, lpDDCaps, lpdwTotal, - lpdwFree, - _ReturnAddress()); + lpdwFree); HRESULT ret = dd_GetAvailableVidMem((LPDDSCAPS)lpDDCaps, lpdwTotal, lpdwFree); @@ -512,7 +455,7 @@ HRESULT __stdcall IDirectDraw__GetAvailableVidMem( HRESULT __stdcall IDirectDraw__GetSurfaceFromDC(IDirectDrawImpl* This, HDC hdc, LPDIRECTDRAWSURFACE7* lplpDDSurface) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_NOTFOUND; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -520,7 +463,7 @@ HRESULT __stdcall IDirectDraw__GetSurfaceFromDC(IDirectDrawImpl* This, HDC hdc, HRESULT __stdcall IDirectDraw__RestoreAllSurfaces(IDirectDrawImpl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE("<- %s\n", __FUNCTION__); return ret; @@ -528,23 +471,23 @@ HRESULT __stdcall IDirectDraw__RestoreAllSurfaces(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__TestCooperativeLevel(IDirectDrawImpl* This) { - TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); - HRESULT ret = dd_TestCooperativeLevel(); + TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = DD_OK; TRACE_EXT("<- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDraw__GetDeviceIdentifier(IDirectDrawImpl* This, LPDDDEVICEIDENTIFIER2 pDDDI, DWORD dwFlags) { - TRACE("-> %s(This=%p, pDDDI=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, pDDDI, dwFlags, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p, pDDDI=%p, dwFlags=%08X)\n", __FUNCTION__, This, pDDDI, dwFlags); HRESULT ret = dd_GetDeviceIdentifier((LPDDDEVICEIDENTIFIER)pDDDI, dwFlags, &This->guid); - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDraw__StartModeTest(IDirectDrawImpl* This, LPSIZE pModes, DWORD dwNumModes, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_CURRENTLYNOTAVAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -552,7 +495,7 @@ HRESULT __stdcall IDirectDraw__StartModeTest(IDirectDrawImpl* This, LPSIZE pMode HRESULT __stdcall IDirectDraw__EvaluateMode(IDirectDrawImpl* This, DWORD dwFlags, DWORD* pTimeout) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 6270c09..304cf69 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -2,31 +2,17 @@ #include "ddclipper.h" #include "debug.h" - HRESULT __stdcall IDirectDrawClipper__QueryInterface(IDirectDrawClipperImpl* This, REFIID riid, LPVOID FAR* ppvObj) { - TRACE( - "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", - __FUNCTION__, - This, - (unsigned int)riid, - ppvObj, - _ReturnAddress()); - + TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); HRESULT ret = E_NOINTERFACE; - - if (!ppvObj) - { - ret = E_INVALIDARG; - } - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirectDrawClipper__AddRef(IDirectDrawClipperImpl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -34,7 +20,7 @@ ULONG __stdcall IDirectDrawClipper__AddRef(IDirectDrawClipperImpl* This) ULONG __stdcall IDirectDrawClipper__Release(IDirectDrawClipperImpl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = --This->ref; @@ -42,11 +28,6 @@ ULONG __stdcall IDirectDrawClipper__Release(IDirectDrawClipperImpl* This) { TRACE(" Released (%p)\n", This); - if (This->region) - DeleteObject(This->region); - - DeleteCriticalSection(&This->cs); - HeapFree(GetProcessHeap(), 0, This); } @@ -60,58 +41,49 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( LPRGNDATA lpClipList, LPDWORD lpdwSiz) { - TRACE( - "-> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p) [%p]\n", - __FUNCTION__, - This, - lpRect, - lpClipList, - lpdwSiz, - _ReturnAddress()); - - HRESULT ret = ddc_GetClipList(This, lpRect, lpClipList, lpdwSiz); - - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = DDERR_NOCLIPLIST; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDrawClipper__GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd) { - TRACE("-> %s(This=%p, lphWnd=%p) [%p]\n", __FUNCTION__, This, lphWnd, _ReturnAddress()); - HRESULT ret = ddc_GetHWnd(This, lphWnd); - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = DDERR_INVALIDOBJECT; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDrawClipper__Initialize(IDirectDrawClipperImpl* This, LPDIRECTDRAW lpDD, DWORD dwFlags) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged) { - TRACE("-> %s(This=%p, lpbChanged=%p) [%p]\n", __FUNCTION__, This, lpbChanged, _ReturnAddress()); - HRESULT ret = ddc_IsClipListChanged(This, lpbChanged); - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = DDERR_INVALIDOBJECT; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { - TRACE("-> %s(This=%p, lpClipList=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, lpClipList, dwFlags, _ReturnAddress()); - HRESULT ret = ddc_SetClipList(This, lpClipList, dwFlags); - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = DD_OK; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDrawClipper__SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) { - TRACE("-> %s(This=%p, dwFlags=%08X, hWnd=%p) [%p]\n", __FUNCTION__, This, dwFlags, hWnd, _ReturnAddress()); - HRESULT ret = ddc_SetHWnd(This, dwFlags, hWnd); - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = DD_OK; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirectDraw/IDirectDrawGammaControl.c b/src/IDirectDraw/IDirectDrawGammaControl.c index d0bd36a..7676bc2 100644 --- a/src/IDirectDraw/IDirectDrawGammaControl.c +++ b/src/IDirectDraw/IDirectDrawGammaControl.c @@ -1,31 +1,17 @@ #include "IDirectDrawGammaControl.h" #include "debug.h" - HRESULT __stdcall IDirectDrawGammaControl__QueryInterface(IDirectDrawGammaControlImpl* This, REFIID riid, LPVOID FAR* ppvObj) { - TRACE( - "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", - __FUNCTION__, - This, - (unsigned int)riid, - ppvObj, - _ReturnAddress()); - + TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); HRESULT ret = E_NOINTERFACE; - - if (!ppvObj) - { - ret = E_INVALIDARG; - } - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirectDrawGammaControl__AddRef(IDirectDrawGammaControlImpl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -33,7 +19,7 @@ ULONG __stdcall IDirectDrawGammaControl__AddRef(IDirectDrawGammaControlImpl* Thi ULONG __stdcall IDirectDrawGammaControl__Release(IDirectDrawGammaControlImpl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = --This->ref; @@ -50,7 +36,7 @@ ULONG __stdcall IDirectDrawGammaControl__Release(IDirectDrawGammaControlImpl* Th HRESULT __stdcall IDirectDrawGammaControl__GetGammaRamp(IDirectDrawGammaControlImpl* This, DWORD dwFlags, LPDDGAMMARAMP lpRampData) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_EXCEPTION; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -58,7 +44,7 @@ HRESULT __stdcall IDirectDrawGammaControl__GetGammaRamp(IDirectDrawGammaControlI HRESULT __stdcall IDirectDrawGammaControl__SetGammaRamp(IDirectDrawGammaControlImpl* This, DWORD dwFlags, LPDDGAMMARAMP lpRampData) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_EXCEPTION; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirectDraw/IDirectDrawPalette.c b/src/IDirectDraw/IDirectDrawPalette.c index 0a6334a..2f7ffc3 100644 --- a/src/IDirectDraw/IDirectDrawPalette.c +++ b/src/IDirectDraw/IDirectDrawPalette.c @@ -6,28 +6,15 @@ HRESULT __stdcall IDirectDrawPalette__QueryInterface(IDirectDrawPaletteImpl* This, REFIID riid, LPVOID FAR* ppvObj) { - TRACE( - "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", - __FUNCTION__, - This, - (unsigned int)riid, - ppvObj, - _ReturnAddress()); - + TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); HRESULT ret = E_NOINTERFACE; - - if (!ppvObj) - { - ret = E_INVALIDARG; - } - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirectDrawPalette__AddRef(IDirectDrawPaletteImpl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -35,7 +22,7 @@ ULONG __stdcall IDirectDrawPalette__AddRef(IDirectDrawPaletteImpl* This) ULONG __stdcall IDirectDrawPalette__Release(IDirectDrawPaletteImpl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = --This->ref; @@ -43,8 +30,8 @@ ULONG __stdcall IDirectDrawPalette__Release(IDirectDrawPaletteImpl* This) { TRACE(" Released (%p)\n", This); - if (g_ddraw.ref) - g_ddraw.last_freed_palette = This; + if (g_ddraw) + g_ddraw->last_freed_palette = This; HeapFree(GetProcessHeap(), 0, This); } @@ -55,7 +42,7 @@ ULONG __stdcall IDirectDrawPalette__Release(IDirectDrawPaletteImpl* This) HRESULT __stdcall IDirectDrawPalette__GetCaps(IDirectDrawPaletteImpl* This, LPDWORD lpdwCaps) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpdwCaps=%p) [%p]\n", __FUNCTION__, This, lpdwCaps, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpdwCaps=%p)\n", __FUNCTION__, This, lpdwCaps); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -69,14 +56,13 @@ HRESULT __stdcall IDirectDrawPalette__GetEntries( LPPALETTEENTRY lpEntries) { TRACE( - "-> %s(This=%p, dwFlags=%08X, dwBase=%u, dwNumEntries=%u, lpEntries=%p) [%p]\n", + "-> %s(This=%p, dwFlags=%08X, dwBase=%u, dwNumEntries=%u, lpEntries=%p)\n", __FUNCTION__, This, dwFlags, dwBase, dwNumEntries, - lpEntries, - _ReturnAddress()); + lpEntries); HRESULT ret = ddp_GetEntries(This, dwFlags, dwBase, dwNumEntries, lpEntries); @@ -90,9 +76,9 @@ HRESULT __stdcall IDirectDrawPalette__Initialize( DWORD dwFlags, LPPALETTEENTRY lpDDColorTable) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } @@ -104,14 +90,13 @@ HRESULT __stdcall IDirectDrawPalette__SetEntries( LPPALETTEENTRY lpEntries) { TRACE_EXT( - "-> %s(This=%p, dwFlags=%08X, dwStartingEntry=%u, dwCount=%u, lpEntries=%p) [%p]\n", + "-> %s(This=%p, dwFlags=%08X, dwStartingEntry=%u, dwCount=%u, lpEntries=%p)\n", __FUNCTION__, This, dwFlags, dwStartingEntry, dwCount, - lpEntries, - _ReturnAddress()); + lpEntries); HRESULT ret = ddp_SetEntries(This, dwFlags, dwStartingEntry, dwCount, lpEntries); diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 7916405..b86f2c4 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -8,14 +8,10 @@ HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* This, REFIID riid, LPVOID FAR* ppvObj) { - TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", __FUNCTION__, This, (unsigned int)riid, ppvObj, _ReturnAddress()); + TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); HRESULT ret = S_OK; - if (!ppvObj) - { - ret = E_INVALIDARG; - } - else if (riid) + if (riid) { if (IsEqualGUID(&IID_IDirectDrawSurface, riid) || IsEqualGUID(&IID_IDirectDrawSurface2, riid) || @@ -27,8 +23,6 @@ HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* Thi IDirectDrawSurface_AddRef(This); - This->queried = TRUE; /* Hack for Baldr Force exe */ - *ppvObj = This; ret = S_OK; @@ -64,7 +58,7 @@ HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* Thi ULONG __stdcall IDirectDrawSurface__AddRef(IDirectDrawSurfaceImpl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -72,67 +66,59 @@ ULONG __stdcall IDirectDrawSurface__AddRef(IDirectDrawSurfaceImpl* This) ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = --This->ref; - if (This->queried && ret == 1) /* Hack for Baldr Force exe */ - { - This->queried = FALSE; - ret = 0; - } - if (This->ref == 0) { TRACE(" Released (%p)\n", This); - if (g_ddraw.ref && (This->caps & DDSCAPS_PRIMARYSURFACE)) + if (g_ddraw && (This->caps & DDSCAPS_PRIMARYSURFACE)) { - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.primary = NULL; - LeaveCriticalSection(&g_ddraw.cs); + EnterCriticalSection(&g_ddraw->cs); + g_ddraw->primary = NULL; + LeaveCriticalSection(&g_ddraw->cs); } if (This->bitmap) { DeleteObject(This->bitmap); - InterlockedDecrement(&g_dds_gdi_handles); } - else if (This->surface && !This->custom_buf) + else if (This->surface) { HeapFree(GetProcessHeap(), 0, This->surface); } - if (This->hdc) + if (This->bnet_bitmap) { - DeleteDC(This->hdc); - InterlockedDecrement(&g_dds_gdi_handles); + DeleteObject(This->bnet_bitmap); } + else if (This->bnet_surface) + { + HeapFree(GetProcessHeap(), 0, This->bnet_surface); + } + + if (This->hdc) + DeleteDC(This->hdc); + + if (This->bnet_dc) + DeleteDC(This->bnet_dc); if (This->bmi) HeapFree(GetProcessHeap(), 0, This->bmi); - if (This->mapping) - CloseHandle(This->mapping); - - if (This->backbuffer && (!g_ddraw.ref || (void*)This->backbuffer != g_ddraw.last_freed_surface)) - { + if (This->backbuffer) IDirectDrawSurface_Release(This->backbuffer); - } if (This->clipper) IDirectDrawClipper_Release(This->clipper); - if (This->palette && (!g_ddraw.ref || (void*)This->palette != g_ddraw.last_freed_palette)) + if (This->palette && (!g_ddraw || (void*)This->palette != g_ddraw->last_freed_palette)) { IDirectDrawPalette_Release(This->palette); } - DeleteCriticalSection(&This->cs); - - if (g_ddraw.ref) - g_ddraw.last_freed_surface = This; - HeapFree(GetProcessHeap(), 0, This); } @@ -142,7 +128,7 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) HRESULT __stdcall IDirectDrawSurface__AddAttachedSurface(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWSURFACE7 lpDDSurface) { - TRACE("-> %s(This=%p, lpDDSurface=%p) [%p]\n", __FUNCTION__, This, lpDDSurface, _ReturnAddress()); + TRACE("-> %s(This=%p, lpDDSurface=%p)\n", __FUNCTION__, This, lpDDSurface); HRESULT ret = dds_AddAttachedSurface(This, (IDirectDrawSurfaceImpl*)lpDDSurface); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -150,7 +136,7 @@ HRESULT __stdcall IDirectDrawSurface__AddAttachedSurface(IDirectDrawSurfaceImpl* HRESULT __stdcall IDirectDrawSurface__AddOverlayDirtyRect(IDirectDrawSurfaceImpl* This, LPRECT lpRect) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -165,15 +151,14 @@ HRESULT __stdcall IDirectDrawSurface__Blt( LPDDBLTFX lpDDBltFx) { TRACE_EXT( - "-> %s(This=%p, lpDestRect=%p, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X, lpDDBltFx=%p) [%p]\n", + "-> %s(This=%p, lpDestRect=%p, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X, lpDDBltFx=%p)\n", __FUNCTION__, This, lpDestRect, lpDDSrcSurface, lpSrcRect, dwFlags, - lpDDBltFx, - _ReturnAddress()); + lpDDBltFx); HRESULT ret = dds_Blt(This, lpDestRect, (IDirectDrawSurfaceImpl*)lpDDSrcSurface, lpSrcRect, dwFlags, lpDDBltFx); @@ -187,7 +172,7 @@ HRESULT __stdcall IDirectDrawSurface__BltBatch( DWORD dwCount, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -202,15 +187,14 @@ HRESULT __stdcall IDirectDrawSurface__BltFast( DWORD dwFlags) { TRACE_EXT( - "-> %s(This=%p, dwX=%d, dwY=%d, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X) [%p]\n", + "-> %s(This=%p, dwX=%d, dwY=%d, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X)\n", __FUNCTION__, This, dwX, dwY, lpDDSrcSurface, lpSrcRect, - dwFlags, - _ReturnAddress()); + dwFlags); HRESULT ret = dds_BltFast(This, dwX, dwY, (IDirectDrawSurfaceImpl*)lpDDSrcSurface, lpSrcRect, dwFlags); @@ -223,7 +207,7 @@ HRESULT __stdcall IDirectDrawSurface__DeleteAttachedSurface( DWORD dwFlags, LPDIRECTDRAWSURFACE7 lpDDSurface) { - TRACE("-> %s(This=%p, dwFlags=%08X, lpDDSurface=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpDDSurface, _ReturnAddress()); + TRACE("-> %s(This=%p, dwFlags=%08X, lpDDSurface=%p)\n", __FUNCTION__, This, dwFlags, lpDDSurface); HRESULT ret = dds_DeleteAttachedSurface(This, dwFlags, (IDirectDrawSurfaceImpl*)lpDDSurface); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -235,12 +219,11 @@ HRESULT __stdcall IDirectDrawSurface__EnumAttachedSurfaces( LPDDENUMSURFACESCALLBACK7 lpEnumSurfacesCallback) { TRACE( - "-> %s(This=%p, lpContext=%p, lpEnumSurfacesCallback=%p) [%p]\n", + "-> %s(This=%p, lpContext=%p, lpEnumSurfacesCallback=%p)\n", __FUNCTION__, This, lpContext, - lpEnumSurfacesCallback, - _ReturnAddress()); + lpEnumSurfacesCallback); HRESULT ret = dds_EnumAttachedSurfaces(This, lpContext, (LPDDENUMSURFACESCALLBACK)lpEnumSurfacesCallback); @@ -254,7 +237,7 @@ HRESULT __stdcall IDirectDrawSurface__EnumOverlayZOrders( LPVOID lpContext, LPDDENUMSURFACESCALLBACK7 lpfnCallback) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -266,12 +249,11 @@ HRESULT __stdcall IDirectDrawSurface__Flip( DWORD dwFlags) { TRACE_EXT( - "-> %s(This=%p, lpDDSurfaceTargetOverride=%p, dwFlags=%08X) [%p]\n", + "-> %s(This=%p, lpDDSurfaceTargetOverride=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpDDSurfaceTargetOverride, - dwFlags, - _ReturnAddress()); + dwFlags); HRESULT ret = dds_Flip(This, (IDirectDrawSurfaceImpl*)lpDDSurfaceTargetOverride, dwFlags); @@ -284,31 +266,23 @@ HRESULT __stdcall IDirectDrawSurface__GetAttachedSurface( LPDDSCAPS2 lpDdsCaps, LPDIRECTDRAWSURFACE7 FAR* lpDDsurface) { - TRACE( - "-> %s(This=%p, dwCaps=%08X, lpDDsurface=%p) [%p]\n", - __FUNCTION__, - This, - lpDdsCaps->dwCaps, - lpDDsurface, - _ReturnAddress()); - + TRACE("-> %s(This=%p, dwCaps=%08X, lpDDsurface=%p)\n", __FUNCTION__, This, lpDdsCaps->dwCaps, lpDDsurface); HRESULT ret = dds_GetAttachedSurface(This, (LPDDSCAPS)lpDdsCaps, (IDirectDrawSurfaceImpl**)lpDDsurface); - TRACE("<- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDrawSurface__GetBltStatus(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - //TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - //TRACE_EXT("<- %s\n", __FUNCTION__); + TRACE_EXT("<- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDrawSurface__GetCaps(IDirectDrawSurfaceImpl* This, LPDDSCAPS2 lpDDSCaps) { - TRACE("-> %s(This=%p, lpDDSCaps=%p) [%p]\n", __FUNCTION__, This, lpDDSCaps, _ReturnAddress()); + TRACE("-> %s(This=%p, lpDDSCaps=%p)\n", __FUNCTION__, This, lpDDSCaps); HRESULT ret = dds_GetCaps(This, (LPDDSCAPS)lpDDSCaps); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -316,7 +290,7 @@ HRESULT __stdcall IDirectDrawSurface__GetCaps(IDirectDrawSurfaceImpl* This, LPDD HRESULT __stdcall IDirectDrawSurface__GetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER FAR* lpClipper) { - TRACE_EXT("-> %s(This=%p, lpClipper=%p) [%p]\n", __FUNCTION__, This, lpClipper, _ReturnAddress()); + TRACE_EXT("-> %s(This=%p, lpClipper=%p)\n", __FUNCTION__, This, lpClipper); HRESULT ret = dds_GetClipper(This, (IDirectDrawClipperImpl**)lpClipper); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -324,7 +298,7 @@ HRESULT __stdcall IDirectDrawSurface__GetClipper(IDirectDrawSurfaceImpl* This, L HRESULT __stdcall IDirectDrawSurface__GetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey) { - TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpColorKey, _ReturnAddress()); + TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p)\n", __FUNCTION__, This, dwFlags, lpColorKey); HRESULT ret = dds_GetColorKey(This, dwFlags, lpColorKey); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -332,7 +306,7 @@ HRESULT __stdcall IDirectDrawSurface__GetColorKey(IDirectDrawSurfaceImpl* This, HRESULT __stdcall IDirectDrawSurface__GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) { - TRACE_EXT("-> %s(This=%p, lpHDC=%p) [%p]\n", __FUNCTION__, This, lpHDC, _ReturnAddress()); + TRACE_EXT("-> %s(This=%p, lpHDC=%p)\n", __FUNCTION__, This, lpHDC); HRESULT ret = dds_GetDC(This, lpHDC); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -340,7 +314,7 @@ HRESULT __stdcall IDirectDrawSurface__GetDC(IDirectDrawSurfaceImpl* This, HDC FA HRESULT __stdcall IDirectDrawSurface__GetFlipStatus(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE_EXT("-> %s(This=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, dwFlags, _ReturnAddress()); + TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -348,7 +322,7 @@ HRESULT __stdcall IDirectDrawSurface__GetFlipStatus(IDirectDrawSurfaceImpl* This HRESULT __stdcall IDirectDrawSurface__GetOverlayPosition(IDirectDrawSurfaceImpl* This, LPLONG lplX, LPLONG lplY) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_NOTAOVERLAYSURFACE; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -356,7 +330,7 @@ HRESULT __stdcall IDirectDrawSurface__GetOverlayPosition(IDirectDrawSurfaceImpl* HRESULT __stdcall IDirectDrawSurface__GetPalette(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWPALETTE FAR* lplpDDPalette) { - TRACE("-> %s(This=%p, lplpDDPalette=%p) [%p]\n", __FUNCTION__, This, lplpDDPalette, _ReturnAddress()); + TRACE("-> %s(This=%p, lplpDDPalette=%p)\n", __FUNCTION__, This, lplpDDPalette); HRESULT ret = dds_GetPalette(This, (IDirectDrawPaletteImpl**)lplpDDPalette); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -364,7 +338,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPalette(IDirectDrawSurfaceImpl* This, L HRESULT __stdcall IDirectDrawSurface__GetPixelFormat(IDirectDrawSurfaceImpl* This, LPDDPIXELFORMAT ddpfPixelFormat) { - TRACE_EXT("-> %s(This=%p, ...) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE_EXT("-> %s(This=%p, ...)\n", __FUNCTION__, This); HRESULT ret = dds_GetPixelFormat(This, ddpfPixelFormat); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -372,7 +346,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPixelFormat(IDirectDrawSurfaceImpl* Thi HRESULT __stdcall IDirectDrawSurface__GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSurfaceDesc) { - TRACE_EXT("-> %s(This=%p, lpDDSurfaceDesc=%p) [%p]\n", __FUNCTION__, This, lpDDSurfaceDesc, _ReturnAddress()); + TRACE_EXT("-> %s(This=%p, lpDDSurfaceDesc=%p)\n", __FUNCTION__, This, lpDDSurfaceDesc); HRESULT ret = dds_GetSurfaceDesc(This, (LPDDSURFACEDESC)lpDDSurfaceDesc); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -383,17 +357,17 @@ HRESULT __stdcall IDirectDrawSurface__Initialize( LPDIRECTDRAW lpDD, LPDDSURFACEDESC2 lpDDSurfaceDesc) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDrawSurface__IsLost(IDirectDrawSurfaceImpl* This) { - //TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - //TRACE_EXT("<- %s\n", __FUNCTION__); + TRACE_EXT("<- %s\n", __FUNCTION__); return ret; } @@ -405,14 +379,13 @@ HRESULT __stdcall IDirectDrawSurface__Lock( HANDLE hEvent) { TRACE_EXT( - "-> %s(This=%p, lpDestRect=%p, lpDDSurfaceDesc=%p, dwFlags=%08X, hEvent=%p) [%p]\n", + "-> %s(This=%p, lpDestRect=%p, lpDDSurfaceDesc=%p, dwFlags=%08X, hEvent=%p)\n", __FUNCTION__, This, lpDestRect, lpDDSurfaceDesc, dwFlags, - hEvent, - _ReturnAddress()); + hEvent); HRESULT ret = dds_Lock(This, lpDestRect, (LPDDSURFACEDESC)lpDDSurfaceDesc, dwFlags, hEvent); @@ -422,7 +395,7 @@ HRESULT __stdcall IDirectDrawSurface__Lock( HRESULT __stdcall IDirectDrawSurface__ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) { - TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = dds_ReleaseDC(This, hDC); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -430,7 +403,7 @@ HRESULT __stdcall IDirectDrawSurface__ReleaseDC(IDirectDrawSurfaceImpl* This, HD HRESULT __stdcall IDirectDrawSurface__Restore(IDirectDrawSurfaceImpl* This) { - TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -438,7 +411,7 @@ HRESULT __stdcall IDirectDrawSurface__Restore(IDirectDrawSurfaceImpl* This) HRESULT __stdcall IDirectDrawSurface__SetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER lpClipper) { - TRACE("-> %s(This=%p, lpClipper=%p) [%p]\n", __FUNCTION__, This, lpClipper, _ReturnAddress()); + TRACE("-> %s(This=%p, lpClipper=%p)\n", __FUNCTION__, This, lpClipper); HRESULT ret = dds_SetClipper(This, (IDirectDrawClipperImpl*)lpClipper); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -446,7 +419,7 @@ HRESULT __stdcall IDirectDrawSurface__SetClipper(IDirectDrawSurfaceImpl* This, L HRESULT __stdcall IDirectDrawSurface__SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey) { - TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpColorKey, _ReturnAddress()); + TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p)\n", __FUNCTION__, This, dwFlags, lpColorKey); HRESULT ret = dds_SetColorKey(This, dwFlags, lpColorKey); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -454,7 +427,7 @@ HRESULT __stdcall IDirectDrawSurface__SetColorKey(IDirectDrawSurfaceImpl* This, HRESULT __stdcall IDirectDrawSurface__SetOverlayPosition(IDirectDrawSurfaceImpl* This, LONG lX, LONG lY) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -462,7 +435,7 @@ HRESULT __stdcall IDirectDrawSurface__SetOverlayPosition(IDirectDrawSurfaceImpl* HRESULT __stdcall IDirectDrawSurface__SetPalette(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWPALETTE lpDDPalette) { - TRACE("-> %s(This=%p, lpDDPalette=%p) [%p]\n", __FUNCTION__, This, lpDDPalette, _ReturnAddress()); + TRACE("-> %s(This=%p, lpDDPalette=%p)\n", __FUNCTION__, This, lpDDPalette); HRESULT ret = dds_SetPalette(This, (IDirectDrawPaletteImpl*)lpDDPalette); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -470,7 +443,7 @@ HRESULT __stdcall IDirectDrawSurface__SetPalette(IDirectDrawSurfaceImpl* This, L HRESULT __stdcall IDirectDrawSurface__Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) { - TRACE_EXT("-> %s(This=%p, lpRect=%p) [%p]\n", __FUNCTION__, This, lpRect, _ReturnAddress()); + TRACE_EXT("-> %s(This=%p, lpRect=%p)\n", __FUNCTION__, This, lpRect); HRESULT ret = dds_Unlock(This, lpRect); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -484,7 +457,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlay( DWORD dwFlags, LPDDOVERLAYFX lpDDOverlayFx) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -492,7 +465,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlay( HRESULT __stdcall IDirectDrawSurface__UpdateOverlayDisplay(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -503,7 +476,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlayZOrder( DWORD dwFlags, LPDIRECTDRAWSURFACE7 lpDDSReference) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -511,7 +484,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlayZOrder( HRESULT __stdcall IDirectDrawSurface__GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = dds_GetDDInterface(This, lplpDD); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -519,7 +492,7 @@ HRESULT __stdcall IDirectDrawSurface__GetDDInterface(IDirectDrawSurfaceImpl* Thi HRESULT __stdcall IDirectDrawSurface__PageLock(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -527,7 +500,7 @@ HRESULT __stdcall IDirectDrawSurface__PageLock(IDirectDrawSurfaceImpl* This, DWO HRESULT __stdcall IDirectDrawSurface__PageUnlock(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -535,9 +508,9 @@ HRESULT __stdcall IDirectDrawSurface__PageUnlock(IDirectDrawSurfaceImpl* This, D HRESULT __stdcall IDirectDrawSurface__SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags) { - TRACE("-> %s(This=%p, lpDDSD=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, lpDDSD, dwFlags, _ReturnAddress()); - HRESULT ret = dds_SetSurfaceDesc(This, lpDDSD, dwFlags); - TRACE("<- %s\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + HRESULT ret = DDERR_UNSUPPORTED; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } @@ -548,7 +521,7 @@ HRESULT __stdcall IDirectDrawSurface__SetPrivateData( DWORD dwSize, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_OUTOFMEMORY; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -560,7 +533,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPrivateData( LPVOID lpBuffer, LPDWORD lpdwBufferSize) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_NOTFOUND; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -568,7 +541,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPrivateData( HRESULT __stdcall IDirectDrawSurface__FreePrivateData(IDirectDrawSurfaceImpl* This, REFGUID rtag) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -576,7 +549,7 @@ HRESULT __stdcall IDirectDrawSurface__FreePrivateData(IDirectDrawSurfaceImpl* Th HRESULT __stdcall IDirectDrawSurface__GetUniquenessValue(IDirectDrawSurfaceImpl* This, LPDWORD lpdwValue) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -584,7 +557,7 @@ HRESULT __stdcall IDirectDrawSurface__GetUniquenessValue(IDirectDrawSurfaceImpl* HRESULT __stdcall IDirectDrawSurface__ChangeUniquenessValue(IDirectDrawSurfaceImpl* This) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -592,7 +565,7 @@ HRESULT __stdcall IDirectDrawSurface__ChangeUniquenessValue(IDirectDrawSurfaceIm HRESULT __stdcall IDirectDrawSurface__SetPriority(IDirectDrawSurfaceImpl* This, DWORD dwPrio) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -600,7 +573,7 @@ HRESULT __stdcall IDirectDrawSurface__SetPriority(IDirectDrawSurfaceImpl* This, HRESULT __stdcall IDirectDrawSurface__GetPriority(IDirectDrawSurfaceImpl* This, LPDWORD lpdwPrio) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -608,7 +581,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPriority(IDirectDrawSurfaceImpl* This, HRESULT __stdcall IDirectDrawSurface__SetLOD(IDirectDrawSurfaceImpl* This, DWORD dwLod) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -616,7 +589,7 @@ HRESULT __stdcall IDirectDrawSurface__SetLOD(IDirectDrawSurfaceImpl* This, DWORD HRESULT __stdcall IDirectDrawSurface__GetLOD(IDirectDrawSurfaceImpl* This, LPDWORD lpdwLod) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/blt.c b/src/blt.c deleted file mode 100644 index 166e3dd..0000000 --- a/src/blt.c +++ /dev/null @@ -1,794 +0,0 @@ -#include -#include -#include "debug.h" -#include "blt.h" - - -BOOL g_blt_use_avx; - -void blt_copy( - unsigned char* dst, - unsigned char* src, - size_t size) -{ -#if defined(_MSC_VER) || defined(__AVX__) - if (!((DWORD)dst % 64) && !((DWORD)src % 64)) - { - if (size >= 1024 * 4096 && g_blt_use_avx) - { - _mm_prefetch((const char*)(src), _MM_HINT_NTA); - - while (size >= 256) - { - __m256i c0 = _mm256_load_si256(((const __m256i*)src) + 0); - __m256i c1 = _mm256_load_si256(((const __m256i*)src) + 1); - __m256i c2 = _mm256_load_si256(((const __m256i*)src) + 2); - __m256i c3 = _mm256_load_si256(((const __m256i*)src) + 3); - __m256i c4 = _mm256_load_si256(((const __m256i*)src) + 4); - __m256i c5 = _mm256_load_si256(((const __m256i*)src) + 5); - __m256i c6 = _mm256_load_si256(((const __m256i*)src) + 6); - __m256i c7 = _mm256_load_si256(((const __m256i*)src) + 7); - - _mm_prefetch((const char*)(src + 512), _MM_HINT_NTA); - - _mm256_stream_si256((((__m256i*)dst) + 0), c0); - _mm256_stream_si256((((__m256i*)dst) + 1), c1); - _mm256_stream_si256((((__m256i*)dst) + 2), c2); - _mm256_stream_si256((((__m256i*)dst) + 3), c3); - _mm256_stream_si256((((__m256i*)dst) + 4), c4); - _mm256_stream_si256((((__m256i*)dst) + 5), c5); - _mm256_stream_si256((((__m256i*)dst) + 6), c6); - _mm256_stream_si256((((__m256i*)dst) + 7), c7); - - src += 256; - dst += 256; - size -= 256; - } - - _mm_sfence(); - _mm256_zeroupper(); - } - else if (size < 1024 * 100 && g_blt_use_avx) - { - while (size >= 128) - { - __m256i c0 = _mm256_load_si256(((const __m256i*)src) + 0); - __m256i c1 = _mm256_load_si256(((const __m256i*)src) + 1); - __m256i c2 = _mm256_load_si256(((const __m256i*)src) + 2); - __m256i c3 = _mm256_load_si256(((const __m256i*)src) + 3); - - _mm256_store_si256((((__m256i*)dst) + 0), c0); - _mm256_store_si256((((__m256i*)dst) + 1), c1); - _mm256_store_si256((((__m256i*)dst) + 2), c2); - _mm256_store_si256((((__m256i*)dst) + 3), c3); - - src += 128; - dst += 128; - size -= 128; - } - - _mm256_zeroupper(); - } - else if (size >= 1024 * 100) - { - __movsb(dst, src, size); - - size = 0; - } - - /* memcpy below handles the remainder */ - } -#endif - - if (size > 0) - { - memcpy(dst, src, size); - } -} - -void blt_clean( - unsigned char* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned char* src, - int src_x, - int src_y, - int src_p, - int bpp) -{ - int bytes_pp = bpp / 8; - - size_t size = dst_w * bytes_pp; - - src += (src_x * bytes_pp) + (src_p * src_y); - dst += (dst_x * bytes_pp) + (dst_p * dst_y); - - if (size == dst_p && dst_p == src_p) - { - blt_copy(dst, src, dst_p * dst_h); - } - else - { - for (int i = 0; i < dst_h; i++) - { - blt_copy(dst, src, size); - - src += src_p; - dst += dst_p; - } - } -} - -void blt_overlap( - unsigned char* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned char* src, - int src_x, - int src_y, - int src_p, - int bpp) -{ - int bytes_pp = bpp / 8; - - size_t size = dst_w * bytes_pp; - - src += (src_x * bytes_pp) + (src_p * src_y); - dst += (dst_x * bytes_pp) + (dst_p * dst_y); - - if (dst_y > src_y) - { - src += src_p * dst_h; - dst += dst_p * dst_h; - - for (int i = dst_h; i-- > 0;) - { - src -= src_p; - dst -= dst_p; - - memmove(dst, src, size); - } - } - else if (size == dst_p && dst_p == src_p) - { - memmove(dst, src, dst_p * dst_h); - } - else - { - for (int i = 0; i < dst_h; i++) - { - memmove(dst, src, size); - - src += src_p; - dst += dst_p; - } - } -} - -void blt_colorkey( - unsigned char* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned char* src, - int src_x, - int src_y, - int src_p, - unsigned int key_low, - unsigned int key_high, - int bpp) -{ - int bytes_pp = bpp / 8; - - size_t s_a = (src_p / bytes_pp) - dst_w; - size_t d_a = (dst_p / bytes_pp) - dst_w; - - src += (src_x * bytes_pp) + (src_p * src_y); - dst += (dst_x * bytes_pp) + (dst_p * dst_y); - - if (bpp == 8) - { - unsigned char key_l = (unsigned char)key_low; - unsigned char key_h = (unsigned char)key_high; - - if (key_l == key_h) - { - for (unsigned char* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) - { - for (unsigned char* w_end = dst + dst_w; dst < w_end;) - { - unsigned char c = *src++; - - if (c != key_l) - { - *dst = c; - } - - dst++; - } - - src += s_a; - dst += d_a; - } - } - else - { - for (unsigned char* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) - { - for (unsigned char* w_end = dst + dst_w; dst < w_end;) - { - unsigned char c = *src++; - - if (c < key_l || c > key_h) - { - *dst = c; - } - - dst++; - } - - src += s_a; - dst += d_a; - } - } - } - else if (bpp == 16) - { - unsigned short key_l = (unsigned short)key_low; - unsigned short key_h = (unsigned short)key_high; - - unsigned short* d = (unsigned short*)dst; - unsigned short* s = (unsigned short*)src; - - if (key_l == key_h) - { - for (unsigned short* h_end = d + dst_h * (dst_w + d_a); d < h_end;) - { - for (unsigned short* w_end = d + dst_w; d < w_end;) - { - unsigned short c = *s++; - - if (c != key_l) - { - *d = c; - } - - d++; - } - - s += s_a; - d += d_a; - } - } - else - { - for (unsigned short* h_end = d + dst_h * (dst_w + d_a); d < h_end;) - { - for (unsigned short* w_end = d + dst_w; d < w_end;) - { - unsigned short c = *s++; - - if (c < key_l || c > key_h) - { - *d = c; - } - - d++; - } - - s += s_a; - d += d_a; - } - } - } - else if (bpp == 32) - { - unsigned int key_l = key_low & 0xFFFFFF; - unsigned int key_h = key_high & 0xFFFFFF; - - unsigned int* d = (unsigned int*)dst; - unsigned int* s = (unsigned int*)src; - - if (key_l == key_h) - { - for (unsigned int* h_end = d + dst_h * (dst_w + d_a); d < h_end;) - { - for (unsigned int* w_end = d + dst_w; d < w_end;) - { - unsigned int c = *s++; - - if ((c & 0xFFFFFF) != key_l) - { - *d = c; - } - - d++; - } - - s += s_a; - d += d_a; - } - } - else - { - for (unsigned int* h_end = d + dst_h * (dst_w + d_a); d < h_end;) - { - for (unsigned int* w_end = d + dst_w; d < w_end;) - { - unsigned int c = *s++; - - if ((c & 0xFFFFFF) < key_l || (c & 0xFFFFFF) > key_h) - { - *d = c; - } - - d++; - } - - s += s_a; - d += d_a; - } - } - } -} - -void blt_colorkey_mirror_stretch( - unsigned char* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned char* src, - int src_x, - int src_y, - int src_w, - int src_h, - int src_p, - unsigned int key_low, - unsigned int key_high, - BOOL mirror_up_down, - BOOL mirror_left_right, - int bpp) -{ - int bytes_pp = bpp / 8; - - int dst_surf_w = dst_p / bytes_pp; - int src_surf_w = src_p / bytes_pp; - - float scale_w = (float)src_w / dst_w; - float scale_h = (float)src_h / dst_h; - - if (bpp == 8) - { - unsigned char key_l = (unsigned char)key_low; - unsigned char key_h = (unsigned char)key_high; - - for (int y = 0; y < dst_h; y++) - { - int scaled_y = (int)(y * scale_h); - - if (mirror_up_down) - scaled_y = src_h - 1 - scaled_y; - - int src_row = src_x + src_surf_w * (scaled_y + src_y); - int dst_row = dst_x + dst_surf_w * (y + dst_y); - - for (int x = 0; x < dst_w; x++) - { - int scaled_x = (int)(x * scale_w); - - if (mirror_left_right) - scaled_x = src_w - 1 - scaled_x; - - unsigned char c = ((unsigned char*)src)[scaled_x + src_row]; - - if (c < key_l || c > key_h) - { - ((unsigned char*)dst)[x + dst_row] = c; - } - } - } - } - else if (bpp == 16) - { - unsigned short key_l = (unsigned short)key_low; - unsigned short key_h = (unsigned short)key_high; - - for (int y = 0; y < dst_h; y++) - { - int scaled_y = (int)(y * scale_h); - - if (mirror_up_down) - scaled_y = src_h - 1 - scaled_y; - - int src_row = src_x + src_surf_w * (scaled_y + src_y); - int dst_row = dst_x + dst_surf_w * (y + dst_y); - - for (int x = 0; x < dst_w; x++) - { - int scaled_x = (int)(x * scale_w); - - if (mirror_left_right) - scaled_x = src_w - 1 - scaled_x; - - unsigned short c = ((unsigned short*)src)[scaled_x + src_row]; - - if (c < key_l || c > key_h) - { - ((unsigned short*)dst)[x + dst_row] = c; - } - } - } - } - else if (bpp == 32) - { - unsigned int key_l = key_low & 0xFFFFFF; - unsigned int key_h = key_high & 0xFFFFFF; - - for (int y = 0; y < dst_h; y++) - { - int scaled_y = (int)(y * scale_h); - - if (mirror_up_down) - scaled_y = src_h - 1 - scaled_y; - - int src_row = src_x + src_surf_w * (scaled_y + src_y); - int dst_row = dst_x + dst_surf_w * (y + dst_y); - - for (int x = 0; x < dst_w; x++) - { - int scaled_x = (int)(x * scale_w); - - if (mirror_left_right) - scaled_x = src_w - 1 - scaled_x; - - unsigned int c = ((unsigned int*)src)[scaled_x + src_row]; - - if ((c & 0xFFFFFF) < key_l || (c & 0xFFFFFF) > key_h) - { - ((unsigned int*)dst)[x + dst_row] = c; - } - } - } - } -} - -void blt_clear( - unsigned char* dst, - char color, - size_t size) -{ -#if defined(_MSC_VER) || defined(__AVX__) - if (size < 1024 * 100 && g_blt_use_avx && !((DWORD)dst % 32)) - { - __m256i c0 = _mm256_set1_epi8(color); - - while (size >= 128) - { - _mm256_store_si256((((__m256i*)dst) + 0), c0); - _mm256_store_si256((((__m256i*)dst) + 1), c0); - _mm256_store_si256((((__m256i*)dst) + 2), c0); - _mm256_store_si256((((__m256i*)dst) + 3), c0); - - dst += 128; - size -= 128; - } - - _mm256_zeroupper(); - - /* memset below handles the remainder */ - } -#endif - - if (size >= 1024 * 100) - { - __stosb(dst, color, size); - } - else - { - memset(dst, color, size); - } -} - -void blt_colorfill( - unsigned char* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned int color, - int bpp) -{ - int bytes_pp = bpp / 8; - - size_t size = dst_w * bytes_pp; - - dst += (dst_x * bytes_pp) + (dst_p * dst_y); - - if (bpp == 8 || - (bpp == 16 && - (color & 0xFF) == ((color >> 8) & 0xFF)) || - ((bpp == 32 || bpp == 24) && - (color & 0xFF) == ((color >> 8) & 0xFF) && - (color & 0xFF) == ((color >> 16) & 0xFF) && - (color & 0xFF) == ((color >> 24) & 0xFF))) - { - if (size == dst_p) - { - blt_clear(dst, color, dst_p * dst_h); - } - else - { - for (int i = 0; i < dst_h; i++) - { - blt_clear(dst, color, size); - dst += dst_p; - } - } - } - else if (bpp == 16) - { - unsigned short* first_row = (unsigned short*)dst; - - for (int x = 0; x < dst_w; x++) - { - first_row[x] = (unsigned short)color; - } - - for (int i = 1; i < dst_h; i++) - { - dst += dst_p; - blt_copy(dst, (void*)first_row, size); - } - } - else if (bpp == 32) - { - unsigned int* first_row = (unsigned int*)dst; - - for (int x = 0; x < dst_w; x++) - { - first_row[x] = color; - } - - for (int i = 1; i < dst_h; i++) - { - dst += dst_p; - blt_copy(dst, (void*)first_row, size); - } - } -} - -void blt_rgb565_to_rgba8888( - unsigned int* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned short* src, - int src_x, - int src_y, - int src_p) -{ - size_t s_a = (src_p / sizeof(src[0])) - dst_w; - size_t d_a = (dst_p / sizeof(dst[0])) - dst_w; - - src += src_x + ((src_p / sizeof(src[0])) * src_y); - dst += dst_x + ((dst_p / sizeof(dst[0])) * dst_y); - - for (unsigned int* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) - { - for (unsigned int* w_end = dst + dst_w; dst < w_end;) - { - unsigned short pixel = *src++; - - BYTE r = ((pixel & 0xF800) >> 11) << 3; - BYTE g = ((pixel & 0x07E0) >> 5) << 2; - BYTE b = ((pixel & 0x001F)) << 3; - - *dst++ = (0xFF << 24) | (b << 16) | (g << 8) | r; - } - - src += s_a; - dst += d_a; - } -} - -void blt_rgb555_to_rgba8888( - unsigned int* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned short* src, - int src_x, - int src_y, - int src_p) -{ - size_t s_a = (src_p / sizeof(src[0])) - dst_w; - size_t d_a = (dst_p / sizeof(dst[0])) - dst_w; - - src += src_x + ((src_p / sizeof(src[0])) * src_y); - dst += dst_x + ((dst_p / sizeof(dst[0])) * dst_y); - - for (unsigned int* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) - { - for (unsigned int* w_end = dst + dst_w; dst < w_end;) - { - unsigned short pixel = *src++; - - BYTE r = ((pixel & 0x7C00) >> 10) << 3; - BYTE g = ((pixel & 0x03E0) >> 5) << 3; - BYTE b = ((pixel & 0x001F)) << 3; - - *dst++ = (0xFF << 24) | (b << 16) | (g << 8) | r; - } - - src += s_a; - dst += d_a; - } -} - -void blt_bgra8888_to_rgba8888( - unsigned int* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned int* src, - int src_x, - int src_y, - int src_p) -{ - size_t s_a = (src_p / sizeof(src[0])) - dst_w; - size_t d_a = (dst_p / sizeof(dst[0])) - dst_w; - - src += src_x + ((src_p / sizeof(src[0])) * src_y); - dst += dst_x + ((dst_p / sizeof(dst[0])) * dst_y); - - for (unsigned int* h_end = dst + dst_h * (dst_w + d_a); dst < h_end;) - { - for (unsigned int* w_end = dst + dst_w; dst < w_end;) - { - unsigned int pixel = *src++; - - BYTE r = pixel >> 16; - BYTE g = pixel >> 8; - BYTE b = pixel; - - *dst++ = (0xFF << 24) | (b << 16) | (g << 8) | r; - } - - src += s_a; - dst += d_a; - } -} - -void blt_stretch( - unsigned char* dst, - int dst_x, - int dst_y, - int dst_w, - int dst_h, - int dst_p, - unsigned char* src, - int src_x, - int src_y, - int src_w, - int src_h, - int src_p, - int bpp) -{ - int bytes_pp = bpp / 8; - - size_t size = dst_w * bytes_pp; - - int dst_surf_w = dst_p / bytes_pp; - int src_surf_w = src_p / bytes_pp; - - float scale_w = (float)src_w / dst_w; - float scale_h = (float)src_h / dst_h; - - int last_y = -1; - int last_row = -1; - - if (bpp == 8) - { - unsigned char* d = (unsigned char*)dst; - unsigned char* s = (unsigned char*)src; - - for (int y = 0; y < dst_h; y++) - { - int scaled_y = (int)(y * scale_h); - int dst_row = dst_x + dst_surf_w * (y + dst_y); - - if (scaled_y == last_y) - { - blt_copy(&d[dst_row], &d[last_row], size); - continue; - } - - last_y = scaled_y; - last_row = dst_row; - - int src_row = src_x + src_surf_w * (scaled_y + src_y); - - for (int x = 0; x < dst_w; x++) - { - int scaled_x = (int)(x * scale_w); - - d[x + dst_row] = s[scaled_x + src_row]; - } - } - } - else if (bpp == 16) - { - unsigned short* d = (unsigned short*)dst; - unsigned short* s = (unsigned short*)src; - - for (int y = 0; y < dst_h; y++) - { - int scaled_y = (int)(y * scale_h); - int dst_row = dst_x + dst_surf_w * (y + dst_y); - - if (scaled_y == last_y) - { - blt_copy((void*)&d[dst_row], (void*)&d[last_row], size); - continue; - } - - last_y = scaled_y; - last_row = dst_row; - - int src_row = src_x + src_surf_w * (scaled_y + src_y); - - for (int x = 0; x < dst_w; x++) - { - int scaled_x = (int)(x * scale_w); - - d[x + dst_row] = s[scaled_x + src_row]; - } - } - } - else if (bpp == 32) - { - unsigned int* d = (unsigned int*)dst; - unsigned int* s = (unsigned int*)src; - - for (int y = 0; y < dst_h; y++) - { - int scaled_y = (int)(y * scale_h); - int dst_row = dst_x + dst_surf_w * (y + dst_y); - - if (scaled_y == last_y) - { - blt_copy((void*)&d[dst_row], (void*)&d[last_row], size); - continue; - } - - last_y = scaled_y; - last_row = dst_row; - - int src_row = src_x + src_surf_w * (scaled_y + src_y); - - for (int x = 0; x < dst_w; x++) - { - int scaled_x = (int)(x * scale_w); - - d[x + dst_row] = s[scaled_x + src_row]; - } - } - } -} diff --git a/src/config.c b/src/config.c index 36b756a..2bbfa04 100644 --- a/src/config.c +++ b/src/config.c @@ -9,124 +9,190 @@ #include "render_ogl.h" #include "hook.h" #include "debug.h" -#include "dllmain.h" -#include "ini.h" -#include "versionhelpers.h" + +#define FILE_EXISTS(a) (GetFileAttributes(a) != INVALID_FILE_ATTRIBUTES) static void cfg_init(); static void cfg_create_ini(); -static BOOL cfg_get_bool(LPCSTR key, BOOL default_value); -static int cfg_get_int(LPCSTR key, int default_value); -static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size); -static DWORD cfg_get_game_section(LPSTR buf, DWORD size); - -#define GET_INT(a,b,c) a = cfg_get_int(b, c); TRACE("%s=%d\n", b, a) -#define GET_BOOL(a,b,c) a = cfg_get_bool(b, c); TRACE("%s=%s\n", b, a ? "true" : "false") -#define GET_STRING(a,b,c,d) cfg_get_string(a, b, c, d); TRACE("%s=%s\n", a, c) CNCDDRAWCONFIG g_config = { .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1, .upscaled_state = -1 }; void cfg_load() { + char tmp[256]; + cfg_init(); - /* Optional settings */ + /* load settings from ini */ + g_ddraw->windowed = cfg_get_bool("windowed", FALSE); + g_ddraw->border = cfg_get_bool("border", TRUE); + g_ddraw->boxing = cfg_get_bool("boxing", FALSE); + g_ddraw->maintas = cfg_get_bool("maintas", FALSE); + g_ddraw->adjmouse = + cfg_get_bool("adjmouse", TRUE) || + !cfg_get_bool("handlemouse", TRUE) || + FILE_EXISTS(".\\plugin\\HardwareCursor.w2p"); - GET_INT(g_config.window_rect.right, "width", 0); - GET_INT(g_config.window_rect.bottom, "height", 0); - GET_BOOL(g_config.fullscreen, "fullscreen", FALSE); - GET_BOOL(g_config.windowed, "windowed", FALSE); - GET_BOOL(g_config.maintas, "maintas", FALSE); - GET_STRING("aspect_ratio", "", g_config.aspect_ratio, sizeof(g_config.aspect_ratio)); - GET_BOOL(g_config.boxing, "boxing", FALSE); - GET_INT(g_config.maxfps, "maxfps", -1); - GET_BOOL(g_config.vsync, "vsync", FALSE); - GET_BOOL(g_config.adjmouse, "adjmouse", TRUE); - GET_STRING("shader", "Shaders\\interpolation\\catmull-rom-bilinear.glsl", g_config.shader, sizeof(g_config.shader)); - GET_INT(g_config.window_rect.left, "posX", -32000); - GET_INT(g_config.window_rect.top, "posY", -32000); - GET_STRING("renderer", "auto", g_config.renderer, sizeof(g_config.renderer)); - GET_BOOL(g_config.devmode, "devmode", FALSE); - GET_BOOL(g_config.border, "border", TRUE); - GET_INT(g_config.save_settings, "savesettings", 1); - GET_BOOL(g_config.resizable, "resizable", TRUE); - GET_INT(g_config.d3d9_filter, "d3d9_filter", FILTER_CUBIC); - GET_INT(g_config.anti_aliased_fonts_min_size, "anti_aliased_fonts_min_size", 13); - GET_INT(g_config.min_font_size, "min_font_size", 0); - GET_INT(g_config.center_window, "center_window", CENTER_WINDOW_AUTO); - GET_STRING("inject_resolution", "", g_config.inject_resolution, sizeof(g_config.inject_resolution)); - GET_BOOL(g_config.vhack, "vhack", FALSE); - GET_STRING("screenshotdir", ".\\Screenshots\\", g_config.screenshot_dir, sizeof(g_config.screenshot_dir)); - GET_BOOL(g_config.toggle_borderless, "toggle_borderless", FALSE); - GET_BOOL(g_config.toggle_upscaled, "toggle_upscaled", FALSE); + g_ddraw->devmode = cfg_get_bool("devmode", FALSE); + g_ddraw->vsync = cfg_get_bool("vsync", FALSE); + g_ddraw->noactivateapp = cfg_get_bool("noactivateapp", FALSE); + g_ddraw->vhack = cfg_get_bool("vhack", FALSE); + g_ddraw->accurate_timers = cfg_get_bool("accuratetimers", FALSE); + g_ddraw->resizable = cfg_get_bool("resizable", TRUE); + g_ddraw->toggle_borderless = cfg_get_bool("toggle_borderless", FALSE); + g_ddraw->toggle_upscaled = cfg_get_bool("toggle_upscaled", FALSE); + g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); + g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE); + g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); + g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE); + g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE); + g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); + g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE); + g_ddraw->gdilinear = cfg_get_bool("gdilinear", FALSE); + g_ddraw->resolutions = cfg_get_int("resolutions", RESLIST_NORMAL); - /* Compatibility settings */ + if (g_ddraw->locktopleft) + g_ddraw->adjmouse = FALSE; - GET_BOOL(g_config.noactivateapp, "noactivateapp", FALSE); - GET_INT(g_config.maxgameticks, "maxgameticks", 0); - GET_INT(g_config.limiter_type, "limiter_type", LIMIT_AUTO); - GET_INT(g_config.minfps, "minfps", 0); - GET_BOOL(g_config.nonexclusive, "nonexclusive", TRUE); - GET_BOOL(g_config.singlecpu, "singlecpu", TRUE); - GET_INT(g_config.resolutions, "resolutions", RESLIST_NORMAL); - GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); - GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); + g_ddraw->armadahack = cfg_get_bool("armadahack", FALSE); + g_ddraw->tshack = cfg_get_bool("tshack", FALSE); - /* Undocumented settings */ + g_ddraw->hotkeys.toggle_fullscreen = cfg_get_int("keytogglefullscreen", VK_RETURN); + g_ddraw->hotkeys.toggle_maximize = cfg_get_int("keytogglemaximize", VK_NEXT); + g_ddraw->hotkeys.unlock_cursor1 = cfg_get_int("keyunlockcursor1", VK_TAB); + g_ddraw->hotkeys.unlock_cursor2 = cfg_get_int("keyunlockcursor2", VK_RCONTROL); + g_ddraw->hotkeys.screenshot = cfg_get_int("keyscreenshot", VK_SNAPSHOT); - GET_BOOL(g_config.fix_alt_key_stuck, "fix_alt_key_stuck", FALSE); - GET_BOOL(GameHandlesClose, "game_handles_close", FALSE); - GET_BOOL(g_config.fix_not_responding, "fix_not_responding", FALSE); - GET_BOOL(g_config.no_compat_warning, "no_compat_warning", FALSE); - GET_INT(g_config.guard_lines, "guard_lines", 200); - GET_INT(g_config.max_resolutions, "max_resolutions", 0); - GET_BOOL(g_config.lock_surfaces, "lock_surfaces", FALSE); - GET_BOOL(g_config.flipclear, "flipclear", FALSE); - GET_BOOL(g_config.rgb555, "rgb555", FALSE); - GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); - GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); - GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); - GET_BOOL(g_config.lock_mouse_top_left, "lock_mouse_top_left", FALSE); - GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); - GET_INT(g_config.hook, "hook", 4); - GET_BOOL(g_config.limit_gdi_handles, "limit_gdi_handles", FALSE); - GET_BOOL(g_config.remove_menu, "remove_menu", FALSE); - GET_INT(g_config.refresh_rate, "refresh_rate", 0); - GET_BOOL(g_config.terminate_process, "terminate_process", FALSE); + g_config.window_rect.right = cfg_get_int("width", 0); + g_config.window_rect.bottom = cfg_get_int("height", 0); + g_config.window_rect.left = cfg_get_int("posX", -32000); + g_config.window_rect.top = cfg_get_int("posY", -32000); - /* Hotkeys */ + g_config.save_settings = cfg_get_int("savesettings", 1); - GET_INT(g_config.hotkeys.toggle_fullscreen, "keytogglefullscreen", VK_RETURN); - GET_INT(g_config.hotkeys.toggle_fullscreen2, "keytogglefullscreen2", 0); - GET_INT(g_config.hotkeys.toggle_maximize, "keytogglemaximize", VK_NEXT); - GET_INT(g_config.hotkeys.toggle_maximize2, "keytogglemaximize2", 0); - GET_INT(g_config.hotkeys.unlock_cursor1, "keyunlockcursor1", VK_TAB); - GET_INT(g_config.hotkeys.unlock_cursor2, "keyunlockcursor2", VK_RCONTROL); - GET_INT(g_config.hotkeys.screenshot, "keyscreenshot", VK_SNAPSHOT); + g_hook_method = cfg_get_int("hook", 4); + g_hook_dinput = cfg_get_bool("dinputhook", FALSE); - /* Game specific settings */ - - GET_BOOL(g_config.armadahack, "armadahack", FALSE); - GET_BOOL(g_config.tshack, "tshack", FALSE); - GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); - GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); - GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); - GET_BOOL(g_config.tlc_hack, "tlc_hack", FALSE); - GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); - GET_BOOL(g_config.sirtech_hack, "sirtech_hack", FALSE); - GET_BOOL(g_config.flightsim98_hack, "flightsim98_hack", FALSE); - GET_BOOL(g_config.darkcolony_hack, "darkcolony_hack", FALSE); - - GameHandlesClose = GameHandlesClose || g_config.infantryhack; + g_ddraw->render.maxfps = cfg_get_int("maxfps", -1); + g_ddraw->render.minfps = cfg_get_int("minfps", 0); - if (g_config.lock_mouse_top_left) - g_config.adjmouse = FALSE; + if (g_ddraw->render.minfps > 1000) + { + g_ddraw->render.minfps = 1000; + } - if (g_config.aspect_ratio[0]) - g_config.maintas = TRUE; + if (g_ddraw->render.minfps > 0) + { + g_ddraw->render.minfps_tick_len = (DWORD)(1000.0f / g_ddraw->render.minfps); + } - ini_free(&g_config.ini); + /* can't fully set it up here due to missing g_ddraw->mode.dmDisplayFrequency */ + if (g_ddraw->accurate_timers || g_ddraw->vsync) + g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + + g_ddraw->maxgameticks = cfg_get_int("maxgameticks", 0); + + if (g_ddraw->maxgameticks > 0 && g_ddraw->maxgameticks <= 1000) + { + if (g_ddraw->accurate_timers) + g_ddraw->ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + + float len = 1000.0f / g_ddraw->maxgameticks; + g_ddraw->ticks_limiter.tick_length_ns = (LONGLONG)(len * 10000); + g_ddraw->ticks_limiter.tick_length = (DWORD)(len + 0.5f); + } + + if (g_ddraw->maxgameticks >= 0 || g_ddraw->maxgameticks == -2) + { + /* always using 60 fps for flip... */ + if (g_ddraw->accurate_timers) + g_ddraw->flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + + float flip_len = 1000.0f / 60; + g_ddraw->flip_limiter.tick_length_ns = (LONGLONG)(flip_len * 10000); + g_ddraw->flip_limiter.tick_length = (DWORD)(flip_len + 0.5f); + } + + g_ddraw->fullscreen = cfg_get_bool("fullscreen", FALSE); + + if (cfg_get_bool("singlecpu", TRUE)) + { + SetProcessAffinityMask(GetCurrentProcess(), 1); + } + else + { + DWORD system_affinity; + DWORD proc_affinity; + HANDLE proc = GetCurrentProcess(); + + if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) + SetProcessAffinityMask(proc, system_affinity); + } + + g_ddraw->render.bpp = cfg_get_int("bpp", 0); + + if (g_ddraw->render.bpp != 16 && g_ddraw->render.bpp != 24 && g_ddraw->render.bpp != 32) + { + g_ddraw->render.bpp = 0; + } + + /* to do: read .glslp config file instead of the shader and apply the correct settings */ + cfg_get_string("shader", "", g_ddraw->shader, sizeof(g_ddraw->shader)); + + cfg_get_string("renderer", "auto", tmp, sizeof(tmp)); + TRACE(" Using %s renderer\n", tmp); + + if (tolower(tmp[0]) == 's' || tolower(tmp[0]) == 'g') /* gdi */ + { + g_ddraw->renderer = gdi_render_main; + } + else if (tolower(tmp[0]) == 'd') /* direct3d9 */ + { + g_ddraw->renderer = d3d9_render_main; + + if (!g_ddraw->windowed) + { + g_ddraw->fullscreen = TRUE; + g_ddraw->windowed = TRUE; + g_config.window_rect.left = g_config.window_rect.top = -32000; + } + } + else if (tolower(tmp[0]) == 'o') /* opengl */ + { + if (oglu_load_dll()) + { + g_ddraw->renderer = ogl_render_main; + } + else + { + g_ddraw->show_driver_warning = TRUE; + g_ddraw->renderer = gdi_render_main; + } + } + else /* auto */ + { + if (!g_ddraw->wine && d3d9_is_available()) + { + g_ddraw->renderer = d3d9_render_main; + + if (!g_ddraw->windowed) + { + g_ddraw->fullscreen = TRUE; + g_ddraw->windowed = TRUE; + g_config.window_rect.left = g_config.window_rect.top = -32000; + } + } + else if (oglu_load_dll()) + { + g_ddraw->renderer = ogl_render_main; + } + else + { + g_ddraw->show_driver_warning = TRUE; + g_ddraw->renderer = gdi_render_main; + } + } } void cfg_save() @@ -134,10 +200,6 @@ void cfg_save() if (!g_config.save_settings) return; - /* Do not save settings while macOS maximize is active */ - if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) - return; - char buf[16]; char* section = g_config.save_settings == 1 ? "ddraw" : g_config.process_file_name; @@ -201,10 +263,7 @@ static void cfg_create_ini() "windowed=false\n" "\n" "; Maintain aspect ratio\n" - "maintas=false\n" - "\n" - "; Use custom aspect ratio - Example values: 4:3, 16:10, 16:9, 21:9\n" - "aspect_ratio=\n" + "maintas=true\n" "\n" "; Windowboxing / Integer Scaling\n" "boxing=false\n" @@ -213,26 +272,24 @@ static void cfg_create_ini() "; Note: Does not have an impact on the game speed, to limit your game speed use 'maxgameticks='\n" "maxfps=-1\n" "\n" - "; Vertical synchronization, enable if you get tearing - (Requires 'renderer=auto/opengl*/direct3d9*')\n" + "; Vertical synchronization, enable if you get tearing - (Requires 'renderer=auto/opengl/direct3d9')\n" "; Note: vsync=true can fix tearing but it will cause input lag\n" "vsync=false\n" "\n" "; Automatic mouse sensitivity scaling\n" "; Note: Only works if stretching is enabled. Sensitivity will be adjusted according to the size of the window\n" - "adjmouse=true\n" + "adjmouse=false\n" "\n" - "; Preliminary libretro shader support - (Requires 'renderer=opengl*') https://github.com/libretro/glsl-shaders\n" + "; Preliminary libretro shader support - (Requires 'renderer=opengl') https://github.com/libretro/glsl-shaders\n" "; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV\n" - "; You can specify a full path to a .glsl shader file here or use one of the values listed below\n" - "; Possible values: Nearest neighbor, Bilinear, Bicubic, Lanczos, xBR-lv2\n" "shader=Shaders\\interpolation\\catmull-rom-bilinear.glsl\n" "\n" "; Window position, -32000 = center to screen\n" "posX=-32000\n" "posY=-32000\n" "\n" - "; Renderer, possible values: auto, opengl, openglcore, gdi, direct3d9, direct3d9on12 (auto = try direct3d9/opengl, fallback = gdi)\n" - "renderer=auto\n" + "; Renderer, possible values: auto, opengl, gdi, direct3d9 (auto = try direct3d9/opengl, fallback = gdi)\n" + "renderer=opengl\n" "\n" "; Developer mode (don't lock the cursor)\n" "devmode=false\n" @@ -247,29 +304,14 @@ static void cfg_create_ini() "; Should the window be resizable by the user in windowed mode?\n" "resizable=true\n" "\n" - "; Upscaling filter for the direct3d9* renderers\n" - "; Possible values: 0 = nearest-neighbor, 1 = bilinear, 2 = bicubic, 3 = lanczos (bicubic/lanczos only support 16/32bit color depth games)\n" - "d3d9_filter=2\n" + "; Enable linear (D3DTEXF_LINEAR) upscaling filter for the direct3d9 renderer\n" + "d3d9linear=true\n" "\n" - "; Disable font smoothing for fonts that are smaller than size X\n" - "anti_aliased_fonts_min_size=13\n" - "\n" - "; Raise the size of small fonts to X\n" - "min_font_size=0\n" - "\n" - "; Center window to screen when game changes the display resolution\n" - "; Possible values: 0 = never center, 1 = automatic, 2 = always center\n" - "center_window=1\n" - "\n" - "; Inject a custom display resolution into the in-game resolution list - Example values: 960x540, 3840x2160\n" - "; Note: This setting can used for downscaling as well, you can insert resolutions higher than your monitor supports\n" - "inject_resolution=\n" - "\n" - "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1, Worms 2 and KKND Xtreme)\n" + "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1 and KKND Xtreme)\n" "vhack=false\n" "\n" - "; Where should screenshots be saved\n" - "screenshotdir=.\\Screenshots\\\n" + "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french\n" + "configlang=auto\n" "\n" "; Switch between windowed/borderless modes with alt+enter rather than windowed/fullscreen modes\n" "toggle_borderless=false\n" @@ -291,55 +333,34 @@ static void cfg_create_ini() "; Note: Usually one of the following values will work: 60 / 30 / 25 / 20 / 15 (lower value = slower game speed)\n" "maxgameticks=0\n" "\n" - "; Method that should be used to limit game ticks (maxgameticks=): 0 = Automatic, 1 = TestCooperativeLevel, 2 = BltFast, 3 = Unlock, 4 = PeekMessage\n" - "limiter_type=0\n" + "; Windows API Hooking, Possible values: 0 = disabled, 1 = IAT Hooking, 2 = Microsoft Detours, 3 = IAT+Detours Hooking (All Modules), 4 = IAT Hooking (All Modules)\n" + "; Note: Change this value if windowed mode or upscaling isn't working properly\n" + "; Note: 'hook=2' will usually work for problematic games, but 'hook=2' should be combined with renderer=gdi\n" + "hook=4\n" "\n" "; Force minimum FPS, possible values: 0 = disabled, -1 = use 'maxfps=' value, -2 = same as -1 but force full redraw, 1-1000 = custom FPS\n" "; Note: Set this to a low value such as 5 or 10 if some parts of the game are not being displayed (e.g. menus or loading screens)\n" "minfps=0\n" "\n" - "; Disable fullscreen-exclusive mode for the direct3d9*/opengl* renderers\n" + "; Disable fullscreen-exclusive mode for the direct3d9/opengl renderers\n" "; Note: Can be used in case some GUI elements like buttons/textboxes/videos/etc.. are invisible\n" - "nonexclusive=true\n" + "nonexclusive=false\n" + "\n" + "; Fixes issues where the pitch of a surface is not a multiple of 4\n" + "; Note: Enable this if some parts of the screen are being displayed diagonally\n" + "fixpitch=false\n" "\n" "; Force CPU0 affinity, avoids crashes/freezing, *might* have a performance impact\n" - "; Note: Disable this if the game is not running smooth or there are sound issues\n" "singlecpu=true\n" "\n" - "; Available display resolutions, possible values: 0 = Small list, 1 = Very small list, 2 = Full list\n" - "; Note: Set this to 2 if your chosen resolution is not working or does not show up in the list\n" - "; Note: Set this to 1 if the game is crashing on startup\n" + "; Available resolutions, possible values: 0 = Small list, 1 = Very small list, 2 = Full list\n" + "; Note: Set this to 2 if your chosen resolution is not working, set to 1 if the game is crashing\n" "resolutions=0\n" "\n" - "; Child window handling, possible values: 0 = Disabled, 1 = Display top left, 2 = Display top left + repaint, 3 = Hide, 4 = Display top left + hide\n" - "; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though)\n" + "; Child window handling, possible values: 0 = Disabled, 1 = Display top left, 2 = Display top left + repaint, 3 = Hide\n" + "; Note: Disables upscaling if a child window was detected\n" "fixchilds=2\n" "\n" - "; Enable the following setting if your cursor doesn't lock to the window or it doesn't work properly when upscaling is enabled\n" - "hook_peekmessage=false\n" - "\n" - "\n" - "; Undocumented compatibility settings - These will probably not solve your problem, you should rather focus on the settings above\n" - "fix_alt_key_stuck=false\n" - "game_handles_close=false\n" - "fix_not_responding=false\n" - "no_compat_warning=false\n" - "guard_lines=200\n" - "max_resolutions=0\n" - "lock_surfaces=false\n" - "flipclear=false\n" - "rgb555=false\n" - "no_dinput_hook=false\n" - "center_cursor_fix=false\n" - ";fake_mode=640x480x32\n" - "lock_mouse_top_left=false\n" - ";win_version=95\n" - "hook=4\n" - "limit_gdi_handles=false\n" - "remove_menu=false\n" - "refresh_rate=0\n" - "terminate_process=false\n" - "\n" "\n" "\n" "; ### Hotkeys ###\n" @@ -350,15 +371,9 @@ static void cfg_create_ini() "; Switch between windowed and fullscreen mode = [Alt] + ???\n" "keytogglefullscreen=0x0D\n" "\n" - "; Switch between windowed and fullscreen mode (single key) = ???\n" - "keytogglefullscreen2=0x00\n" - "\n" - "; Maximize window = [Alt] + ???\n" + "; Maximize window without frame = [Alt] + ???\n" "keytogglemaximize=0x22\n" "\n" - "; Maximize window (single key) = ???\n" - "keytogglemaximize2=0x00\n" - "\n" "; Unlock cursor 1 = [Ctrl] + ???\n" "keyunlockcursor1=0x09\n" "\n" @@ -370,136 +385,61 @@ static void cfg_create_ini() "\n" "\n" "\n" - "; ### Config program settings ###\n" - "; The following settings are for cnc-ddraw config.exe\n" - "\n" - "\n" - "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian, vietnamese, polish\n" - "configlang=auto\n" - "\n" - "; cnc-ddraw config program theme, possible values: Windows10, Cobalt XEMedia\n" - "configtheme=Windows10\n" - "\n" - "; Hide the 'Compatibility Settings' tab in cnc-ddraw config\n" - "hide_compat_tab=false\n" - "\n" - "; Allow the users to 'Restore default settings' via cnc-ddraw config\n" - "allow_reset=true\n" - "\n" - "\n" - "\n" "; ### Game specific settings ###\n" "; The following settings override all settings shown above, section name = executable name\n" "\n" "\n" - "; 101: The Airborne Invasion of Normandy\n" - "[101]\n" - "terminate_process=true\n" - "\n" - "; 7th Legion\n" - "[legion]\n" - "maxgameticks=25\n" - "\n" - "; Atrox\n" - "[Atrox]\n" - "nonexclusive=true\n" - "\n" - "; Arcatera the Dark Brotherhood\n" - "[darksun]\n" - "maxgameticks=60\n" - "maxfps=60\n" - "minfps=-1\n" - "\n" "; Atomic Bomberman\n" "[BM]\n" "maxgameticks=60\n" "\n" "; Age of Empires\n" "[empires]\n" + "renderer=opengl\n" "nonexclusive=true\n" + "fixpitch=true\n" "adjmouse=true\n" "resolutions=2\n" "\n" "; Age of Empires: The Rise of Rome\n" "[empiresx]\n" + "renderer=opengl\n" "nonexclusive=true\n" - "adjmouse=true\n" - "resolutions=2\n" - "\n" - "; Age of Empires: The Rise of Rome (RockNRor patch)\n" - "[EmpiresX_RockNRor]\n" - "nonexclusive=true\n" + "fixpitch=true\n" "adjmouse=true\n" "resolutions=2\n" "\n" "; Age of Empires II\n" "[EMPIRES2]\n" + "renderer=opengl\n" "nonexclusive=true\n" + "fixpitch=true\n" "adjmouse=true\n" "\n" "; Age of Empires II: The Conquerors\n" "[age2_x1]\n" + "renderer=opengl\n" "nonexclusive=true\n" + "fixpitch=true\n" "adjmouse=true\n" "\n" - "; American Conquest / Cossacks\n" + "; American Conquest\n" "[DMCR]\n" - "resolutions=2\n" - "guard_lines=300\n" "minfps=-2\n" "\n" - "; American Girls Dress Designer\n" - "[Dress Designer]\n" - "fake_mode=640x480x32\n" - "nonexclusive=true\n" - "\n" "; Age of Wonders\n" - "[AoW]\n" - "resolutions=2\n" - "nonexclusive=false\n" - "singlecpu=false\n" - "\n" - "; Age of Wonders\n" - "[AoWCompat]\n" - "resolutions=2\n" - "nonexclusive=false\n" - "singlecpu=false\n" - "\n" - "; Age of Wonders Config Tool\n" - "[AoWSetup]\n" - "resolutions=2\n" + "[AoWSM]\n" + "windowed=true\n" + "fullscreen=false\n" + "renderer=gdi\n" + "hook=2\n" "\n" "; Age of Wonders 2\n" "[AoW2]\n" - "resolutions=2\n" - "nonexclusive=false\n" - "singlecpu=false\n" - "\n" - "; Age of Wonders 2\n" - "[AoW2Compat]\n" - "resolutions=2\n" - "nonexclusive=false\n" - "singlecpu=false\n" - "\n" - "; Age of Wonders 2 Config Tool\n" - "[aow2Setup]\n" - "resolutions=2\n" - "\n" - "; Age of Wonders: Shadow Magic\n" - "[AoWSM]\n" - "resolutions=2\n" - "nonexclusive=false\n" - "singlecpu=false\n" - "\n" - "; Age of Wonders: Shadow Magic\n" - "[AoWSMCompat]\n" - "resolutions=2\n" - "nonexclusive=false\n" - "singlecpu=false\n" - "\n" - "; Age of Wonders: Shadow Magic Config Tool\n" - "[AoWSMSetup]\n" - "resolutions=2\n" + "windowed=true\n" + "fullscreen=false\n" + "renderer=gdi\n" + "hook=2\n" "\n" "; Anstoss 3\n" "[anstoss3]\n" @@ -510,157 +450,51 @@ static void cfg_create_ini() "[1602]\n" "adjmouse=true\n" "\n" - "; Army Men: World War / Army Men: Operation Meltdown\n" - "[amww]\n" - "maxfps=60\n" - "maxgameticks=120\n" - "minfps=-1\n" - "\n" - "; Army Men: Air Tactics\n" - "[Amat]\n" - "maxfps=60\n" - "maxgameticks=120\n" - "minfps=-1\n" - "\n" - "; Army Men: Toys in Space\n" - "[ARMYMENTIS]\n" - "maxfps=60\n" - "maxgameticks=120\n" - "minfps=-1\n" - "\n" - "; Army Men 2\n" - "[ArmyMen2]\n" - "maxfps=60\n" - "maxgameticks=120\n" - "minfps=-1\n" - "\n" "; Alien Nations\n" "[AN]\n" "adjmouse=true\n" "\n" + "; Amerzone\n" + "[AMERZONE]\n" + "renderer=opengl\n" + "\n" "; Atlantis\n" "[ATLANTIS]\n" "renderer=opengl\n" - "maxgameticks=30\n" - "center_cursor_fix=true\n" - "\n" - "; Airline Tycoon Deluxe\n" - "[AT]\n" - "lock_mouse_top_left=true\n" - "fixchilds=3\n" - "\n" - "; Arthur's Wilderness Rescue\n" - "[Arthur]\n" - "renderer=gdi\n" - "\n" - "; Axis & Allies\n" - "[AxisAllies]\n" - "hook_peekmessage=true\n" "maxgameticks=60\n" "\n" - "; A Bug's Life Action Game\n" - "[bugs]\n" - "fix_not_responding=true\n" - "\n" - "; Barney - Secret of the Rainbow\n" - "[Barney]\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" - "maintas=false\n" - "boxing=false\n" - "\n" - "; Baldur's Gate II\n" - "; Note: 'Use 3D Acceleration' must be disabled and 'Full Screen' must be enabled in BGConfig.exe\n" - "[BGMain]\n" - "resolutions=2\n" - "\n" - "; Balls of Steel v1.2\n" - "[bos]\n" - "checkfile=.\\barbarin.ddp\n" - "win_version=95\n" - "\n" - "; BALDR FORCE EXE\n" - "[BaldrForce]\n" - "noactivateapp=true\n" - "\n" "; Blade & Sword\n" "[comeon]\n" - "maxgameticks=60\n" "fixchilds=3\n" + "fixpitch=true\n" "\n" "; Blood II - The Chosen / Shogo - Mobile Armor Division\n" "[Client]\n" "checkfile=.\\SOUND.REZ\n" "noactivateapp=true\n" "\n" - "; Blue's 123 Time Activities\n" - "[Blues123Time]\n" - "renderer=gdi\n" - "hook=3\n" - "\n" - "; Blue's Treasure Hunt\n" - "[Blue'sTreasureHunt-Disc1]\n" - "renderer=gdi\n" - "\n" - "; Blue's Treasure Hunt\n" - "[Blue'sTreasureHunt-Disc2]\n" - "renderer=gdi\n" - "\n" - "; Blue's Reading Time Activities\n" - "[Blue's Reading Time]\n" - "renderer=gdi\n" - "\n" - "; Blue's ArtTime Activities\n" - "[ArtTime]\n" - "renderer=gdi\n" - "\n" - "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" - "[CALLUS95]\n" - "game_handles_close=true\n" - "windowed=true\n" - "toggle_borderless=true\n" - "devmode=true\n" - "\n" - "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" - "[CALLUS95p]\n" - "game_handles_close=true\n" - "windowed=true\n" - "toggle_borderless=true\n" - "devmode=true\n" + "; Casino Empire\n" + "[CasinoEmpire]\n" + "hook=2\n" "\n" "; Carmageddon\n" "[CARMA95]\n" - "flipclear=true\n" - "carma95_hack=true\n" + "renderer=opengl\n" + "noactivateapp=true\n" "\n" "; Carmageddon\n" "[CARM95]\n" - "flipclear=true\n" - "carma95_hack=true\n" + "renderer=opengl\n" + "noactivateapp=true\n" "\n" - "; Carmen Sandiego's Great Chase - NOT WORKING YET\n" - "[TIME32]\n" - "renderer=gdi\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" - "maintas=false\n" - "boxing=false\n" + "; Carmageddon 2\n" + "[Carma2_SW]\n" + "renderer=opengl\n" + "noactivateapp=true\n" "\n" "; Captain Claw\n" "[claw]\n" - "adjmouse=true\n" "noactivateapp=true\n" - "nonexclusive=true\n" - "\n" - "; Command & Conquer: Sole Survivor\n" - "[SOLE]\n" - "maxgameticks=120\n" - "maxfps=60\n" - "minfps=-1\n" "\n" "; Command & Conquer Gold - CnCNet\n" "[cnc95]\n" @@ -695,7 +529,6 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Tiberian Sun / Command & Conquer: Red Alert 2\n" "[game]\n" - "nonexclusive=false\n" "checkfile=.\\blowfish.dll\n" "tshack=true\n" "noactivateapp=true\n" @@ -707,7 +540,6 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Tiberian Sun Demo\n" "[SUN]\n" - "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "adjmouse=true\n" @@ -718,7 +550,6 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Tiberian Sun - CnCNet\n" "[ts-spawn]\n" - "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "adjmouse=true\n" @@ -729,7 +560,6 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2 - XWIS\n" "[ra2]\n" - "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -739,7 +569,6 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2 - XWIS\n" "[Red Alert 2]\n" - "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -749,7 +578,6 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge\n" "[gamemd]\n" - "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -759,7 +587,6 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge - ?ModExe?\n" "[ra2md]\n" - "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -769,7 +596,6 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge - CnCNet\n" "[gamemd-spawn]\n" - "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -779,7 +605,6 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge - XWIS\n" "[Yuri's Revenge]\n" - "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -787,34 +612,13 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; Commandos\n" - "[comandos]\n" - "maxgameticks=-1\n" - "\n" - "; Commandos\n" - "[comandos_w10]\n" - "maxgameticks=-1\n" - "\n" - "; Constructor\n" - "[Game_W95]\n" - "noactivateapp=true\n" - "\n" "; Caesar III\n" "[c3]\n" "nonexclusive=true\n" "adjmouse=true\n" "\n" - "; Cloud Kingdom 3 (only with /ddraw command line parameter)\n" - "[Clouds Kingdom 3]\n" - "fake_mode=320x240x32\n" - "\n" - "; Commando 2004 (only with /ddraw command line parameter)\n" - "[commando]\n" - "fake_mode=320x240x32\n" - "\n" "; Chris Sawyer's Locomotion\n" - "[LOCO/2]\n" - "checkfile=.\\LOCO.EXE\n" + "[LOCO]\n" "adjmouse=true\n" "\n" "; Cultures 2\n" @@ -827,50 +631,35 @@ static void cfg_create_ini() "\n" "; Close Combat 2: A Bridge Too Far\n" "[cc2]\n" - "maxgameticks=20\n" - "limiter_type=4\n" - "minfps=15\n" "adjmouse=true\n" + "fixpitch=true\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Close Combat 3: The Russian Front\n" "[cc3]\n" - "maxgameticks=30\n" - "limiter_type=2\n" "adjmouse=true\n" + "fixpitch=true\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Close Combat 4: The Battle of the Bulge\n" "[cc4]\n" - "maxgameticks=30\n" - "limiter_type=2\n" "adjmouse=true\n" + "fixpitch=true\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Close Combat 5: Invasion: Normandy\n" "[cc5]\n" - "maxgameticks=30\n" - "limiter_type=2\n" "adjmouse=true\n" + "fixpitch=true\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" - "; ClueFinders Math Adventures 1.0\n" - "[TCFM32]\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" - "maintas=false\n" - "boxing=false\n" - "\n" - "; ClueFinders Math Adventures 1.0\n" - "[cfmath32]\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" - "maintas=false\n" - "boxing=false\n" + "; Commandos\n" + "[Comandos]\n" + "fixpitch=true\n" "\n" "; Call To Power 2\n" "[ctp2]\n" @@ -880,36 +669,17 @@ static void cfg_create_ini() "; Corsairs Gold\n" "[corsairs]\n" "adjmouse=true\n" - "\n" - "; Dark Colony\n" - "[dc16]\n" - "maxgameticks=30\n" - "darkcolony_hack=true\n" - "hook_peekmessage=true\n" - "\n" - "; Divine Divinity\n" - "[div]\n" - "resolutions=2\n" - "singlecpu=false\n" - "\n" - "; Die by the Sword\n" - "[windie]\n" - "maxgameticks=30\n" + "renderer=gdi\n" + "hook=2\n" "\n" "; Dragon Throne: Battle of Red Cliffs\n" "[AdSanguo]\n" "maxgameticks=60\n" "noactivateapp=true\n" - "limiter_type=2\n" - "\n" - "; Dark Secret of Africa\n" - "[Game/5]\n" - "checkfile=.\\CONFIG.CFG\n" - "maxfps=60\n" - "minfps=-1\n" "\n" "; Dark Reign: The Future of War\n" "[DKReign]\n" + "renderer=opengl\n" "maxgameticks=60\n" "\n" "; Dungeon Keeper 2\n" @@ -917,10 +687,6 @@ static void cfg_create_ini() "maxgameticks=60\n" "noactivateapp=true\n" "\n" - "; Dreams to Realty\n" - "[windream]\n" - "maxgameticks=60\n" - "\n" "; Deadlock 2\n" "[DEADLOCK]\n" "fixchilds=0\n" @@ -936,126 +702,19 @@ static void cfg_create_ini() "[hellfire]\n" "devmode=true\n" "\n" - "; Disney Trivia Challenge\n" - "[DisneyTr]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "renderer=gdi\n" - "\n" - "; Discoworld Noir\n" - "[dn]\n" - "fake_mode=640x480x16\n" - "\n" - "; Dominion - Storm Over Gift 3\n" - "[dominion]\n" - "flipclear=true\n" - "\n" - "; Escape Velocity Nova\n" - "[EV Nova]\n" - "nonexclusive=true\n" - "hook_peekmessage=true\n" - "rgb555=true\n" - "keytogglefullscreen=0x46\n" - "adjmouse=true\n" + "; Eggsucker\n" + "[eggsucker]\n" + "fixpitch=true\n" "\n" "; Economic War\n" "[EcoW]\n" "maxgameticks=60\n" - "fix_not_responding=true\n" - "\n" - "; Emperor: Rise of the Middle Kingdom\n" - "[Emperor]\n" - "nonexclusive=true\n" - "adjmouse=true\n" - "\n" - "; Enemy Infestation\n" - "[EI]\n" - "hook_peekmessage=true\n" - "\n" - "; F-16 Agressor\n" - "[f-16]\n" - "resolutions=1\n" - "\n" - "; Fallout Tactics: Brotherhood of Steel\n" - "[BOS/2]\n" - "checkfile=.\\binkw32.dll\n" - "hook_peekmessage=true\n" - "\n" - "; Fallout Tactics: Brotherhood of Steel\n" - "[BOS_HR]\n" - "hook_peekmessage=true\n" - "\n" - "; Fallout Tactics: Brotherhood of Steel\n" - "[FT Tools]\n" - "hook_peekmessage=true\n" - "\n" - "; Flight Simulator 98\n" - "[FLTSIM95]\n" - "flightsim98_hack=true\n" - "\n" - "; Flight Simulator 98\n" - "[FLTSIM98]\n" - "flightsim98_hack=true\n" - "\n" - "; Fairy Tale About Father Frost, Ivan and Nastya\n" - "[mrazik]\n" - "guard_lines=0\n" - "\n" - "; Fable\n" - "[Fable]\n" - "maxgameticks=59\n" - "limiter_type=4\n" - "\n" - "; Final Liberation: Warhammer Epic 40000\n" - "[Epic40k]\n" - "hook_peekmessage=true\n" - "maxgameticks=125\n" + "fixnotresponding=true\n" "\n" "; Future Cop - L.A.P.D.\n" "[FCopLAPD]\n" - "nonexclusive=true\n" "adjmouse=true\n" - "\n" - "; Freddi 1\n" - "[Freddi1]\n" - "renderer=gdi\n" - "\n" - "; Freddi Fish : The Case of the Hogfish Rustlers of Briny Gulch\n" - "[Freddihrbg]\n" - "renderer=gdi\n" - "\n" - "; Freddi Water Worries\n" - "[Water]\n" - "renderer=gdi\n" - "\n" - "; Freddi Fish\n" - "[FreddiSCS]\n" - "renderer=gdi\n" - "\n" - "; Freddi Fish\n" - "[FREDDI4]\n" - "renderer=gdi\n" - "hook=3\n" - "\n" - "; Freddi Fish's One-Stop Fun Shop\n" - "[FreddisFunShop]\n" - "renderer=gdi\n" - "\n" - "; Freddi Fish: The Case of the Creature of Coral Cove\n" - "[freddicove]\n" - "renderer=gdi\n" - "\n" - "; Freddi Fish: The Case of the Haunted Schoolhouse\n" - "[FreddiCHSH]\n" - "renderer=gdi\n" - "\n" - "; Freddi Fish: Maze Madness\n" - "[Maze]\n" - "renderer=gdi\n" - "\n" - "; Glover\n" - "[glover]\n" - "fix_not_responding=true\n" + "fixchilds=3\n" "\n" "; G-Police\n" "[GPOLICE]\n" @@ -1064,9 +723,8 @@ static void cfg_create_ini() "; Gangsters: Organized Crime\n" "[gangsters]\n" "adjmouse=true\n" + "renderer=opengl\n" "nonexclusive=true\n" - "fixchilds=0\n" - "fake_mode=640x480x8\n" "\n" "; Grand Theft Auto\n" "[Grand Theft Auto]\n" @@ -1080,61 +738,9 @@ static void cfg_create_ini() "[Gta_61]\n" "singlecpu=false\n" "\n" - "; Gruntz\n" - "[GRUNTZ]\n" - "adjmouse=true\n" - "noactivateapp=true\n" - "nonexclusive=true\n" - "\n" - "; Girl Talk\n" - "[GirlTalk]\n" - "resolutions=2\n" - "game_handles_close=true\n" - "\n" - "; Jazz Jackrabbit 2 plus\n" - "[Jazz2]\n" - "inject_resolution=800x450\n" - "\n" - "; Jazz Jackrabbit 2\n" - "[Jazz2_NonPlus]\n" - "inject_resolution=800x450\n" - "\n" - "; Jungle Storm\n" - "[Jstorm]\n" - "no_compat_warning=true\n" - "win_version=98\n" - "\n" - "; Hades Challenge\n" - "[HADESCH]\n" - "no_compat_warning=true\n" - "\n" "; Heroes of Might and Magic II: The Succession Wars\n" "[HEROES2W]\n" "adjmouse=true\n" - "game_handles_close=true\n" - "keytogglefullscreen2=0x73\n" - "\n" - "; Heroes of Might and Magic III\n" - "[Heroes3]\n" - "renderer=opengl\n" - "game_handles_close=true\n" - "keytogglefullscreen2=0x73\n" - "\n" - "; Heroes of Might and Magic III HD Mod\n" - "[Heroes3 HD]\n" - "renderer=opengl\n" - "game_handles_close=true\n" - "keytogglefullscreen2=0x73\n" - "\n" - "; Heroes of Might and Magic III - Master of Puppets mod\n" - "[MoP]\n" - "game_handles_close=true\n" - "keytogglefullscreen2=0x73\n" - "\n" - "; Heroes of Might and Magic IV\n" - "[heroes4]\n" - "remove_menu=true\n" - "keytogglefullscreen2=0x73\n" "\n" "; Hard Truck: Road to Victory\n" "[htruck]\n" @@ -1142,26 +748,6 @@ static void cfg_create_ini() "renderer=opengl\n" "noactivateapp=true\n" "\n" - "; Hooligans: Storm over Europe\n" - "[hooligans]\n" - "limit_gdi_handles=true\n" - "\n" - "; Imperialism 2: The Age of Exploration\n" - "[Imperialism II]\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" - "maintas=false\n" - "boxing=false\n" - "\n" - "; Icewind Dale 2\n" - "; Note: 'Full Screen' must be enabled in Config.exe\n" - "; Note: 1070x602 is the lowest possible 16:9 resolution for the Widescreen patch (600/601 height will crash)\n" - "[iwd2]\n" - "resolutions=2\n" - "inject_resolution=1070x602\n" - "\n" "; Invictus\n" "[Invictus]\n" "adjmouse=true\n" @@ -1170,64 +756,29 @@ static void cfg_create_ini() "; Interstate 76\n" "[i76]\n" "adjmouse=true\n" - "\n" - "; Infantry\n" - "[infantry]\n" - "resolutions=2\n" - "infantryhack=true\n" - "max_resolutions=90\n" - "\n" - "; Infantry Steam\n" - "[FreeInfantry]\n" - "resolutions=2\n" - "infantryhack=true\n" - "max_resolutions=90\n" + "renderer=opengl\n" "\n" "; Jagged Alliance 2\n" "[ja2]\n" - "singlecpu=false\n" - "sirtech_hack=true\n" - "fix_alt_key_stuck=true\n" - "\n" - "; Jagged Alliance 2: Unfinished Business\n" - "[JA2UB]\n" - "singlecpu=false\n" - "sirtech_hack=true\n" - "fix_alt_key_stuck=true\n" + "fixmousehook=true\n" + "noactivateapp=true\n" + "releasealt=true\n" "\n" "; Jagged Alliance 2: Wildfire\n" "[WF6]\n" - "singlecpu=false\n" - "sirtech_hack=true\n" - "fix_alt_key_stuck=true\n" + "fixmousehook=true\n" + "noactivateapp=true\n" + "releasealt=true\n" "\n" "; Jagged Alliance 2 - UC mod\n" "[JA2_UC]\n" - "singlecpu=false\n" - "sirtech_hack=true\n" - "fix_alt_key_stuck=true\n" + "fixmousehook=true\n" + "noactivateapp=true\n" + "releasealt=true\n" "\n" - "; Jagged Alliance 2 - Vengeance Reloaded mod\n" - "[JA2_Vengeance]\n" - "singlecpu=false\n" - "sirtech_hack=true\n" - "fix_alt_key_stuck=true\n" - "\n" - "; Jagged Alliance 2 - Vengeance Reloaded mod German exe\n" - "[JA2_Vengeance_DE]\n" - "singlecpu=false\n" - "sirtech_hack=true\n" - "fix_alt_key_stuck=true\n" - "\n" - "; Jeopardy! - NOT WORKING YET\n" - "[jeoppc]\n" - "singlecpu=false\n" - "\n" - "; Karma Immortal Wrath\n" - "[karma]\n" - "fix_not_responding=true\n" - "maxgameticks=60\n" - "limiter_type=4\n" + "; Kings Quest 8\n" + "[Mask]\n" + "renderer=opengl\n" "\n" "; Konung\n" "[konung]\n" @@ -1244,124 +795,12 @@ static void cfg_create_ini() "; KKND2: Krossfire\n" "[KKND2]\n" "noactivateapp=true\n" - "\n" - "; Knights and Merchants The Shattered Kingdom\n" - "[KaM_800]\n" - "limiter_type=2\n" - "maxgameticks=60\n" - "\n" - "; Knights and Merchants The Shattered Kingdom\n" - "[KaM_1024]\n" - "limiter_type=2\n" - "maxgameticks=60\n" - "\n" - "; Lode Runner 2\n" - "[LR2]\n" - "no_dinput_hook=true\n" - "fake_mode=640x480x16\n" - "\n" - "; Last Bronx\n" - "[LB]\n" - "maxgameticks=30\n" - "\n" - "; Lapis (lapis.mgame.com)\n" - "[Lapis]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; LEGO LOCO - NOT WORKING YET\n" - "[LOCO]\n" - "checkfile=.\\LEGO.INI\n" - "fake_mode=1024x768x16\n" - "posX=0\n" - "posY=0\n" - "border=false\n" - "fullscreen=false\n" - "\n" - "; Little Bear Kindergarten/Preschool Thinking Adventures: Parent's Progress Report\n" - "[LBPR]\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" - "maintas=false\n" - "boxing=false\n" - "\n" - "; Little Bear Kindergarten/Preschool Thinking Adventures\n" - "[LBSTART]\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" - "maintas=false\n" - "boxing=false\n" - "\n" - "; Little Bear Toddler Discovery Adventures\n" - "[LBT]\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" - "maintas=false\n" - "boxing=false\n" + "renderer=gdi\n" + "hook=2\n" "\n" "; Lionheart\n" "[Lionheart]\n" - "hook_peekmessage=true\n" - "\n" - "; Lost Vikings 2\n" - "[LOSTV95]\n" - "fake_mode=320x240x16\n" - "\n" - "; Nightmare Creatures\n" - "[NC]\n" - "maxgameticks=30\n" - "\n" - "; Moto Racer (software mode)\n" - "[moto]\n" - "maxgameticks=59\n" - "\n" - "; Madeline 1st Grade Math\n" - "[madmath1]\n" - "nonexclusive=true\n" - "no_compat_warning=true\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" - "maintas=false\n" - "boxing=false\n" - "renderer=gdi\n" - "hook=2\n" - "win_version=nt4\n" - "\n" - "; Madeline 1st Grade Math: Progress Report\n" - "[madpr]\n" - "nonexclusive=true\n" - "no_compat_warning=true\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" - "maintas=false\n" - "boxing=false\n" - "renderer=gdi\n" - "hook=2\n" - "win_version=nt4\n" - "\n" - "; Madeline 2nd Grade Math\n" - "[madmath2]\n" - "nonexclusive=true\n" - "no_compat_warning=true\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" - "maintas=false\n" - "boxing=false\n" - "renderer=gdi\n" - "hook=2\n" - "win_version=nt4\n" + "locktopleft=true\n" "\n" "; Majesty Gold\n" "[Majesty]\n" @@ -1375,66 +814,19 @@ static void cfg_create_ini() "[MajestyHD - Old]\n" "adjmouse=true\n" "\n" - "; Meat Puppet\n" - "[meat]\n" - "hook_peekmessage=true\n" - "\n" "; Mech Warrior 3\n" "[Mech3]\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" - "; Men In Black - NOT WORKING YET\n" - "[MIB]\n" - "hook=2\n" + "; Moorhuhn\n" + "[Moorhuhn]\n" + "renderer=opengl\n" + "dinputhook=true\n" "\n" "; Moorhuhn 2\n" "[Moorhuhn2]\n" - "fix_alt_key_stuck=true\n" - "\n" - "; Metal Knight\n" - "[mk]\n" - "maxgameticks=60\n" - "limiter_type=4\n" - "\n" - "; New Robinson\n" - "[ROBY]\n" - "adjmouse=true\n" - "hook_peekmessage=true\n" - "\n" - "; Neo Sonic Universe\n" - "[nsu]\n" - "fake_mode=320x240x32\n" - "\n" - "; Neo Sonic Universe - battle mode\n" - "[nsu_battle]\n" - "fake_mode=320x240x32\n" - "\n" - "; Nancy Drew (All games)\n" - "[Game/3]\n" - "checkfile=.\\Nancy.cid\n" - "limiter_type=1\n" - "maxgameticks=120\n" - "\n" - "; NBA Full Court Press\n" - "[NBA_FCP]\n" - "fake_mode=640x480x8\n" - "\n" - "; Nox\n" - "[NOX]\n" - "checkfile=.\\NOX.ICD\n" - "renderer=direct3d9\n" - "nonexclusive=false\n" - "windowed=false\n" - "maxgameticks=125\n" - "\n" - "; Nox Reloaded\n" - "[NoxReloaded]\n" - "maxgameticks=125\n" - "\n" - "; Nox GOG\n" - "[Game/2]\n" - "checkfile=.\\nox.cfg\n" - "maxgameticks=125\n" + "dinputhook=true\n" "\n" "; Outlaws\n" "[olwin]\n" @@ -1443,407 +835,108 @@ static void cfg_create_ini() "adjmouse=true\n" "renderer=gdi\n" "\n" - "; Pandora's Box Puzzle Game\n" - "[Pandora]\n" - "fixchilds=0\n" - "\n" - "; Paddle Bash Hotshot\n" - "[SPAGHSPaddle]\n" - "no_compat_warning=true\n" - "\n" - "; Pajama Sam's Games to Play on Any Day\n" - "[PJGAMES]\n" - "renderer=gdi\n" - "\n" - "; Pajama Sam\n" - "[PajamaTAL]\n" - "renderer=gdi\n" - "\n" - "; Pajama Sam: No Need to Hide When It's Dark Outside\n" - "[PajamaNHD]\n" - "renderer=gdi\n" - "\n" - "; Pajama Sam 3\n" - "[Pajama3]\n" - "renderer=gdi\n" - "\n" - "; Pajama Sam's One-Stop Fun Shop\n" - "[SamsFunShop]\n" - "renderer=gdi\n" - "\n" - "; Pajama Sam DON'T FEAR THE DARK\n" - "[pjSam]\n" - "renderer=gdi\n" - "\n" - "; Pajama Sam 3: You Are What You Eat From Your Head To Your Feet\n" - "[UKpajamaEAT]\n" - "renderer=gdi\n" - "\n" "; Pharaoh\n" "[Pharaoh]\n" "adjmouse=true\n" "\n" - "; Putt-Putt Saves The Zoo\n" - "[PUTTZOO]\n" - "renderer=gdi\n" - "hook=3\n" - "\n" - "; Putt-Putt's One-Stop Fun Shop\n" - "[PuttsFunShop]\n" - "renderer=gdi\n" - "\n" - "; Putt-Putt and Pep's Dog On A Stick\n" - "[DOG]\n" - "renderer=gdi\n" - "\n" - "; Putt-Putt Joins the Circus\n" - "[puttcircus]\n" - "renderer=gdi\n" - "\n" - "; Putt-Putt Enters The Race\n" - "[UKPuttRace]\n" - "renderer=gdi\n" - "\n" - "; Putt-Putt: Travels Through Time\n" - "[PuttTTT]\n" - "renderer=gdi\n" - "\n" - "; Putt-Putt and Pep's Balloon-o-Rama\n" - "[Balloon]\n" - "renderer=gdi\n" - "\n" - "; Putt-Putt Travels Through Time\n" - "[PUTTPUTTTTT]\n" - "renderer=gdi\n" - "\n" - "; Putt-Putt Joins the Circus\n" - "[puttputtjtc]\n" - "renderer=gdi\n" - "\n" - "; Pizza Syndicate\n" - "[Pizza2]\n" - "renderer=opengl\n" - "\n" - "; Pizza Syndicate - Mehr Biss (Mission CD)\n" - "[Pizza_Mission]\n" + "; Pacific General\n" + "[PACGEN]\n" "renderer=opengl\n" "\n" "; Pax Imperia\n" "[Pax Imperia]\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" - "; Play with the Teletubbies\n" - "[PlayWTT]\n" - "hook=3\n" - "\n" - "; Populous - The Beginning\n" - "[popTB]\n" - "singlecpu=false\n" - "\n" - "; Rage of Mages\n" - "[rom]\n" - "maxgameticks=60\n" - "limiter_type=4\n" - "singlecpu=true\n" - "\n" "; Railroad Tycoon II\n" "[RT2]\n" - "maxgameticks=60" "adjmouse=true\n" "\n" - "; Reader Rabbit Thinking Ages 4-6 (US)\n" - "[rrta32]\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" - "maintas=false\n" - "boxing=false\n" - "\n" - "; Reader Rabbit Reading Ages 4-6\n" - "[rrirjw32]\n" - "renderer=gdi\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" - "maintas=false\n" - "boxing=false\n" - "\n" - "; Reader Rabbit Reading Ages 6-9\n" - "[irj2w32]\n" - "renderer=gdi\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" - "maintas=false\n" - "boxing=false\n" - "\n" - "; Real War\n" - "[RealWar]\n" - "maxgameticks=60\n" - "limiter_type=3\n" - "\n" - "; Return to Krondor\n" - "[RtK]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "limiter_type=2\n" - "game_handles_close=true\n" - "maxgameticks=59\n" - "anti_aliased_fonts_min_size=99\n" - "\n" "; ROAD RASH\n" "[RoadRash]\n" "adjmouse=true\n" - "nonexclusive=true\n" "\n" - "; Robin Hood - The Legend of Sherwood (GOG)\n" - "[Game/4]\n" - "checkfile=.\\Robin Hood.exe\n" - "singlecpu=false\n" - "fix_not_responding=true\n" - "\n" - "; Robin Hood - The Legend of Sherwood (Steam)\n" - "[_rh]\n" - "singlecpu=false\n" - "fix_not_responding=true\n" - "\n" - "; Robin Hood - The Legend of Sherwood\n" - "[Robin Hood]\n" - "singlecpu=false\n" - "fix_not_responding=true\n" - "\n" - "; Rising Lands\n" - "[Rising]\n" - "maxgameticks=30\n" - "limiter_type=4\n" - "\n" - "; Scooby-Doo(TM), Case File #1 The Glowing Bug Man - NOT WORKING YET\n" - "[Case File #1]\n" - "windowed=true\n" - "nonexclusive=true\n" - "fake_mode=640x480x32\n" - "\n" - "; Seven Kingdoms II\n" - "[7k2]\n" - "fake_mode=352x240x32\n" - "fix_not_responding=true\n" - "\n" - "; Seven Games of the Soul\n" - "[faust]\n" - "maxgameticks=25\n" - "\n" - "; Swarog\n" - "[Swarog]\n" - "maxfps=60\n" - "maxgameticks=60\n" - "minfps=-1\n" - "\n" - "; Sim Copter\n" - "[SimCopter]\n" - "nonexclusive=true\n" + "; Septerra Core\n" + "[septerra]\n" + "hook=2\n" "\n" "; Settlers 3\n" "[s3]\n" + "renderer=opengl\n" "nonexclusive=true\n" "\n" "; Star Trek - Armada\n" "[Armada]\n" "armadahack=true\n" + "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" "maintas=false\n" "boxing=false\n" "\n" - "; Star Wars Rebellion\n" - "[REBEXE]\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" - "maintas=false\n" - "boxing=false\n" - "\n" "; Star Wars: Galactic Battlegrounds\n" "[battlegrounds]\n" - "nonexclusive=true\n" + "fixpitch=true\n" "adjmouse=true\n" "\n" "; Star Wars: Galactic Battlegrounds: Clone Campaigns\n" "[battlegrounds_x1]\n" - "nonexclusive=true\n" + "fixpitch=true\n" "adjmouse=true\n" "\n" - "; Starcraft\n" - "[StarCraft]\n" - "game_handles_close=true\n" - "\n" - "; Space Rangers\n" - "[Rangers]\n" - "hook_peekmessage=true\n" - "\n" - "; SPYFox: Hold the Mustard\n" - "[mustard]\n" - "renderer=gdi\n" - "\n" - "; SPY Fox: Some Assembly Required\n" - "[Spyfox2]\n" - "renderer=gdi\n" - "\n" - "; SPY Fox in Dry Cereal (2008)\n" - "[SpyFox]\n" - "renderer=gdi\n" - "\n" - "; SPY Fox in Dry Cereal (2001)\n" - "[SPYFOXDC]\n" - "renderer=gdi\n" - "\n" - "; SPY Fox : Some Assembly Required\n" - "[SPYFOXSR]\n" - "renderer=gdi\n" - "\n" - "; SPY Fox: Operation Ozone\n" - "[spyozon]\n" - "renderer=gdi\n" - "\n" - "; SPY Fox: Operation Ozone\n" - "[spyfoxozu]\n" - "renderer=gdi\n" - "\n" "; Stronghold Crusader HD\n" "[Stronghold Crusader]\n" - "resolutions=2\n" - "stronghold_hack=true\n" "adjmouse=true\n" "\n" + "; Space Rangers\n" + "[Rangers]\n" + "locktopleft=true\n" + "\n" "; Stronghold Crusader Extreme HD\n" "[Stronghold_Crusader_Extreme]\n" - "resolutions=2\n" - "stronghold_hack=true\n" "adjmouse=true\n" "\n" "; Stronghold HD\n" "[Stronghold]\n" - "resolutions=2\n" - "stronghold_hack=true\n" "adjmouse=true\n" "\n" + "; Steel Panthers: World At War\n" + "[MECH]\n" + "renderer=opengl\n" + "\n" "; Sim City 3000\n" "[SC3]\n" + "renderer=opengl\n" "minfps=-2\n" - "maxgameticks=60\n" - "\n" - "; SimTunes\n" - "[SIMTUNES]\n" - "terminate_process=true\n" - "hook=3\n" - "\n" - "; Street Wars: Constructor Underworld\n" - "[Sw]\n" - "checkfile=.\\smackw32.dll\n" - "maxgameticks=30\n" - "limiter_type=4\n" "\n" "; Shadow Watch\n" - "[sw/2]\n" - "checkfile=.\\Dx.dll\n" + "[sw]\n" + "fixpitch=true\n" "adjmouse=true\n" - "maxgameticks=30\n" - "hook_peekmessage=true\n" "\n" "; Shadow Flare\n" "[ShadowFlare]\n" + "renderer=opengl\n" "nonexclusive=true\n" "adjmouse=true\n" - "\n" - "; Squad Leader\n" - "[SquadLeader]\n" - "maxgameticks=30\n" - "limiter_type=4\n" - "\n" - "; Soldiers At War\n" - "[SAW_Game]\n" - "maxgameticks=30\n" - "limiter_type=4\n" - "\n" - "; The Tone Rebellion\n" - "[Float]\n" - "hook_peekmessage=true\n" - "\n" - "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" - "[TotalA]\n" - "max_resolutions=32\n" - "lock_surfaces=true\n" - "singlecpu=false\n" - "\n" - "; Total Annihilation Replay Viewer (Unofficial Beta Patch v3.9.02)\n" - "[Viewer]\n" - "max_resolutions=32\n" - "lock_surfaces=true\n" - "singlecpu=false\n" - "\n" - "; Virtual Springfield\n" - "[VIRTUAL]\n" - "game_handles_close=true\n" - "\n" - "; Total Annihilation: Kingdoms\n" - "[Kingdoms]\n" - "game_handles_close=true\n" - "max_resolutions=32\n" - "\n" - "; The Missing on Lost Island\n" - "[Island]\n" - "lock_mouse_top_left=true\n" - "fixchilds=3\n" - "\n" - "; The X-Files DVD\n" - "[XFiles]\n" - "windowed=true\n" - "fullscreen=true\n" - "toggle_borderless=true\n" - "\n" - "; The Learning Company Launcher\n" - "[TLCLauncher]\n" - "tlc_hack=true\n" - "adjmouse=false\n" - "width=0\n" - "height=0\n" - "resizable=false\n" "maintas=false\n" "boxing=false\n" "\n" - "; The Jungle Book Groove Party\n" - "[Jungle_vr]\n" - "fix_not_responding=true\n" - "\n" "; Three Kingdoms: Fate of the Dragon\n" "[sanguo]\n" "maxgameticks=60\n" "noactivateapp=true\n" - "limiter_type=2\n" - "\n" - "; Thomas & Friends - The Great Festival Adventure\n" - "[Thomas]\n" - "no_compat_warning=true\n" - "noactivateapp=true\n" - "\n" - "; RollerCoaster Tycoon\n" - "[rct]\n" - "no_dinput_hook=true\n" - "singlecpu=false\n" - "maxfps=0\n" - "adjmouse=true\n" "\n" "; Twisted Metal\n" "[TWISTED]\n" + "renderer=opengl\n" "nonexclusive=true\n" "maxgameticks=25\n" "minfps=5\n" "\n" "; Twisted Metal 2\n" "[Tm2]\n" + "renderer=opengl\n" "nonexclusive=true\n" "maxgameticks=60\n" "adjmouse=true\n" @@ -1856,15 +949,10 @@ static void cfg_create_ini() "[Tzar]\n" "adjmouse=true\n" "\n" - "; Unreal\n" - "[Unreal]\n" - "adjmouse=false\n" - "lock_mouse_top_left=true\n" - "center_cursor_fix=true\n" - "noactivateapp=true\n" - "\n" "; Uprising\n" "[uprising]\n" + "renderer=opengl\n" + "fixpitch=true\n" "adjmouse=true\n" "\n" "; Uprising 2\n" @@ -1872,75 +960,36 @@ static void cfg_create_ini() "renderer=opengl\n" "adjmouse=true\n" "\n" - "; Vermeer\n" - "[vermeer]\n" - "adjmouse=true\n" - "fake_mode=640x480x32\n" - "\n" - "; Virtua Fighter 2\n" - "[VF2]\n" - "fake_mode=640x480x8\n" - "\n" - "; Virtual On: Cyber Troopers\n" - "[V_ON]\n" - "devmode=true\n" - "windowed=true\n" - "fullscreen=true\n" - "toggle_borderless=true\n" - "\n" - "; Wall Street Trader 2000 - NOT WORKING YET\n" - "[WSTrader]\n" - "nonexclusive=false\n" - "windowed=false\n" - "\n" - "; WarCraft 2000: Nuclear Epidemic\n" - "[war2000]\n" - "resolutions=2\n" - "guard_lines=600\n" - "minfps=-2\n" - "\n" - "; Warhammer 40000: Chaos Gate\n" - "[WH40K]\n" - "maxgameticks=250\n" + "; Warlords 3\n" + "[Darklord]\n" + "renderer=gdi\n" "\n" "; Wizardry 8\n" "[Wiz8]\n" - "sirtech_hack=true\n" - "fix_alt_key_stuck=true\n" - "\n" - "; Worms 2\n" - "[worms2]\n" - "vhack=true\n" - "flipclear=true\n" - "game_handles_close=true\n" - "center_cursor_fix=true\n" + "fixmousehook=true\n" + "noactivateapp=true\n" + "releasealt=true\n" "\n" "; Worms Armageddon\n" "[WA]\n" - "lock_mouse_top_left=true\n" + "adjmouse=true\n" + "width=0\n" + "height=0\n" + "resizable=false\n" "\n" - "; Wheel Of Fortune\n" - "[WHEEL]\n" - "singlecpu=false\n" + "; Wizards and Warriors\n" + "[deep6]\n" + "renderer=gdi\n" + "hook=2\n" "\n" "; War Wind\n" "[WW]\n" - "minfps=-1\n" - "\n" - "; Jeff Wayne's 'The War Of The Worlds'\n" - "[WoW]\n" - "minfps=-1\n" + "renderer=opengl\n" "\n" "; Zeus and Poseidon\n" "[Zeus]\n" "adjmouse=true\n" "\n" - "; Zork Nemesis\n" - "[znemesis]\n" - "fix_not_responding=true\n" - "maxgameticks=60\n" - "limiter_type=4\n" - "\n" , fh); fclose(fh); @@ -1952,10 +1001,9 @@ static void cfg_init() /* get process filename and directory */ if (GetModuleFileNameA(NULL, g_config.game_path, sizeof(g_config.game_path) - 1) > 0) { - _splitpath(g_config.game_path, NULL, NULL, g_config.process_file_name, g_config.process_file_ext); + _splitpath(g_config.game_path, NULL, NULL, g_config.process_file_name, NULL); - int len = strlen(g_config.game_path) - strlen(g_config.process_file_name) - strlen(g_config.process_file_ext); - char* end = strstr(g_config.game_path + len, g_config.process_file_name); + char* end = strstr(g_config.game_path, g_config.process_file_name); if (end) { @@ -1967,139 +1015,39 @@ static void cfg_init() } } - /* get dll filename and directory */ - if (GetModuleFileNameA(g_ddraw_module, g_config.dll_path, sizeof(g_config.dll_path) - 1) > 0) - { - _splitpath(g_config.dll_path, NULL, NULL, g_config.dll_file_name, g_config.dll_file_ext); - - int len = strlen(g_config.dll_path) - strlen(g_config.dll_file_name) - strlen(g_config.dll_file_ext); - char* end = strstr(g_config.dll_path + len, g_config.dll_file_name); - - if (end) - { - *end = 0; - } - else - { - g_config.dll_path[0] = 0; - } - } - - if (!GetEnvironmentVariableA("CNC_DDRAW_CONFIG_FILE", g_config.ini_path, sizeof(g_config.ini_path) - 1)) - { - if (strlen(g_config.dll_path) > 0 && strlen(g_config.dll_file_name) > 0) - { - _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%sddraw.ini", g_config.dll_path); - - /* Use this here instead to sync .ini filename with .dll filename - by egornovivan @ github */ - //_snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%s%s.ini", g_config.dll_path, g_config.dll_file_name); - - if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) - { - cfg_create_ini(); - } - - if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) - { - /* This might not actually be needed, but we keep it for now */ - strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); - } - } - else - { - strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); - } - } + /* set up settings ini */ + strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) - { cfg_create_ini(); - } - - ini_create(&g_config.ini, g_config.ini_path); - cfg_get_game_section(g_config.game_section, sizeof(g_config.game_section)); - - TRACE("filename = %s\n", g_config.process_file_name); - TRACE("section = %s\n", g_config.game_section[0] ? g_config.game_section : "ddraw"); } -static DWORD cfg_get_game_section(LPSTR buf, DWORD size) +DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size) { - if (!buf || size == 0) - return 0; + if (!g_config.ini_path[0]) + cfg_init(); - char tmp[MAX_PATH] = { 0 }; + DWORD s = GetPrivateProfileStringA( + g_config.process_file_name, key, "", out_string, out_size, g_config.ini_path); - if (IsWine()) + if (s > 0) { - char section[MAX_PATH] = { 0 }; - _snprintf(section, sizeof(section) - 1, "%s/wine", g_config.process_file_name); + char buf[MAX_PATH] = { 0 }; - if (ini_section_exists(&g_config.ini, section)) + if (GetPrivateProfileStringA( + g_config.process_file_name, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) { - strncpy(buf, section, size); - buf[size - 1] = 0; - return strlen(buf); - } - } - - if (ini_section_exists(&g_config.ini, g_config.process_file_name)) - { - if (ini_get_string(&g_config.ini, g_config.process_file_name, "checkfile", "", tmp, sizeof(tmp)) > 0) - { - if (FILE_EXISTS(tmp)) - { - strncpy(buf, g_config.process_file_name, size); - buf[size - 1] = 0; - return strlen(buf); - } + if (GetFileAttributes(buf) != INVALID_FILE_ATTRIBUTES) + return s; } else - { - strncpy(buf, g_config.process_file_name, size); - buf[size - 1] = 0; - return strlen(buf); - } - } - - for (int i = 2; i < 10; i++) - { - char section[MAX_PATH] = { 0 }; - _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, i); - - if (ini_section_exists(&g_config.ini, section)) - { - if (ini_get_string(&g_config.ini, section, "checkfile", "", tmp, sizeof(tmp)) > 0) - { - if (FILE_EXISTS(tmp)) - { - strncpy(buf, section, size); - buf[size - 1] = 0; - return strlen(buf); - } - } - } - } - - buf[0] = 0; - - return 0; -} - -static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR buf, DWORD size) -{ - if (g_config.game_section[0]) - { - DWORD s = ini_get_string(&g_config.ini, g_config.game_section, key, "", buf, size); - - if (s > 0) return s; } - return ini_get_string(&g_config.ini, "ddraw", key, default_value, buf, size); + return GetPrivateProfileStringA("ddraw", key, default_value, out_string, out_size, g_config.ini_path); } -static BOOL cfg_get_bool(LPCSTR key, BOOL default_value) +BOOL cfg_get_bool(LPCSTR key, BOOL default_value) { char value[8]; cfg_get_string(key, default_value ? "Yes" : "No", value, sizeof(value)); @@ -2107,10 +1055,10 @@ static BOOL cfg_get_bool(LPCSTR key, BOOL default_value) return (_stricmp(value, "yes") == 0 || _stricmp(value, "true") == 0 || _stricmp(value, "1") == 0); } -static int cfg_get_int(LPCSTR key, int default_value) +int cfg_get_int(LPCSTR key, int default_value) { - char def_value[24]; - _snprintf(def_value, sizeof(def_value) - 1, "%d", default_value); + char def_value[20]; + _snprintf(def_value, sizeof(def_value), "%d", default_value); char value[20]; cfg_get_string(key, def_value, value, sizeof(value)); diff --git a/src/crc32.c b/src/crc32.c deleted file mode 100644 index e7ff75d..0000000 --- a/src/crc32.c +++ /dev/null @@ -1,105 +0,0 @@ -/*----------------------------------------------------------------------------*\ - * CRC-32 version 2.0.0 by Craig Bruce, 2006-04-29. - * - * This program generates the CRC-32 values for the files named in the - * command-line arguments. These are the same CRC-32 values used by GZIP, - * PKZIP, and ZMODEM. The Crc32_ComputeBuf() can also be detached and - * used independently. - * - * THIS PROGRAM IS PUBLIC-DOMAIN SOFTWARE. - * - * Based on the byte-oriented implementation "File Verification Using CRC" - * by Mark R. Nelson in Dr. Dobb's Journal, May 1992, pp. 64-67. - * - * v1.0.0: original release. - * v1.0.1: fixed printf formats. - * v1.0.2: fixed something else. - * v1.0.3: replaced CRC constant table by generator function. - * v1.0.4: reformatted code, made ANSI C. 1994-12-05. - * v2.0.0: rewrote to use memory buffer & static table, 2006-04-29. -\*----------------------------------------------------------------------------*/ - -#include -#include - - -unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, - size_t bufLen ) -{ - static const unsigned long crcTable[256] = { - 0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535, - 0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD, - 0xE7B82D07,0x90BF1D91,0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D, - 0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC, - 0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,0x3B6E20C8,0x4C69105E,0xD56041E4, - 0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C, - 0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,0x26D930AC, - 0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F, - 0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB, - 0xB6662D3D,0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F, - 0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB, - 0x086D3D2D,0x91646C97,0xE6635C01,0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E, - 0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA, - 0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,0x4DB26158,0x3AB551CE, - 0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A, - 0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9, - 0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409, - 0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81, - 0xB7BD5C3B,0xC0BA6CAD,0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739, - 0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8, - 0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,0xF00F9344,0x8708A3D2,0x1E01F268, - 0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0, - 0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,0xD6D6A3E8, - 0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B, - 0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF, - 0x4669BE79,0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703, - 0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7, - 0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A, - 0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE, - 0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,0x86D3D2D4,0xF1D4E242, - 0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6, - 0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45, - 0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D, - 0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5, - 0x47B2CF7F,0x30B5FFE9,0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605, - 0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94, - 0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D }; - unsigned long crc32; - unsigned char *byteBuf; - size_t i; - - /** accumulate crc32 for buffer **/ - crc32 = inCrc32 ^ 0xFFFFFFFF; - byteBuf = (unsigned char*) buf; - for (i=0; i < bufLen; i++) { - crc32 = (crc32 >> 8) ^ crcTable[ (crc32 ^ byteBuf[i]) & 0xFF ]; - } - return( crc32 ^ 0xFFFFFFFF ); -} - -unsigned long Crc32_FromFile(unsigned long crc32, char* filename) -{ - if (!filename) - return 0; - - FILE* fp = fopen(filename, "rb"); - if (!fp) - return 0; - - char buf[1024]; - for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp)) && !ferror(fp);) - { - crc32 = Crc32_ComputeBuf(crc32, buf, s); - } - - if (ferror(fp)) - crc32 = 0; - - fclose(fp); - - return crc32; -} - -/*----------------------------------------------------------------------------*\ - * END OF MODULE: crc32.c -\*----------------------------------------------------------------------------*/ diff --git a/src/dd.c b/src/dd.c index b9e5b12..eed4a76 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1,12 +1,10 @@ #include -#include #include "ddraw.h" #include "IDirectDraw.h" #include "dd.h" #include "hook.h" #include "config.h" #include "mouse.h" -#include "keyboard.h" #include "wndproc.h" #include "render_d3d9.h" #include "render_gdi.h" @@ -14,11 +12,9 @@ #include "fps_limiter.h" #include "debug.h" #include "utils.h" -#include "blt.h" -#include "versionhelpers.h" -CNCDDRAW g_ddraw; +CNCDDRAW* g_ddraw = NULL; HRESULT dd_EnumDisplayModes( DWORD dwFlags, @@ -26,151 +22,29 @@ HRESULT dd_EnumDisplayModes( LPVOID lpContext, LPDDENUMMODESCALLBACK lpEnumModesCallback) { - dbg_dump_edm_flags(dwFlags); - - DDSURFACEDESC2 s = { 0 }; - DWORD bpp_filter = 0; - - if (lpDDSurfaceDesc) - { - dbg_dump_dds_flags(lpDDSurfaceDesc->dwFlags); - dbg_dump_dds_caps(lpDDSurfaceDesc->ddsCaps.dwCaps); - - if (lpDDSurfaceDesc->dwFlags & DDSD_PIXELFORMAT) - { - TRACE(" ddpfPixelFormat.dwRGBBitCount=%u\n", lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount); - - switch (lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount) - { - case 8: - case 16: - case 32: - bpp_filter = lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount; - 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 res_count = 0; + DDSURFACEDESC2 s; /* Some games crash when you feed them with too many resolutions so we have to keep the list short */ - DWORD max_w = 0; - DWORD max_h = 0; - DEVMODE reg_m; - - memset(®_m, 0, sizeof(DEVMODE)); - reg_m.dmSize = sizeof(DEVMODE); - - if (real_EnumDisplaySettingsA(NULL, ENUM_REGISTRY_SETTINGS, ®_m)) - { - max_w = reg_m.dmPelsWidth; - max_h = reg_m.dmPelsHeight; - - TRACE(" max_w=%u, max_h=%u\n", reg_m.dmPelsWidth, reg_m.dmPelsHeight); - } - - if (g_config.stronghold_hack && max_w && (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 rlm = g_config.resolutions == RESLIST_MINI; - SIZE resolutions[] = { { 320, 200 }, { 320, 240 }, - { rlm ? 0 : 512, rlm ? 0 : 384 }, + { 512, 384 }, { 640, 400 }, { 640, 480 }, { 800, 600 }, { 1024, 768 }, { 1280, 1024 }, - { rlm ? 0 : 1600, rlm ? 0 : 1200 }, + { 1600, 1200 }, { 1280, 720 }, - { rlf ? 1024 : 0, rlf ? 600 : 0 }, - /* 4:3 */ - { rlf ? 1280 : 0, rlf ? 960 : 0 }, - { rlf ? 2048 : 0, rlf ? 1536 : 0 }, - /* 16:10 */ - { rlf ? 960 : 0, rlf ? 600 : 0 }, - { rlf ? 1440 : 0, rlf ? 900 : 0 }, - { rlf ? 1680 : 0, rlf ? 1050 : 0 }, - { rlf ? 1920 : 0, rlf ? 1200 : 0 }, - { rlf ? 2560 : 0, rlf ? 1600 : 0 }, - /* 16:9 */ - { rlf ? 960 : 0, rlf ? 540 : 0 }, - { rlf ? 1360 : 0, rlf ? 768 : 0 }, - { rlf ? 1600 : 0, rlf ? 900 : 0 }, - { rlf ? 1920 : 0, rlf ? 1080 : 0 }, - { rlf ? 2560 : 0, rlf ? 1440 : 0 }, - /* 21:9 */ - { rlf ? 1280 : 0, rlf ? 540 : 0 }, - { rlf ? 1720 : 0, rlf ? 720 : 0 }, - { rlf ? 2560 : 0, rlf ? 1080 : 0 }, - /* Inject custom resolution */ - { custom_width, custom_height }, - { max_w, max_h }, + { 1920, 1080 }, }; - - for (int x = 0; x < (sizeof(resolutions) / sizeof(resolutions[0])) - 1; x++) - { - if (resolutions[x].cx == max_w && resolutions[x].cy == max_h) - { - resolutions[x].cx = 0; - resolutions[x].cy = 0; - } - } - if (((g_ddraw.bpp && !g_ddraw.windowed_hack) && g_config.resolutions == RESLIST_NORMAL) || - g_config.resolutions == RESLIST_FULL) + if (g_ddraw->bpp || g_ddraw->resolutions == RESLIST_FULL) { - TRACE(" g_ddraw.bpp=%u\n", g_ddraw.bpp); + TRACE(" g_ddraw->bpp=%u\n", g_ddraw->bpp); /* set up some filters to keep the list short */ DWORD refresh_rate = 0; @@ -182,23 +56,9 @@ HRESULT dd_EnumDisplayModes( memset(&m, 0, sizeof(DEVMODE)); m.dmSize = sizeof(DEVMODE); - while (real_EnumDisplaySettingsA(NULL, i, &m)) + while (EnumDisplaySettings(NULL, i, &m)) { - TRACE_EXT( - " %u: %ux%u@%u %u bpp | flags=0x%08X, FO=%u\n", - i, - m.dmPelsWidth, - m.dmPelsHeight, - m.dmDisplayFrequency, - m.dmBitsPerPel, - m.dmDisplayFlags, - m.dmDisplayFixedOutput); - - if (refresh_rate != 60 && refresh_rate < 120 && m.dmDisplayFrequency >= 50) - refresh_rate = m.dmDisplayFrequency; - - /* Some setups with 144hz monitors only contain a very few 60hz resolutions so we can't use 60hz as filter */ - if (m.dmDisplayFrequency > refresh_rate && m.dmDisplayFrequency >= 120) + if (refresh_rate != 60 && m.dmDisplayFrequency >= 50) refresh_rate = m.dmDisplayFrequency; if (bpp != 32 && m.dmBitsPerPel >= 16) @@ -219,28 +79,14 @@ HRESULT dd_EnumDisplayModes( m.dmSize = sizeof(DEVMODE); i = 0; - BOOL custom_res_injected = FALSE; - - while (real_EnumDisplaySettingsA(NULL, i, &m)) + while (EnumDisplaySettings(NULL, i, &m)) { if (refresh_rate == m.dmDisplayFrequency && bpp == m.dmBitsPerPel && flags == m.dmDisplayFlags && fixed_output == m.dmDisplayFixedOutput) { - if (g_config.stronghold_hack && m.dmPelsWidth && (m.dmPelsWidth % 8)) - { - while (--m.dmPelsWidth % 8); - } - - if (!custom_res_injected && custom_width && custom_height) - { - m.dmPelsWidth = custom_width; - m.dmPelsHeight = custom_height; - custom_res_injected = TRUE; - } - - TRACE( + TRACE_EXT( " %u: %ux%u@%u %u bpp\n", i, m.dmPelsWidth, @@ -250,84 +96,57 @@ HRESULT dd_EnumDisplayModes( memset(&s, 0, sizeof(s)); + s.dwSize = sizeof(DDSURFACEDESC); + s.dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; + s.dwHeight = m.dmPelsHeight; + s.dwWidth = m.dmPelsWidth; + s.lPitch = s.dwWidth; + s.dwRefreshRate = 60; + s.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + s.ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; s.ddpfPixelFormat.dwRGBBitCount = 8; - s.dwSize = sizeof(DDSURFACEDESC); - s.dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; - s.dwRefreshRate = 60; - s.dwHeight = m.dmPelsHeight; - s.dwWidth = m.dmPelsWidth; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; - s.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - - if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) + if (g_ddraw->bpp == 8 || g_ddraw->resolutions == RESLIST_FULL) { - if (g_ddraw.bpp == 8 || g_config.resolutions == RESLIST_FULL) + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { - if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) - { - TRACE(" resolution limit reached, stopping\n"); - return DD_OK; - } - - if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) - { - TRACE(" DDENUMRET_CANCEL returned, stopping\n"); - return DD_OK; - } + TRACE(" DDENUMRET_CANCEL returned, stopping\n"); + return DD_OK; } } + s.lPitch = s.dwWidth * 2; s.ddpfPixelFormat.dwFlags = DDPF_RGB; s.ddpfPixelFormat.dwRGBBitCount = 16; s.ddpfPixelFormat.dwRBitMask = 0xF800; s.ddpfPixelFormat.dwGBitMask = 0x07E0; s.ddpfPixelFormat.dwBBitMask = 0x001F; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; - if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) + if (g_ddraw->bpp == 16 || g_ddraw->resolutions == RESLIST_FULL) { - if (g_ddraw.bpp == 16 || g_config.resolutions == RESLIST_FULL) + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { - if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) - { - TRACE(" resolution limit reached, stopping\n"); - return DD_OK; - } - - if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) - { - TRACE(" DDENUMRET_CANCEL returned, stopping\n"); - return DD_OK; - } + TRACE(" DDENUMRET_CANCEL returned, stopping\n"); + return DD_OK; } } + s.lPitch = s.dwWidth * 4; 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; - if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) + if (g_ddraw->bpp == 32 || g_ddraw->resolutions == RESLIST_FULL) { - if (g_ddraw.bpp == 32 || g_config.resolutions == RESLIST_FULL) + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { - if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) - { - TRACE(" resolution limit reached, stopping\n"); - return DD_OK; - } - - if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) - { - TRACE(" DDENUMRET_CANCEL returned, stopping\n"); - return DD_OK; - } + TRACE(" DDENUMRET_CANCEL returned, stopping\n"); + return DD_OK; } - } + } for (int x = 0; x < sizeof(resolutions) / sizeof(resolutions[0]); x++) { @@ -345,104 +164,84 @@ HRESULT dd_EnumDisplayModes( } } - if (!g_ddraw.bpp || g_config.resolutions != RESLIST_NORMAL || g_ddraw.windowed_hack) + if (!g_ddraw->bpp || g_ddraw->resolutions == RESLIST_FULL) { + DWORD max_w = 0; + DWORD max_h = 0; + DEVMODE m; + + memset(&m, 0, sizeof(DEVMODE)); + m.dmSize = sizeof(DEVMODE); + + if (EnumDisplaySettings(NULL, ENUM_REGISTRY_SETTINGS, &m)) + { + max_w = m.dmPelsWidth; + max_h = m.dmPelsHeight; + } + for (i = 0; i < sizeof(resolutions) / sizeof(resolutions[0]); i++) { if (!resolutions[i].cx || !resolutions[i].cy) continue; - if (!(resolutions[i].cx == custom_width && resolutions[i].cy == custom_height) && - ((max_w && resolutions[i].cx > max_w) || (max_h && resolutions[i].cy > max_h))) + if ((max_w && resolutions[i].cx > max_w) || (max_h && resolutions[i].cy > max_h)) { - DEVMODE m; memset(&m, 0, sizeof(DEVMODE)); m.dmSize = sizeof(DEVMODE); m.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; m.dmPelsWidth = resolutions[i].cx; m.dmPelsHeight = resolutions[i].cy; - + if (ChangeDisplaySettings(&m, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) - { - TRACE(" SKIPPED: %ux%u\n", m.dmPelsWidth, m.dmPelsHeight); continue; - } } memset(&s, 0, sizeof(s)); + s.dwSize = sizeof(DDSURFACEDESC); + s.dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; + s.dwHeight = resolutions[i].cy; + s.dwWidth = resolutions[i].cx; + s.lPitch = s.dwWidth; + s.dwRefreshRate = 60; s.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); s.ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; s.ddpfPixelFormat.dwRGBBitCount = 8; - s.dwSize = sizeof(DDSURFACEDESC); - s.dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; - s.dwRefreshRate = 60; - s.dwHeight = resolutions[i].cy; - s.dwWidth = resolutions[i].cx; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; - - if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { - if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) - { - TRACE(" resolution limit reached, stopping\n"); - return DD_OK; - } - - if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) - { - TRACE(" DDENUMRET_CANCEL returned, stopping\n"); - return DD_OK; - } + TRACE(" DDENUMRET_CANCEL returned, stopping\n"); + return DD_OK; } + s.lPitch = s.dwWidth * 2; s.ddpfPixelFormat.dwFlags = DDPF_RGB; s.ddpfPixelFormat.dwRGBBitCount = 16; s.ddpfPixelFormat.dwRBitMask = 0xF800; s.ddpfPixelFormat.dwGBitMask = 0x07E0; s.ddpfPixelFormat.dwBBitMask = 0x001F; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; - if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { - if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) - { - TRACE(" resolution limit reached, stopping\n"); - return DD_OK; - } - - if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) - { - TRACE(" DDENUMRET_CANCEL returned, stopping\n"); - return DD_OK; - } + TRACE(" DDENUMRET_CANCEL returned, stopping\n"); + return DD_OK; } - if (g_config.resolutions == RESLIST_MINI) + if (g_ddraw->resolutions == RESLIST_MINI) continue; + s.lPitch = s.dwWidth * 4; 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; - if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) + if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) { - if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) - { - TRACE(" resolution limit reached, stopping\n"); - return DD_OK; - } - - if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL) - { - TRACE(" DDENUMRET_CANCEL returned, stopping\n"); - return DD_OK; - } + TRACE(" DDENUMRET_CANCEL returned, stopping\n"); + return DD_OK; } } } @@ -470,40 +269,12 @@ HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps) DDCAPS_BLTCOLORFILL | DDCAPS_BLTSTRETCH | DDCAPS_CANCLIP | - DDCAPS_CANBLTSYSMEM | - DDCAPS_CANCLIPSTRETCHED | - DDCAPS_COLORKEY; - - lpDDDriverCaps->dwCaps2 = - DDCAPS2_NOPAGELOCKREQUIRED | - DDCAPS2_WIDESURFACES; - - lpDDDriverCaps->dwCKeyCaps = - DDCKEYCAPS_SRCBLT | - DDCKEYCAPS_SRCBLTCLRSPACE; - - lpDDDriverCaps->dwFXCaps = - DDFXCAPS_BLTMIRRORLEFTRIGHT | - DDFXCAPS_BLTMIRRORUPDOWN; - - lpDDDriverCaps->dwPalCaps = - DDPCAPS_8BIT | - DDPCAPS_PRIMARYSURFACE; + DDCAPS_CANBLTSYSMEM; + lpDDDriverCaps->dwPalCaps = DDPCAPS_8BIT | DDPCAPS_PRIMARYSURFACE; lpDDDriverCaps->dwVidMemTotal = 16777216; lpDDDriverCaps->dwVidMemFree = 16777216; - - lpDDDriverCaps->ddsCaps.dwCaps = - DDSCAPS_BACKBUFFER | - DDSCAPS_COMPLEX | - DDSCAPS_FLIP | - DDSCAPS_FRONTBUFFER | - DDSCAPS_OFFSCREENPLAIN | - DDSCAPS_PRIMARYSURFACE | - DDSCAPS_VIDEOMEMORY | - DDSCAPS_OWNDC | - DDSCAPS_LOCALVIDMEM | - DDSCAPS_NONLOCALVIDMEM; + lpDDDriverCaps->ddsCaps.dwCaps = DDSCAPS_FLIP; } if (lpDDEmulCaps) @@ -518,7 +289,6 @@ HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps) memset(lpDDEmulCaps, 0, size); lpDDEmulCaps->dwSize = size; - lpDDEmulCaps->dwCaps = DDCAPS_BLTSTRETCH; } return DD_OK; @@ -532,56 +302,35 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) memset(lpDDSurfaceDesc, 0, size); - unsigned long width = 1024; - unsigned long height = 768; - unsigned long bpp = 16; - - if (g_ddraw.width) - { - width = g_ddraw.width; - height = g_ddraw.height; - bpp = g_ddraw.bpp; - } - else if (g_config.fake_mode[0]) - { - char* e = &g_config.fake_mode[0]; - - width = strtoul(e, &e, 0); - height = strtoul(e + 1, &e, 0); - bpp = strtoul(e + 1, &e, 0); - } - - lpDDSurfaceDesc->ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = bpp; - lpDDSurfaceDesc->dwSize = size; lpDDSurfaceDesc->dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; + lpDDSurfaceDesc->dwHeight = g_ddraw->height ? g_ddraw->height : 768; + lpDDSurfaceDesc->dwWidth = g_ddraw->width ? g_ddraw->width : 1024; + lpDDSurfaceDesc->lPitch = lpDDSurfaceDesc->dwWidth; lpDDSurfaceDesc->dwRefreshRate = 60; - lpDDSurfaceDesc->dwWidth = width; - lpDDSurfaceDesc->dwHeight = height; + lpDDSurfaceDesc->ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - if (bpp == 32 || bpp == 24) + lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; + lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 8; + + if (g_ddraw->bpp == 32) { + lpDDSurfaceDesc->lPitch = lpDDSurfaceDesc->dwWidth * 4; lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; + lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 32; lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xFF0000; lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x00FF00; lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x0000FF; } - else if (bpp == 8) - { - lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; - } - else + else if (g_ddraw->bpp != 8) { + lpDDSurfaceDesc->lPitch = lpDDSurfaceDesc->dwWidth * 2; lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 16; lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xF800; lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x07E0; lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x001F; } - - lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } return DD_OK; @@ -589,978 +338,520 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq) { - if (lpdwFreq) - *lpdwFreq = 60; - - 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"); - + *lpdwFreq = 60; return DD_OK; } HRESULT dd_RestoreDisplayMode() { - if (!g_ddraw.render.run) + if (!g_ddraw->render.run) { return DD_OK; } - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); - - if (g_ddraw.render.thread) + /* only stop drawing in GL mode when minimized */ + if (g_ddraw->renderer != gdi_render_main) { - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; + EnterCriticalSection(&g_ddraw->cs); + g_ddraw->render.run = FALSE; + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw->cs); + + if (g_ddraw->render.thread) + { + WaitForSingleObject(g_ddraw->render.thread, INFINITE); + g_ddraw->render.thread = NULL; + } + + if (g_ddraw->renderer == d3d9_render_main) + { + d3d9_release(); + } } - if (!g_config.windowed) + if (!g_ddraw->windowed) { - if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive) - { - if (!d3d9_reset(TRUE)) - d3d9_release(); - } - else + if (g_ddraw->renderer != d3d9_render_main) { ChangeDisplaySettings(NULL, 0); } } - //real_ShowWindow(g_ddraw.hwnd, SW_MINIMIZE); - return DD_OK; } HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFlags) { - if (!dwWidth) - dwWidth = g_ddraw.width ? g_ddraw.width : 800; - - if (!dwHeight) - dwHeight = g_ddraw.height ? g_ddraw.height : 600; - - if (!dwBPP) - dwBPP = g_ddraw.bpp ? g_ddraw.bpp : 16; - if (dwBPP != 8 && dwBPP != 16 && dwBPP != 32) return DDERR_INVALIDMODE; - if (g_config.mgs_hack && dwHeight == 480) dwHeight -= 32; /* Remove black bar in Metal Gear Solid */ - - if (g_ddraw.render.thread) + if (g_ddraw->render.thread) { - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); + EnterCriticalSection(&g_ddraw->cs); + g_ddraw->render.run = FALSE; + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw->cs); - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; + WaitForSingleObject(g_ddraw->render.thread, INFINITE); + g_ddraw->render.thread = NULL; } - if (!g_ddraw.mode.dmPelsWidth) + if (!g_ddraw->mode.dmPelsWidth) { ChangeDisplaySettings(NULL, 0); - g_ddraw.mode.dmSize = sizeof(DEVMODE); - g_ddraw.mode.dmDriverExtra = 0; + g_ddraw->mode.dmSize = sizeof(DEVMODE); + g_ddraw->mode.dmDriverExtra = 0; - if (real_EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &g_ddraw.mode) == FALSE) + if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &g_ddraw->mode) == FALSE) { - g_ddraw.mode.dmSize = sizeof(DEVMODE); - g_ddraw.mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; - g_ddraw.mode.dmPelsWidth = real_GetSystemMetrics(SM_CXSCREEN); - g_ddraw.mode.dmPelsHeight = real_GetSystemMetrics(SM_CYSCREEN); - g_ddraw.mode.dmDisplayFrequency = 60; - g_ddraw.mode.dmBitsPerPel = 32; + g_ddraw->mode.dmSize = sizeof(DEVMODE); + g_ddraw->mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; + g_ddraw->mode.dmPelsWidth = real_GetSystemMetrics(SM_CXSCREEN); + g_ddraw->mode.dmPelsHeight = real_GetSystemMetrics(SM_CYSCREEN); + g_ddraw->mode.dmDisplayFrequency = 60; + g_ddraw->mode.dmBitsPerPel = 32; - if (!g_ddraw.mode.dmPelsWidth || !g_ddraw.mode.dmPelsHeight) + if (!g_ddraw->mode.dmPelsWidth || !g_ddraw->mode.dmPelsHeight) { - g_config.fullscreen = FALSE; + g_ddraw->fullscreen = FALSE; } } } - BOOL zooming = g_ddraw.zoom.enabled; - g_ddraw.zoom.enabled = FALSE; - - g_ddraw.render.width = g_config.window_rect.right; - g_ddraw.render.height = g_config.window_rect.bottom; + g_ddraw->render.width = g_config.window_rect.right; + g_ddraw->render.height = g_config.window_rect.bottom; /* temporary fix: center window for games that keep changing their resolution */ - if (g_config.center_window && - (g_ddraw.width || g_config.infantryhack || g_config.center_window == CENTER_WINDOW_ALWAYS) && - (g_ddraw.width != dwWidth || g_ddraw.height != dwHeight) && - ( - dwWidth > g_config.window_rect.right || - dwHeight > g_config.window_rect.bottom || - g_config.center_window == CENTER_WINDOW_ALWAYS) - ) + if (g_ddraw->width && + (g_ddraw->width != dwWidth || g_ddraw->height != dwHeight) && + (dwWidth > g_config.window_rect.right || dwHeight > g_config.window_rect.bottom)) { g_config.window_rect.left = -32000; g_config.window_rect.top = -32000; } - g_ddraw.width = dwWidth; - g_ddraw.height = dwHeight; - g_ddraw.bpp = dwBPP; + g_ddraw->width = dwWidth; + g_ddraw->height = dwHeight; + g_ddraw->bpp = dwBPP; - InterlockedExchange((LONG*)&g_ddraw.cursor.x, dwWidth / 2); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, dwHeight / 2); + InterlockedExchange((LONG*)&g_ddraw->cursor.x, dwWidth / 2); + InterlockedExchange((LONG*)&g_ddraw->cursor.y, dwHeight / 2); - BOOL border = g_config.border; + BOOL border = g_ddraw->border; BOOL nonexclusive = FALSE; - if (g_config.fullscreen) + if (g_ddraw->fullscreen) { - g_ddraw.render.width = g_ddraw.mode.dmPelsWidth; - g_ddraw.render.height = g_ddraw.mode.dmPelsHeight; + g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; + g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; - if (g_config.windowed) /* windowed-fullscreen aka borderless */ + if (g_ddraw->windowed) /* windowed-fullscreen aka borderless */ { border = FALSE; - if (!g_config.remove_menu && GetMenu(g_ddraw.hwnd)) - { - g_ddraw.render.height -= real_GetSystemMetrics(SM_CYMENU); - } - /* prevent OpenGL from going automatically into fullscreen exclusive mode */ - if (g_ddraw.renderer == ogl_render_main) + if (g_ddraw->renderer == ogl_render_main) nonexclusive = TRUE; } } - else if (zooming) + + if (g_ddraw->render.width < g_ddraw->width) { - if (g_ddraw.width > g_ddraw.mode.dmPelsWidth || - g_ddraw.height > g_ddraw.mode.dmPelsHeight) - { - /* Downscaling requires adjmouse to be enabled */ - g_config.adjmouse = TRUE; - } - - /* Do not change display resolution when zooming */ - g_ddraw.render.width = g_ddraw.render.mode.dmPelsWidth; - g_ddraw.render.height = g_ddraw.render.mode.dmPelsHeight; - - /* Resize and alt+enter are not supported yet with zooming */ - g_config.resizable = FALSE; - g_config.hotkeys.toggle_fullscreen = 0; + g_ddraw->render.width = g_ddraw->width; } - if (!zooming || g_config.fullscreen) + if (g_ddraw->render.height < g_ddraw->height) { - if (g_ddraw.render.width < g_ddraw.width) - { - g_ddraw.render.width = g_ddraw.width; - } - - if (g_ddraw.render.height < g_ddraw.height) - { - g_ddraw.render.height = g_ddraw.height; - } + g_ddraw->render.height = g_ddraw->height; } - g_ddraw.render.run = TRUE; - - BOOL lock_mouse = g_mouse_locked; + g_ddraw->render.run = TRUE; + BOOL lock_mouse = (g_ddraw->locked || g_ddraw->fullscreen) && !(dwFlags & SDM_LEAVE_FULLSCREEN); mouse_unlock(); - memset(&g_ddraw.render.mode, 0, sizeof(DEVMODE)); - g_ddraw.render.mode.dmSize = sizeof(DEVMODE); + memset(&g_ddraw->render.mode, 0, sizeof(DEVMODE)); - g_ddraw.render.mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; - g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; - g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; + g_ddraw->render.mode.dmSize = sizeof(DEVMODE); + g_ddraw->render.mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; + g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; - if (g_config.refresh_rate) + if (g_ddraw->render.bpp) { - g_ddraw.render.mode.dmFields |= DM_DISPLAYFREQUENCY; - g_ddraw.render.mode.dmDisplayFrequency = g_config.refresh_rate; - - if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) - { - g_config.refresh_rate = 0; - - g_ddraw.render.mode.dmFields &= ~DM_DISPLAYFREQUENCY; - g_ddraw.render.mode.dmDisplayFrequency = 0; - } + g_ddraw->render.mode.dmFields |= DM_BITSPERPEL; + g_ddraw->render.mode.dmBitsPerPel = g_ddraw->render.bpp; } - if (!g_config.windowed) + if (!g_ddraw->windowed) { /* Making sure the chosen resolution is valid */ - if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { /* Try without upscaling */ - 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; - g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; - g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; + g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; + g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; - if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { /* Try 2x scaling */ - g_ddraw.render.width *= 2; - g_ddraw.render.height *= 2; + g_ddraw->render.width *= 2; + g_ddraw->render.height *= 2; - g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; - g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; + g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; + g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; - if ((g_ddraw.render.width > g_ddraw.mode.dmPelsWidth || - g_ddraw.render.height > g_ddraw.mode.dmPelsHeight) || - ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + if ((g_ddraw->render.width > g_ddraw->mode.dmPelsWidth || + g_ddraw->render.height > g_ddraw->mode.dmPelsHeight) || + ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { SIZE res = { 0 }; /* try to get a resolution with the same aspect ratio as the requested resolution */ BOOL found_res = util_get_lowest_resolution( - (float)g_ddraw.width / g_ddraw.height, + (float)g_ddraw->width / g_ddraw->height, &res, - g_ddraw.width + 1, /* don't return the original resolution since we tested that one already */ - g_ddraw.height, - g_ddraw.mode.dmPelsWidth, - g_ddraw.mode.dmPelsHeight); + g_ddraw->width + 1, /* don't return the original resolution since we tested that one already */ + g_ddraw->height + 1, + g_ddraw->mode.dmPelsWidth, + g_ddraw->mode.dmPelsHeight); if (!found_res) { /* try to get a resolution with the same aspect ratio as the current display mode */ found_res = util_get_lowest_resolution( - (float)g_ddraw.mode.dmPelsWidth / g_ddraw.mode.dmPelsHeight, + (float)g_ddraw->mode.dmPelsWidth / g_ddraw->mode.dmPelsHeight, &res, - g_ddraw.width, - g_ddraw.height, - g_ddraw.mode.dmPelsWidth, - g_ddraw.mode.dmPelsHeight); + g_ddraw->width, + g_ddraw->height, + g_ddraw->mode.dmPelsWidth, + g_ddraw->mode.dmPelsHeight); } - g_ddraw.render.width = res.cx; - g_ddraw.render.height = res.cy; + g_ddraw->render.width = res.cx; + g_ddraw->render.height = res.cy; - g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; - g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; + g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; + g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; if (!found_res || - ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { - if (g_ddraw.width > g_ddraw.mode.dmPelsWidth || - g_ddraw.height > g_ddraw.mode.dmPelsHeight) - { - /* Downscaling requires adjmouse to be enabled */ - g_config.adjmouse = TRUE; - } - /* try current display settings */ - g_ddraw.render.width = g_ddraw.mode.dmPelsWidth; - g_ddraw.render.height = g_ddraw.mode.dmPelsHeight; + g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; + g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; - g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; - g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; + g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; + g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; - if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { - /* everything failed, use borderless mode instead */ - ChangeDisplaySettings(NULL, 0); + /* everything failed, use windowed mode instead */ + g_ddraw->render.width = g_ddraw->width; + g_ddraw->render.height = g_ddraw->height; - g_config.windowed = TRUE; - g_config.fullscreen = TRUE; - g_config.toggle_borderless = TRUE; - border = FALSE; + g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; + g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; - /* prevent OpenGL from going automatically into fullscreen exclusive mode */ - if (g_ddraw.renderer == ogl_render_main) - nonexclusive = TRUE; - + g_ddraw->windowed = TRUE; } } } } } } - - /* Support downscaling in borderless mode */ - if (g_config.windowed && g_config.fullscreen) + + g_ddraw->render.viewport.width = g_ddraw->render.width; + g_ddraw->render.viewport.height = g_ddraw->render.height; + g_ddraw->render.viewport.x = 0; + g_ddraw->render.viewport.y = 0; + + if (g_ddraw->boxing) { - if (g_ddraw.width > g_ddraw.mode.dmPelsWidth || - g_ddraw.height > g_ddraw.mode.dmPelsHeight) - { - /* Downscaling requires adjmouse to be enabled */ - g_config.adjmouse = TRUE; + g_ddraw->render.viewport.width = g_ddraw->width; + g_ddraw->render.viewport.height = g_ddraw->height; - g_ddraw.render.width = g_ddraw.mode.dmPelsWidth; - g_ddraw.render.height = g_ddraw.mode.dmPelsHeight; - - g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; - g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; - } - } - - g_ddraw.render.viewport.width = g_ddraw.render.width; - g_ddraw.render.viewport.height = g_ddraw.render.height; - g_ddraw.render.viewport.x = 0; - g_ddraw.render.viewport.y = 0; - - if (g_config.boxing) - { 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.height = i * g_ddraw.height; + g_ddraw->render.viewport.width *= i; + g_ddraw->render.viewport.height *= i; break; } } - g_ddraw.render.viewport.y = g_ddraw.render.height / 2 - g_ddraw.render.viewport.height / 2; - g_ddraw.render.viewport.x = g_ddraw.render.width / 2 - g_ddraw.render.viewport.width / 2; + g_ddraw->render.viewport.y = g_ddraw->render.height / 2 - g_ddraw->render.viewport.height / 2; + g_ddraw->render.viewport.x = g_ddraw->render.width / 2 - g_ddraw->render.viewport.width / 2; } - else if (g_config.maintas) + else if (g_ddraw->maintas) { - double dst_ar; - double src_ar = (double)g_ddraw.render.height / g_ddraw.render.width;; + g_ddraw->render.viewport.width = g_ddraw->render.width; + g_ddraw->render.viewport.height = + (int)(((float)g_ddraw->height / g_ddraw->width) * g_ddraw->render.viewport.width); - if (g_config.aspect_ratio[0]) + if (g_ddraw->render.viewport.height > g_ddraw->render.height) { - char* e = &g_config.aspect_ratio[0]; + g_ddraw->render.viewport.width = + (int)(((float)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); - 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.height = g_ddraw->render.height; } - g_ddraw.render.viewport.width = g_ddraw.render.width; - g_ddraw.render.viewport.height = (int)round(dst_ar * g_ddraw.render.viewport.width); - - if (src_ar < dst_ar) - { - g_ddraw.render.viewport.width = - (int)round(((double)g_ddraw.render.viewport.width / g_ddraw.render.viewport.height) * g_ddraw.render.height); - - g_ddraw.render.viewport.height = g_ddraw.render.height; - } - - g_ddraw.render.viewport.width = min(g_ddraw.render.viewport.width, g_ddraw.render.width); - g_ddraw.render.viewport.height = min(g_ddraw.render.viewport.height, g_ddraw.render.height); - - g_ddraw.render.viewport.y = g_ddraw.render.height / 2 - g_ddraw.render.viewport.height / 2; - g_ddraw.render.viewport.x = g_ddraw.render.width / 2 - g_ddraw.render.viewport.width / 2; + g_ddraw->render.viewport.y = g_ddraw->render.height / 2 - g_ddraw->render.viewport.height / 2; + g_ddraw->render.viewport.x = g_ddraw->render.width / 2 - g_ddraw->render.viewport.width / 2; } - g_ddraw.render.scale_w = ((float)g_ddraw.render.viewport.width / g_ddraw.width); - g_ddraw.render.scale_h = ((float)g_ddraw.render.viewport.height / g_ddraw.height); - g_ddraw.render.unscale_w = ((float)g_ddraw.width / g_ddraw.render.viewport.width); - g_ddraw.render.unscale_h = ((float)g_ddraw.height / g_ddraw.render.viewport.height); + g_ddraw->render.scale_w = ((float)g_ddraw->render.viewport.width / g_ddraw->width); + g_ddraw->render.scale_h = ((float)g_ddraw->render.viewport.height / g_ddraw->height); + g_ddraw->render.unscale_w = ((float)g_ddraw->width / g_ddraw->render.viewport.width); + g_ddraw->render.unscale_h = ((float)g_ddraw->height / g_ddraw->render.viewport.height); - /* Hack for games that require the cursor to be in the exact center of the screen (Worms 2 / Atlantis) */ - if (g_config.center_cursor_fix) + if (!g_ddraw->locktopleft) { - g_ddraw.mouse.scale_x = ((float)(g_ddraw.render.viewport.width) / (g_ddraw.width)); - g_ddraw.mouse.scale_y = ((float)(g_ddraw.render.viewport.height) / (g_ddraw.height)); - g_ddraw.mouse.unscale_x = ((float)(g_ddraw.width) / (g_ddraw.render.viewport.width)); - g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height) / (g_ddraw.render.viewport.height)); - } - else - { - g_ddraw.mouse.scale_x = ((float)(g_ddraw.render.viewport.width - 1) / (g_ddraw.width - 1)); - g_ddraw.mouse.scale_y = ((float)(g_ddraw.render.viewport.height - 1) / (g_ddraw.height - 1)); - g_ddraw.mouse.unscale_x = ((float)(g_ddraw.width - 1) / (g_ddraw.render.viewport.width - 1)); - g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); + g_ddraw->mouse.x_adjust = g_ddraw->render.viewport.x; + g_ddraw->mouse.y_adjust = g_ddraw->render.viewport.y; } - g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; - g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; + g_ddraw->mouse.rc.left = g_ddraw->mouse.x_adjust;; + g_ddraw->mouse.rc.top = g_ddraw->mouse.y_adjust;; + g_ddraw->mouse.rc.right = g_ddraw->width + g_ddraw->mouse.x_adjust; + g_ddraw->mouse.rc.bottom = g_ddraw->height + g_ddraw->mouse.y_adjust; - if (g_config.lock_mouse_top_left) + if (g_ddraw->adjmouse) { - g_ddraw.mouse.x_adjust = 0; - g_ddraw.mouse.y_adjust = 0; + g_ddraw->mouse.rc.right = g_ddraw->render.viewport.width + g_ddraw->mouse.x_adjust; + g_ddraw->mouse.rc.bottom = g_ddraw->render.viewport.height + g_ddraw->mouse.y_adjust; } - g_ddraw.mouse.rc.left = g_ddraw.mouse.x_adjust; - g_ddraw.mouse.rc.top = g_ddraw.mouse.y_adjust; - g_ddraw.mouse.rc.right = g_ddraw.width + g_ddraw.mouse.x_adjust; - g_ddraw.mouse.rc.bottom = g_ddraw.height + g_ddraw.mouse.y_adjust; - - if (g_config.adjmouse) + if (nonexclusive || (g_ddraw->nonexclusive && !g_ddraw->windowed && g_ddraw->renderer == ogl_render_main)) { - g_ddraw.mouse.rc.right = g_ddraw.render.viewport.width + g_ddraw.mouse.x_adjust; - g_ddraw.mouse.rc.bottom = g_ddraw.render.viewport.height + g_ddraw.mouse.y_adjust; + g_ddraw->render.height++; } - if (nonexclusive || (g_config.nonexclusive && !g_config.windowed && g_ddraw.renderer == ogl_render_main)) + if (g_ddraw->windowed) { - g_ddraw.render.height++; - g_ddraw.render.opengl_y_align = 1; - } - else - { - g_ddraw.render.opengl_y_align = 0; - } - - //dbg_dump_wnd_styles(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); - if (g_config.windowed) - { - if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) - SetMenu(g_ddraw.hwnd, NULL); - - if (!g_config.fix_not_responding && - 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 */ - g_ddraw.last_msg_pull_tick = timeGetTime(); - MSG msg; - real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); - } + MSG msg; /* workaround for "Not Responding" window problem in cnc games */ + PeekMessage(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); if (!border) { real_SetWindowLongA( - g_ddraw.hwnd, + g_ddraw->hwnd, GWL_STYLE, - real_GetWindowLongA( - g_ddraw.hwnd, - GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); + GetWindowLong( + g_ddraw->hwnd, GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); } else { real_SetWindowLongA( - g_ddraw.hwnd, + g_ddraw->hwnd, GWL_STYLE, - (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); - } + (GetWindowLong(g_ddraw->hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~WS_MAXIMIZE); } - LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); - - if ((exstyle & WS_EX_TOOLWINDOW)) + if (g_ddraw->wine) { - real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); - } - - exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); - - if ((exstyle & WS_EX_CLIENTEDGE)) - { - real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); - } - - if (IsWine()) - { - LONG remove_flags = !g_config.resizable ? (WS_MAXIMIZEBOX | WS_THICKFRAME) : 0; - real_SetWindowLongA( - g_ddraw.hwnd, + g_ddraw->hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(remove_flags)); + (GetWindowLong(g_ddraw->hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX | WS_THICKFRAME)); } /* center the window with correct dimensions */ - int cy = g_ddraw.mode.dmPelsWidth ? g_ddraw.mode.dmPelsWidth : g_ddraw.render.width; - int cx = g_ddraw.mode.dmPelsHeight ? g_ddraw.mode.dmPelsHeight : g_ddraw.render.height; - int x = (g_config.window_rect.left != -32000) ? g_config.window_rect.left : (cy / 2) - (g_ddraw.render.width / 2); - int y = (g_config.window_rect.top != -32000) ? g_config.window_rect.top : (cx / 2) - (g_ddraw.render.height / 2); + int cy = g_ddraw->mode.dmPelsWidth ? g_ddraw->mode.dmPelsWidth : g_ddraw->render.width; + int cx = g_ddraw->mode.dmPelsHeight ? g_ddraw->mode.dmPelsHeight : g_ddraw->render.height; + int x = (g_config.window_rect.left != -32000) ? g_config.window_rect.left : (cy / 2) - (g_ddraw->render.width / 2); + int y = (g_config.window_rect.top != -32000) ? g_config.window_rect.top : (cx / 2) - (g_ddraw->render.height / 2); - if (g_config.fullscreen) + if (g_ddraw->fullscreen) { x = y = 0; - - if (GetMenu(g_ddraw.hwnd)) - { - y = real_GetSystemMetrics(SM_CYMENU); - } - } - else if (border && g_config.window_rect.top == -32000 && y < 0) - { - /* Make window titlebar visible if window does not fit into screen */ - y = real_GetSystemMetrics(SM_CYCAPTION) + real_GetSystemMetrics(SM_CYSIZEFRAME); } - if (util_is_minimized(g_ddraw.hwnd)) - real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); + if (IsIconic(g_ddraw->hwnd)) + real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); - RECT dst = { x, y, g_ddraw.render.width + x, g_ddraw.render.height + y }; - - LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); - exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); - - AdjustWindowRectEx(&dst, style, GetMenu(g_ddraw.hwnd) != NULL, exstyle); - - real_SetWindowPos( - g_ddraw.hwnd, - HWND_NOTOPMOST, - dst.left, - dst.top, - (dst.right - dst.left), - (dst.bottom - dst.top), - SWP_SHOWWINDOW | SWP_FRAMECHANGED); + RECT dst = { x, y, g_ddraw->render.width + x, g_ddraw->render.height + y }; + AdjustWindowRect(&dst, GetWindowLong(g_ddraw->hwnd, GWL_STYLE), FALSE); + real_SetWindowPos(g_ddraw->hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); + real_MoveWindow(g_ddraw->hwnd, dst.left, dst.top, (dst.right - dst.left), (dst.bottom - dst.top), TRUE); BOOL d3d9_active = FALSE; - if (g_ddraw.renderer == d3d9_render_main) + if (g_ddraw->renderer == d3d9_render_main) { d3d9_active = d3d9_create(); if (!d3d9_active) { d3d9_release(); - g_ddraw.show_driver_warning = TRUE; - g_ddraw.renderer = gdi_render_main; - } - } - else if (g_ddraw.renderer == ogl_render_main) - { - if (!ogl_create()) - { - ogl_release(); - g_ddraw.show_driver_warning = TRUE; - g_ddraw.renderer = gdi_render_main; + g_ddraw->show_driver_warning = TRUE; + g_ddraw->renderer = gdi_render_main; } } - if (lock_mouse || (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd)) + if (lock_mouse) mouse_lock(); } else { - int menu_height = 0; - - if (GetMenu(g_ddraw.hwnd)) - { - if (1) // g_config.remove_menu || !g_config.nonexclusive) - { - SetMenu(g_ddraw.hwnd, NULL); - } - else - { - menu_height = real_GetSystemMetrics(SM_CYMENU); - } - } - - LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); - - DWORD swp_flags = SWP_SHOWWINDOW; + LONG style = GetWindowLong(g_ddraw->hwnd, GWL_STYLE); if ((style & WS_CAPTION)) { - swp_flags |= SWP_FRAMECHANGED; - real_SetWindowLongA( - g_ddraw.hwnd, + g_ddraw->hwnd, GWL_STYLE, style & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); } - LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); - - if ((exstyle & WS_EX_TOOLWINDOW)) - { - real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); - } - - exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); - - if ((exstyle & WS_EX_CLIENTEDGE)) - { - swp_flags |= SWP_FRAMECHANGED; - - real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); - } - BOOL d3d9_active = FALSE; - if (g_ddraw.renderer == d3d9_render_main) + if (g_ddraw->renderer == d3d9_render_main) { - if (g_config.nonexclusive) - { - if (util_is_minimized(g_ddraw.hwnd)) - real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); - - real_SetWindowPos( - g_ddraw.hwnd, - HWND_TOPMOST, - 0, - 0, - g_ddraw.render.width, - g_ddraw.render.height + menu_height, - swp_flags); - - swp_flags = SWP_SHOWWINDOW; - } - d3d9_active = d3d9_create(); if (!d3d9_active) { d3d9_release(); - g_ddraw.show_driver_warning = TRUE; - g_ddraw.renderer = gdi_render_main; + g_ddraw->show_driver_warning = TRUE; + g_ddraw->renderer = gdi_render_main; } } - else if (g_ddraw.renderer == ogl_render_main) + + if (!d3d9_active && ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { - if (!ogl_create()) - { - ogl_release(); - g_ddraw.show_driver_warning = TRUE; - g_ddraw.renderer = gdi_render_main; - } + g_ddraw->render.run = FALSE; + g_ddraw->windowed = TRUE; + return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); } - if (!d3d9_active || g_config.nonexclusive) + if (g_ddraw->wine) { - if (!zooming && ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) - { - g_ddraw.render.run = FALSE; - g_config.windowed = TRUE; - g_config.fullscreen = TRUE; - g_config.toggle_borderless = TRUE; - return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); - } - - /* - Fix wayland bug: - ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed - */ - if (IsWine() && !IsSteamDeck() && - (g_ddraw.render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || - g_ddraw.render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) - { - ChangeDisplaySettings(NULL, 0); - - g_ddraw.render.run = FALSE; - g_config.windowed = TRUE; - g_config.fullscreen = TRUE; - g_config.toggle_borderless = TRUE; - return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); - } + real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, GetWindowLong(g_ddraw->hwnd, GWL_STYLE) | WS_MINIMIZEBOX); } - if (IsWine()) - { - real_SetWindowLongA( - g_ddraw.hwnd, - GWL_STYLE, - real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX); - } - - if (util_is_minimized(g_ddraw.hwnd)) - real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); - real_SetWindowPos( - g_ddraw.hwnd, + g_ddraw->hwnd, HWND_TOPMOST, 0, 0, - g_ddraw.render.width, - g_ddraw.render.height + menu_height, - swp_flags); + g_ddraw->render.width, + g_ddraw->render.height, + SWP_SHOWWINDOW | SWP_FRAMECHANGED); - if (d3d9_active && g_config.nonexclusive) - d3d9_reset(TRUE); - - g_ddraw.last_set_window_pos_tick = timeGetTime(); + g_ddraw->last_set_window_pos_tick = timeGetTime(); mouse_lock(); } - /* Age Of Empires 2 textbox align */ - if (g_ddraw.textbox.hwnd && - g_ddraw.textbox.x && - g_ddraw.textbox.y && - IsWindow(g_ddraw.textbox.hwnd) && - GetParent(g_ddraw.textbox.hwnd) == g_ddraw.hwnd) + if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) { - char class_name[MAX_PATH] = { 0 }; - GetClassNameA(g_ddraw.textbox.hwnd, class_name, sizeof(class_name) - 1); - - if (_strcmpi(class_name, "Edit") == 0) - { - real_SetWindowPos( - g_ddraw.textbox.hwnd, - 0, - (int)(g_ddraw.render.viewport.x + (g_ddraw.textbox.x * g_ddraw.render.scale_w)), - (int)(g_ddraw.render.viewport.y + (g_ddraw.textbox.y * g_ddraw.render.scale_h)), - 0, - 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER - ); - } + RedrawWindow(g_ddraw->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE); + InterlockedExchange(&g_ddraw->render.clear_screen, TRUE); } - RedrawWindow(g_ddraw.hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE); - - if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0) + if (g_ddraw->render.thread == NULL) { - InterlockedExchange(&g_ddraw.render.clear_screen, TRUE); + InterlockedExchange(&g_ddraw->render.palette_updated, TRUE); + InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + + g_ddraw->render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_ddraw->renderer, NULL, 0, NULL); } - if (g_ddraw.render.thread == NULL) + if (dwFlags & SDM_MODE_SET_BY_GAME) { - InterlockedExchange(&g_ddraw.render.palette_updated, TRUE); - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - - DWORD tid; - 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); + real_SendMessageA(g_ddraw->hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw->width, g_ddraw->height)); + real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0)); + real_SendMessageA(g_ddraw->hwnd, WM_DISPLAYCHANGE_DDRAW, g_ddraw->bpp, MAKELPARAM(g_ddraw->width, g_ddraw->height)); } - if ((dwFlags & SDM_MODE_SET_BY_GAME) && !g_config.infantryhack) - { - real_SendMessageA(g_ddraw.hwnd, WM_SIZE_DDRAW, 0, 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; } HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { - dbg_dump_scl_flags(dwFlags); + PIXELFORMATDESCRIPTOR pfd; - if (!hwnd) + if (hwnd == NULL) { - if (!g_ddraw.hwnd && g_config.fake_mode[0]) - { - EnumThreadWindows(GetCurrentThreadId(), (WNDENUMPROC)util_enum_thread_wnd_proc, 0); - hwnd = g_ddraw.hwnd; - - if (!hwnd) - return DD_OK; - } - else - { - return DD_OK; - } + return DD_OK; } - if (!g_ddraw.hwnd) + if (g_ddraw->hwnd == NULL) { - g_ddraw.hwnd = hwnd; + g_ddraw->hwnd = hwnd; } - if (!g_ddraw.wndproc) + if (!g_ddraw->wndproc) { hook_init(); - 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->wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw->hwnd, GWL_WNDPROC, (LONG)fake_WndProc); - 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); - if (g_ddraw.renderer == ogl_render_main) - { - PIXELFORMATDESCRIPTOR pfd; - memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); - pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); + memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); - pfd.nVersion = 1; - pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL; - pfd.iPixelType = PFD_TYPE_RGBA; - pfd.cColorBits = g_ddraw.mode.dmBitsPerPel; - pfd.iLayerType = PFD_MAIN_PLANE; + pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); + pfd.nVersion = 1; + pfd.dwFlags = + PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | (g_ddraw->renderer == ogl_render_main ? PFD_SUPPORT_OPENGL : 0); - SetPixelFormat(g_ddraw.render.hdc, ChoosePixelFormat(g_ddraw.render.hdc, &pfd), &pfd); - } + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = g_ddraw->render.bpp ? g_ddraw->render.bpp : g_ddraw->mode.dmBitsPerPel; + pfd.iLayerType = PFD_MAIN_PLANE; + + SetPixelFormat(g_ddraw->render.hdc, ChoosePixelFormat(g_ddraw->render.hdc, &pfd), &pfd); } - if (!g_config.devmode) + if (!g_ddraw->devmode) { - InterlockedExchange((LONG*)&g_ddraw.old_cursor, (LONG)real_SetCursor(LoadCursor(NULL, IDC_ARROW))); + HCURSOR cursor = real_SetCursor(LoadCursor(NULL, IDC_ARROW)); + InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)cursor); } int cursor_count = real_ShowCursor(TRUE) - 1; - InterlockedExchange((LONG*)&g_ddraw.show_cursor_count, cursor_count); + InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, cursor_count); real_ShowCursor(FALSE); /* Make sure the cursor is visible in windowed mode initially */ - if (g_config.windowed && !g_config.fullscreen && !g_config.devmode && cursor_count < 0) + if (g_ddraw->windowed && !g_ddraw->fullscreen && !g_ddraw->devmode && cursor_count < 0) { while (real_ShowCursor(TRUE) < 0); } - /* Starcraft locks the cursor before ddraw.dll was loaded */ - if (g_config.windowed) + GetWindowText(g_ddraw->hwnd, (LPTSTR)&g_ddraw->title, sizeof(g_ddraw->title)); + + g_ddraw->isredalert = strcmp(g_ddraw->title, "Red Alert") == 0; + g_ddraw->iscnc1 = strcmp(g_ddraw->title, "Command & Conquer") == 0; + g_ddraw->iskkndx = strcmp(g_ddraw->title, "KKND Xtreme") == 0; + + if (g_ddraw->iskkndx) { - real_ClipCursor(NULL); + g_ddraw->upscale_hack_width = 640; + g_ddraw->upscale_hack_height = 480; + } + else if (g_ddraw->isredalert || g_ddraw->iscnc1) + { + g_ddraw->upscale_hack_width = 640; + g_ddraw->upscale_hack_height = 400; } - GetWindowText(g_ddraw.hwnd, (LPTSTR)&g_ddraw.title, sizeof(g_ddraw.title)); - - g_ddraw.isredalert = strcmp(g_ddraw.title, "Red Alert") == 0; - g_ddraw.iscnc1 = strcmp(g_ddraw.title, "Command & Conquer") == 0; - g_ddraw.iskkndx = strcmp(g_ddraw.title, "KKND Xtreme") == 0; - g_ddraw.isworms2 = strcmp(g_ddraw.title, "worms2") == 0; - - if (g_ddraw.iskkndx) + if (g_ddraw->vhack && !g_ddraw->isredalert && !g_ddraw->iscnc1 && !g_ddraw->iskkndx) { - g_ddraw.upscale_hack_width = 640; - g_ddraw.upscale_hack_height = 480; + g_ddraw->vhack = 0; } - else if (g_ddraw.isredalert || g_ddraw.iscnc1) - { - g_ddraw.upscale_hack_width = 640; - g_ddraw.upscale_hack_height = 400; - } - else if (g_ddraw.isworms2) - { - if (memcmp((char*)GetModuleHandleA(NULL) + 0x00010000, "\x17\x81\xC2\x00\x80\x00\x00\x89", 8) != 0) - { - g_ddraw.isworms2 = FALSE; - } - else - { - g_ddraw.upscale_hack_width = 80; - g_ddraw.upscale_hack_height = 60; - } - } - - if (g_config.vhack && !g_ddraw.isredalert && !g_ddraw.iscnc1 && !g_ddraw.iskkndx && !g_ddraw.isworms2) - { - g_config.vhack = 0; - } - } - - /* Infantry Online Zone List Window */ - if (g_config.infantryhack) - { - static BOOL windowed, fullscreen, devmode; - - if (dwFlags & DDSCL_FULLSCREEN) - { - g_config.windowed = windowed; - g_config.fullscreen = fullscreen; - g_config.devmode = devmode; - } - else if (dwFlags & DDSCL_NOWINDOWCHANGES) - { - windowed = g_config.windowed; - fullscreen = g_config.fullscreen; - devmode = g_config.devmode; - - if (GetMenu(g_ddraw.hwnd) != NULL) - { - g_config.windowed = TRUE; - g_config.fullscreen = FALSE; - g_config.devmode = TRUE; - - /* - if (!g_config.window_rect.right && g_config.window_rect.left == -32000) - { - if (real_GetSystemMetrics(SM_CYSCREEN) >= 2160) - { - g_config.window_rect.right = 640 * 3; - g_config.window_rect.bottom = 480 * 3; - } - else if (real_GetSystemMetrics(SM_CYSCREEN) >= 1440) - { - g_config.window_rect.right = 640 * 2; - g_config.window_rect.bottom = 480 * 2; - } - else if (real_GetSystemMetrics(SM_CYSCREEN) >= 1080) - { - g_config.window_rect.right = (LONG)(640 * 1.5f); - g_config.window_rect.bottom = (LONG)(480 * 1.5f); - } - } - */ - } - - dd_SetDisplayMode(640, 480, 16, SDM_MODE_SET_BY_GAME); - } - } - - if ((dwFlags & DDSCL_NORMAL) && !(dwFlags & DDSCL_FULLSCREEN)) - { - if (g_config.fake_mode[0]) - { - char* e = &g_config.fake_mode[0]; - - unsigned long width = strtoul(e, &e, 0); - unsigned long height = strtoul(e + 1, &e, 0); - unsigned long bpp = strtoul(e + 1, &e, 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; @@ -1568,31 +859,32 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { - if (g_config.maxgameticks == -2) + if (g_ddraw->maxgameticks == -2) { - if (fpsl_wait_for_vblank()) + if (fpsl_dwm_flush() || fpsl_wait_for_vblank(g_ddraw->render.maxfps >= 0 && !g_ddraw->vsync)) return DD_OK; } - if (!g_ddraw.flip_limiter.tick_length) + if (!g_ddraw->flip_limiter.tick_length) return DD_OK; - if (g_ddraw.flip_limiter.htimer) + if (g_ddraw->flip_limiter.htimer) { - FILETIME ft = { 0 }; - GetSystemTimeAsFileTime(&ft); + FILETIME last_flip_ft = { 0 }; + GetSystemTimeAsFileTime(&last_flip_ft); - if (CompareFileTime((FILETIME*)&g_ddraw.flip_limiter.due_time, &ft) == -1) + if (!g_ddraw->flip_limiter.due_time.QuadPart) { - memcpy(&g_ddraw.flip_limiter.due_time, &ft, sizeof(LARGE_INTEGER)); + memcpy(&g_ddraw->flip_limiter.due_time, &last_flip_ft, sizeof(LARGE_INTEGER)); } else { - WaitForSingleObject(g_ddraw.flip_limiter.htimer, g_ddraw.flip_limiter.tick_length * 2); - } + while (CompareFileTime((FILETIME*)&g_ddraw->flip_limiter.due_time, &last_flip_ft) == -1) + g_ddraw->flip_limiter.due_time.QuadPart += g_ddraw->flip_limiter.tick_length_ns; - g_ddraw.flip_limiter.due_time.QuadPart += g_ddraw.flip_limiter.tick_length_ns; - SetWaitableTimer(g_ddraw.flip_limiter.htimer, &g_ddraw.flip_limiter.due_time, 0, NULL, NULL, FALSE); + SetWaitableTimer(g_ddraw->flip_limiter.htimer, &g_ddraw->flip_limiter.due_time, 0, NULL, NULL, FALSE); + WaitForSingleObject(g_ddraw->flip_limiter.htimer, g_ddraw->flip_limiter.tick_length * 2); + } } else { @@ -1604,12 +896,12 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) return DD_OK; } - next_game_tick += g_ddraw.flip_limiter.tick_length; + next_game_tick += g_ddraw->flip_limiter.tick_length; DWORD tick_count = timeGetTime(); int sleep_time = next_game_tick - tick_count; - if (sleep_time <= 0 || sleep_time > g_ddraw.flip_limiter.tick_length) + if (sleep_time <= 0 || sleep_time > g_ddraw->flip_limiter.tick_length) { next_game_tick = tick_count; } @@ -1624,70 +916,61 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) ULONG dd_AddRef() { - return InterlockedIncrement(&g_ddraw.ref); + return ++g_ddraw->ref; } ULONG dd_Release() { - LONG ref = InterlockedDecrement(&g_ddraw.ref); + g_ddraw->ref--; - if (ref == 0) + if (g_ddraw->ref == 0) { - if (g_ddraw.bpp) + if (g_ddraw->bpp) { cfg_save(); } - if (g_ddraw.render.run) + if (g_ddraw->render.run) { - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); + EnterCriticalSection(&g_ddraw->cs); + g_ddraw->render.run = FALSE; + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw->cs); - if (g_ddraw.render.thread) + if (g_ddraw->render.thread) { - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; + WaitForSingleObject(g_ddraw->render.thread, INFINITE); + g_ddraw->render.thread = NULL; } - } - if (!g_config.windowed) - { - if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive) + if (g_ddraw->renderer == d3d9_render_main) { - if (!d3d9_reset(TRUE)) - d3d9_release(); + d3d9_release(); } - else + else if (!g_ddraw->windowed) { ChangeDisplaySettings(NULL, 0); } } - if (g_ddraw.renderer == ogl_render_main) + if (g_ddraw->render.hdc) { - ogl_release(); + ReleaseDC(g_ddraw->hwnd, g_ddraw->render.hdc); + g_ddraw->render.hdc = NULL; } - if (g_ddraw.render.hdc) + if (g_ddraw->ticks_limiter.htimer) { - ReleaseDC(g_ddraw.hwnd, g_ddraw.render.hdc); - g_ddraw.render.hdc = NULL; + CancelWaitableTimer(g_ddraw->ticks_limiter.htimer); + CloseHandle(g_ddraw->ticks_limiter.htimer); + g_ddraw->ticks_limiter.htimer = NULL; } - if (g_ddraw.ticks_limiter.htimer) + if (g_ddraw->flip_limiter.htimer) { - CancelWaitableTimer(g_ddraw.ticks_limiter.htimer); - CloseHandle(g_ddraw.ticks_limiter.htimer); - g_ddraw.ticks_limiter.htimer = NULL; - } - - if (g_ddraw.flip_limiter.htimer) - { - CancelWaitableTimer(g_ddraw.flip_limiter.htimer); - CloseHandle(g_ddraw.flip_limiter.htimer); - g_ddraw.flip_limiter.htimer = NULL; + CancelWaitableTimer(g_ddraw->flip_limiter.htimer); + CloseHandle(g_ddraw->flip_limiter.htimer); + g_ddraw->flip_limiter.htimer = NULL; } if (g_fpsl.htimer) @@ -1697,31 +980,23 @@ ULONG dd_Release() g_fpsl.htimer = NULL; } - if (g_ddraw.real_dd) + if (g_ddraw->real_dd) { - g_ddraw.real_dd->lpVtbl->Release(g_ddraw.real_dd); + g_ddraw->real_dd->lpVtbl->Release(g_ddraw->real_dd); } - DeleteCriticalSection(&g_ddraw.cs); + DeleteCriticalSection(&g_ddraw->cs); + + /* restore old wndproc, subsequent ddraw creation will otherwise fail */ + real_SetWindowLongA(g_ddraw->hwnd, GWL_WNDPROC, (LONG)g_ddraw->wndproc); + + HeapFree(GetProcessHeap(), 0, g_ddraw); + g_ddraw = NULL; - if (g_ddraw.hwnd && IsWindow(g_ddraw.hwnd)) - { - /* restore old wndproc, subsequent ddraw creation will otherwise fail */ - real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)g_ddraw.wndproc); - } - - memset(&g_ddraw, 0, sizeof(g_ddraw)); - return 0; } - if (ref < 0) - { - InterlockedExchange(&g_ddraw.ref, 0); - return 0; - } - - return (ULONG)ref; + return g_ddraw->ref; } HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) @@ -1735,15 +1010,12 @@ HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpd return DD_OK; } -HRESULT dd_TestCooperativeLevel() +HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB) { - if (g_config.limiter_type == LIMIT_TESTCOOP && g_ddraw.ticks_limiter.tick_length > 0) - { - g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; - util_limit_game_ticks(); - } + if (lpbIsInVB) + *lpbIsInVB = TRUE; - return g_config.tlc_hack ? DDERR_NOEXCLUSIVEMODE : DD_OK; + return DD_OK; } HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID riid) @@ -1765,142 +1037,18 @@ HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter) { - if (InterlockedExchangeAdd((LONG*)&g_ddraw.ref, 0) == 0) + if (!g_ddraw) { - InterlockedIncrement(&g_ddraw.ref); + g_ddraw = (CNCDDRAW*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CNCDDRAW)); + g_ddraw->ref++; - InitializeCriticalSection(&g_ddraw.cs); + InitializeCriticalSection(&g_ddraw->cs); - g_ddraw.render.sem = CreateSemaphore(NULL, 0, 1, NULL); - g_blt_use_avx = util_is_avx_supported(); + g_ddraw->render.sem = CreateSemaphore(NULL, 0, 1, NULL); + g_ddraw->wine = GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; - if (g_config.minfps > 1000) - g_config.minfps = 1000; - - if (g_config.minfps > 0) - g_ddraw.minfps_tick_len = (DWORD)(1000.0f / g_config.minfps); - - - HANDLE (WINAPI *createTimerExW)(LPSECURITY_ATTRIBUTES, LPCWSTR, DWORD, DWORD) = NULL; - - if (!IsWine() && IsWindows10Version1803OrGreater()) - { - createTimerExW = (void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "CreateWaitableTimerExW"); - } - - DWORD timer_flags = CREATE_WAITABLE_TIMER_MANUAL_RESET | CREATE_WAITABLE_TIMER_HIGH_RESOLUTION; - - /* can't fully set it up here due to missing g_ddraw.mode.dmDisplayFrequency */ - g_fpsl.htimer = createTimerExW ? createTimerExW(NULL, NULL, timer_flags, TIMER_ALL_ACCESS) : NULL; - - if (!g_fpsl.htimer) - g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL); - - if (g_config.maxgameticks > 0 && g_config.maxgameticks <= 1000) - { - g_ddraw.ticks_limiter.htimer = createTimerExW ? createTimerExW(NULL, NULL, timer_flags, TIMER_ALL_ACCESS) : NULL; - - if (!g_ddraw.ticks_limiter.htimer) - g_ddraw.ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); - - float len = 1000.0f / g_config.maxgameticks; - g_ddraw.ticks_limiter.tick_length_ns = (LONGLONG)(len * 10000); - g_ddraw.ticks_limiter.tick_length = (DWORD)(len + 0.5f); - } - - if (g_config.maxgameticks >= 0 || g_config.maxgameticks == -2) - { - /* always using 60 fps for flip... */ - g_ddraw.flip_limiter.htimer = createTimerExW ? createTimerExW(NULL, NULL, timer_flags, TIMER_ALL_ACCESS) : NULL; - - if (!g_ddraw.flip_limiter.htimer) - g_ddraw.flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); - - float flip_len = 1000.0f / 60; - g_ddraw.flip_limiter.tick_length_ns = (LONGLONG)(flip_len * 10000); - g_ddraw.flip_limiter.tick_length = (DWORD)(flip_len + 0.5f); - } - - - DWORD system_affinity; - DWORD proc_affinity; - HANDLE proc = GetCurrentProcess(); - - if (g_config.singlecpu) - { - if (!IsWine() && IsWindows11Version24H2OrGreater()) - { - 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)) - { - SetProcessAffinityMask(proc, system_affinity); - } - - if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) - { - TRACE(" proc_affinity=%08X, system_affinity=%08X\n", proc_affinity, system_affinity); - } - - - if (_strcmpi(g_config.renderer, "direct3d9on12") == 0) - { - g_config.d3d9on12 = TRUE; - } - else if (_strcmpi(g_config.renderer, "openglcore") == 0) - { - g_config.opengl_core = TRUE; - } - - if (tolower(g_config.renderer[0]) == 'd') /* direct3d9 or direct3d9on12*/ - { - g_ddraw.renderer = d3d9_render_main; - } - else if (tolower(g_config.renderer[0]) == 's' || tolower(g_config.renderer[0]) == 'g') /* gdi */ - { - g_ddraw.renderer = gdi_render_main; - } - else if (tolower(g_config.renderer[0]) == 'o') /* opengl or openglcore */ - { - if (oglu_load_dll()) - { - g_ddraw.renderer = ogl_render_main; - } - else - { - g_ddraw.show_driver_warning = TRUE; - g_ddraw.renderer = gdi_render_main; - } - } - else /* auto */ - { - if (!IsWine() && d3d9_is_available()) - { - g_ddraw.renderer = d3d9_render_main; - } - else if (oglu_load_dll()) - { - g_ddraw.renderer = ogl_render_main; - } - else - { - g_ddraw.show_driver_warning = TRUE; - g_ddraw.renderer = gdi_render_main; - } - } - - LONG ref = InterlockedDecrement(&g_ddraw.ref); - - if (ref < 0) - InterlockedExchange(&g_ddraw.ref, 0); + cfg_load(); + g_ddraw->ref--; } IDirectDrawImpl* dd = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl)); diff --git a/src/ddclipper.c b/src/ddclipper.c index d1d6ceb..b09e880 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -3,195 +3,8 @@ #include "IDirectDrawClipper.h" #include "ddclipper.h" #include "debug.h" -#include "dd.h" -HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSiz) -{ - EnterCriticalSection(&This->cs); - - if (!This->region) - { - LeaveCriticalSection(&This->cs); - return DDERR_NOCLIPLIST; - } - - if (!lpdwSiz) - { - LeaveCriticalSection(&This->cs); - return DDERR_INVALIDPARAMS; - } - - HRGN region = NULL; - - if (lpRect) - { - region = CreateRectRgnIndirect(lpRect); - - if (!region) - { - LeaveCriticalSection(&This->cs); - return DDERR_INVALIDPARAMS; - } - - if (CombineRgn(region, This->region, region, RGN_AND) == ERROR) - { - DeleteObject(region); - - LeaveCriticalSection(&This->cs); - return DDERR_GENERIC; - } - } - else - { - region = This->region; - } - - *lpdwSiz = GetRegionData(region, *lpdwSiz, lpClipList); - - if (lpRect) - DeleteObject(region); - - if (*lpdwSiz == 0) - { - LeaveCriticalSection(&This->cs); - return DDERR_REGIONTOOSMALL; - } - - LeaveCriticalSection(&This->cs); - return DD_OK; -} - -HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd) -{ - EnterCriticalSection(&This->cs); - - if (!lphWnd) - { - LeaveCriticalSection(&This->cs); - return DDERR_INVALIDPARAMS; - } - - *lphWnd = This->hwnd; - - LeaveCriticalSection(&This->cs); - return DD_OK; -} - -HRESULT ddc_IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged) -{ - EnterCriticalSection(&This->cs); - - if (!lpbChanged) - { - LeaveCriticalSection(&This->cs); - return DDERR_INVALIDPARAMS; - } - - *lpbChanged = FALSE; /* Always return FALSE - See ddc_SetHWnd for remarks */ - - LeaveCriticalSection(&This->cs); - return DD_OK; -} - -HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) -{ - EnterCriticalSection(&This->cs); - - if (This->hwnd) - { - LeaveCriticalSection(&This->cs); - return DDERR_CLIPPERISUSINGHWND; - } - - if (lpClipList) - { - if (!lpClipList->rdh.nCount) - { - LeaveCriticalSection(&This->cs); - return DDERR_INVALIDCLIPLIST; - } - - if (This->region) - DeleteObject(This->region); - - RECT* rc = (RECT*)lpClipList->Buffer; - - This->region = CreateRectRgnIndirect(&rc[0]); - - if (!This->region) - { - LeaveCriticalSection(&This->cs); - return DDERR_INVALIDCLIPLIST; - } - - for (int i = 1; i < lpClipList->rdh.nCount; ++i) - { - HRGN region = CreateRectRgnIndirect(&rc[i]); - - if (!region) - { - LeaveCriticalSection(&This->cs); - return DDERR_INVALIDCLIPLIST; - } - - if (CombineRgn(This->region, region, This->region, RGN_OR) == ERROR) - { - DeleteObject(region); - DeleteObject(This->region); - This->region = NULL; - - LeaveCriticalSection(&This->cs); - return DDERR_INVALIDCLIPLIST; - } - - DeleteObject(region); - } - } - else - { - if (This->region) - DeleteObject(This->region); - - This->region = NULL; - } - - LeaveCriticalSection(&This->cs); - return DD_OK; -} - -HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) -{ - EnterCriticalSection(&This->cs); - /* - We don't use the regions from the hwnd here since everything is emulated and we need the entire - emulated surface to be redrawn all the time - */ - This->hwnd = hWnd; - - if (hWnd && !This->region && g_ddraw.width) - { - RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height }; - ddc_SetClipRect(This, &rc); - } - - LeaveCriticalSection(&This->cs); - return DD_OK; -} - -HRESULT ddc_SetClipRect(IDirectDrawClipperImpl* This, LPRECT lpRect) -{ - EnterCriticalSection(&This->cs); - - if (This->region) - DeleteObject(This->region); - - This->region = CreateRectRgnIndirect(lpRect); - - LeaveCriticalSection(&This->cs); - return DD_OK; -} - HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper, IUnknown FAR* pUnkOuter) { if (!lplpDDClipper) @@ -204,7 +17,6 @@ HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper, c->lpVtbl = &g_ddc_vtbl; IDirectDrawClipper_AddRef(c); - InitializeCriticalSection(&c->cs); *lplpDDClipper = c; diff --git a/src/ddpalette.c b/src/ddpalette.c index e51df8e..7fcf362 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -14,15 +14,11 @@ HRESULT ddp_GetEntries( DWORD dwNumEntries, LPPALETTEENTRY lpEntries) { - if (!lpEntries) - return DDERR_INVALIDPARAMS; - - for (int i = dwBase, x = 0; i < dwBase + dwNumEntries && i < 256; i++, x++) + for (int i = dwBase, x = 0; i < dwBase + dwNumEntries; i++, x++) { lpEntries[x].peRed = This->data_rgb[i].rgbRed; lpEntries[x].peGreen = This->data_rgb[i].rgbGreen; lpEntries[x].peBlue = This->data_rgb[i].rgbBlue; - lpEntries[x].peFlags = 0; } return DD_OK; @@ -35,17 +31,7 @@ HRESULT ddp_SetEntries( DWORD dwCount, LPPALETTEENTRY lpEntries) { - if (!lpEntries) - return DDERR_INVALIDPARAMS; - - RGBQUAD data_rgb[256]; - - if ((dwFlags & DDPCAPS_REFRESH_CHANGED_ONLY)) - { - memcpy(data_rgb, This->data_rgb, sizeof(This->data_rgb)); - } - - for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount && i < 256; i++, x++) + for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount; i++, x++) { This->data_bgr[i] = (lpEntries[x].peBlue << 16) | (lpEntries[x].peGreen << 8) | lpEntries[x].peRed; @@ -71,21 +57,10 @@ HRESULT ddp_SetEntries( This->data_rgb[255].rgbReserved = 0; } - if ((dwFlags & DDPCAPS_REFRESH_CHANGED_ONLY)) + if (g_ddraw->primary && g_ddraw->primary->palette == This && g_ddraw->render.run) { - if (memcmp(data_rgb, This->data_rgb, sizeof(This->data_rgb)) == 0) - { - // do not set palette_updated BOOL if nothing changed - return DD_OK; - } - - TRACE_EXT(" Palette changed\n"); - } - - if (g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette == This && g_ddraw.render.run) - { - InterlockedExchange(&g_ddraw.render.palette_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + InterlockedExchange(&g_ddraw->render.palette_updated, TRUE); + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); } return DD_OK; @@ -97,8 +72,6 @@ HRESULT dd_CreatePalette( IDirectDrawPaletteImpl** lpDDPalette, IUnknown FAR* unkOuter) { - dbg_dump_ddp_flags(dwFlags); - if (!lpDDPalette || !lpDDColorArray) return DDERR_INVALIDPARAMS; diff --git a/src/ddsurface.c b/src/ddsurface.c index 96d69de..3237122 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -5,21 +5,13 @@ #include "hook.h" #include "ddsurface.h" #include "mouse.h" +#include "scale_pattern.h" #include "IDirectDrawSurface.h" #include "winapi_hooks.h" #include "debug.h" #include "utils.h" -#include "blt.h" -#include "config.h" -#include "ddclipper.h" -#include "utils.h" -#include "versionhelpers.h" -#include "ddpalette.h" -#include "palette.h" -LONG g_dds_gdi_handles; - HRESULT dds_AddAttachedSurface(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurface) { if (lpDDSurface) @@ -28,13 +20,7 @@ HRESULT dds_AddAttachedSurface(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceI if (!This->backbuffer) { - if (This->caps & DDSCAPS_FRONTBUFFER) - { - lpDDSurface->caps |= DDSCAPS_BACKBUFFER; - } - - lpDDSurface->caps |= DDSCAPS_FLIP; - + lpDDSurface->caps |= DDSCAPS_BACKBUFFER; This->backbuffer = lpDDSurface; } } @@ -43,29 +29,17 @@ HRESULT dds_AddAttachedSurface(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceI } HRESULT dds_Blt( - IDirectDrawSurfaceImpl* This, - LPRECT lpDestRect, - IDirectDrawSurfaceImpl* lpDDSrcSurface, - LPRECT lpSrcRect, - DWORD dwFlags, + IDirectDrawSurfaceImpl* This, + LPRECT lpDestRect, + IDirectDrawSurfaceImpl* lpDDSrcSurface, + LPRECT lpSrcRect, + DWORD dwFlags, LPDDBLTFX lpDDBltFx) { - if (lpDDSrcSurface && - lpDDSrcSurface->bpp != 8 && - lpDDSrcSurface->bpp != 16 && - lpDDSrcSurface->bpp != 24 && - lpDDSrcSurface->bpp != 32) - { - return DDERR_INVALIDPARAMS; - } - dbg_dump_dds_blt_flags(dwFlags); dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0); - util_pull_messages(); - - if (g_ddraw.ref && - g_ddraw.iskkndx && + if (g_ddraw->iskkndx && (dwFlags & DDBLT_COLORFILL) && lpDestRect && lpDestRect->right == 640 && @@ -85,124 +59,21 @@ HRESULT dds_Blt( RECT dst_rect = { 0, 0, This->width, This->height }; if (lpSrcRect && src_surface) - { - //dbg_print_rect("lpSrcRect", lpSrcRect); - src_rect = *lpSrcRect; - } + memcpy(&src_rect, lpSrcRect, sizeof(src_rect)); if (lpDestRect) - { - //dbg_print_rect("lpDestRect", lpDestRect); - dst_rect = *lpDestRect; - } + memcpy(&dst_rect, lpDestRect, sizeof(dst_rect)); - int src_w = src_rect.right - src_rect.left; - int src_h = src_rect.bottom - src_rect.top; - - int dst_w = dst_rect.right - dst_rect.left; - int dst_h = dst_rect.bottom - dst_rect.top; - - float scale_w = (src_w > 0 && dst_w > 0) ? (float)src_w / dst_w : 1.0f; - float scale_h = (src_h > 0 && dst_h > 0) ? (float)src_h / dst_h : 1.0f; - - BOOL is_stretch_blt = src_w != dst_w || src_h != dst_h; - - if (This->clipper && !This->clipper->hwnd && !(dwFlags & DDBLT_NO_CLIP) && dst_w > 0 && dst_h > 0) - { - DWORD size = 0; - - HRESULT result = ddc_GetClipList(This->clipper, &dst_rect, NULL, &size); - - if (SUCCEEDED(result)) - { - RGNDATA* list = (RGNDATA*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); - - if (list) - { - if (SUCCEEDED(ddc_GetClipList(This->clipper, &dst_rect, list, &size))) - { - RECT* dst_c_rect = (RECT*)list->Buffer; - - for (int i = 0; i < list->rdh.nCount; ++i) - { - RECT src_c_rect = src_rect; - - if (src_surface) - { - src_c_rect.left += (LONG)((dst_c_rect[i].left - dst_rect.left) * scale_w); - src_c_rect.top += (LONG)((dst_c_rect[i].top - dst_rect.top) * scale_h); - src_c_rect.right -= (LONG)((dst_rect.right - dst_c_rect[i].right) * scale_w); - src_c_rect.bottom -= (LONG)((dst_rect.bottom - dst_c_rect[i].bottom) * scale_h); - } - - dds_Blt(This, &dst_c_rect[i], src_surface, &src_c_rect, dwFlags | DDBLT_NO_CLIP, lpDDBltFx); - } - } - - HeapFree(GetProcessHeap(), 0, list); - - return DD_OK; - } - } - else if (result == DDERR_NOCLIPLIST) - { - TRACE(" DDERR_NOCLIPLIST\n"); - //return DDERR_NOCLIPLIST; - } - else - { - TRACE(" DDERR_INVALIDCLIPLIST\n"); - //return DDERR_INVALIDCLIPLIST; - } - } - - if (dst_rect.right < 0) - dst_rect.right = 0; - - if (dst_rect.left < 0) - { - src_rect.left += (LONG)(abs(dst_rect.left) * scale_w); - dst_rect.left = 0; - } - - if (dst_rect.bottom < 0) - dst_rect.bottom = 0; - - if (dst_rect.top < 0) - { - src_rect.top += (LONG)(abs(dst_rect.top) * scale_h); - dst_rect.top = 0; - } - - if (dst_rect.right > This->width) - { - src_rect.right -= (LONG)((dst_rect.right - This->width) * scale_w); - dst_rect.right = This->width; - } - - if (dst_rect.left > dst_rect.right) - dst_rect.left = dst_rect.right; - - if (dst_rect.bottom > This->height) - { - src_rect.bottom -= (LONG)((dst_rect.bottom - This->height) * scale_h); - dst_rect.bottom = This->height; - } - - if (dst_rect.top > dst_rect.bottom) - dst_rect.top = dst_rect.bottom; + /* stretch or clip? */ + BOOL is_stretch_blt = + ((src_rect.right - src_rect.left) != (dst_rect.right - dst_rect.left)) || + ((src_rect.bottom - src_rect.top) != (dst_rect.bottom - dst_rect.top)); if (src_surface) { - if (src_rect.right < 0) - src_rect.right = 0; - if (src_rect.left < 0) src_rect.left = 0; - if (src_rect.bottom < 0) - src_rect.bottom = 0; - if (src_rect.top < 0) src_rect.top = 0; @@ -219,55 +90,119 @@ HRESULT dds_Blt( src_rect.top = src_rect.bottom; } - src_w = src_rect.right - src_rect.left; - src_h = src_rect.bottom - src_rect.top; + if (dst_rect.left < 0) + dst_rect.left = 0; + if (dst_rect.top < 0) + dst_rect.top = 0; + + if (dst_rect.right > This->width) + dst_rect.right = This->width; + + if (dst_rect.left > dst_rect.right) + dst_rect.left = dst_rect.right; + + if (dst_rect.bottom > This->height) + dst_rect.bottom = This->height; + + if (dst_rect.top > dst_rect.bottom) + dst_rect.top = dst_rect.bottom; + + int src_w = src_rect.right - src_rect.left; + int src_h = src_rect.bottom - src_rect.top; int src_x = src_rect.left; int src_y = src_rect.top; - dst_w = dst_rect.right - dst_rect.left; - dst_h = dst_rect.bottom - dst_rect.top; - + int dst_w = dst_rect.right - dst_rect.left; + int dst_h = dst_rect.bottom - dst_rect.top; int dst_x = dst_rect.left; int dst_y = dst_rect.top; void* dst_buf = dds_GetBuffer(This); void* src_buf = dds_GetBuffer(src_surface); - if (dst_buf && (dwFlags & DDBLT_COLORFILL) && lpDDBltFx && dst_w > 0 && dst_h > 0) + if (dst_buf && (dwFlags & DDBLT_COLORFILL) && dst_w > 0 && dst_h > 0) { - if (This->bpp == 24) - { - TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, dwFillColor=%08X\n", This->bpp, lpDDBltFx->dwFillColor); - } + unsigned char* dst = (unsigned char*)dst_buf + (dst_x * This->lx_pitch) + (This->l_pitch * dst_y); + unsigned char* first_row = dst; + unsigned int dst_pitch = dst_w * This->lx_pitch; + int x, i; - blt_colorfill( - dst_buf, - dst_x, - dst_y, - dst_w, - dst_h, - This->pitch, - lpDDBltFx->dwFillColor, - This->bpp); + if (This->bpp == 8) + { + unsigned char color = (unsigned char)lpDDBltFx->dwFillColor; + + for (i = 0; i < dst_h; i++) + { + memset(dst, color, dst_pitch); + dst += This->l_pitch; + } + } + else if (This->bpp == 16) + { + unsigned short* row1 = (unsigned short*)dst; + unsigned short color = (unsigned short)lpDDBltFx->dwFillColor; + + if ((color & 0xFF) == (color >> 8)) + { + unsigned char c8 = (unsigned char)(color & 0xFF); + + for (i = 0; i < dst_h; i++) + { + memset(dst, c8, dst_pitch); + dst += This->l_pitch; + } + } + else + { + for (x = 0; x < dst_w; x++) + row1[x] = color; + + for (i = 1; i < dst_h; i++) + { + dst += This->l_pitch; + memcpy(dst, first_row, dst_pitch); + } + } + } + else if (This->bpp == 32) + { + unsigned int* row1 = (unsigned int*)dst; + unsigned int color = lpDDBltFx->dwFillColor; + + if ((color & 0xFF) == ((color >> 8) & 0xFF) && + (color & 0xFF) == ((color >> 16) & 0xFF) && + (color & 0xFF) == ((color >> 24) & 0xFF)) + { + unsigned char c8 = (unsigned char)(color & 0xFF); + + for (i = 0; i < dst_h; i++) + { + memset(dst, c8, dst_pitch); + dst += This->l_pitch; + } + } + else + { + for (x = 0; x < dst_w; x++) + row1[x] = color; + + for (i = 1; i < dst_h; i++) + { + dst += This->l_pitch; + memcpy(dst, first_row, dst_pitch); + } + } + } } if (src_surface && src_w > 0 && src_h > 0 && dst_w > 0 && dst_h > 0) { - if (!is_stretch_blt) - { - src_w = dst_w = min(src_w, dst_w); - src_h = dst_h = min(src_h, dst_h); - } - BOOL got_fx = (dwFlags & DDBLT_DDFX) && lpDDBltFx; BOOL mirror_left_right = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORLEFTRIGHT); BOOL mirror_up_down = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORUPDOWN); - if (This->bpp != src_surface->bpp || - This->bpp == 24 || - src_surface->bpp == 24 || - (is_stretch_blt && This == src_surface)) + if (This->bpp != src_surface->bpp) { TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp); @@ -277,66 +212,11 @@ HRESULT dds_Blt( HDC src_dc; dds_GetDC(src_surface, &src_dc); - if (((dwFlags & DDBLT_KEYSRC) && (src_surface->flags & DDSD_CKSRCBLT)) || (dwFlags & DDBLT_KEYSRCOVERRIDE)) - { - UINT color = - (dwFlags & DDBLT_KEYSRCOVERRIDE) ? - lpDDBltFx->ddckSrcColorkey.dwColorSpaceLowValue : src_surface->color_key.dwColorSpaceLowValue; - - if (src_surface->bpp == 32 || src_surface->bpp == 24) - { - color = color & 0xFFFFFF; - } - else if (src_surface->bpp == 16) - { - unsigned short c = (unsigned short)color; - - BYTE r = ((c & 0xF800) >> 11) << 3; - BYTE g = ((c & 0x07E0) >> 5) << 2; - BYTE b = ((c & 0x001F)) << 3; - - color = RGB(r, g, b); - } - else if (src_surface->bpp == 8) - { - RGBQUAD* quad = - src_surface->palette ? src_surface->palette->data_rgb : - g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette ? g_ddraw.primary->palette->data_rgb : - NULL; - - if (quad) - { - unsigned char i = (unsigned char)color; - - color = RGB(quad[i].rgbRed, quad[i].rgbGreen, quad[i].rgbBlue); - } - } - - GdiTransparentBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, src_w, src_h, color); - } - else - { - real_StretchBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, src_w, src_h, SRCCOPY); - } - - /* - StretchBlt( - dst_dc, - lpDestRect->left, - lpDestRect->top, - lpDestRect->right - lpDestRect->left, - lpDestRect->bottom - lpDestRect->top, - src_dc, - lpSrcRect->left, - lpSrcRect->top, - lpSrcRect->right - lpSrcRect->left, - lpSrcRect->bottom - lpSrcRect->top, - SRCCOPY); - */ + StretchBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, src_w, src_h, SRCCOPY); } else if ( - ((dwFlags & DDBLT_KEYSRC) && (src_surface->flags & DDSD_CKSRCBLT)) || - (dwFlags & DDBLT_KEYSRCOVERRIDE) || + (dwFlags & DDBLT_KEYSRC) || + (dwFlags & DDBLT_KEYSRCOVERRIDE) || mirror_left_right || mirror_up_down) { @@ -351,114 +231,372 @@ HRESULT dds_Blt( color_key.dwColorSpaceHighValue = (dwFlags & DDBLT_KEYSRCOVERRIDE) ? lpDDBltFx->ddckSrcColorkey.dwColorSpaceHighValue : src_surface->color_key.dwColorSpaceHighValue; - - if (color_key.dwColorSpaceHighValue < color_key.dwColorSpaceLowValue) - color_key.dwColorSpaceHighValue = color_key.dwColorSpaceLowValue; } - if (!is_stretch_blt && !mirror_left_right && !mirror_up_down) + float scale_w = (float)src_w / dst_w; + float scale_h = (float)src_h / dst_h; + + if (This->bpp == 8) { - blt_colorkey( - dst_buf, - dst_x, - dst_y, - dst_w, - dst_h, - This->pitch, - src_buf, - src_x, - src_y, - src_surface->pitch, - color_key.dwColorSpaceLowValue, - color_key.dwColorSpaceHighValue, - This->bpp); + unsigned char key_low = (unsigned char)color_key.dwColorSpaceLowValue; + unsigned char key_high = (unsigned char)color_key.dwColorSpaceHighValue; + + for (int y = 0; y < dst_h; y++) + { + int scaled_y = (int)(y * scale_h); + + if (mirror_up_down) + scaled_y = src_h - 1 - scaled_y; + + int src_row = src_surface->width * (scaled_y + src_y); + int dst_row = This->width * (y + dst_y); + + for (int x = 0; x < dst_w; x++) + { + int scaled_x = (int)(x * scale_w); + + if (mirror_left_right) + scaled_x = src_w - 1 - scaled_x; + + unsigned char c = ((unsigned char*)src_buf)[scaled_x + src_x + src_row]; + + if (c < key_low || c > key_high) + { + ((unsigned char*)dst_buf)[x + dst_x + dst_row] = c; + } + } + } } - else + else if (This->bpp == 16) { - blt_colorkey_mirror_stretch( - dst_buf, - dst_x, - dst_y, - dst_w, - dst_h, - This->pitch, - src_buf, - src_x, - src_y, - src_w, - src_h, - src_surface->pitch, - color_key.dwColorSpaceLowValue, - color_key.dwColorSpaceHighValue, - mirror_up_down, - mirror_left_right, - This->bpp); + unsigned short key_low = (unsigned short)color_key.dwColorSpaceLowValue; + unsigned short key_high = (unsigned short)color_key.dwColorSpaceHighValue; + + for (int y = 0; y < dst_h; y++) + { + int scaled_y = (int)(y * scale_h); + + if (mirror_up_down) + scaled_y = src_h - 1 - scaled_y; + + int src_row = src_surface->width * (scaled_y + src_y); + int dst_row = This->width * (y + dst_y); + + for (int x = 0; x < dst_w; x++) + { + int scaled_x = (int)(x * scale_w); + + if (mirror_left_right) + scaled_x = src_w - 1 - scaled_x; + + unsigned short c = ((unsigned short*)src_buf)[scaled_x + src_x + src_row]; + + if (c < key_low || c > key_high) + { + ((unsigned short*)dst_buf)[x + dst_x + dst_row] = c; + } + } + } + } + else if (This->bpp == 32) + { + unsigned int key_low = color_key.dwColorSpaceLowValue; + unsigned int key_high = color_key.dwColorSpaceHighValue; + + for (int y = 0; y < dst_h; y++) + { + int scaled_y = (int)(y * scale_h); + + if (mirror_up_down) + scaled_y = src_h - 1 - scaled_y; + + int src_row = src_surface->width * (scaled_y + src_y); + int dst_row = This->width * (y + dst_y); + + for (int x = 0; x < dst_w; x++) + { + int scaled_x = (int)(x * scale_w); + + if (mirror_left_right) + scaled_x = src_w - 1 - scaled_x; + + unsigned int c = ((unsigned int*)src_buf)[scaled_x + src_x + src_row]; + + if (c < key_low || c > key_high) + { + ((unsigned int*)dst_buf)[x + dst_x + dst_row] = c; + } + } + } } - } - else if (is_stretch_blt && (src_w != dst_w || src_h != dst_h)) - { - blt_stretch( - dst_buf, - dst_x, - dst_y, - dst_w, - dst_h, - This->pitch, - src_buf, - src_x, - src_y, - src_w, - src_h, - src_surface->pitch, - This->bpp); - } - else if (This == src_surface) - { - blt_overlap( - dst_buf, - dst_x, - dst_y, - dst_w, - dst_h, - This->pitch, - src_buf, - src_x, - src_y, - src_surface->pitch, - This->bpp); } else { - blt_clean( - dst_buf, - dst_x, - dst_y, - dst_w, - dst_h, - This->pitch, - src_buf, - src_x, - src_y, - src_surface->pitch, - This->bpp); + if (!is_stretch_blt) + { + int width = dst_w > src_w ? src_w : dst_w; + int height = dst_h > src_h ? src_h : dst_h; + + unsigned char* src = + (unsigned char*)src_buf + (src_x * src_surface->lx_pitch) + (src_surface->l_pitch * src_y); + + unsigned char* dst = + (unsigned char*)dst_buf + (dst_x * This->lx_pitch) + (This->l_pitch * dst_y); + + unsigned int dst_pitch = width * This->lx_pitch; + + if (This == src_surface) + { + if (dst_y > src_y) + { + src += src_surface->l_pitch * height; + dst += This->l_pitch * height; + + for (int i = height; i-- > 0;) + { + src -= src_surface->l_pitch; + dst -= This->l_pitch; + + memmove(dst, src, dst_pitch); + } + } + else + { + for (int i = 0; i < height; i++) + { + memmove(dst, src, dst_pitch); + + src += src_surface->l_pitch; + dst += This->l_pitch; + } + } + } + else + { + for (int i = 0; i < height; i++) + { + memcpy(dst, src, dst_pitch); + + src += src_surface->l_pitch; + dst += This->l_pitch; + } + } + } + else + { + /* Linear scaling using integer math + * Since the scaling pattern for x will aways be the same, the pattern itself gets pre-calculated + * and stored in an array. + * Y scaling pattern gets calculated during the blit loop + */ + unsigned int x_ratio = (unsigned int)((src_w << 16) / dst_w) + 1; + unsigned int y_ratio = (unsigned int)((src_h << 16) / dst_h) + 1; + + unsigned int s_src_x, s_src_y; + unsigned int dest_base, source_base; + + scale_pattern* pattern = malloc((dst_w + 1) * (sizeof(scale_pattern))); + int pattern_idx = 0; + unsigned int last_src_x = 0; + + if (pattern != NULL) + { + pattern[pattern_idx] = (scale_pattern){ ONCE, 0, 0, 1 }; + + /* Build the pattern! */ + int x; + for (x = 1; x < dst_w; x++) { + s_src_x = (x * x_ratio) >> 16; + if (s_src_x == last_src_x) + { + if (pattern[pattern_idx].type == REPEAT || pattern[pattern_idx].type == ONCE) + { + pattern[pattern_idx].type = REPEAT; + pattern[pattern_idx].count++; + } + else if (pattern[pattern_idx].type == SEQUENCE) + { + pattern_idx++; + pattern[pattern_idx] = (scale_pattern){ REPEAT, x, s_src_x, 1 }; + } + } + else if (s_src_x == last_src_x + 1) + { + if (pattern[pattern_idx].type == SEQUENCE || pattern[pattern_idx].type == ONCE) + { + pattern[pattern_idx].type = SEQUENCE; + pattern[pattern_idx].count++; + } + else if (pattern[pattern_idx].type == REPEAT) + { + pattern_idx++; + pattern[pattern_idx] = (scale_pattern){ ONCE, x, s_src_x, 1 }; + } + } + else + { + pattern_idx++; + pattern[pattern_idx] = (scale_pattern){ ONCE, x, s_src_x, 1 }; + } + last_src_x = s_src_x; + } + pattern[pattern_idx + 1] = (scale_pattern){ END, 0, 0, 0 }; + + + /* Do the actual blitting */ + int count = 0; + int y; + + for (y = 0; y < dst_h; y++) { + + dest_base = dst_x + This->width * (y + dst_y); + + s_src_y = (y * y_ratio) >> 16; + + source_base = src_x + src_surface->width * (s_src_y + src_y); + + pattern_idx = 0; + scale_pattern* current = &pattern[pattern_idx]; + + if (This->bpp == 8) + { + unsigned char* d, * s, v; + unsigned char* src = (unsigned char*)src_buf; + unsigned char* dst = (unsigned char*)dst_buf; + + do { + switch (current->type) + { + case ONCE: + dst[dest_base + current->dst_index] = + src[source_base + current->src_index]; + break; + + case REPEAT: + d = (dst + dest_base + current->dst_index); + v = src[source_base + current->src_index]; + + count = current->count; + while (count-- > 0) + *d++ = v; + + break; + + case SEQUENCE: + d = dst + dest_base + current->dst_index; + s = src + source_base + current->src_index; + + memcpy((void*)d, (void*)s, current->count * This->lx_pitch); + break; + + case END: + default: + break; + } + + current = &pattern[++pattern_idx]; + } while (current->type != END); + } + else if (This->bpp == 16) + { + unsigned short* d, * s, v; + unsigned short* src = (unsigned short*)src_buf; + unsigned short* dst = (unsigned short*)dst_buf; + + do { + switch (current->type) + { + case ONCE: + dst[dest_base + current->dst_index] = + src[source_base + current->src_index]; + break; + + case REPEAT: + d = (dst + dest_base + current->dst_index); + v = src[source_base + current->src_index]; + + count = current->count; + while (count-- > 0) + *d++ = v; + + break; + + case SEQUENCE: + d = dst + dest_base + current->dst_index; + s = src + source_base + current->src_index; + + memcpy((void*)d, (void*)s, current->count * This->lx_pitch); + break; + + case END: + default: + break; + } + + current = &pattern[++pattern_idx]; + } while (current->type != END); + } + else if (This->bpp == 32) + { + unsigned int* d, * s, v; + unsigned int* src = (unsigned int*)src_buf; + unsigned int* dst = (unsigned int*)dst_buf; + + do { + switch (current->type) + { + case ONCE: + dst[dest_base + current->dst_index] = + src[source_base + current->src_index]; + break; + + case REPEAT: + d = (dst + dest_base + current->dst_index); + v = src[source_base + current->src_index]; + + count = current->count; + while (count-- > 0) + *d++ = v; + + break; + + case SEQUENCE: + d = dst + dest_base + current->dst_index; + s = src + source_base + current->src_index; + + memcpy((void*)d, (void*)s, current->count * This->lx_pitch); + break; + + case END: + default: + break; + } + + current = &pattern[++pattern_idx]; + } while (current->type != END); + } + } + free(pattern); + } + } + } } - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->render.run) { - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); + InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime()) { This->last_blt_tick = timeGetTime(); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); SwitchToThread(); - if (g_ddraw.ticks_limiter.tick_length > 0 && g_config.limiter_type != LIMIT_PEEKMESSAGE) + if (g_ddraw->ticks_limiter.tick_length > 0) { - g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; + g_ddraw->ticks_limiter.use_blt_or_flip = TRUE; util_limit_game_ticks(); } } @@ -468,11 +606,11 @@ HRESULT dds_Blt( } HRESULT dds_BltFast( - IDirectDrawSurfaceImpl* This, - DWORD dwX, - DWORD dwY, - IDirectDrawSurfaceImpl* lpDDSrcSurface, - LPRECT lpSrcRect, + IDirectDrawSurfaceImpl* This, + DWORD dwX, + DWORD dwY, + IDirectDrawSurfaceImpl* lpDDSrcSurface, + LPRECT lpSrcRect, DWORD dwFlags) { dbg_dump_dds_blt_fast_flags(dwFlags); @@ -483,36 +621,11 @@ HRESULT dds_BltFast( if (lpSrcRect && src_surface) { - //dbg_print_rect("lpSrcRect", lpSrcRect); - src_rect = *lpSrcRect; - } - - int dst_x = dwX; - int dst_y = dwY; - - if (dst_x < 0) - { - src_rect.left += abs(dst_x); - dst_x = 0; - } - - if (dst_y < 0) - { - src_rect.top += abs(dst_y); - dst_y = 0; - } - - if (src_surface) - { - if (src_rect.right < 0) - src_rect.right = 0; + memcpy(&src_rect, lpSrcRect, sizeof(src_rect)); if (src_rect.left < 0) src_rect.left = 0; - if (src_rect.bottom < 0) - src_rect.bottom = 0; - if (src_rect.top < 0) src_rect.top = 0; @@ -531,18 +644,14 @@ HRESULT dds_BltFast( int src_x = src_rect.left; int src_y = src_rect.top; + int dst_x = dwX; + int dst_y = dwY; RECT dst_rect = { dst_x, dst_y, (src_rect.right - src_rect.left) + dst_x, (src_rect.bottom - src_rect.top) + dst_y }; - if (dst_rect.right < 0) - dst_rect.right = 0; - if (dst_rect.left < 0) dst_rect.left = 0; - if (dst_rect.bottom < 0) - dst_rect.bottom = 0; - if (dst_rect.top < 0) dst_rect.top = 0; @@ -560,7 +669,6 @@ HRESULT dds_BltFast( dst_x = dst_rect.left; dst_y = dst_rect.top; - int dst_w = dst_rect.right - dst_rect.left; int dst_h = dst_rect.bottom - dst_rect.top; @@ -569,9 +677,7 @@ HRESULT dds_BltFast( if (src_surface && dst_w > 0 && dst_h > 0) { - if (This->bpp != src_surface->bpp || - This->bpp == 24 || - src_surface->bpp == 24) + if (This->bpp != src_surface->bpp) { TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp); @@ -581,125 +687,133 @@ HRESULT dds_BltFast( HDC src_dc; dds_GetDC(src_surface, &src_dc); - if ((dwFlags & DDBLTFAST_SRCCOLORKEY) && (src_surface->flags & DDSD_CKSRCBLT)) + BitBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, SRCCOPY); + } + else if (dwFlags & DDBLTFAST_SRCCOLORKEY) + { + if (This->bpp == 8) { - UINT color = src_surface->color_key.dwColorSpaceLowValue; + unsigned char key_low = (unsigned char)src_surface->color_key.dwColorSpaceLowValue; + unsigned char key_high = (unsigned char)src_surface->color_key.dwColorSpaceHighValue; - if (src_surface->bpp == 32 || src_surface->bpp == 24) + for (int y = 0; y < dst_h; y++) { - color = color & 0xFFFFFF; - } - else if (src_surface->bpp == 16) - { - unsigned short c = (unsigned short)color; + int dst_row = This->width * (y + dst_y); + int src_row = src_surface->width * (y + src_y); - BYTE r = ((c & 0xF800) >> 11) << 3; - BYTE g = ((c & 0x07E0) >> 5) << 2; - BYTE b = ((c & 0x001F)) << 3; - - color = RGB(r, g, b); - } - else if (src_surface->bpp == 8) - { - RGBQUAD* quad = - src_surface->palette ? src_surface->palette->data_rgb : - g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette ? g_ddraw.primary->palette->data_rgb : - NULL; - - if (quad) + for (int x = 0; x < dst_w; x++) { - unsigned char i = (unsigned char)color; + unsigned char c = ((unsigned char*)src_buf)[x + src_x + src_row]; - color = RGB(quad[i].rgbRed, quad[i].rgbGreen, quad[i].rgbBlue); + if (c < key_low || c > key_high) + { + ((unsigned char*)dst_buf)[x + dst_x + dst_row] = c; + } } } - - GdiTransparentBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, dst_w, dst_h, color); } - else + else if (This->bpp == 16) { - real_BitBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, SRCCOPY); - } + unsigned short key_low = (unsigned short)src_surface->color_key.dwColorSpaceLowValue; + unsigned short key_high = (unsigned short)src_surface->color_key.dwColorSpaceHighValue; - /* - real_BitBlt( - dst_dc, - dwX, - dwY, - lpSrcRect->right - lpSrcRect->left, - lpSrcRect->bottom - lpSrcRect->top, - src_dc, - lpSrcRect->left, - lpSrcRect->top, - SRCCOPY); - */ - } - else if ((dwFlags & DDBLTFAST_SRCCOLORKEY) && (src_surface->flags & DDSD_CKSRCBLT)) - { - blt_colorkey( - dst_buf, - dst_x, - dst_y, - dst_w, - dst_h, - This->pitch, - src_buf, - src_x, - src_y, - src_surface->pitch, - src_surface->color_key.dwColorSpaceLowValue, - src_surface->color_key.dwColorSpaceHighValue, - This->bpp); - } - else if (This == src_surface) - { - blt_overlap( - dst_buf, - dst_x, - dst_y, - dst_w, - dst_h, - This->pitch, - src_buf, - src_x, - src_y, - src_surface->pitch, - This->bpp); + for (int y = 0; y < dst_h; y++) + { + int dst_row = This->width * (y + dst_y); + int src_row = src_surface->width * (y + src_y); + + for (int x = 0; x < dst_w; x++) + { + unsigned short c = ((unsigned short*)src_buf)[x + src_x + src_row]; + + if (c < key_low || c > key_high) + { + ((unsigned short*)dst_buf)[x + dst_x + dst_row] = c; + } + } + } + } + else if (This->bpp == 32) + { + unsigned int key_low = src_surface->color_key.dwColorSpaceLowValue; + unsigned int key_high = src_surface->color_key.dwColorSpaceHighValue; + + for (int y = 0; y < dst_h; y++) + { + int dst_row = This->width * (y + dst_y); + int src_row = src_surface->width * (y + src_y); + + for (int x = 0; x < dst_w; x++) + { + unsigned int c = ((unsigned int*)src_buf)[x + src_x + src_row]; + + if (c < key_low || c > key_high) + { + ((unsigned int*)dst_buf)[x + dst_x + dst_row] = c; + } + } + } + } } else { - blt_clean( - dst_buf, - dst_x, - dst_y, - dst_w, - dst_h, - This->pitch, - src_buf, - src_x, - src_y, - src_surface->pitch, - This->bpp); + unsigned char* src = + (unsigned char*)src_buf + (src_x * src_surface->lx_pitch) + (src_surface->l_pitch * src_y); + + unsigned char* dst = + (unsigned char*)dst_buf + (dst_x * This->lx_pitch) + (This->l_pitch * dst_y); + + unsigned int dst_pitch = dst_w * This->lx_pitch; + + if (This == src_surface) + { + if (dst_y > src_y) + { + src += src_surface->l_pitch * dst_h; + dst += This->l_pitch * dst_h; + + for (int i = dst_h; i-- > 0;) + { + src -= src_surface->l_pitch; + dst -= This->l_pitch; + + memmove(dst, src, dst_pitch); + } + } + else + { + for (int i = 0; i < dst_h; i++) + { + memmove(dst, src, dst_pitch); + + src += src_surface->l_pitch; + dst += This->l_pitch; + } + } + } + else + { + for (int i = 0; i < dst_h; i++) + { + memcpy(dst, src, dst_pitch); + + src += src_surface->l_pitch; + dst += This->l_pitch; + } + } } } - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->render.run) { - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); + InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); DWORD time = timeGetTime(); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - - if (g_config.limiter_type == LIMIT_BLTFAST && g_ddraw.ticks_limiter.tick_length > 0) - { - g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; - util_limit_game_ticks(); - } + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); } } @@ -728,33 +842,19 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur memset(lpDDSurfaceDesc, 0, size); lpDDSurfaceDesc->dwSize = size; - lpDDSurfaceDesc->dwFlags = - DDSD_CAPS | - DDSD_WIDTH | - DDSD_HEIGHT | - DDSD_PITCH | - DDSD_PIXELFORMAT; - + lpDDSurfaceDesc->dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PITCH | DDSD_PIXELFORMAT | DDSD_LPSURFACE; lpDDSurfaceDesc->dwWidth = This->width; lpDDSurfaceDesc->dwHeight = This->height; - lpDDSurfaceDesc->lPitch = This->pitch; + lpDDSurfaceDesc->lPitch = This->l_pitch; lpDDSurfaceDesc->lpSurface = dds_GetBuffer(This); lpDDSurfaceDesc->ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = This->bpp; lpDDSurfaceDesc->ddsCaps.dwCaps = This->caps; - if (This->flags & DDSD_BACKBUFFERCOUNT) + if (This->caps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_BACKBUFFER)) { - lpDDSurfaceDesc->dwFlags |= DDSD_BACKBUFFERCOUNT; - lpDDSurfaceDesc->dwBackBufferCount = This->backbuffer_count; - } - - if (This->flags & DDSD_CKSRCBLT) - { - lpDDSurfaceDesc->dwFlags |= DDSD_CKSRCBLT; - lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceHighValue = This->color_key.dwColorSpaceHighValue; - lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceLowValue = This->color_key.dwColorSpaceLowValue; + lpDDSurfaceDesc->ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; } if (This->bpp == 8) @@ -767,7 +867,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x07E0; lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x001F; } - else if (This->bpp == 32 || This->bpp == 24) + else if (This->bpp == 32) { lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xFF0000; lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x00FF00; @@ -779,8 +879,8 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur } HRESULT dds_EnumAttachedSurfaces( - IDirectDrawSurfaceImpl* This, - LPVOID lpContext, + IDirectDrawSurfaceImpl* This, + LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback) { static DDSURFACEDESC2 desc; @@ -789,17 +889,9 @@ HRESULT dds_EnumAttachedSurfaces( if (This->backbuffer) { - /* Hack for carmageddon 1 lowres mode */ - if (g_config.carma95_hack && g_ddraw.height == 200) - { - dds_GetSurfaceDesc(This, (LPDDSURFACEDESC)&desc); - lpEnumSurfacesCallback((LPDIRECTDRAWSURFACE)This, (LPDDSURFACEDESC)&desc, lpContext); - } - else - { - dds_GetSurfaceDesc(This->backbuffer, (LPDDSURFACEDESC)&desc); - lpEnumSurfacesCallback((LPDIRECTDRAWSURFACE)This->backbuffer, (LPDDSURFACEDESC)&desc, lpContext); - } + dds_GetSurfaceDesc(This->backbuffer, (LPDDSURFACEDESC)&desc); + IDirectDrawSurface_AddRef(This->backbuffer); + lpEnumSurfacesCallback((LPDIRECTDRAWSURFACE)This->backbuffer, (LPDDSURFACEDESC)&desc, lpContext); } return DD_OK; @@ -807,29 +899,19 @@ HRESULT dds_EnumAttachedSurfaces( HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfaceTargetOverride, DWORD dwFlags) { - dbg_dump_dds_flip_flags(dwFlags); - - if (This->backbuffer && !This->skip_flip && !(g_config.carma95_hack && g_ddraw.height == 200)) + if (This->backbuffer) { - EnterCriticalSection(&g_ddraw.cs); + EnterCriticalSection(&g_ddraw->cs); IDirectDrawSurfaceImpl* backbuffer = lpDDSurfaceTargetOverride ? lpDDSurfaceTargetOverride : This->backbuffer; void* buf = InterlockedExchangePointer(&This->surface, backbuffer->surface); - HBITMAP bitmap = (HBITMAP)InterlockedExchangePointer((void*)&This->bitmap, backbuffer->bitmap); - HDC dc = (HDC)InterlockedExchangePointer((void*)&This->hdc, backbuffer->hdc); - HANDLE map = (HANDLE)InterlockedExchangePointer(&This->mapping, backbuffer->mapping); + HBITMAP bitmap = (HBITMAP)InterlockedExchangePointer(&This->bitmap, backbuffer->bitmap); + HDC dc = (HDC)InterlockedExchangePointer(&This->hdc, backbuffer->hdc); InterlockedExchangePointer(&backbuffer->surface, buf); - InterlockedExchangePointer((void*)&backbuffer->bitmap, bitmap); - InterlockedExchangePointer((void*)&backbuffer->hdc, dc); - InterlockedExchangePointer(&backbuffer->mapping, map); - - if (g_config.flipclear && (This->caps & DDSCAPS_PRIMARYSURFACE)) - { - blt_clear(buf, 0, backbuffer->size); - } - - LeaveCriticalSection(&g_ddraw.cs); + InterlockedExchangePointer(&backbuffer->bitmap, bitmap); + InterlockedExchangePointer(&backbuffer->hdc, dc); + LeaveCriticalSection(&g_ddraw->cs); if (!lpDDSurfaceTargetOverride && This->backbuffer->backbuffer) { @@ -837,25 +919,22 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa } } - This->skip_flip = FALSE; - - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) + if (This->caps & DDSCAPS_PRIMARYSURFACE && g_ddraw->render.run) { This->last_flip_tick = timeGetTime(); - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); SwitchToThread(); - if ((g_config.maxgameticks == 0 && (dwFlags & DDFLIP_WAIT)) || g_config.maxgameticks == -2) + if ((dwFlags & DDFLIP_WAIT) || g_ddraw->maxgameticks == -2) { dd_WaitForVerticalBlank(DDWAITVB_BLOCKEND, NULL); } - if (g_ddraw.ticks_limiter.tick_length > 0 && g_config.limiter_type != LIMIT_PEEKMESSAGE) + if (g_ddraw->ticks_limiter.tick_length > 0) { - g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; + g_ddraw->ticks_limiter.use_blt_or_flip = TRUE; util_limit_game_ticks(); } } @@ -865,27 +944,26 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa HRESULT dds_GetAttachedSurface(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDdsCaps, IDirectDrawSurfaceImpl** lpDDsurface) { - if (!lpDdsCaps || !lpDDsurface) - return DDERR_INVALIDPARAMS; - - if (This->backbuffer && (This->backbuffer->caps & lpDdsCaps->dwCaps) == lpDdsCaps->dwCaps) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && (This->caps & DDSCAPS_FLIP) && (lpDdsCaps->dwCaps & DDSCAPS_BACKBUFFER)) { - IDirectDrawSurface_AddRef(This->backbuffer); - *lpDDsurface = This->backbuffer; - - return DD_OK; + if (This->backbuffer) + { + IDirectDrawSurface_AddRef(This->backbuffer); + *lpDDsurface = This->backbuffer; + } + else + { + IDirectDrawSurface_AddRef(This); + *lpDDsurface = This; + } } - return DDERR_NOTFOUND; + return DD_OK; } HRESULT dds_GetCaps(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDDSCaps) { - if (!lpDDSCaps) - return DDERR_INVALIDPARAMS; - lpDDSCaps->dwCaps = This->caps; - return DD_OK; } @@ -909,16 +987,6 @@ HRESULT dds_GetClipper(IDirectDrawSurfaceImpl* This, IDirectDrawClipperImpl** lp HRESULT dds_GetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey) { - if (!(This->flags & DDSD_CKSRCBLT)) - { - return DDERR_NOCOLORKEY; - } - - if (dwFlags != DDCKEY_SRCBLT || !lpColorKey) - { - TRACE(" NOT_IMPLEMENTED dwFlags=%08X, lpColorKey=%p\n", dwFlags, lpColorKey); - } - if (lpColorKey) { lpColorKey->dwColorSpaceHighValue = This->color_key.dwColorSpaceHighValue; @@ -938,14 +1006,19 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) return DDERR_INVALIDPARAMS; } + if ((This->l_pitch % 4)) + { + TRACE("NOT_IMPLEMENTED GetDC: width=%d height=%d\n", This->width, This->height); + } + RGBQUAD* data = This->palette ? This->palette->data_rgb : - g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette ? g_ddraw.primary->palette->data_rgb : + g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : NULL; HDC dc = This->hdc; - if (This->backbuffer || (This->caps & DDSCAPS_FLIP)) + if (This->backbuffer || (This->caps & DDSCAPS_BACKBUFFER)) dc = (HDC)InterlockedExchangeAdd((LONG*)&This->hdc, 0); if (This->bpp == 8 && data) @@ -954,9 +1027,6 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) if (lpHDC) *lpHDC = dc; - if (!(This->caps & DDSCAPS_OWNDC)) - InterlockedExchange((LONG*)&This->dc_state, SaveDC(dc)); - return DD_OK; } @@ -998,7 +1068,7 @@ HRESULT dds_GetPixelFormat(IDirectDrawSurfaceImpl* This, LPDDPIXELFORMAT ddpfPix ddpfPixelFormat->dwGBitMask = 0x07E0; ddpfPixelFormat->dwBBitMask = 0x001F; } - else if (This->bpp == 32 || This->bpp == 24) + else if (This->bpp == 32) { ddpfPixelFormat->dwRBitMask = 0xFF0000; ddpfPixelFormat->dwGBitMask = 0x00FF00; @@ -1012,18 +1082,19 @@ HRESULT dds_GetPixelFormat(IDirectDrawSurfaceImpl* This, LPDDPIXELFORMAT ddpfPix } HRESULT dds_Lock( - IDirectDrawSurfaceImpl* This, - LPRECT lpDestRect, - LPDDSURFACEDESC lpDDSurfaceDesc, - DWORD dwFlags, + IDirectDrawSurfaceImpl* This, + LPRECT lpDestRect, + LPDDSURFACEDESC lpDDSurfaceDesc, + DWORD dwFlags, HANDLE hEvent) { - if (g_config.lock_surfaces) - EnterCriticalSection(&This->cs); - dbg_dump_dds_lock_flags(dwFlags); - util_pull_messages(); + if (g_ddraw && g_ddraw->fixnotresponding) + { + MSG msg; /* workaround for "Not Responding" window problem */ + PeekMessage(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); + } HRESULT ret = dds_GetSurfaceDesc(This, lpDDSurfaceDesc); @@ -1036,13 +1107,11 @@ HRESULT dds_Lock( lpDestRect->right > This->width || lpDestRect->bottom > This->height) { - lpDDSurfaceDesc->lpSurface = NULL; - return DDERR_INVALIDPARAMS; } lpDDSurfaceDesc->lpSurface = - (char*)dds_GetBuffer(This) + (lpDestRect->left * This->bytes_pp) + (lpDestRect->top * This->pitch); + (char*)dds_GetBuffer(This) + (lpDestRect->left * This->lx_pitch) + (lpDestRect->top * This->l_pitch); } return ret; @@ -1050,39 +1119,27 @@ HRESULT dds_Lock( HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) { - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->render.run) { - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); + InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); DWORD time = timeGetTime(); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); } } - if (!(This->caps & DDSCAPS_OWNDC)) - RestoreDC(hDC, InterlockedExchangeAdd((LONG*)&This->dc_state, 0)); - return DD_OK; } HRESULT dds_SetClipper(IDirectDrawSurfaceImpl* This, IDirectDrawClipperImpl* lpClipper) { if (lpClipper) - { IDirectDrawClipper_AddRef(lpClipper); - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && lpClipper->hwnd) - { - RECT rc = { 0, 0, This->width, This->height }; - ddc_SetClipRect(lpClipper, &rc); - } - } - if (This->clipper) IDirectDrawClipper_Release(This->clipper); @@ -1093,25 +1150,13 @@ HRESULT dds_SetClipper(IDirectDrawSurfaceImpl* This, IDirectDrawClipperImpl* lpC HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey) { - if (dwFlags != DDCKEY_SRCBLT || !lpColorKey) - { - TRACE(" NOT_IMPLEMENTED dwFlags=%08X, lpColorKey=%p\n", dwFlags, lpColorKey); - } - if (lpColorKey) { - This->flags |= DDSD_CKSRCBLT; + TRACE_EXT(" dwColorSpaceHighValue=%d\n", lpColorKey->dwColorSpaceHighValue); + TRACE_EXT(" dwColorSpaceLowValue=%d\n", lpColorKey->dwColorSpaceLowValue); + This->color_key.dwColorSpaceHighValue = lpColorKey->dwColorSpaceHighValue; This->color_key.dwColorSpaceLowValue = lpColorKey->dwColorSpaceLowValue; - - if (dwFlags & DDCKEY_COLORSPACE) - { - This->color_key.dwColorSpaceHighValue = lpColorKey->dwColorSpaceHighValue; - } - else - { - This->color_key.dwColorSpaceHighValue = lpColorKey->dwColorSpaceLowValue; - } } return DD_OK; @@ -1119,24 +1164,22 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKE HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpDDPalette) { - if (This->bpp != 8) - return DDERR_INVALIDPIXELFORMAT; - if (lpDDPalette) IDirectDrawPalette_AddRef(lpDDPalette); - IDirectDrawPaletteImpl* old_palette = This->palette; + if (This->palette) + IDirectDrawPalette_Release(This->palette); - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref) + if (This->caps & DDSCAPS_PRIMARYSURFACE) { - EnterCriticalSection(&g_ddraw.cs); + EnterCriticalSection(&g_ddraw->cs); This->palette = lpDDPalette; - LeaveCriticalSection(&g_ddraw.cs); + LeaveCriticalSection(&g_ddraw->cs); - if (g_ddraw.render.run) + if (g_ddraw->render.run) { - InterlockedExchange(&g_ddraw.render.palette_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + InterlockedExchange(&g_ddraw->render.palette_updated, TRUE); + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); } } else @@ -1144,19 +1187,54 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD This->palette = lpDDPalette; } - if (old_palette) - IDirectDrawPalette_Release(old_palette); - return DD_OK; } -HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) +void dds_RedrawBnet(IDirectDrawSurfaceImpl* This, BOOL obs_hack) { /* Hack for Warcraft II BNE and Diablo */ - HWND hwnd = g_ddraw.ref && g_ddraw.bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL; + HWND hwnd = g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL; - if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) + if (hwnd) { + if (obs_hack) + { + /* hack for windows 8/10 fullscreen exclusive mode */ + + if (g_ddraw->primary->palette) + { + SetDIBColorTable(g_ddraw->primary->bnet_dc, 0, 256, g_ddraw->primary->palette->data_rgb); + } + + EnterCriticalSection(&g_ddraw->cs); + + RECT rc; + if (fake_GetWindowRect(hwnd, &rc)) + { + HDC dc = GetDC(hwnd); + + BitBlt( + g_ddraw->primary->bnet_dc, + rc.left, + rc.top, + rc.right - rc.left, + rc.bottom - rc.top, + dc, + 0, + 0, + SRCCOPY); + + ReleaseDC(hwnd, dc); + } + + LeaveCriticalSection(&g_ddraw->cs); + + if (g_ddraw->render.run) + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + + return; + } + HDC primary_dc; dds_GetDC(This, &primary_dc); @@ -1198,14 +1276,22 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) if (erase) { - blt_clear(This->surface, 0xFE, This->size); + BOOL x = g_ddraw->ticks_limiter.use_blt_or_flip; + + DDBLTFX fx = { .dwFillColor = 0xFE }; + IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx); + + g_ddraw->ticks_limiter.use_blt_or_flip = x; } } +} +void dds_RedrawArmada(IDirectDrawSurfaceImpl* This) +{ /* Hack for Star Trek Armada */ - hwnd = g_ddraw.ref && g_config.armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL; + HWND hwnd = g_ddraw->armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL; - if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) + if (hwnd) { HDC primary_dc; dds_GetDC(This, &primary_dc); @@ -1232,34 +1318,39 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) ReleaseDC(hwnd, hdc); } - blt_clear(This->surface, 0x00, This->size); + BOOL x = g_ddraw->ticks_limiter.use_blt_or_flip; + + DDBLTFX fx = { .dwFillColor = 0 }; + IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx); + + g_ddraw->ticks_limiter.use_blt_or_flip = x; + } +} + +HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) +{ + if ((This->caps & DDSCAPS_PRIMARYSURFACE)) + { + dds_RedrawBnet(This, FALSE); + dds_RedrawArmada(This); } - - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->render.run) { - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); + InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); DWORD time = timeGetTime(); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - if (g_ddraw.ticks_limiter.tick_length > 0 && - g_config.limiter_type != LIMIT_PEEKMESSAGE && - (!g_ddraw.ticks_limiter.dds_unlock_limiter_disabled || g_config.limiter_type == LIMIT_UNLOCK)) - { + if (g_ddraw->ticks_limiter.tick_length > 0 && !g_ddraw->ticks_limiter.use_blt_or_flip) util_limit_game_ticks(); - } } } - if (g_config.lock_surfaces) - LeaveCriticalSection(&This->cs); - return DD_OK; } @@ -1274,162 +1365,50 @@ HRESULT dds_GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD) return DD_OK; } -HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags) -{ - dbg_dump_dds_flags(lpDDSD->dwFlags); - dbg_dump_dds_caps(lpDDSD->ddsCaps.dwCaps); - - if ((lpDDSD->dwFlags & DDSD_LPSURFACE) == 0) - return DDERR_UNSUPPORTED; - - - if (This->bitmap) - { - DeleteObject(This->bitmap); - InterlockedDecrement(&g_dds_gdi_handles); - This->bitmap = NULL; - } - else if (This->surface && !This->custom_buf) - { - HeapFree(GetProcessHeap(), 0, This->surface); - This->surface = NULL; - } - - if (This->hdc) - { - DeleteDC(This->hdc); - InterlockedDecrement(&g_dds_gdi_handles); - This->hdc = NULL; - } - - if (This->bmi) - { - HeapFree(GetProcessHeap(), 0, This->bmi); - This->bmi = NULL; - } - - if (This->mapping) - { - CloseHandle(This->mapping); - This->mapping = NULL; - } - - if (lpDDSD->dwFlags & DDSD_PIXELFORMAT) - { - switch (lpDDSD->ddpfPixelFormat.dwRGBBitCount) - { - case 0: - break; - case 8: - This->bpp = 8; - break; - case 15: - TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); - case 16: - This->bpp = 16; - break; - case 24: - This->bpp = 24; - break; - case 32: - This->bpp = 32; - break; - default: - TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); - break; - } - } - - if (lpDDSD->dwFlags & DDSD_WIDTH) - { - This->width = lpDDSD->dwWidth; - } - - if (lpDDSD->dwFlags & DDSD_HEIGHT) - { - This->height = lpDDSD->dwHeight; - } - - if (lpDDSD->dwFlags & DDSD_PITCH) - { - This->pitch = lpDDSD->lPitch; - } - - if (lpDDSD->dwFlags & DDSD_LPSURFACE) - { - This->surface = lpDDSD->lpSurface; - } - - This->bytes_pp = This->bpp / 8; - This->size = This->pitch * This->height; - This->custom_buf = TRUE; - - return DD_OK; -} - void* dds_GetBuffer(IDirectDrawSurfaceImpl* This) { if (!This) return NULL; - if (This->backbuffer || (This->caps & DDSCAPS_FLIP)) + if (This->backbuffer || (This->caps & DDSCAPS_BACKBUFFER)) return (void*)InterlockedExchangeAdd((LONG*)&This->surface, 0); return This->surface; } HRESULT dd_CreateSurface( - IDirectDrawImpl* This, - LPDDSURFACEDESC lpDDSurfaceDesc, - IDirectDrawSurfaceImpl** lpDDSurface, + IDirectDrawImpl* This, + LPDDSURFACEDESC lpDDSurfaceDesc, + IDirectDrawSurfaceImpl** lpDDSurface, IUnknown FAR* unkOuter) { dbg_dump_dds_flags(lpDDSurfaceDesc->dwFlags); dbg_dump_dds_caps(lpDDSurfaceDesc->ddsCaps.dwCaps); - if (lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_OVERLAY) - return DDERR_UNSUPPORTED; - - if (!(lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && - (lpDDSurfaceDesc->dwWidth > 16384 || lpDDSurfaceDesc->dwHeight > 16384)) - { - return DDERR_INVALIDPARAMS; - } - if ((lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && - g_ddraw.primary && - g_ddraw.primary->width == g_ddraw.width && - g_ddraw.primary->height == g_ddraw.height && - g_ddraw.primary->bpp == g_ddraw.bpp) + g_ddraw->primary && + g_ddraw->primary->width == g_ddraw->width && + g_ddraw->primary->height == g_ddraw->height && + g_ddraw->primary->bpp == g_ddraw->bpp) { - g_ddraw.primary->skip_flip = TRUE; - - *lpDDSurface = g_ddraw.primary; - IDirectDrawSurface_AddRef(g_ddraw.primary); + *lpDDSurface = g_ddraw->primary; + IDirectDrawSurface_AddRef(g_ddraw->primary); return DD_OK; } - IDirectDrawSurfaceImpl* dst_surface = + IDirectDrawSurfaceImpl* dst_surface = (IDirectDrawSurfaceImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawSurfaceImpl)); dst_surface->lpVtbl = &g_dds_vtbl; lpDDSurfaceDesc->dwFlags |= DDSD_CAPS; - InitializeCriticalSection(&dst_surface->cs); - - dst_surface->bpp = g_ddraw.bpp == 0 ? 16 : g_ddraw.bpp; + dst_surface->bpp = g_ddraw->bpp == 0 ? 16 : g_ddraw->bpp; dst_surface->flags = lpDDSurfaceDesc->dwFlags; dst_surface->caps = lpDDSurfaceDesc->ddsCaps.dwCaps; dst_surface->ddraw = This; - if (dst_surface->flags & DDSD_CKSRCBLT) - { - dst_surface->color_key.dwColorSpaceHighValue = lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceHighValue; - dst_surface->color_key.dwColorSpaceLowValue = lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceLowValue; - } - if (dst_surface->flags & DDSD_PIXELFORMAT) { switch (lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount) @@ -1443,8 +1422,7 @@ HRESULT dd_CreateSurface( dst_surface->bpp = 16; break; case 24: - dst_surface->bpp = 24; - break; + TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount); case 32: dst_surface->bpp = 32; break; @@ -1456,69 +1434,49 @@ HRESULT dd_CreateSurface( if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE) { - if (dst_surface->caps & DDSCAPS_FLIP) - { - dst_surface->caps |= DDSCAPS_FRONTBUFFER; - } - - if (!(dst_surface->caps & DDSCAPS_SYSTEMMEMORY)) - { - dst_surface->caps |= DDSCAPS_VIDEOMEMORY; - } - - dst_surface->caps |= DDSCAPS_VISIBLE; - - dst_surface->width = g_ddraw.width == 0 ? 1024 : g_ddraw.width; - dst_surface->height = g_ddraw.height == 0 ? 768 : g_ddraw.height; + dst_surface->width = g_ddraw->width; + dst_surface->height = g_ddraw->height; } else { - if (!(dst_surface->caps & DDSCAPS_SYSTEMMEMORY) || g_config.tshack) - { - dst_surface->caps |= DDSCAPS_VIDEOMEMORY; - } - dst_surface->width = lpDDSurfaceDesc->dwWidth; dst_surface->height = lpDDSurfaceDesc->dwHeight; } - if ((dst_surface->flags & DDSD_LPSURFACE) && (dst_surface->flags & DDSD_PITCH)) + if (dst_surface->width && dst_surface->height) { - dst_surface->surface = lpDDSurfaceDesc->lpSurface; - dst_surface->pitch = lpDDSurfaceDesc->lPitch; - dst_surface->bytes_pp = dst_surface->bpp / 8; - dst_surface->size = dst_surface->pitch * dst_surface->height; - dst_surface->custom_buf = TRUE; - } - else if (dst_surface->width && dst_surface->height) - { - dst_surface->bytes_pp = dst_surface->bpp / 8; - dst_surface->pitch = ((dst_surface->width * dst_surface->bpp + 63) & ~63) >> 3; - dst_surface->size = dst_surface->pitch * dst_surface->height; + if (dst_surface->width == 71 && dst_surface->height == 24) dst_surface->width = 72; //Commandos - DWORD aligned_width = dst_surface->pitch / dst_surface->bytes_pp; + dst_surface->lx_pitch = dst_surface->bpp / 8; + dst_surface->l_pitch = dst_surface->width * dst_surface->lx_pitch; - DWORD bmp_size = dst_surface->pitch * (dst_surface->height + g_config.guard_lines); + if (g_ddraw->fixpitch && !(dst_surface->caps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_BACKBUFFER))) + { + while (dst_surface->l_pitch % 4) + { + dst_surface->l_pitch = ++dst_surface->width * dst_surface->lx_pitch; + } + } + + dst_surface->bmi = + HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256); - dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DDBITMAPINFO)); dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - dst_surface->bmi->bmiHeader.biWidth = aligned_width; - dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + g_config.guard_lines); + dst_surface->bmi->bmiHeader.biWidth = dst_surface->width; + dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + 200); dst_surface->bmi->bmiHeader.biPlanes = 1; dst_surface->bmi->bmiHeader.biBitCount = dst_surface->bpp; - dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 16 ? BI_BITFIELDS : BI_RGB; + dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 8 ? BI_RGB : BI_BITFIELDS; WORD clr_bits = (WORD)(dst_surface->bmi->bmiHeader.biPlanes * dst_surface->bmi->bmiHeader.biBitCount); - dst_surface->bmi->bmiHeader.biClrUsed = - dst_surface->bpp == 8 ? 256 : - dst_surface->bpp == 16 ? 3 : - dst_surface->bpp == 24 ? 0 : - dst_surface->bpp == 32 ? 0 : - 0; + if (clr_bits < 24) + { + dst_surface->bmi->bmiHeader.biClrUsed = (1 << clr_bits); + } - dst_surface->bmi->bmiHeader.biSizeImage = - ((aligned_width * clr_bits + 63) & ~63) / 8 * dst_surface->height; + dst_surface->bmi->bmiHeader.biSizeImage = + ((dst_surface->width * clr_bits + 31) & ~31) / 8 * dst_surface->height; if (dst_surface->bpp == 8) { @@ -1530,140 +1488,77 @@ HRESULT dd_CreateSurface( dst_surface->bmi->bmiColors[i].rgbReserved = 0; } } - else if (dst_surface->bpp == 16 && g_config.rgb555) - { - ((DWORD*)dst_surface->bmi->bmiColors)[0] = 0x7C00; - ((DWORD*)dst_surface->bmi->bmiColors)[1] = 0x03E0; - ((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x001F; - } else if (dst_surface->bpp == 16) { ((DWORD*)dst_surface->bmi->bmiColors)[0] = 0xF800; ((DWORD*)dst_surface->bmi->bmiColors)[1] = 0x07E0; ((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x001F; } - - /* Claw hack: 128x128 surfaces need a DC for custom levels to work properly */ - if ((!g_config.limit_gdi_handles && InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 9000) || - (dst_surface->width == g_ddraw.width && dst_surface->height == g_ddraw.height) || - (dst_surface->width == 128 && dst_surface->height == 128)) + else if (dst_surface->bpp == 32) { - dst_surface->hdc = CreateCompatibleDC(g_ddraw.render.hdc); - - if (dst_surface->hdc) - InterlockedIncrement(&g_dds_gdi_handles); - - // CreateDIBSection cannot handle values higher than a WORD - 0xFF00 (guard lines); - DWORD map_offset = min(65280, dst_surface->pitch * g_config.guard_lines); - - dst_surface->mapping = - CreateFileMappingA( - INVALID_HANDLE_VALUE, - NULL, - PAGE_READWRITE | SEC_COMMIT, - 0, - bmp_size + 256 + map_offset, - NULL); - - if (dst_surface->mapping) - { - LPVOID data = MapViewOfFile(dst_surface->mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); - if (data) - { - while (((DWORD)data + map_offset) % 128) map_offset++; - UnmapViewOfFile(data); - } - - if (!data || (map_offset % sizeof(DWORD))) - { - map_offset = 0; - CloseHandle(dst_surface->mapping); - dst_surface->mapping = NULL; - } - } - - dst_surface->bitmap = - CreateDIBSection( - dst_surface->hdc, - dst_surface->bmi, - DIB_RGB_COLORS, - (void**)&dst_surface->surface, - dst_surface->mapping, - map_offset); - - if (dst_surface->bitmap) - InterlockedIncrement(&g_dds_gdi_handles); + ((DWORD*)dst_surface->bmi->bmiColors)[0] = 0xFF0000; + ((DWORD*)dst_surface->bmi->bmiColors)[1] = 0x00FF00; + ((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x0000FF; } + dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc); + dst_surface->bitmap = + CreateDIBSection(dst_surface->hdc, dst_surface->bmi, DIB_RGB_COLORS, (void**)&dst_surface->surface, NULL, 0); + dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height); if (!dst_surface->bitmap) { - dst_surface->surface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmp_size); - } - else - { - SelectObject(dst_surface->hdc, dst_surface->bitmap); + dst_surface->surface = + HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + dst_surface->l_pitch * (dst_surface->height + 200) * dst_surface->lx_pitch); } if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE) { - g_ddraw.primary = dst_surface; + g_ddraw->primary = dst_surface; FakePrimarySurface = dst_surface->surface; - if (dst_surface->bpp == 8) - { - IDirectDrawPaletteImpl* lpDDPalette; - dd_CreatePalette(DDPCAPS_ALLOW256, g_ddp_default_palette, &lpDDPalette, NULL); - dds_SetPalette(dst_surface, lpDDPalette); + dst_surface->bnet_dc = CreateCompatibleDC(g_ddraw->render.hdc); - // Make sure temp palette will be released once replaced - IDirectDrawPalette_Release(lpDDPalette); + dst_surface->bnet_bitmap = + CreateDIBSection( + dst_surface->bnet_dc, + dst_surface->bmi, + DIB_RGB_COLORS, + (void**)&dst_surface->bnet_surface, NULL, 0); + + if (!dst_surface->bnet_bitmap) + { + dst_surface->bnet_surface = + HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + dst_surface->l_pitch * (dst_surface->height + 200) * dst_surface->lx_pitch); } + + SelectObject(dst_surface->bnet_dc, dst_surface->bnet_bitmap); } + + SelectObject(dst_surface->hdc, dst_surface->bitmap); } if (dst_surface->flags & DDSD_BACKBUFFERCOUNT) { - dst_surface->backbuffer_count = lpDDSurfaceDesc->dwBackBufferCount; - TRACE(" dwBackBufferCount=%d\n", lpDDSurfaceDesc->dwBackBufferCount); DDSURFACEDESC desc; memset(&desc, 0, sizeof(desc)); - desc.dwFlags |= DDSD_CAPS; - if (lpDDSurfaceDesc->dwBackBufferCount > 1) { desc.dwBackBufferCount = lpDDSurfaceDesc->dwBackBufferCount - 1; desc.dwFlags |= DDSD_BACKBUFFERCOUNT; } - if (dst_surface->caps & DDSCAPS_FRONTBUFFER) - { - desc.ddsCaps.dwCaps |= DDSCAPS_BACKBUFFER; - } - - if (dst_surface->caps & DDSCAPS_FLIP) - { - desc.ddsCaps.dwCaps |= DDSCAPS_FLIP; - } - - if (dst_surface->caps & DDSCAPS_COMPLEX) - { - desc.ddsCaps.dwCaps |= DDSCAPS_COMPLEX; - } - - if (dst_surface->caps & DDSCAPS_VIDEOMEMORY) - { - desc.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; - } - - if (dst_surface->caps & DDSCAPS_SYSTEMMEMORY) - { - desc.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - } + desc.ddsCaps.dwCaps |= DDSCAPS_BACKBUFFER; desc.dwWidth = dst_surface->width; desc.dwHeight = dst_surface->height; @@ -1672,12 +1567,11 @@ HRESULT dd_CreateSurface( } TRACE( - " surface = %p (%ux%u@%u), buf = %p\n", - dst_surface, - dst_surface->width, - dst_surface->height, - dst_surface->bpp, - dst_surface->surface); + " surface = %p (%ux%u@%u)\n", + dst_surface, + dst_surface->width, + dst_surface->height, + dst_surface->bpp); *lpDDSurface = dst_surface; diff --git a/src/debug.c b/src/debug.c index b030114..87cb336 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1,285 +1,86 @@ #include #include #include -#include -#include -#include "directinput.h" #include "ddraw.h" #include "dd.h" #include "ddsurface.h" -#include "wndproc.h" #include "debug.h" -#include "hook.h" -#include "version.h" -#include "git.h" -#include "versionhelpers.h" -#include "utils.h" -#include "crc32.h" -#include "dllmain.h" -#include "config.h" -#include "delay_imports.h" double g_dbg_frame_time = 0; DWORD g_dbg_frame_count = 0; -LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; -PVOID g_dbg_exception_handle; static LONGLONG g_dbg_counter_start_time = 0; static double g_dbg_counter_freq = 0.0; -static FILE* g_dbg_log_file; -static char g_dbg_log_path1[MAX_PATH] = "cnc-ddraw-1.log"; -static char g_dbg_log_path2[MAX_PATH] = "cnc-ddraw-2.log"; -static char g_dbg_log_path3[MAX_PATH] = "cnc-ddraw-3.log"; -static char g_dbg_dmp_path1[MAX_PATH] = "cnc-ddraw-1.dmp"; -static char g_dbg_dmp_path2[MAX_PATH] = "cnc-ddraw-2.dmp"; -static BOOL g_dbg_log_rotate; -#ifdef _DEBUG -static int g_dbg_crash_count = 0; - -LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) +#if _DEBUG +int dbg_exception_handler(EXCEPTION_POINTERS* exception) { - g_dbg_crash_count++; + HANDLE dmp = + CreateFile( + "cnc-ddraw.dmp", + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_WRITE | FILE_SHARE_READ, + 0, + CREATE_ALWAYS, + 0, + 0); - BOOL(WINAPI * MiniDumpWriteDumpProc)( - HANDLE, - DWORD, - HANDLE, - MINIDUMP_TYPE, - PMINIDUMP_EXCEPTION_INFORMATION, - PMINIDUMP_USER_STREAM_INFORMATION, - PMINIDUMP_CALLBACK_INFORMATION - ); - - MiniDumpWriteDumpProc = (void*)real_GetProcAddress(real_LoadLibraryA("Dbghelp.dll"), "MiniDumpWriteDump"); - if (MiniDumpWriteDumpProc) + if (dmp) { - HANDLE dmp = - CreateFile( - g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_WRITE | FILE_SHARE_READ, - 0, - CREATE_ALWAYS, - 0, - 0); + MINIDUMP_EXCEPTION_INFORMATION info; + info.ThreadId = GetCurrentThreadId(); + info.ExceptionPointers = exception; + info.ClientPointers = TRUE; - if (dmp != INVALID_HANDLE_VALUE) - { - MINIDUMP_EXCEPTION_INFORMATION info; - info.ThreadId = GetCurrentThreadId(); - info.ExceptionPointers = exception; - info.ClientPointers = TRUE; + MiniDumpWriteDump( + GetCurrentProcess(), + GetCurrentProcessId(), + dmp, + 0, + &info, + NULL, + NULL); - MiniDumpWriteDumpProc( - GetCurrentProcess(), - GetCurrentProcessId(), - dmp, - 0, - &info, - NULL, - NULL); - - CloseHandle(dmp); - } + CloseHandle(dmp); } - if (exception && exception->ExceptionRecord) - { - HMODULE mod = NULL; - char filename[MAX_PATH] = { 0 }; - - if (delay_GetModuleHandleExA && delay_GetModuleHandleExA( - GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, - exception->ExceptionRecord->ExceptionAddress, - &mod)) - { - GetModuleFileNameA(mod, filename, sizeof(filename) - 1); - } - - TRACE( - "Exception at %p (%p+%p), Code=%08X - %s\n", - exception->ExceptionRecord->ExceptionAddress, - mod, - (int)exception->ExceptionRecord->ExceptionAddress - (int)mod, - exception->ExceptionRecord->ExceptionCode, - filename); - } - - if (g_dbg_exception_filter) - return g_dbg_exception_filter(exception); - return EXCEPTION_EXECUTE_HANDLER; } - -void __cdecl dbg_invoke_watson( - wchar_t const* const expression, - wchar_t const* const function_name, - wchar_t const* const file_name, - unsigned int const line_number, - uintptr_t const reserved -) -{ - TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); - - /* Force access violation to produce a dmp file for debugging */ - *(int*)0 = 0; - - TerminateProcess(GetCurrentProcess(), STATUS_INVALID_CRUNTIME_PARAMETER); -} #endif -LONG WINAPI dbg_vectored_exception_handler(EXCEPTION_POINTERS* exception) -{ - if (exception && - exception->ContextRecord && - exception->ExceptionRecord && - exception->ExceptionRecord->ExceptionAddress && - exception->ExceptionRecord->ExceptionCode == STATUS_PRIVILEGED_INSTRUCTION) - { - size_t size = 0; - BYTE* addr = exception->ExceptionRecord->ExceptionAddress; - switch (*addr) - { - case 0xE4: // IN ib - case 0xE5: // IN id - case 0xE6: // OUT ib - case 0xE7: // OUT ib - size = 2; - break; - case 0xF8: // CLC - case 0xF9: // STC - case 0xFA: // CLI - case 0xFB: // STI - case 0xFC: // CLD - case 0xFD: // STD - case 0xEC: // IN ib - case 0xED: // IN id - case 0xEE: // OUT - case 0xEF: // OUT - size = 1; - break; - } - - if (size) - { - exception->ContextRecord->Eip += size; - return EXCEPTION_CONTINUE_EXECUTION; - } - } - - return EXCEPTION_CONTINUE_SEARCH; -} - void dbg_init() { - static BOOL once = 0; + static int stdout_open = 0; - if (!once) + if (!stdout_open) { - once = TRUE; + stdout_open = 1; - char exe_path[MAX_PATH] = { 0 }; - if (GetModuleFileNameA(NULL, exe_path, sizeof(exe_path) - 1) > 0) - { - char filename[MAX_PATH] = { 0 }; - char drive[MAX_PATH] = { 0 }; - char dir[MAX_PATH] = { 0 }; - _splitpath(exe_path, drive, dir, filename, NULL); + freopen("cnc-ddraw.log", "w", stdout); + setvbuf(stdout, NULL, _IOLBF, 1024); - char game_path[MAX_PATH] = { 0 }; - _makepath(game_path, drive, dir, NULL, NULL); - - _snprintf(g_dbg_dmp_path1, sizeof(g_dbg_dmp_path1) - 1, "%scnc-ddraw-%s-1.dmp", game_path, filename); - _snprintf(g_dbg_dmp_path2, sizeof(g_dbg_dmp_path2) - 1, "%scnc-ddraw-%s-2.dmp", game_path, filename); - - _snprintf(g_dbg_log_path1, sizeof(g_dbg_log_path1) - 1, "%scnc-ddraw-%s-1.log", game_path, filename); - _snprintf(g_dbg_log_path2, sizeof(g_dbg_log_path2) - 1, "%scnc-ddraw-%s-2.log", game_path, filename); - _snprintf(g_dbg_log_path3, sizeof(g_dbg_log_path3) - 1, "%scnc-ddraw-%s-3.log", game_path, filename); - } - - remove(g_dbg_dmp_path1); - remove(g_dbg_dmp_path2); - - remove(g_dbg_log_path1); - remove(g_dbg_log_path2); - remove(g_dbg_log_path3); - - g_dbg_log_file = fopen(g_dbg_log_path1, "w"); - if (g_dbg_log_file) - { - setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); - } - - TRACE( - "cnc-ddraw version = %d.%d.%d.%d (git~%s, %s)\n", - VERSION_MAJOR, - VERSION_MINOR, - VERSION_BUILD, - VERSION_REVISION, - GIT_COMMIT, - GIT_BRANCH); - - TRACE("cnc-ddraw = %p\n", g_ddraw_module); - - HKEY hkey = NULL; + HKEY hkey; LONG status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0L, KEY_READ, &hkey); - HKEY hkey9x = NULL; - LONG status9x = - RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion", 0L, KEY_READ, &hkey9x); - - char name[256] = { 0 }; - DWORD name_size = sizeof(name); - if (status || RegQueryValueExA(hkey, "ProductName", NULL, NULL, (PVOID)&name, &name_size) != ERROR_SUCCESS) - { - if (status9x == ERROR_SUCCESS) - RegQueryValueExA(hkey9x, "ProductName", NULL, NULL, (PVOID)&name, &name_size); - } - - char vers[256] = { 0 }; - DWORD vers_size = sizeof(vers); - if (status || RegQueryValueExA(hkey, "DisplayVersion", NULL, NULL, (PVOID)&vers, &vers_size) != ERROR_SUCCESS) - { - if (status9x == ERROR_SUCCESS) - RegQueryValueExA(hkey9x, "VersionNumber", NULL, NULL, (PVOID)&vers, &vers_size); - } - - char build[256] = { 0 }; - DWORD build_size = sizeof(build); - if (status || RegQueryValueExA(hkey, "BuildLabEx", NULL, NULL, (PVOID)&build, &build_size) != ERROR_SUCCESS) - { - if (status == ERROR_SUCCESS) - RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size); - } - - TRACE("%s %s (%s)\n", name, vers, build); - if (status == ERROR_SUCCESS) - RegCloseKey(hkey); - - if (status9x == ERROR_SUCCESS) - RegCloseKey(hkey9x); - - if (IsWine()) { - TRACE("Wine version = %s\n", verhelp_wine_get_version()); + char name[256] = { 0 }; + DWORD name_size = sizeof(name); + RegQueryValueExA(hkey, "ProductName", NULL, NULL, (PVOID)&name, &name_size); - const char* sysname = NULL; - const char* release = NULL; - verhelp_wine_get_host_version(&sysname, &release); + char build[256] = { 0 }; + DWORD build_size = sizeof(build); + RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size); - TRACE("Wine sysname = %s, release = %s\n", sysname, release); - } + dbg_printf("%s (%s)\n", name, build); - TRACE("crc32 = %08X\n", Crc32_FromFile(0, exe_path)); + const char* (CDECL * wine_get_version)() = + (void*)GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version"); - DWORD timestamp = util_get_timestamp(GetModuleHandleA(NULL)); - if (timestamp) - { - TRACE("timestamp = %s", asctime(_gmtime32((const long*)×tamp))); + if (wine_get_version) + dbg_printf("Wine version = %s\n", wine_get_version()); } } } @@ -309,7 +110,7 @@ void dbg_debug_string(const char* format, ...) OutputDebugStringA(buffer); } -void dbg_printf(const char* fmt, ...) +int dbg_printf(const char* fmt, ...) { static CRITICAL_SECTION cs; static BOOL initialized; @@ -322,63 +123,30 @@ void dbg_printf(const char* fmt, ...) EnterCriticalSection(&cs); - if (g_dbg_log_file && ftell(g_dbg_log_file) >= 1024 * 1024 * 100) /* rotate every 100MB */ - { - g_dbg_log_file = - freopen( - g_dbg_log_rotate ? g_dbg_log_path3 : g_dbg_log_path2, - "w", - g_dbg_log_file); + va_list args; + int ret; - g_dbg_log_rotate = !g_dbg_log_rotate; + SYSTEMTIME st; + GetLocalTime(&st); - if (g_dbg_log_file) - { - setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); - } - } + fprintf( + stdout, + "[%lu] %02d:%02d:%02d.%03d ", + GetCurrentThreadId(), + st.wHour, + st.wMinute, + st.wSecond, + st.wMilliseconds); - if (g_dbg_log_file) - { - va_list args; - SYSTEMTIME st; - GetLocalTime(&st); + va_start(args, fmt); + ret = vfprintf(stdout, fmt, args); + va_end(args); - fprintf( - g_dbg_log_file, - "[%lu] %02d:%02d:%02d.%03d ", - GetCurrentThreadId(), - st.wHour, - st.wMinute, - st.wSecond, - st.wMilliseconds); - - va_start(args, fmt); - vfprintf(g_dbg_log_file, fmt, args); - va_end(args); - - fflush(g_dbg_log_file); - } + fflush(stdout); LeaveCriticalSection(&cs); -} -void dbg_print_rect(char* info, LPRECT rect) -{ -#ifdef _DEBUG - if (rect) - { - TRACE( - " %s: l=%d, t=%d, r=%d, b=%d (%dx%d)\n", - info, - rect->left, - rect->top, - rect->right, - rect->bottom, - rect->right - rect->left, - rect->bottom - rect->top); - } -#endif + return ret; } void dbg_draw_frame_info_start() @@ -386,12 +154,12 @@ void dbg_draw_frame_info_start() static DWORD tick_fps = 0; static char debug_text[512] = { 0 }; - RECT debugrc = { 0, 0, g_ddraw.width, g_ddraw.height }; + RECT debugrc = { 0, 0, g_ddraw->width, g_ddraw->height }; - if (g_ddraw.primary) + if (g_ddraw->primary) { HDC primary_dc; - dds_GetDC(g_ddraw.primary, &primary_dc); + dds_GetDC(g_ddraw->primary, &primary_dc); DrawText(primary_dc, debug_text, -1, &debugrc, DT_NOCLIP); } @@ -421,316 +189,6 @@ void dbg_draw_frame_info_end() g_dbg_frame_time = dbg_counter_stop(); } -void dbg_dump_wnd_styles(DWORD style, DWORD exstyle) -{ -#ifdef _DEBUG - if (style & WS_BORDER) { - TRACE(" WS_BORDER\n"); - } - if (style & WS_CAPTION) { - TRACE(" WS_CAPTION\n"); - } - if (style & WS_CHILD) { - TRACE(" WS_CHILD\n"); - } - if (style & WS_CHILDWINDOW) { - TRACE(" WS_CHILDWINDOW\n"); - } - if (style & WS_CLIPCHILDREN) { - TRACE(" WS_CLIPCHILDREN\n"); - } - if (style & WS_CLIPSIBLINGS) { - TRACE(" WS_CLIPSIBLINGS\n"); - } - if (style & WS_DISABLED) { - TRACE(" WS_DISABLED\n"); - } - if (style & WS_DLGFRAME) { - TRACE(" WS_DLGFRAME\n"); - } - if (style & WS_GROUP) { - TRACE(" WS_GROUP\n"); - } - if (style & WS_HSCROLL) { - TRACE(" WS_HSCROLL\n"); - } - if (style & WS_ICONIC) { - TRACE(" WS_ICONIC\n"); - } - if (style & WS_MAXIMIZE) { - TRACE(" WS_MAXIMIZE\n"); - } - if (style & WS_MAXIMIZEBOX) { - TRACE(" WS_MAXIMIZEBOX\n"); - } - if (style & WS_MINIMIZE) { - TRACE(" WS_MINIMIZE\n"); - } - if (style & WS_MINIMIZEBOX) { - TRACE(" WS_MINIMIZEBOX\n"); - } - if (style & WS_POPUP) { - TRACE(" WS_POPUP\n"); - } - if (style & WS_SIZEBOX) { - TRACE(" WS_SIZEBOX\n"); - } - if (style & WS_SYSMENU) { - TRACE(" WS_SYSMENU\n"); - } - if (style & WS_TABSTOP) { - TRACE(" WS_TABSTOP\n"); - } - if (style & WS_THICKFRAME) { - TRACE(" WS_THICKFRAME\n"); - } - if (style & WS_VISIBLE) { - TRACE(" WS_VISIBLE\n"); - } - if (style & WS_VSCROLL) { - TRACE(" WS_VSCROLL\n"); - } - - if (exstyle & WS_EX_ACCEPTFILES) { - TRACE(" WS_EX_ACCEPTFILES\n"); - } - if (exstyle & WS_EX_APPWINDOW) { - TRACE(" WS_EX_APPWINDOW\n"); - } - if (exstyle & WS_EX_CLIENTEDGE) { - TRACE(" WS_EX_CLIENTEDGE\n"); - } - if (exstyle & WS_EX_COMPOSITED) { - TRACE(" WS_EX_COMPOSITED\n"); - } - if (exstyle & WS_EX_CONTEXTHELP) { - TRACE(" WS_EX_CONTEXTHELP\n"); - } - if (exstyle & WS_EX_CONTROLPARENT) { - TRACE(" WS_EX_CONTROLPARENT\n"); - } - if (exstyle & WS_EX_DLGMODALFRAME) { - TRACE(" WS_EX_DLGMODALFRAME\n"); - } - if (exstyle & WS_EX_LAYERED) { - TRACE(" WS_EX_LAYERED\n"); - } - if (exstyle & WS_EX_LAYOUTRTL) { - TRACE(" WS_EX_LAYOUTRTL\n"); - } - if (exstyle & WS_EX_LEFTSCROLLBAR) { - TRACE(" WS_EX_LEFTSCROLLBAR\n"); - } - if (exstyle & WS_EX_MDICHILD) { - TRACE(" WS_EX_MDICHILD\n"); - } - if (exstyle & WS_EX_NOACTIVATE) { - TRACE(" WS_EX_NOACTIVATE\n"); - } - if (exstyle & WS_EX_NOINHERITLAYOUT) { - TRACE(" WS_EX_NOINHERITLAYOUT\n"); - } - if (exstyle & WS_EX_NOPARENTNOTIFY) { - TRACE(" WS_EX_NOPARENTNOTIFY\n"); - } - //if (exstyle & WS_EX_NOREDIRECTIONBITMAP) { - // TRACE(" WS_EX_NOREDIRECTIONBITMAP\n"); - //} - if (exstyle & WS_EX_RIGHT) { - TRACE(" WS_EX_RIGHT\n"); - } - if (exstyle & WS_EX_RTLREADING) { - TRACE(" WS_EX_RTLREADING\n"); - } - if (exstyle & WS_EX_STATICEDGE) { - TRACE(" WS_EX_STATICEDGE\n"); - } - if (exstyle & WS_EX_TOOLWINDOW) { - TRACE(" WS_EX_TOOLWINDOW\n"); - } - if (exstyle & WS_EX_TOPMOST) { - TRACE(" WS_EX_TOPMOST\n"); - } - if (exstyle & WS_EX_TRANSPARENT) { - TRACE(" WS_EX_TRANSPARENT\n"); - } - if (exstyle & WS_EX_WINDOWEDGE) { - TRACE(" WS_EX_WINDOWEDGE\n"); - } -#endif -} - -void dbg_dump_swp_flags(DWORD flags) -{ -#ifdef _DEBUG - if (flags & SWP_NOSIZE) { - TRACE(" SWP_NOSIZE\n"); - } - if (flags & SWP_NOMOVE) { - TRACE(" SWP_NOMOVE\n"); - } - if (flags & SWP_NOZORDER) { - TRACE(" SWP_NOZORDER\n"); - } - if (flags & SWP_NOREDRAW) { - TRACE(" SWP_NOREDRAW\n"); - } - if (flags & SWP_NOACTIVATE) { - TRACE(" SWP_NOACTIVATE\n"); - } - if (flags & SWP_FRAMECHANGED) { - TRACE(" SWP_FRAMECHANGED\n"); - } - if (flags & SWP_SHOWWINDOW) { - TRACE(" SWP_SHOWWINDOW\n"); - } - if (flags & SWP_HIDEWINDOW) { - TRACE(" SWP_HIDEWINDOW\n"); - } - if (flags & SWP_NOCOPYBITS) { - TRACE(" SWP_NOCOPYBITS\n"); - } - if (flags & SWP_NOOWNERZORDER) { - TRACE(" SWP_NOOWNERZORDER\n"); - } - if (flags & SWP_NOSENDCHANGING) { - TRACE(" SWP_NOSENDCHANGING\n"); - } - if (flags & SWP_DEFERERASE) { - TRACE(" SWP_DEFERERASE\n"); - } - if (flags & SWP_ASYNCWINDOWPOS) { - TRACE(" SWP_ASYNCWINDOWPOS\n"); - } -#endif -} - -void dbg_dump_ddp_flags(DWORD flags) -{ -#ifdef _DEBUG - if (flags & DDPCAPS_4BIT) { - TRACE(" DDPCAPS_4BIT\n"); - } - if (flags & DDPCAPS_8BITENTRIES) { - TRACE(" DDPCAPS_8BITENTRIES\n"); - } - if (flags & DDPCAPS_8BIT) { - TRACE(" DDPCAPS_8BIT\n"); - } - if (flags & DDPCAPS_INITIALIZE) { - TRACE(" DDPCAPS_INITIALIZE\n"); - } - if (flags & DDPCAPS_PRIMARYSURFACE) { - TRACE(" DDPCAPS_PRIMARYSURFACE\n"); - } - if (flags & DDPCAPS_PRIMARYSURFACELEFT) { - TRACE(" DDPCAPS_PRIMARYSURFACELEFT\n"); - } - if (flags & DDPCAPS_ALLOW256) { - TRACE(" DDPCAPS_ALLOW256\n"); - } - if (flags & DDPCAPS_VSYNC) { - TRACE(" DDPCAPS_VSYNC\n"); - } - if (flags & DDPCAPS_1BIT) { - TRACE(" DDPCAPS_1BIT\n"); - } - if (flags & DDPCAPS_2BIT) { - TRACE(" DDPCAPS_2BIT\n"); - } - if (flags & DDPCAPS_ALPHA) { - TRACE(" DDPCAPS_ALPHA\n"); - } -#endif -} - -void dbg_dump_scl_flags(DWORD flags) -{ -#ifdef _DEBUG - if (flags & DDSCL_FULLSCREEN) { - TRACE(" DDSCL_FULLSCREEN\n"); - } - if (flags & DDSCL_ALLOWREBOOT) { - TRACE(" DDSCL_ALLOWREBOOT\n"); - } - if (flags & DDSCL_NOWINDOWCHANGES) { - TRACE(" DDSCL_NOWINDOWCHANGES\n"); - } - if (flags & DDSCL_NORMAL) { - TRACE(" DDSCL_NORMAL\n"); - } - if (flags & DDSCL_EXCLUSIVE) { - TRACE(" DDSCL_EXCLUSIVE\n"); - } - if (flags & DDSCL_ALLOWMODEX) { - TRACE(" DDSCL_ALLOWMODEX\n"); - } - if (flags & DDSCL_SETFOCUSWINDOW) { - TRACE(" DDSCL_SETFOCUSWINDOW\n"); - } - if (flags & DDSCL_SETDEVICEWINDOW) { - TRACE(" DDSCL_SETDEVICEWINDOW\n"); - } - if (flags & DDSCL_CREATEDEVICEWINDOW) { - TRACE(" DDSCL_CREATEDEVICEWINDOW\n"); - } - if (flags & DDSCL_MULTITHREADED) { - TRACE(" DDSCL_MULTITHREADED\n"); - } - if (flags & DDSCL_FPUSETUP) { - TRACE(" DDSCL_FPUSETUP\n"); - } - if (flags & DDSCL_FPUPRESERVE) { - TRACE(" DDSCL_FPUPRESERVE\n"); - } -#endif -} - -void dbg_dump_edm_flags(DWORD flags) -{ -#ifdef _DEBUG - if (flags & DDEDM_REFRESHRATES) { - TRACE(" DDEDM_REFRESHRATES\n"); - } - if (flags & DDEDM_STANDARDVGAMODES) { - TRACE(" DDEDM_STANDARDVGAMODES\n"); - } -#endif -} - -void dbg_dump_dds_flip_flags(DWORD flags) -{ -#ifdef _DEBUG_X - if (flags & DDFLIP_WAIT) { - TRACE(" DDFLIP_WAIT\n"); - } - if (flags & DDFLIP_EVEN) { - TRACE(" DDFLIP_EVEN\n"); - } - if (flags & DDFLIP_ODD) { - TRACE(" DDFLIP_ODD\n"); - } - if (flags & DDFLIP_NOVSYNC) { - TRACE(" DDFLIP_NOVSYNC\n"); - } - if (flags & DDFLIP_INTERVAL2) { - TRACE(" DDFLIP_INTERVAL2\n"); - } - if (flags & DDFLIP_INTERVAL3) { - TRACE(" DDFLIP_INTERVAL3\n"); - } - if (flags & DDFLIP_INTERVAL4) { - TRACE(" DDFLIP_INTERVAL4\n"); - } - if (flags & DDFLIP_STEREO) { - TRACE(" DDFLIP_STEREO\n"); - } - if (flags & DDFLIP_DONOTWAIT) { - TRACE(" DDFLIP_DONOTWAIT\n"); - } -#endif -} - void dbg_dump_dds_blt_flags(DWORD flags) { #ifdef _DEBUG_X @@ -865,7 +323,7 @@ void dbg_dump_dds_blt_fx_flags(DWORD flags) void dbg_dump_dds_caps(DWORD caps) { -#ifdef _DEBUG +#ifdef _DEBUG_X if (caps & DDSCAPS_RESERVED1) { TRACE(" DDSCAPS_RESERVED1\n"); } @@ -961,7 +419,7 @@ void dbg_dump_dds_caps(DWORD caps) void dbg_dump_dds_flags(DWORD flags) { -#ifdef _DEBUG +#ifdef _DEBUG_X if (flags & DDSD_CAPS) { TRACE(" DDSD_CAPS\n"); } @@ -1091,111 +549,6 @@ void dbg_dump_dds_lock_flags(DWORD flags) #endif } -void dbg_dump_di_scm_flags(DWORD flags) -{ -#ifdef _DEBUG - if (flags & DISCL_EXCLUSIVE) { - TRACE(" DISCL_EXCLUSIVE\n"); - } - if (flags & DISCL_NONEXCLUSIVE) { - TRACE(" DISCL_NONEXCLUSIVE\n"); - } - if (flags & DISCL_FOREGROUND) { - TRACE(" DISCL_FOREGROUND\n"); - } - if (flags & DISCL_BACKGROUND) { - TRACE(" DISCL_BACKGROUND\n"); - } - if (flags & DISCL_NOWINKEY) { - TRACE(" DISCL_NOWINKEY\n"); - } -#endif -} - -void dbg_dump_hook_type(int idHook) -{ -#ifdef _DEBUG - if (idHook == 0) { - TRACE(" WH_JOURNALRECORD\n"); - } - if (idHook == 1) { - TRACE(" WH_JOURNALPLAYBACK\n"); - } - if (idHook == 2) { - TRACE(" WH_KEYBOARD\n"); - } - if (idHook == 3) { - TRACE(" WH_GETMESSAGE\n"); - } - if (idHook == 4) { - TRACE(" WH_CALLWNDPROC\n"); - } - if (idHook == 5) { - TRACE(" WH_CBT\n"); - } - if (idHook == 6) { - TRACE(" WH_SYSMSGFILTER\n"); - } - if (idHook == 7) { - TRACE(" WH_MOUSE\n"); - } - if (idHook == 9) { - TRACE(" WH_DEBUG\n"); - } - if (idHook == 10) { - TRACE(" WH_SHELL\n"); - } - if (idHook == 11) { - TRACE(" WH_FOREGROUNDIDLE\n"); - } - if (idHook == 12) { - TRACE(" WH_CALLWNDPROCRET\n"); - } - if (idHook == 13) { - TRACE(" WH_KEYBOARD_LL\n"); - } - if (idHook == 14) { - TRACE(" WH_MOUSE_LL\n"); - } - if (idHook == -1) { - TRACE(" WH_MSGFILTER\n"); - } -#endif -} - -char* dbg_d3d9_hr_to_str(HRESULT hr) -{ -#define HR_TO_STR(x) if (x == hr) return #x - - HR_TO_STR(D3D_OK); - - HR_TO_STR(D3DERR_WRONGTEXTUREFORMAT); - HR_TO_STR(D3DERR_UNSUPPORTEDCOLOROPERATION); - HR_TO_STR(D3DERR_UNSUPPORTEDCOLORARG); - HR_TO_STR(D3DERR_UNSUPPORTEDALPHAOPERATION); - HR_TO_STR(D3DERR_UNSUPPORTEDALPHAARG); - HR_TO_STR(D3DERR_TOOMANYOPERATIONS); - HR_TO_STR(D3DERR_CONFLICTINGTEXTUREFILTER); - HR_TO_STR(D3DERR_UNSUPPORTEDFACTORVALUE); - HR_TO_STR(D3DERR_CONFLICTINGRENDERSTATE); - HR_TO_STR(D3DERR_UNSUPPORTEDTEXTUREFILTER); - HR_TO_STR(D3DERR_CONFLICTINGTEXTUREPALETTE); - HR_TO_STR(D3DERR_DRIVERINTERNALERROR); - - HR_TO_STR(D3DERR_NOTFOUND); - HR_TO_STR(D3DERR_MOREDATA); - HR_TO_STR(D3DERR_DEVICELOST); - HR_TO_STR(D3DERR_DEVICENOTRESET); - HR_TO_STR(D3DERR_NOTAVAILABLE); - HR_TO_STR(D3DERR_OUTOFVIDEOMEMORY); - HR_TO_STR(D3DERR_INVALIDDEVICE); - HR_TO_STR(D3DERR_INVALIDCALL); - HR_TO_STR(D3DERR_DRIVERINVALIDCALL); - HR_TO_STR(D3DERR_WASSTILLDRAWING); - - return "UNKNOWN"; -} - char* dbg_mes_to_str(int id) { switch (id) @@ -1279,13 +632,6 @@ char* dbg_mes_to_str(int id) case 134: return "WM_NCACTIVATE"; case 135: return "WM_GETDLGCODE"; case 136: return "WM_SYNCPAINT"; - case 144: return "WM_UAHDESTROYWINDOW"; - case 145: return "WM_UAHDRAWMENU"; - case 146: return "WM_UAHDRAWMENUITEM"; - case 147: return "WM_UAHINITMENU"; - case 148: return "WM_UAHMEASUREMENUITEM"; - case 149: return "WM_UAHNCPAINTMENUPOPUP"; - case 150: return "WM_UAHUPDATE"; case 160: return "WM_NCMOUSEMOVE"; case 161: return "WM_NCLBUTTONDOWN"; case 162: return "WM_NCLBUTTONUP"; @@ -1452,8 +798,6 @@ char* dbg_mes_to_str(int id) case 673: return "WM_MOUSEHOVER"; case 674: return "WM_NCMOUSELEAVE"; case 675: return "WM_MOUSELEAVE"; - case 736: return "WM_DPICHANGED"; - case 740: return "WM_GETDPISCALEDSIZE"; case 768: return "WM_CUT"; case 769: return "WM_COPY"; case 770: return "WM_PASTE"; @@ -1875,14 +1219,6 @@ char* dbg_mes_to_str(int id) case 8720: return "OCM_PARENTNOTIFY"; case 32768: return "WM_APP"; case 52429: return "WM_RASDIALEVENT"; - case WM_DISPLAYCHANGE_DDRAW: return "WM_DISPLAYCHANGE_DDRAW"; - case WM_SIZE_DDRAW: return "WM_SIZE_DDRAW"; - case WM_MOVE_DDRAW: return "WM_MOVE_DDRAW"; - case WM_D3D9DEVICELOST: return "WM_D3D9DEVICELOST"; - case WM_WINEFULLSCREEN: return "WM_WINEFULLSCREEN"; - case WM_AUTORENDERER: return "WM_AUTORENDERER"; - case WM_TOGGLE_FULLSCREEN: return "WM_TOGGLE_FULLSCREEN"; - case WM_TOGGLE_MAXIMIZE: return "WM_TOGGLE_MAXIMIZE"; } return 0; diff --git a/src/delay_imports.c b/src/delay_imports.c deleted file mode 100644 index 2b23dda..0000000 --- a/src/delay_imports.c +++ /dev/null @@ -1,30 +0,0 @@ -#include -#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"); - } -} diff --git a/src/directinput.c b/src/directinput.c index a0d077d..d433c1c 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -1,18 +1,11 @@ + #include #include #include "directinput.h" #include "debug.h" #include "hook.h" #include "dd.h" -#include "mouse.h" -#include "config.h" -#include "utils.h" -#ifdef _MSC_VER -#include "detours.h" -#endif - -BOOL g_dinput_hook_active; DIRECTINPUTCREATEAPROC real_DirectInputCreateA; DIRECTINPUTCREATEWPROC real_DirectInputCreateW; @@ -24,20 +17,10 @@ static DICREATEDEVICEEXPROC real_di_CreateDeviceEx; static DIDSETCOOPERATIVELEVELPROC real_did_SetCooperativeLevel; static DIDGETDEVICEDATAPROC real_did_GetDeviceData; static DIDGETDEVICESTATEPROC real_did_GetDeviceState; - -static PROC* g_di_CreateDevice_vtbl_addr; -static PROC* g_di_CreateDeviceEx_vtbl_addr; -static PROC* g_did_SetCooperativeLevel_vtbl_addr; -static PROC* g_did_GetDeviceData_vtbl_addr; -static PROC* g_did_GetDeviceState_vtbl_addr; - static LPDIRECTINPUTDEVICEA g_mouse_device; static PROC hook_func(PROC* org_func, PROC new_func) { - if (!org_func || !new_func) - return 0; - PROC org = *org_func; DWORD old_protect; @@ -54,18 +37,16 @@ static PROC hook_func(PROC* org_func, PROC new_func) static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HWND hwnd, DWORD dwFlags) { - TRACE("DirectInput SetCooperativeLevel(This=%p, hwnd=%p, dwFlags=0x%08X) [%p]\n", This, hwnd, dwFlags, _ReturnAddress()); - TRACE(" mouse_device = %s\n", This == g_mouse_device ? "TRUE" : "FALSE"); - dbg_dump_di_scm_flags(dwFlags); + TRACE("DirectInput SetCooperativeLevel\n"); - if (This == g_mouse_device && (dwFlags & DISCL_EXCLUSIVE)) + if (This == g_mouse_device && g_ddraw && (dwFlags & DISCL_EXCLUSIVE)) { - if (g_mouse_locked || g_config.devmode || !g_ddraw.ref) + if (g_ddraw->locked || g_ddraw->devmode) { while (real_ShowCursor(FALSE) >= 0); } - InterlockedExchange((LONG*)&g_ddraw.show_cursor_count, -1); + InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, -1); } return real_did_SetCooperativeLevel(This, hwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE); @@ -78,25 +59,13 @@ static HRESULT WINAPI fake_did_GetDeviceData( LPDWORD pdwInOut, DWORD dwFlags) { - /* - TRACE( - "DirectInput GetDeviceData(This=%p, cbObjectData=%lu, rgdod=%p, pdwInOut=%p, dwFlags=%lu) [%p]\n", - This, - cbObjectData, - rgdod, - pdwInOut, - dwFlags, - _ReturnAddress()); - */ - - BOOL block_mouse = This == g_mouse_device && !g_mouse_locked && !g_config.devmode; - BOOL in_background = FALSE;//g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground(g_ddraw.hwnd); + //TRACE("DirectInput GetDeviceData\n"); HRESULT result = real_did_GetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags); - if (SUCCEEDED(result)) + if (SUCCEEDED(result) && g_ddraw && !g_ddraw->locked) { - if ((block_mouse || in_background) && pdwInOut) + if (pdwInOut) { if (rgdod && *pdwInOut > 0 && cbObjectData > 0) { @@ -112,16 +81,13 @@ static HRESULT WINAPI fake_did_GetDeviceData( static HRESULT WINAPI fake_did_GetDeviceState(IDirectInputDeviceA* This, DWORD cbData, LPVOID lpvData) { - //TRACE("DirectInput GetDeviceState(This=%p, cbData=%lu, lpvData=%p) [%p]\n", This, cbData, lpvData, _ReturnAddress()); - - BOOL block_mouse = This == g_mouse_device && !g_mouse_locked && !g_config.devmode; - BOOL in_background = g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground(g_ddraw.hwnd); + //TRACE("DirectInput GetDeviceState\n"); HRESULT result = real_did_GetDeviceState(This, cbData, lpvData); - if (SUCCEEDED(result)) + if (SUCCEEDED(result) && g_ddraw && !g_ddraw->locked) { - if ((block_mouse || in_background) && cbData > 0 && lpvData) + if (cbData > 0 && lpvData) { memset(lpvData, 0, cbData); } @@ -136,38 +102,30 @@ static HRESULT WINAPI fake_di_CreateDevice( LPDIRECTINPUTDEVICEA* lplpDIDevice, LPUNKNOWN pUnkOuter) { - TRACE("DirectInput CreateDevice [%p]\n", _ReturnAddress()); + TRACE("DirectInput CreateDevice\n"); HRESULT result = real_di_CreateDevice(This, rguid, lplpDIDevice, pUnkOuter); if (SUCCEEDED(result)) { - if (rguid) + if (rguid && IsEqualGUID(&GUID_SysMouse, rguid)) { - TRACE(" GUID = %08X\n", ((GUID*)rguid)->Data1); - - if (IsEqualGUID(&GUID_SysMouse, rguid)) - { - g_mouse_device = *lplpDIDevice; - } + g_mouse_device = *lplpDIDevice; } if (!real_did_SetCooperativeLevel) { - g_did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel; - real_did_SetCooperativeLevel = - (DIDSETCOOPERATIVELEVELPROC)hook_func(g_did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel); - - g_did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData; + (DIDSETCOOPERATIVELEVELPROC)hook_func( + (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel, (PROC)fake_did_SetCooperativeLevel); real_did_GetDeviceData = - (DIDGETDEVICEDATAPROC)hook_func(g_did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData); - - g_did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState; + (DIDGETDEVICEDATAPROC)hook_func( + (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData, (PROC)fake_did_GetDeviceData); real_did_GetDeviceState = - (DIDGETDEVICESTATEPROC)hook_func(g_did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState); + (DIDGETDEVICESTATEPROC)hook_func( + (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState, (PROC)fake_did_GetDeviceState); } } @@ -181,38 +139,30 @@ static HRESULT WINAPI fake_di_CreateDeviceEx( LPDIRECTINPUTDEVICEA* lplpDIDevice, LPUNKNOWN pUnkOuter) { - TRACE("DirectInput CreateDeviceEx [%p]\n", _ReturnAddress()); + TRACE("DirectInput CreateDeviceEx\n"); HRESULT result = real_di_CreateDeviceEx(This, rguid, riid, lplpDIDevice, pUnkOuter); if (SUCCEEDED(result)) { - if (rguid) + if (rguid && IsEqualGUID(&GUID_SysMouse, rguid)) { - TRACE(" GUID = %08X\n", ((GUID*)rguid)->Data1); - - if (IsEqualGUID(&GUID_SysMouse, rguid)) - { - g_mouse_device = *lplpDIDevice; - } + g_mouse_device = *lplpDIDevice; } if (!real_did_SetCooperativeLevel) { - g_did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel; - real_did_SetCooperativeLevel = - (DIDSETCOOPERATIVELEVELPROC)hook_func(g_did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel); - - g_did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData; + (DIDSETCOOPERATIVELEVELPROC)hook_func( + (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel, (PROC)fake_did_SetCooperativeLevel); real_did_GetDeviceData = - (DIDGETDEVICEDATAPROC)hook_func(g_did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData); - - g_did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState; + (DIDGETDEVICEDATAPROC)hook_func( + (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData, (PROC)fake_did_GetDeviceData); real_did_GetDeviceState = - (DIDGETDEVICESTATEPROC)hook_func(g_did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState); + (DIDGETDEVICESTATEPROC)hook_func( + (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState, (PROC)fake_did_GetDeviceState); } } @@ -225,19 +175,17 @@ HRESULT WINAPI fake_DirectInputCreateA( LPDIRECTINPUTA* lplpDirectInput, LPUNKNOWN punkOuter) { - TRACE("DirectInputCreateA [%p]\n", _ReturnAddress()); + TRACE("DirectInputCreateA\n"); if (!real_DirectInputCreateA) { real_DirectInputCreateA = - (DIRECTINPUTCREATEAPROC)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateA"); + (DIRECTINPUTCREATEAPROC)GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateA"); if (real_DirectInputCreateA == fake_DirectInputCreateA) { real_DirectInputCreateA = - (DIRECTINPUTCREATEAPROC)real_GetProcAddress( - real_LoadLibraryA("system32\\dinput.dll"), - "DirectInputCreateA"); + (DIRECTINPUTCREATEAPROC)GetProcAddress(LoadLibraryA("system32\\dinput.dll"), "DirectInputCreateA"); } } @@ -246,12 +194,10 @@ HRESULT WINAPI fake_DirectInputCreateA( HRESULT result = real_DirectInputCreateA(hinst, dwVersion, lplpDirectInput, punkOuter); - if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) + if (SUCCEEDED(result) && !real_di_CreateDevice) { - g_di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice; - real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); } return result; @@ -263,19 +209,17 @@ HRESULT WINAPI fake_DirectInputCreateW( LPDIRECTINPUTW* lplpDirectInput, LPUNKNOWN punkOuter) { - TRACE("DirectInputCreateW [%p]\n", _ReturnAddress()); + TRACE("DirectInputCreateW\n"); if (!real_DirectInputCreateW) { real_DirectInputCreateW = - (DIRECTINPUTCREATEWPROC)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateW"); + (DIRECTINPUTCREATEWPROC)GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateW"); if (real_DirectInputCreateW == fake_DirectInputCreateW) { real_DirectInputCreateW = - (DIRECTINPUTCREATEWPROC)real_GetProcAddress( - real_LoadLibraryA("system32\\dinput.dll"), - "DirectInputCreateW"); + (DIRECTINPUTCREATEWPROC)GetProcAddress(LoadLibraryA("system32\\dinput.dll"), "DirectInputCreateW"); } } @@ -284,12 +228,10 @@ HRESULT WINAPI fake_DirectInputCreateW( HRESULT result = real_DirectInputCreateW(hinst, dwVersion, lplpDirectInput, punkOuter); - if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) + if (SUCCEEDED(result) && !real_di_CreateDevice) { - g_di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice; - real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); } return result; @@ -302,19 +244,17 @@ HRESULT WINAPI fake_DirectInputCreateEx( LPDIRECTINPUT7A* ppvOut, LPUNKNOWN punkOuter) { - TRACE("DirectInputCreateEx [%p]\n", _ReturnAddress()); + TRACE("DirectInputCreateEx\n"); if (!real_DirectInputCreateEx) { real_DirectInputCreateEx = - (DIRECTINPUTCREATEEXPROC)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateEx"); + (DIRECTINPUTCREATEEXPROC)GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateEx"); if (real_DirectInputCreateEx == fake_DirectInputCreateEx) { real_DirectInputCreateEx = - (DIRECTINPUTCREATEEXPROC)real_GetProcAddress( - real_LoadLibraryA("system32\\dinput.dll"), - "DirectInputCreateEx"); + (DIRECTINPUTCREATEEXPROC)GetProcAddress(LoadLibraryA("system32\\dinput.dll"), "DirectInputCreateEx"); } } @@ -323,24 +263,19 @@ HRESULT WINAPI fake_DirectInputCreateEx( HRESULT result = real_DirectInputCreateEx(hinst, dwVersion, riidltf, ppvOut, punkOuter); - if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) + if (SUCCEEDED(result) && !real_di_CreateDevice) { - g_di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice; - real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); } if (SUCCEEDED(result) && !real_di_CreateDeviceEx && riidltf && - (IsEqualGUID(&IID_IDirectInput7A, riidltf) || IsEqualGUID(&IID_IDirectInput7W, riidltf)) - && !g_config.no_dinput_hook) + (IsEqualGUID(&IID_IDirectInput7A, riidltf) || IsEqualGUID(&IID_IDirectInput7W, riidltf))) { - g_di_CreateDeviceEx_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx; - real_di_CreateDeviceEx = - (DICREATEDEVICEEXPROC)hook_func(g_di_CreateDeviceEx_vtbl_addr, (PROC)fake_di_CreateDeviceEx); + (DICREATEDEVICEEXPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx, (PROC)fake_di_CreateDeviceEx); } return result; @@ -353,19 +288,17 @@ HRESULT WINAPI fake_DirectInput8Create( LPDIRECTINPUT8* ppvOut, LPUNKNOWN punkOuter) { - TRACE("DirectInput8Create [%p]\n", _ReturnAddress()); + TRACE("DirectInput8Create\n"); if (!real_DirectInput8Create) { real_DirectInput8Create = - (DIRECTINPUT8CREATEPROC)real_GetProcAddress(real_LoadLibraryA("dinput8.dll"), "DirectInput8Create"); + (DIRECTINPUT8CREATEPROC)GetProcAddress(GetModuleHandle("dinput8.dll"), "DirectInput8Create"); if (real_DirectInput8Create == fake_DirectInput8Create) { real_DirectInput8Create = - (DIRECTINPUT8CREATEPROC)real_GetProcAddress( - real_LoadLibraryA("system32\\dinput8.dll"), - "DirectInput8Create"); + (DIRECTINPUT8CREATEPROC)GetProcAddress(LoadLibraryA("system32\\dinput8.dll"), "DirectInput8Create"); } } @@ -374,111 +307,11 @@ HRESULT WINAPI fake_DirectInput8Create( HRESULT result = real_DirectInput8Create(hinst, dwVersion, riidltf, ppvOut, punkOuter); - if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) + if (SUCCEEDED(result) && !real_di_CreateDevice) { - g_di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice; - real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); } return result; } - -void dinput_hook_init() -{ -#ifdef _MSC_VER - if (!g_dinput_hook_active) - { - g_dinput_hook_active = TRUE; - - real_DirectInputCreateA = (void*)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateA"); - - if (real_DirectInputCreateA && real_DirectInputCreateA != fake_DirectInputCreateA) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach((PVOID*)&real_DirectInputCreateA, (PVOID)fake_DirectInputCreateA); - DetourTransactionCommit(); - } - /* Being called from winmm for some reason - real_DirectInputCreateW = (void*)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateW"); - - if (real_DirectInputCreateW && real_DirectInputCreateW != fake_DirectInputCreateW) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach((PVOID*)&real_DirectInputCreateW, (PVOID)fake_DirectInputCreateW); - DetourTransactionCommit(); - } - */ - real_DirectInputCreateEx = (void*)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateEx"); - - if (real_DirectInputCreateEx && real_DirectInputCreateEx != fake_DirectInputCreateEx) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach((PVOID*)&real_DirectInputCreateEx, (PVOID)fake_DirectInputCreateEx); - DetourTransactionCommit(); - } - - real_DirectInput8Create = (void*)real_GetProcAddress(real_LoadLibraryA("dinput8.dll"), "DirectInput8Create"); - - if (real_DirectInput8Create && real_DirectInput8Create != fake_DirectInput8Create) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach((PVOID*)&real_DirectInput8Create, (PVOID)fake_DirectInput8Create); - DetourTransactionCommit(); - } - } -#endif -} - -void dinput_hook_exit() -{ - hook_func(g_di_CreateDevice_vtbl_addr, (PROC)real_di_CreateDevice); - hook_func(g_di_CreateDeviceEx_vtbl_addr, (PROC)real_di_CreateDeviceEx); - hook_func(g_did_SetCooperativeLevel_vtbl_addr, (PROC)real_did_SetCooperativeLevel); - hook_func(g_did_GetDeviceData_vtbl_addr, (PROC)real_did_GetDeviceData); - hook_func(g_did_GetDeviceState_vtbl_addr, (PROC)real_did_GetDeviceState); - -#ifdef _MSC_VER - if (g_dinput_hook_active) - { - if (real_DirectInputCreateA) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourDetach((PVOID*)&real_DirectInputCreateA, (PVOID)fake_DirectInputCreateA); - DetourTransactionCommit(); - } - /* Being called from winmm for some reason - if (real_DirectInputCreateW) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourDetach((PVOID*)&real_DirectInputCreateW, (PVOID)fake_DirectInputCreateW); - DetourTransactionCommit(); - } - */ - if (real_DirectInputCreateEx) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourDetach((PVOID*)&real_DirectInputCreateEx, (PVOID)fake_DirectInputCreateEx); - DetourTransactionCommit(); - } - - if (real_DirectInput8Create) - { - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourDetach((PVOID*)&real_DirectInput8Create, (PVOID)fake_DirectInput8Create); - DetourTransactionCommit(); - } - - g_dinput_hook_active = FALSE; - } -#endif -} diff --git a/src/dllmain.c b/src/dllmain.c index 8832177..86f1439 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -2,18 +2,12 @@ #include "ddraw.h" #include #include "dllmain.h" -#include "directinput.h" #include "IDirectDraw.h" #include "dd.h" #include "ddclipper.h" #include "debug.h" #include "config.h" #include "hook.h" -#include "indeo.h" -#include "utils.h" -#include "versionhelpers.h" -#include "delay_imports.h" -#include "keyboard.h" /* export for cncnet cnc games */ @@ -24,7 +18,6 @@ PVOID FakePrimarySurface; HMODULE g_ddraw_module; -static BOOL g_screensaver_disabled; BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { @@ -32,61 +25,33 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { case DLL_PROCESS_ATTACH: { - g_ddraw_module = hDll; - - delay_imports_init(); - - if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0)) - { - cfg_load(); - return TRUE; - } - -#ifdef _DEBUG +#if _DEBUG dbg_init(); - g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); + TRACE("cnc-ddraw = %p\n", hDll); + SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); #endif - - cfg_load(); - - PVOID(WINAPI * add_handler)(ULONG, PVECTORED_EXCEPTION_HANDLER) = - (void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "AddVectoredExceptionHandler"); - - if (add_handler) - { - g_dbg_exception_handle = add_handler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); - } + g_ddraw_module = hDll; char buf[1024]; if (GetEnvironmentVariable("__COMPAT_LAYER", buf, sizeof(buf))) { - TRACE("__COMPAT_LAYER = %s\n", buf); - char* s = strtok(buf, " "); while (s) { - /* Workaround for bug in Windows 11 (Steam RA2 crash) */ - if (_strcmpi(s, "Win7RTM") == 0) - { - g_config.d3d9on12 = TRUE; - } - if (_strcmpi(s, "WIN95") == 0 || _strcmpi(s, "WIN98") == 0 || _strcmpi(s, "NT4SP5") == 0) { - char mes[280] = { 0 }; + char mes[128] = { 0 }; _snprintf( mes, - sizeof(mes) - 1, - "Warning: Compatibility modes detected. \n\nIf there are issues with the game then try to " - "disable the '%s' compatibility mode for all game executables.\n\n" - "Note: You can disable this warning via ddraw.ini -> 'no_compat_warning=true'", + sizeof(mes), + "Please disable the '%s' compatibility mode for all game executables and " + "then try to start the game again.", s); - if (!g_config.no_compat_warning) - MessageBoxA(NULL, mes, "Compatibility modes detected - cnc-ddraw", MB_OK); + MessageBoxA(NULL, mes, "Compatibility modes detected - cnc-ddraw", MB_OK); break; } @@ -103,7 +68,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) if (user32_dll) { SETPROCESSDPIAWARENESSCONTEXTPROC set_awareness_context = - (SETPROCESSDPIAWARENESSCONTEXTPROC)real_GetProcAddress(user32_dll, "SetProcessDpiAwarenessContext"); + (SETPROCESSDPIAWARENESSCONTEXTPROC)GetProcAddress(user32_dll, "SetProcessDpiAwarenessContext"); if (set_awareness_context) { @@ -114,7 +79,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) if (!set_dpi_aware && shcore_dll) { SETPROCESSDPIAWERENESSPROC set_awareness = - (SETPROCESSDPIAWERENESSPROC)real_GetProcAddress(shcore_dll, "SetProcessDpiAwareness"); + (SETPROCESSDPIAWERENESSPROC)GetProcAddress(shcore_dll, "SetProcessDpiAwareness"); if (set_awareness) { @@ -127,166 +92,58 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) if (!set_dpi_aware && user32_dll) { SETPROCESSDPIAWAREPROC set_aware = - (SETPROCESSDPIAWAREPROC)real_GetProcAddress(user32_dll, "SetProcessDPIAware"); + (SETPROCESSDPIAWAREPROC)GetProcAddress(user32_dll, "SetProcessDPIAware"); if (set_aware) set_aware(); } - /* Make sure screensaver will stay off and monitors will stay on */ - SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED); - - /* WINE does not support SetThreadExecutionState so we'll have to use SPI_SETSCREENSAVEACTIVE instead */ - BOOL screensaver_enabled = FALSE; - SystemParametersInfoA(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_enabled, 0); - - if (screensaver_enabled) - { - SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0); - g_screensaver_disabled = TRUE; - } - - indeo_enable(); timeBeginPeriod(1); - hook_init(); + hook_early_init(); break; } case DLL_PROCESS_DETACH: { - if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0)) - return TRUE; - TRACE("cnc-ddraw DLL_PROCESS_DETACH\n"); cfg_save(); - indeo_disable(); timeEndPeriod(1); - keyboard_hook_exit(); - dinput_hook_exit(); hook_exit(); - - SetThreadExecutionState(ES_CONTINUOUS); - - if (g_screensaver_disabled) - { - SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0); - } - - ULONG(WINAPI* remove_handler)(PVOID) = - (void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "RemoveVectoredExceptionHandler"); - - if (g_dbg_exception_handle && remove_handler) - remove_handler(g_dbg_exception_handle); - - if (g_config.terminate_process == 2) - TerminateProcess(GetCurrentProcess(), 0); - break; } - case DLL_THREAD_ATTACH: - { - if (g_config.singlecpu && !IsWine() && IsWindows11Version24H2OrGreater()) - { - util_set_thread_affinity(GetCurrentThreadId()); - } - } } return TRUE; } -void DDEnableZoom() -{ - TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); - - g_ddraw.zoom.enabled = TRUE; -} - -BOOL DDIsWindowed() -{ - TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); - - return g_config.windowed && !g_config.fullscreen; -} - -FARPROC WINAPI DDGetProcAddress(HMODULE hModule, LPCSTR lpProcName) -{ - TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); - - return real_GetProcAddress(hModule, lpProcName); -} - HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnknown FAR* pUnkOuter) { - TRACE("-> %s(lpGUID=%p, lplpDD=%p, pUnkOuter=%p) [%p]\n", __FUNCTION__, lpGUID, lplpDD, pUnkOuter, _ReturnAddress()); - - HRESULT ret; - - if (util_caller_is_ddraw_wrapper(_ReturnAddress()) || g_config.flightsim98_hack) - { - if (lplpDD) - *lplpDD = NULL; - - ret = DDERR_GENERIC; - } - else - { - ret = dd_CreateEx(lpGUID, (LPVOID*)lplpDD, &IID_IDirectDraw, pUnkOuter); - } - + TRACE("-> %s(lpGUID=%p, lplpDD=%p, pUnkOuter=%p)\n", __FUNCTION__, lpGUID, lplpDD, pUnkOuter); + HRESULT ret = dd_CreateEx(lpGUID, (LPVOID*)lplpDD, &IID_IDirectDraw, pUnkOuter); TRACE("<- %s\n", __FUNCTION__); return ret; } HRESULT WINAPI DirectDrawCreateClipper(DWORD dwFlags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter) { - TRACE( - "-> %s(dwFlags=%08X, DDClipper=%p, unkOuter=%p) [%p]\n", - __FUNCTION__, - (int)dwFlags, - lplpDDClipper, - pUnkOuter, - _ReturnAddress()); - + TRACE("-> %s(dwFlags=%08X, DDClipper=%p, unkOuter=%p)\n", __FUNCTION__, (int)dwFlags, lplpDDClipper, pUnkOuter); HRESULT ret = dd_CreateClipper(dwFlags, (IDirectDrawClipperImpl**)lplpDDClipper, pUnkOuter); - TRACE("<- %s\n", __FUNCTION__); return ret; } HRESULT WINAPI DirectDrawCreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter) { - TRACE( - "-> %s(lpGUID=%p, lplpDD=%p, riid=%08X, pUnkOuter=%p) [%p]\n", - __FUNCTION__, - lpGuid, - lplpDD, - iid, - pUnkOuter, - _ReturnAddress()); - - HRESULT ret; - - if (util_caller_is_ddraw_wrapper(_ReturnAddress()) || g_config.flightsim98_hack) - { - if (lplpDD) - *lplpDD = NULL; - - ret = DDERR_GENERIC; - } - else - { - ret = dd_CreateEx(lpGuid, lplpDD, &IID_IDirectDraw7, pUnkOuter); - } - + TRACE("-> %s(lpGUID=%p, lplpDD=%p, riid=%08X, pUnkOuter=%p)\n", __FUNCTION__, lpGuid, lplpDD, iid, pUnkOuter); + HRESULT ret = dd_CreateEx(lpGuid, lplpDD, &IID_IDirectDraw7, pUnkOuter); TRACE("<- %s\n", __FUNCTION__); return ret; } HRESULT WINAPI DirectDrawEnumerateA(LPDDENUMCALLBACK lpCallback, LPVOID lpContext) { - TRACE("-> %s(lpCallback=%p, lpContext=%p) [%p]\n", __FUNCTION__, lpCallback, lpContext, _ReturnAddress()); + TRACE("-> %s(lpCallback=%p, lpContext=%p)\n", __FUNCTION__, lpCallback, lpContext); if (lpCallback) lpCallback(NULL, "Primary Display Driver", "display", lpContext); @@ -297,13 +154,7 @@ HRESULT WINAPI DirectDrawEnumerateA(LPDDENUMCALLBACK lpCallback, LPVOID lpContex HRESULT WINAPI DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags) { - TRACE( - "-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d) [%p]\n", - __FUNCTION__, - lpCallback, - lpContext, - dwFlags, - _ReturnAddress()); + TRACE("-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d)\n", __FUNCTION__, lpCallback, lpContext, dwFlags); if (lpCallback) lpCallback(NULL, "Primary Display Driver", "display", lpContext, NULL); @@ -314,12 +165,7 @@ HRESULT WINAPI DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA lpCallback, LPVOID lpC HRESULT WINAPI DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags) { - TRACE( - "-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d) [%p]\n", __FUNCTION__, - lpCallback, - lpContext, - dwFlags, - _ReturnAddress()); + TRACE("-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d)\n", __FUNCTION__, lpCallback, lpContext, dwFlags); if (lpCallback) lpCallback(NULL, L"Primary Display Driver", L"display", lpContext, NULL); @@ -330,7 +176,7 @@ HRESULT WINAPI DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW lpCallback, LPVOID lpC HRESULT WINAPI DirectDrawEnumerateW(LPDDENUMCALLBACKW lpCallback, LPVOID lpContext) { - TRACE("-> %s(lpCallback=%p, lpContext=%p) [%p]\n", __FUNCTION__, lpCallback, lpContext, _ReturnAddress()); + TRACE("-> %s(lpCallback=%p, lpContext=%p)\n", __FUNCTION__, lpCallback, lpContext); if (lpCallback) lpCallback(NULL, L"Primary Display Driver", L"display", lpContext); @@ -341,7 +187,7 @@ HRESULT WINAPI DirectDrawEnumerateW(LPDDENUMCALLBACKW lpCallback, LPVOID lpConte DWORD WINAPI CompleteCreateSysmemSurface(DWORD a) { - TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); DWORD ret = 0; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -349,7 +195,7 @@ DWORD WINAPI CompleteCreateSysmemSurface(DWORD a) HRESULT WINAPI D3DParseUnknownCommand(LPVOID lpCmd, LPVOID* lpRetCmd) { - TRACE("NOT_IMPLEMENTED -> %s(lpCmd=%p, lpRetCmd=%p) [%p]\n", __FUNCTION__, lpCmd, lpRetCmd, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s(lpCmd=%p, lpRetCmd=%p)\n", __FUNCTION__, lpCmd, lpRetCmd); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -357,7 +203,7 @@ HRESULT WINAPI D3DParseUnknownCommand(LPVOID lpCmd, LPVOID* lpRetCmd) DWORD WINAPI AcquireDDThreadLock() { - TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); DWORD ret = 0; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -365,7 +211,7 @@ DWORD WINAPI AcquireDDThreadLock() DWORD WINAPI ReleaseDDThreadLock() { - TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); DWORD ret = 0; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -373,7 +219,7 @@ DWORD WINAPI ReleaseDDThreadLock() DWORD WINAPI DDInternalLock(DWORD a, DWORD b) { - TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); DWORD ret = 0; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -381,8 +227,50 @@ DWORD WINAPI DDInternalLock(DWORD a, DWORD b) DWORD WINAPI DDInternalUnlock(DWORD a) { - TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress()); + TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); DWORD ret = 0; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } + +/* Exports for game patching */ + +void* __cdecl DDmemcpy(void* _Dst, void const* _Src, size_t _Size) +{ + return memcpy(_Dst, _Src, _Size); +} + +void* __cdecl DDmemmove(void* _Dst, void const* _Src, size_t _Size) +{ + return memmove(_Dst, _Src, _Size); +} + +void* __cdecl DDmemset(void* _Dst, int _Val, size_t _Size) +{ + return memset(_Dst, _Val, _Size); +} + +void __cdecl DDZeroMemory(PVOID Destination, SIZE_T Length) +{ + memset(Destination, 0, Length); +} + +void* __stdcall DDmemcpyStd(void* _Dst, void const* _Src, size_t _Size) +{ + return memcpy(_Dst, _Src, _Size); +} + +void* __stdcall DDmemmoveStd(void* _Dst, void const* _Src, size_t _Size) +{ + return memmove(_Dst, _Src, _Size); +} + +void* __stdcall DDmemsetStd(void* _Dst, int _Val, size_t _Size) +{ + return memset(_Dst, _Val, _Size); +} + +void __stdcall DDZeroMemoryStd(PVOID Destination, SIZE_T Length) +{ + memset(Destination, 0, Length); +} diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 0996784..c2c82a2 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -2,23 +2,18 @@ #include "fps_limiter.h" #include "dd.h" #include "debug.h" -#include "hook.h" -#include "config.h" -#include "render_ogl.h" -#include "versionhelpers.h" - FPSLIMITER g_fpsl; void fpsl_init() { - int max_fps = g_config.maxfps; + int max_fps = g_ddraw->render.maxfps; g_fpsl.tick_length_ns = 0; g_fpsl.tick_length = 0; - if (max_fps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency))) - max_fps = g_ddraw.mode.dmDisplayFrequency; + if (max_fps < 0 || g_ddraw->vsync) + max_fps = g_ddraw->mode.dmDisplayFrequency; if (max_fps > 1000) max_fps = 0; @@ -38,75 +33,62 @@ void fpsl_init() g_fpsl.D3DKMTCloseAdapter(&g_fpsl.close_adapter); } - if (!g_fpsl.cs_initialized) - { - g_fpsl.cs_initialized = TRUE; - InitializeCriticalSection(&g_fpsl.cs); - } - if (!g_fpsl.gdi32_dll) { - g_fpsl.gdi32_dll = real_LoadLibraryA("gdi32.dll"); + g_fpsl.gdi32_dll = LoadLibraryA("gdi32.dll"); } if (!g_fpsl.dwmapi_dll) { - g_fpsl.dwmapi_dll = real_LoadLibraryA("dwmapi.dll"); + g_fpsl.dwmapi_dll = LoadLibraryA("dwmapi.dll"); } if (!g_fpsl.DwmFlush) { g_fpsl.DwmFlush = - (DWMFLUSHPROC)real_GetProcAddress(g_fpsl.dwmapi_dll, "DwmFlush"); + (DWMFLUSHPROC)GetProcAddress(g_fpsl.dwmapi_dll, "DwmFlush"); } if (!g_fpsl.DwmIsCompositionEnabled) { g_fpsl.DwmIsCompositionEnabled = - (DWMISCOMPOSITIONENABLEDPROC)real_GetProcAddress(g_fpsl.dwmapi_dll, "DwmIsCompositionEnabled"); + (DWMISCOMPOSITIONENABLEDPROC)GetProcAddress(g_fpsl.dwmapi_dll, "DwmIsCompositionEnabled"); } if (!g_fpsl.D3DKMTWaitForVerticalBlankEvent) { g_fpsl.D3DKMTWaitForVerticalBlankEvent = - (D3DKMTWAITFORVERTICALBLANKEVENTPROC)real_GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTWaitForVerticalBlankEvent"); + (D3DKMTWAITFORVERTICALBLANKEVENTPROC)GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTWaitForVerticalBlankEvent"); } if (!g_fpsl.D3DKMTOpenAdapterFromHdc) { g_fpsl.D3DKMTOpenAdapterFromHdc = - (D3DKMTOPENADAPTERFROMHDCPROC)real_GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTOpenAdapterFromHdc"); + (D3DKMTOPENADAPTERFROMHDCPROC)GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTOpenAdapterFromHdc"); } if (!g_fpsl.D3DKMTCloseAdapter) { g_fpsl.D3DKMTCloseAdapter = - (D3DKMTCLOSEADAPTERPROC)real_GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTCloseAdapter"); + (D3DKMTCLOSEADAPTERPROC)GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTCloseAdapter"); } g_fpsl.initialized = TRUE; } -BOOL fpsl_wait_for_vblank() +BOOL fpsl_wait_for_vblank(BOOL open_adapter) { if (g_fpsl.initialized) { - if (!g_fpsl.got_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && g_ddraw.render.hdc) + if (open_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && !g_fpsl.got_adapter) { - EnterCriticalSection(&g_fpsl.cs); + g_fpsl.adapter.hDc = g_ddraw->render.hdc; - if (!g_fpsl.got_adapter) + if (g_fpsl.D3DKMTOpenAdapterFromHdc(&g_fpsl.adapter) == 0) { - g_fpsl.adapter.hDc = g_ddraw.render.hdc; - - if (g_fpsl.D3DKMTOpenAdapterFromHdc(&g_fpsl.adapter) == 0) - { - g_fpsl.vblank_event.hAdapter = g_fpsl.adapter.hAdapter; - g_fpsl.got_adapter = TRUE; - } + g_fpsl.vblank_event.hAdapter = g_fpsl.adapter.hAdapter; + g_fpsl.got_adapter = TRUE; } - - LeaveCriticalSection(&g_fpsl.cs); } if (g_fpsl.got_adapter && g_fpsl.D3DKMTWaitForVerticalBlankEvent) @@ -120,12 +102,7 @@ BOOL fpsl_wait_for_vblank() BOOL fpsl_dwm_flush() { - if (g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush && !IsWine()) - { - return SUCCEEDED(g_fpsl.DwmFlush()); - } - - return FALSE; + return g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush && SUCCEEDED(g_fpsl.DwmFlush()); } BOOL fpsl_dwm_is_enabled() @@ -146,27 +123,17 @@ void fpsl_frame_start() void fpsl_frame_end() { - if (g_config.maxfps < 0 || - (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency))) + if (g_ddraw->render.maxfps < 0 || g_ddraw->vsync) { - /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ - if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) - { - if (fpsl_wait_for_vblank()) - return; - } - else - { - if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) - return; - } + if (fpsl_dwm_flush() || fpsl_wait_for_vblank(TRUE)) + return; } if (g_fpsl.tick_length > 0) { if (g_fpsl.htimer) { - if (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency)) + if (g_ddraw->vsync) { WaitForSingleObject(g_fpsl.htimer, g_fpsl.tick_length * 2); LARGE_INTEGER due_time = { .QuadPart = -g_fpsl.tick_length_ns }; diff --git a/src/hook.c b/src/hook.c index 29846c7..66af624 100644 --- a/src/hook.c +++ b/src/hook.c @@ -1,21 +1,21 @@ +#define WIN32_LEAN_AND_MEAN #include #include +#include #include "directinput.h" #include "dd.h" #include "winapi_hooks.h" #include "hook.h" #include "debug.h" #include "dllmain.h" -#include "config.h" -#include "utils.h" -#include "patch.h" -#include "versionhelpers.h" #ifdef _MSC_VER #include "detours.h" #endif BOOL g_hook_active; +BOOL g_hook_dinput; +int g_hook_method = 1; GETCURSORPOSPROC real_GetCursorPos = GetCursorPos; CLIPCURSORPROC real_ClipCursor = ClipCursor; @@ -40,50 +40,19 @@ CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA; DESTROYWINDOWPROC real_DestroyWindow = DestroyWindow; MAPWINDOWPOINTSPROC real_MapWindowPoints = MapWindowPoints; SHOWWINDOWPROC real_ShowWindow = ShowWindow; -GETTOPWINDOWPROC real_GetTopWindow = GetTopWindow; -GETFOREGROUNDWINDOWPROC real_GetForegroundWindow = GetForegroundWindow; -STRETCHBLTPROC real_StretchBlt = StretchBlt; -BITBLTPROC real_BitBlt = BitBlt; -SETDIBITSTODEVICEPROC real_SetDIBitsToDevice = SetDIBitsToDevice; -STRETCHDIBITSPROC real_StretchDIBits = StretchDIBits; SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; -PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; -GETMESSAGEAPROC real_GetMessageA = GetMessageA; -GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; -SETWINDOWPLACEMENTPROC real_SetWindowPlacement = SetWindowPlacement; -ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; -DEFWINDOWPROCAPROC real_DefWindowProcA = DefWindowProcA; -SETPARENTPROC real_SetParent = SetParent; -BEGINPAINTPROC real_BeginPaint = BeginPaint; -GETKEYSTATEPROC real_GetKeyState = GetKeyState; -GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA; CREATEFONTAPROC real_CreateFontA = CreateFontA; -GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries = GetSystemPaletteEntries; -SELECTPALETTEPROC real_SelectPalette = SelectPalette; -REALIZEPALETTEPROC real_RealizePalette = RealizePalette; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; -GETPROCADDRESSPROC real_GetProcAddress = GetProcAddress; -GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA; -GETVERSIONPROC real_GetVersion = GetVersion; -GETVERSIONEXAPROC real_GetVersionExA = GetVersionExA; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; -MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA; -SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; -AVISTREAMGETFRAMEOPENPROC real_AVIStreamGetFrameOpen = AVIStreamGetFrameOpen; -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) -SETWINDOWLONGWPROC real_SetWindowLongW = SetWindowLongW; -#else -SETWINDOWLONGWPROC real_SetWindowLongW; -#endif -HOOKLIST g_hook_hooklist[] = +static HOOKLIST g_hooks[] = { { "user32.dll", @@ -92,8 +61,8 @@ HOOKLIST g_hook_hooklist[] = { "ClipCursor", (PROC)fake_ClipCursor, (PROC*)&real_ClipCursor, 0 }, { "ShowCursor", (PROC)fake_ShowCursor, (PROC*)&real_ShowCursor, 0 }, { "SetCursor", (PROC)fake_SetCursor, (PROC*)&real_SetCursor, 0 }, - { "GetWindowRect", (PROC)fake_GetWindowRect, (PROC*)&real_GetWindowRect, 0 }, - { "GetClientRect", (PROC)fake_GetClientRect, (PROC*)&real_GetClientRect, 0 }, + { "GetWindowRect", (PROC)fake_GetWindowRect, (PROC*)&real_GetWindowRect, SKIP_HOOK3 }, + { "GetClientRect", (PROC)fake_GetClientRect, (PROC*)&real_GetClientRect, SKIP_HOOK3 }, { "ClientToScreen", (PROC)fake_ClientToScreen, (PROC*)&real_ClientToScreen, 0 }, { "ScreenToClient", (PROC)fake_ScreenToClient, (PROC*)&real_ScreenToClient, 0 }, { "SetCursorPos", (PROC)fake_SetCursorPos, (PROC*)&real_SetCursorPos, 0 }, @@ -111,104 +80,24 @@ HOOKLIST g_hook_hooklist[] = { "DestroyWindow", (PROC)fake_DestroyWindow, (PROC*)&real_DestroyWindow, 0 }, { "MapWindowPoints", (PROC)fake_MapWindowPoints, (PROC*)&real_MapWindowPoints, 0 }, { "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow, 0 }, - { "GetTopWindow", (PROC)fake_GetTopWindow, (PROC*)&real_GetTopWindow, 0 }, - { "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 }, - { "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 }, - { "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 }, - { "GetWindowPlacement", (PROC)fake_GetWindowPlacement, (PROC*)&real_GetWindowPlacement, 0 }, - { "SetWindowPlacement", (PROC)fake_SetWindowPlacement, (PROC*)&real_SetWindowPlacement, 0 }, - { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 }, - { "DefWindowProcA", (PROC)fake_DefWindowProcA, (PROC*)&real_DefWindowProcA, 0 }, - { "SetParent", (PROC)fake_SetParent, (PROC*)&real_SetParent, 0 }, - { "BeginPaint", (PROC)fake_BeginPaint, (PROC*)&real_BeginPaint, 0 }, - { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, - { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, - { "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA, (PROC*)&real_SetWindowsHookExA, 0 }, - -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) - { "SetWindowLongW", (PROC)fake_SetWindowLongW, (PROC*)&real_SetWindowLongW, 0 }, -#endif - - { "", NULL, NULL, 0 } - } - }, - { - "ole32.dll", - { - { "CoCreateInstance", (PROC)fake_CoCreateInstance, (PROC*)&real_CoCreateInstance, HOOK_SKIP_2 }, - { "", NULL, NULL, 0 } - } - }, - { - "winmm.dll", - { - { "mciSendCommandA", (PROC)fake_mciSendCommandA, (PROC*)&real_mciSendCommandA, HOOK_SKIP_2 }, - { "", NULL, NULL, 0 } - } - }, - { - "Avifil32.dll", - { - { "AVIStreamGetFrameOpen", (PROC)fake_AVIStreamGetFrameOpen, (PROC*)&real_AVIStreamGetFrameOpen, 0 }, - { "", NULL, NULL, 0 } - } - }, - { - "dinput.dll", - { - { "DirectInputCreateA", (PROC)fake_DirectInputCreateA, (PROC*)&real_DirectInputCreateA, HOOK_SKIP_2 }, - //{ "DirectInputCreateW", (PROC)fake_DirectInputCreateW, (PROC*)&real_DirectInputCreateW, HOOK_SKIP_2 }, - { "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx, (PROC*)&real_DirectInputCreateEx, HOOK_SKIP_2 }, - { "", NULL, NULL, 0 } - } - }, - { - "dinput8.dll", - { - { "DirectInput8Create", (PROC)fake_DirectInput8Create, (PROC*)&real_DirectInput8Create, HOOK_SKIP_2 }, { "", NULL, NULL, 0 } } }, { "gdi32.dll", { - { "BitBlt", (PROC)fake_BitBlt, (PROC*)&real_BitBlt, HOOK_SKIP_2 }, - { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, HOOK_SKIP_2 }, - { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, HOOK_SKIP_2 }, - { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, HOOK_SKIP_2 }, - { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, HOOK_LOCAL_ONLY }, - { "GetDeviceCaps", (PROC)fake_GetDeviceCaps_system, NULL, HOOK_SYSTEM_ONLY }, - { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, - { "GetSystemPaletteEntries", (PROC)fake_GetSystemPaletteEntries, (PROC*)&real_GetSystemPaletteEntries, 0 }, - { "SelectPalette", (PROC)fake_SelectPalette, (PROC*)&real_SelectPalette, 0 }, - { "RealizePalette", (PROC)fake_RealizePalette, (PROC*)&real_RealizePalette, 0 }, - { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 }, - { "", NULL, NULL, 0 } - } - }, - { - "WING32.DLL", - { - { "WinGBitBlt", (PROC)fake_WinGBitBlt, NULL, 0 }, - { "WinGStretchBlt", (PROC)fake_WinGStretchBlt, NULL, 0 }, + { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, SKIP_HOOK3 }, { "", NULL, NULL, 0 } } }, { "kernel32.dll", { - { "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, HOOK_SKIP_2 }, - { "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, HOOK_SKIP_2 }, - { "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, HOOK_SKIP_2 }, - { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 }, - { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, HOOK_SKIP_2 }, - { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, 0 }, - { "GetVersion", (PROC)fake_GetVersion, (PROC*)&real_GetVersion, 0 }, - { "GetVersionExA", (PROC)fake_GetVersionExA, (PROC*)&real_GetVersionExA, 0 }, -#if defined(_DEBUG) && defined(__GNUC__) - { "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter, (PROC*)&real_SetUnhandledExceptionFilter, 0 }, -#endif + { "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, SKIP_HOOK2 | SKIP_HOOK3 }, + { "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, SKIP_HOOK2 | SKIP_HOOK3 }, + { "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, SKIP_HOOK2 | SKIP_HOOK3 }, + { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, SKIP_HOOK2 | SKIP_HOOK3 }, { "", NULL, NULL, 0 } } }, @@ -230,73 +119,60 @@ void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function strncpy(hooks[0].module_name, module_name, sizeof(hooks[0].module_name) - 1); strncpy(hooks[0].data[0].function_name, function_name, sizeof(hooks[0].data[0].function_name) - 1); - hook_patch_iat_list(hmod, unhook, (HOOKLIST*)&hooks, FALSE); + hook_patch_iat_list(hmod, unhook, (HOOKLIST*)&hooks); } -void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local) +void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) { if (!hmod || hmod == INVALID_HANDLE_VALUE || !hooks) return; +#ifdef _MSC_VER __try { +#endif PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)hmod; if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return; - PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)hmod + (DWORD)dos_header->e_lfanew); + PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew); if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return; - DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; - if (!import_desc_rva) - return; + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + + (DWORD)(nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)); - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)hmod + import_desc_rva); + if (import_desc == (PIMAGE_IMPORT_DESCRIPTOR)nt_headers) + return; while (import_desc->FirstThunk) { - if (!import_desc->Name) - { - import_desc++; - continue; - } - for (int i = 0; hooks[i].module_name[0]; i++) { - char* imp_module_name = (char*)((DWORD)hmod + import_desc->Name); + char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name)); if (_stricmp(imp_module_name, hooks[i].module_name) == 0) { - HMODULE cur_mod = GetModuleHandleA(hooks[i].module_name); + HMODULE cur_mod = GetModuleHandle(hooks[i].module_name); - PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)hmod + import_desc->FirstThunk); + PIMAGE_THUNK_DATA first_thunk = + (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->FirstThunk); + + PIMAGE_THUNK_DATA original_first_thunk = + (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->OriginalFirstThunk); while (first_thunk->u1.Function) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { - /* GetProcAddress is slow, save the pointer and reuse it for better performance */ - DWORD org_function = (DWORD)InterlockedExchangeAdd((LONG*)&hooks[i].data[x].org_function, 0); - - if (!org_function || cur_mod != hooks[i].data[x].mod) - { - hooks[i].data[x].mod = cur_mod; - - org_function = (DWORD)real_GetProcAddress(cur_mod, hooks[i].data[x].function_name); - - InterlockedExchange((LONG*)&hooks[i].data[x].org_function, (LONG)org_function); - } + DWORD org_function = + (DWORD)GetProcAddress( + cur_mod, + hooks[i].data[x].function_name); if (!hooks[i].data[x].new_function || !org_function) continue; - if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) - continue; - - if (is_local && (hooks[i].data[x].flags & HOOK_SYSTEM_ONLY)) - continue; - if (unhook) { if (first_thunk->u1.Function == (DWORD)hooks[i].data[x].new_function) @@ -340,90 +216,73 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, } first_thunk++; + original_first_thunk++; } - - break; } } import_desc++; } +#ifdef _MSC_VER } __except (EXCEPTION_EXECUTE_HANDLER) { } +#endif } -void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local) +void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) { - hook_patch_obfuscated_iat_list(hmod, unhook, hooks, is_local); + hook_patch_obfuscated_iat_list(hmod, unhook, hooks); if (!hmod || hmod == INVALID_HANDLE_VALUE || !hooks) return; +#ifdef _MSC_VER __try { +#endif PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)hmod; if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return; - PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)hmod + (DWORD)dos_header->e_lfanew); + PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew); if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return; - DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; - if (!import_desc_rva) - return; + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + + (DWORD)(nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)); - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)hmod + import_desc_rva); + if (import_desc == (PIMAGE_IMPORT_DESCRIPTOR)nt_headers) + return; while (import_desc->FirstThunk) { - if (!import_desc->OriginalFirstThunk || !import_desc->Name) - { - import_desc++; - continue; - } - for (int i = 0; hooks[i].module_name[0]; i++) { - char* imp_module_name = (char*)((DWORD)hmod + import_desc->Name); + char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name)); if (_stricmp(imp_module_name, hooks[i].module_name) == 0) { - PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)hmod + import_desc->FirstThunk); - PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)hmod + import_desc->OriginalFirstThunk); + PIMAGE_THUNK_DATA first_thunk = + (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->FirstThunk); - while (first_thunk->u1.Function) + PIMAGE_THUNK_DATA original_first_thunk = + (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->OriginalFirstThunk); + + while (first_thunk->u1.Function && original_first_thunk->u1.AddressOfData) { - if (!o_first_thunk->u1.AddressOfData) - { - first_thunk++; - o_first_thunk++; - continue; - } + PIMAGE_IMPORT_BY_NAME import = + (PIMAGE_IMPORT_BY_NAME)((DWORD)dos_header + original_first_thunk->u1.AddressOfData); - PIMAGE_IMPORT_BY_NAME import = (void*)((DWORD)dos_header + o_first_thunk->u1.AddressOfData); - - if ((o_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) + if ((original_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { if (!unhook && !hooks[i].data[x].new_function) continue; - if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) - continue; - - if (is_local && (hooks[i].data[x].flags & HOOK_SYSTEM_ONLY)) - continue; - -#if defined(__GNUC__) - if (util_is_bad_read_ptr((void*)import->Name)) - continue; -#endif - - if (strcmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) + if (_stricmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) { DWORD op; @@ -436,8 +295,8 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc if (unhook) { DWORD org = - (DWORD)real_GetProcAddress( - GetModuleHandleA(hooks[i].module_name), + (DWORD)GetProcAddress( + GetModuleHandle(hooks[i].module_name), hooks[i].data[x].function_name); if (org && first_thunk->u1.Function != org) @@ -460,82 +319,34 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc } first_thunk++; - o_first_thunk++; + original_first_thunk++; } - - break; } } import_desc++; } +#ifdef _MSC_VER } __except (EXCEPTION_EXECUTE_HANDLER) { } -} - -BOOL hook_got_ddraw_import(HMODULE mod, BOOL check_imported_dlls) -{ - if (!mod) - return FALSE; - - __try - { - PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)mod; - if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) - return FALSE; - - PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)mod + (DWORD)dos_header->e_lfanew); - if (nt_headers->Signature != IMAGE_NT_SIGNATURE) - return FALSE; - - DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; - if (!import_desc_rva) - return FALSE; - - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)mod + import_desc_rva); - - while (import_desc->FirstThunk) - { - if (import_desc->Name) - { - char* imp_module_name = (char*)((DWORD)mod + import_desc->Name); - - if (_stricmp(imp_module_name, "ddraw.dll") == 0) - { - PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)mod + import_desc->FirstThunk); - - if (first_thunk->u1.Function) - return TRUE; - } - else if (check_imported_dlls) - { - if (hook_got_ddraw_import(GetModuleHandleA(imp_module_name), FALSE)) - return TRUE; - } - } - - import_desc++; - } - } - __except (EXCEPTION_EXECUTE_HANDLER) - { - } - - return FALSE; +#endif } void hook_create(HOOKLIST* hooks, BOOL initial_hook) { #ifdef _MSC_VER - if ((g_config.hook == 2) && initial_hook) + if ((g_hook_method == 2 || g_hook_method == 3) && initial_hook) { for (int i = 0; hooks[i].module_name[0]; i++) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { - if ((hooks[i].data[x].flags & HOOK_SKIP_2)) + if (g_hook_method == 2 && (hooks[i].data[x].flags & SKIP_HOOK2)) + continue; + + if (g_hook_method == 3 && (hooks[i].data[x].flags & SKIP_HOOK3)) continue; DetourTransactionBegin(); @@ -547,7 +358,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) } #endif - if (g_config.hook == 3 || g_config.hook == 4) + if (g_hook_method == 3 || g_hook_method == 4) { char game_exe_path[MAX_PATH] = { 0 }; char game_dir[MAX_PATH] = { 0 }; @@ -560,64 +371,66 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) char mod_dir[MAX_PATH] = { 0 }; char mod_filename[MAX_PATH] = { 0 }; HMODULE hmod = NULL; + HANDLE process = NULL; - while ((hmod = util_enumerate_modules(hmod))) +#ifndef _MSC_VER + HMODULE mods[512]; + memset(mods, 0, sizeof(mods)); + process = GetCurrentProcess(); + EnumProcessModules(process, mods, sizeof(mods) - sizeof(mods[0]), NULL); + for (int i = 0; i < sizeof(mods) / sizeof(mods[0]) && (hmod = mods[i]); i++) +#else + while (hmod = DetourEnumerateModules(hmod)) +#endif { if (hmod == g_ddraw_module) continue; if (GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { - if (initial_hook) - { - TRACE("Module %s = %p\n", mod_path, hmod); - } + TRACE_EXT("Module %s = %p\n", mod_path, hmod); _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); /* Don't hook reshade/swiftshader/mesa3d */ if (_strcmpi(mod_filename, "opengl32") == 0 || - _strcmpi(mod_filename, "libgallium_wgl") == 0 || - _strcmpi(mod_filename, "libglapi") == 0 || _strcmpi(mod_filename, "d3d9") == 0 || - _strcmpi(mod_filename, "mdraw") == 0 || - _strcmpi(mod_filename, "SH33W32") == 0 || _strcmpi(mod_filename, "Shw32") == 0) continue; - BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; - BOOL wine_hook = IsWine() && _strcmpi(mod_filename, "mciavi32") == 0; - - if (is_local || - wine_hook || - _strcmpi(mod_filename, "QuickTime") == 0 || - _strcmpi(mod_filename, "MSVFW32") == 0 || + if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) { - hook_patch_iat_list(hmod, FALSE, hooks, is_local); + hook_patch_iat_list(hmod, FALSE, hooks); } } } + + if (process) + CloseHandle(process); } } - if (g_config.hook == 1) + if (g_hook_method == 1) { - hook_patch_iat_list(GetModuleHandle(NULL), FALSE, hooks, TRUE); + hook_patch_iat_list(GetModuleHandle(NULL), FALSE, hooks); } } void hook_revert(HOOKLIST* hooks) { #ifdef _MSC_VER - if (g_config.hook == 2) + if (g_hook_method == 2 || g_hook_method == 3) { for (int i = 0; hooks[i].module_name[0]; i++) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { - if ((hooks[i].data[x].flags & HOOK_SKIP_2)) + if (g_hook_method == 2 && (hooks[i].data[x].flags & SKIP_HOOK2)) + continue; + + if (g_hook_method == 3 && (hooks[i].data[x].flags & SKIP_HOOK3)) continue; DetourTransactionBegin(); @@ -629,7 +442,7 @@ void hook_revert(HOOKLIST* hooks) } #endif - if (g_config.hook == 3 || g_config.hook == 4) + if (g_hook_method == 3 || g_hook_method == 4) { char game_exe_path[MAX_PATH] = { 0 }; char game_dir[MAX_PATH] = { 0 }; @@ -642,8 +455,17 @@ void hook_revert(HOOKLIST* hooks) char mod_dir[MAX_PATH] = { 0 }; char mod_filename[MAX_PATH] = { 0 }; HMODULE hmod = NULL; + HANDLE process = NULL; - while ((hmod = util_enumerate_modules(hmod))) +#ifndef _MSC_VER + HMODULE mods[512]; + memset(mods, 0, sizeof(mods)); + process = GetCurrentProcess(); + EnumProcessModules(process, mods, sizeof(mods) - sizeof(mods[0]), NULL); + for (int i = 0; i < sizeof(mods) / sizeof(mods[0]) && (hmod = mods[i]); i++) +#else + while (hmod = DetourEnumerateModules(hmod)) +#endif { if (hmod == g_ddraw_module) continue; @@ -652,88 +474,182 @@ void hook_revert(HOOKLIST* hooks) { _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); - BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; - BOOL wine_hook = IsWine() && _strcmpi(mod_filename, "mciavi32") == 0; - - if (is_local || - wine_hook || - _strcmpi(mod_filename, "QuickTime") == 0 || - _strcmpi(mod_filename, "MSVFW32") == 0 || + if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) { - hook_patch_iat_list(hmod, TRUE, hooks, is_local); + hook_patch_iat_list(hmod, TRUE, hooks); } } } + + if (process) + CloseHandle(process); } } - if (g_config.hook == 1) + if (g_hook_method == 1) { - hook_patch_iat_list(GetModuleHandle(NULL), TRUE, hooks, TRUE); + hook_patch_iat_list(GetModuleHandle(NULL), TRUE, hooks); } } void hook_init() { - if (!g_hook_active) + if (!g_hook_active || g_hook_method == 3 || g_hook_method == 4) { - if (g_config.hook == 4 && hook_got_ddraw_import(GetModuleHandleA(NULL), TRUE)) - { - /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ - g_config.hook = 3; + BOOL initial_hook = !g_hook_active; - TRACE("Switched to hook 3\n"); - } - } - - if (!g_hook_active || g_config.hook == 3 || g_config.hook == 4) - { -#if defined(_DEBUG) && defined(_MSC_VER) - if (!g_hook_active) + if (initial_hook) { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); - DetourAttach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); + DetourAttach((PVOID*)&real_CreateFontIndirectA, (PVOID)fake_CreateFontIndirectA); DetourTransactionCommit(); - if (!IsDebuggerPresent()) + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&real_CreateFontA, (PVOID)fake_CreateFontA); + DetourTransactionCommit(); + } + + +#ifdef _MSC_VER + if (initial_hook && g_hook_dinput) + { + real_DirectInputCreateA = + (DIRECTINPUTCREATEAPROC)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateA"); + + if (real_DirectInputCreateA) { - patch_ljmp((void*)_invoke_watson, (void*)dbg_invoke_watson); + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&real_DirectInputCreateA, (PVOID)fake_DirectInputCreateA); + DetourTransactionCommit(); + } + + real_DirectInputCreateW = + (DIRECTINPUTCREATEWPROC)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateW"); + + if (real_DirectInputCreateW) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&real_DirectInputCreateW, (PVOID)fake_DirectInputCreateW); + DetourTransactionCommit(); + } + + real_DirectInputCreateEx = + (DIRECTINPUTCREATEEXPROC)GetProcAddress(LoadLibraryA("dinput.dll"), "DirectInputCreateEx"); + + if (real_DirectInputCreateEx) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&real_DirectInputCreateEx, (PVOID)fake_DirectInputCreateEx); + DetourTransactionCommit(); + } + + real_DirectInput8Create = + (DIRECTINPUT8CREATEPROC)GetProcAddress(LoadLibraryA("dinput8.dll"), "DirectInput8Create"); + + if (real_DirectInput8Create) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&real_DirectInput8Create, (PVOID)fake_DirectInput8Create); + DetourTransactionCommit(); } } #endif - if (!g_hook_active) - { - hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); - } - - hook_create((HOOKLIST*)&g_hook_hooklist, !g_hook_active); - g_hook_active = TRUE; + + hook_create((HOOKLIST*)&g_hooks, initial_hook); } } +void hook_early_init() +{ + /* + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID*)&real_CoCreateInstance, (PVOID)fake_CoCreateInstance); + DetourTransactionCommit(); + */ + + hook_patch_iat(GetModuleHandle(NULL), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); + hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA); + hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW); + hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); + hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create); + hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "GetClientRect", (PROC)fake_GetClientRect); //anno 1602 + hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); + hook_patch_iat(GetModuleHandle(NULL), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); +} + void hook_exit() { if (g_hook_active) { g_hook_active = FALSE; - hook_revert((HOOKLIST*)&g_hook_hooklist); - -#if defined(_DEBUG) -#if defined(_MSC_VER) DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); - DetourDetach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); + DetourDetach((PVOID*)&real_CreateFontIndirectA, (PVOID)fake_CreateFontIndirectA); DetourTransactionCommit(); -#endif - real_SetUnhandledExceptionFilter(g_dbg_exception_filter); + + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach((PVOID*)&real_CreateFontA, (PVOID)fake_CreateFontA); + DetourTransactionCommit(); + +#ifdef _MSC_VER + if (g_hook_dinput) + { + if (real_DirectInputCreateA) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach((PVOID*)&real_DirectInputCreateA, (PVOID)fake_DirectInputCreateA); + DetourTransactionCommit(); + } + + if (real_DirectInputCreateW) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach((PVOID*)&real_DirectInputCreateW, (PVOID)fake_DirectInputCreateW); + DetourTransactionCommit(); + } + + if (real_DirectInputCreateEx) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach((PVOID*)&real_DirectInputCreateEx, (PVOID)fake_DirectInputCreateEx); + DetourTransactionCommit(); + } + + if (real_DirectInput8Create) + { + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach((PVOID*)&real_DirectInput8Create, (PVOID)fake_DirectInput8Create); + DetourTransactionCommit(); + } + } #endif - hook_patch_iat(GetModuleHandle("AcGenral"), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); + hook_revert((HOOKLIST*)&g_hooks); } + + hook_patch_iat(GetModuleHandle(NULL), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance); + hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA); + hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW); + hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); + hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput8.dll", "DirectInput8Create", (PROC)fake_DirectInput8Create); + hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "GetClientRect", (PROC)fake_GetClientRect); //anno 1602 + hook_patch_iat(GetModuleHandle("AcGenral"), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); + hook_patch_iat(GetModuleHandle(NULL), TRUE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); } diff --git a/src/indeo.c b/src/indeo.c deleted file mode 100644 index 65fa2ab..0000000 --- a/src/indeo.c +++ /dev/null @@ -1,61 +0,0 @@ -#include - - -void indeo_enable() -{ - HKEY hkey; - LONG status = - RegCreateKeyExA( - HKEY_CURRENT_USER, - "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32", - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_WRITE | KEY_QUERY_VALUE, - NULL, - &hkey, - NULL); - - if (status == ERROR_SUCCESS) - { - LPCTSTR iv31 = "ir32_32.dll"; - RegSetValueExA(hkey, "vidc.iv31", 0, REG_SZ, (const BYTE*)iv31, strlen(iv31) + 1); - - LPCTSTR iv32 = "ir32_32.dll"; - RegSetValueExA(hkey, "vidc.iv32", 0, REG_SZ, (const BYTE*)iv32, strlen(iv32) + 1); - - LPCTSTR iv41 = "ir41_32.ax"; - RegSetValueExA(hkey, "vidc.iv41", 0, REG_SZ, (const BYTE*)iv41, strlen(iv41) + 1); - - LPCTSTR iv50 = "ir50_32.dll"; - RegSetValueExA(hkey, "vidc.iv50", 0, REG_SZ, (const BYTE*)iv50, strlen(iv50) + 1); - - RegCloseKey(hkey); - } -} - -void indeo_disable() -{ - HKEY hkey; - LONG status = - RegCreateKeyExA( - HKEY_CURRENT_USER, - "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32", - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_WRITE | KEY_QUERY_VALUE, - NULL, - &hkey, - NULL); - - if (status == ERROR_SUCCESS) - { - RegDeleteValueA(hkey, "vidc.iv31"); - RegDeleteValueA(hkey, "vidc.iv32"); - RegDeleteValueA(hkey, "vidc.iv41"); - RegDeleteValueA(hkey, "vidc.iv50"); - - RegCloseKey(hkey); - } -} diff --git a/src/ini.c b/src/ini.c deleted file mode 100644 index 3304000..0000000 --- a/src/ini.c +++ /dev/null @@ -1,217 +0,0 @@ -#include -#include -#include "debug.h" -#include "config.h" -#include "crc32.h" -#include "ini.h" - -// Microsoft: The maximum profile section size is 32,767 characters. -#define BUF_SIZE (8192) - -void ini_create(INIFILE* ini, char* filename) -{ - if (!ini || !filename || !filename[0]) - return; - - ini->sections = calloc(sizeof(ini->sections[0]), 1); - if (ini->sections) - { - strncpy(ini->filename, filename, sizeof(ini->filename) - 1); - ini->filename[sizeof(ini->filename) - 1] = 0; - - char* names = calloc(BUF_SIZE, 1); - if (names) - { - if (GetPrivateProfileSectionNamesA(names, BUF_SIZE, filename) > 0) - { - char* name = names; - - for (int i = 0; *name; i++) - { - ini->sections = realloc(ini->sections, sizeof(ini->sections[0]) * (i + 2)); - - if (!ini->sections) - return; - - memset(&ini->sections[i + 1], 0, sizeof(ini->sections[0])); - - char* buf = malloc(BUF_SIZE); - if (buf) - { - DWORD size = GetPrivateProfileSectionA(name, buf, BUF_SIZE, filename); - if (size > 0) - { - ini->sections[i].data = malloc(size + 2); - if (ini->sections[i].data) - { - memcpy(ini->sections[i].data, buf, size + 2); - } - } - - free(buf); - } - - size_t len = strlen(name); - - for (char* p = name; *p; ++p) - *p = tolower(*p); - - ini->sections[i].hash = Crc32_ComputeBuf(0, name, len); - - name += len + 1; - } - } - - free(names); - } - } -} - -BOOL ini_section_exists(INIFILE* ini, LPCSTR section) -{ - if (!ini || !ini->sections || !section || strlen(section) == 0) - { - return FALSE; - } - - char s[MAX_PATH]; - strncpy(s, section, sizeof(s) - 1); - s[sizeof(s) - 1] = 0; - - for (char* p = s; *p; ++p) - *p = tolower(*p); - - unsigned long hash = Crc32_ComputeBuf(0, s, strlen(s)); - - for (int i = 0; ini->sections[i].hash; i++) - { - if (ini->sections[i].hash == hash) - { - return TRUE; - } - } - - return FALSE; -} - -DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR buf, DWORD size) -{ - if (!buf || size == 0) - { - return 0; - } - - if (!ini || !ini->sections || !section || !key) - { - goto end; - } - - size_t key_len = strlen(key); - - if (key_len == 0 || strlen(section) == 0) - { - goto end; - } - - char s[MAX_PATH]; - strncpy(s, section, sizeof(s) - 1); - s[sizeof(s) - 1] = 0; - - for (char* p = s; *p; ++p) - *p = tolower(*p); - - unsigned long hash = Crc32_ComputeBuf(0, s, strlen(s)); - - for (int i = 0; ini->sections[i].hash; i++) - { - if (ini->sections[i].hash == hash) - { - if (!ini->sections[i].data) - break; - - for (char* p = ini->sections[i].data; *p; p += strlen(p) + 1) - { - if (_strnicmp(key, p, key_len) == 0 && p[key_len] == '=') - { - strncpy(buf, &p[key_len + 1], size - 1); - buf[size - 1] = 0; - return strlen(buf); - } - } - - break; - } - } - -end: - if (def) - { - strncpy(buf, def, size - 1); - buf[size - 1] = 0; - return strlen(buf); - } - - buf[0] = 0; - - return 0; -} - -BOOL ini_get_bool(INIFILE* ini, LPCSTR section, LPCSTR key, BOOL def) -{ - char value[8]; - ini_get_string(ini, section, key, def ? "Yes" : "No", value, sizeof(value)); - - return (_stricmp(value, "yes") == 0 || _stricmp(value, "true") == 0 || _stricmp(value, "1") == 0); -} - -int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def) -{ - char def_str[32]; - _snprintf(def_str, sizeof(def_str) - 1, "%d", def); - - char value[32]; - ini_get_string(ini, section, key, def_str, value, sizeof(value)); - - if (strstr(value, "0x")) - { - return strtol(value, NULL, 0); - } - else - { - return atoi(value); - } -} - -float ini_get_float(INIFILE* ini, LPCSTR section, LPCSTR key, float def) -{ - char def_str[32]; - _snprintf(def_str, sizeof(def_str) - 1, "%f", def); - - char value[32]; - ini_get_string(ini, section, key, def_str, value, sizeof(value)); - - return (float)atof(value); -} - -void ini_free(INIFILE* ini) -{ - if (!ini) - return; - - ini->filename[0] = 0; - - if (ini->sections) - { - for (int i = 0; ini->sections[i].hash; i++) - { - if (ini->sections[i].data) - { - free(ini->sections[i].data); - ini->sections[i].data = NULL; - } - } - - free(ini->sections); - ini->sections = NULL; - } -} diff --git a/src/keyboard.c b/src/keyboard.c deleted file mode 100644 index f54ba63..0000000 --- a/src/keyboard.c +++ /dev/null @@ -1,132 +0,0 @@ -#include -#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); -} diff --git a/src/mouse.c b/src/mouse.c index 46aca13..9b43aa7 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -3,22 +3,19 @@ #include "winapi_hooks.h" #include "dd.h" #include "hook.h" -#include "utils.h" -#include "config.h" -BOOL g_mouse_locked; HHOOK g_mouse_hook; HOOKPROC g_mouse_proc; void mouse_lock() { - if (g_config.devmode || g_ddraw.bnet_active || !g_ddraw.hwnd) + if (g_ddraw->devmode || g_ddraw->bnet_active) return; - if (g_hook_active && !g_mouse_locked && !util_is_minimized(g_ddraw.hwnd)) + if (g_hook_active && !g_ddraw->locked && !IsIconic(g_ddraw->hwnd)) { - int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw.show_cursor_count, 0); + int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0); int cur_count = real_ShowCursor(TRUE) - 1; real_ShowCursor(FALSE); @@ -31,53 +28,50 @@ void mouse_lock() while (real_ShowCursor(TRUE) < game_count); } - real_SetCursor((HCURSOR)InterlockedExchangeAdd((LONG*)&g_ddraw.old_cursor, 0)); + real_SetCursor((HCURSOR)InterlockedExchangeAdd((LONG*)&g_ddraw->old_cursor, 0)); RECT rc = { 0 }; - real_GetClientRect(g_ddraw.hwnd, &rc); - real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); - OffsetRect(&rc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y); + real_GetClientRect(g_ddraw->hwnd, &rc); + real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); + OffsetRect(&rc, g_ddraw->render.viewport.x, g_ddraw->render.viewport.y); - int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0); + int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0); real_SetCursorPos( - g_config.adjmouse ? (int)(rc.left + (cur_x * g_ddraw.mouse.scale_x)) : rc.left + cur_x, - g_config.adjmouse ? (int)(rc.top + (cur_y * g_ddraw.mouse.scale_y)) : rc.top + cur_y); + g_ddraw->adjmouse ? (int)(rc.left + (cur_x * g_ddraw->render.scale_w)) : rc.left + cur_x, + g_ddraw->adjmouse ? (int)(rc.top + (cur_y * g_ddraw->render.scale_h)) : rc.top + cur_y); - CopyRect(&rc, &g_ddraw.mouse.rc); - real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); + CopyRect(&rc, &g_ddraw->mouse.rc); + real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); real_ClipCursor(&rc); - g_mouse_locked = TRUE; + g_ddraw->locked = TRUE; } } void mouse_unlock() { - if (g_config.devmode || !g_hook_active || !g_ddraw.hwnd) + if (g_ddraw->devmode || !g_hook_active) return; - if (g_mouse_locked) + if (g_ddraw->locked) { - g_mouse_locked = FALSE; + g_ddraw->locked = FALSE; real_ClipCursor(NULL); - ReleaseCapture(); RECT rc = { 0 }; - real_GetClientRect(g_ddraw.hwnd, &rc); - real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); - OffsetRect(&rc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y); + real_GetClientRect(g_ddraw->hwnd, &rc); + real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); + OffsetRect(&rc, g_ddraw->render.viewport.x, g_ddraw->render.viewport.y); - int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0); + int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0); real_SetCursorPos( - (int)(rc.left + (cur_x * g_ddraw.mouse.scale_x)), - (int)(rc.top + (cur_y * g_ddraw.mouse.scale_y))); - - real_SetCursor(LoadCursor(NULL, IDC_ARROW)); + (int)(rc.left + (cur_x * g_ddraw->render.scale_w)), + (int)(rc.top + (cur_y * g_ddraw->render.scale_h))); while (real_ShowCursor(TRUE) < 0); } @@ -85,10 +79,10 @@ void mouse_unlock() LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam) { - if (!g_ddraw.ref) + if (!g_ddraw) return g_mouse_proc(Code, wParam, lParam); - if (Code < 0 || (!g_config.devmode && !g_mouse_locked)) + if (Code < 0 || (!g_ddraw->devmode && !g_ddraw->locked)) return CallNextHookEx(g_mouse_hook, Code, wParam, lParam); fake_GetCursorPos(&((MOUSEHOOKSTRUCT*)lParam)->pt); diff --git a/src/opengl_utils.c b/src/opengl_utils.c index e315b15..0f8dc63 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -2,10 +2,6 @@ #include #include "opengl_utils.h" #include "dd.h" -#include "debug.h" -#include "hook.h" -#include "config.h" -#include "versionhelpers.h" PFNWGLCREATECONTEXTPROC xwglCreateContext; PFNWGLDELETECONTEXTPROC xwglDeleteContext; @@ -88,46 +84,43 @@ PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT; PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB; PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB; PFNGLTEXBUFFERPROC glTexBuffer; -PFNGLGETINTEGERVPROC glGetIntegerv; -PFNGLGETSTRINGIPROC glGetStringi; HMODULE g_oglu_hmodule; BOOL g_oglu_got_version2; BOOL g_oglu_got_version3; char g_oglu_version[128]; -char g_oglu_version_long[128]; BOOL oglu_load_dll() { if (!g_oglu_hmodule) - g_oglu_hmodule = real_LoadLibraryA("opengl32.dll"); + g_oglu_hmodule = LoadLibrary("opengl32.dll"); if (g_oglu_hmodule) { - xwglCreateContext = (PFNWGLCREATECONTEXTPROC)real_GetProcAddress(g_oglu_hmodule, "wglCreateContext"); - xwglDeleteContext = (PFNWGLDELETECONTEXTPROC)real_GetProcAddress(g_oglu_hmodule, "wglDeleteContext"); - xwglGetProcAddress = (PFNWGLGETPROCADDRESSPROC)real_GetProcAddress(g_oglu_hmodule, "wglGetProcAddress"); - xwglMakeCurrent = (PFNWGLMAKECURRENTPROC)real_GetProcAddress(g_oglu_hmodule, "wglMakeCurrent"); + xwglCreateContext = (PFNWGLCREATECONTEXTPROC)GetProcAddress(g_oglu_hmodule, "wglCreateContext"); + xwglDeleteContext = (PFNWGLDELETECONTEXTPROC)GetProcAddress(g_oglu_hmodule, "wglDeleteContext"); + xwglGetProcAddress = (PFNWGLGETPROCADDRESSPROC)GetProcAddress(g_oglu_hmodule, "wglGetProcAddress"); + xwglMakeCurrent = (PFNWGLMAKECURRENTPROC)GetProcAddress(g_oglu_hmodule, "wglMakeCurrent"); - glViewport = (PFNGLVIEWPORTPROC)real_GetProcAddress(g_oglu_hmodule, "glViewport"); - glBindTexture = (PFNGLBINDTEXTUREPROC)real_GetProcAddress(g_oglu_hmodule, "glBindTexture"); - glGenTextures = (PFNGLGENTEXTURESPROC)real_GetProcAddress(g_oglu_hmodule, "glGenTextures"); - glTexParameteri = (PFNGLTEXPARAMETERIPROC)real_GetProcAddress(g_oglu_hmodule, "glTexParameteri"); - glDeleteTextures = (PFNGLDELETETEXTURESPROC)real_GetProcAddress(g_oglu_hmodule, "glDeleteTextures"); - glTexImage2D = (PFNGLTEXIMAGE2DPROC)real_GetProcAddress(g_oglu_hmodule, "glTexImage2D"); - glDrawElements = (PFNGLDRAWELEMENTSPROC)real_GetProcAddress(g_oglu_hmodule, "glDrawElements"); - glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)real_GetProcAddress(g_oglu_hmodule, "glTexSubImage2D"); - glGetError = (PFNGLGETERRORPROC)real_GetProcAddress(g_oglu_hmodule, "glGetError"); - glGetString = (PFNGLGETSTRINGPROC)real_GetProcAddress(g_oglu_hmodule, "glGetString"); - glGetTexImage = (PFNGLGETTEXIMAGEPROC)real_GetProcAddress(g_oglu_hmodule, "glGetTexImage"); - glPixelStorei = (PFNGLPIXELSTOREIPROC)real_GetProcAddress(g_oglu_hmodule, "glPixelStorei"); - glEnable = (PFNGLENABLEPROC)real_GetProcAddress(g_oglu_hmodule, "glEnable"); - glClear = (PFNGLCLEARPROC)real_GetProcAddress(g_oglu_hmodule, "glClear"); + glViewport = (PFNGLVIEWPORTPROC)GetProcAddress(g_oglu_hmodule, "glViewport"); + glBindTexture = (PFNGLBINDTEXTUREPROC)GetProcAddress(g_oglu_hmodule, "glBindTexture"); + glGenTextures = (PFNGLGENTEXTURESPROC)GetProcAddress(g_oglu_hmodule, "glGenTextures"); + glTexParameteri = (PFNGLTEXPARAMETERIPROC)GetProcAddress(g_oglu_hmodule, "glTexParameteri"); + glDeleteTextures = (PFNGLDELETETEXTURESPROC)GetProcAddress(g_oglu_hmodule, "glDeleteTextures"); + glTexImage2D = (PFNGLTEXIMAGE2DPROC)GetProcAddress(g_oglu_hmodule, "glTexImage2D"); + glDrawElements = (PFNGLDRAWELEMENTSPROC)GetProcAddress(g_oglu_hmodule, "glDrawElements"); + glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)GetProcAddress(g_oglu_hmodule, "glTexSubImage2D"); + glGetError = (PFNGLGETERRORPROC)GetProcAddress(g_oglu_hmodule, "glGetError"); + glGetString = (PFNGLGETSTRINGPROC)GetProcAddress(g_oglu_hmodule, "glGetString"); + glGetTexImage = (PFNGLGETTEXIMAGEPROC)GetProcAddress(g_oglu_hmodule, "glGetTexImage"); + glPixelStorei = (PFNGLPIXELSTOREIPROC)GetProcAddress(g_oglu_hmodule, "glPixelStorei"); + glEnable = (PFNGLENABLEPROC)GetProcAddress(g_oglu_hmodule, "glEnable"); + glClear = (PFNGLCLEARPROC)GetProcAddress(g_oglu_hmodule, "glClear"); - glBegin = (PFNGLBEGINPROC)real_GetProcAddress(g_oglu_hmodule, "glBegin"); - glEnd = (PFNGLENDPROC)real_GetProcAddress(g_oglu_hmodule, "glEnd"); - glTexCoord2f = (PFNGLTEXCOORD2FPROC)real_GetProcAddress(g_oglu_hmodule, "glTexCoord2f"); - glVertex2f = (PFNGLVERTEX2FPROC)real_GetProcAddress(g_oglu_hmodule, "glVertex2f"); + glBegin = (PFNGLBEGINPROC)GetProcAddress(g_oglu_hmodule, "glBegin"); + glEnd = (PFNGLENDPROC)GetProcAddress(g_oglu_hmodule, "glEnd"); + glTexCoord2f = (PFNGLTEXCOORD2FPROC)GetProcAddress(g_oglu_hmodule, "glTexCoord2f"); + glVertex2f = (PFNGLVERTEX2FPROC)GetProcAddress(g_oglu_hmodule, "glVertex2f"); } return xwglCreateContext && xwglDeleteContext && xwglGetProcAddress && xwglMakeCurrent && glViewport && @@ -195,16 +188,13 @@ void oglu_init() wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)xwglGetProcAddress("wglGetExtensionsStringARB"); glTexBuffer = (PFNGLTEXBUFFERPROC)xwglGetProcAddress("glTexBuffer"); - glGetIntegerv = (PFNGLGETINTEGERVPROC)xwglGetProcAddress("glGetIntegerv"); - glGetStringi = (PFNGLGETSTRINGIPROC)xwglGetProcAddress("glGetStringi"); char* glversion = (char*)glGetString(GL_VERSION); if (glversion) { strncpy(g_oglu_version, glversion, sizeof(g_oglu_version) - 1); - strncpy(g_oglu_version_long, glversion, sizeof(g_oglu_version_long) - 1); - g_oglu_version[sizeof(g_oglu_version) - 1] = '\0'; /* strncpy fix */ - strtok(g_oglu_version, " "); + const char deli[2] = " "; + strtok(g_oglu_version, deli); } else { @@ -219,46 +209,20 @@ void oglu_init() glEnableVertexAttribArray && glUniform2fv && glUniformMatrix4fv && glGenVertexArrays && glBindVertexArray && glGetUniformLocation; - if (IsWine() && glversion && glversion[0] == '2') // macOS + if (g_ddraw->wine && glversion && glversion[0] == '2') // macOS { g_oglu_got_version3 = FALSE; wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); } - - if (g_config.opengl_core) - { - wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); - } } BOOL oglu_ext_exists(char* ext, HDC hdc) { - BOOL got_num_extensions = FALSE; + char* glext = (char*)glGetString(GL_EXTENSIONS); - if (glGetIntegerv && glGetStringi) + if (glext) { - GLint n = 0; - glGetIntegerv(GL_NUM_EXTENSIONS, &n); - - if (glGetError() == GL_NO_ERROR) - { - got_num_extensions = TRUE; - - for (GLint i = 0; i < n; i++) - { - char* glext = (char*)glGetStringi(GL_EXTENSIONS, i); - - if (glext && strcmp(glext, ext) == 0) - return TRUE; - } - } - } - - if (!got_num_extensions) - { - char* glext = (char*)glGetString(GL_EXTENSIONS); - - if (glext && strstr(glext, ext)) + if (strstr(glext, ext)) return TRUE; } @@ -276,41 +240,20 @@ BOOL oglu_ext_exists(char* ext, HDC hdc) return FALSE; } -GLuint oglu_build_program(GLchar* vert_source, GLchar* frag_source, BOOL core_profile) +GLuint oglu_build_program(const GLchar* vert_source, const GLchar* frag_source) { if (!glCreateShader || !glShaderSource || !glCompileShader || !glCreateProgram || - !glAttachShader || !glLinkProgram || !glUseProgram || !glDetachShader || - !vert_source || !frag_source) + !glAttachShader || !glLinkProgram || !glUseProgram || !glDetachShader) return 0; - char* version_start = strstr(vert_source, "#version"); - if (version_start && core_profile) - { - if (_strnicmp(version_start, "#version 130", 12) == 0 || - _strnicmp(version_start, "#version 140", 12) == 0) - { - memcpy(version_start, "#version 150", 12); - } - } - - version_start = strstr(frag_source, "#version"); - if (version_start && core_profile) - { - if (_strnicmp(version_start, "#version 130", 12) == 0 || - _strnicmp(version_start, "#version 140", 12) == 0) - { - memcpy(version_start, "#version 150", 12); - } - } - GLuint vert_shader = glCreateShader(GL_VERTEX_SHADER); GLuint frag_shader = glCreateShader(GL_FRAGMENT_SHADER); if (!vert_shader || !frag_shader) return 0; - glShaderSource(vert_shader, 1, (const GLchar**)&vert_source, NULL); - glShaderSource(frag_shader, 1, (const GLchar**)&frag_source, NULL); + glShaderSource(vert_shader, 1, &vert_source, NULL); + glShaderSource(frag_shader, 1, &frag_source, NULL); GLint is_compiled = 0; @@ -320,22 +263,6 @@ GLuint oglu_build_program(GLchar* vert_source, GLchar* frag_source, BOOL core_pr glGetShaderiv(vert_shader, GL_COMPILE_STATUS, &is_compiled); if (is_compiled == GL_FALSE) { -#ifdef _DEBUG - GLint len = 0; - glGetShaderiv(vert_shader, GL_INFO_LOG_LENGTH, &len); - if (len > 0) - { - char* log = calloc(len + 50, 1); - - if (log) - { - glGetShaderInfoLog(vert_shader, len, &len, &log[0]); - TRACE("glGetShaderInfoLog (Vertex):\n%s", log); - free(log); - } - } -#endif - if (glDeleteShader) glDeleteShader(vert_shader); @@ -349,22 +276,6 @@ GLuint oglu_build_program(GLchar* vert_source, GLchar* frag_source, BOOL core_pr glGetShaderiv(frag_shader, GL_COMPILE_STATUS, &is_compiled); if (is_compiled == GL_FALSE) { -#ifdef _DEBUG - GLint len = 0; - glGetShaderiv(frag_shader, GL_INFO_LOG_LENGTH, &len); - if (len > 0) - { - char* log = calloc(len + 50, 1); - - if (log) - { - glGetShaderInfoLog(frag_shader, len, &len, &log[0]); - TRACE("glGetShaderInfoLog (Fragment):\n%s", log); - free(log); - } - } -#endif - if (glDeleteShader) { glDeleteShader(frag_shader); @@ -451,7 +362,7 @@ GLuint oglu_build_program_from_file(const char* file_path, BOOL core_profile) strcat(vert_source, version + strlen(version) + 1); strcat(frag_source, version + strlen(version) + 1); - program = oglu_build_program(vert_source, frag_source, core_profile); + program = oglu_build_program(vert_source, frag_source); } else { @@ -462,7 +373,7 @@ GLuint oglu_build_program_from_file(const char* file_path, BOOL core_profile) strcat(vert_source, source); strcat(frag_source, source); - program = oglu_build_program(vert_source, frag_source, core_profile); + program = oglu_build_program(vert_source, frag_source); } free(vert_source); diff --git a/src/render_d3d9.c b/src/render_d3d9.c index dde4b2c..cd8c9e7 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -8,24 +8,10 @@ #include "render_d3d9.h" #include "utils.h" #include "wndproc.h" -#include "blt.h" #include "debug.h" -#include "d3d9types.h" -#include "hook.h" -#include "config.h" -#ifdef _DEBUG -#define FAILEDX(stmt) d3d9_check_failed(stmt, #stmt) -#define SUCCEEDEDX(stmt) d3d9_check_succeeded(stmt, #stmt) -static BOOL d3d9_check_failed(HRESULT hr, const char* stmt); -static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt); -#else -#define FAILEDX(stmt) FAILED(stmt) -#define SUCCEEDEDX(stmt) SUCCEEDED(stmt) -#endif - -static BOOL d3d9_create_resources(); +static BOOL d3d9_create_resouces(); static BOOL d3d9_set_states(); static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch); @@ -35,29 +21,13 @@ BOOL d3d9_is_available() { LPDIRECT3D9 d3d9 = NULL; - if ((g_d3d9.hmodule = real_LoadLibraryA("d3d9.dll"))) + if ((g_d3d9.hmodule = LoadLibrary("d3d9.dll"))) { - if (g_config.d3d9on12) - { - D3D9ON12_ARGS args; - memset(&args, 0, sizeof(args)); - args.Enable9On12 = TRUE; + IDirect3D9* (WINAPI * d3d_create9)(UINT) = + (IDirect3D9 * (WINAPI*)(UINT))GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); - IDirect3D9* (WINAPI * d3d_create9on12)(INT, D3D9ON12_ARGS*, UINT) = - (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9On12"); - - if (d3d_create9on12 && (d3d9 = d3d_create9on12(D3D_SDK_VERSION, &args, 1))) - IDirect3D9_Release(d3d9); - } - - if (!d3d9) - { - IDirect3D9* (WINAPI * d3d_create9)(UINT) = - (IDirect3D9 * (WINAPI*)(UINT))real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); - - if (d3d_create9 && (d3d9 = d3d_create9(D3D_SDK_VERSION))) - IDirect3D9_Release(d3d9); - } + if (d3d_create9 && (d3d9 = d3d_create9(D3D_SDK_VERSION))) + IDirect3D9_Release(d3d9); } return d3d9 != NULL; @@ -65,107 +35,61 @@ BOOL d3d9_is_available() BOOL d3d9_create() { - if (g_d3d9.hwnd == g_ddraw.hwnd && d3d9_create_resources() && d3d9_reset(g_config.windowed)) - { - return TRUE; - } - - d3d9_release(); + if (!d3d9_release()) + return FALSE; if (!g_d3d9.hmodule) - g_d3d9.hmodule = real_LoadLibraryA("d3d9.dll"); + g_d3d9.hmodule = LoadLibrary("d3d9.dll"); if (g_d3d9.hmodule) { - LPDIRECT3D9 d3d9on12 = NULL; - D3D9ON12_ARGS args; - memset(&args, 0, sizeof(args)); - args.Enable9On12 = TRUE; - - IDirect3D9* (WINAPI * d3d_create9on12)(INT, D3D9ON12_ARGS*, UINT) = NULL; - IDirect3D9* (WINAPI * d3d_create9)(UINT) = (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); - - if (g_config.d3d9on12) + if (g_ddraw->nonexclusive) { - d3d_create9on12 = (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9On12"); + int (WINAPI * d3d9_enable_shim)(BOOL) = + (int (WINAPI*)(BOOL))GetProcAddress(g_d3d9.hmodule, "Direct3D9EnableMaximizedWindowedModeShim"); + + if (d3d9_enable_shim) + d3d9_enable_shim(TRUE); } - if ((d3d_create9on12 && (d3d9on12 = g_d3d9.instance = d3d_create9on12(D3D_SDK_VERSION, &args, 1))) || - (d3d_create9 && (g_d3d9.instance = d3d_create9(D3D_SDK_VERSION)))) + IDirect3D9* (WINAPI * d3d_create9)(UINT) = + (IDirect3D9 * (WINAPI*)(UINT))GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); + + if (d3d_create9 && (g_d3d9.instance = d3d_create9(D3D_SDK_VERSION))) { -#if _DEBUG - D3DADAPTER_IDENTIFIER9 ai = {0}; - D3DCAPS9 caps = { 0 }; - HRESULT adapter_hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, D3DADAPTER_DEFAULT, 0, &ai); - HRESULT devcaps_hr = IDirect3D9_GetDeviceCaps(g_d3d9.instance, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); - - if (SUCCEEDEDX(adapter_hr)) - { - TRACE("+--Direct3D9-------------------------------------\n"); - TRACE("| D3D9On12: %s (%p)\n", d3d9on12 != NULL ? "True" : "False", GetModuleHandleA("d3d9on12.dll")); - TRACE("| VendorId: 0x%x\n", ai.VendorId); - TRACE("| DeviceId: 0x%x\n", ai.DeviceId); - TRACE("| Revision: 0x%x\n", ai.Revision); - TRACE("| SubSysId: 0x%x\n", ai.SubSysId); - TRACE("| Version: %hu.%hu.%hu.%hu\n", - HIWORD(ai.DriverVersion.HighPart), - LOWORD(ai.DriverVersion.HighPart), - HIWORD(ai.DriverVersion.LowPart), - LOWORD(ai.DriverVersion.LowPart)); - - TRACE("| Driver: %s\n", ai.Driver); - TRACE("| Description: %s\n", ai.Description); - - if (SUCCEEDEDX(devcaps_hr)) - { - TRACE("| MaxTextureWidth: %d\n", caps.MaxTextureWidth); - TRACE("| MaxTextureHeight: %d\n", caps.MaxTextureHeight); - - TRACE("| VertexShaderVersion: %d.%d\n", - (caps.VertexShaderVersion >> 8) & 0xFF, - caps.VertexShaderVersion & 0xFF); - - TRACE("| PixelShaderVersion: %d.%d\n", - (caps.PixelShaderVersion >> 8) & 0xFF, - caps.PixelShaderVersion & 0xFF); - } - TRACE("+------------------------------------------------\n"); - } -#endif - g_d3d9.hwnd = g_ddraw.hwnd; + g_d3d9.bits_per_pixel = g_ddraw->render.bpp ? g_ddraw->render.bpp : g_ddraw->mode.dmBitsPerPel; memset(&g_d3d9.params, 0, sizeof(g_d3d9.params)); - g_d3d9.params.Windowed = g_config.windowed || g_config.nonexclusive; + g_d3d9.params.Windowed = g_ddraw->windowed; g_d3d9.params.SwapEffect = D3DSWAPEFFECT_DISCARD; - g_d3d9.params.hDeviceWindow = g_ddraw.hwnd; - g_d3d9.params.PresentationInterval = g_config.vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; - g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw.render.width; - g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw.render.height; - g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate; - g_d3d9.params.BackBufferFormat = g_ddraw.mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; + g_d3d9.params.hDeviceWindow = g_ddraw->hwnd; + g_d3d9.params.PresentationInterval = g_ddraw->vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; + g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; + g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; + g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; g_d3d9.params.BackBufferCount = 1; DWORD behavior_flags[] = { - D3DCREATE_MULTITHREADED | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE | D3DCREATE_FPU_PRESERVE, - D3DCREATE_MULTITHREADED | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE | D3DCREATE_FPU_PRESERVE, - D3DCREATE_MULTITHREADED | D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, - D3DCREATE_MULTITHREADED | D3DCREATE_MIXED_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, - D3DCREATE_MULTITHREADED | D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, + D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, + D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, + D3DCREATE_HARDWARE_VERTEXPROCESSING, + D3DCREATE_MIXED_VERTEXPROCESSING, + D3DCREATE_SOFTWARE_VERTEXPROCESSING, }; for (int i = 0; i < sizeof(behavior_flags) / sizeof(behavior_flags[0]); i++) { - if (SUCCEEDEDX( + if (SUCCEEDED( IDirect3D9_CreateDevice( g_d3d9.instance, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, - g_ddraw.hwnd, - behavior_flags[i], + g_ddraw->hwnd, + D3DCREATE_MULTITHREADED | behavior_flags[i], &g_d3d9.params, &g_d3d9.device))) - return g_d3d9.device && d3d9_create_resources() && d3d9_set_states(); + return g_d3d9.device && d3d9_create_resouces() && d3d9_set_states(); } } } @@ -173,67 +97,32 @@ BOOL d3d9_create() return FALSE; } -#ifdef _DEBUG -static BOOL d3d9_check_failed(HRESULT hr, const char* stmt) -{ - if (FAILED(hr)) - { - TRACE("Direct3D9 error %s [%08x] (%s)\n", dbg_d3d9_hr_to_str(hr), hr, stmt); - return TRUE; - } - - return FALSE; -} - -static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt) -{ - if (!SUCCEEDED(hr)) - { - TRACE("Direct3D9 error %s [%08x] (%s)\n", dbg_d3d9_hr_to_str(hr), hr, stmt); - - return FALSE; - } - - return TRUE; -} -#endif - BOOL d3d9_on_device_lost() { if (g_d3d9.device && IDirect3DDevice9_TestCooperativeLevel(g_d3d9.device) == D3DERR_DEVICENOTRESET) { - return d3d9_reset(g_config.windowed); + return d3d9_reset(); } return FALSE; } -BOOL d3d9_reset(BOOL windowed) +BOOL d3d9_reset() { - g_d3d9.params.Windowed = windowed || g_config.nonexclusive; - g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw.render.width; - g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw.render.height; - g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate; - g_d3d9.params.BackBufferFormat = g_ddraw.mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; + g_d3d9.params.Windowed = g_ddraw->windowed; + g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; + g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; + g_d3d9.params.BackBufferFormat = g_d3d9.bits_per_pixel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; - if (g_d3d9.device && SUCCEEDEDX(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) + if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) { - BOOL result = d3d9_set_states(); - - if (result) - { - InterlockedExchange(&g_ddraw.render.palette_updated, TRUE); - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - } - - return result; + return d3d9_set_states(); } return FALSE; } -BOOL d3d9_release_resources() +BOOL d3d9_release() { if (g_d3d9.pixel_shader) { @@ -241,10 +130,10 @@ BOOL d3d9_release_resources() g_d3d9.pixel_shader = NULL; } - if (g_d3d9.pixel_shader_upscale) + if (g_d3d9.pixel_shader_bilinear) { - IDirect3DPixelShader9_Release(g_d3d9.pixel_shader_upscale); - g_d3d9.pixel_shader_upscale = NULL; + IDirect3DPixelShader9_Release(g_d3d9.pixel_shader_bilinear); + g_d3d9.pixel_shader_bilinear = NULL; } for (int i = 0; i < D3D9_TEXTURE_COUNT; i++) @@ -268,39 +157,27 @@ BOOL d3d9_release_resources() g_d3d9.vertex_buf = NULL; } - return TRUE; -} - -BOOL d3d9_release() -{ - d3d9_release_resources(); - if (g_d3d9.device) { - while (IDirect3DDevice9_Release(g_d3d9.device)); + IDirect3DDevice9_Release(g_d3d9.device); g_d3d9.device = NULL; } if (g_d3d9.instance) { - while (IDirect3D9_Release(g_d3d9.instance)); + IDirect3D9_Release(g_d3d9.instance); g_d3d9.instance = NULL; } return TRUE; } -static BOOL d3d9_create_resources() +static BOOL d3d9_create_resouces() { - if (!g_d3d9.device) - return FALSE; - - d3d9_release_resources(); - BOOL err = FALSE; - int width = g_ddraw.width; - int height = g_ddraw.height; + int width = g_ddraw->width; + int height = g_ddraw->height; g_d3d9.tex_width = width <= 1024 ? 1024 : width <= 2048 ? 2048 : width <= 4096 ? 4096 : width; @@ -313,7 +190,7 @@ static BOOL d3d9_create_resources() g_d3d9.scale_w = (float)width / g_d3d9.tex_width;; g_d3d9.scale_h = (float)height / g_d3d9.tex_height; - err = err || FAILEDX( + err = err || FAILED( IDirect3DDevice9_CreateVertexBuffer( g_d3d9.device, sizeof(CUSTOMVERTEX) * 4, 0, @@ -322,88 +199,27 @@ static BOOL d3d9_create_resources() &g_d3d9.vertex_buf, NULL)); - err = err || !d3d9_update_vertices(InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0), TRUE); + err = err || !d3d9_update_vertices(InterlockedExchangeAdd(&g_ddraw->upscale_hack_active, 0), TRUE); for (int i = 0; i < D3D9_TEXTURE_COUNT; i++) { - if (g_ddraw.bpp == 16 && g_config.rgb555) - { - BOOL error = FAILEDX( - IDirect3DDevice9_CreateTexture( - g_d3d9.device, - g_d3d9.tex_width, - g_d3d9.tex_height, - 1, - 0, - D3DFMT_X1R5G5B5, - D3DPOOL_MANAGED, - &g_d3d9.surface_tex[i], - 0)); - - if (error) - { - err = err || FAILEDX( - IDirect3DDevice9_CreateTexture( - g_d3d9.device, - g_d3d9.tex_width, - g_d3d9.tex_height, - 1, - 0, - D3DFMT_A1R5G5B5, - D3DPOOL_MANAGED, - &g_d3d9.surface_tex[i], - 0)); - } - } - else if (g_ddraw.bpp == 32) - { - BOOL error = FAILEDX( - IDirect3DDevice9_CreateTexture( - g_d3d9.device, - g_d3d9.tex_width, - g_d3d9.tex_height, - 1, - 0, - D3DFMT_X8R8G8B8, - D3DPOOL_MANAGED, - &g_d3d9.surface_tex[i], - 0)); - - if (error) - { - err = err || FAILEDX( - IDirect3DDevice9_CreateTexture( - g_d3d9.device, - g_d3d9.tex_width, - g_d3d9.tex_height, - 1, - 0, - D3DFMT_A8R8G8B8, - D3DPOOL_MANAGED, - &g_d3d9.surface_tex[i], - 0)); - } - } - else - { - err = err || FAILEDX( - IDirect3DDevice9_CreateTexture( - g_d3d9.device, - g_d3d9.tex_width, - g_d3d9.tex_height, - 1, - 0, - g_ddraw.bpp == 16 ? D3DFMT_R5G6B5 : D3DFMT_L8, - D3DPOOL_MANAGED, - &g_d3d9.surface_tex[i], - 0)); - } + err = err || FAILED( + IDirect3DDevice9_CreateTexture( + g_d3d9.device, + g_d3d9.tex_width, + g_d3d9.tex_height, + 1, + 0, + g_ddraw->bpp == 16 ? D3DFMT_R5G6B5 : g_ddraw->bpp == 32 ? D3DFMT_X8R8G8B8 : D3DFMT_L8, + D3DPOOL_MANAGED, + &g_d3d9.surface_tex[i], + 0)); err = err || !g_d3d9.surface_tex[i]; - if (g_ddraw.bpp == 8) + if (g_ddraw->bpp == 8) { - BOOL error = FAILEDX( + err = err || FAILED( IDirect3DDevice9_CreateTexture( g_d3d9.device, 256, @@ -415,143 +231,85 @@ static BOOL d3d9_create_resources() &g_d3d9.palette_tex[i], 0)); - if (error) - { - err = err || FAILEDX( - IDirect3DDevice9_CreateTexture( - g_d3d9.device, - 256, - 256, - 1, - 0, - D3DFMT_A8R8G8B8, - D3DPOOL_MANAGED, - &g_d3d9.palette_tex[i], - 0)); - } - err = err || !g_d3d9.palette_tex[i]; } } - if (g_ddraw.bpp == 8) + if (g_ddraw->bpp == 8) { - err = err || FAILEDX( + err = err || FAILED( IDirect3DDevice9_CreatePixelShader(g_d3d9.device, (DWORD*)D3D9_PALETTE_SHADER, &g_d3d9.pixel_shader)); IDirect3DDevice9_CreatePixelShader( g_d3d9.device, (DWORD*)D3D9_PALETTE_SHADER_BILINEAR, - &g_d3d9.pixel_shader_upscale); - } - else - { - if (g_config.d3d9_filter == FILTER_LANCZOS) - { - BOOL error = FAILEDX( - IDirect3DDevice9_CreatePixelShader( - g_d3d9.device, - (DWORD*)D3D9_LANCZOS2_SHADER, - &g_d3d9.pixel_shader_upscale)); - - if (error || !g_d3d9.pixel_shader_upscale) - { - g_config.d3d9_filter = FILTER_CUBIC; - } - } - - if (g_config.d3d9_filter == FILTER_CUBIC) - { - IDirect3DDevice9_CreatePixelShader( - g_d3d9.device, - (DWORD*)D3D9_CATMULL_ROM_SHADER, - &g_d3d9.pixel_shader_upscale); - } + &g_d3d9.pixel_shader_bilinear); } - return g_d3d9.vertex_buf && (g_d3d9.pixel_shader || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !err; + return g_d3d9.vertex_buf && (g_d3d9.pixel_shader || g_ddraw->bpp == 16 || g_ddraw->bpp == 32) && !err; } static BOOL d3d9_set_states() { BOOL err = FALSE; - err = err || FAILEDX(IDirect3DDevice9_SetFVF(g_d3d9.device, D3DFVF_XYZRHW | D3DFVF_TEX1)); - err = err || FAILEDX(IDirect3DDevice9_SetStreamSource(g_d3d9.device, 0, g_d3d9.vertex_buf, 0, sizeof(CUSTOMVERTEX))); - err = err || FAILEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[0])); + err = err || FAILED(IDirect3DDevice9_SetFVF(g_d3d9.device, D3DFVF_XYZRHW | D3DFVF_TEX1)); + err = err || FAILED(IDirect3DDevice9_SetStreamSource(g_d3d9.device, 0, g_d3d9.vertex_buf, 0, sizeof(CUSTOMVERTEX))); + err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[0])); - if (g_ddraw.bpp == 8) + if (g_ddraw->bpp == 8) { - err = err || FAILEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0])); + err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0])); BOOL bilinear = - g_config.d3d9_filter && - g_d3d9.pixel_shader_upscale && - (g_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height || g_config.vhack); + g_ddraw->d3d9linear && + g_d3d9.pixel_shader_bilinear && + (g_ddraw->render.viewport.width != g_ddraw->width || g_ddraw->render.viewport.height != g_ddraw->height); - err = err || FAILEDX( + err = err || FAILED( IDirect3DDevice9_SetPixelShader( g_d3d9.device, - bilinear ? g_d3d9.pixel_shader_upscale : g_d3d9.pixel_shader)); + bilinear ? g_d3d9.pixel_shader_bilinear : g_d3d9.pixel_shader)); if (bilinear) { float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; - err = err || FAILEDX(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); + err = err || FAILED(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); } } else { - if (g_config.d3d9_filter) + if (g_ddraw->d3d9linear) { - if (g_config.d3d9_filter == FILTER_LANCZOS && - g_d3d9.pixel_shader_upscale && - (g_ddraw.render.viewport.width != g_ddraw.width || - g_ddraw.render.viewport.height != g_ddraw.height) && - SUCCEEDEDX(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) - { - float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; - err = err || FAILEDX(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); - } - else if ( - SUCCEEDEDX(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) && - SUCCEEDEDX(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) && - g_config.d3d9_filter == FILTER_CUBIC && - g_d3d9.pixel_shader_upscale && - (g_ddraw.render.viewport.width != g_ddraw.width || - g_ddraw.render.viewport.height != g_ddraw.height) && - SUCCEEDEDX(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) - { - float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; - err = err || FAILEDX(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); - } + IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); + IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); } } /* D3DVIEWPORT9 view_data = { - g_ddraw.render.viewport.x, - g_ddraw.render.viewport.y, - g_ddraw.render.viewport.width, - g_ddraw.render.viewport.height, + g_ddraw->render.viewport.x, + g_ddraw->render.viewport.y, + g_ddraw->render.viewport.width, + g_ddraw->render.viewport.height, 0.0f, 1.0f }; - err = err || FAILEDX(IDirect3DDevice9_SetViewport(g_d3d9.device, &view_data)); + err = err || FAILED(IDirect3DDevice9_SetViewport(g_d3d9.device, &view_data)); */ return !err; } static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch) { - float vp_x = stretch ? (float)g_ddraw.render.viewport.x : 0.0f; - float vp_y = stretch ? (float)g_ddraw.render.viewport.y : 0.0f; + float vp_x = stretch ? (float)g_ddraw->render.viewport.x : 0.0f; + float vp_y = stretch ? (float)g_ddraw->render.viewport.y : 0.0f; - float vp_w = stretch ? (float)(g_ddraw.render.viewport.width + g_ddraw.render.viewport.x) : (float)g_ddraw.width; - float vp_h = stretch ? (float)(g_ddraw.render.viewport.height + g_ddraw.render.viewport.y) : (float)g_ddraw.height; + float vp_w = stretch ? (float)(g_ddraw->render.viewport.width + g_ddraw->render.viewport.x) : (float)g_ddraw->width; + float vp_h = stretch ? (float)(g_ddraw->render.viewport.height + g_ddraw->render.viewport.y) : (float)g_ddraw->height; - float s_h = upscale_hack ? g_d3d9.scale_h * ((float)g_ddraw.upscale_hack_height / g_ddraw.height) : g_d3d9.scale_h; - float s_w = upscale_hack ? g_d3d9.scale_w * ((float)g_ddraw.upscale_hack_width / g_ddraw.width) : g_d3d9.scale_w; + float s_h = upscale_hack ? g_d3d9.scale_h * ((float)g_ddraw->upscale_hack_height / g_ddraw->height) : g_d3d9.scale_h; + float s_w = upscale_hack ? g_d3d9.scale_w * ((float)g_ddraw->upscale_hack_width / g_ddraw->width) : g_d3d9.scale_w; CUSTOMVERTEX vertices[] = { @@ -562,7 +320,7 @@ static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch) }; void* data; - if (g_d3d9.vertex_buf && SUCCEEDEDX(IDirect3DVertexBuffer9_Lock(g_d3d9.vertex_buf, 0, 0, (void**)&data, 0))) + if (g_d3d9.vertex_buf && SUCCEEDED(IDirect3DVertexBuffer9_Lock(g_d3d9.vertex_buf, 0, 0, (void**)&data, 0))) { memcpy(data, vertices, sizeof(vertices)); @@ -575,17 +333,17 @@ static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch) DWORD WINAPI d3d9_render_main(void) { - Sleep(250); + Sleep(500); fpsl_init(); BOOL needs_update = FALSE; + LONG clear_count = 0; - DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; + DWORD timeout = g_ddraw->render.minfps > 0 ? g_ddraw->render.minfps_tick_len : 200; - while (g_ddraw.render.run && - (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) && - g_ddraw.render.run) + while (g_ddraw->render.run && + (g_ddraw->render.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) { #if _DEBUG dbg_draw_frame_info_start(); @@ -593,87 +351,84 @@ DWORD WINAPI d3d9_render_main(void) static int tex_index = 0, pal_index = 0; + if (InterlockedExchange(&g_ddraw->render.clear_screen, FALSE)) + clear_count = 10; + fpsl_frame_start(); - EnterCriticalSection(&g_ddraw.cs); + EnterCriticalSection(&g_ddraw->cs); - if (g_ddraw.primary && - g_ddraw.primary->bpp == g_ddraw.bpp && - g_ddraw.primary->width == g_ddraw.width && - g_ddraw.primary->height == g_ddraw.height && - (g_ddraw.bpp == 16 || g_ddraw.bpp == 32 || g_ddraw.primary->palette)) + if (g_ddraw->primary && + g_ddraw->primary->bpp == g_ddraw->bpp && + (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) { - if (g_config.lock_surfaces) - EnterCriticalSection(&g_ddraw.primary->cs); - - if (g_config.vhack) + if (g_ddraw->vhack) { if (util_detect_low_res_screen()) { - if (!InterlockedExchange(&g_ddraw.upscale_hack_active, TRUE)) + if (!InterlockedExchange(&g_ddraw->upscale_hack_active, TRUE)) d3d9_update_vertices(TRUE, TRUE); } else { - if (InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE)) + if (InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE)) d3d9_update_vertices(FALSE, TRUE); } } D3DLOCKED_RECT lock_rc; - if (InterlockedExchange(&g_ddraw.render.surface_updated, FALSE) || g_config.minfps == -2) + if (InterlockedExchange(&g_ddraw->render.surface_updated, FALSE) || g_ddraw->render.minfps == -2) { if (++tex_index >= D3D9_TEXTURE_COUNT) tex_index = 0; - RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height }; + RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height }; - if (SUCCEEDEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[tex_index])) && - SUCCEEDEDX(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0))) + if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[tex_index])) && + SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0))) { - blt_clean( - lock_rc.pBits, - 0, - 0, - g_ddraw.primary->width, - g_ddraw.primary->height, - lock_rc.Pitch, - g_ddraw.primary->surface, - 0, - 0, - g_ddraw.primary->pitch, - g_ddraw.primary->bpp); + unsigned char* src = (unsigned char*)g_ddraw->primary->surface; + unsigned char* dst = (unsigned char*)lock_rc.pBits; + + int i; + for (i = 0; i < g_ddraw->height; i++) + { + memcpy(dst, src, g_ddraw->primary->l_pitch); + + src += g_ddraw->primary->l_pitch; + dst += lock_rc.Pitch; + } IDirect3DTexture9_UnlockRect(g_d3d9.surface_tex[tex_index], 0); } } - if (g_ddraw.bpp == 8 && - (InterlockedExchange(&g_ddraw.render.palette_updated, FALSE) || g_config.minfps == -2)) + if (g_ddraw->bpp == 8 && + (InterlockedExchange(&g_ddraw->render.palette_updated, FALSE) || g_ddraw->render.minfps == -2)) { if (++pal_index >= D3D9_TEXTURE_COUNT) pal_index = 0; RECT rc = { 0,0,256,1 }; - if (SUCCEEDEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[pal_index])) && - SUCCEEDEDX(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[pal_index], 0, &lock_rc, &rc, 0))) + if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[pal_index])) && + SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[pal_index], 0, &lock_rc, &rc, 0))) { - memcpy(lock_rc.pBits, g_ddraw.primary->palette->data_rgb, 256 * sizeof(int)); + memcpy(lock_rc.pBits, g_ddraw->primary->palette->data_rgb, 256 * sizeof(int)); IDirect3DTexture9_UnlockRect(g_d3d9.palette_tex[pal_index], 0); } } - if (g_config.fixchilds) + if (g_ddraw->fixchilds) { - g_ddraw.child_window_exists = FALSE; - EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary); + g_ddraw->child_window_exists = FALSE; + EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); - if (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height) + if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height) { - if (g_ddraw.child_window_exists) + if (g_ddraw->child_window_exists) { IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); @@ -688,14 +443,35 @@ DWORD WINAPI d3d9_render_main(void) } } - if (g_config.lock_surfaces) - LeaveCriticalSection(&g_ddraw.primary->cs); + if (g_ddraw->bnet_active) + { + IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); + + RECT rc = { 0,0,g_ddraw->width,g_ddraw->height }; + + if (SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0))) + { + unsigned char* src = (unsigned char*)g_ddraw->primary->bnet_surface; + unsigned char* dst = (unsigned char*)lock_rc.pBits; + + for (int i = 0; i < g_ddraw->height; i++) + { + memcpy(dst, src, g_ddraw->primary->l_pitch); + + src += g_ddraw->primary->l_pitch; + dst += lock_rc.Pitch; + } + + IDirect3DTexture9_UnlockRect(g_d3d9.surface_tex[tex_index], 0); + } + } } - LeaveCriticalSection(&g_ddraw.cs); + LeaveCriticalSection(&g_ddraw->cs); - if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0) + if (clear_count > 0) { + clear_count--; IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); } @@ -703,30 +479,11 @@ DWORD WINAPI d3d9_render_main(void) IDirect3DDevice9_DrawPrimitive(g_d3d9.device, D3DPT_TRIANGLESTRIP, 0, 2); IDirect3DDevice9_EndScene(g_d3d9.device); - if (g_ddraw.bnet_active) - { - IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); - } - if (FAILED(IDirect3DDevice9_Present(g_d3d9.device, NULL, NULL, NULL, NULL))) { DWORD_PTR result; - SendMessageTimeout(g_ddraw.hwnd, WM_D3D9DEVICELOST, 0, 0, 0, 1000, &result); - - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - Sleep(50); + SendMessageTimeout(g_ddraw->hwnd, WM_D3D9DEVICELOST, 0, 0, 0, 1000, &result); } - else - { - /* Force redraw for GDI games (ClueFinders) */ - if (!g_ddraw.primary) - { - RedrawWindow(g_ddraw.hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); - } - } - - if (!g_ddraw.render.run) - break; #if _DEBUG dbg_draw_frame_info_end(); @@ -735,8 +492,8 @@ DWORD WINAPI d3d9_render_main(void) fpsl_frame_end(); } - if (g_config.vhack) - InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE); + if (g_ddraw->vhack) + InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE); return 0; } diff --git a/src/render_gdi.c b/src/render_gdi.c index c7292ed..fd78f80 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -6,9 +6,7 @@ #include "opengl_utils.h" #include "utils.h" #include "wndproc.h" -#include "hook.h" #include "debug.h" -#include "config.h" DWORD WINAPI gdi_render_main(void) @@ -16,20 +14,18 @@ DWORD WINAPI gdi_render_main(void) static DWORD warning_end_tick = 0; static char warning_text[512] = { 0 }; - if (g_ddraw.show_driver_warning) + if (g_ddraw->show_driver_warning) { - g_ddraw.show_driver_warning = FALSE; - - TRACE(" Switched to GDI renderer\n"); + g_ddraw->show_driver_warning = FALSE; warning_end_tick = timeGetTime() + (15 * 1000); - if (!g_config.windowed) - PostMessage(g_ddraw.hwnd, WM_AUTORENDERER, 0, 0); + if (!g_ddraw->windowed) + PostMessage(g_ddraw->hwnd, WM_AUTORENDERER, 0, 0); _snprintf( warning_text, - sizeof(warning_text) - 1, + sizeof(warning_text), "-WARNING- Using slow software rendering, please update your graphics card driver (%s)", strlen(g_oglu_version) > 10 ? "" : g_oglu_version); } @@ -38,11 +34,10 @@ DWORD WINAPI gdi_render_main(void) fpsl_init(); - DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; + DWORD timeout = g_ddraw->render.minfps > 0 ? g_ddraw->render.minfps_tick_len : INFINITE; - while (g_ddraw.render.run && - (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) && - g_ddraw.render.run) + while (g_ddraw->render.run && + (g_ddraw->render.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) { #if _DEBUG dbg_draw_frame_info_start(); @@ -50,25 +45,20 @@ DWORD WINAPI gdi_render_main(void) fpsl_frame_start(); - EnterCriticalSection(&g_ddraw.cs); + EnterCriticalSection(&g_ddraw->cs); - if (g_ddraw.primary && - g_ddraw.primary->bpp == g_ddraw.bpp && - g_ddraw.primary->width == g_ddraw.width && - g_ddraw.primary->height == g_ddraw.height && - (g_ddraw.bpp == 16 || g_ddraw.bpp == 32 || g_ddraw.primary->palette)) + if (g_ddraw->primary && + g_ddraw->primary->bpp == g_ddraw->bpp && + (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) { - if (g_config.lock_surfaces) - EnterCriticalSection(&g_ddraw.primary->cs); - if (warning_end_tick) { if (timeGetTime() < warning_end_tick) { HDC primary_dc; - dds_GetDC(g_ddraw.primary, &primary_dc); + dds_GetDC(g_ddraw->primary, &primary_dc); - RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height }; + RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height }; DrawText(primary_dc, warning_text, -1, &rc, DT_NOCLIP | DT_CENTER); } else @@ -77,103 +67,124 @@ DWORD WINAPI gdi_render_main(void) } } - BOOL upscale_hack = g_config.vhack && util_detect_low_res_screen(); + BOOL upscale_hack = g_ddraw->vhack && util_detect_low_res_screen(); - if (g_config.vhack) - InterlockedExchange(&g_ddraw.upscale_hack_active, upscale_hack); + if (g_ddraw->vhack) + InterlockedExchange(&g_ddraw->upscale_hack_active, upscale_hack); - if (g_config.fixchilds) + if (g_ddraw->fixchilds) { - g_ddraw.child_window_exists = FALSE; - EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary); + g_ddraw->child_window_exists = g_ddraw->bnet_active && GetSystemMetrics(SM_CMONITORS) > 1; + EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); } - if (g_ddraw.bpp == 8 && g_ddraw.primary->palette) + if (g_ddraw->primary->palette) { - memcpy(&g_ddraw.primary->bmi->bmiColors[0], g_ddraw.primary->palette->data_rgb, 256 * sizeof(int)); + memcpy(&g_ddraw->primary->bmi->bmiColors[0], g_ddraw->primary->palette->data_rgb, 256 * sizeof(int)); } - if (InterlockedExchange(&g_ddraw.render.clear_screen, FALSE) || g_ddraw.child_window_exists) + if (InterlockedExchange(&g_ddraw->render.clear_screen, FALSE)) { - RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height }; - FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); + RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height }; + FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); } - int lines_copied = 0; - - if (g_ddraw.bnet_active) + if (g_ddraw->gdilinear) { - RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height }; - FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); - lines_copied = 1; + SetStretchBltMode(g_ddraw->render.hdc, HALFTONE); + SetBrushOrgEx(g_ddraw->render.hdc, 0, 0, NULL); + } + + if (g_ddraw->bnet_active) + { + if (GetSystemMetrics(SM_CMONITORS) == 1) + { + StretchDIBits( + g_ddraw->render.hdc, + g_ddraw->render.viewport.x, + g_ddraw->render.viewport.y, + g_ddraw->render.viewport.width, + g_ddraw->render.viewport.height, + 0, + 0, + g_ddraw->width, + g_ddraw->height, + g_ddraw->primary->bnet_surface, + g_ddraw->primary->bmi, + DIB_RGB_COLORS, + SRCCOPY); + } + else + { + SetDIBitsToDevice( + g_ddraw->render.hdc, + 0, + 0, + g_ddraw->width, + g_ddraw->height, + 0, + 0, + 0, + g_ddraw->height, + g_ddraw->primary->bnet_surface, + g_ddraw->primary->bmi, + DIB_RGB_COLORS); + } } else if (upscale_hack) { - lines_copied = real_StretchDIBits( - g_ddraw.render.hdc, - g_ddraw.render.viewport.x, - g_ddraw.render.viewport.y, - g_ddraw.render.viewport.width, - g_ddraw.render.viewport.height, + StretchDIBits( + g_ddraw->render.hdc, + g_ddraw->render.viewport.x, + g_ddraw->render.viewport.y, + g_ddraw->render.viewport.width, + g_ddraw->render.viewport.height, 0, - g_ddraw.height - g_ddraw.upscale_hack_height, - g_ddraw.upscale_hack_width, - g_ddraw.upscale_hack_height, - g_ddraw.primary->surface, - g_ddraw.primary->bmi, + g_ddraw->height - g_ddraw->upscale_hack_height, + g_ddraw->upscale_hack_width, + g_ddraw->upscale_hack_height, + g_ddraw->primary->surface, + g_ddraw->primary->bmi, DIB_RGB_COLORS, SRCCOPY); } - else if (!g_ddraw.child_window_exists && - (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height)) + else if (!g_ddraw->child_window_exists && + (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height)) { - lines_copied = real_StretchDIBits( - g_ddraw.render.hdc, - g_ddraw.render.viewport.x, - g_ddraw.render.viewport.y, - g_ddraw.render.viewport.width, - g_ddraw.render.viewport.height, + StretchDIBits( + g_ddraw->render.hdc, + g_ddraw->render.viewport.x, + g_ddraw->render.viewport.y, + g_ddraw->render.viewport.width, + g_ddraw->render.viewport.height, 0, 0, - g_ddraw.width, - g_ddraw.height, - g_ddraw.primary->surface, - g_ddraw.primary->bmi, + g_ddraw->width, + g_ddraw->height, + g_ddraw->primary->surface, + g_ddraw->primary->bmi, DIB_RGB_COLORS, SRCCOPY); } - - if (lines_copied == 0 || lines_copied == GDI_ERROR) + else { - real_SetDIBitsToDevice( - g_ddraw.render.hdc, + SetDIBitsToDevice( + g_ddraw->render.hdc, 0, 0, - g_ddraw.width, - g_ddraw.height, + g_ddraw->width, + g_ddraw->height, 0, 0, 0, - g_ddraw.height, - g_ddraw.primary->surface, - g_ddraw.primary->bmi, + g_ddraw->height, + g_ddraw->primary->surface, + g_ddraw->primary->bmi, DIB_RGB_COLORS); } - - if (g_config.lock_surfaces) - LeaveCriticalSection(&g_ddraw.primary->cs); } - LeaveCriticalSection(&g_ddraw.cs); - - /* Force redraw for GDI games (ClueFinders) */ - if (!g_ddraw.primary) - { - RedrawWindow(g_ddraw.hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); - } - - if (!g_ddraw.render.run) - break; + LeaveCriticalSection(&g_ddraw->cs); #if _DEBUG dbg_draw_frame_info_end(); diff --git a/src/render_ogl.c b/src/render_ogl.c index aae1d34..80f34b7 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -13,169 +13,59 @@ static HGLRC ogl_create_core_context(HDC hdc); +static HGLRC ogl_create_context(HDC hdc); static void ogl_build_programs(); static void ogl_create_textures(int width, int height); static void ogl_init_main_program(); -static void ogl_init_shader1_program(); -static void ogl_init_shader2_program(); +static void ogl_init_scale_program(); static void ogl_render(); -static BOOL ogl_release_resources(); +static void ogl_delete_context(HGLRC context); static BOOL ogl_texture_upload_test(); static BOOL ogl_shader_test(); -static void ogl_check_error(const char* stmt); static OGLRENDERER g_ogl; -BOOL ogl_create() -{ - if (g_ogl.hwnd == g_ddraw.hwnd && g_ogl.hdc == g_ddraw.render.hdc && g_ogl.context) - { - return TRUE; - } - - ogl_release(); - - g_ogl.context = xwglCreateContext(g_ddraw.render.hdc); - if (g_ogl.context) - { - g_ogl.hwnd = g_ddraw.hwnd; - g_ogl.hdc = g_ddraw.render.hdc; - - GLenum err = GL_NO_ERROR; - BOOL made_current = FALSE; - - for (int i = 0; i < 5; i++) - { - if ((made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context))) - break; - - Sleep(50); - } - - if (made_current && (err = glGetError()) == GL_NO_ERROR) - { - GL_CHECK(oglu_init()); - - TRACE("+--OpenGL-----------------------------------------\n"); - TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION)); - TRACE("| GL_VENDOR: %s\n", glGetString(GL_VENDOR)); - TRACE("| GL_RENDERER: %s\n", glGetString(GL_RENDERER)); - TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); - 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)); - } - else - { - TRACE("OpenGL error %08x, GetLastError %lu (xwglMakeCurrent())\n", err, GetLastError()); - ogl_check_error("xwglMakeCurrent()"); - } - - for (int i = 0; i < 5; i++) - { - if (xwglMakeCurrent(NULL, NULL)) - break; - - Sleep(50); - } - - return TRUE; - } - - g_ogl.hwnd = NULL; - g_ogl.hdc = NULL; - - return FALSE; -} - DWORD WINAPI ogl_render_main(void) { - Sleep(250); + Sleep(500); g_ogl.got_error = g_ogl.use_opengl = FALSE; - GLenum err = GL_NO_ERROR; - BOOL made_current = FALSE; - for (int i = 0; i < 5; i++) + g_ogl.context = ogl_create_context(g_ddraw->render.hdc); + if (g_ogl.context) { - if ((made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context))) - break; + oglu_init(); - Sleep(50); - } + g_ogl.context = ogl_create_core_context(g_ddraw->render.hdc); - if (made_current && (err = glGetError()) == GL_NO_ERROR) - { - GL_CHECK(oglu_init()); - - g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR; - - BOOL got_swap_ctrl; - GL_CHECK(got_swap_ctrl = oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc)); - - if (got_swap_ctrl && wglSwapIntervalEXT) - wglSwapIntervalEXT(g_config.vsync ? 1 : 0); + if (oglu_ext_exists("WGL_EXT_swap_control", g_ddraw->render.hdc) && wglSwapIntervalEXT) + wglSwapIntervalEXT(g_ddraw->vsync ? 1 : 0); fpsl_init(); - GL_CHECK(ogl_build_programs()); - GL_CHECK(ogl_create_textures(g_ddraw.width, g_ddraw.height)); - GL_CHECK(ogl_init_main_program()); - GL_CHECK(ogl_init_shader1_program()); - GL_CHECK(ogl_init_shader2_program()); + ogl_build_programs(); + ogl_create_textures(g_ddraw->width, g_ddraw->height); + ogl_init_main_program(); + ogl_init_scale_program(); - 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.got_error = g_ogl.got_error || !ogl_texture_upload_test(); + g_ogl.got_error = g_ogl.got_error || !ogl_shader_test(); + g_ogl.got_error = g_ogl.got_error || 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; + ogl_render(); - GL_CHECK(ogl_render()); - - GL_CHECK(ogl_release_resources()); - - while (glGetError() != GL_NO_ERROR); - } - else - { - TRACE("OpenGL error %08x, GetLastError %lu (xwglMakeCurrent())\n", err, GetLastError()); - ogl_check_error("xwglMakeCurrent()"); + ogl_delete_context(g_ogl.context); } - for (int i = 0; i < 5; i++) - { - if (xwglMakeCurrent(NULL, NULL)) - break; - - Sleep(50); - } - if (!g_ogl.use_opengl) { - g_ddraw.show_driver_warning = TRUE; - g_ddraw.renderer = gdi_render_main; + g_ddraw->show_driver_warning = TRUE; + g_ddraw->renderer = gdi_render_main; gdi_render_main(); } return 0; } - -static void ogl_check_error(const char* stmt) -{ -#ifdef _DEBUG - GLenum err; - while ((err = glGetError()) != GL_NO_ERROR) - { - g_ogl.got_error = TRUE; - TRACE("OpenGL error %08x (%s)\n", err, stmt); - } -#endif -} - static HGLRC ogl_create_core_context(HDC hdc) { if (!wglCreateContextAttribsARB) @@ -195,14 +85,6 @@ static HGLRC ogl_create_core_context(HDC hdc) { xwglDeleteContext(g_ogl.context); oglu_init(); - - TRACE("+--OpenGL Core-----------------------------------\n"); - TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION)); - TRACE("| GL_VENDOR: %s\n", glGetString(GL_VENDOR)); - TRACE("| GL_RENDERER: %s\n", glGetString(GL_RENDERER)); - TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); - TRACE("+------------------------------------------------\n"); - return context; } else if (context) @@ -213,95 +95,75 @@ static HGLRC ogl_create_core_context(HDC hdc) return g_ogl.context; } +static HGLRC ogl_create_context(HDC hdc) +{ + HGLRC context = xwglCreateContext(hdc); + BOOL made_current = context && xwglMakeCurrent(hdc, context); + + if (!made_current || glGetError() != GL_NO_ERROR) + { + if (made_current) + { + xwglMakeCurrent(NULL, NULL); + xwglDeleteContext(context); + } + + context = 0; + } + + return context; +} + static void ogl_build_programs() { - g_ogl.main_program = g_ogl.shader1_program = g_ogl.shader2_program = 0; - - g_ogl.shader2_upscale = FALSE; - BOOL core_profile = wglCreateContextAttribsARB != NULL; + g_ogl.main_program = g_ogl.scale_program = 0; if (g_oglu_got_version3) { - if (g_ddraw.bpp == 8) + if (g_ddraw->bpp == 8) { - g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PALETTE_FRAG_SHADER, core_profile); - } - else if (g_ddraw.bpp == 16 && g_config.rgb555) - { - g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, RGB555_FRAG_SHADER, core_profile); - } - else if (g_ddraw.bpp == 16 || g_ddraw.bpp == 32) - { - g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PASSTHROUGH_FRAG_SHADER, core_profile); - } + g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PALETTE_FRAG_SHADER); - BOOL bilinear = FALSE; - char shader_path[MAX_PATH] = { 0 }; + if (!g_ogl.main_program) + { + g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_CORE, PALETTE_FRAG_SHADER_CORE); + } + } + else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32) + { + g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PASSTHROUGH_FRAG_SHADER); + + if (!g_ogl.main_program) + { + g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_CORE, PASSTHROUGH_FRAG_SHADER_CORE); + } + } if (g_ogl.main_program) { - strncpy(shader_path, g_config.shader, sizeof(shader_path)); - shader_path[sizeof(shader_path) - 1] = '\0'; /* strncpy fix */ + char shader_path[MAX_PATH] = { 0 }; + + strncpy(shader_path, g_ddraw->shader, sizeof(shader_path) - 1); if (GetFileAttributes(shader_path) == INVALID_FILE_ATTRIBUTES) { - _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.game_path, g_ddraw->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 */ - BOOL is_upscaler = - strstr(g_config.shader, "fsr.glsl") != NULL || - strstr(g_config.shader, "catmull-rom-bilinear.glsl") != NULL || - strstr(g_config.shader, "lanczos2-sharp.glsl") != NULL || - strstr(g_config.shader, "xbr-lv2-noblend.glsl") != NULL || - strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL || - strstr(g_config.shader, "xbrz-freescale.glsl") != NULL; + strstr(g_ddraw->shader, "fsr.glsl") != NULL || + strstr(g_ddraw->shader, "catmull-rom-bilinear.glsl") != NULL || + strstr(g_ddraw->shader, "lanczos2-sharp.glsl") != NULL || + strstr(g_ddraw->shader, "xbr-lv2-noblend.glsl") != NULL || + strstr(g_ddraw->shader, "xbrz-freescale-multipass.glsl") != NULL || + strstr(g_ddraw->shader, "xbrz-freescale.glsl") != NULL; if (!is_upscaler || - 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_ddraw->vhack) { - g_ogl.shader1_program = oglu_build_program_from_file(shader_path, core_profile); - - if (g_ogl.shader1_program && - (strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL || - strstr(g_config.shader, "-pass1scale") != NULL)) - { - g_ogl.shader2_upscale = TRUE; - } - - if (!g_ogl.shader1_program && - (g_ddraw.render.viewport.width != g_ddraw.width || - g_ddraw.render.viewport.height != g_ddraw.height || - g_config.vhack)) - { - g_ogl.shader1_program = - oglu_build_program( - _stricmp(g_config.shader, "xBR-lv2") == 0 ? XBR_LV2_VERT_SHADER : - PASSTHROUGH_VERT_SHADER, - _stricmp(g_config.shader, "Nearest neighbor") == 0 ? PASSTHROUGH_FRAG_SHADER : - _stricmp(g_config.shader, "Bilinear") == 0 ? PASSTHROUGH_FRAG_SHADER : - _stricmp(g_config.shader, "Lanczos") == 0 ? LANCZOS2_FRAG_SHADER : - _stricmp(g_config.shader, "xBR-lv2") == 0 ? XBR_LV2_FRAG_SHADER : - CATMULL_ROM_FRAG_SHADER, - core_profile); - - bilinear = - _stricmp(g_config.shader, "Nearest neighbor") != 0 && - _stricmp(g_config.shader, "Lanczos") != 0 && - _stricmp(g_config.shader, "xBR-lv2") != 0; - } + g_ogl.scale_program = oglu_build_program_from_file(shader_path, wglCreateContextAttribsARB != NULL); } } else @@ -309,44 +171,34 @@ static void ogl_build_programs() g_oglu_got_version3 = FALSE; } - if (g_ogl.shader1_program) - { - if (strlen(shader_path) <= sizeof(shader_path) - 8) - { - strcat(shader_path, ".pass1"); - - g_ogl.shader2_program = oglu_build_program_from_file(shader_path, core_profile); - } - } - - g_ogl.filter_bilinear = strstr(g_config.shader, "bilinear.glsl") != NULL || bilinear; + g_ogl.filter_bilinear = strstr(g_ddraw->shader, "bilinear.glsl") != 0; } if (g_oglu_got_version2 && !g_ogl.main_program) { - if (g_ddraw.bpp == 8) + if (g_ddraw->bpp == 8) { - g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PALETTE_FRAG_SHADER_110, FALSE); + g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PALETTE_FRAG_SHADER_110); } - else if (g_ddraw.bpp == 16 || g_ddraw.bpp == 32) + else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32) { - g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PASSTHROUGH_FRAG_SHADER_110, FALSE); + g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PASSTHROUGH_FRAG_SHADER_110); } } } static void ogl_create_textures(int width, int height) { - GLenum err = GL_NO_ERROR; - - int w = g_ogl.shader2_program ? max(width, g_ddraw.render.viewport.width) : width; - int h = g_ogl.shader2_program ? max(height, g_ddraw.render.viewport.height) : height; - g_ogl.surface_tex_width = - w <= 1024 ? 1024 : w <= 2048 ? 2048 : w <= 4096 ? 4096 : w <= 8192 ? 8192 : w; + width <= 1024 ? 1024 : width <= 2048 ? 2048 : width <= 4096 ? 4096 : width; g_ogl.surface_tex_height = - h <= 512 ? 512 : h <= 1024 ? 1024 : h <= 2048 ? 2048 : h <= 4096 ? 4096 : h <= 8192 ? 8192 : h; + height <= 512 ? 512 : height <= 1024 ? 1024 : height <= 2048 ? 2048 : height <= 4096 ? 4096 : height; + + g_ogl.surface_tex = + HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_ogl.surface_tex_width * g_ogl.surface_tex_height * sizeof(int)); + + g_ogl.adjust_alignment = (width % 4) != 0; g_ogl.scale_w = (float)width / g_ogl.surface_tex_width; g_ogl.scale_h = (float)height / g_ogl.surface_tex_height; @@ -359,17 +211,11 @@ static void ogl_create_textures(int width, int height) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR; - - if (err != GL_NO_ERROR) - { - TRACE("OpenGL error %08x (ogl_create_textures())\n", err); - ogl_check_error("ogl_create_textures()"); - } + g_ogl.got_error = g_ogl.got_error || glGetError() != GL_NO_ERROR; while (glGetError() != GL_NO_ERROR); - if (g_ddraw.bpp == 32) + if (g_ddraw->bpp == 32) { glTexImage2D( GL_TEXTURE_2D, @@ -382,36 +228,7 @@ static void ogl_create_textures(int width, int height) g_ogl.surface_type = GL_UNSIGNED_BYTE, 0); } - else if (g_ddraw.bpp == 16 && g_config.rgb555) - { - if (g_oglu_got_version3) - { - glTexImage2D( - GL_TEXTURE_2D, - 0, - GL_RG8, - g_ogl.surface_tex_width, - g_ogl.surface_tex_height, - 0, - g_ogl.surface_format = GL_RG, - g_ogl.surface_type = GL_UNSIGNED_BYTE, - 0); - } - else - { - glTexImage2D( - GL_TEXTURE_2D, - 0, - GL_RGBA8, - g_ogl.surface_tex_width, - g_ogl.surface_tex_height, - 0, - g_ogl.surface_format = GL_BGRA, - g_ogl.surface_type = GL_UNSIGNED_SHORT_1_5_5_5_REV, - 0); - } - } - else if (g_ddraw.bpp == 16) + else if (g_ddraw->bpp == 16) { glTexImage2D( GL_TEXTURE_2D, @@ -439,7 +256,7 @@ static void ogl_create_textures(int width, int height) 0); } } - else if (g_ddraw.bpp == 8) + else if (g_ddraw->bpp == 8) { glTexImage2D( GL_TEXTURE_2D, @@ -483,7 +300,7 @@ static void ogl_create_textures(int width, int height) } } - if (g_ddraw.bpp == 8) + if (g_ddraw->bpp == 8) { glGenTextures(TEXTURE_COUNT, g_ogl.palette_tex_ids); @@ -506,10 +323,10 @@ static void ogl_init_main_program() glUseProgram(g_ogl.main_program); - glUniform1i(glGetUniformLocation(g_ogl.main_program, "Texture"), 0); + glUniform1i(glGetUniformLocation(g_ogl.main_program, "SurfaceTex"), 0); - if (g_ddraw.bpp == 8) - glUniform1i(glGetUniformLocation(g_ogl.main_program, "PaletteTexture"), 1); + if (g_ddraw->bpp == 8) + glUniform1i(glGetUniformLocation(g_ogl.main_program, "PaletteTex"), 1); if (g_oglu_got_version3) { @@ -518,7 +335,7 @@ static void ogl_init_main_program() glGenBuffers(3, g_ogl.main_vbos); - if (g_ogl.shader1_program) + if (g_ogl.scale_program) { glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[0]); static const GLfloat vertex_coord[] = { @@ -597,83 +414,53 @@ static void ogl_init_main_program() } } -static void ogl_init_shader1_program() +static void ogl_init_scale_program() { - if (!g_ogl.shader1_program) + if (!g_ogl.scale_program) return; - glUseProgram(g_ogl.shader1_program); + glUseProgram(g_ogl.scale_program); - 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"); + GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.scale_program, "VertexCoord"); + g_ogl.scale_tex_coord_attr_loc = glGetAttribLocation(g_ogl.scale_program, "TexCoord"); + g_ogl.frame_count_uni_loc = glGetUniformLocation(g_ogl.scale_program, "FrameCount"); - g_ogl.shader1_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "TexCoord"); + glGenBuffers(3, g_ogl.scale_vbos); - glGenBuffers(3, g_ogl.shader1_vbos); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.scale_vbos[0]); + static const GLfloat vertext_coord[] = { + -1.0f, 1.0f, + 1.0f, 1.0f, + 1.0f,-1.0f, + -1.0f,-1.0f, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(vertext_coord), vertext_coord, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); - if (g_ogl.shader2_program) - { - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[0]); - static const GLfloat vertext_coord[] = { - -1.0f,-1.0f, - -1.0f, 1.0f, - 1.0f, 1.0f, - 1.0f,-1.0f, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(vertext_coord), vertext_coord, GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.scale_vbos[1]); + GLfloat tex_coord[] = { + 0.0f, 0.0f, + g_ogl.scale_w, 0.0f, + g_ogl.scale_w, g_ogl.scale_h, + 0.0f, g_ogl.scale_h, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); - GLfloat tex_coord[] = { - 0.0f, 0.0f, - 0.0f, g_ogl.scale_h, - g_ogl.scale_w, g_ogl.scale_h, - g_ogl.scale_w, 0.0f, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); - } - else - { - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[0]); - static const GLfloat vertext_coord[] = { - -1.0f, 1.0f, - 1.0f, 1.0f, - 1.0f,-1.0f, - -1.0f,-1.0f, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(vertext_coord), vertext_coord, GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); + glGenVertexArrays(1, &g_ogl.scale_vao); + glBindVertexArray(g_ogl.scale_vao); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); - GLfloat tex_coord[] = { - 0.0f, 0.0f, - g_ogl.scale_w, 0.0f, - g_ogl.scale_w, g_ogl.scale_h, - 0.0f, g_ogl.scale_h, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); - } - - glGenVertexArrays(1, &g_ogl.shader1_vao); - glBindVertexArray(g_ogl.shader1_vao); - - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[0]); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.scale_vbos[0]); glVertexAttribPointer(vertex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray(vertex_coord_attr_loc); 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); - glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); - glBindBuffer(GL_ARRAY_BUFFER, 0); - } + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.scale_vbos[1]); + glVertexAttribPointer(g_ogl.scale_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.scale_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.scale_vbos[2]); static const GLushort indices[] = { 0, 1, 2, @@ -683,54 +470,20 @@ static void ogl_init_shader1_program() glBindVertexArray(0); - float input_size[2] = { 0 }, output_size[2] = { 0 }, texture_size[2] = { 0 }; + float input_size[2], output_size[2], texture_size[2]; - input_size[0] = (float)g_ddraw.width; - input_size[1] = (float)g_ddraw.height; + input_size[0] = (float)g_ddraw->width; + input_size[1] = (float)g_ddraw->height; texture_size[0] = (float)g_ogl.surface_tex_width; texture_size[1] = (float)g_ogl.surface_tex_height; - output_size[0] = (float)g_ddraw.render.viewport.width; - output_size[1] = (float)g_ddraw.render.viewport.height; + output_size[0] = (float)g_ddraw->render.viewport.width; + output_size[1] = (float)g_ddraw->render.viewport.height; - GLint loc = glGetUniformLocation(g_ogl.shader1_program, "OutputSize"); - if (loc == -1) - loc = glGetUniformLocation(g_ogl.shader1_program, "rubyOutputSize"); - - if (loc != -1) - glUniform2fv(loc, 1, output_size); - - - loc = glGetUniformLocation(g_ogl.shader1_program, "TextureSize"); - if (loc == -1) - loc = glGetUniformLocation(g_ogl.shader1_program, "rubyTextureSize"); - - if (loc != -1) - glUniform2fv(loc, 1, texture_size); - - - loc = glGetUniformLocation(g_ogl.shader1_program, "InputSize"); - if (loc == -1) - loc = glGetUniformLocation(g_ogl.shader1_program, "rubyInputSize"); - - if (loc != -1) - 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"); - if (loc != -1) - glUniform1i(loc, 1); - - g_ogl.shader1_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "FrameCount"); - if (g_ogl.shader1_frame_count_uni_loc == -1) - g_ogl.shader1_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "rubyFrameCount"); + glUniform2fv(glGetUniformLocation(g_ogl.scale_program, "OutputSize"), 1, output_size); + glUniform2fv(glGetUniformLocation(g_ogl.scale_program, "TextureSize"), 1, texture_size); + glUniform2fv(glGetUniformLocation(g_ogl.scale_program, "InputSize"), 1, input_size); + glUniform1i(glGetUniformLocation(g_ogl.scale_program, "FrameDirection"), 1); + glUniform1i(glGetUniformLocation(g_ogl.scale_program, "Texture"), 0); const float mvp_matrix[16] = { 1,0,0,0, @@ -738,313 +491,148 @@ static void ogl_init_shader1_program() 0,0,1,0, 0,0,0,1, }; + glUniformMatrix4fv(glGetUniformLocation(g_ogl.scale_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(1, &g_ogl.frame_buffer_id); + glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id); - glGenFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); - glGenTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); + glGenTextures(1, &g_ogl.frame_buffer_tex_id); + glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, g_ogl.filter_bilinear ? GL_LINEAR : GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, g_ogl.filter_bilinear ? GL_LINEAR : GL_NEAREST); + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGBA8, + g_ogl.surface_tex_width, + g_ogl.surface_tex_height, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + 0); - int fbo_count = g_ogl.shader2_program ? 2 : 1; + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id, 0); - for (int i = 0; i < fbo_count; i++) + GLenum draw_buffers[1] = { GL_COLOR_ATTACHMENT0 }; + glDrawBuffers(1, draw_buffers); + + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { - glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[i]); + glDeleteTextures(1, &g_ogl.frame_buffer_tex_id); - glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[i]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, g_ogl.filter_bilinear ? GL_LINEAR : GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, g_ogl.filter_bilinear ? GL_LINEAR : GL_NEAREST); - glTexImage2D( - GL_TEXTURE_2D, - 0, - GL_RGBA8, - g_ogl.surface_tex_width, - g_ogl.surface_tex_height, - 0, - GL_RGBA, - GL_UNSIGNED_BYTE, - 0); + if (glDeleteFramebuffers) + glDeleteFramebuffers(1, &g_ogl.frame_buffer_id); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[i], 0); + if (glDeleteProgram) + glDeleteProgram(g_ogl.scale_program); - GLenum draw_buffers[1] = { GL_COLOR_ATTACHMENT0 }; - glDrawBuffers(1, draw_buffers); + g_ogl.scale_program = 0; - if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + if (glDeleteBuffers) + glDeleteBuffers(3, g_ogl.scale_vbos); + + if (glDeleteVertexArrays) + glDeleteVertexArrays(1, &g_ogl.scale_vao); + + if (g_ogl.main_program) { - glDeleteTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); + glBindVertexArray(g_ogl.main_vao); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[0]); + static const GLfloat vertex_coord_pal[] = { + -1.0f, 1.0f, + 1.0f, 1.0f, + 1.0f,-1.0f, + -1.0f,-1.0f, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_coord_pal), vertex_coord_pal, GL_STATIC_DRAW); + glVertexAttribPointer(g_ogl.main_vertex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.main_vertex_coord_attr_loc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); - if (glDeleteFramebuffers) - glDeleteFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); - - glUseProgram(0); - - if (glDeleteProgram) - { - glDeleteProgram(g_ogl.shader1_program); - - if (g_ogl.shader2_program) - glDeleteProgram(g_ogl.shader2_program); - } - - g_ogl.shader1_program = 0; - g_ogl.shader2_program = 0; - - if (glDeleteBuffers) - glDeleteBuffers(3, g_ogl.shader1_vbos); - - if (glDeleteVertexArrays) - glDeleteVertexArrays(1, &g_ogl.shader1_vao); - - if (g_ogl.main_program) - { - glBindVertexArray(g_ogl.main_vao); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[0]); - static const GLfloat vertex_coord_pal[] = { - -1.0f, 1.0f, - 1.0f, 1.0f, - 1.0f,-1.0f, - -1.0f,-1.0f, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_coord_pal), vertex_coord_pal, GL_STATIC_DRAW); - glVertexAttribPointer(g_ogl.main_vertex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.main_vertex_coord_attr_loc); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); - - glBindVertexArray(g_ogl.main_vao); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[1]); - GLfloat tex_coord_pal[] = { - 0.0f, 0.0f, - g_ogl.scale_w, 0.0f, - g_ogl.scale_w, g_ogl.scale_h, - 0.0f, g_ogl.scale_h, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord_pal), tex_coord_pal, GL_STATIC_DRAW); - glVertexAttribPointer(g_ogl.main_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.main_tex_coord_attr_loc); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); - } - - break; - } - else - { - glClear(GL_COLOR_BUFFER_BIT); + glBindVertexArray(g_ogl.main_vao); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[1]); + GLfloat tex_coord_pal[] = { + 0.0f, 0.0f, + g_ogl.scale_w, 0.0f, + g_ogl.scale_w, g_ogl.scale_h, + 0.0f, g_ogl.scale_h, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord_pal), tex_coord_pal, GL_STATIC_DRAW); + glVertexAttribPointer(g_ogl.main_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.main_tex_coord_attr_loc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); } } glBindFramebuffer(GL_FRAMEBUFFER, 0); } -static void ogl_init_shader2_program() -{ - if (!g_ogl.shader1_program || !g_ogl.shader2_program) - return; - - glUseProgram(g_ogl.shader2_program); - - 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"); - - glGenBuffers(3, g_ogl.shader2_vbos); - - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[0]); - GLfloat vertex_coord[] = { - -1.0f, 1.0f, - 1.0f, 1.0f, - 1.0f,-1.0f, - -1.0f,-1.0f, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_coord), vertex_coord, GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - float scale_w = g_ogl.shader2_upscale ? g_ogl.scale_w : (float)g_ddraw.render.viewport.width / g_ogl.surface_tex_width; - float scale_h = g_ogl.shader2_upscale ? g_ogl.scale_h : (float)g_ddraw.render.viewport.height / g_ogl.surface_tex_height; - - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[1]); - GLfloat tex_coord[] = { - 0.0f, 0.0f, - scale_w, 0.0f, - scale_w, scale_h, - 0.0f, scale_h, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - glGenVertexArrays(1, &g_ogl.shader2_vao); - glBindVertexArray(g_ogl.shader2_vao); - - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[0]); - glVertexAttribPointer(vertex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(vertex_coord_attr_loc); - 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); - glEnableVertexAttribArray(g_ogl.shader2_tex_coord_attr_loc); - glBindBuffer(GL_ARRAY_BUFFER, 0); - } - - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ogl.shader2_vbos[2]); - static const GLushort indices[] = - { - 0, 1, 2, - 0, 2, 3, - }; - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); - - glBindVertexArray(0); - - float input_size[2] = { 0 }, output_size[2] = { 0 }, texture_size[2] = { 0 }; - - input_size[0] = g_ogl.shader2_upscale ? (float)g_ddraw.width : (float)g_ddraw.render.viewport.width; - input_size[1] = g_ogl.shader2_upscale ? (float)g_ddraw.height : (float)g_ddraw.render.viewport.height; - texture_size[0] = (float)g_ogl.surface_tex_width; - texture_size[1] = (float)g_ogl.surface_tex_height; - output_size[0] = (float)g_ddraw.render.viewport.width; - output_size[1] = (float)g_ddraw.render.viewport.height; - - GLint loc = glGetUniformLocation(g_ogl.shader2_program, "OutputSize"); - if (loc == -1) - loc = glGetUniformLocation(g_ogl.shader2_program, "rubyOutputSize"); - - if (loc != -1) - glUniform2fv(loc, 1, output_size); - - - loc = glGetUniformLocation(g_ogl.shader2_program, "TextureSize"); - if (loc == -1) - loc = glGetUniformLocation(g_ogl.shader2_program, "rubyTextureSize"); - - if (loc != -1) - glUniform2fv(loc, 1, texture_size); - - - loc = glGetUniformLocation(g_ogl.shader2_program, "InputSize"); - if (loc == -1) - loc = glGetUniformLocation(g_ogl.shader2_program, "rubyInputSize"); - - if (loc != -1) - glUniform2fv(loc, 1, input_size); - - - loc = glGetUniformLocation(g_ogl.shader2_program, "Texture"); - if (loc == -1) - loc = glGetUniformLocation(g_ogl.shader2_program, "rubyTexture"); - - if (loc != -1) - glUniform1i(loc, 0); - - - loc = glGetUniformLocation(g_ogl.shader2_program, "PassPrev2Texture"); - if (loc != -1) - glUniform1i(loc, 1); - - loc = glGetUniformLocation(g_ogl.shader2_program, "PassPrev2TextureSize"); - if (loc != -1) - 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] = { - 1,0,0,0, - 0,1,0,0, - 0,0,1,0, - 0,0,0,1, - }; - - loc = glGetUniformLocation(g_ogl.shader2_program, "MVPMatrix"); - if (loc != -1) - glUniformMatrix4fv(loc, 1, GL_FALSE, mvp_matrix); -} - static void ogl_render() { BOOL needs_update = FALSE; + LONG clear_count = 0; glViewport( - g_ddraw.render.viewport.x, - g_ddraw.render.viewport.y + g_ddraw.render.opengl_y_align, - g_ddraw.render.viewport.width, - g_ddraw.render.viewport.height); + g_ddraw->render.viewport.x, g_ddraw->render.viewport.y, + g_ddraw->render.viewport.width, g_ddraw->render.viewport.height); if (g_ogl.main_program) { glUseProgram(g_ogl.main_program); } - else if (g_ddraw.bpp == 16 || g_ddraw.bpp == 32) + else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32) { 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_ddraw->render.minfps > 0 ? g_ddraw->render.minfps_tick_len : INFINITE; - while (g_ogl.use_opengl && g_ddraw.render.run && - (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) && - g_ddraw.render.run) + while (g_ogl.use_opengl && g_ddraw->render.run && + (g_ddraw->render.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) { #if _DEBUG dbg_draw_frame_info_start(); #endif - g_ogl.scale_w = (float)g_ddraw.width / g_ogl.surface_tex_width; - g_ogl.scale_h = (float)g_ddraw.height / g_ogl.surface_tex_height; + g_ogl.scale_w = (float)g_ddraw->width / g_ogl.surface_tex_width; + g_ogl.scale_h = (float)g_ddraw->height / g_ogl.surface_tex_height; static int tex_index = 0, pal_index = 0; BOOL scale_changed = FALSE; + if (InterlockedExchange(&g_ddraw->render.clear_screen, FALSE)) + clear_count = 10; + fpsl_frame_start(); - EnterCriticalSection(&g_ddraw.cs); + EnterCriticalSection(&g_ddraw->cs); - if (g_ddraw.primary && - g_ddraw.primary->bpp == g_ddraw.bpp && - g_ddraw.primary->width == g_ddraw.width && - g_ddraw.primary->height == g_ddraw.height && - (g_ddraw.bpp == 16 || g_ddraw.bpp == 32 || g_ddraw.primary->palette)) + if (g_ddraw->primary && + g_ddraw->primary->bpp == g_ddraw->bpp && + (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) { - if (g_config.lock_surfaces) - EnterCriticalSection(&g_ddraw.primary->cs); - - if (g_config.vhack) + if (g_ddraw->vhack) { if (util_detect_low_res_screen()) { - g_ogl.scale_w *= (float)g_ddraw.upscale_hack_width / g_ddraw.width; - g_ogl.scale_h *= (float)g_ddraw.upscale_hack_height / g_ddraw.height; + g_ogl.scale_w *= (float)g_ddraw->upscale_hack_width / g_ddraw->width; + g_ogl.scale_h *= (float)g_ddraw->upscale_hack_height / g_ddraw->height; - if (!InterlockedExchange(&g_ddraw.upscale_hack_active, TRUE)) + if (!InterlockedExchange(&g_ddraw->upscale_hack_active, TRUE)) scale_changed = TRUE; } else { - if (InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE)) + if (InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE)) scale_changed = TRUE; } } - if (g_ddraw.bpp == 8 && - (InterlockedExchange(&g_ddraw.render.palette_updated, FALSE) || g_config.minfps == -2)) + if (g_ddraw->bpp == 8 && + (InterlockedExchange(&g_ddraw->render.palette_updated, FALSE) || g_ddraw->render.minfps == -2)) { if (++pal_index >= TEXTURE_COUNT) pal_index = 0; @@ -1060,34 +648,32 @@ static void ogl_render() 1, GL_RGBA, GL_UNSIGNED_BYTE, - g_ddraw.primary->palette->data_bgr); + g_ddraw->primary->palette->data_bgr); } - if (InterlockedExchange(&g_ddraw.render.surface_updated, FALSE) || g_config.minfps == -2) + if (InterlockedExchange(&g_ddraw->render.surface_updated, FALSE) || g_ddraw->render.minfps == -2) { if (++tex_index >= TEXTURE_COUNT) tex_index = 0; glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]); - DWORD row_len = g_ddraw.primary->pitch ? g_ddraw.primary->pitch / g_ddraw.primary->bytes_pp : 0; - - if (row_len != g_ddraw.primary->width) - glPixelStorei(GL_UNPACK_ROW_LENGTH, row_len); + if (g_ogl.adjust_alignment) + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, - g_ddraw.width, - g_ddraw.height, + g_ddraw->width, + g_ddraw->height, g_ogl.surface_format, g_ogl.surface_type, - g_ddraw.primary->surface); + g_ddraw->primary->surface); - if (row_len != g_ddraw.primary->width) - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + if (g_ogl.adjust_alignment) + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); } static int error_check_count = 0; @@ -1099,111 +685,89 @@ static void ogl_render() GLenum err = glGetError(); if (err != GL_NO_ERROR && err != GL_INVALID_FRAMEBUFFER_OPERATION) - { g_ogl.use_opengl = FALSE; - - TRACE("OpenGL error %08x (ogl_render())\n", err); - ogl_check_error("ogl_render()"); - } } - if (g_config.fixchilds) + if (g_ddraw->fixchilds) { - g_ddraw.child_window_exists = FALSE; - EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary); + g_ddraw->child_window_exists = g_ddraw->bnet_active && GetSystemMetrics(SM_CMONITORS) > 1; + EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); - if (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height) + if (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height) { - if (g_ddraw.child_window_exists) + if (g_ddraw->child_window_exists) { glClear(GL_COLOR_BUFFER_BIT); if (!needs_update) { - glViewport(0, g_ddraw.render.height - g_ddraw.height, g_ddraw.width, g_ddraw.height); + glViewport(0, g_ddraw->render.height - g_ddraw->height, g_ddraw->width, g_ddraw->height); needs_update = TRUE; } } else if (needs_update) { glViewport( - g_ddraw.render.viewport.x, - g_ddraw.render.viewport.y + g_ddraw.render.opengl_y_align, - g_ddraw.render.viewport.width, - g_ddraw.render.viewport.height); + g_ddraw->render.viewport.x, g_ddraw->render.viewport.y, + g_ddraw->render.viewport.width, g_ddraw->render.viewport.height); needs_update = FALSE; } } } - if (g_config.lock_surfaces) - LeaveCriticalSection(&g_ddraw.primary->cs); + if (g_ddraw->bnet_active) + { + glClear(GL_COLOR_BUFFER_BIT); + + glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]); + + if (g_ogl.adjust_alignment) + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + glTexSubImage2D( + GL_TEXTURE_2D, + 0, + 0, + 0, + g_ddraw->width, + g_ddraw->height, + g_ogl.surface_format, + g_ogl.surface_type, + g_ddraw->primary->bnet_surface); + + if (g_ogl.adjust_alignment) + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); + } } - LeaveCriticalSection(&g_ddraw.cs); + LeaveCriticalSection(&g_ddraw->cs); - if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0) + if (g_ddraw->wine) { glClear(GL_COLOR_BUFFER_BIT); } + else if (clear_count > 0) + { + clear_count--; + glClear(GL_COLOR_BUFFER_BIT); + } if (scale_changed) { - if (g_ogl.shader2_upscale && g_ogl.shader2_program && g_ogl.shader1_program && g_ogl.main_program) + if (g_ogl.scale_program && g_ogl.main_program) { - glBindVertexArray(g_ogl.shader2_vao); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[1]); - GLfloat tex_coord[] = { + glBindVertexArray(g_ogl.scale_vao); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.scale_vbos[1]); + GLfloat texCoord[] = { 0.0f, 0.0f, g_ogl.scale_w, 0.0f, g_ogl.scale_w, g_ogl.scale_h, 0.0f, g_ogl.scale_h, }; - 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); - } - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); - } - else if (g_ogl.shader2_program && g_ogl.shader1_program && g_ogl.main_program) - { - glBindVertexArray(g_ogl.shader1_vao); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); - GLfloat tex_coord[] = { - 0.0f, 0.0f, - 0.0f, g_ogl.scale_h, - g_ogl.scale_w, g_ogl.scale_h, - g_ogl.scale_w, 0.0f, - }; - 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); - } - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); - } - else if (g_ogl.shader1_program && g_ogl.main_program) - { - glBindVertexArray(g_ogl.shader1_vao); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); - GLfloat tex_coord[] = { - 0.0f, 0.0f, - g_ogl.scale_w, 0.0f, - g_ogl.scale_w, g_ogl.scale_h, - 0.0f, g_ogl.scale_h, - }; - 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); - } + glBufferData(GL_ARRAY_BUFFER, sizeof(texCoord), texCoord, GL_STATIC_DRAW); + glVertexAttribPointer(g_ogl.scale_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.scale_tex_coord_attr_loc); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } @@ -1211,13 +775,13 @@ static void ogl_render() { glBindVertexArray(g_ogl.main_vao); glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[1]); - GLfloat tex_coord[] = { + GLfloat texCoord[] = { 0.0f, 0.0f, g_ogl.scale_w, 0.0f, g_ogl.scale_w, 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(texCoord), texCoord, GL_STATIC_DRAW); glVertexAttribPointer(g_ogl.main_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray(g_ogl.main_tex_coord_attr_loc); glBindBuffer(GL_ARRAY_BUFFER, 0); @@ -1225,12 +789,10 @@ static void ogl_render() } } - if (glActiveTexture) - glActiveTexture(GL_TEXTURE0); - + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]); - if (g_ddraw.bpp == 8) + if (g_ddraw->bpp == 8) { glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, g_ogl.palette_tex_ids[pal_index]); @@ -1238,17 +800,14 @@ static void ogl_render() glActiveTexture(GL_TEXTURE0); } - if (g_ogl.shader1_program && g_ogl.shader2_program && g_ogl.main_program) + if (g_ogl.scale_program && g_ogl.main_program) { - static int frames = 0; - frames++; - /* draw surface into framebuffer */ glUseProgram(g_ogl.main_program); - glViewport(0, 0, g_ddraw.width, g_ddraw.height); + glViewport(0, 0, g_ddraw->width, g_ddraw->height); - glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[0]); + glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id); glBindVertexArray(g_ogl.main_vao); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); @@ -1259,102 +818,30 @@ static void ogl_render() glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, 0); - /* apply shader1 */ - - if (!g_ogl.shader2_upscale) + if (g_ddraw->child_window_exists) { - glViewport(0, 0, g_ddraw.render.viewport.width, g_ddraw.render.viewport.height); - } - - glUseProgram(g_ogl.shader1_program); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[0]); - - glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[1]); - - if (g_ogl.shader1_frame_count_uni_loc != -1) - glUniform1i(g_ogl.shader1_frame_count_uni_loc, frames); - - glBindVertexArray(g_ogl.shader1_vao); - glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); - glBindVertexArray(0); - - glBindFramebuffer(GL_FRAMEBUFFER, 0); - - /* apply shader2 */ - - if (g_ddraw.child_window_exists) - { - glViewport(0, g_ddraw.render.height - g_ddraw.height, g_ddraw.width, g_ddraw.height); + glViewport(0, g_ddraw->render.height - g_ddraw->height, g_ddraw->width, g_ddraw->height); } else { glViewport( - g_ddraw.render.viewport.x, - g_ddraw.render.viewport.y + g_ddraw.render.opengl_y_align, - g_ddraw.render.viewport.width, - g_ddraw.render.viewport.height); - } - - glUseProgram(g_ogl.shader2_program); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[1]); - - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[0]); - - if (g_ogl.shader2_frame_count_uni_loc != -1) - glUniform1i(g_ogl.shader2_frame_count_uni_loc, frames); - - glBindVertexArray(g_ogl.shader2_vao); - glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); - glBindVertexArray(0); - - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, 0); - } - else if (g_ogl.shader1_program && g_ogl.main_program) - { - /* draw surface into framebuffer */ - glUseProgram(g_ogl.main_program); - - glViewport(0, 0, g_ddraw.width, g_ddraw.height); - - glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[0]); - - glBindVertexArray(g_ogl.main_vao); - glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); - glBindVertexArray(0); - - glBindFramebuffer(GL_FRAMEBUFFER, 0); - - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, 0); - - if (g_ddraw.child_window_exists) - { - glViewport(0, g_ddraw.render.height - g_ddraw.height, g_ddraw.width, g_ddraw.height); - } - else - { - glViewport( - g_ddraw.render.viewport.x, - g_ddraw.render.viewport.y + g_ddraw.render.opengl_y_align, - g_ddraw.render.viewport.width, - g_ddraw.render.viewport.height); + g_ddraw->render.viewport.x, + g_ddraw->render.viewport.y, + g_ddraw->render.viewport.width, + g_ddraw->render.viewport.height); } /* apply filter */ - glUseProgram(g_ogl.shader1_program); + glUseProgram(g_ogl.scale_program); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[0]); + glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id); static int frames = 1; - if (g_ogl.shader1_frame_count_uni_loc != -1) - glUniform1i(g_ogl.shader1_frame_count_uni_loc, frames++); + if (g_ogl.frame_count_uni_loc != -1) + glUniform1i(g_ogl.frame_count_uni_loc, frames++); - glBindVertexArray(g_ogl.shader1_vao); + glBindVertexArray(g_ogl.scale_vao); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); glBindVertexArray(0); } @@ -1374,19 +861,7 @@ static void ogl_render() glEnd(); } - if (g_ddraw.bnet_active) - glClear(GL_COLOR_BUFFER_BIT); - - 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) - break; + SwapBuffers(g_ddraw->render.hdc); #if _DEBUG dbg_draw_frame_info_end(); @@ -1395,41 +870,33 @@ static void ogl_render() fpsl_frame_end(); } - if (g_config.vhack) - InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE); + if (g_ddraw->vhack) + InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE); } -static BOOL ogl_release_resources() +static void ogl_delete_context(HGLRC context) { + HeapFree(GetProcessHeap(), 0, g_ogl.surface_tex); glDeleteTextures(TEXTURE_COUNT, g_ogl.surface_tex_ids); - if (g_ddraw.bpp == 8) + if (g_ddraw->bpp == 8) glDeleteTextures(TEXTURE_COUNT, g_ogl.palette_tex_ids); if (glUseProgram) glUseProgram(0); - if (g_ogl.shader1_program) + if (g_ogl.scale_program) { - glDeleteTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); + glDeleteTextures(1, &g_ogl.frame_buffer_tex_id); if (glDeleteBuffers) - glDeleteBuffers(3, g_ogl.shader1_vbos); + glDeleteBuffers(3, g_ogl.scale_vbos); if (glDeleteFramebuffers) - glDeleteFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); + glDeleteFramebuffers(1, &g_ogl.frame_buffer_id); if (glDeleteVertexArrays) - glDeleteVertexArrays(1, &g_ogl.shader1_vao); - } - - if (g_ogl.shader2_program) - { - if (glDeleteBuffers) - glDeleteBuffers(3, g_ogl.shader2_vbos); - - if (glDeleteVertexArrays) - glDeleteVertexArrays(1, &g_ogl.shader2_vao); + glDeleteVertexArrays(1, &g_ogl.scale_vao); } if (glDeleteProgram) @@ -1437,11 +904,8 @@ static BOOL ogl_release_resources() if (g_ogl.main_program) glDeleteProgram(g_ogl.main_program); - if (g_ogl.shader1_program) - glDeleteProgram(g_ogl.shader1_program); - - if (g_ogl.shader2_program) - glDeleteProgram(g_ogl.shader2_program); + if (g_ogl.scale_program) + glDeleteProgram(g_ogl.scale_program); } if (g_oglu_got_version3) @@ -1456,41 +920,18 @@ static BOOL ogl_release_resources() } } - return TRUE; -} - -BOOL ogl_release() -{ - if (g_ddraw.render.thread) - return FALSE; - - if (g_ogl.context) - { - xwglMakeCurrent(NULL, NULL); - xwglDeleteContext(g_ogl.context); - g_ogl.context = NULL; - } - - return TRUE; + xwglMakeCurrent(NULL, NULL); + xwglDeleteContext(context); } static BOOL ogl_texture_upload_test() { - if (g_ogl.surface_tex_width > 4096 || g_ogl.surface_tex_height > 4096) - return TRUE; - - int* surface_tex = - HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_ogl.surface_tex_width * g_ogl.surface_tex_height * sizeof(int)); - - if (!surface_tex) - return TRUE; - static char test_data[] = { 0,1,2,0,0,2,3,0,0,4,5,0,0,6,7,0,0,8,9,0 }; int i; for (i = 0; i < TEXTURE_COUNT; i++) { - memcpy(surface_tex, test_data, sizeof(test_data)); + memcpy(g_ogl.surface_tex, test_data, sizeof(test_data)); glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[i]); @@ -1499,24 +940,21 @@ static BOOL ogl_texture_upload_test() 0, 0, 0, - g_ddraw.width, - g_ddraw.height, + g_ddraw->width, + g_ddraw->height, g_ogl.surface_format, g_ogl.surface_type, - surface_tex); + g_ogl.surface_tex); - memset(surface_tex, 0, sizeof(test_data)); + memset(g_ogl.surface_tex, 0, sizeof(test_data)); - glGetTexImage(GL_TEXTURE_2D, 0, g_ogl.surface_format, g_ogl.surface_type, surface_tex); + glGetTexImage(GL_TEXTURE_2D, 0, g_ogl.surface_format, g_ogl.surface_type, g_ogl.surface_tex); - if (memcmp(surface_tex, test_data, sizeof(test_data)) != 0) - { - HeapFree(GetProcessHeap(), 0, surface_tex); + if (memcmp(g_ogl.surface_tex, test_data, sizeof(test_data)) != 0) return FALSE; - } } - if (g_ddraw.bpp == 8) + if (g_ddraw->bpp == 8) { for (i = 0; i < TEXTURE_COUNT; i++) { @@ -1531,22 +969,16 @@ static BOOL ogl_texture_upload_test() 1, GL_RGBA, GL_UNSIGNED_BYTE, - surface_tex); + g_ogl.surface_tex); - memset(surface_tex, 0, sizeof(test_data)); + memset(g_ogl.surface_tex, 0, sizeof(test_data)); - glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface_tex); + glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, g_ogl.surface_tex); - if (memcmp(surface_tex, test_data, sizeof(test_data)) != 0) - { - HeapFree(GetProcessHeap(), 0, surface_tex); + if (memcmp(g_ogl.surface_tex, test_data, sizeof(test_data)) != 0) return FALSE; - } - } } - - HeapFree(GetProcessHeap(), 0, surface_tex); return TRUE; } @@ -1554,18 +986,12 @@ static BOOL ogl_shader_test() { BOOL result = TRUE; - if (g_ddraw.bpp != 8 || g_ogl.surface_tex_width > 4096 || g_ogl.surface_tex_height > 4096) + if (g_ddraw->bpp != 8) return result; - int* surface_tex = - HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_ogl.surface_tex_width * g_ogl.surface_tex_height * sizeof(int)); - - if (!surface_tex) - return TRUE; - if (g_oglu_got_version3 && g_ogl.main_program) { - memset(surface_tex, 0, g_ogl.surface_tex_height * g_ogl.surface_tex_width * sizeof(int)); + memset(g_ogl.surface_tex, 0, g_ogl.surface_tex_height * g_ogl.surface_tex_width * sizeof(int)); GLuint fbo_id = 0; glGenFramebuffers(1, &fbo_id); @@ -1586,7 +1012,7 @@ static BOOL ogl_shader_test() 0, GL_RGBA, GL_UNSIGNED_BYTE, - surface_tex); + g_ogl.surface_tex); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo_tex_id, 0); @@ -1621,7 +1047,7 @@ static BOOL ogl_shader_test() g_ogl.surface_tex_height, g_ogl.surface_format, GL_UNSIGNED_BYTE, - surface_tex); + g_ogl.surface_tex); glViewport(0, 0, g_ogl.surface_tex_width, g_ogl.surface_tex_height); @@ -1640,18 +1066,15 @@ static BOOL ogl_shader_test() glActiveTexture(GL_TEXTURE0); 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, g_ogl.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; - for (i = 0; i < g_ogl.surface_tex_height * g_ogl.surface_tex_width; i++) + if (g_ogl.surface_tex[i] != 0x80808080) { - if (surface_tex[i] != 0x80808080) - { - result = FALSE; - break; - } + result = FALSE; + break; } } } @@ -1666,8 +1089,5 @@ static BOOL ogl_shader_test() glBindFramebuffer(GL_FRAMEBUFFER, 0); } - while (glGetError() != GL_NO_ERROR); - - HeapFree(GetProcessHeap(), 0, surface_tex); return result; } diff --git a/src/screenshot.c b/src/screenshot.c index 063955b..76a7480 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -6,10 +6,7 @@ #include "ddpalette.h" #include "ddsurface.h" #include "lodepng.h" -#include "blt.h" -#include "config.h" -static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src); static BOOL ss_screenshot_8bit(char* filename, IDirectDrawSurfaceImpl* src) { @@ -32,15 +29,7 @@ static BOOL ss_screenshot_8bit(char* filename, IDirectDrawSurfaceImpl* src) unsigned char* dst_buf = NULL; size_t dst_buf_size = 0; - - unsigned int error = - lodepng_encode( - &dst_buf, - &dst_buf_size, - dds_GetBuffer(src), - src->pitch / src->bytes_pp, /* can't specify pitch so we use bitmap real width */ - src->height, - &state); + unsigned int error = lodepng_encode(&dst_buf, &dst_buf_size, dds_GetBuffer(src), src->width, src->height, &state); if (!error && dst_buf) lodepng_save_file(dst_buf, dst_buf_size, filename); @@ -56,42 +45,31 @@ static BOOL ss_screenshot_8bit(char* filename, IDirectDrawSurfaceImpl* src) static BOOL ss_screenshot_16bit(char* filename, IDirectDrawSurfaceImpl* src) { unsigned int error = TRUE; - unsigned int* buf = malloc(src->width * src->height * 4); + unsigned int* dst_buf = malloc(src->width * src->height * 4); - if (buf) + if (dst_buf) { - if (g_config.rgb555) + unsigned short* src_buf = (unsigned short*)dds_GetBuffer(src); + + for (int y = 0; y < src->height; y++) { - blt_rgb555_to_rgba8888( - buf, - 0, - 0, - src->width, - src->height, - src->width * 4, - dds_GetBuffer(src), - 0, - 0, - src->pitch); - } - else - { - blt_rgb565_to_rgba8888( - buf, - 0, - 0, - src->width, - src->height, - src->width * 4, - dds_GetBuffer(src), - 0, - 0, - src->pitch); + int dst_row = y * src->width; + + for (int x = 0; x < src->width; x++) + { + unsigned short pixel = src_buf[dst_row + x]; + + BYTE red = ((pixel & 0xF800) >> 11) << 3; + BYTE green = ((pixel & 0x07E0) >> 5) << 2; + BYTE blue = ((pixel & 0x001F)) << 3; + + dst_buf[dst_row + x] = (0xFF << 24) | (blue << 16) | (green << 8) | red; + } } - error = lodepng_encode32_file(filename, (unsigned char*)buf, src->width, src->height); + error = lodepng_encode32_file(filename, (unsigned char*)dst_buf, src->width, src->height); - free(buf); + free(dst_buf); } return !error; @@ -100,25 +78,31 @@ static BOOL ss_screenshot_16bit(char* filename, IDirectDrawSurfaceImpl* src) static BOOL ss_screenshot_32bit(char* filename, IDirectDrawSurfaceImpl* src) { unsigned int error = TRUE; - unsigned int* buf = malloc(src->width * src->height * 4); + unsigned int* dst_buf = malloc(src->width * src->height * 4); - if (buf) + if (dst_buf) { - blt_bgra8888_to_rgba8888( - buf, - 0, - 0, - src->width, - src->height, - src->width * 4, - dds_GetBuffer(src), - 0, - 0, - src->pitch); + unsigned int* src_buf = (unsigned int*)dds_GetBuffer(src); - error = lodepng_encode32_file(filename, (unsigned char*)buf, src->width, src->height); + for (int y = 0; y < src->height; y++) + { + int dst_row = y * src->width; - free(buf); + for (int x = 0; x < src->width; x++) + { + unsigned int pixel = src_buf[dst_row + x]; + + BYTE red = (pixel >> 16) & 0xFF; + BYTE green = (pixel >> 8) & 0xFF; + BYTE blue = pixel & 0xFF; + + dst_buf[dst_row + x] = (0xFF << 24) | (blue << 16) | (green << 8) | red; + } + } + + error = lodepng_encode32_file(filename, (unsigned char*)dst_buf, src->width, src->height); + + free(dst_buf); } return !error; @@ -126,7 +110,7 @@ static BOOL ss_screenshot_32bit(char* filename, IDirectDrawSurfaceImpl* src) BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) { - if (!src || !dds_GetBuffer(src) || !src->width || !src->height) + if (!src || !dds_GetBuffer(src)) return FALSE; char title[128]; @@ -134,7 +118,7 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) char str_time[64]; time_t t = time(NULL); - strncpy(title, g_ddraw.title, sizeof(g_ddraw.title)); + strncpy(title, g_ddraw->title, sizeof(g_ddraw->title)); for (int i = 0; i < strlen(title); i++) { @@ -148,105 +132,21 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) } } - CreateDirectoryA(g_config.screenshot_dir, NULL); - strftime(str_time, sizeof(str_time), "%Y-%m-%d_%H-%M-%S", localtime(&t)); - _snprintf(filename, sizeof(filename) - 1, "%s%s_%s.png", g_config.screenshot_dir, title, str_time); - - if (FILE_EXISTS(filename)) - return FALSE; + _snprintf(filename, sizeof(filename), "%s_%s.png", title, str_time); if (src->bpp == 8 && src->palette) { - if (!ss_screenshot_8bit(filename, src)) - { - memcpy(&src->bmi->bmiColors[0], src->palette->data_rgb, 256 * sizeof(int)); - - return ss_screenshot_bmp(filename, src); - } - - return TRUE; + return ss_screenshot_8bit(filename, src); } else if (src->bpp == 16) { - if (!ss_screenshot_16bit(filename, src)) - return ss_screenshot_bmp(filename, src); - - return TRUE; + return ss_screenshot_16bit(filename, src); } else if (src->bpp == 32) { - if (!ss_screenshot_32bit(filename, src)) - return ss_screenshot_bmp(filename, src); - - return TRUE; + return ss_screenshot_32bit(filename, src); } - + return FALSE; } - -static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src) -{ - BOOL result = TRUE; - - // make sure file extension is correct - char* ext = filename + strlen(filename) - 4; - - if (_strcmpi(ext, ".png") == 0) - { - strncpy(ext, ".bmp", 5); - } - - // Create the .BMP file. - HANDLE hf = CreateFile( - filename, - GENERIC_READ | GENERIC_WRITE, - 0, - NULL, - CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, - (HANDLE)NULL); - - if (hf == INVALID_HANDLE_VALUE) - return FALSE; - - PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER)src->bmi; - BITMAPFILEHEADER hdr; - - hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M" - // Compute the size of the entire file. - hdr.bfSize = (DWORD)(sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage); - hdr.bfReserved1 = 0; - hdr.bfReserved2 = 0; - - // Compute the offset to the array of color indices. - hdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD); - - // Copy the BITMAPFILEHEADER into the .BMP file. - DWORD tmp; - if (!WriteFile(hf, (LPVOID)&hdr, sizeof(BITMAPFILEHEADER), (LPDWORD)&tmp, NULL)) - { - result = FALSE; - } - - // Copy the BITMAPINFOHEADER and RGBQUAD array into the file. - if (!WriteFile(hf, (LPVOID)pbih, sizeof(BITMAPINFOHEADER) + pbih->biClrUsed * sizeof(RGBQUAD), (LPDWORD)&tmp, (NULL))) - { - result = FALSE; - } - - // Copy the array of color indices into the .BMP file. - DWORD cb = pbih->biSizeImage; - if (!WriteFile(hf, (LPSTR)dds_GetBuffer(src), (int)cb, (LPDWORD)&tmp, NULL)) - { - result = FALSE; - } - - // Close the .BMP file. - if (!CloseHandle(hf)) - { - result = FALSE; - } - - return result; -} diff --git a/src/utils.c b/src/utils.c index fafd4ed..3b18210 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,8 +1,4 @@ #include -#include -#include -#include -#include #include "ddraw.h" #include "debug.h" #include "dd.h" @@ -12,517 +8,26 @@ #include "render_d3d9.h" #include "utils.h" #include "config.h" -#include "versionhelpers.h" -#include "delay_imports.h" -/* - The following code is licensed under the MIT license: - DetourEnumerateModules - Copyright (c) Microsoft Corporation - https://github.com/microsoft/Detours -*/ -#define MM_ALLOCATION_GRANULARITY 0x10000 - -HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) -{ - PBYTE pbLast = (PBYTE)hModuleLast + MM_ALLOCATION_GRANULARITY; - - MEMORY_BASIC_INFORMATION mbi; - ZeroMemory(&mbi, sizeof(mbi)); - - // Find the next memory region that contains a mapped PE image. - // - for (;; pbLast = (PBYTE)mbi.BaseAddress + mbi.RegionSize) { - if (VirtualQuery(pbLast, &mbi, sizeof(mbi)) <= 0) { - break; - } - - // Skip uncommitted regions and guard pages. - // - if ((mbi.State != MEM_COMMIT) || - ((mbi.Protect & 0xff) == PAGE_NOACCESS) || - (mbi.Protect & PAGE_GUARD)) { - continue; - } - - __try { - PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pbLast; - if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE || - (DWORD)pDosHeader->e_lfanew > mbi.RegionSize || - (DWORD)pDosHeader->e_lfanew < sizeof(*pDosHeader)) { - continue; - } - - PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader + - pDosHeader->e_lfanew); - if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) { - continue; - } - - return (HMODULE)pDosHeader; - } -#if defined(_MSC_VER) -#pragma prefast(suppress:28940, "A bad pointer means this probably isn't a PE header.") -#endif - __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? - EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { - continue; - } - } - return NULL; -} - -void util_set_process_affinity() -{ -#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) - HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); - if (snap == INVALID_HANDLE_VALUE) - return; - - THREADENTRY32 entry = { 0 }; - entry.dwSize = sizeof(THREADENTRY32); - - if (!Thread32First(snap, &entry)) - { - CloseHandle(snap); - return; - } - - do - { - if (entry.th32OwnerProcessID == GetCurrentProcessId()) - { - util_set_thread_affinity(entry.th32ThreadID); - } - } while (Thread32Next(snap, &entry)); - - CloseHandle(snap); -#endif -} - -void util_set_thread_affinity(DWORD tid) -{ -#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) - HANDLE thread = OpenThread(THREAD_QUERY_INFORMATION | THREAD_SET_INFORMATION, FALSE, tid); - if (thread) - { - void* start = NULL; - NTSTATUS status = STATUS_PENDING; - - if (delay_NtQueryInformationThread) - { - status = - delay_NtQueryInformationThread(thread, ThreadQuerySetWin32StartAddress, &start, sizeof(start), NULL); - } - - if (status == STATUS_SUCCESS && start && delay_GetModuleHandleExA) - { - char game_exe_path[MAX_PATH] = { 0 }; - char game_dir[MAX_PATH] = { 0 }; - - if (GetModuleFileNameA(NULL, game_exe_path, sizeof(game_exe_path))) - { - _splitpath(game_exe_path, NULL, game_dir, NULL, NULL); - - char mod_path[MAX_PATH] = { 0 }; - char mod_dir[MAX_PATH] = { 0 }; - char mod_filename[MAX_PATH] = { 0 }; - HMODULE mod = NULL; - - if (delay_GetModuleHandleExA( - GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, start, &mod)) - { - if (GetModuleFileNameA(mod, mod_path, sizeof(mod_path))) - { - _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); - - if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0) // _strcmpi(mod_filename, "WINMM") == 0 - { - SetThreadAffinityMask(thread, 1); - } - } - } - } - } - else - { - SetThreadAffinityMask(thread, 1); - } - - CloseHandle(thread); - } -#endif -} - -void util_pull_messages() -{ - if (g_config.fix_not_responding && - g_ddraw.hwnd && - g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && - GetCurrentThreadId() == g_ddraw.gui_thread_id && - !IsWine()) - { - /* workaround for "Not Responding" window problem */ - //g_ddraw.last_msg_pull_tick = timeGetTime(); - MSG msg; - if (real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_REMOVE)) - { - TranslateMessage(&msg); - DispatchMessageA(&msg); - } - } -} - -DWORD util_get_timestamp(HMODULE mod) -{ - if (!mod || mod == INVALID_HANDLE_VALUE) - return 0; - - PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)mod; - if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) - return 0; - - PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew); - if (nt_headers->Signature != IMAGE_NT_SIGNATURE) - return 0; - - return nt_headers->FileHeader.TimeDateStamp; -} - -FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) -{ - if (!mod || mod == INVALID_HANDLE_VALUE) - return NULL; - - __try - { - PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)mod; - if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) - return NULL; - - PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)mod + (DWORD)dos_header->e_lfanew); - if (nt_headers->Signature != IMAGE_NT_SIGNATURE) - return NULL; - - DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; - if (!import_desc_rva) - return NULL; - - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)mod + import_desc_rva); - - while (import_desc->FirstThunk) - { - if (!import_desc->OriginalFirstThunk || !import_desc->Name) - { - import_desc++; - continue; - } - - char* imp_module_name = (char*)((DWORD)mod + import_desc->Name); - - if (_stricmp(imp_module_name, module_name) == 0) - { - PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)mod + import_desc->FirstThunk); - PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)mod + import_desc->OriginalFirstThunk); - - while (first_thunk->u1.Function) - { - if (!o_first_thunk->u1.AddressOfData) - { - first_thunk++; - o_first_thunk++; - continue; - } - - PIMAGE_IMPORT_BY_NAME import = (void*)((DWORD)mod + o_first_thunk->u1.AddressOfData); - - if ((o_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) - { -#if defined(__GNUC__) - if (util_is_bad_read_ptr((void*)import->Name)) - continue; -#endif - - if (strcmp((const char*)import->Name, function_name) == 0 && first_thunk->u1.Function) - { - return (FARPROC)first_thunk->u1.Function; - } - } - - first_thunk++; - o_first_thunk++; - } - } - - import_desc++; - } - } - __except (EXCEPTION_EXECUTE_HANDLER) - { - } - - return NULL; -} - -BOOL util_caller_is_ddraw_wrapper(void* return_address) -{ - if (!delay_GetModuleHandleExA) - return FALSE; - - void* directDrawCreate = (void*)util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate"); - void* directDrawCreateEx = (void*)util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreateEx"); - - TRACE("%s directDrawCreate = %p, directDrawCreateEx = %p\n", __FUNCTION__, directDrawCreate, directDrawCreateEx); - - HMODULE mod = NULL; - DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT; - - HMODULE D3dHook_dll = GetModuleHandleA("D3dHook.dll"); - if (D3dHook_dll) - { - if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == D3dHook_dll) || - (delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == D3dHook_dll) || - (delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == D3dHook_dll)) - { - MessageBoxA( - NULL, - "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please disable D3DWindower and then try to start the game again.", - "Conflicting DirectDraw wrapper detected - cnc-ddraw", - MB_OK | MB_TOPMOST); - - return TRUE; - } - } - - HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll"); - if (wndmode_dll) - { - if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == wndmode_dll) || - (delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == wndmode_dll) || - (delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == wndmode_dll)) - { - MessageBoxA( - NULL, - "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please remove/disable wndmode.dll and then try to start the game again.", - "Conflicting DirectDraw wrapper detected - cnc-ddraw", - MB_OK | MB_TOPMOST); - - return TRUE; - } - } - - HMODULE windmode_dll = GetModuleHandleA("windmode.dll"); - if (windmode_dll) - { - if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == windmode_dll) || - (delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == windmode_dll) || - (delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == windmode_dll)) - { - MessageBoxA( - NULL, - "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please remove/disable windmode.dll and then try to start the game again.", - "Conflicting DirectDraw wrapper detected - cnc-ddraw", - MB_OK | MB_TOPMOST); - - return TRUE; - } - } - - HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll"); - if (dxwnd_dll) - { - if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == dxwnd_dll) || - (delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == dxwnd_dll) || - (delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == dxwnd_dll)) - { - MessageBoxA( - NULL, - "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please disable DxWnd and then try to start the game again.", - "Conflicting DirectDraw wrapper detected - cnc-ddraw", - MB_OK | MB_TOPMOST); - - return TRUE; - } - } - - HMODULE age_dll = GetModuleHandleA("age.dll"); - if (age_dll) - { - if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == age_dll) || - (delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) || - (delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll)) - { - HKEY hkey; - LONG status = - RegOpenKeyExA(HKEY_CURRENT_USER, "SOFTWARE\\Voobly\\Voobly\\game\\13", 0L, KEY_READ, &hkey); - - if (status == ERROR_SUCCESS) - { - char windowed[256] = { 0 }; - DWORD size = sizeof(windowed); - RegQueryValueExA(hkey, "windowmode", NULL, NULL, (PVOID)&windowed, &size); - RegCloseKey(hkey); - - if (tolower(windowed[0]) == 't') - { - MessageBoxA( - NULL, - "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please disable the other wrapper by clicking in the game room on the very top " - "on 'Game', now select 'DirectX' and disable 'Start in Window-Mode'.", - "Conflicting DirectDraw wrapper detected - cnc-ddraw", - MB_OK | MB_TOPMOST); - - return TRUE; - } - } - } - } - - return FALSE; -} - -BOOL util_is_bad_read_ptr(void* p) -{ - MEMORY_BASIC_INFORMATION mbi = { 0 }; - if (VirtualQuery(p, &mbi, sizeof(mbi))) - { - DWORD mask = ( - PAGE_READONLY | - PAGE_READWRITE | - PAGE_WRITECOPY | - PAGE_EXECUTE_READ | - PAGE_EXECUTE_READWRITE | - PAGE_EXECUTE_WRITECOPY); - - BOOL b = !(mbi.Protect & mask); - - if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) - b = TRUE; - - return b; - } - - return TRUE; -} - -BOOL util_is_minimized(HWND hwnd) -{ - RECT rc = { 0 }; - - return IsIconic(hwnd) || (real_GetClientRect(hwnd, &rc) && (rc.right - rc.left == 0 || rc.bottom - rc.top == 0)); -} - -BOOL util_in_foreground() -{ - DWORD process_id = 0; - - return GetWindowThreadProcessId(real_GetForegroundWindow(), &process_id) && process_id == GetCurrentProcessId(); -} - -BOOL util_is_avx_supported() -{ - const DWORD XMM_STATE_BIT = 1 << 1; - const DWORD YMM_STATE_BIT = 1 << 2; - const DWORD OS_AVX_BITS = XMM_STATE_BIT | YMM_STATE_BIT; - - const DWORD AVX_BIT = 1 << 28; - const DWORD OSXSAVE_BIT = 1 << 27; - const DWORD XSAVE_BIT = 1 << 26; - const DWORD CPU_AVX_BITS = AVX_BIT | OSXSAVE_BIT | XSAVE_BIT; - - BOOL result = FALSE; - - __try - { - int info[4] = { 0 }; - __cpuid(info, 0); - - if (info[0] >= 1) - { - __cpuid(info, 1); - - if ((info[2] & CPU_AVX_BITS) == CPU_AVX_BITS) - { - unsigned int xcr0 = 0; - -#ifdef _MSC_VER - xcr0 = (unsigned int)_xgetbv(_XCR_XFEATURE_ENABLED_MASK); -#elif __AVX__ - __asm__("xgetbv" : "=a" (xcr0) : "c" (0) : "%edx"); -#endif - - result = (xcr0 & OS_AVX_BITS) == OS_AVX_BITS; - } - } - } - __except (EXCEPTION_EXECUTE_HANDLER) - { - } - - return result; -} - void util_limit_game_ticks() { - if (GetCurrentThreadId() != g_ddraw.gui_thread_id) - return; - - /* - static void (WINAPI * getSystemTimePreciseAsFileTime)(LPFILETIME); - - if (!getSystemTimePreciseAsFileTime) - { - getSystemTimePreciseAsFileTime = GetProcAddress(LoadLibraryA("Kernel32.dll"), "GetSystemTimePreciseAsFileTime"); - - //if (!getSystemTimePreciseAsFileTime) - // getSystemTimePreciseAsFileTime = GetSystemTimeAsFileTime; - } - - - if (1) - { - FILETIME ft = { 0 }; - getSystemTimePreciseAsFileTime(&ft); - - if (CompareFileTime((FILETIME*)&g_ddraw.ticks_limiter.due_time, &ft) == -1) - { - memcpy(&g_ddraw.ticks_limiter.due_time, &ft, sizeof(LARGE_INTEGER)); - } - else - { - while (TRUE) - { - getSystemTimePreciseAsFileTime(&ft); - if (CompareFileTime((FILETIME*)&g_ddraw.ticks_limiter.due_time, &ft) <= 0) - break; - } - } - - g_ddraw.ticks_limiter.due_time.QuadPart += g_ddraw.ticks_limiter.tick_length_ns; - } - else */ - if (g_ddraw.ticks_limiter.htimer) + if (g_ddraw->ticks_limiter.htimer) { FILETIME ft = { 0 }; GetSystemTimeAsFileTime(&ft); - if (CompareFileTime((FILETIME*)&g_ddraw.ticks_limiter.due_time, &ft) == -1) + if (CompareFileTime((FILETIME*)&g_ddraw->ticks_limiter.due_time, &ft) == -1) { - memcpy(&g_ddraw.ticks_limiter.due_time, &ft, sizeof(LARGE_INTEGER)); + memcpy(&g_ddraw->ticks_limiter.due_time, &ft, sizeof(LARGE_INTEGER)); } else { - WaitForSingleObject(g_ddraw.ticks_limiter.htimer, g_ddraw.ticks_limiter.tick_length * 2); + WaitForSingleObject(g_ddraw->ticks_limiter.htimer, g_ddraw->ticks_limiter.tick_length * 2); } - g_ddraw.ticks_limiter.due_time.QuadPart += g_ddraw.ticks_limiter.tick_length_ns; - SetWaitableTimer(g_ddraw.ticks_limiter.htimer, &g_ddraw.ticks_limiter.due_time, 0, NULL, NULL, FALSE); + g_ddraw->ticks_limiter.due_time.QuadPart += g_ddraw->ticks_limiter.tick_length_ns; + SetWaitableTimer(g_ddraw->ticks_limiter.htimer, &g_ddraw->ticks_limiter.due_time, 0, NULL, NULL, FALSE); } else { @@ -534,12 +39,12 @@ void util_limit_game_ticks() return; } - next_game_tick += g_ddraw.ticks_limiter.tick_length; + next_game_tick += g_ddraw->ticks_limiter.tick_length; DWORD tick_count = timeGetTime(); int sleep_time = next_game_tick - tick_count; - if (sleep_time <= 0 || sleep_time > g_ddraw.ticks_limiter.tick_length) + if (sleep_time <= 0 || sleep_time > g_ddraw->ticks_limiter.tick_length) { next_game_tick = tick_count; } @@ -555,7 +60,7 @@ void util_update_bnet_pos(int new_x, int new_y) static int old_x = -32000; static int old_y = -32000; - if (old_x == -32000 || old_y == -32000 || !g_ddraw.bnet_active) + if (old_x == -32000 || old_y == -32000 || !g_ddraw->bnet_active) { old_x = new_x; old_y = new_y; @@ -563,10 +68,10 @@ void util_update_bnet_pos(int new_x, int new_y) } POINT pt = { 0, 0 }; - real_ClientToScreen(g_ddraw.hwnd, &pt); + real_ClientToScreen(g_ddraw->hwnd, &pt); RECT mainrc; - SetRect(&mainrc, pt.x, pt.y, pt.x + g_ddraw.width, pt.y + g_ddraw.height); + SetRect(&mainrc, pt.x, pt.y, pt.x + g_ddraw->width, pt.y + g_ddraw->height); int adj_y = 0; int adj_x = 0; @@ -589,7 +94,7 @@ void util_update_bnet_pos(int new_x, int new_y) 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); - if (rc.bottom - rc.top <= g_ddraw.height) + if (rc.bottom - rc.top <= g_ddraw->height) { if (rc.bottom > mainrc.bottom && abs(mainrc.bottom - rc.bottom) > abs(adj_y)) { @@ -601,7 +106,7 @@ void util_update_bnet_pos(int new_x, int new_y) } } - if (rc.right - rc.left <= g_ddraw.width) + if (rc.right - rc.left <= g_ddraw->width) { if (rc.right > mainrc.right && abs(mainrc.right - rc.right) > abs(adj_x)) { @@ -653,25 +158,25 @@ BOOL util_get_lowest_resolution( DWORD max_height) { BOOL result = FALSE; - int org_ratio = (int)((ratio + 0.005f) * 100); + int org_ratio = (int)((ratio + 0.005f) * 10); SIZE lowest = { .cx = max_width + 1, .cy = max_height + 1 }; DWORD i = 0; DEVMODE m; memset(&m, 0, sizeof(DEVMODE)); m.dmSize = sizeof(DEVMODE); - while (real_EnumDisplaySettingsA(NULL, i, &m)) + while (EnumDisplaySettings(NULL, i, &m)) { if (m.dmPelsWidth >= min_width && m.dmPelsHeight >= min_height && m.dmPelsWidth <= max_width && m.dmPelsHeight <= max_height && - m.dmPelsWidth <= lowest.cx && - m.dmPelsHeight <= lowest.cy) + m.dmPelsWidth < lowest.cx && + m.dmPelsHeight < lowest.cy) { - int res_ratio = (int)((((float)m.dmPelsWidth / m.dmPelsHeight) + 0.005f) * 100); + int res_ratio = (int)((((float)m.dmPelsWidth / m.dmPelsHeight) + 0.005f) * 10); - if (abs(res_ratio - org_ratio) <= 5) + if (res_ratio == org_ratio) { result = TRUE; out_res->cx = lowest.cx = m.dmPelsWidth; @@ -689,91 +194,66 @@ BOOL util_get_lowest_resolution( void util_toggle_maximize() { - if (!g_config.resizable || !g_config.windowed || g_config.fullscreen || !g_ddraw.width) - return; - - /* Do not allow cnc-ddraw maximize while macOS maximize is active */ - if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) - return; - RECT client_rc; RECT dst_rc; - LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); - LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); - BOOL got_menu = GetMenu(g_ddraw.hwnd) != NULL; + LONG style = GetWindowLong(g_ddraw->hwnd, GWL_STYLE); + LONG exstyle = GetWindowLong(g_ddraw->hwnd, GWL_EXSTYLE); - if (real_GetClientRect(g_ddraw.hwnd, &client_rc) && SystemParametersInfo(SPI_GETWORKAREA, 0, &dst_rc, 0)) + if (real_GetClientRect(g_ddraw->hwnd, &client_rc) && SystemParametersInfo(SPI_GETWORKAREA, 0, &dst_rc, 0)) { int width = (dst_rc.right - dst_rc.left); int height = (dst_rc.bottom - dst_rc.top); int x = dst_rc.left; int y = dst_rc.top; - if (client_rc.right != g_ddraw.width || client_rc.bottom != g_ddraw.height) + if (client_rc.right != g_ddraw->width || client_rc.bottom != g_ddraw->height) { dst_rc.left = 0; dst_rc.top = 0; - dst_rc.right = g_ddraw.width; - dst_rc.bottom = g_ddraw.height; + dst_rc.right = g_ddraw->width; + dst_rc.bottom = g_ddraw->height; - AdjustWindowRectEx(&dst_rc, style, got_menu, exstyle); + AdjustWindowRectEx(&dst_rc, style, FALSE, exstyle); } - else if (g_config.boxing) + else if (g_ddraw->boxing) { dst_rc.left = 0; dst_rc.top = 0; - dst_rc.right = g_ddraw.width; - dst_rc.bottom = g_ddraw.height; + dst_rc.right = g_ddraw->width; + dst_rc.bottom = g_ddraw->height; for (int i = 20; i-- > 1;) { - if (width >= g_ddraw.width * i && height - 20 >= g_ddraw.height * i) + if (width >= g_ddraw->width * i && height - 20 >= g_ddraw->height * i) { - dst_rc.right = g_ddraw.width * i; - dst_rc.bottom = g_ddraw.height * i; + dst_rc.right = g_ddraw->width * i; + dst_rc.bottom = g_ddraw->height * i; break; } } - AdjustWindowRectEx(&dst_rc, style, got_menu, exstyle); + AdjustWindowRectEx(&dst_rc, style, FALSE, exstyle); } - else if (g_config.maintas) + else if (g_ddraw->maintas) { - util_unadjust_window_rect(&dst_rc, style, got_menu, exstyle); + util_unadjust_window_rect(&dst_rc, style, FALSE, exstyle); int w = dst_rc.right - dst_rc.left; int h = dst_rc.bottom - dst_rc.top; - double dst_ar; - double src_ar = (double)h / w; - - if (g_config.aspect_ratio[0]) - { - char* e = &g_config.aspect_ratio[0]; - - DWORD cx = strtoul(e, &e, 0); - DWORD cy = strtoul(e + 1, &e, 0); - - dst_ar = (double)cy / cx; - } - else - { - dst_ar = (double)g_ddraw.height / g_ddraw.width; - } - dst_rc.top = 0; dst_rc.left = 0; dst_rc.right = w; - dst_rc.bottom = (LONG)round(dst_ar * w); + dst_rc.bottom = (LONG)(((float)g_ddraw->height / g_ddraw->width) * w); - if (src_ar < dst_ar) + if (dst_rc.bottom > h) { - dst_rc.right = (LONG)round(((double)dst_rc.right / dst_rc.bottom) * h); + dst_rc.right = (LONG)(((float)dst_rc.right / dst_rc.bottom) * h); dst_rc.bottom = h; } - AdjustWindowRectEx(&dst_rc, style, got_menu, exstyle); + AdjustWindowRectEx(&dst_rc, style, FALSE, exstyle); } RECT pos_rc; @@ -782,8 +262,8 @@ void util_toggle_maximize() pos_rc.right = (dst_rc.right - dst_rc.left); pos_rc.bottom = (dst_rc.bottom - dst_rc.top); - util_unadjust_window_rect(&pos_rc, style, got_menu, exstyle); - util_unadjust_window_rect(&dst_rc, style, got_menu, exstyle); + util_unadjust_window_rect(&pos_rc, style, FALSE, exstyle); + util_unadjust_window_rect(&dst_rc, style, FALSE, exstyle); util_set_window_rect( pos_rc.left, @@ -796,22 +276,19 @@ void util_toggle_maximize() void util_toggle_fullscreen() { - /* Disable ALT+ENTER on battle.net and Infantry Online Zone List Window */ - if (g_ddraw.bnet_active || !g_ddraw.width || (g_config.infantryhack && GetMenu(g_ddraw.hwnd))) + if (g_ddraw->bnet_active) return; - /* Do not allow ALT+ENTER while macOS maximize is active */ - if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) - return; + memset(g_ddraw->primary->bnet_surface, 0, g_ddraw->width * g_ddraw->height); - if (g_config.toggle_borderless && g_config.windowed) + if (g_ddraw->toggle_borderless) { - if (!g_config.fullscreen) + if (!g_ddraw->fullscreen) { mouse_unlock(); - g_config.upscaled_state = g_config.fullscreen = TRUE; - dd_SetDisplayMode(0, 0, 0, 0); + g_config.upscaled_state = g_ddraw->fullscreen = TRUE; + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); mouse_lock(); } @@ -819,25 +296,25 @@ void util_toggle_fullscreen() { mouse_unlock(); - g_config.upscaled_state = g_config.fullscreen = FALSE; - dd_SetDisplayMode(0, 0, 0, 0); + g_config.upscaled_state = g_ddraw->fullscreen = FALSE; + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); //mouse_lock(); } } else { - if (g_config.windowed) + if (g_ddraw->windowed) { mouse_unlock(); - if (g_config.toggle_upscaled) + if (g_ddraw->toggle_upscaled) { - g_config.upscaled_state = g_config.fullscreen = TRUE; + g_config.upscaled_state = g_ddraw->fullscreen = TRUE; } - g_config.window_state = g_config.windowed = FALSE; - dd_SetDisplayMode(0, 0, 0, SDM_LEAVE_WINDOWED); + g_config.window_state = g_ddraw->windowed = FALSE; + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED); util_update_bnet_pos(0, 0); mouse_lock(); @@ -846,34 +323,23 @@ void util_toggle_fullscreen() { mouse_unlock(); - if (g_config.toggle_upscaled) + if (g_ddraw->toggle_upscaled) { - g_config.upscaled_state = g_config.fullscreen = FALSE; + g_config.upscaled_state = g_ddraw->fullscreen = FALSE; } - g_config.window_state = g_config.windowed = TRUE; + g_config.window_state = g_ddraw->windowed = TRUE; - if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive) + if (g_ddraw->renderer == d3d9_render_main) { - d3d9_reset(g_config.windowed); + d3d9_reset(); } else { - if (g_ddraw.render.thread) - { - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); - - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; - } - - ChangeDisplaySettings(NULL, g_ddraw.bnet_active ? CDS_FULLSCREEN : 0); + ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); } - dd_SetDisplayMode(0, 0, 0, SDM_LEAVE_FULLSCREEN); + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_FULLSCREEN); //mouse_lock(); } } @@ -899,17 +365,17 @@ BOOL util_unadjust_window_rect(LPRECT prc, DWORD dwStyle, BOOL fMenu, DWORD dwEx void util_set_window_rect(int x, int y, int width, int height, UINT flags) { - if (g_config.windowed) + if (g_ddraw->windowed) { - if (g_ddraw.render.thread) + if (g_ddraw->render.thread) { - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); + EnterCriticalSection(&g_ddraw->cs); + g_ddraw->render.run = FALSE; + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw->cs); - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; + WaitForSingleObject(g_ddraw->render.thread, INFINITE); + g_ddraw->render.thread = NULL; } if ((flags & SWP_NOMOVE) == 0) @@ -924,42 +390,10 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags) g_config.window_rect.right = width; } - dd_SetDisplayMode(0, 0, 0, 0); + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); } } -BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam) -{ - RECT size = { 0 }; - real_GetClientRect(hwnd, &size); - - LONG sytle = real_GetWindowLongA(hwnd, GWL_STYLE); - - if (!g_ddraw.hwnd && !(sytle & WS_DISABLED) && size.right > 0 && size.bottom > 0) - g_ddraw.hwnd = hwnd; - -#ifdef _DEBUG - char class[MAX_PATH] = { 0 }; - GetClassNameA(hwnd, class, sizeof(class) - 1); - - char title[MAX_PATH] = { 0 }; - GetWindowTextA(hwnd, title, sizeof(title) - 1); - - RECT pos = { 0 }; - real_GetWindowRect(hwnd, &pos); - - LONG exsytle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - - TRACE( - "%s(class=%s, title=%s, X=%d, Y=%d, nWidth=%d, nHeight=%d)\n", - __FUNCTION__, class, title, pos.left, pos.top, size.right, size.bottom); - - dbg_dump_wnd_styles(sytle, exsytle); -#endif - - return TRUE; -} - BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) { IDirectDrawSurfaceImpl* this = (IDirectDrawSurfaceImpl*)lparam; @@ -967,45 +401,17 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) RECT size; RECT pos; - if (real_GetClientRect(hwnd, &size) && real_GetWindowRect(hwnd, &pos)) + if (real_GetClientRect(hwnd, &size) && real_GetWindowRect(hwnd, &pos) && size.right > 1 && size.bottom > 1) { - char class_name[MAX_PATH] = { 0 }; - GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); + //TRACE(" util_enum_child_proc right=%u, bottom=%u\n", size.right, size.bottom); - LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - HWND parent = GetParent(hwnd); - -#ifdef _DEBUG_X - LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); - - TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p, style=%08X\n", - class_name, hwnd, size.right, size.bottom, pos.left, pos.top, parent, style); - - dbg_dump_wnd_styles(style, exstyle); -#endif - - if (parent != g_ddraw.hwnd || size.right <= 1 || size.bottom <= 1 || _strcmpi(class_name, "Edit") == 0) - return TRUE; - - if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || - g_config.fixchilds == FIX_CHILDS_DETECT_HIDE_NOSCALE || - strcmp(class_name, "Cc2EditClassTh") == 0 || - strcmp(class_name, "msctls_statusbar32") == 0 || - strcmp(class_name, "VideoRenderer") == 0 || - strcmp(class_name, "MCIQTZ_Window") == 0 || - strcmp(class_name, "MCIAVI") == 0 || - strcmp(class_name, "AVIWnd32") == 0 || - strcmp(class_name, "MCIWndClass") == 0 || - strcmp(class_name, "AVI Window") == 0) + if (g_ddraw->fixchilds == FIX_CHILDS_DETECT_HIDE) { - if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE_NOSCALE) - { - g_ddraw.got_child_windows = g_ddraw.child_window_exists = TRUE; - } + LONG style = GetWindowLong(hwnd, GWL_EXSTYLE); - if (!(exstyle & WS_EX_TRANSPARENT)) + if (!(style & WS_EX_TRANSPARENT)) { - real_SetWindowLongA(hwnd, GWL_EXSTYLE, exstyle | WS_EX_TRANSPARENT); + real_SetWindowLongA(hwnd, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); real_SetWindowPos( hwnd, @@ -1014,78 +420,51 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) 0, 0, 0, - SWP_ASYNCWINDOWPOS | SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER + SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER ); } } - else if (!(exstyle & WS_EX_TRANSPARENT)) + else { - g_ddraw.got_child_windows = g_ddraw.child_window_exists = TRUE; + g_ddraw->got_child_windows = g_ddraw->child_window_exists = TRUE; - if (g_config.fixchilds == FIX_CHILDS_DETECT_PAINT) + if (g_ddraw->fixchilds == FIX_CHILDS_DETECT_PAINT) { HDC dst_dc = GetDC(hwnd); HDC src_dc; dds_GetDC(this, &src_dc); - real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)&pos, 2); + real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)&pos, 2); - real_BitBlt(dst_dc, 0, 0, size.right, size.bottom, src_dc, pos.left, pos.top, SRCCOPY); + BitBlt(dst_dc, 0, 0, size.right, size.bottom, src_dc, pos.left, pos.top, SRCCOPY); ReleaseDC(hwnd, dst_dc); } } - - if (strcmp(class_name, "TMediaPlayer") == 0) - return TRUE; } -#ifdef _DEBUG_X - return TRUE; -#else return FALSE; -#endif } static unsigned char util_get_pixel(int x, int y) { return ((unsigned char*)dds_GetBuffer( - g_ddraw.primary))[y * g_ddraw.primary->pitch + x * g_ddraw.primary->bytes_pp]; + g_ddraw->primary))[y * g_ddraw->primary->l_pitch + x * g_ddraw->primary->lx_pitch]; } BOOL util_detect_low_res_screen() { - /* struct Copied from wkReSolution */ - typedef struct - { - PVOID UnkTable1; - DWORD Unk1, Unk2, Unk3, Unk4; - PVOID UnkDD, UnkTable2; - DWORD Unk5; - DWORD RenderWidth, RenderHeight; - DWORD Unk6, Unk7; - DWORD WidthRT, HeightRT; - DWORD HalfWidth, HalfHeight; - DWORD Unk8; - PCHAR UnkC; - LPDIRECTDRAW lpDD; - } * LPW2DDSTRUCT; - static int* in_movie = (int*)0x00665F58; static int* is_vqa_640 = (int*)0x0065D7BC; static BYTE* should_stretch = (BYTE*)0x00607D78; - static LPW2DDSTRUCT* pW2DS; - - if (!pW2DS) - pW2DS = (LPW2DDSTRUCT*)((DWORD)GetModuleHandleA(NULL) + 0x799C4); - if (g_ddraw.width <= g_ddraw.upscale_hack_width || g_ddraw.height <= g_ddraw.upscale_hack_height) + if (g_ddraw->width <= g_ddraw->upscale_hack_width || g_ddraw->height <= g_ddraw->upscale_hack_height) { return FALSE; } - if (g_ddraw.isredalert) + if (g_ddraw->isredalert) { if ((*in_movie && !*is_vqa_640) || *should_stretch) { @@ -1094,32 +473,15 @@ BOOL util_detect_low_res_screen() return FALSE; } - else if (g_ddraw.iscnc1) + else if (g_ddraw->iscnc1) { return - util_get_pixel(g_ddraw.upscale_hack_width + 1, 0) == 0 || - util_get_pixel(g_ddraw.upscale_hack_width + 5, 1) == 0; + util_get_pixel(g_ddraw->upscale_hack_width + 1, 0) == 0 || + util_get_pixel(g_ddraw->upscale_hack_width + 5, 1) == 0; } - else if (g_ddraw.iskkndx) + else if (g_ddraw->iskkndx) { - return util_get_pixel(g_ddraw.width - 3, 3) == 0; - } - else if (g_ddraw.isworms2) - { - DWORD w2_width = *pW2DS ? (*pW2DS)->RenderWidth : 0; - DWORD w2_height = *pW2DS ? (*pW2DS)->RenderHeight : 0; - - if (w2_width && w2_width < g_ddraw.width && w2_height && w2_height < g_ddraw.height) - { - if (g_ddraw.upscale_hack_width != w2_width || g_ddraw.upscale_hack_height != w2_height) - { - g_ddraw.upscale_hack_width = w2_width; - g_ddraw.upscale_hack_height = w2_height; - InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE); - } - - return TRUE; - } + return util_get_pixel(g_ddraw->width - 3, 3) == 0; } return FALSE; diff --git a/src/versionhelpers.c b/src/versionhelpers.c deleted file mode 100644 index f9f35c2..0000000 --- a/src/versionhelpers.c +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include "versionhelpers.h" -#include "delay_imports.h" - - -BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask) -{ - return delay_RtlVerifyVersionInfo ? - delay_RtlVerifyVersionInfo(versionInfo, typeMask, conditionMask) == 0 : - VerifyVersionInfoW(versionInfo, typeMask, conditionMask); -} - -ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition) -{ - return delay_VerSetConditionMask ? delay_VerSetConditionMask(ConditionMask, TypeMask, Condition) : 0; -} - -const char* verhelp_wine_get_version() -{ - return delay_wine_get_version ? delay_wine_get_version() : NULL; -} - -void verhelp_wine_get_host_version(const char** sysname, const char** release) -{ - if (delay_wine_get_host_version) - { - delay_wine_get_host_version(sysname, release); - return; - } - - if (sysname) - *sysname = NULL; - - if (release) - *release = NULL; -} diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 33655c1..c6ffd2d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1,7 +1,6 @@ #include #include #include -#include #include "debug.h" #include "config.h" #include "dd.h" @@ -10,75 +9,95 @@ #include "config.h" #include "utils.h" #include "mouse.h" -#include "keyboard.h" #include "wndproc.h" #include "render_gdi.h" -#include "render_d3d9.h" -#include "render_ogl.h" -#include "directinput.h" -#include "ddsurface.h" -#include "ddclipper.h" -#include "dllmain.h" -#include "hook.h" -#include "directinput.h" -#include "ddpalette.h" -#include "palette.h" BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) { - if (!g_ddraw.ref || !g_ddraw.hwnd || !g_ddraw.width) - return real_GetCursorPos(lpPoint); - POINT pt, realpt; - if (!real_GetCursorPos(&pt)) + if (!real_GetCursorPos(&pt) || !g_ddraw) return FALSE; - realpt = pt; + realpt.x = pt.x; + realpt.y = pt.y; - if ((g_mouse_locked || g_config.devmode || g_ddraw.bnet_active) && - (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt))) + if (g_ddraw->locked && (!g_ddraw->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); + /* fallback solution for possible ClipCursor failure */ + int diffx = 0, diffy = 0; - if (g_config.adjmouse && !g_ddraw.child_window_exists) + int max_width = g_ddraw->adjmouse ? g_ddraw->render.viewport.width : g_ddraw->width; + int max_height = g_ddraw->adjmouse ? g_ddraw->render.viewport.height : g_ddraw->height; + + pt.x -= g_ddraw->mouse.x_adjust; + pt.y -= g_ddraw->mouse.y_adjust; + + if (pt.x < 0) { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + diffx = pt.x; + pt.x = 0; } - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - if (g_config.vhack && - !g_ddraw.isworms2 && - !g_config.devmode && - !g_ddraw.bnet_active && - InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0)) + if (pt.y < 0) { - int diffx = 0; - int diffy = 0; + diffy = pt.y; + pt.y = 0; + } - if (x > g_ddraw.upscale_hack_width) + if (pt.x > max_width) + { + diffx = pt.x - max_width; + pt.x = max_width; + } + + if (pt.y > max_height) + { + diffy = pt.y - max_height; + pt.y = max_height; + } + + if (diffx || diffy) + real_SetCursorPos(realpt.x - diffx, realpt.y - diffy); + + int x = 0; + int y = 0; + + if (g_ddraw->adjmouse) + { + x = min((DWORD)(roundf(pt.x * g_ddraw->render.unscale_w)), g_ddraw->width); + y = min((DWORD)(roundf(pt.y * g_ddraw->render.unscale_h)), g_ddraw->height); + } + else + { + x = pt.x; + y = pt.y; + } + + if (g_ddraw->vhack && InterlockedExchangeAdd(&g_ddraw->upscale_hack_active, 0)) + { + diffx = 0; + diffy = 0; + + if (x > g_ddraw->upscale_hack_width) { - diffx = x - g_ddraw.upscale_hack_width; - x = g_ddraw.upscale_hack_width; + diffx = x - g_ddraw->upscale_hack_width; + x = g_ddraw->upscale_hack_width; } - if (y > g_ddraw.upscale_hack_height) + if (y > g_ddraw->upscale_hack_height) { - diffy = y - g_ddraw.upscale_hack_height; - y = g_ddraw.upscale_hack_height; + diffy = y - g_ddraw->upscale_hack_height; + y = g_ddraw->upscale_hack_height; } if (diffx || diffy) real_SetCursorPos(realpt.x - diffx, realpt.y - diffy); } - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); if (lpPoint) { @@ -88,11 +107,21 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) return TRUE; } + else if (lpPoint && g_ddraw->bnet_active && real_ScreenToClient(g_ddraw->hwnd, &pt)) + { + if (pt.x > 0 && pt.x < g_ddraw->width && pt.y > 0 && pt.y < g_ddraw->height) + { + lpPoint->x = pt.x; + lpPoint->y = pt.y; + + return TRUE; + } + } if (lpPoint) { - lpPoint->x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - lpPoint->y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + lpPoint->x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0); + lpPoint->y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0); } return TRUE; @@ -100,42 +129,42 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) BOOL WINAPI fake_ClipCursor(const RECT* lpRect) { - if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + if (g_ddraw) { RECT dst_rc = { 0, 0, - g_ddraw.width, - g_ddraw.height + g_ddraw->width, + g_ddraw->height }; if (lpRect) CopyRect(&dst_rc, lpRect); - if (g_config.adjmouse) + if (g_ddraw->adjmouse) { - dst_rc.left = (LONG)(roundf(dst_rc.left * g_ddraw.render.scale_w)); - dst_rc.top = (LONG)(roundf(dst_rc.top * g_ddraw.render.scale_h)); - dst_rc.bottom = (LONG)(roundf(dst_rc.bottom * g_ddraw.render.scale_h)); - dst_rc.right = (LONG)(roundf(dst_rc.right * g_ddraw.render.scale_w)); + dst_rc.left = (LONG)(roundf(dst_rc.left * g_ddraw->render.scale_w)); + dst_rc.top = (LONG)(roundf(dst_rc.top * g_ddraw->render.scale_h)); + dst_rc.bottom = (LONG)(roundf(dst_rc.bottom * g_ddraw->render.scale_h)); + dst_rc.right = (LONG)(roundf(dst_rc.right * g_ddraw->render.scale_w)); } - int max_width = g_config.adjmouse ? g_ddraw.render.viewport.width : g_ddraw.width; - int max_height = g_config.adjmouse ? g_ddraw.render.viewport.height : g_ddraw.height; + int max_width = g_ddraw->adjmouse ? g_ddraw->render.viewport.width : g_ddraw->width; + int max_height = g_ddraw->adjmouse ? g_ddraw->render.viewport.height : g_ddraw->height; dst_rc.bottom = min(dst_rc.bottom, max_height); dst_rc.right = min(dst_rc.right, max_width); OffsetRect( &dst_rc, - g_ddraw.mouse.x_adjust, - g_ddraw.mouse.y_adjust); + g_ddraw->mouse.x_adjust, + g_ddraw->mouse.y_adjust); - CopyRect(&g_ddraw.mouse.rc, &dst_rc); + CopyRect(&g_ddraw->mouse.rc, &dst_rc); - if (g_mouse_locked && !util_is_minimized(g_ddraw.hwnd)) + if (g_ddraw->locked) { - real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&dst_rc, 2); + real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&dst_rc, 2); return real_ClipCursor(&dst_rc); } @@ -146,19 +175,19 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect) int WINAPI fake_ShowCursor(BOOL bShow) { - if (g_ddraw.ref && g_ddraw.hwnd) + if (g_ddraw) { - if (g_mouse_locked || g_config.devmode) + if (g_ddraw->locked || g_ddraw->devmode) { int count = real_ShowCursor(bShow); - InterlockedExchange((LONG*)&g_ddraw.show_cursor_count, count); + InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, count); return count; } else { return bShow ? - InterlockedIncrement((LONG*)&g_ddraw.show_cursor_count) : - InterlockedDecrement((LONG*)&g_ddraw.show_cursor_count); + InterlockedIncrement((LONG*)&g_ddraw->show_cursor_count) : + InterlockedDecrement((LONG*)&g_ddraw->show_cursor_count); } } @@ -167,11 +196,11 @@ int WINAPI fake_ShowCursor(BOOL bShow) HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor) { - if (g_ddraw.ref && g_ddraw.hwnd) + if (g_ddraw) { - HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw.old_cursor, (LONG)hCursor); + HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)hCursor); - if (!g_mouse_locked && !g_config.devmode) + if (!g_ddraw->locked && !g_ddraw->devmode) return cursor; } @@ -181,16 +210,15 @@ HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor) BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect) { if (lpRect && - g_ddraw.ref && - g_ddraw.hwnd && - g_ddraw.width && - (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + g_ddraw && + g_ddraw->hwnd && + (g_hook_method != 2 || g_ddraw->renderer == gdi_render_main)) { - if (hWnd == g_ddraw.hwnd || hWnd == GetDesktopWindow()) + if (g_ddraw->hwnd == hWnd) { - lpRect->bottom = g_ddraw.height; + lpRect->bottom = g_ddraw->height; lpRect->left = 0; - lpRect->right = g_ddraw.width; + lpRect->right = g_ddraw->width; lpRect->top = 0; return TRUE; @@ -199,7 +227,7 @@ BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect) { if (real_GetWindowRect(hWnd, lpRect)) { - real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)lpRect, 2); + real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)lpRect, 2); return TRUE; } @@ -214,14 +242,13 @@ BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect) BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect) { if (lpRect && - g_ddraw.ref && - g_ddraw.width && - (g_ddraw.hwnd == hWnd || hWnd == GetDesktopWindow()) && - (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + g_ddraw && + g_ddraw->hwnd == hWnd && + (g_hook_method != 2 || g_ddraw->renderer == gdi_render_main)) { - lpRect->bottom = g_ddraw.height; + lpRect->bottom = g_ddraw->height; lpRect->left = 0; - lpRect->right = g_ddraw.width; + lpRect->right = g_ddraw->width; lpRect->top = 0; return TRUE; @@ -232,67 +259,55 @@ BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect) BOOL WINAPI fake_ClientToScreen(HWND hWnd, LPPOINT lpPoint) { - if (!g_ddraw.ref || !g_ddraw.hwnd) - return real_ClientToScreen(hWnd, lpPoint); - - if (g_ddraw.hwnd != hWnd) - return real_ClientToScreen(hWnd, lpPoint) && real_ScreenToClient(g_ddraw.hwnd, lpPoint); + if (g_ddraw && g_ddraw->hwnd != hWnd) + return real_ClientToScreen(hWnd, lpPoint) && real_ScreenToClient(g_ddraw->hwnd, lpPoint); return TRUE; } BOOL WINAPI fake_ScreenToClient(HWND hWnd, LPPOINT lpPoint) { - if (!g_ddraw.ref || !g_ddraw.hwnd) - return real_ScreenToClient(hWnd, lpPoint); - - if (g_ddraw.hwnd != hWnd) - return real_ClientToScreen(g_ddraw.hwnd, lpPoint) && real_ScreenToClient(hWnd, lpPoint); + if (g_ddraw && g_ddraw->hwnd != hWnd) + return real_ClientToScreen(g_ddraw->hwnd, lpPoint) && real_ScreenToClient(hWnd, lpPoint); return TRUE; } BOOL WINAPI fake_SetCursorPos(int X, int Y) { - if (!g_ddraw.ref || !g_ddraw.hwnd || !g_ddraw.width) - return real_SetCursorPos(X, Y); - - if (!g_mouse_locked && !g_config.devmode) + if (g_ddraw && !g_ddraw->locked && !g_ddraw->devmode) return TRUE; POINT pt = { X, Y }; - if (g_config.adjmouse) + if (g_ddraw) { - pt.x = (LONG)(roundf(pt.x * g_ddraw.mouse.scale_x)); - pt.y = (LONG)(roundf(pt.y * g_ddraw.mouse.scale_y)); + if (g_ddraw->adjmouse) + { + pt.x = (LONG)(roundf(pt.x * g_ddraw->render.scale_w)); + pt.y = (LONG)(roundf(pt.y * g_ddraw->render.scale_h)); + } + + pt.x += g_ddraw->mouse.x_adjust; + pt.y += g_ddraw->mouse.y_adjust; } - pt.x += g_ddraw.mouse.x_adjust; - pt.y += g_ddraw.mouse.y_adjust; - - return real_ClientToScreen(g_ddraw.hwnd, &pt) && real_SetCursorPos(pt.x, pt.y); + return g_ddraw && real_ClientToScreen(g_ddraw->hwnd, &pt) && real_SetCursorPos(pt.x, pt.y); } HWND WINAPI fake_WindowFromPoint(POINT Point) { - if (!g_ddraw.ref || !g_ddraw.hwnd) - return real_WindowFromPoint(Point); - POINT pt = { Point.x, Point.y }; - return real_ClientToScreen(g_ddraw.hwnd, &pt) ? real_WindowFromPoint(pt) : NULL; + return g_ddraw && real_ClientToScreen(g_ddraw->hwnd, &pt) ? real_WindowFromPoint(pt) : NULL; } BOOL WINAPI fake_GetClipCursor(LPRECT lpRect) { - if (!g_ddraw.ref || !g_ddraw.width) - return real_GetClipCursor(lpRect); - - if (lpRect) + if (lpRect && g_ddraw) { - lpRect->bottom = g_ddraw.height; + lpRect->bottom = g_ddraw->height; lpRect->left = 0; - lpRect->right = g_ddraw.width; + lpRect->right = g_ddraw->width; lpRect->top = 0; return TRUE; @@ -303,37 +318,18 @@ BOOL WINAPI fake_GetClipCursor(LPRECT lpRect) BOOL WINAPI fake_GetCursorInfo(PCURSORINFO pci) { - if (!g_ddraw.ref || !g_ddraw.hwnd) - return real_GetCursorInfo(pci); - - return pci && real_GetCursorInfo(pci) && real_ScreenToClient(g_ddraw.hwnd, &pci->ptScreenPos); + return pci && g_ddraw && real_GetCursorInfo(pci) && real_ScreenToClient(g_ddraw->hwnd, &pci->ptScreenPos); } int WINAPI fake_GetSystemMetrics(int nIndex) { - DWORD width = 0; - DWORD height = 0; - - if (g_ddraw.ref && g_ddraw.width) - { - width = g_ddraw.width; - height = g_ddraw.height; - } - else if (g_config.fake_mode[0]) - { - char* e = &g_config.fake_mode[0]; - - width = strtoul(e, &e, 0); - height = strtoul(e + 1, &e, 0); - } - - if (width) + if (g_ddraw) { if (nIndex == SM_CXSCREEN) - return width; + return g_ddraw->width; if (nIndex == SM_CYSCREEN) - return height; + return g_ddraw->height; } return real_GetSystemMetrics(nIndex); @@ -341,19 +337,19 @@ int WINAPI fake_GetSystemMetrics(int nIndex) BOOL WINAPI fake_SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags) { - if (g_ddraw.ref && g_ddraw.hwnd) + if (g_ddraw && g_ddraw->hwnd) { - if (g_ddraw.hwnd == hWnd) + if (g_ddraw->hwnd == hWnd) { UINT req_flags = SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER; if ((uFlags & req_flags) != req_flags) return TRUE; } - else if (!IsChild(g_ddraw.hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) + else if (!IsChild(g_ddraw->hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) { POINT pt = { 0, 0 }; - if (real_ClientToScreen(g_ddraw.hwnd, &pt)) + if (real_ClientToScreen(g_ddraw->hwnd, &pt)) { X += pt.x; Y += pt.y; @@ -366,47 +362,21 @@ 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) { - if (g_ddraw.ref && g_ddraw.hwnd) + if (g_ddraw && g_ddraw->hwnd) { - if (g_ddraw.hwnd == hWnd) + if (g_ddraw->hwnd == hWnd) { - if (g_ddraw.width && g_ddraw.height && (nWidth != g_ddraw.width || nHeight != g_ddraw.height)) - { - //real_SendMessageA(g_ddraw.hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(X, Y)); - - real_SendMessageA( - g_ddraw.hwnd, - WM_SIZE_DDRAW, - 0, - MAKELPARAM(min(nWidth, g_ddraw.width), min(nHeight, g_ddraw.height))); - } - return TRUE; } - else if (!IsChild(g_ddraw.hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) + else if (!IsChild(g_ddraw->hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) { POINT pt = { 0, 0 }; - if (real_ClientToScreen(g_ddraw.hwnd, &pt)) + if (real_ClientToScreen(g_ddraw->hwnd, &pt)) { X += pt.x; Y += pt.y; } } - else if (hWnd == g_ddraw.textbox.hwnd && IsWindow(hWnd) && GetParent(hWnd) == g_ddraw.hwnd && g_ddraw.width) - { - /* Age Of Empires 2 textbox align */ - char class_name[MAX_PATH] = { 0 }; - GetClassNameA(hWnd, class_name, sizeof(class_name) - 1); - - if (_strcmpi(class_name, "Edit") == 0) - { - g_ddraw.textbox.x = X; - g_ddraw.textbox.y = Y; - - X = (int)(g_ddraw.render.viewport.x + (X * g_ddraw.render.scale_w)); - Y = (int)(g_ddraw.render.viewport.y + (Y * g_ddraw.render.scale_h)); - } - } } return real_MoveWindow(hWnd, X, Y, nWidth, nHeight, bRepaint); @@ -414,51 +384,54 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { - if (!g_ddraw.ref || !g_ddraw.hwnd) - return real_SendMessageA(hWnd, Msg, wParam, lParam); - - if (g_ddraw.hwnd == hWnd && Msg == WM_MOUSEMOVE) + if (g_ddraw && g_ddraw->hwnd == hWnd && Msg == WM_MOUSEMOVE) { int x = GET_X_LPARAM(lParam); int y = GET_Y_LPARAM(lParam); - if (g_config.adjmouse) + if (g_ddraw->adjmouse) { - x = (int)(roundf(x * g_ddraw.mouse.scale_x)); - y = (int)(roundf(y * g_ddraw.mouse.scale_y)); + x = (int)(roundf(x * g_ddraw->render.scale_w)); + y = (int)(roundf(y * g_ddraw->render.scale_h)); } - lParam = MAKELPARAM(x + g_ddraw.mouse.x_adjust, y + g_ddraw.mouse.y_adjust); + lParam = MAKELPARAM(x + g_ddraw->mouse.x_adjust, y + g_ddraw->mouse.y_adjust); } - if (g_ddraw.hwnd == hWnd && Msg == WM_SIZE && g_config.hook != 2) + if (g_ddraw && g_ddraw->hwnd == hWnd && Msg == WM_SIZE && (g_hook_method != 2 && g_hook_method != 3)) { Msg = WM_SIZE_DDRAW; } LRESULT result = real_SendMessageA(hWnd, Msg, wParam, lParam); - if (result && g_ddraw.ref && Msg == CB_GETDROPPEDCONTROLRECT) + if (result && g_ddraw && Msg == CB_GETDROPPEDCONTROLRECT) { RECT* rc = (RECT*)lParam; if (rc) - real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)rc, 2); + real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)rc, 2); } return result; } +static WNDPROC g_compat_wndproc; +LRESULT CALLBACK compat_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return CallWindowProcA(g_compat_wndproc, hWnd, uMsg, wParam, lParam); +} + LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) { - if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.hwnd == hWnd) + if (g_ddraw && g_ddraw->hwnd == hWnd) { if (nIndex == GWL_STYLE) return 0; if (nIndex == GWL_WNDPROC) { - WNDPROC old = g_ddraw.wndproc; - g_ddraw.wndproc = (WNDPROC)dwNewLong; + WNDPROC old = g_ddraw->wndproc; + g_ddraw->wndproc = (WNDPROC)dwNewLong; return (LONG)old; } @@ -467,24 +440,13 @@ LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) return real_SetWindowLongA(hWnd, nIndex, dwNewLong); } -LONG WINAPI fake_SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong) -{ - if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.hwnd == hWnd) - { - if (nIndex == GWL_STYLE) - return 0; - } - - return real_SetWindowLongW(hWnd, nIndex, dwNewLong); -} - LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex) { - if (g_ddraw.ref && g_ddraw.hwnd == hWnd) + if (g_ddraw && g_ddraw->hwnd == hWnd) { if (nIndex == GWL_WNDPROC) { - return (LONG)g_ddraw.wndproc; + return (LONG)g_ddraw->wndproc; } } @@ -493,7 +455,7 @@ LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex) BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable) { - if (g_ddraw.ref && g_ddraw.hwnd == hWnd) + if (g_ddraw && g_ddraw->hwnd == hWnd) { return FALSE; } @@ -503,31 +465,31 @@ BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable) int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints) { - if (g_ddraw.ref && g_ddraw.hwnd) + if (g_ddraw) { if (hWndTo == HWND_DESKTOP) { - if (hWndFrom == g_ddraw.hwnd) + if (hWndFrom == g_ddraw->hwnd) { return 0; } else { - real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); - return real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, lpPoints, cPoints); + //real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); + //return real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, lpPoints, cPoints); } } if (hWndFrom == HWND_DESKTOP) { - if (hWndTo == g_ddraw.hwnd) + if (hWndTo == g_ddraw->hwnd) { return 0; } else { - real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, lpPoints, cPoints); - return real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); + //real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, lpPoints, cPoints); + //return real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); } } } @@ -537,1465 +499,159 @@ int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UI BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) { - /* Don't hide the taskbar (Some of The Learning Company games) */ - if (nCmdShow == SW_HIDE && hWnd && hWnd != g_ddraw.hwnd && hWnd == FindWindowA("Shell_TrayWnd", NULL)) + if (g_ddraw && g_ddraw->hwnd == hWnd) { - return TRUE; - } - - if (g_ddraw.ref && g_ddraw.hwnd == hWnd) - { - /* Make sure we got close/move menu items (Almost all of the The Learning Company games) */ - HMENU menu = GetSystemMenu(hWnd, FALSE); - if (!menu || GetMenuState(menu, SC_CLOSE, MF_BYCOMMAND) == -1 || GetMenuState(menu, SC_MOVE, MF_BYCOMMAND) == -1) - { - GetSystemMenu(hWnd, TRUE); - } - if (nCmdShow == SW_SHOWMAXIMIZED) nCmdShow = SW_SHOWNORMAL; if (nCmdShow == SW_MAXIMIZE) nCmdShow = SW_NORMAL; - if (nCmdShow == SW_MINIMIZE && g_config.hook != 2 && !g_config.tlc_hack) + if (nCmdShow == SW_MINIMIZE && (g_hook_method != 2 && g_hook_method != 3)) return TRUE; } return real_ShowWindow(hWnd, nCmdShow); } -HWND WINAPI fake_GetTopWindow(HWND hWnd) -{ - if (g_ddraw.ref && g_config.windowed && g_ddraw.hwnd && !hWnd) - { - return g_ddraw.hwnd; - } - - return real_GetTopWindow(hWnd); -} - -HWND WINAPI fake_GetForegroundWindow() -{ - if (g_ddraw.ref && g_config.windowed && g_ddraw.hwnd) - { - return g_ddraw.hwnd; - } - - return real_GetForegroundWindow(); -} - BOOL WINAPI fake_SetForegroundWindow(HWND hWnd) { - if (g_ddraw.ref && g_ddraw.bnet_active) - { - return TRUE; - } - - return real_SetForegroundWindow(hWnd); + return TRUE; } HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId) { - TRACE( - "SetWindowsHookExA(idHook=%d, lpfn=%p, hmod=%p, dwThreadId=%d) [%p]\n", - idHook, - lpfn, - hmod, - dwThreadId, - _ReturnAddress()); - - dbg_dump_hook_type(idHook); - if (idHook == WH_KEYBOARD_LL && hmod && GetModuleHandle("AcGenral") == hmod) { return NULL; } - if (idHook == WH_MOUSE && lpfn && !hmod && !g_mouse_hook && g_config.sirtech_hack) + if (idHook == WH_MOUSE && lpfn && !hmod && !g_mouse_hook && cfg_get_bool("fixmousehook", FALSE)) { g_mouse_proc = lpfn; return g_mouse_hook = real_SetWindowsHookExA(idHook, mouse_hook_proc, hmod, dwThreadId); } - HHOOK result = real_SetWindowsHookExA(idHook, lpfn, hmod, dwThreadId); - - if (idHook == WH_KEYBOARD) - { - keyboard_hook_init(); - } - - return result; -} - -void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) -{ - if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) - { - if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) - { - int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); - int y = max(lpMsg->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)); - } - - lpMsg->pt.x = min(x, g_ddraw.width - 1); - lpMsg->pt.y = min(y, g_ddraw.height - 1); - } - else - { - lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); - } - - if (lpMsg->hwnd != g_ddraw.hwnd || !g_config.hook_peekmessage) - return; - - switch (LOWORD(lpMsg->message)) - { - case WM_LBUTTONUP: - case WM_RBUTTONUP: - case WM_MBUTTONUP: - { - if (!g_config.devmode && !g_mouse_locked && (wRemoveMsg & PM_REMOVE)) - { - int x = GET_X_LPARAM(lpMsg->lParam); - int y = GET_Y_LPARAM(lpMsg->lParam); - - if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || - x < g_ddraw.render.viewport.x || - y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || - y < g_ddraw.render.viewport.y) - { - x = g_ddraw.width / 2; - y = g_ddraw.height / 2; - } - else - { - x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); - y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); - } - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - mouse_lock(); - - if (!wMsgFilterMin && - !wMsgFilterMax && - !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) - { - lpMsg->message = WM_NULL; - break; - } - } - /* fall through for lParam */ - } - /* down messages are ignored if we have no cursor lock */ - case WM_XBUTTONDBLCLK: - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - case WM_MOUSEWHEEL: - case WM_MOUSEHOVER: - case WM_LBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_MOUSEMOVE: - { - if (!g_config.devmode && !g_mouse_locked) - { - if (!wMsgFilterMin && - !wMsgFilterMax && - !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) - { - lpMsg->message = WM_NULL; - break; - } - } - - if (LOWORD(lpMsg->message) == WM_MOUSEWHEEL) - { - POINT pt = { GET_X_LPARAM(lpMsg->lParam), GET_Y_LPARAM(lpMsg->lParam) }; - real_ScreenToClient(g_ddraw.hwnd, &pt); - lpMsg->lParam = MAKELPARAM(pt.x, pt.y); - } - - int x = max(GET_X_LPARAM(lpMsg->lParam) - g_ddraw.mouse.x_adjust, 0); - int y = max(GET_Y_LPARAM(lpMsg->lParam) - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - if (g_config.vhack && !g_config.devmode) - { - POINT pt = { 0, 0 }; - fake_GetCursorPos(&pt); - - x = pt.x; - y = pt.y; - } - else - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - } - - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - lpMsg->lParam = MAKELPARAM(x, y); - - lpMsg->pt.x = x; - lpMsg->pt.y = y; - - break; - } - } - } -} - -BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) -{ - if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) - g_ddraw.last_msg_pull_tick = timeGetTime(); - - BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - if (result) - { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, PM_REMOVE); - } - - return result; -} - -BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) -{ - if (g_config.darkcolony_hack && !hWnd) - { - hWnd = g_ddraw.hwnd; - - MSG msg; - real_PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); - } - - if (g_config.limiter_type == LIMIT_PEEKMESSAGE && - g_ddraw.ticks_limiter.tick_length > 0 && - InterlockedExchange(&g_ddraw.render.screen_updated, FALSE)) - { - util_limit_game_ticks(); - } - - if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) - g_ddraw.last_msg_pull_tick = timeGetTime(); - - BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - if (result) - { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - } - - return result; -} - -BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) -{ - BOOL result = real_GetWindowPlacement(hWnd, lpwndpl); - - if (result && - lpwndpl && - g_ddraw.ref && - g_ddraw.hwnd && - g_ddraw.width && - (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) - { - if (hWnd == g_ddraw.hwnd || hWnd == GetDesktopWindow()) - { - lpwndpl->rcNormalPosition.bottom = g_ddraw.height; - lpwndpl->rcNormalPosition.left = 0; - lpwndpl->rcNormalPosition.right = g_ddraw.width; - lpwndpl->rcNormalPosition.top = 0; - } - else if (!IsChild(g_ddraw.hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) - { - real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)&lpwndpl->rcNormalPosition, 2); - } - } - - return result; -} - -BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl) -{ - if (lpwndpl && g_ddraw.ref && g_ddraw.hwnd && hWnd == g_ddraw.hwnd) - { - if (lpwndpl->showCmd == SW_SHOWMAXIMIZED || lpwndpl->showCmd == SW_MAXIMIZE) - return TRUE; - } - - return real_SetWindowPlacement(hWnd, lpwndpl); -} - -BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode) -{ - BOOL result = real_EnumDisplaySettingsA(lpszDeviceName, iModeNum, lpDevMode); - - if (result && !lpszDeviceName && lpDevMode && iModeNum == ENUM_CURRENT_SETTINGS) - { - if (g_ddraw.ref && g_ddraw.width) - { - lpDevMode->dmPelsWidth = g_ddraw.width; - lpDevMode->dmPelsHeight = g_ddraw.height; - lpDevMode->dmBitsPerPel = g_ddraw.bpp; - } - else if (g_config.fake_mode[0]) - { - char* e = &g_config.fake_mode[0]; - - lpDevMode->dmPelsWidth = strtoul(e, &e, 0); - lpDevMode->dmPelsHeight = strtoul(e + 1, &e, 0); - lpDevMode->dmBitsPerPel = strtoul(e + 1, &e, 0); - } - else - { - lpDevMode->dmPelsWidth = 1024; - lpDevMode->dmPelsHeight = 768; - lpDevMode->dmBitsPerPel = 16; - } - - lpDevMode->dmDisplayFrequency = 60; - } - - if (result && !lpszDeviceName && lpDevMode && iModeNum != ENUM_CURRENT_SETTINGS) - { - //lpDevMode->dmBitsPerPel = 16; - } - - return result; -} - -LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.hwnd == hWnd) - { - if (Msg == WM_NCHITTEST) - return HTCLIENT; - } - - return real_DefWindowProcA(hWnd, Msg, wParam, lParam); -} - -HWND WINAPI fake_SetParent(HWND hWndChild, HWND hWndNewParent) -{ - if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.hwnd == hWndNewParent) - { - char class_name[MAX_PATH] = { 0 }; - GetClassNameA(hWndChild, class_name, sizeof(class_name) - 1); - - if (strcmp(class_name, "VideoRenderer") == 0) - { - RECT rc_org; - fake_GetWindowRect(hWndChild, &rc_org); - - HWND result = real_SetParent(hWndChild, hWndNewParent); - - real_MoveWindow( - hWndChild, - rc_org.left, - rc_org.top, - (rc_org.right - rc_org.left), - (rc_org.bottom - rc_org.top), - FALSE); - - return result; - } - } - - return real_SetParent(hWndChild, hWndNewParent); -} - -HDC WINAPI fake_BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint) -{ - if (g_ddraw.ref && g_ddraw.width && g_ddraw.hwnd && g_ddraw.hwnd == hWnd && lpPaint) - { - HDC result = real_BeginPaint(hWnd, lpPaint); - - if (result) - { - lpPaint->rcPaint.left = 0; - lpPaint->rcPaint.top = 0; - lpPaint->rcPaint.right = g_ddraw.width; - lpPaint->rcPaint.bottom = g_ddraw.height; - } - - return result; - } - - return real_BeginPaint(hWnd, lpPaint); -} - -SHORT WINAPI fake_GetKeyState(int nVirtKey) -{ - if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) - { - return 0; - } - - return real_GetKeyState(nVirtKey); -} - -SHORT WINAPI fake_GetAsyncKeyState(int vKey) -{ - if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) - { - return 0; - } - - return real_GetAsyncKeyState(vKey); + return real_SetWindowsHookExA(idHook, lpfn, hmod, dwThreadId); } int WINAPI fake_GetDeviceCaps(HDC hdc, int index) { - DWORD bpp = 0; - DWORD width = 0; - DWORD height = 0; - - if (g_ddraw.ref && g_ddraw.bpp) + if (g_ddraw && + g_ddraw->bpp && + index == BITSPIXEL && + (g_hook_method != 2 || g_ddraw->renderer == gdi_render_main)) { - bpp = g_ddraw.bpp; - width = g_ddraw.width; - height = g_ddraw.height; - } - else if (g_config.fake_mode[0]) - { - char* e = &g_config.fake_mode[0]; - - width = strtoul(e, &e, 0); - height = strtoul(e + 1, &e, 0); - bpp = strtoul(e + 1, &e, 0); - } - - if (bpp && index == BITSPIXEL) - { - return bpp; - } - - if (bpp == 8) - { - if (index == RASTERCAPS) - { - return RC_PALETTE | real_GetDeviceCaps(hdc, index); - } - - if (index == SIZEPALETTE) - { - return 256; - } - - if (index == NUMCOLORS) - { - if (WindowFromDC(hdc) == GetDesktopWindow()) - { - return 20; - } - else - { - return 256; - } - } - } - - if (width && ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) - { - if (index == HORZRES) - { - return width; - } - - if (index == VERTRES) - { - return height; - } + return g_ddraw->bpp; } return real_GetDeviceCaps(hdc, index); } -int WINAPI fake_GetDeviceCaps_system(HDC hdc, int index) -{ - if (g_ddraw.ref && - g_ddraw.bpp == 8 && - ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) - { - if (index == RASTERCAPS) - { - return RC_PALETTE | real_GetDeviceCaps(hdc, index); - } - } - - return real_GetDeviceCaps(hdc, index); -} - -BOOL WINAPI fake_StretchBlt( - HDC hdcDest, - int xDest, - int yDest, - int wDest, - int hDest, - HDC hdcSrc, - int xSrc, - int ySrc, - int wSrc, - int hSrc, - DWORD rop) -{ - HWND hwnd = WindowFromDC(hdcDest); - - if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd && !g_ddraw.primary) - { - InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); - } - - char class_name[MAX_PATH] = { 0 }; - - if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) - { - GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); - } - - if (g_ddraw.ref && g_ddraw.hwnd && - (hwnd == g_ddraw.hwnd || - (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && - (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || - strcmp(class_name, "VideoRenderer") == 0 || - strcmp(class_name, "AVI Window") == 0 || - strcmp(class_name, "MCIAVI") == 0 || - strcmp(class_name, "AVIWnd32") == 0 || - strcmp(class_name, "MCIWndClass") == 0)))) - { - if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) - { - HDC primary_dc; - dds_GetDC(g_ddraw.primary, &primary_dc); - - if (primary_dc) - { - POINT pt = { 0 }; - real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); - - int org_mode = SetStretchBltMode(hdcDest, COLORONCOLOR); - SetStretchBltMode(hdcDest, org_mode); - - int mode = SetStretchBltMode(primary_dc, org_mode); - - BOOL result = - real_StretchBlt( - primary_dc, - xDest + pt.x, - yDest + pt.y, - wDest, - hDest, - hdcSrc, - xSrc, - ySrc, - wSrc, - hSrc, - rop); - - SetStretchBltMode(primary_dc, mode); - - dds_ReleaseDC(g_ddraw.primary, primary_dc); - - return result; - } - } - else if ( - g_ddraw.width > 0 && - g_ddraw.render.hdc && - (hwnd == g_ddraw.hwnd || - (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT) || - strcmp(class_name, "AVIWnd32") == 0)) - { - POINT pt = { 0 }; - real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); - - if (hwnd != g_ddraw.hwnd && strcmp(class_name, "AVIWnd32") == 0) - { - LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - if (!(exstyle & WS_EX_TRANSPARENT)) - { - real_SetWindowLongA(hwnd, GWL_EXSTYLE, exstyle | WS_EX_TRANSPARENT); - - real_SetWindowPos( - hwnd, - 0, - 0, - 0, - 0, - 0, - SWP_ASYNCWINDOWPOS | SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER - ); - } - } - - return real_StretchBlt( - hwnd == g_ddraw.hwnd ? hdcDest : g_ddraw.render.hdc, - (int)(roundf((xDest + pt.x) * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x, - (int)(roundf((yDest + pt.y) * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y, - (int)(roundf(wDest * g_ddraw.render.scale_w)), - (int)(roundf(hDest * g_ddraw.render.scale_h)), - hdcSrc, - xSrc, - ySrc, - wSrc, - hSrc, - rop); - } - } - - return real_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); -} - -BOOL WINAPI fake_WinGStretchBlt( - HDC hdcDest, - int xDest, - int yDest, - int wDest, - int hDest, - HDC hdcSrc, - int xSrc, - int ySrc, - int wSrc, - int hSrc) -{ - int mode = SetStretchBltMode(hdcDest, COLORONCOLOR); - BOOL result = fake_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, SRCCOPY); - SetStretchBltMode(hdcDest, mode); - - return result; -} - -BOOL WINAPI fake_BitBlt( - HDC hdc, - int x, - int y, - int cx, - int cy, - HDC hdcSrc, - int x1, - int y1, - DWORD rop) -{ - HWND hwnd = WindowFromDC(hdc); - - if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd && !g_ddraw.primary) - { - InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); - } - - char class_name[MAX_PATH] = { 0 }; - - if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) - { - GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); - } - - if (g_ddraw.ref && g_ddraw.hwnd && - (hwnd == g_ddraw.hwnd || - (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && - (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || - strcmp(class_name, "VideoRenderer") == 0 || - strcmp(class_name, "AVI Window") == 0 || - strcmp(class_name, "MCIAVI") == 0 || - strcmp(class_name, "AVIWnd32") == 0 || - strcmp(class_name, "MCIWndClass") == 0)))) - { - if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) - { - HDC primary_dc; - dds_GetDC(g_ddraw.primary, &primary_dc); - - if (primary_dc) - { - POINT pt = { 0 }; - real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); - - int result = - real_BitBlt( - primary_dc, - x + pt.x, - y + pt.y, - cx, - cy, - hdcSrc, - x1, - y1, - rop); - - dds_ReleaseDC(g_ddraw.primary, primary_dc); - - return result; - } - } - else if ( - g_ddraw.width > 0 && - g_ddraw.render.hdc && - (hwnd == g_ddraw.hwnd || (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT))) - { - return real_StretchBlt( - hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc, - (int)(roundf(x * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x, - (int)(roundf(y * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y, - (int)(roundf(cx * g_ddraw.render.scale_w)), - (int)(roundf(cy * g_ddraw.render.scale_h)), - hdcSrc, - x1, - y1, - cx, - cy, - rop); - } - } - - return real_BitBlt(hdc, x, y, cx, cy, hdcSrc, x1, y1, rop); -} - -BOOL WINAPI fake_WinGBitBlt( - HDC hdc, - int x, - int y, - int cx, - int cy, - HDC hdcSrc, - int x1, - int y1) -{ - return fake_BitBlt(hdc, x, y, cx, cy, hdcSrc, x1, y1, SRCCOPY); -} - -int WINAPI fake_SetDIBitsToDevice( - HDC hdc, - int xDest, - int yDest, - DWORD w, - DWORD h, - int xSrc, - int ySrc, - UINT StartScan, - UINT cLines, - const VOID* lpvBits, - const BITMAPINFO* lpbmi, - UINT ColorUse) -{ - HWND hwnd = WindowFromDC(hdc); - - if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd && !g_ddraw.primary) - { - InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); - } - - char class_name[MAX_PATH] = { 0 }; - - if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) - { - GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); - } - - if (g_ddraw.ref && g_ddraw.hwnd && - (hwnd == g_ddraw.hwnd || - (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && - (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || - strcmp(class_name, "VideoRenderer") == 0 || - strcmp(class_name, "AVI Window") == 0 || - strcmp(class_name, "MCIAVI") == 0 || - strcmp(class_name, "AVIWnd32") == 0 || - strcmp(class_name, "MCIWndClass") == 0)))) - { - if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) - { - HDC primary_dc; - dds_GetDC(g_ddraw.primary, &primary_dc); - - if (primary_dc) - { - POINT pt = { 0 }; - real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); - - int result = - real_SetDIBitsToDevice( - primary_dc, - xDest + pt.x, - yDest + pt.y, - w, - h, - xSrc, - ySrc, - StartScan, - cLines, - lpvBits, - lpbmi, - ColorUse); - - dds_ReleaseDC(g_ddraw.primary, primary_dc); - - return result; - } - } - else if ( - g_ddraw.width > 0 && - g_ddraw.render.hdc && - (hwnd == g_ddraw.hwnd || (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT))) - { - return - real_StretchDIBits( - hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc, - (int)(roundf(xDest * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x, - (int)(roundf(yDest * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y, - (int)(roundf(w * g_ddraw.render.scale_w)), - (int)(roundf(h * g_ddraw.render.scale_h)), - xSrc, - ySrc, - w, - h, - lpvBits, - lpbmi, - ColorUse, - SRCCOPY); - } - } - - return real_SetDIBitsToDevice(hdc, xDest, yDest, w, h, xSrc, ySrc, StartScan, cLines, lpvBits, lpbmi, ColorUse); -} - -int WINAPI fake_StretchDIBits( - HDC hdc, - int xDest, - int yDest, - int DestWidth, - int DestHeight, - int xSrc, - int ySrc, - int SrcWidth, - int SrcHeight, - const VOID* lpBits, - const BITMAPINFO* lpbmi, - UINT iUsage, - DWORD rop) -{ - HWND hwnd = WindowFromDC(hdc); - - if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd && !g_ddraw.primary) - { - InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); - } - - char class_name[MAX_PATH] = { 0 }; - - if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) - { - GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); - } - - if (g_ddraw.ref && g_ddraw.hwnd && - (hwnd == g_ddraw.hwnd || - (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && - (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || - strcmp(class_name, "VideoRenderer") == 0 || - strcmp(class_name, "AVI Window") == 0 || - strcmp(class_name, "MCIAVI") == 0 || - strcmp(class_name, "AVIWnd32") == 0 || - strcmp(class_name, "MCIWndClass") == 0)))) - { - if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) - { - HDC primary_dc; - dds_GetDC(g_ddraw.primary, &primary_dc); - - if (primary_dc) - { - POINT pt = {0}; - real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); - - int result = - real_StretchDIBits( - primary_dc, - xDest + pt.x, - yDest + pt.y, - DestWidth, - DestHeight, - xSrc, - ySrc, - SrcWidth, - SrcHeight, - lpBits, - lpbmi, - iUsage, - rop); - - dds_ReleaseDC(g_ddraw.primary, primary_dc); - - return result; - } - } - else if ( - g_ddraw.width > 0 && - g_ddraw.render.hdc && - (hwnd == g_ddraw.hwnd || (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT))) - { - return - real_StretchDIBits( - hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc, - (int)(roundf(xDest * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x, - (int)(roundf(yDest * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y, - (int)(roundf(DestWidth * g_ddraw.render.scale_w)), - (int)(roundf(DestHeight * g_ddraw.render.scale_h)), - xSrc, - ySrc, - SrcWidth, - SrcHeight, - lpBits, - lpbmi, - iUsage, - rop); - } - } - - return - real_StretchDIBits( - hdc, - xDest, - yDest, - DestWidth, - DestHeight, - xSrc, - ySrc, - SrcWidth, - SrcHeight, - lpBits, - lpbmi, - iUsage, - rop); -} - HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA* lplf) { LOGFONTA lf; memcpy(&lf, lplf, sizeof(lf)); - - if (lf.lfHeight < 0) { - lf.lfHeight = min(-g_config.min_font_size, lf.lfHeight); - } - else { - lf.lfHeight = max(g_config.min_font_size, lf.lfHeight); - } - - if (g_config.anti_aliased_fonts_min_size > abs(lf.lfHeight)) - lf.lfQuality = NONANTIALIASED_QUALITY; + lf.lfQuality = NONANTIALIASED_QUALITY; return real_CreateFontIndirectA(&lf); } -HFONT WINAPI fake_CreateFontA( - int nHeight, - int nWidth, - int nEscapement, - int nOrientation, - int fnWeight, - DWORD fdwItalic, - DWORD fdwUnderline, - DWORD fdwStrikeOut, - DWORD fdwCharSet, - DWORD fdwOutputPrecision, - DWORD fdwClipPrecision, - DWORD fdwQuality, - DWORD fdwPitchAndFamily, +HFONT WINAPI fake_CreateFontA(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, + DWORD fdwItalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet, + DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily, LPCTSTR lpszFace) { - if (nHeight < 0) { - nHeight = min(-g_config.min_font_size, nHeight); - } - else { - nHeight = max(g_config.min_font_size, nHeight); - } - - if (g_config.anti_aliased_fonts_min_size > abs(nHeight)) - fdwQuality = NONANTIALIASED_QUALITY; + fdwQuality = NONANTIALIASED_QUALITY; return real_CreateFontA( - nHeight, - nWidth, - nEscapement, - nOrientation, - fnWeight, - fdwItalic, - fdwUnderline, - fdwStrikeOut, - fdwCharSet, - fdwOutputPrecision, - fdwClipPrecision, - fdwQuality, - fdwPitchAndFamily, + nHeight, nWidth, nEscapement, nOrientation, fnWeight, + fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, + fdwOutputPrecision, fdwClipPrecision, fdwQuality, fdwPitchAndFamily, lpszFace); } -UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LPPALETTEENTRY pPalEntries) -{ - TRACE( - "%s(hdc=%p, iStart=%u, cEntries=%u, pPalEntries=%p) [%p]\n", - __FUNCTION__, - hdc, - iStart, - cEntries, - pPalEntries, - _ReturnAddress()); - - if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && GetObjectType(hdc) == OBJ_DC) - { - TRACE(" Display DC\n"); - - if (g_ddraw.primary && g_ddraw.primary->palette) - { - ddp_GetEntries(g_ddraw.primary->palette, 0, iStart, cEntries, pPalEntries); - } - else - { - for (int i = iStart, x = 0; i < iStart + cEntries && i < 256; i++, x++) - { - pPalEntries[x] = g_ddp_default_palette[i]; - } - } - - return cEntries; - } - - return real_GetSystemPaletteEntries(hdc, iStart, cEntries, pPalEntries); -} - -HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) -{ - TRACE_EXT( - "%s(hdc=%p, hPal=%p, bForceBkgd=%d) [%p]\n", - __FUNCTION__, - hdc, - hPal, - bForceBkgd, - _ReturnAddress()); - - if (g_ddraw.ref && - g_ddraw.bpp == 8 && - ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) - { - TRACE_EXT(" Display DC\n"); - - if (g_ddraw.primary && g_ddraw.primary->palette) - { - g_ddraw.primary->selected_pal_count = GetPaletteEntries(hPal, 0, 256, g_ddraw.primary->selected_pal); - - return real_SelectPalette(g_ddraw.primary->hdc, hPal, bForceBkgd);; - } - } - - return real_SelectPalette(hdc, hPal, bForceBkgd); -} - -UINT WINAPI fake_RealizePalette(HDC hdc) -{ - TRACE_EXT("%s(hdc=%p) [%p]\n", __FUNCTION__, hdc, _ReturnAddress()); - - if (g_ddraw.ref && - g_ddraw.bpp == 8 && - ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) - { - TRACE_EXT(" Display DC\n"); - - if (g_ddraw.primary && g_ddraw.primary->palette) - { - if (g_ddraw.primary->selected_pal_count != 256) - { - TRACE_EXT(" selected_pal_count = %u\n", g_ddraw.primary->selected_pal_count); - } - - ddp_SetEntries( - g_ddraw.primary->palette, - DDPCAPS_REFRESH_CHANGED_ONLY, - 0, - g_ddraw.primary->selected_pal_count, - g_ddraw.primary->selected_pal); - - return g_ddraw.primary->selected_pal_count; - } - } - - return real_RealizePalette(hdc); -} - HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { - HMODULE hmod_old = GetModuleHandleA(lpLibFileName); HMODULE hmod = real_LoadLibraryA(lpLibFileName); -#ifdef _DEBUG - char mod_path[MAX_PATH] = { 0 }; - if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) - { - TRACE("LoadLibraryA Module %s = %p (%s) [%p]\n", mod_path, hmod, lpLibFileName, _ReturnAddress()); - } -#endif - - if (hmod && hmod != g_ddraw_module && lpLibFileName && - (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || - _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) - { - dinput_hook_init(); - } - - if (hmod && hmod != hmod_old) - { - hook_init(); - } + hook_init(); return hmod; } HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName) { - HMODULE hmod_old = GetModuleHandleW(lpLibFileName); HMODULE hmod = real_LoadLibraryW(lpLibFileName); -#ifdef _DEBUG - char mod_path[MAX_PATH] = { 0 }; - if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) - { - TRACE("LoadLibraryW Module %s = %p [%p]\n", mod_path, hmod, _ReturnAddress()); - } -#endif - - if (hmod && hmod != g_ddraw_module && lpLibFileName && - (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || - _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) - { - dinput_hook_init(); - } - - if (hmod && hmod != hmod_old) - { - hook_init(); - } + hook_init(); return hmod; } HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) { - HMODULE hmod_old = GetModuleHandleA(lpLibFileName); HMODULE hmod = real_LoadLibraryExA(lpLibFileName, hFile, dwFlags); -#ifdef _DEBUG - char mod_path[MAX_PATH] = { 0 }; - if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) - { - TRACE("LoadLibraryExA Module %s = %p (%s) [%p]\n", mod_path, hmod, lpLibFileName, _ReturnAddress()); - } -#endif - - if (hmod && hmod != g_ddraw_module && lpLibFileName && - (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || - _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) - { - dinput_hook_init(); - } - - if (hmod && hmod != hmod_old) - { - hook_init(); - } + hook_init(); return hmod; } HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) { - HMODULE hmod_old = GetModuleHandleW(lpLibFileName); HMODULE hmod = real_LoadLibraryExW(lpLibFileName, hFile, dwFlags); -#ifdef _DEBUG - char mod_path[MAX_PATH] = { 0 }; - if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) - { - TRACE("LoadLibraryExW Module %s = %p [%p]\n", mod_path, hmod, _ReturnAddress()); - } -#endif - - if (hmod && hmod != g_ddraw_module && lpLibFileName && - (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || - _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) - { - dinput_hook_init(); - } - - if (hmod && hmod != hmod_old) - { - hook_init(); - } + hook_init(); return hmod; } -FARPROC WINAPI fake_GetProcAddress(HMODULE hModule, LPCSTR lpProcName) -{ -#ifdef _DEBUG - char mod_path[MAX_PATH] = { 0 }; - if (hModule && GetModuleFileNameA(hModule, mod_path, MAX_PATH)) - { - TRACE("GetProcAddress %s (%s) [%p]\n", HIWORD(lpProcName) ? lpProcName : NULL, mod_path, _ReturnAddress()); - } -#endif - - BOOL hook = g_config.hook == 3; - -#if defined(__GNUC__) - if (g_config.hook == 4 && hModule && HIWORD(lpProcName)) - { - if (strcmp(lpProcName, "DirectInputCreateA") == 0 || - strcmp(lpProcName, "DirectInputCreateEx") == 0 || - strcmp(lpProcName, "DirectInput8Create") == 0) - { - hook = TRUE; - g_dinput_hook_active = TRUE; - } - } -#endif - - FARPROC proc = real_GetProcAddress(hModule, lpProcName); - - if (!hook || !hModule || !HIWORD(lpProcName)) - return proc; - - for (int i = 0; g_hook_hooklist[i].module_name[0]; i++) - { - HMODULE mod = GetModuleHandleA(g_hook_hooklist[i].module_name); - - if (hModule != mod) - continue; - - for (int x = 0; g_hook_hooklist[i].data[x].function_name[0]; x++) - { - if (strcmp(lpProcName, g_hook_hooklist[i].data[x].function_name) == 0) - { - return (FARPROC)g_hook_hooklist[i].data[x].new_function; - } - } - } - - return proc; -} - -BOOL WINAPI fake_GetDiskFreeSpaceA( - LPCSTR lpRootPathName, - LPDWORD lpSectorsPerCluster, - LPDWORD lpBytesPerSector, - LPDWORD lpNumberOfFreeClusters, - LPDWORD lpTotalNumberOfClusters) -{ - BOOL result = - real_GetDiskFreeSpaceA( - lpRootPathName, - lpSectorsPerCluster, - lpBytesPerSector, - lpNumberOfFreeClusters, - lpTotalNumberOfClusters); - - if (result && lpSectorsPerCluster && lpBytesPerSector && lpNumberOfFreeClusters) - { - long long int free_bytes = (long long int)*lpNumberOfFreeClusters * *lpSectorsPerCluster * *lpBytesPerSector; - - if (free_bytes >= 2147155968) - { - *lpSectorsPerCluster = 0x00000040; - *lpBytesPerSector = 0x00000200; - *lpNumberOfFreeClusters = 0x0000FFF6; - - if (lpTotalNumberOfClusters) - *lpTotalNumberOfClusters = 0x0000FFF6; - } - } - - return result; -} - -DWORD WINAPI fake_GetVersion() -{ - if (_strcmpi(g_config.win_version, "95") == 0) - return 0xC3B60004; - - if (_strcmpi(g_config.win_version, "98") == 0) - return 0xC0000A04; - - if (_strcmpi(g_config.win_version, "nt4") == 0) - return 0x05650004; - - if (_strcmpi(g_config.win_version, "2000") == 0) - return 0x08930005; - - if (_strcmpi(g_config.win_version, "xp") == 0) - return 0x0A280105; - - return real_GetVersion(); -} - -BOOL WINAPI fake_GetVersionExA(LPOSVERSIONINFOA info) -{ - if (g_config.win_version[0] && info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOA)) - { - if (_strcmpi(g_config.win_version, "95") == 0) - { - *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 4, 0, 950, 1, "" }; - return TRUE; - } - - if (_strcmpi(g_config.win_version, "98") == 0) - { - *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 4, 10, 67766446, 1, "" }; - return TRUE; - } - - if (_strcmpi(g_config.win_version, "nt4") == 0) - { - *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 4, 0, 1381, 2, "Service Pack 5" }; - return TRUE; - } - - if (_strcmpi(g_config.win_version, "2000") == 0) - { - *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 5, 0, 2195, 2, "" }; - return TRUE; - } - - if (_strcmpi(g_config.win_version, "xp") == 0) - { - *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 5, 1, 2600, 2, "Service Pack 3" }; - return TRUE; - } - } - - if (g_config.win_version[0] && info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXA)) - { - LPOSVERSIONINFOEXA ex = (LPOSVERSIONINFOEXA)info; - if (_strcmpi(g_config.win_version, "95") == 0) - { - *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 4, 0, 950, 1, "", 1, 0, 256, 1, 30 }; - return TRUE; - } - - if (_strcmpi(g_config.win_version, "98") == 0) - { - *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 4, 10, 67766446, 1, "", 1, 0, 256, 1, 30 }; - return TRUE; - } - - if (_strcmpi(g_config.win_version, "nt4") == 0) - { - *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 4, 0, 1381, 2, "Service Pack 5", 5, 0, 256, 1, 30 }; - return TRUE; - } - - if (_strcmpi(g_config.win_version, "2000") == 0) - { - *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 5, 0, 2195, 2, "", 0, 0, 256, 1, 30 }; - return TRUE; - } - - if (_strcmpi(g_config.win_version, "xp") == 0) - { - *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 5, 1, 2600, 2, "Service Pack 3", 3, 0, 256, 1, 30 }; - return TRUE; - } - } - - return real_GetVersionExA(info); -} - BOOL WINAPI fake_DestroyWindow(HWND hWnd) { - TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p [%p]\n", hWnd, g_ddraw.hwnd, _ReturnAddress()); - - if (g_ddraw.ref && hWnd && hWnd == g_ddraw.hwnd) - { - dd_RestoreDisplayMode(); - - if (g_ddraw.renderer == d3d9_render_main) - { - d3d9_release(); - } - else if (g_ddraw.renderer == ogl_render_main) - { - ogl_release(); - } - } - BOOL result = real_DestroyWindow(hWnd); - if (result && g_ddraw.ref && hWnd && hWnd == g_ddraw.hwnd) - { - g_ddraw.hwnd = NULL; - g_ddraw.wndproc = NULL; - g_ddraw.render.hdc = NULL; - - if (g_config.fake_mode[0]) - { - dd_SetCooperativeLevel(NULL, DDSCL_NORMAL); - } - } - - if (g_ddraw.ref && g_ddraw.hwnd != hWnd && g_ddraw.bnet_active) + if (g_ddraw && g_ddraw->hwnd != hWnd && g_ddraw->bnet_active) { RedrawWindow(NULL, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); if (!FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL)) { - g_ddraw.bnet_active = FALSE; - SetFocus(g_ddraw.hwnd); + KillTimer(g_ddraw->hwnd, IDT_TIMER_REDRAW_BNET); + g_ddraw->bnet_active = FALSE; + SetFocus(g_ddraw->hwnd); mouse_lock(); - if (g_config.windowed) + if (g_ddraw->windowed) { - g_ddraw.bnet_pos.x = g_ddraw.bnet_pos.y = 0; - real_ClientToScreen(g_ddraw.hwnd, &g_ddraw.bnet_pos); + g_ddraw->bnet_pos.x = g_ddraw->bnet_pos.y = 0; + real_ClientToScreen(g_ddraw->hwnd, &g_ddraw->bnet_pos); - if (!g_ddraw.bnet_was_upscaled) + if (!g_ddraw->bnet_was_upscaled) { - int width = g_ddraw.bnet_win_rect.right - g_ddraw.bnet_win_rect.left; - int height = g_ddraw.bnet_win_rect.bottom - g_ddraw.bnet_win_rect.top; + int width = g_ddraw->bnet_win_rect.right - g_ddraw->bnet_win_rect.left; + int height = g_ddraw->bnet_win_rect.bottom - g_ddraw->bnet_win_rect.top; - UINT flags = width != g_ddraw.width || height != g_ddraw.height ? 0 : SWP_NOMOVE; + UINT flags = width != g_ddraw->width || height != g_ddraw->height ? 0 : SWP_NOMOVE; - int dst_width = width == g_ddraw.width ? 0 : width; - int dst_height = height == g_ddraw.height ? 0 : height; + int dst_width = width == g_ddraw->width ? 0 : width; + int dst_height = height == g_ddraw->height ? 0 : height; util_set_window_rect( - g_ddraw.bnet_win_rect.left, - g_ddraw.bnet_win_rect.top, + g_ddraw->bnet_win_rect.left, + g_ddraw->bnet_win_rect.top, dst_width, dst_height, flags); } - - g_config.fullscreen = g_ddraw.bnet_was_upscaled; - - SetTimer(g_ddraw.hwnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL); - - g_config.resizable = TRUE; } + + g_ddraw->fullscreen = g_ddraw->bnet_was_upscaled; + + SetTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL); + + g_ddraw->resizable = TRUE; } } @@ -2006,236 +662,100 @@ HWND WINAPI fake_CreateWindowExA( DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam) { - TRACE("-> CreateWindowExA(" - "dwExStyle=%08X, lpClassName=%p, lpWindowName=%p, dwStyle=%08X, X=%d, Y=%d, nWidth=%d, " - "nHeight=%d, hWndParent=%p, hMenu=%p, hInstance=%p, lpParam=%p) [%p]\n", - dwExStyle, - lpClassName, - lpWindowName, - dwStyle, - X, - Y, - nWidth, - nHeight, - hWndParent, - hMenu, - hInstance, - lpParam, - _ReturnAddress()); - - TRACE(" WindowName=%s, ClassName=%s, g_ddraw.hwnd=%p\n", lpWindowName, HIWORD(lpClassName) ? lpClassName : "", g_ddraw.hwnd); - - dbg_dump_wnd_styles(dwStyle, dwExStyle); - - /* Almost all of the Learning Company Games */ - if (!dwExStyle && - HIWORD(lpClassName) && _strcmpi(lpClassName, "OMWindowChildClass") == 0 && - !lpWindowName && - dwStyle == (WS_CHILD | WS_CHILDWINDOW | WS_CLIPSIBLINGS) && - !X && - !Y && - g_ddraw.ref && g_ddraw.width && g_ddraw.width == nWidth && g_ddraw.height == nHeight && - g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && - !hMenu && - !g_config.game_section[0]) - { - dwExStyle = WS_EX_TRANSPARENT; - g_config.lock_mouse_top_left = TRUE; - g_config.adjmouse = FALSE; - dd_SetDisplayMode(0, 0, 0, 0); - } - - /* The American Girls Dress Designer */ - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "AfxFrameOrView42s") == 0 && - g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && - g_config.fake_mode[0] && - (dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD)) - { - dwStyle &= ~WS_POPUP; - } - - /* Dark Colony */ - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Merc Direct Draw Driver") == 0 && - lpWindowName && _strcmpi(lpWindowName, "Direct Draw Driver") == 0 && - !dwExStyle) - { - dwExStyle |= WS_EX_APPWINDOW; - } - - /* Fallout 1/2 */ - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "GNW95 Class") == 0 && - lpWindowName && strstr(lpWindowName, "FALLOUT")) - { - /* Workaround for window not showing up in taskbar sometimes */ - dwExStyle |= WS_EX_APPWINDOW; - } - - /* Fallout Tactics */ - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "bosWin32Class") == 0 && - lpWindowName && _strcmpi(lpWindowName, "Fallout: Tactics (TM)") == 0) - { - dwStyle |= WS_VISIBLE; - } - - /* Center Claw DVD movies */ - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && - g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && - g_ddraw.width && - (dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD)) - { - //dwStyle &= ~WS_POPUP; - //dwExStyle = WS_EX_TRANSPARENT; - - POINT pt = { 0, 0 }; - real_ClientToScreen(g_ddraw.hwnd, &pt); - - int added_height = g_ddraw.render.height - g_ddraw.height; - int added_width = g_ddraw.render.width - g_ddraw.width; - int align_y = added_height > 0 ? added_height / 2 : 0; - int align_x = added_width > 0 ? added_width / 2 : 0; - - X = pt.x + align_x; - Y = pt.y + align_y; - } - - /* Metal Knight Movies */ - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3:0:1900011:0") == 0 && - lpWindowName && _strcmpi(lpWindowName, "AVI player") == 0 && - dwStyle == WS_POPUP && - dwExStyle == WS_EX_TOPMOST && - g_ddraw.ref && g_ddraw.hwnd && - g_ddraw.width) - { - dwExStyle = 0; - - POINT pt = { 0, 0 }; - real_ClientToScreen(g_ddraw.hwnd, &pt); - - int added_height = g_ddraw.render.height - g_ddraw.height; - int added_width = g_ddraw.render.width - g_ddraw.width; - int align_y = added_height > 0 ? added_height / 2 : 0; - int align_x = added_width > 0 ? added_width / 2 : 0; - - X += pt.x + align_x; - Y += pt.y + align_y; - } - - /* Disney Trivia Challenge */ - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Disney Trivia Challenge") == 0 && - hWndParent && (dwStyle & WS_CHILD)) - { - dwExStyle = WS_EX_TRANSPARENT; - } - - /* Center Lego Loco overlays */ - if (lpWindowName && _strcmpi(lpWindowName, "LEGO LOCO") == 0 && - g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && - g_ddraw.width && - (dwStyle & WS_POPUP)) - { - /* not working currently, game probably moves it with SetWindowPos or MoveWindow afterwards - POINT pt = { 0, 0 }; - real_ClientToScreen(g_ddraw.hwnd, &pt); - - int added_height = g_ddraw.render.height - g_ddraw.height; - int added_width = g_ddraw.render.width - g_ddraw.width; - int align_y = added_height > 0 ? added_height / 2 : 0; - int align_x = added_width > 0 ? added_width / 2 : 0; - - X = pt.x + align_x; - Y = pt.y + align_y; - */ - } - - /* Road Rash movies */ - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "AVI Window") == 0 && - g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && - (dwStyle & WS_POPUP)) - { - dwStyle = WS_CHILD; - hWndParent = g_ddraw.hwnd; - } - - /* A Bug's Life Action Game */ - //HIWORD(lpClassName) && _strcmpi(lpClassName, "Bugs") == 0 && - if (dwExStyle == 0x01000008) - { - dwExStyle = WS_EX_TOPMOST; - } - /* Fix for SMACKW32.DLL creating another window that steals the focus */ - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw.ref && g_ddraw.hwnd) + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw) { dwStyle &= ~WS_VISIBLE; } - /* Battle.net */ - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "SDlgDialog") == 0 && g_ddraw.ref && g_ddraw.hwnd) + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "SDlgDialog") == 0 && g_ddraw) { - if (!g_ddraw.bnet_active) + if (!g_ddraw->bnet_active) { - g_ddraw.bnet_was_upscaled = g_config.fullscreen; - g_config.fullscreen = FALSE; + g_ddraw->bnet_was_upscaled = g_ddraw->fullscreen; + g_ddraw->fullscreen = FALSE; - if (!g_config.windowed && !g_ddraw.bnet_was_fullscreen) + if (!g_ddraw->windowed && !g_ddraw->bnet_was_fullscreen) { - int ws = g_config.window_state; - util_toggle_fullscreen(); - g_config.window_state = ws; - g_ddraw.bnet_was_fullscreen = TRUE; + if ((g_ddraw->render.mode.dmPelsWidth != 640 || + g_ddraw->render.mode.dmPelsHeight != 480) && + GetSystemMetrics(SM_CMONITORS) == 1) + { + memcpy(&g_ddraw->bnet_mode, &g_ddraw->render.mode, sizeof(DEVMODE)); + + g_ddraw->render.mode.dmPelsWidth = 640; + g_ddraw->render.mode.dmPelsHeight = 480; + ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); + + g_ddraw->bnet_was_fullscreen = TRUE; + } + else + { + real_SetWindowPos( + g_ddraw->hwnd, + 0, + 0, + 0, + g_ddraw->render.width, + g_ddraw->render.height + 1, + SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING); + } } - real_GetClientRect(g_ddraw.hwnd, &g_ddraw.bnet_win_rect); - real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&g_ddraw.bnet_win_rect, 2); + real_GetClientRect(g_ddraw->hwnd, &g_ddraw->bnet_win_rect); + real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&g_ddraw->bnet_win_rect, 2); - int width = g_ddraw.bnet_win_rect.right - g_ddraw.bnet_win_rect.left; - int height = g_ddraw.bnet_win_rect.bottom - g_ddraw.bnet_win_rect.top; + int width = g_ddraw->bnet_win_rect.right - g_ddraw->bnet_win_rect.left; + int height = g_ddraw->bnet_win_rect.bottom - g_ddraw->bnet_win_rect.top; - int x = g_ddraw.bnet_pos.x || g_ddraw.bnet_pos.y ? g_ddraw.bnet_pos.x : -32000; - int y = g_ddraw.bnet_pos.x || g_ddraw.bnet_pos.y ? g_ddraw.bnet_pos.y : -32000; + int x = g_ddraw->bnet_pos.x || g_ddraw->bnet_pos.y ? g_ddraw->bnet_pos.x : -32000; + int y = g_ddraw->bnet_pos.x || g_ddraw->bnet_pos.y ? g_ddraw->bnet_pos.y : -32000; - UINT flags = width != g_ddraw.width || height != g_ddraw.height ? 0 : SWP_NOMOVE; + UINT flags = width != g_ddraw->width || height != g_ddraw->height ? 0 : SWP_NOMOVE; - int dst_width = g_config.window_rect.right ? g_ddraw.width : 0; - int dst_height = g_config.window_rect.bottom ? g_ddraw.height : 0; + int dst_width = g_config.window_rect.right ? g_ddraw->width : 0; + int dst_height = g_config.window_rect.bottom ? g_ddraw->height : 0; util_set_window_rect(x, y, dst_width, dst_height, flags); - g_config.resizable = FALSE; + g_ddraw->resizable = FALSE; - g_ddraw.bnet_active = TRUE; + g_ddraw->bnet_active = TRUE; + SetTimer(g_ddraw->hwnd, IDT_TIMER_REDRAW_BNET, 200, (TIMERPROC)NULL); mouse_unlock(); ReleaseCapture(); } POINT pt = { 0, 0 }; - real_ClientToScreen(g_ddraw.hwnd, &pt); + real_ClientToScreen(g_ddraw->hwnd, &pt); - int added_height = g_ddraw.height - 480; - int added_width = g_ddraw.width - 640; + int added_height = g_ddraw->height - 480; + int added_width = g_ddraw->width - 640; int align_y = added_height > 0 ? added_height / 2 : 0; int align_x = added_width > 0 ? added_width / 2 : 0; - X += pt.x + align_x; - Y += pt.y + align_y; + if (g_ddraw->windowed) + { + X += align_x; + Y += align_y; + } + else if (GetSystemMetrics(SM_CMONITORS) > 1) + { + X += min(g_ddraw->render.width / 2 - 640 / 2, added_width); + Y += min(g_ddraw->render.height / 2 - 480 / 2, added_height); + } + + X += pt.x; + Y += pt.y; dwStyle |= WS_CLIPCHILDREN; - } - /* Limit window size to max surface size (Dune2000 1.02) */ - if (dwStyle & WS_POPUP) - { - if (nWidth != CW_USEDEFAULT) + if (lpWindowName && !lpWindowName[0]) { - nWidth = min(nWidth, 16384); - } - - if (nHeight != CW_USEDEFAULT) - { - nHeight = min(nHeight, 16384); + lpWindowName = "Bnet Lobby"; } } - HWND hwnd = real_CreateWindowExA( + return real_CreateWindowExA( dwExStyle, lpClassName, lpWindowName, @@ -2248,122 +768,23 @@ HWND WINAPI fake_CreateWindowExA( hMenu, hInstance, lpParam); - - /* Age Of Empires 2 textbox align */ - if (!dwExStyle && - HIWORD(lpClassName) && _strcmpi(lpClassName, "edit") == 0 && - !lpWindowName && - g_ddraw.ref && g_ddraw.width && - g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && - (int)hMenu == 1) - { - g_ddraw.textbox.hwnd = hwnd; - } - - TRACE("<- CreateWindowExA(hwnd=%p)\n", hwnd); - - return hwnd; } HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv) { - if (rclsid && riid) + if (rclsid && riid && (IsEqualGUID(&CLSID_DirectDraw, rclsid) || IsEqualGUID(&CLSID_DirectDraw7, rclsid))) { - TRACE( - "CoCreateInstance rclsid = %08X, riid = %08X [%p]\n", - ((GUID*)rclsid)->Data1, - ((GUID*)riid)->Data1, - _ReturnAddress()); - - if (IsEqualGUID(&CLSID_DirectDraw, rclsid) || IsEqualGUID(&CLSID_DirectDraw7, rclsid)) + if (IsEqualGUID(&IID_IDirectDraw2, riid) || + IsEqualGUID(&IID_IDirectDraw4, riid) || + IsEqualGUID(&IID_IDirectDraw7, riid)) { - TRACE(" GUID = %08X (CLSID_DirectDrawX)\n", ((GUID*)rclsid)->Data1); - - if (IsEqualGUID(&IID_IDirectDraw2, riid) || - IsEqualGUID(&IID_IDirectDraw4, riid) || - IsEqualGUID(&IID_IDirectDraw7, riid)) - { - return dd_CreateEx(NULL, ppv, riid, NULL); - } - else - { - return dd_CreateEx(NULL, ppv, &IID_IDirectDraw, NULL); - } - } - - if (IsEqualGUID(&CLSID_DirectDrawClipper, rclsid)) + return dd_CreateEx(NULL, ppv, riid, NULL); + } + else { - TRACE(" GUID = %08X (CLSID_DirectDrawClipper)\n", ((GUID*)rclsid)->Data1); - - if (IsEqualGUID(&IID_IDirectDrawClipper, riid)) - { - return dd_CreateClipper(0, (IDirectDrawClipperImpl**)ppv, NULL); - } + return dd_CreateEx(NULL, ppv, &IID_IDirectDraw, NULL); } } - /* These dlls must be hooked for cutscene uscaling and windowed mode */ - HMODULE quartz_dll = GetModuleHandleA("quartz"); - HMODULE msvfw32_dll = GetModuleHandleA("msvfw32"); - - HRESULT result = real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv); - - if ((!quartz_dll && GetModuleHandleA("quartz")) || - (!msvfw32_dll && GetModuleHandleA("msvfw32"))) - { - hook_init(); - } - - return result; -} - -MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR fdwCommand, DWORD_PTR dwParam) -{ - /* These dlls must be hooked for cutscene uscaling and windowed mode */ - HMODULE quartz_dll = GetModuleHandleA("quartz"); - HMODULE msvfw32_dll = GetModuleHandleA("msvfw32"); - - MCIERROR result = real_mciSendCommandA(IDDevice, uMsg, fdwCommand, dwParam); - - if ((!quartz_dll && GetModuleHandleA("quartz")) || - (!msvfw32_dll && GetModuleHandleA("msvfw32"))) - { - hook_init(); - } - - return result; -} - -LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( - LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) -{ - LPTOP_LEVEL_EXCEPTION_FILTER old = g_dbg_exception_filter; - g_dbg_exception_filter = lpTopLevelExceptionFilter; - - return old; - //return real_SetUnhandledExceptionFilter(lpTopLevelExceptionFilter); -} - -PGETFRAME WINAPI fake_AVIStreamGetFrameOpen(PAVISTREAM pavi, LPBITMAPINFOHEADER lpbiWanted) -{ - if (g_ddraw.ref && g_ddraw.primary && (DWORD)lpbiWanted == AVIGETFRAMEF_BESTDISPLAYFMT) - { - DDBITMAPINFO bmi; - memcpy(&bmi, g_ddraw.primary->bmi, sizeof(DDBITMAPINFO)); - - bmi.bmiHeader.biHeight = 0; - bmi.bmiHeader.biWidth = 0; - - if (g_ddraw.bpp == 8 && g_ddraw.primary->palette) - { - memcpy(&bmi.bmiColors[0], g_ddraw.primary->palette->data_rgb, sizeof(bmi.bmiColors)); - } - - PGETFRAME result = real_AVIStreamGetFrameOpen(pavi, (LPBITMAPINFOHEADER)&bmi); - - if (result) - return result; - } - - return real_AVIStreamGetFrameOpen(pavi, lpbiWanted); + return real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv); } diff --git a/src/wndproc.c b/src/wndproc.c index 3555058..ef88b6b 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -4,135 +4,59 @@ #include "dllmain.h" #include "dd.h" #include "hook.h" +#include "ddsurface.h" #include "mouse.h" #include "render_d3d9.h" #include "config.h" #include "screenshot.h" #include "winapi_hooks.h" -#include "directinput.h" #include "wndproc.h" #include "utils.h" #include "debug.h" -#include "versionhelpers.h" LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { -#ifdef _DEBUG - if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR && - uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR && uMsg != WM_DEADCHAR && uMsg != WM_INPUT && - uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP && uMsg != WM_TIMER && - uMsg != WM_D3D9DEVICELOST && uMsg != WM_NULL) - { - TRACE( - " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d, LO=%d HI=%d)\n", - dbg_mes_to_str(uMsg), - uMsg, - wParam, - wParam, - lParam, - lParam, - (int)(short)LOWORD(lParam), - (int)(short)HIWORD(lParam)); - } -#endif + /* + TRACE( + " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d)\n", + dbg_mes_to_str(uMsg), + uMsg, + wParam, + wParam, + lParam, + lParam); + */ static BOOL in_size_move = FALSE; static int redraw_count = 0; switch (uMsg) { - case WM_NULL: + case WM_GETMINMAXINFO: case WM_MOVING: case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: case WM_NCPAINT: case WM_CANCELMODE: case WM_DISPLAYCHANGE: - case WM_NCCALCSIZE: { - return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); + return DefWindowProc(hWnd, uMsg, wParam, lParam); } - case WM_GETMINMAXINFO: - { - MINMAXINFO* mmi = (MINMAXINFO*)lParam; - - if (g_config.windowed && g_ddraw.width) - { - RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height }; - - AdjustWindowRectEx( - &rc, - real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), - GetMenu(g_ddraw.hwnd) != NULL, - real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); - - if (mmi->ptMaxTrackSize.x < rc.right - rc.left) - mmi->ptMaxTrackSize.x = rc.right - rc.left; - - if (mmi->ptMaxTrackSize.y < rc.bottom - rc.top) - mmi->ptMaxTrackSize.y = rc.bottom - rc.top; - - /* - RECT rcmin = { 0, 0, g_ddraw.width, g_ddraw.height }; - - AdjustWindowRectEx( - &rcmin, - real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), - GetMenu(g_ddraw.hwnd) != NULL, - real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); - - mmi->ptMinTrackSize.x = rcmin.right - rcmin.left; - mmi->ptMinTrackSize.y = rcmin.bottom - rcmin.top; - */ - - return 0; - } - - return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); - } - case WM_KILLFOCUS: case WM_NCACTIVATE: { - if (g_config.noactivateapp) + if (g_ddraw->noactivateapp) { - return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); + return DefWindowProc(hWnd, uMsg, wParam, lParam); } break; } case WM_NCHITTEST: { - if (g_mouse_locked || g_config.devmode) - { - POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + LRESULT result = DefWindowProc(hWnd, uMsg, wParam, 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_ddraw->resizable) { switch (result) { @@ -153,7 +77,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_SETCURSOR: { /* show resize cursor on window borders */ - if ((HWND)wParam == g_ddraw.hwnd) + if ((HWND)wParam == g_ddraw->hwnd) { WORD message = HIWORD(lParam); @@ -175,9 +99,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case HTTOP: case HTTOPLEFT: case HTTOPRIGHT: - return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); + return DefWindowProc(hWnd, uMsg, wParam, lParam); case HTCLIENT: - if (!g_mouse_locked && !g_config.devmode) + if (!g_ddraw->locked && !g_ddraw->devmode) { real_SetCursor(LoadCursor(NULL, IDC_ARROW)); return TRUE; @@ -207,11 +131,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_D3D9DEVICELOST: { - if (((!g_config.windowed && !g_config.nonexclusive) || !util_is_minimized(g_ddraw.hwnd)) && - g_ddraw.renderer == d3d9_render_main && - d3d9_on_device_lost()) + if (g_ddraw->renderer == d3d9_render_main && d3d9_on_device_lost()) { - if (!g_config.windowed) + if (!g_ddraw->windowed) mouse_lock(); } return 0; @@ -222,33 +144,30 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { case IDT_TIMER_LEAVE_BNET: { - KillTimer(g_ddraw.hwnd, IDT_TIMER_LEAVE_BNET); + KillTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET); - if (!g_config.windowed) - g_ddraw.bnet_was_fullscreen = FALSE; - - if (!g_ddraw.bnet_active) + if (!g_ddraw->bnet_active) { - if (g_ddraw.bnet_was_fullscreen) + if (g_ddraw->bnet_was_fullscreen) { - int ws = g_config.window_state; - util_toggle_fullscreen(); - g_config.window_state = ws; - g_ddraw.bnet_was_fullscreen = FALSE; + memcpy(&g_ddraw->render.mode, &g_ddraw->bnet_mode, sizeof(DEVMODE)); + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + g_ddraw->bnet_was_fullscreen = FALSE; } - else if (g_ddraw.bnet_was_upscaled) + else if (g_ddraw->bnet_was_upscaled) { util_set_window_rect(0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); - g_ddraw.bnet_was_upscaled = FALSE; + g_ddraw->bnet_was_upscaled = FALSE; } } return 0; } - case IDT_TIMER_LINUX_FIX_WINDOW_SIZE: + case IDT_TIMER_REDRAW_BNET: { - KillTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE); - util_set_window_rect(0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + if (g_ddraw->primary) + dds_RedrawBnet(g_ddraw->primary, TRUE); + return 0; } } @@ -258,54 +177,45 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { WINDOWPOS* pos = (WINDOWPOS*)lParam; - /* - dbg_dump_swp_flags(pos->flags); - TRACE( - " hwndInsertAfter=%p, x=%d, y=%d, cx=%d, cy=%d\n", - pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy); - */ - - if (IsWine() && - !g_config.windowed && + if (g_ddraw->wine && + !g_ddraw->windowed && (pos->x > 0 || pos->y > 0) && - g_ddraw.last_set_window_pos_tick + 500 < timeGetTime()) + g_ddraw->last_set_window_pos_tick + 500 < timeGetTime()) { - PostMessage(g_ddraw.hwnd, WM_WINEFULLSCREEN, 0, 0); + PostMessage(g_ddraw->hwnd, WM_WINEFULLSCREEN, 0, 0); } break; } case WM_WINEFULLSCREEN: { - if (!g_config.windowed) + if (!g_ddraw->windowed) { - g_ddraw.last_set_window_pos_tick = timeGetTime(); - - int menu_height = GetMenu(g_ddraw.hwnd) ? real_GetSystemMetrics(SM_CYMENU) : 0; + g_ddraw->last_set_window_pos_tick = timeGetTime(); real_SetWindowPos( - g_ddraw.hwnd, + g_ddraw->hwnd, HWND_TOPMOST, 1, 1, - g_ddraw.render.width, - g_ddraw.render.height + menu_height, + g_ddraw->render.width, + g_ddraw->render.height, SWP_SHOWWINDOW); real_SetWindowPos( - g_ddraw.hwnd, + g_ddraw->hwnd, HWND_TOPMOST, 0, 0, - g_ddraw.render.width, - g_ddraw.render.height + menu_height, + g_ddraw->render.width, + g_ddraw->render.height, SWP_SHOWWINDOW); } return 0; } case WM_ENTERSIZEMOVE: { - if (g_config.windowed) + if (g_ddraw->windowed) { in_size_move = TRUE; } @@ -313,12 +223,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_EXITSIZEMOVE: { - if (g_config.windowed) + if (g_ddraw->windowed) { in_size_move = FALSE; - if (!g_ddraw.render.thread) - dd_SetDisplayMode(0, 0, 0, 0); + if (!g_ddraw->render.thread) + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); } break; } @@ -326,51 +236,31 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { RECT* windowrc = (RECT*)lParam; - if (g_config.windowed) + if (g_ddraw->windowed) { if (in_size_move) { - if (g_ddraw.render.thread) + if (g_ddraw->render.thread) { - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); + EnterCriticalSection(&g_ddraw->cs); + g_ddraw->render.run = FALSE; + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw->cs); - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; + WaitForSingleObject(g_ddraw->render.thread, INFINITE); + g_ddraw->render.thread = NULL; } RECT clientrc = { 0 }; /* maintain aspect ratio */ - if (g_config.maintas && + if (g_ddraw->maintas && CopyRect(&clientrc, windowrc) && - util_unadjust_window_rect( - &clientrc, - real_GetWindowLongA(hWnd, GWL_STYLE), - GetMenu(hWnd) != NULL, - real_GetWindowLongA(hWnd, GWL_EXSTYLE)) && + util_unadjust_window_rect(&clientrc, GetWindowLong(hWnd, GWL_STYLE), FALSE, GetWindowLong(hWnd, GWL_EXSTYLE)) && SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top)) { - double scale_h; - double scale_w; - - if (g_config.aspect_ratio[0]) - { - char* e = &g_config.aspect_ratio[0]; - - DWORD cx = strtoul(e, &e, 0); - DWORD cy = strtoul(e + 1, &e, 0); - - scale_h = (double)cy / cx; - scale_w = (double)cx / cy; - } - else - { - scale_h = (double)g_ddraw.height / g_ddraw.width; - scale_w = (double)g_ddraw.width / g_ddraw.height; - } + float scaleH = (float)g_ddraw->height / g_ddraw->width; + float scaleW = (float)g_ddraw->width / g_ddraw->height; switch (wParam) { @@ -379,19 +269,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WMSZ_LEFT: case WMSZ_RIGHT: { - windowrc->bottom += (LONG)round(scale_h * clientrc.right - clientrc.bottom); + windowrc->bottom += (LONG)(scaleH * clientrc.right - clientrc.bottom); break; } case WMSZ_TOP: case WMSZ_BOTTOM: { - windowrc->right += (LONG)round(scale_w * clientrc.bottom - clientrc.right); + windowrc->right += (LONG)(scaleW * clientrc.bottom - clientrc.right); break; } case WMSZ_TOPRIGHT: case WMSZ_TOPLEFT: { - windowrc->top -= (LONG)round(scale_h * clientrc.right - clientrc.bottom); + windowrc->top -= (LONG)(scaleH * clientrc.right - clientrc.bottom); break; } } @@ -399,14 +289,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam /* enforce minimum window size */ if (CopyRect(&clientrc, windowrc) && - util_unadjust_window_rect( - &clientrc, - real_GetWindowLongA(hWnd, GWL_STYLE), - GetMenu(hWnd) != NULL, - real_GetWindowLongA(hWnd, GWL_EXSTYLE)) && + util_unadjust_window_rect(&clientrc, GetWindowLong(hWnd, GWL_STYLE), FALSE, GetWindowLong(hWnd, GWL_EXSTYLE)) && SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top)) { - if (clientrc.right < g_ddraw.width) + if (clientrc.right < g_ddraw->width) { switch (wParam) { @@ -416,20 +302,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WMSZ_BOTTOM: case WMSZ_TOP: { - windowrc->right += g_ddraw.width - clientrc.right; + windowrc->right += g_ddraw->width - clientrc.right; break; } case WMSZ_TOPLEFT: case WMSZ_BOTTOMLEFT: case WMSZ_LEFT: { - windowrc->left -= g_ddraw.width - clientrc.right; + windowrc->left -= g_ddraw->width - clientrc.right; break; } } } - if (clientrc.bottom < g_ddraw.height) + if (clientrc.bottom < g_ddraw->height) { switch (wParam) { @@ -439,14 +325,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WMSZ_RIGHT: case WMSZ_LEFT: { - windowrc->bottom += g_ddraw.height - clientrc.bottom; + windowrc->bottom += g_ddraw->height - clientrc.bottom; break; } case WMSZ_TOPLEFT: case WMSZ_TOPRIGHT: case WMSZ_TOP: { - windowrc->top -= g_ddraw.height - clientrc.bottom; + windowrc->top -= g_ddraw->height - clientrc.bottom; break; } } @@ -455,11 +341,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam /* save new window position */ if (CopyRect(&clientrc, windowrc) && - util_unadjust_window_rect( - &clientrc, - real_GetWindowLongA(hWnd, GWL_STYLE), - GetMenu(hWnd) != NULL, - real_GetWindowLongA(hWnd, GWL_EXSTYLE))) + util_unadjust_window_rect(&clientrc, GetWindowLong(hWnd, GWL_STYLE), FALSE, GetWindowLong(hWnd, GWL_EXSTYLE))) { g_config.window_rect.left = clientrc.left; g_config.window_rect.top = clientrc.top; @@ -474,87 +356,38 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_SIZE: { - if (g_config.windowed) + if (g_ddraw->windowed) { - WORD width = LOWORD(lParam); - WORD height = HIWORD(lParam); - if (wParam == SIZE_RESTORED) { - /* macOS maximize hack */ - if (in_size_move && g_ddraw.render.thread && IsMacOS()) + if (in_size_move && !g_ddraw->render.thread) { - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); - - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; + g_config.window_rect.right = LOWORD(lParam); + g_config.window_rect.bottom = HIWORD(lParam); } - - if (in_size_move && !g_ddraw.render.thread) + /* + else if (g_ddraw->wine) { - g_config.window_rect.right = width; - g_config.window_rect.bottom = height; - } - else if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && IsLinux()) - { - if (width != g_ddraw.render.width || height != g_ddraw.render.height) - { - KillTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE); - - g_config.window_rect.right = width; - g_config.window_rect.bottom = height; - - dd_SetDisplayMode(0, 0, 0, 0); - - if (width < g_ddraw.width || height < g_ddraw.height) - { - /* Can't enforce minimum window size in linux because there is no WM_SIZING and - WM_GETMINMAXINFO is ignored for whatever reasons */ - - SetTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE, 1000, (TIMERPROC)NULL); - } - } - } - } - else if (wParam == SIZE_MAXIMIZED) - { - if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && IsLinux()) - { - if (width != g_ddraw.render.width || height != g_ddraw.render.height) - { - KillTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE); - - g_config.window_rect.right = width; - g_config.window_rect.bottom = height; - - dd_SetDisplayMode(0, 0, 0, 0); - - if (width < g_ddraw.width || height < g_ddraw.height) - { - /* Can't enforce minimum window size in linux because there is no WM_SIZING and - WM_GETMINMAXINFO is ignored for whatever reasons */ - - SetTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE, 1000, (TIMERPROC)NULL); - } - } + WindowRect.right = LOWORD(lParam); + WindowRect.bottom = HIWORD(lParam); + if (WindowRect.right != g_ddraw->render.width || WindowRect.bottom != g_ddraw->render.height) + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp); } + */ } } - if (g_ddraw.got_child_windows) + if (g_ddraw->got_child_windows) { redraw_count = 2; RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } - return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ + return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ } case WM_MOVE: { - if (g_config.windowed) + if (g_ddraw->windowed) { int x = (int)(short)LOWORD(lParam); int y = (int)(short)HIWORD(lParam); @@ -564,7 +397,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam util_update_bnet_pos(x, y); } - if (in_size_move || (IsLinux() && !g_config.fullscreen && g_ddraw.render.thread)) + if (in_size_move || g_ddraw->wine) { if (x != -32000) g_config.window_rect.left = x; /* -32000 = Exit/Minimize */ @@ -574,43 +407,39 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - if (g_ddraw.got_child_windows) + if (g_ddraw->got_child_windows) RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); - return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ + return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ } - case WM_RESTORE_STYLE: + case WM_NCMOUSELEAVE: { - if (!IsWine()) /* hack: disable aero snap */ + if (!g_ddraw->wine) /* hack: disable aero snap */ { - LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); + LONG style = GetWindowLong(g_ddraw->hwnd, GWL_STYLE); if (!(style & WS_MAXIMIZEBOX)) { - real_SetWindowLongA(g_ddraw.hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX); + real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX); } } - return 0; + break; } case WM_SYSCOMMAND: { - if ((wParam & ~0x0F) == SC_MOVE && !IsWine()) /* hack: disable aero snap */ + if ((wParam & ~0x0F) == SC_MOVE && !g_ddraw->wine) /* hack: disable aero snap */ { - LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); + LONG style = GetWindowLong(g_ddraw->hwnd, GWL_STYLE); if ((style & WS_MAXIMIZEBOX)) { - real_SetWindowLongA(g_ddraw.hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX); - PostMessageA(g_ddraw.hwnd, WM_RESTORE_STYLE, 0, 0); + real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX); } } if (wParam == SC_MAXIMIZE) { - if (IsWine()) - return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); - - if (g_config.resizable) + if (g_ddraw->resizable) { util_toggle_maximize(); } @@ -620,40 +449,29 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (wParam == SC_CLOSE && !GameHandlesClose) { - if (g_config.terminate_process) - g_config.terminate_process = 2; - - ExitProcess(0); - //_exit(0); + exit(0); } - if (wParam == SC_KEYMENU && GetMenu(g_ddraw.hwnd) == NULL) + if (wParam == SC_KEYMENU) return 0; if (!GameHandlesClose) - return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); + return DefWindowProc(hWnd, uMsg, wParam, lParam); break; } case WM_WINDOWPOSCHANGING: { - WINDOWPOS* pos = (WINDOWPOS*)lParam; - - /* - dbg_dump_swp_flags(pos->flags); - TRACE( - " hwndInsertAfter=%p, x=%d, y=%d, cx=%d, cy=%d\n", - pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy); - */ - /* workaround for a bug where sometimes a background window steals the focus */ - if (g_mouse_locked) + if (g_ddraw->locked) { + WINDOWPOS* pos = (WINDOWPOS*)lParam; + if (pos->flags == SWP_NOMOVE + SWP_NOSIZE) { mouse_unlock(); - if (real_GetForegroundWindow() == g_ddraw.hwnd) + if (GetForegroundWindow() == g_ddraw->hwnd) mouse_lock(); } } @@ -666,64 +484,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_ACTIVATE: { - if (LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE) + if (wParam == WA_ACTIVE || wParam == WA_CLICKACTIVE) { - if (g_ddraw.got_child_windows) + if (g_ddraw->got_child_windows) RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } - if (LOWORD(wParam) == WA_INACTIVE) - { - if (g_config.windowed && !g_config.fullscreen && lParam && GetParent((HWND)lParam) == hWnd) - { - char class_name[MAX_PATH] = { 0 }; - GetClassNameA((HWND)lParam, class_name, sizeof(class_name) - 1); - - if (strcmp(class_name, "#32770") == 0) // dialog box - { - mouse_unlock(); - - /* - // Center to main window - RECT rc_main = { 0 }; - RECT rc_dialog = { 0 }; - RECT rc = { 0 }; - - real_GetWindowRect(hWnd, &rc_main); - real_GetWindowRect((HWND)lParam, &rc_dialog); - CopyRect(&rc, &rc_main); - - OffsetRect(&rc_dialog, -rc_dialog.left, -rc_dialog.top); - OffsetRect(&rc, -rc.left, -rc.top); - OffsetRect(&rc, -rc_dialog.right, -rc_dialog.bottom); - - real_SetWindowPos( - (HWND)lParam, - HWND_TOP, - rc_main.left + (rc.right / 2), - rc_main.top + (rc.bottom / 2), - 0, 0, - SWP_NOSIZE); - */ - } - } - } - - if (g_config.windowed || g_config.noactivateapp) - { - /* let it pass through once (Atrox) */ - static BOOL one_time; - - if (!one_time) - { - one_time = TRUE; - - if (LOWORD(wParam)) - break; - } - - return 0; - } + //if (g_ddraw->windowed || g_ddraw->noactivateapp) + return 0; break; } @@ -731,43 +499,41 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam) { - if (!g_config.windowed) + if (!g_ddraw->windowed) { - if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive) + if (g_ddraw->renderer != d3d9_render_main) { - ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN); - real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); + ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); + real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); mouse_lock(); } } - else if (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd) + else if (g_ddraw->fullscreen) { mouse_lock(); } - - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); } else { - if (!g_config.windowed && !g_mouse_locked && g_config.noactivateapp && !g_config.devmode) + if (!g_ddraw->windowed && !g_ddraw->locked && g_ddraw->noactivateapp && !g_ddraw->devmode) return 0; mouse_unlock(); - if (IsWine() && g_ddraw.last_set_window_pos_tick + 500 > timeGetTime()) + if (g_ddraw->wine && g_ddraw->last_set_window_pos_tick + 500 > timeGetTime()) return 0; - if (!g_config.windowed) + if (!g_ddraw->windowed) { - if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive) + if (g_ddraw->renderer != d3d9_render_main) { - real_ShowWindow(g_ddraw.hwnd, SW_MINIMIZE); - ChangeDisplaySettings(NULL, g_ddraw.bnet_active ? CDS_FULLSCREEN : 0); + real_ShowWindow(g_ddraw->hwnd, SW_MINIMIZE); + ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); } } } - if (wParam && g_config.fix_alt_key_stuck) + if (wParam && g_ddraw->releasealt) { INPUT ip; memset(&ip, 0, sizeof(ip)); @@ -776,34 +542,21 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ip.ki.wVk = VK_MENU; ip.ki.dwFlags = KEYEVENTF_KEYUP; SendInput(1, &ip, sizeof(ip)); - - if (g_dinput_hook_active) - { - ip.type = INPUT_KEYBOARD; - ip.ki.wScan = 56; // LeftAlt - ip.ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE; - SendInput(1, &ip, sizeof(ip)); - } } - if (g_config.windowed || g_config.noactivateapp) + if (g_ddraw->windowed || g_ddraw->noactivateapp) { - /* let it pass through once (tiberian sun / ClueFinders) */ + /* let it pass through once (tiberian sun) */ static BOOL one_time; - - if (!one_time) + + if (wParam && !one_time && g_ddraw->tshack) { one_time = TRUE; - - if (wParam) - break; + break; } - if (wParam && g_ddraw.alt_key_down && !g_config.fix_alt_key_stuck) - { - PostMessageA(g_ddraw.hwnd, WM_SYSKEYUP, VK_MENU, 0); - g_ddraw.alt_key_down = FALSE; - } + if (wParam && g_ddraw->alt_key_down && !g_ddraw->releasealt) + PostMessageA(g_ddraw->hwnd, WM_SYSKEYUP, VK_MENU, 0); return 0; } @@ -812,40 +565,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_AUTORENDERER: { mouse_unlock(); - real_SetWindowPos(g_ddraw.hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); - real_SetWindowPos(g_ddraw.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + real_SetWindowPos(g_ddraw->hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + real_SetWindowPos(g_ddraw->hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); mouse_lock(); return 0; } - case WM_TOGGLE_FULLSCREEN: - { - if (!g_config.fullscreen || g_config.toggle_upscaled || (g_config.windowed && g_config.toggle_borderless)) - { - /* Check if we are fullscreen/borderless already */ - if (wParam == CNC_DDRAW_SET_FULLSCREEN && (!g_config.windowed || g_config.fullscreen)) - return 0; - - /* Check if we are windowed already */ - if (wParam == CNC_DDRAW_SET_WINDOWED && g_config.windowed && !g_config.fullscreen) - return 0; - - util_toggle_fullscreen(); - } - - return 0; - } - case WM_TOGGLE_MAXIMIZE: - { - if (g_config.resizable) - { - util_toggle_maximize(); - } - - return 0; - } case WM_NCLBUTTONDBLCLK: { - if (g_config.resizable) + if (g_ddraw->resizable) { util_toggle_maximize(); } @@ -854,28 +581,80 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_SYSKEYDOWN: { - if (wParam == VK_F4) + BOOL context_code = (lParam & (1 << 29)) != 0; + BOOL key_state = (lParam & (1 << 30)) != 0; + + if (g_ddraw->hotkeys.toggle_fullscreen && + wParam == g_ddraw->hotkeys.toggle_fullscreen && + context_code && + !key_state && + g_ddraw->renderer != d3d9_render_main) { - return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); + util_toggle_fullscreen(); + return 0; + } + + if (g_ddraw->hotkeys.toggle_maximize && + wParam == g_ddraw->hotkeys.toggle_maximize && + g_ddraw->resizable && + !g_ddraw->border && + g_ddraw->windowed && + !g_ddraw->fullscreen) + { + util_toggle_maximize(); + return 0; + } + + if (wParam == VK_MENU) + { + g_ddraw->alt_key_down = TRUE; } break; } case WM_SYSKEYUP: { - if (wParam == VK_TAB || (wParam && wParam == g_config.hotkeys.toggle_fullscreen)) + if (wParam == VK_MENU) { - return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); + g_ddraw->alt_key_down = FALSE; + } + + if (wParam == VK_TAB || (g_ddraw->hotkeys.toggle_fullscreen && wParam == g_ddraw->hotkeys.toggle_fullscreen)) + { + return DefWindowProc(hWnd, uMsg, wParam, lParam); } break; } case WM_KEYDOWN: { + if (g_ddraw->hotkeys.unlock_cursor1 && + (wParam == VK_CONTROL || wParam == g_ddraw->hotkeys.unlock_cursor1)) + { + if (GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(g_ddraw->hotkeys.unlock_cursor1) & 0x8000) + { + mouse_unlock(); + return 0; + } + } + + if (g_ddraw->hotkeys.unlock_cursor2 && + (wParam == g_ddraw->hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL)) + { + if ((GetAsyncKeyState(VK_RMENU) & 0x8000) && GetAsyncKeyState(g_ddraw->hotkeys.unlock_cursor2) & 0x8000) + { + mouse_unlock(); + return 0; + } + } + break; } case WM_KEYUP: { + if (g_ddraw->hotkeys.screenshot && wParam == g_ddraw->hotkeys.screenshot) + ss_take_screenshot(g_ddraw->primary); + break; } /* button up messages reactivate cursor lock */ @@ -883,30 +662,27 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_RBUTTONUP: case WM_MBUTTONUP: { - if (!g_config.devmode && !g_mouse_locked) + if (!g_ddraw->devmode && !g_ddraw->locked) { int x = GET_X_LPARAM(lParam); int y = GET_Y_LPARAM(lParam); - if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || - x < g_ddraw.render.viewport.x || - y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || - y < g_ddraw.render.viewport.y) + if (x > g_ddraw->render.viewport.x + g_ddraw->render.viewport.width || + x < g_ddraw->render.viewport.x || + y > g_ddraw->render.viewport.y + g_ddraw->render.viewport.height || + y < g_ddraw->render.viewport.y) { - x = g_ddraw.width / 2; - y = g_ddraw.height / 2; + x = g_ddraw->width / 2; + y = g_ddraw->height / 2; } else { - x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); - y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); + x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w); + y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h); } - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); mouse_lock(); return 0; @@ -927,24 +703,17 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_MBUTTONDOWN: case WM_MOUSEMOVE: { - if (!g_config.devmode && !g_mouse_locked) + if (!g_ddraw->devmode && !g_ddraw->locked) { return 0; } - if (uMsg == WM_MOUSEWHEEL) - { - POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - real_ScreenToClient(g_ddraw.hwnd, &pt); - lParam = MAKELPARAM(pt.x, pt.y); - } + int x = max(GET_X_LPARAM(lParam) - g_ddraw->mouse.x_adjust, 0); + int y = max(GET_Y_LPARAM(lParam) - g_ddraw->mouse.y_adjust, 0); - int x = max(GET_X_LPARAM(lParam) - g_ddraw.mouse.x_adjust, 0); - int y = max(GET_Y_LPARAM(lParam) - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) + if (g_ddraw->adjmouse) { - if (g_config.vhack && !g_config.devmode) + if (g_ddraw->vhack && !g_ddraw->devmode) { POINT pt = { 0, 0 }; fake_GetCursorPos(&pt); @@ -954,16 +723,16 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } else { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + x = (DWORD)(roundf(x * g_ddraw->render.unscale_w)); + y = (DWORD)(roundf(y * g_ddraw->render.unscale_h)); } } - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); + x = min(x, g_ddraw->width); + y = min(y, g_ddraw->height); - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); lParam = MAKELPARAM(x, y); @@ -981,30 +750,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_RBUTTONDOWN: case WM_XBUTTONDOWN: { - if (!g_config.devmode && !g_mouse_locked) + if (!g_ddraw->devmode && !g_ddraw->locked) { - int x = GET_X_LPARAM(lParam); - int y = GET_Y_LPARAM(lParam); + int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w); + int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h); - if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || - x < g_ddraw.render.viewport.x || - y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || - y < g_ddraw.render.viewport.y) - { - x = g_ddraw.width / 2; - y = g_ddraw.height / 2; - } - else - { - x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); - y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); - } - - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); mouse_lock(); } @@ -1021,23 +773,21 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } - if (g_ddraw.primary) - { - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - } - + EnterCriticalSection(&g_ddraw->cs); + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw->cs); break; } case WM_ERASEBKGND: { - if (g_ddraw.primary && (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0)) + if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) { - InterlockedExchange(&g_ddraw.render.clear_screen, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + InterlockedExchange(&g_ddraw->render.clear_screen, TRUE); + ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); } break; } } - return CallWindowProcA(g_ddraw.wndproc, hWnd, uMsg, wParam, lParam); + return CallWindowProcA(g_ddraw->wndproc, hWnd, uMsg, wParam, lParam); }