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://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);
}