Twitterでは「しばらく更新しないつもり」とつぶやいたのですが、結局余り日を置かず更新しました。
ただ、今回の更新は間違いなく0.47から0.50へのバージョンアップより更新された機能は大きいです。今回のバージョンアップでWindowModePatch 0.17 Alphaで動かしていたソフトも動くと思います。試していませんので推測です。
DirectDrawをDirect3D9でエミュレーションしたときのパレット処理を実装
この実装の前にDirectDrawの処理でちょっと思い違いをしていた部分があり、それを修正してとりあえず一段落としようかと思っていましたが、さすがに4倍拡大ともなるとあまりにもエッジがひどすぎるのでDirect3D9によるエミュレーションを有効にしようと思い、実装していました。ちなみに思い違いをしていた部分は「IDirectDrawSurfaceとIDirectDrawSurface7でUnlockの引数の意味が違う」です。同じだと思っていましたのでいきなり引数に値を指定されると正しくUnlockできなかった、というわけです。
ちなみにチェックしていたソフトは某同人の格闘ゲームです。320×240(x8bit)という今となってはあまりにも小さすぎる解像度なので・・・。このゲームに関しては解像度を初めから固定しないと正しく解像度が認識できないです。その上でDirectDrawをDirect3D9でエミュレーションさせれば拡大時にDirect3D9による補間が働くのでまあいいかというところです。
Direct3D9の縮小処理でミスが
これもちょっと痛かったです。この部分は単純な実装ミスですね。縮小方向はあまりテスト対象にしない(というか拡大補間を行うことが目的なので)のが見事に現れた格好です。ゲームによってはこの部分は無視されることもあるので一部のゲームだけに起こる現象です。縮小方向で描画されなかった場合はたぶんこのバージョン以降であれば描画できるのではないかと思います。よくVer 0.17 Alphaが検索キーワードでクローズアップされますが、これで完全に吸収できたと思います。
予告していたスクリーンセーバーの無効化処理を実装
特にゲームパッドでゲームをしているときにこれがないと定期的に起動されていやになるんですよね・・・。使っているパターンで無効化したい場合はこの機能を使うと対象のゲームが起動中はスクリーンセーバーを無効化できます。特に格闘ゲームで実装されていなかったパターンではうれしい機能だと思います。
とりあえず一段落、というところまで
次に実装するならどういう機能なのでしょうかね。まあこの手のツールはバグ取りが命ですね。実装時に想定していた状態と異なる、というのが動かない原因となりやすいですからね・・・。