そこで私は最近、新しいバージョンの Direct2D を使用するために作成した簡単なテスト アプリを調べて変換しました。つまり、基本的に Windows 8 用の Direct2D クイックスタートの関連部分をコピーしたということです。私のアプリケーションが以前と同じように動作したという点で、それはうまくいきました(ピクセルの束を描画するだけです)。
以前は、ビットマップを更新するために、次のことを行っていました。
for(int i = 0; i < 1000; ++i )
{
int x = rand()%600;
int y = rand()%600;
int index = 4 * ( x + ( y * 600 ) );
imageData[index] = rand()%256;
imageData[index+2] = 0;
}
D2D1_RECT_U rect2 = RectU(0,0,600,600);
pBitmap->CopyFromMemory(&rect2, imageData, 600*4);
ここで、imageData は次のとおりです。
imageData = new byte[600*600*4];
それでもうまくいきましたが、光沢のある新しい ID2D1Bitmap1 インターフェイスにこの気の利いた Map メソッドがあるので、その CPU 側の配列を取り除き、次のようなことができると思いました。
D2D1_MAPPED_RECT* mapped = NULL;
ThrowIfFailed( pBitmap->Map( D2D1_MAP_OPTIONS_WRITE, mapped ) );
for(int i = 0; i < 1000; ++i)
{
int x = rand()%600;
int y = rand()%600;
int index = 4 * ( x + ( y * 600 ) );
mapped->bits[index] = rand()%256;
mapped->bits[index+2] = 0;
}
ThrowIfFailed(pBitmap->Unmap());
これは、CreateBitmap に渡された D2D1_BITMAP_PROPERTIES1 の D2D1_BITMAP_OPTIONS とMapの呼び出しでD2D1_MAP_OPTIONSのさまざまな組み合わせを使用して、E_INVALIDARG を指定した Map の呼び出しで毎回失敗しました。
D2D1_MAP_OPTIONS 列挙の説明を見ると、3 つのオプション (READ、WRITE、DISCARD) のいずれも、Direct2D コンテキストで作成したビットマップで実際に使用できないようです...
Direct2D で、マップ、書き込み、マップ解除、および描画できるビットマップを取得するにはどうすればよいですか?