preview window flipped
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
#include "../logging/Logger.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
|
||||
namespace RenderCadenceCompositor
|
||||
{
|
||||
@@ -210,36 +211,48 @@ void PreviewWindowThread::Paint(HWND window)
|
||||
frame.height > 0;
|
||||
if (canPaintFrame)
|
||||
{
|
||||
const int previousStretchMode = SetStretchBltMode(dc, HALFTONE);
|
||||
POINT previousBrushOrigin = {};
|
||||
SetBrushOrgEx(dc, 0, 0, &previousBrushOrigin);
|
||||
if (CopyPreviewOrientedBgra8Frame(frame))
|
||||
{
|
||||
const int previousStretchMode = SetStretchBltMode(dc, HALFTONE);
|
||||
POINT previousBrushOrigin = {};
|
||||
SetBrushOrgEx(dc, 0, 0, &previousBrushOrigin);
|
||||
|
||||
BITMAPINFO bitmapInfo = {};
|
||||
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||
bitmapInfo.bmiHeader.biWidth = static_cast<LONG>(frame.width);
|
||||
bitmapInfo.bmiHeader.biHeight = -static_cast<LONG>(frame.height);
|
||||
bitmapInfo.bmiHeader.biPlanes = 1;
|
||||
bitmapInfo.bmiHeader.biBitCount = 32;
|
||||
bitmapInfo.bmiHeader.biCompression = BI_RGB;
|
||||
BITMAPINFO bitmapInfo = {};
|
||||
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||
bitmapInfo.bmiHeader.biWidth = static_cast<LONG>(frame.width);
|
||||
bitmapInfo.bmiHeader.biHeight = -static_cast<LONG>(frame.height);
|
||||
bitmapInfo.bmiHeader.biPlanes = 1;
|
||||
bitmapInfo.bmiHeader.biBitCount = 32;
|
||||
bitmapInfo.bmiHeader.biCompression = BI_RGB;
|
||||
|
||||
StretchDIBits(
|
||||
dc,
|
||||
0,
|
||||
0,
|
||||
clientWidth,
|
||||
clientHeight,
|
||||
0,
|
||||
0,
|
||||
static_cast<int>(frame.width),
|
||||
static_cast<int>(frame.height),
|
||||
frame.bytes,
|
||||
&bitmapInfo,
|
||||
DIB_RGB_COLORS,
|
||||
SRCCOPY);
|
||||
StretchDIBits(
|
||||
dc,
|
||||
0,
|
||||
0,
|
||||
clientWidth,
|
||||
clientHeight,
|
||||
0,
|
||||
0,
|
||||
static_cast<int>(frame.width),
|
||||
static_cast<int>(frame.height),
|
||||
mPaintPixels.data(),
|
||||
&bitmapInfo,
|
||||
DIB_RGB_COLORS,
|
||||
SRCCOPY);
|
||||
|
||||
if (previousStretchMode != 0)
|
||||
SetStretchBltMode(dc, previousStretchMode);
|
||||
SetBrushOrgEx(dc, previousBrushOrigin.x, previousBrushOrigin.y, nullptr);
|
||||
if (previousStretchMode != 0)
|
||||
SetStretchBltMode(dc, previousStretchMode);
|
||||
SetBrushOrgEx(dc, previousBrushOrigin.x, previousBrushOrigin.y, nullptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!mLoggedPaintCopyFailure)
|
||||
{
|
||||
TryLog(LogLevel::Warning, "preview", "Preview frame could not be copied for mirrored presentation.");
|
||||
mLoggedPaintCopyFailure = true;
|
||||
}
|
||||
FillRect(dc, &client, reinterpret_cast<HBRUSH>(GetStockObject(BLACK_BRUSH)));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -251,4 +264,34 @@ void PreviewWindowThread::Paint(HWND window)
|
||||
|
||||
EndPaint(window, &paint);
|
||||
}
|
||||
|
||||
bool PreviewWindowThread::CopyPreviewOrientedBgra8Frame(const SystemFrame& frame)
|
||||
{
|
||||
constexpr std::size_t kBgraBytesPerPixel = 4;
|
||||
if (frame.bytes == nullptr || frame.width == 0 || frame.height == 0 || frame.rowBytes <= 0)
|
||||
return false;
|
||||
|
||||
const std::size_t width = static_cast<std::size_t>(frame.width);
|
||||
const std::size_t height = static_cast<std::size_t>(frame.height);
|
||||
const std::size_t sourceRowBytes = static_cast<std::size_t>(frame.rowBytes);
|
||||
const std::size_t destinationRowBytes = width * kBgraBytesPerPixel;
|
||||
if (sourceRowBytes < destinationRowBytes)
|
||||
return false;
|
||||
|
||||
mPaintPixels.resize(destinationRowBytes * height);
|
||||
const unsigned char* sourceBytes = static_cast<const unsigned char*>(frame.bytes);
|
||||
for (std::size_t y = 0; y < height; ++y)
|
||||
{
|
||||
const unsigned char* sourceRow = sourceBytes + (height - 1u - y) * sourceRowBytes;
|
||||
unsigned char* destinationRow = mPaintPixels.data() + y * destinationRowBytes;
|
||||
for (std::size_t x = 0; x < width; ++x)
|
||||
{
|
||||
const unsigned char* sourcePixel = sourceRow + x * kBgraBytesPerPixel;
|
||||
unsigned char* destinationPixel = destinationRow + x * kBgraBytesPerPixel;
|
||||
std::memcpy(destinationPixel, sourcePixel, kBgraBytesPerPixel);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
#include <atomic>
|
||||
#include <thread>
|
||||
#include <vector>
|
||||
|
||||
#ifndef NOMINMAX
|
||||
#define NOMINMAX
|
||||
@@ -35,9 +36,12 @@ private:
|
||||
void ThreadMain();
|
||||
bool CreatePreviewWindow(std::string& error);
|
||||
void Paint(HWND window);
|
||||
bool CopyPreviewOrientedBgra8Frame(const SystemFrame& frame);
|
||||
|
||||
SystemFrameExchange* mExchange = nullptr;
|
||||
PreviewWindowConfig mConfig;
|
||||
std::vector<unsigned char> mPaintPixels;
|
||||
bool mLoggedPaintCopyFailure = false;
|
||||
std::thread mThread;
|
||||
std::atomic<bool> mStopRequested{ false };
|
||||
std::atomic<bool> mRunning{ false };
|
||||
|
||||
Reference in New Issue
Block a user