IWICDdsFrameDecode
COM公式ドキュメント
DDS 画像データの単一フレームに、ネイティブな DXGI_FORMAT 形式のままアクセスする手段と、その画像データに関する情報を提供します。
解説(Remarks)
このインターフェイスは WIC DDS コーデックによって実装されます。このインターフェイスを取得するには、DDS コーデックを使用して IWICBitmapFrameDecode を作成し、IID_IWICDdsFrameDecode に対して QueryInterface を実行します。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
DDS 画像の幅と高さをブロック単位で取得します。
| pWidthInBlocks | DWORD* | out | DDS 画像の幅(ブロック単位)。 |
| pHeightInBlocks | DWORD* | out | DDS 画像の高さ(ブロック単位)。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
ブロック圧縮テクスチャの場合、画像は最も近い整数ブロックサイズに収まるようにパディングされるため、返される幅と高さの値はテクスチャサイズを完全には定義しません。たとえば、ピクセル寸法が 1x1、2x2、4x4 の 3 つの BC1 テクスチャは、いずれも pWidthInBlocks = 1 および pHeightInBlocks = 1 を返します。
テクスチャがブロック圧縮された DXGI_FORMAT を使用していない場合、このメソッドはテクスチャサイズをピクセル単位で返します。これらの形式では、IWICDdsFrameDecoder::GetFormatInfo が返すブロックサイズは 1x1 です。
DDS 画像が格納されている形式に関する情報を取得します。
| pFormatInfo | WICDdsFormatInfo* | out | DDS 形式に関する情報。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
この情報は、メモリの割り当てや、Direct3D または Direct2D リソースの構築に使用できます。たとえば、ID3D11Device::CreateTexture2D や ID2D1DeviceContext::CreateBitmap を使用する場合などです。
DDS ファイル内にネイティブに格納されているピクセルデータを要求します。
| prcBoundsInBlocks | WICRect* | in | ソースからコピーする矩形。NULL 値はテクスチャ全体を指定します。 テクスチャがブロック圧縮された DXGI_FORMAT を使用している場合、矩形のすべての値はピクセルではなくブロック数で表されます。 |
| cbStride | DWORD | in | 宛先バッファのストライド(バイト単位)。これは、バッファポインタから次のデータ行までのバイト数を表します。テクスチャがブロック圧縮された DXGI_FORMAT を使用している場合、「データ行」は複数のピクセルスキャンラインを含むブロックの行として定義されます。 |
| cbBufferSize | DWORD | in | 宛先バッファのサイズ(バイト単位)。 |
| pbBuffer | BYTE* | out | 宛先バッファへのポインタ。 |
戻り値
Type: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
テクスチャがブロック圧縮された DXGI_FORMAT を使用していない場合、このメソッドは IWICBitmapSource::CopyPixels と同様に動作します。ただし、ピクセル形式の変換は一切行わず、代わりに DDS ファイルの生データを生成します。
テクスチャがブロック圧縮された DXGI_FORMAT を使用している場合、このメソッドはブロックデータを提供されたバッファに直接コピーします。この場合、prcBoundsInBlocks パラメーターはピクセルではなくブロック単位で定義されます。これに該当するかどうかを判定するには、GetFormatInfo を呼び出し、返された WICDdsFormatInfo 構造体の DxgiFormat メンバーを読み取ります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWICDdsFrameDecode "{3D4C0C61-18A4-41E4-BD80-481A4FC9F464}" #usecom global IWICDdsFrameDecode IID_IWICDdsFrameDecode "{}" #comfunc global IWICDdsFrameDecode_GetSizeInBlocks 3 var,var #comfunc global IWICDdsFrameDecode_GetFormatInfo 4 var #comfunc global IWICDdsFrameDecode_CopyBlocks 5 var,int,int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IWICDdsFrameDecode "{3D4C0C61-18A4-41E4-BD80-481A4FC9F464}" #usecom global IWICDdsFrameDecode IID_IWICDdsFrameDecode "{}" #comfunc global IWICDdsFrameDecode_GetSizeInBlocks 3 sptr,sptr #comfunc global IWICDdsFrameDecode_GetFormatInfo 4 sptr #comfunc global IWICDdsFrameDecode_CopyBlocks 5 sptr,int,int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。