前回に引き続き、PVR形式のファイルに対応作業をしていました。メジャーどころの対応をひとまず行ってようやくエクスプローラーで確認出来るようになりました。
PVR形式は今現在、2種類ほどのフォーマットバージョンに対応する必要があります。
バージョン2と呼ばれる従来のバージョンでは、52バイトがヘッダで先頭ではなく途中に “PVR!” というタグが出現するフォーマットでした。一方で、バージョン3のヘッダでは52バイトというサイズは同じものの、メタデータが入ることで実質52バイト以上のヘッダとなるデータ構造をしています。そのためそのまま読み込むと画像が崩れたものになってしまいます。
バージョン3のヘッダ情報で大きく変わったものは画像のフォーマットに関するデータの持ち方です。DirectX 10 以降の多種多少なフォーマットに対応できるようなものになっており、PixelFormatだけで 64bitのデータ幅を持っています。
このバージョン3のヘッダ情報を下記に大まかに示します。
struct HeaderPVRv3 { uint32_t Version; uint32_t Flags; uint64_t PixelFormat; uint32_t ColorSpace; uint32_t ChannelType; uint32_t Height; uint32_t Width; uint32_t Depth; uint32_t NumSurface; uint32_t NumFace; uint32_t MipMapCount; uint32_t MetaDataSize; };
このヘッダの末尾、MetaDataSize 分をさらに読み進めると画像データそのものにたどり着くことが出来ます。
また今回のバージョン3からミップマップ数に、ベースレベルの画像をカウントするようになり、最低でも”1”が格納されるようになりました(従来はベースレベルをカウントしなかった)。
これらの詳しい情報は、PVR File Format Specification というPowerVR SDK内のドキュメントに記載があります。自力で実装する人はこちらを参照するとよいでしょう。
余談ですが、PowerVR SDKの中にはpvrをエクスプローラーのサムネイルで表示するシェル拡張DLLが既に含まれていました。そのため今自分が作成しているこのDLLは、pvrを表示したいという目的だけならば完全に不要なものとなってしまいそうです。