StretchBlt работает только тогда, когда nHeightDest отрицателен

Я пытаюсь использовать StretchBlt для того, чтобы скопировать пиксели из памяти HDC в окно HDC.
Память hdc получает изображение из невидимого окна, которое отображает поток с использованием openGL.

Вот мой код:

BITMAPINFOHEADER createBitmapHeader(int width, int height) {
BITMAPINFOHEADER header;
header.biSize = sizeof(BITMAPINFOHEADER);
header.biWidth = width;
header.biHeight = height;
header.biPlanes = 1;
header.biBitCount = 32;
header.biCompression = BI_RGB;
header.biSizeImage = 0;
header.biXPelsPerMeter = 0;
header.biYPelsPerMeter = 0;
header.biClrUsed = 0;
header.biClrImportant = 0;

return header;
}

...

HDC memoryHdc = CreateCompatibleDC(windowHdc);
BITMAPINFO bitmapInfo;
bitmapInfo.bmiHeader = createBitmapHeader(targetDimensions.width, targetDimensions.height);
HBITMAP bitmap = CreateDIBitmap(windowHdc, &bitmapInfo.bmiHeader, CBM_INIT, offscreenBuffer, &bitmapInfo, DIB_RGB_COLORS);
SelectObject(memoryHdc, bitmap);
DeleteObject(bitmap);

SetStretchBltMode(windowHdc, COLORONCOLOR);
StretchBlt(windowHdc,
targetDimensions.x, targetDimensions.y,
targetDimensions.width, -targetDimensions.height,
memoryHdc,
sourceDimensions.x, sourceDimensions.y,
sourceDimensions.width, sourceDimensions.height,
SRCCOPY);

DeleteDC(memoryHdc);

куда windowHdc это HDC окна, к которому я хочу StretchBlt скопировать пиксели и offscreenBuffer это void* на пиксели, скопированные из закадрового окна, в котором работает openGL.

Этот код прекрасно работает, за исключением того, что изображение перевернуто, и я хочу, чтобы оно было перевернуто вертикально.
Я знаю, что это происходит потому, что:

Если nHeightSrc и nHeightDest имеют разные знаки, функция
создает зеркальное отображение растрового изображения вдоль оси Y

Но когда я удаляю знак минус и высота цели и источника совпадают, я не вижу изображения в окне.
Просто чтобы проверить, я попытался поставить минус на sourceDimensions.height но это также приводит к отсутствию изображения, и то же самое, если я пытаюсь отрицать ширину (и цель, и источник).

Есть идеи почему?
Благодарю.

1

Решение

Задача ещё не решена.

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


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