古いゲームに機能を追加するプロジェクトに取り組んでいます。アイデアは、ウィンドウ表示で実行するオプションを追加することです (元は 800x600 フルスクリーンのみをサポートしています)。
これまでのところ、directDraw の初期化を変更してフルスクリーン排他モードを削除し、GDI で動作できるようにし、クリッパーを作成し、すべてを適切に設定しました。ポイントは、ゲームがフルスクリーン モードを 8 ビットの色深度に設定し、ウィンドウ表示で実行すると、出力が発生することです。この画像のようなゴミ:
これまでのところ、問題を回避するために GetDIBits と SetDIBits を使用していくつかのトリックを試みましたが、成功しませんでした。
ゲームは非常に古いバージョンの directDraw で動作します (このバージョンに関するドキュメントはまったくありません。私の作業のほとんどは推測とテストに基づいています)。
このゲームは、BltFast を使用して画面に情報を取得します。
これは、DIBits を使用して問題を修正するために作成されたコードの一部です。
PrimarySurface = ゲームのプライマリ サーフェス自体
patch_1:
; Blt interface
CALL DWORD [EDX+1Ch] ;<--- Surface->BltFast() Outputs game screen, params pushed to stack elsewhere
pushad
; Get diBits and transform it properly to display
push surfaceDC
mov eax, [PrimarySurface]
mov edx, [eax]
push eax
call dword [edx+44h] ; Surface->GetDC(&surfaceDC)
test eax, eax
je patch_1_abort
invoke FindWindowA, 0, 'Rising Lands'
mov [windowHandle], eax
invoke GetDC, eax
mov [windowDC], eax
invoke CreateCompatibleDC, [surfaceDC]
mov [compatibleDC], eax
invoke CreateCompatibleDC, [windowDC]
mov [compatibleWindowDC], eax
invoke CreateCompatibleBitmap, [windowDC], 800, 600
mov [zbitmap], eax
; Get screen header
invoke GetDIBits, [compatibleWindowDC], [zbitmap], 0, 0, 0, bitmapHeader, 0
; Get game screen data
invoke GetDIBits, [compatibleDC], [zbitmap], 0, 600, bbuffer, bitmapHeader, 0
; Copy content back to screen
invoke SetDIBits, [compatibleWindowDC], [zbitmap], 0, 600, bbuffer, bitmapHeader, 0
; Release
push [surfaceDC]
mov eax, [PrimarySurface]
mov edx, [eax]
push eax
call dword [edx+68h]
patch_1_abort:
popad
; Original code finalization
MOV EDX,EAX
TEST EAX, EAX
jmp [p1r]
surfaceDC dd 0
windowHandle dd 0
windowDC dd 0
compatibleDC dd 0
compatibleWindowDC dd 0
zbitmap dd 0
bitmapInfo dd bitmapHeader
dd 0
bitmapHeader:
hSize dd endHeader - bitmapHeader
hWidth dd 0;800
hHeight dd 0;600
hPlanes dw 0;1
hBitCount dw 0;32
hCompression dd 0
hSizeImage dd 0
hxPPm dd 0
hyPPm dd 0
hClrUsed dd 0
hClrImp dd 0
endHeader:
bbuffer rb 800*600*10
BltFast への呼び出しを変更して画面に正しく出力することで、8 ビット カラー フォーマットをバッファから直接変換する方法はありますか?
出力を別の DC に再ルーティングしてから、GetDIBits/SetDIBits を使用してイメージを修正する方が良い解決策ですか?