Итак, недавно я прошел и преобразовал написанное мной простое тестовое приложение для использования новой версии Direct2D, что означает, что я в основном скопировал соответствующие части Краткое руководство по Direct2D для 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];
Это все еще работало, но я подумал, что, поскольку у меня есть этот отличный метод Map в моем новом блестящем интерфейсе ID2D1Bitmap1, я могу избавиться от этого массива на стороне процессора и сделать что-то вроде:
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());
Это не удалось при вызове Map с E_INVALIDARG, каждый раз с использованием различных комбинаций D2D1_BITMAP_OPTIONS в D2D1_BITMAP_PROPERTIES1, переданном CreateBitmap и D2D1_MAP_OPTIONS в вызове Map.
Глядя на описание D2D1_MAP_OPTIONS перечисление кажется, что ни один из трех вариантов (READ, WRITE, DISCARD) на самом деле не может использоваться для растровых изображений, которые я создаю в контексте Direct2D...
Как мне получить в Direct2D растровое изображение, которое я могу отображать, записывать, удалять и рисовать?