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

Итак, я недавно прошел и преобразовал простое тестовое приложение, которое я написал, чтобы использовать новую версию Direct2D, что означает, что я в основном скопировал соответствующие части Direct2D Quickstart для 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 в звонке на карту.

Глядя на описание Перечисление D2D1_MAP_OPTIONS похоже, что ни одна из 3 опций (READ, WRITE, DISCARD) не может быть использована на битовых картах, которые я создаю в контексте Direct2D …

Как получить в Direct2D растровое изображение, которое я могу отображать, записывать, удалять и рисовать?

0

Решение

Ваша проблема в том, что ваш сопоставленный указатель не должен быть нулевым указателем. Я предлагаю изменить ваш код в соответствии со следующим:

D2D1_MAPPED_RECT сопоставлен;

ThrowIfFailed (pBitmap-> Map (D2D1_MAP_OPTIONS_WRITE, &картируется));

1

Другие решения

Недавно я копался в этом и столкнулся с той же проблемой. Насколько я понимаю, D2D Bitmap нельзя заблокировать для записи на процессор. Более того, вы не можете создавать растровые изображения как для записи в D2D, так и для чтения в CPU.

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

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 получить данные со второго (с картой / без карты) «

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector