ID2D1Bitmap1 :: Map,你什么时候可以使用它?

时间:2013-02-09 21:00:32

标签: c++ windows-8 direct2d

所以我最近经历并转换了一个我编写的简单测试应用程序以使用新版本的Direct2D,这意味着我基本上复制了the Direct2D Quickstart for Windows 8的相关部分。这很有效,因为我的应用程序表现得像以前一样(只是绘制一堆像素。)

以前,为了更新位图,我正在执行以下操作:

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());

此未能在呼叫与E_INVALIDARG,每次地图,使用D2D1_BITMAP_OPTIONS在D2D1_BITMAP_PROPERTIES1传递给CreateBitmap和各种组合D2D1_MAP_OPTIONS在调用地图。

查看D2D1_MAP_OPTIONS enumeration的描述,看来3个选项(READ,WRITE,DISCARD)中没有一个可以实际用于我使用Direct2D上下文创建的位图......

如何在Direct2D中获得一个可以映射,写入,取消映射和绘制的位图?

2 个答案:

答案 0 :(得分:1)

您的问题是您的映射指针不应该是空指针。我建议根据以下内容更改您的代码:

D2D1_MAPPED_RECT已映射;

ThrowIfFailed(pBitmap-&gt; Map(D2D1_MAP_OPTIONS_WRITE,&amp; mapped));

答案 1 :(得分:0)

最近我挖掘了这个并面临同样的问题。据我所知,D2D位图无法锁定为CPU写入。除此之外,你不能创建Bitmap用于使用D2D进行写入和使用CPU进行读取。

我想用CPU和D2D api读取和写入一些字节数组。但不幸的是,我必须使用使用不同bitmapOptions创建的2个位图。首先适用于D2D api,可以为上下文渲染目标

props.bitmapOptions = D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_TARGET;

秒可以用CPU读取

props.bitmapOptions = D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_CPU_READ;

使用场景是“首先渲染基元,使用ID2D1Bitmap1::CopyFromBitmap从第二个获取数据(使用map / unmap)”