DXライブラリは、LoadGraph が実行された際は内部で bmpファイルの読み込み関数である LoadBmpImage を実行したり
pngファイルの読み込み関数である LoadPngImage を実行したりしているのですが、この『ファイルを解析して画像を読み込む』処理を
AddUserGraphLoadFunction4 という関数で追加する事ができます( 追加する関数は自作する必要がありますが )
MAX_USERIMAGEREAD_FUNCNUM は、その独自の画像ファイル読み込み関数を追加できる数となります
AddUserGraphLoadFunction4 の宣言は以下のようになっていて
// ユーザー定義の画像データ読み込み関数Ver4を登録する
int AddUserGraphLoadFunction4( int (* UserLoadFunc )( STREAMDATA *Src, BASEIMAGE *BaseImage ) ) ;
画像読み込みを行う関数のポインタを渡して登録します
独自の画像読み込み関数内では STREAMDATA *Src を使用して画像ファイルのデータを読み込み解析し、
BASEIMAGE *BaseImage に読み込んだ画像を A8R8G8B8形式のようなDXライブラリ内部で使用する単純な
ピクセルフォーマットに変換して格納します
STREAMDATA構造体は以下のように定義されていまして
// ストリームデータ制御用データ構造体
struct STREAMDATA
{
STREAMDATASHRED ReadShred ;
DWORD_PTR DataPoint ;
} ;
更に STREAMDATASHRED構造体は以下のように定義されていまして
// ストリームデータ制御用関数ポインタ構造体
struct STREAMDATASHRED
{
LONGLONG (*Tell )( DWORD_PTR StreamDataPoint ) ;
int (*Seek )( DWORD_PTR StreamDataPoint, LONGLONG SeekPoint, int SeekType ) ;
size_t (*Read )( void *Buffer, size_t BlockSize, size_t DataNum, DWORD_PTR StreamDataPoint ) ;
int (*Eof )( DWORD_PTR StreamDataPoint ) ;
int (*IdleCheck )( DWORD_PTR StreamDataPoint ) ;
int (*Close )( DWORD_PTR StreamDataPoint ) ;
} ;
例えば STREAMDATA *Src を使用してファイルを 16バイト読み込む場合は以下のような記述になります
char Data[16];
Src->ReadShred.Read( Data, 16, 1, Src->DataPoint );
Src->ReadShread.Read や Src->ReadShread.Seek が fread, fseek と同じ効果で、Src->DataPoint が fread や fseek に
渡す FILE のポインタのような意味となります
( それならば何故引数を FILE *fp にしなかったのかと言いますと、メモリ上にある画像ファイルデータからの読み込みも
同じ画像読み込み関数で行うようにするためです( その場合は Src->ReadShread.Read を呼び出すとファイルからではなく
メモリからデータを読んできます ) )
というわけで、AddUserGraphLoadFunction4 で独自の画像読み込み関数を追加することで、
LoadGraph では通常読み込めない画像フォーマットの画像を読み込めるようにしたり、
自前で作成した独自形式の画像を読み込めるようにしたりすることができるというわけです
ただ、この関数を使用するには通常使用しない BASEIMAGE構造体の仕様も理解しなければいけなかったり、
LoadGraph で読み込めない画像を読み込む処理を実装したい場合は MakeARGB8ColorSoftImage などで
作成したソフトウェアイメージに DrawPixelSoftImage や GetImageAddressSoftImage を使用して
ピクセルデータを格納し、CreateGraphFromSoftImage でグラフィックハンドル化すれば事足りるので、
苦労して使う意味は特に無かったりします… (・・;
( 因みに AddUserGraphLoadFunction4 関数に渡す画像読み込み関数の実装例につきましてはDXライブラリのソースコードの
DxBaseImage.cpp の 2832行目にある LoadBmpImage 関数などをご覧になってみてください m(_ _)m )