BitBlit / Копировать из D2D1DeviceContext target D2D1Bitmap1 в HDC - PullRequest
0 голосов
/ 20 мая 2019

В течение последних нескольких дней я искал возможность использовать 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 имеет аргумент, какую часть растрового изображения обновлять).

Кто-то может помочь / подтвердить, что это путь?Заранее спасибо!

...