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 перечисление кажется, что ни один из трех вариантов (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 не может быть заблокирован для записи для процессора. Более того, вы не можете создать растровое изображение как для записи с D2D, так и для чтения с процессором.

И я хотел бы читать и записывать массив байтов с процессором и API D2D. Но, к сожалению, мне приходится использовать 2 растровых изображения, созданных с разными bitmapOptions. Сначала подходит для API D2D и может быть целью рендеринга для контекста.

props.bitmapOptions = D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_TARGET;

второй может быть прочитан с процессором

props.bitmapOptions = D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_CPU_READ;

И сценарий использования: «рендерить примитивы в первый, использовать ID2D1Bitmap1::CopyFromBitmap для получения данных из второго (с картой/некартой)»

person mjollneer    schedule 14.05.2015