お久しぶりです、今でも偶にRxoさんのサイトを覗かせて頂いてます
透過色についてですが・・・
はい、ソフトウエアレンダリングモードだけですが仕様変更がありました
すいません・・・
ハードウエアアクセラレータを使用する通常の場合ではパレット画像は
最終的にテクスチャと同じ16bit or 32bit カラーに変換されるので
複数のパレットに透過色があっても全て透過されるのですが、
ソフトウエアレンダリングモードの場合は3年ほど前にパレット画像を
パレット画像のまま描画処理に使用するようにしたので、複数透過色( 透過色として
使用するパレット番号 )があると透過色かどうかの判定にかかる負荷が高くなってしまうので、
指定の透過色に一致する最も番号の若いパレットが透過色( 透過パレット )とするようにしました
また、パレットの色情報も画面モードの色数に応じて減色されますので、16ビットカラーの画面モードの
場合はパレットも24ビットから16ビットに変換されてしまいますので、透過パレットの判定の際に
透過色に近い色のパレットが透過パレットとして判断されてしまう場合があります
( 例:透過色が R=0,G=0,B=0 の場合、24ビットカラー時で R=0,G=2,B=0のパレットが透過パレットとして判定されます )
仕様変更でご迷惑をお掛けしてしまいますが、一応パレット画像をパレット画像として扱うようになった利点もあります
ソフトウエアレンダリングモードでパレット画像を扱う場合のみ、以下の関数で画像に対するパレット操作ができるようになりました
// メモリ上に読み込んだ画像のパレットを取得する(フルカラー画像の場合は無効) Red, Green, Blue に格納される値は 0〜255
int GetGraphPalette( int GrHandle, int ColorIndex, int *Red, int *Green, int *Blue ) ;
// メモリ上に読み込んだ画像の SetGraphPalette で変更する前のパレットを取得する Red, Green, Blue に格納される値は 0〜255
int GetGraphOriginalPalette( int GrHandle, int ColorIndex, int *Red, int *Green, int *Blue ) ;
// メモリ上に読み込んだ画像のパレットを変更する(フルカラー画像の場合は無効) Color は GetColor で取得できる値
int SetGraphPalette( int GrHandle, int ColorIndex, int Color ) ;
// SetGraphPalette で変更したパレットを全て元に戻す
int ResetGraphPalette( int GrHandle ) ;
あと、ソフトウエアレンダリングの世界では32ビットカラーより16ビットカラーの方が今でも高速です
ただ、ウインドウモードの場合はデスクトップ画面が32ビットカラーだと ScreenFlip 時に
画面の画素情報を16ビットカラーから32ビットカラーに変換する工程が入るのでデスクトップ画面が
32ビットカラーですとソフトが16ビットカラーでもそれなりに低速です
ちなみに、Vista 以降フレームバッファを画面に出力する処理が異様に時間が掛かるようになりましたので、
秒間60コマのソフトで1フレームに使用できる 16.66666...ミリ秒の内、8ミリ秒くらいを ScreenFlip だけで
消費してしまうようになりました
ソフトウエアレンダリング時は GDI を使用しているのですが、まだ試していないので確定はしていませんが
Vista以降では恐らく Direct3D9 を使用して画面サイズ以上のサイズのテクスチャを作成してそこに
毎フレームソフトウエアレンダリングの結果を転送して三角形ポリゴン2枚にそのテクスチャを貼り付けて
フレームバッファに書き込むという方法を採ったほうが高速にフレームバッファを画面に出力できるような気がします
( 時間があるときに試してみます )