В течение последних нескольких дней я искал возможность использовать DirectX 2D в шаблоне, где я могу рендерить «что-то», а затем это «что-то» - использовать в качестве входных данных для другого чертежа.
Всеиз RenderTargets, таких как Hwnd, Dc, Wic bitmap - не позволяет это сделать (Wic target не использует ускорение HW).
Единственный способ, который я нашел, - это D2D1DeviceContext M $ document
Там я могу создать ID2D1Bitmap1 (который также, при создании с флагом CPU_READ - можно отобразить и прочитать), который можно установить в качестве цели.
Пока - все хорошо, все работает нормально.Однако в конце мы все хотим отобразить результат рисования на экране пользователя и для этой цели - нам нужно передать его в некоторый DC WinAPI.
Я сделал это таким образом.
Создание ID2D1Bitmap1 с совместимостью с GDI
D2D1_BITMAP_PROPERTIES1 bitmapProperties =
D2D1::BitmapProperties1(
D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_GDI_COMPATIBLE,
D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED)
);
Получение из ID2D1DeviceContext - ID2D1GdiInteropRenderTarget
_d2d1context->QueryInterface(IID_PPV_ARGS(&_d2d1GDIinterface))
И, наконец, используя этот интерфейс, я получаю DC и использую функцию GDI BitBlt
void paste_bitmap_into_dc(HDC dc, ID2D1Bitmap& bitmap) {
_d2d1context->SetTarget(&bitmap);
_d2d1context->BeginDraw();
HDC new_dc;
_d2d1GDIinterface->GetDC(D2D1_DC_INITIALIZE_MODE_COPY, &new_dc);
BitBlt(dc, 0, 0, bitmap.size().x, bitmap.size().y, new_dc, 0, 0, SRCCOPY);
RECT update_rect;
SetRect(&update_rect, 0, 0, 0, 0); // i don't want to actually update bitmap on ID2D1DeviceContext
_d2d1GDIinterface->ReleaseDC(&update_rect);
_d2d1context->EndDraw();
}
Это работает, но я не уверен, что это правильный (самый быстрый) способ, поскольку создается DC и дважды копируется (надеюсь, на стороне HW): с целевой ID2D1Bitmap на этот новый DC, а затемс нового DC на вход DC.И на самом деле этот метод больше подходит для рисования с помощью GDI для содержимого D2D1 (ReleaceDC имеет аргумент, какую часть растрового изображения обновлять).
Кто-то может помочь / подтвердить, что это путь?Заранее спасибо!