Microsoft DirectX 8.0

CDrawImage クラス

CDrawImage クラスは、所有する CBaseWindow オブジェクトのワーカー クラスである。このクラスは、そのクラスからの実際の描画操作を処理する。このクラスを使用するには、アロケータが合意したときに CDrawImage::NotifyAllocator を呼び出し、合意されたときに CMediaType オブジェクトへのポインタ (ポインタはコピーを作成するのではなく、このクラスで管理されるので、スタック ベースであってはならない) を指定して CDrawImage::NotifyMediaType を呼び出す必要がある。

パレットが変更された場合は、CDrawImage::IncrementPaletteVersion を呼び出し、レンダリングの前に CDrawImage::SetDrawContext を呼び出して、このクラスが所有する CBaseWindow オブジェクトからデバイス コンテキスト ハンドル (HDC) を取得できるようにする。

Protected データ メンバ

m_bStretch イメージを伸縮するフラグ。
m_bUsingImageAllocator サンプルが DIBSECTION 構造体を共有するかどうかを判断するフラグ。
m_EndSample 現在のサンプルの終了タイム。
m_hdc メイン ウィンドウのデバイス コンテキスト (DC)。
m_MemoryDC オフスクリーン描画 DC。
m_pBaseWindow 所有するビデオ ウィンドウ オブジェクト。
m_PaletteVersion 現在のパレットのバージョン トークン。
m_perfidRenderNow 描画から返った瞬間 (パフォーマンス ログ用)。
m_perfidRenderNow イメージのレンダリングにかかった時間 (パフォーマンス ログ用)。
m_pMediaType 現在のメディア タイプ フォーマットへのポインタ。
m_SourceRect 転送元イメージ矩形。
m_StartSample 現在のサンプルの開始タイム。
m_TargetRect 転送先矩形。

メンバ関数

CDrawImage CDrawImage オブジェクトを作成する。
DisplaySampleTimes イメージの先頭のサンプルのタイム スタンプを表示する。
DrawImage ウィンドウへのイメージの描画を処理する。
FastRender BitBlt および StretchBlt を使用してイメージを描画する。
GetPaletteVersion 現在インストールされているパレットのバージョンを取得する。
GetSourceRect 現在の転送元矩形を取得する。
GetTargetRect 現在の転送先矩形を取得する。
IncrementPaletteVersion 現在のパレットのバージョンをインクリメントする。
NotifyAllocator 使用するアロケータを描画オブジェクトに通知する。
NotifyEndDraw イメージ レンダリングの終了を指定する。
NotifyMediaType 接続時に確立されたメディア タイプを渡す。
NotifyStartDraw イメージ レンダリングの開始を指定する。
ResetPaletteVersion 現在のパレットのバージョンをリセットする。
ScaleSourceRect 指定された転送元矩形のスケーリングされたバージョンを取得する。
SetDrawContext 描画に使用するウィンドウおよびオフスクリーン デバイス コンテキストを設定する。
SetSourceRect ビデオの転送元矩形を設定する。
SetStretchMode 伸縮する必要があるかどうかを判断する。
SetTargetRect ウィンドウの転送先矩形を設定する。
SlowRender Microsoft® Win32® SetDIBitsToDevice および StretchDIBits 関数を使用してイメージを描画する。
UpdateColourTable DIBSECTION 構造体に保持されているパレットを更新する。
UsingImageAllocator 描画されるサンプルのタイプを取得する。

CDrawImage::CDrawImage

CDrawImage クラス

CDrawImage オブジェクトを作成する。

構文

CDrawImage(
CBaseWindow *pBaseWindow
);

パラメータ

pBaseWindow
描画が行われるウィンドウへのポインタ。

戻り値

戻り値なし。

注意

このクラスは、GDI によるイメージの描画を処理する。このクラスは、CImageAllocator および CBaseWindow クラスと密接に連携して機能する。描画コードは、それが渡されるバッファが Microsoft® Win32® CreateDIBSection 関数によって作成されている場合、高速な描画を実装できるので、このクラスは CImageAllocator クラスを認識している必要がある。イメージ アロケータはこのタイプのサンプルを作成する。CDrawImage::NotifyAllocator メンバ関数を使用して、CImageAllocator オブジェクト (または派生クラス) によってバッファが割り当てられているかどうかが、このクラスに通知される。

描画に使用するバッファが互換性のあるアロケータによって割り当てられていない場合、バッファは Win32 SetDIBitsToDevice ファミリの API を使用して描画する。CBaseWindow クラスは、イメージが描画されるウィンドウ ハンドルを取得する。描画コードが使用するデバイス コンテキストは、CDrawImage::SetDrawContext メンバ関数を使用して渡される。

CImageAllocatorCImageSample、および CDrawImage クラスは、すべて密接に関連している。イメージ アロケータが使用するバッファは、Win32 CreateDIBSection 関数を使用して作成される。次に、アロケータは CImageSample クラスに基づいて独自のサンプルを作成する。イメージ サンプルは、バッファ ポインタとその長さを使って初期化される。サンプルは、CreateDIBSection 関数から取得されたさまざまな情報を保持する構造体 (DIBDATA 構造体) にも渡される。

これらのサンプルを描画オブジェクトに渡すことができる。描画オブジェクトは、サンプルのプライベート フォーマット、およびサンプルから DIBDATA 構造体を取得する方法を認識している。描画オブジェクトは、この情報を取得した後、サンプルに含まれるイメージを描画するときに、DIBDATA 構造体に格納されたビットマップ ハンドルを GDI に渡すことができる。描画時にバッファ ポインタ (サンプルが CImageSample ではない場合に使用される) ではなく、サンプルから取得したビットマップ ハンドルを使用することによって、パフォーマンスが若干向上する。

CDrawImage::DisplaySampleTimes

CDrawImage クラス

イメージの先頭のサンプルのタイム スタンプを表示する。

構文

void DisplaySampleTimes(
IMediaSample *pSample
);

パラメータ

pSample
タイム スタンプを含むサンプルへのポインタ。

戻り値

戻り値なし。

注意

デバッグ ビルドでは、オブジェクトが描画しているイメージのタイム スタンプを確認することが重要になる場合がある。このメンバ関数は、サンプルが保持しているイメージのデータ ポインタと共に、そのタイム スタンプを取得する。次に、オフスクリーン デバイス コンテキストを使用して、イメージの上から約 80 パーセントの位置に、中央に揃えて時間を描画する。

これはプロテクト メンバ関数である。

CDrawImage::DrawImage

CDrawImage クラス

イメージを描画する。

構文

BOOL DrawImage(
IMediaSample *pMediaSample
);

パラメータ

pMediaSample
描画するサンプルへのポインタ。

戻り値

戻り値なし。

注意

サンプルが CImageAllocator オブジェクト (または派生クラス) で割り当てられている場合、このサンプルが含むイメージは Microsoft Win32 BitBlt または StretchBlt 関数を使用して描画される。それ以外の場合は、SetDIBitsToDevice または StretchDIBits を使用して描画される。クライアントは、このメンバ関数を呼び出す前に CDrawImage::NotifyAllocator を呼び出して、イメージ バッファがどのように割り当てられているかを CDrawImage オブジェクトに通知しなければならない。転送元または転送先が (CDrawImage::SetSourceRect および CDrawImage::SetTargetRect メンバ関数によって) 変更されるたびに、このオブジェクトに通知される。オブジェクトはこの情報を使用して、描画時にイメージを伸縮する必要があるかどうかを判断する。

CDrawImage::FastRender

CDrawImage クラス

Microsoft Win32 BitBlt および StretchBlt 関数を使用して、サンプル イメージを描画する。

構文

void FastRender(
IMediaSample *pMediaSample
);

パラメータ

pMediaSample
描画するサンプルへのポインタ。

戻り値

戻り値なし。

注意

このプロテクト メンバ関数は、イメージ バッファを含むサンプルを指定して CDrawImage によって呼び出される。このイメージ バッファは、Win32 CreateDIBSection 関数および CImageAllocator オブジェクト (または派生クラス) を使用して割り当てられていなければならない。このメカニズムを使って作成されたイメージを描画することによって、若干パフォーマンスが向上する。

CDrawImage::GetPaletteVersion

CDrawImage クラス

現在のパレットのバージョンを取得する。

構文

LONG GetPaletteVersion(void);

戻り値

パレットのバージョンを返す。

注意

このメンバ関数は、CImageAllocator (または派生クラスの) オブジェクトを通して割り当てられたサンプルを使用した場合にのみ適用可能である。パレットの処理の詳細については、「CDrawImage::UpdateColourTable メンバ関数」を参照すること。

CDrawImage::GetSourceRect

CDrawImage クラス

描画オブジェクトが使用する現在の転送元矩形を取得する。

構文

void GetSourceRect(
RECT *pSourceRect
);

パラメータ

pSourceRect
転送元矩形へのポインタ。

戻り値

戻り値なし。

CDrawImage::GetTargetRect

CDrawImage クラス

描画オブジェクトが使用する現在の転送先矩形を取得する。

構文

void GetTargetRect(
RECT *pTargetRect
);

パラメータ

pTargetRect
転送先矩形へのポインタ。

戻り値

戻り値なし。

CDrawImage::IncrementPaletteVersion

CDrawImage クラス

現在のパレットのバージョンをインクリメントする。

構文

void IncrementPaletteVersion(void);

戻り値

戻り値なし。

注意

このメンバ関数は、CImageAllocator (または派生クラスの) オブジェクトを通して割り当てられたサンプルを使用した場合にのみ適用可能である。パレットの処理の詳細については、「CDrawImage::UpdateColourTable メンバ関数」を参照すること。

CDrawImage::NotifyAllocator

CDrawImage クラス

出力ピンが実際に使用するアロケータを描画オブジェクトに通知する。

構文

void NotifyAllocator(
BOOL bUsingImageAllocator
);

パラメータ

bUsingImageAllocator
CImageAllocator オブジェクト アロケータを使用するかどうかを指定するフラグ。詳細については、「注意」を参照すること。

戻り値

戻り値なし。

注意

このメンバ関数は、使用するアロケータを描画オブジェクトに通知する。フィルタが Microsoft® DirectShow® CImageAllocator 基底クラスに基づくアロケータを使用することに合意している場合は、TRUE を指定してこのメンバ関数を呼び出す必要がある。このようなイメージ バッファは、CreateDIBSection を使用して作成される。それ以外の場合は、FALSE を指定してこのメンバ関数を呼び出す必要があり、イメージは SetDIBitsToDevice および StretchDIBits を使用して描画される。

CDrawImage::NotifyEndDraw

CDrawImage クラス

イメージ レンダリングの終了を指定する。

構文

void NotifyEndDraw(void);

戻り値

戻り値なし。

注意

このメンバ関数はパフォーマンス測定のために使用され、MSR_STOP マクロを呼び出す。

CDrawImage::NotifyMediaType

CDrawImage クラス

描画オブジェクトにイメージ フォーマットを提供する。

構文

void NotifyMediaType(
CMediaType *pMediaType
);

パラメータ

pMediaType
メディア タイプへのポインタ。

戻り値

戻り値なし。

注意

描画オブジェクトは、描画するイメージのフォーマットを認識しなければならない。ほとんどの場合、これはイメージが 8 ビット パレット化されている場合にパレットを取得できるようにするためである。描画クラスを使用するフィルタは、通常、接続を完了した後、これを呼び出す。

この関数は、パフォーマンス上の理由から、メディア タイプのコピーを作成せずに、ポインタを格納するだけである。したがって、呼び出し元はメディア タイプが誤って破棄されていないことを確認する必要がある。

CDrawImage::NotifyStartDraw

CDrawImage クラス

イメージ レンダリングの開始を指定する。

構文

void NotifyStartDraw(void);

戻り値

戻り値なし。

注意

このメンバ関数はパフォーマンス測定のために使用され、MSR_START マクロを呼び出す。

CDrawImage::ResetPaletteVersion

CDrawImage クラス

現在のパレットのバージョンをリセットする。

構文

void ResetPaletteVersion(void);

戻り値

戻り値なし。

注意

このメンバ関数は、CImageAllocator (または派生クラスの) オブジェクトを通して割り当てられたサンプルを使用した場合にのみ適用可能である。パレットの処理の詳細については、「CDrawImage::UpdateColourTable メンバ関数」を参照すること。

CDrawImage::ScaleSourceRect

CDrawImage クラス

指定された転送元矩形のスケーリングされたバージョンを取得する。

構文

virtual RECT ScaleSourceRect(
const RECT *pSource
);

パラメータ

pSource
スケーリングされていない転送元矩形へのポインタ。

戻り値

スケーリングされた転送元矩形を返す。デフォルトでは、スケーリングされていない pSource を返す。

注意

基底クラスの実装は、転送元矩形をスケーリングしない。派生クラスはこれをオーバーライドして、必要に応じてスケーリングを実装できる。

CDrawImage::SetDrawContext

CDrawImage クラス

描画に使用されるデバイス コンテキストを設定する。

構文

void SetDrawContext(void);

戻り値

戻り値なし。

注意

描画オブジェクトは、常に、イメージを描画するウィンドウのデバイス コンテキストを必要とする。また、DIBSECTION バッファを使用する場合にビットマップを選択するオフスクリーン デバイス コンテキストを必要とする。DIBSECTION バッファおよび CreateDIBSection の詳細については、Microsoft Platform SDK のドキュメントを参照すること。このメンバ関数は、通常、このクラスを使用するフィルタがウィンドウを初期化した後、このフィルタによって呼び出される。

CDrawImage::SetSourceRect

CDrawImage クラス

ビデオの転送元矩形を設定する。

構文

void SetSourceRect(
RECT *pSourceRect
);

パラメータ

pSourceRect
新しい転送元矩形へのポインタ。

戻り値

戻り値なし。

注意

指定された転送元矩形が使用可能なビデオの境界を越えないようにするために、このメンバ関数を呼び出す前に、転送元矩形が有効になっている必要がある。

CDrawImage::SetStretchMode

CDrawImage クラス

ビデオを伸縮するかどうかを判断する。

構文

void SetStretchMode(void);

戻り値

戻り値なし。

注意

オブジェクトにイメージの描画を指示する場合、オブジェクトはビデオが伸縮されているかどうかを認識する必要がある。これは、オブジェクトが呼び出す関数 (BitBlt または StretchBlt など) に影響するからである。各フレームについてこれを計算するのではなく、転送元矩形または転送先矩形が更新されたときに 1 回だけ計算する。このメンバ関数は、この計算を行うために、SetSourceRect および SetTargetRect によって呼び出される。

これはプロテクト メンバ関数である。

CDrawImage::SetTargetRect

CDrawImage クラス

ビデオの転送先矩形を設定する。

構文

void SetTargetRect(
RECT *pTargetRect
);

パラメータ

pTargetRect
新しい転送先矩形へのポインタ。

戻り値

戻り値なし。

注意

指定された転送先が空の再生領域を定義しないように、このメンバ関数を呼び出す前に転送先矩形が有効になっている必要がある。

CDrawImage::SlowRender

CDrawImage クラス

SetDIBitsToDevice および StretchDIBits を使用してイメージを描画する。

構文

void SlowRender(
IMediaSample *pMediaSample
);

パラメータ

pMediaSample
描画するサンプルへのポインタ。

戻り値

戻り値なし。

注意

指定されたサンプルは、描画するイメージを含んでおり、NotifyMediaType を使用して描画オブジェクトに対して指定されたフォーマットと一致している必要がある。

これはプロテクト メンバ関数である。

CDrawImage::UpdateColourTable

CDrawImage クラス

サンプルに関連付けられたパレットを更新する。

構文

void UpdateColourTable(
HDC hdc,
BITMAPINFOHEADER *pbmi
);

パラメータ

hdc
サンプルのイメージを含むデバイス コンテキスト。
pbmi
新しいパレットを格納する BITMAPINFO 構造体へのポインタ。

戻り値

戻り値なし。

注意

このメンバ関数は、CImageAllocator (または派生クラスの) オブジェクトを通して割り当てられたサンプルを使用した場合にのみ適用可能である。CImageAllocator は、Microsoft Win32 CreateDIBSection 関数を使用して作成されたサンプルを作成する。パレット化されたバッファが CreateDIBSection を使用して割り当てられている場合、そのバッファに関連付けられたパレットが渡される。

パレットが変更された場合、新しいパレットを描画する前に、そのパレットをバッファに関連付ける必要がある。これは、Win32 SetDIBColorTable 関数、および内部的には UpdateColourTable メンバ関数によって処理される。サンプル内に格納されたパレットのバージョンと、パレットが内部に保持しているパレットのバージョンが異なるので、描画コードでパレットの更新が認識される。

基本的に、サンプルは、作成時に初期パレット バージョンを取得する。パレットがフィルタなどによって変更された場合、パレットは、IncrementPaletteVersion メンバ関数を使用してパレットのバージョンをインクリメントするように、描画オブジェクトに指示する。描画オブジェクトが次にサンプルを描画するときには、サンプルのパレットのバージョンが古いことを認識し、そのサンプルについて UpdateColourTable を呼び出す。

描画オブジェクトは、NotifyAllocator メンバ関数を使用して、サンプルで使用されるバッファのタイプを認識する。TRUE を指定して呼び出された場合、このメンバ関数に渡されるバッファは、CImageAllocator (または派生クラスの) オブジェクトによって割り当てられる。FALSE を指定して呼び出された場合、バッファは標準のシステム メモリ (または同じ方法で GDI からアクセスできるその他のメモリ) 内で割り当てられる。

アロケータがデコミットされると、通常、アロケータが保持しているすべてのサンプルが削除される。その後、アロケータがコミットされると、サンプルは最初のパレット バージョンを使用して再び作成される。この時点で、アロケータは描画オブジェクト内のパレットのバージョンをリセットし、同期させる必要がある。アロケータは、ResetPaletteVersion メンバ関数を呼び出すことによって、この処理を実行できる。

これはプロテクト メンバ関数である。

CDrawImage::UsingImageAllocator

CDrawImage クラス

描画されるサンプルのタイプを取得する。

構文

BOOL UsingImageAllocator(void);

戻り値

次のいずれかの値を返す。
TRUECreateDIBSection を使用して割り当てられた。
FALSECreateDIBSection を使用して割り当てられていない。

注意

このメンバ関数は、CImageAllocator (または派生クラスの) オブジェクトを通して割り当てられたサンプルを使用した場合にのみ適用可能である。パレット処理とイメージ アロケータの詳細については、「CDrawImage::UpdateColourTable メンバ関数」を参照すること。