CDrawImage クラス
CDrawImage クラスは、ビデオ レンダラ フィルタの描画を管理するヘルパー クラスである。すべての描画操作を GDI を使って実行する。このクラスは DirectDraw によるレンダリングをサポートしない。CDrawImage クラスでは、ビデオ ウィンドウを管理するオーナー フィルタも CBaseWindow クラスを使っている必要がある。CDrawImage コンストラクタは、CBaseWindow オブジェクトへのポインタを受け取る。
次の図は、カスタム ビデオ レンダラ フィルタにおけるこのクラスの望ましい使用方法を示している。
このクラスの使用方法は次のとおり。
- ピンを接続するとき、CDrawImage::NotifyMediaType メソッドと CDrawImage::NotifyAllocator メソッドを呼び出す。
- メディア タイプが変化したときは、NotifyMediaType を再度呼び出す。
- レンダリングが行われる前に、CDrawImage::SetDrawContext を呼び出す。
- 転送元矩形が変化したときは CDrawImage::SetSourceRect を、転送先矩形が変化したときは CDrawImage::SetTargetRect を呼び出す。
- パレット化されたイメージ用のパレットを管理する。これについては、この後のパレットに関するセクションで説明する。
アロケータ
上の図に示したフィルタは、カスタム アロケータ クラスである CImageAllocator を使っている。このアロケータは、GDI 関数 CreateDIBSection を使って共有メモリに DIB を作成する。このアロケータで作成したサンプルは CImageSample オブジェクトである。
フィルタが接続のためのアロケータを所有している場合、メディア サンプルは確実に CImageSample オブジェクトである。その場合、CDrawImage オブジェクトは BitBlt または StretchBlt を使って描画を最適化できる。それ以外の場合は、低速の SetDIBitsToDevice または StretchDIBits 関数を使わなければならない。高速オプションは CDrawImage::FastRender メソッドで実装し、低速オプションは CDrawImage::SlowRender メソッドで実装する。名前は Slow だが、SlowRender でも (新しいハードウェアでは特に) 大きなパフォーマンスへの影響はない。
パレット
描画に FastRender メソッドを使い、イメージがパレット化されている場合、フィルタは次のようにパレットを管理する必要がある。
- CImageSample クラスには、DIBDATA 構造体に格納されたパレットのバージョンを示す数値が含まれている。この値は、アロケータがサンプルを作成するときに初期化される。
- CDrawImage クラスにも、作成時に初期化されるパレットのバージョン数値が含まれる。
- メディア タイプがパレット化された新しいフォーマットに変わるたびに、CDrawImage::IncrementPaletteVersion を呼び出す。このメソッドは CDrawImage オブジェクトのパレット バージョン数をインクリメントする。フィルタが CImagePalette クラスを使ってパレット情報を管理する場合は、メディア タイプが変化するたびに CImagePalette::PreparePalette を呼び出すだけでよい。PreparePalette メソッドは必要な場合に限ってパレットのバージョンをインクリメントする。
- FastRender メソッドは CDrawImage のパレットのバージョンをサンプルのパレットのバージョンと比較する。サンプルのバージョンの数値が CDrawImage のバージョンの数値より遅れている場合、FastRender メソッドは CDrawImage::UpdateColourTable を呼び出す。UpdateColourTable メソッドは、GDI 関数 SetDIBColorTable を使って、デバイス コンテキストにカラー テーブルを設定する。さらに、サンプルのパレットのバージョンを最新バージョン数に更新する。
- ピンが再接続した場合、フィルタは CDrawImage::ResetPaletteVersion を呼び出してパレットのバージョンをリセットする。ピンの再接続時、アロケータはすべてのサンプルを再割り当てする。
要件
ヘッダー : Winutil.h で宣言し、Streams.h をインクルードする。
ライブラリ : Strmbase.lib (リテール ビルド) または Strmbasd.lib (デバッグ ビルド)。
プロテクト メンバ変数 | 説明 |
m_bStretch | 転送先ウィンドウに合わせてビデオ イメージを伸縮する必要があるかどうかを示す。 |
m_bUsingImageAllocator | ピン接続のアロケータが CImageAllocator オブジェクトであるかどうかを示す。 |
m_EndSample | 最新サンプルの停止タイムを指定する。 |
m_hdc | 所有者ウィンドウのデバイス コンテキストのハンドル。 |
m_MemoryDC | 所有者ウィンドウのメモリ デバイス コンテキストのハンドル。 |
m_PaletteVersion | パレットの変化を追跡するために使う。 |
m_pBaseWindow | 所有する CBaseWindow オブジェクトへのポインタ。 |
m_pMediaType | 現在のメディア タイプへのポインタ。 |
m_SourceRect | 描画の転送元矩形を指定する。 |
m_StartSample | 最新サンプルの開始タイムを指定する。 |
m_TargetRect | 描画の転送先矩形を指定する。 |
プロテクト メソッド | |
DisplaySampleTimes | ビデオ イメージの上にメディア サンプルのタイム スタンプを描画する。 |
FastRender | BitBlt または StretchBlt 関数を使ってビデオ イメージを描画する。 |
SetStretchMode | ビデオ イメージを伸縮する必要があるかどうかを計算する。 |
SlowRender | SetDIBitsToDevice または StretchDIBits 関数を使ってビデオ イメージを描画する。 |
UpdateColourTable | 新しいパレットでカラー テーブルを更新する。 |
パブリック メソッド | |
CDrawImage | コンストラクタ メソッド。 |
DrawImage | ビデオ ウィンドウ上にビデオ フレームを描画する。 |
DrawVideoImageHere | メディア サンプルから指定したデバイス コンテキストにイメージを描画する。 |
GetPaletteVersion | パレットのバージョンを取得する。 |
GetSourceRect | 現在の転送元矩形を取得する。 |
GetTargetRect | 現在の転送先矩形を取得する。 |
IncrementPaletteVersion | パレットのバージョンをインクリメントする。 |
NotifyAllocator | 接続のアロケータが CImageAllocator オブジェクトであるかどうかを CDrawImage オブジェクトに通知する。 |
NotifyEndDraw | サポートされていない。 |
NotifyMediaType | 現在のメディア タイプをオブジェクトに通知する。 |
NotifyStartDraw | サポートされていない。 |
ResetPaletteVersion | パレットのバージョンをリセットする。 |
ScaleSourceRect | ネイティブ ビデオ サイズとメディア タイプ フォーマットに相違がある場合は、指定した転送元矩形をスケーリングする。仮想。 |
SetDrawContext | 描画に使われるデバイス コンテキストを設定する。 |
SetSourceRect | 転送元矩形を設定する。 |
SetTargetRect | 転送先矩形を設定する。 |
UsingImageAllocator | 現在のアロケータが CImageAllocator オブジェクトであるかどうかを示す。 |