Така че наскоро преминах през и преобразувах просто тестово приложение, което написах, за да използва новата версия на 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 enumeration изглежда, че нито една от 3-те опции (READ, WRITE, DISCARD) всъщност не може да се използва върху растерни изображения, които създавам с Direct2D контекста...
Как да получа, в Direct2D, растерна карта, която мога да картографирам, пиша, премахвам картата и рисувам?