ID2D1Bitmap1::Map, кога можете да я използвате?

Така че наскоро преминах през и преобразувах просто тестово приложение, което написах, за да използва новата версия на 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, растерна карта, която мога да картографирам, пиша, премахвам картата и рисувам?


person Emory    schedule 09.02.2013    source източник


Отговори (2)


Вашият проблем е, че вашият картографиран указател не трябва да бъде нулев указател. Предлагам да промените кода си според следното:

D2D1_MAPPED_RECT картографиран;

ThrowIfFailed(pBitmap->Map(D2D1_MAP_OPTIONS_WRITE, &mapped));

person key4deadlock    schedule 17.02.2013

Наскоро се зарових в това и се сблъсках със същия проблем. Доколкото разбирам, D2D Bitmap не може да бъде заключен за запис за CPU. Повече от това не можете да създадете Bitmap както за запис с D2D, така и за четене с CPU.

И бих искал да чета и пиша някакъв байтов масив с CPU и D2D api. Но за съжаление трябва да използвам 2 растерни изображения, създадени с различни bitmapOptions. Първо подходящ за 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)“

person mjollneer    schedule 14.05.2015