From f589b1e1fef4e435cbe1c8aa2ec14c60d7cc05be Mon Sep 17 00:00:00 2001 From: Aiden Date: Wed, 20 May 2026 15:03:02 +1000 Subject: [PATCH] preview window flipped --- src/preview/PreviewWindowThread.cpp | 97 +++++++++++++++++++++-------- src/preview/PreviewWindowThread.h | 4 ++ 2 files changed, 74 insertions(+), 27 deletions(-) diff --git a/src/preview/PreviewWindowThread.cpp b/src/preview/PreviewWindowThread.cpp index d543b01..485187e 100644 --- a/src/preview/PreviewWindowThread.cpp +++ b/src/preview/PreviewWindowThread.cpp @@ -4,6 +4,7 @@ #include "../logging/Logger.h" #include +#include 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(frame.width); - bitmapInfo.bmiHeader.biHeight = -static_cast(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(frame.width); + bitmapInfo.bmiHeader.biHeight = -static_cast(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(frame.width), - static_cast(frame.height), - frame.bytes, - &bitmapInfo, - DIB_RGB_COLORS, - SRCCOPY); + StretchDIBits( + dc, + 0, + 0, + clientWidth, + clientHeight, + 0, + 0, + static_cast(frame.width), + static_cast(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(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(frame.width); + const std::size_t height = static_cast(frame.height); + const std::size_t sourceRowBytes = static_cast(frame.rowBytes); + const std::size_t destinationRowBytes = width * kBgraBytesPerPixel; + if (sourceRowBytes < destinationRowBytes) + return false; + + mPaintPixels.resize(destinationRowBytes * height); + const unsigned char* sourceBytes = static_cast(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; +} } diff --git a/src/preview/PreviewWindowThread.h b/src/preview/PreviewWindowThread.h index b177ad7..a0f3022 100644 --- a/src/preview/PreviewWindowThread.h +++ b/src/preview/PreviewWindowThread.h @@ -6,6 +6,7 @@ #include #include +#include #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 mPaintPixels; + bool mLoggedPaintCopyFailure = false; std::thread mThread; std::atomic mStopRequested{ false }; std::atomic mRunning{ false };