Platform SDK: DirectX

ステップ 4.2 : 転送元矩形と転送先矩形のセットアップ

[Visual Basic]

ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectDraw Visual Basic チュートリアル」を参照すること。

[C++]

ドライバのオーバーレイ制限を取得した後、それに応じて転送元および転送先矩形にその値を設定する。これにより、オーバーレイをうまく表示できるようになる。Mosquito サンプル アプリケーションの以下のサンプルは、転送元矩形の特性を設定することにより始まる。

// 転送元 RECT に初期値を設定する。
    rs.left=0; rs.top=0; 
    rs.right = 320;
    rs.bottom = 240;
 
// 必要であれば、サイズ アライメント制限を適用する。
    if (capsDrv.dwCaps & DDCAPS_ALIGNSIZESRC && uSrcSizeAlign)
        rs.right -= rs.right % uSrcSizeAlign; 
 

上記のコードでは、サーフェス全体の寸法を含むサーフェスに対する初期値を設定する。デバイス ドライバに転送元矩形のサイズ アライメントが必要な場合、それに従うように転送元矩形を調整する。サーフェスを完全に再作成しないと幅を拡張できないため、この例では転送元矩形の幅を元のサイズよりも狭くなるよう調整する。ただし、小さめの矩形でコードを始めるように調整して、ドライバの制限に適合するよう矩形を広げていくこともできる。

転送元矩形の寸法を設定しハードウェア制限に従うようにした後、転送先矩形の寸法の設定と調整が必要となる。矩形を初めに伸縮してからサイズ アライメント制限に適合するよう調整する必要がある場合もあるため、このプロセスでは多少余分なタスクが必要となる。次のコードでは、最小伸縮係数を確保するためのタスクを実行する。

// 転送元 RECT 値で始まる転送先 RECT をセットアップする。
// RECT 値。サーフェス寸法と転送元 RECT 寸法が異なる場合は、
// 転送元 RECT 寸法を使用する。
    rd.left=0; rd.top=0; 
    rd.right  = (rs.right*uStretchFactor1000+999)/1000;
// (999 を足して、整数切り捨て問題を回避する)。
 
// (これは Ddraw では要求されないが、アスペクト比を
//  保持するために高さも伸縮する)。
    rd.bottom = rs.bottom*uStretchFactor1000/1000; 
 

上記のコードでは、転送先矩形の左上角をスクリーンの左上角に設定した後、最小伸縮係数に見合う幅を設定する。伸縮係数による調整中に、幅と伸縮係数の積に 999 を足すことに注意する。これにより、整数切り捨てのために矩形が最小伸縮係数の要求する幅に達しない事態を回避できる。詳細情報は、「最小および最大伸縮係数」を参照すること。また、この例では、幅を伸縮した後に高さも伸縮している。高さの伸縮は必要とはされていないものの、ビットマップのアスペクト比を保持し外観の歪みを防止するために実行する。

転送先矩形を伸縮した後、その矩形をサイズ アライメント制限に従うように調整する。次に例を示す。

// 課されたアライメント制限に適合するよう、
// 転送先 RECT の幅を調整する。
    if (capsDrv.dwCaps & DDCAPS_ALIGNSIZEDEST && uDestSizeAlign)
        rd.right = (int)((rd.right+uDestSizeAlign-1)/uDestSizeAlign)*uDestSizeAlign;
 

この例では、能力フラグを調べて、ドライバが転送先サイズ アライメント制限を課しているかをみる。制限を課している場合、転送先矩形の幅はアライメント制限を満たすのに十分なピクセル分だけ増やす。矩形は幅を狭めるのではなく、広げることで調整することに注意する。これは、幅を狭めると転送先矩形が最小伸縮係数で要求された幅より狭くなる可能性があり、オーバーレイ サーフェスの表示が失敗するためである。

次項 :ステップ 4.3 : オーバーレイ サーフェスの表示