dds読み込み

帰省して戻ってきたら2週間くらいたってしまった。
ぼちぼち活動再開。


今回は、x形式のファイル読み込みで必要になったddsファイルのローダ。
DirectXに依存しないで読めるように自前で実装した(代わりにboost入っているけども)。
非圧縮の32bit形式まで動作確認できた。
いつも画像読み込み時のRGBAチャンネルの割り振りが難航するのだが、今回もどうもよくわからず。
ビットマスクが

A 0xFF000000
R 0x00FF0000
G 0x0000FF00
B 0x000000FF

だとBGRAということらしい。
いや、むしろこれをARGBと呼称するべきなのか?
いまいち、脳内イメージとメモリ内容が一致しないなー。


あと、ポインタを構造体にキャストするときはアライメントに注意が必要。
vcだと

#ifdef _MSC_VER
#pragma pack( push, 1 )
#endif

struct Hoge
{
DWORD number;
BYTE id;
};

#ifdef _MSC_VER
#pragma pack( pop )
#endif

gccだと

struct Hoge
{
DWORD number;
BYTE id;
}
#ifdef __GNUG__
__attribute__((packed))
#endif
;

両用にすると

#ifdef _MSC_VER
#pragma pack( push, 1 )
#endif

struct Hoge
{
DWORD number;
BYTE id;
}
#ifdef __GNUG__
__attribute__((packed))
#endif
;
// だめ押し
BOOST_STATIC_ASSERT(sizeof(Hoge)==5);

#ifdef _MSC_VER
#pragma pack( pop )
#endif

となる。
昔、Bitmap読み込みがgccでうまくできなかったのはこれが原因だ。たぶん。
バッドノウハウ臭が濃厚デス。

ソース↓
http://gist.github.com/282897