From 08763a2318f86a2351364299d8868581560b1b83 Mon Sep 17 00:00:00 2001 From: falkTX Date: Mon, 28 Aug 2023 09:35:00 +0200 Subject: [PATCH] Fix crash when generating screenshots (F9 key) Signed-off-by: falkTX --- src/CardinalUI.cpp | 2 +- src/override/Window.cpp | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/CardinalUI.cpp b/src/CardinalUI.cpp index af71530..fddbca6 100644 --- a/src/CardinalUI.cpp +++ b/src/CardinalUI.cpp @@ -72,7 +72,7 @@ void Engine_setAboutToClose(Engine*); void Engine_setRemoteDetails(Engine*, remoteUtils::RemoteDetails*); } namespace window { - void WindowSetPluginUI(Window* window, DISTRHO_NAMESPACE::UI* ui); + void WindowSetPluginUI(Window* window, CardinalBaseUI* ui); void WindowSetMods(Window* window, int mods); void WindowSetInternalSize(rack::window::Window* window, math::Vec size); } diff --git a/src/override/Window.cpp b/src/override/Window.cpp index b98cddc..a8be7d7 100644 --- a/src/override/Window.cpp +++ b/src/override/Window.cpp @@ -153,7 +153,7 @@ enum ScreenshotStep { struct Window::Internal { std::string lastWindowTitle; - DISTRHO_NAMESPACE::UI* ui = nullptr; + CardinalBaseUI* ui = nullptr; DGL_NAMESPACE::NanoTopLevelWidget* tlw = nullptr; DISTRHO_NAMESPACE::WindowParameters params; DISTRHO_NAMESPACE::WindowParametersCallback* callback = nullptr; @@ -370,7 +370,7 @@ void WindowSetPluginRemote(Window* const window, NanoTopLevelWidget* const tlw) } } -void WindowSetPluginUI(Window* const window, DISTRHO_NAMESPACE::UI* const ui) +void WindowSetPluginUI(Window* const window, CardinalBaseUI* const ui) { // if nanovg context failed, init only bare minimum if (window->vg == nullptr) @@ -598,7 +598,8 @@ static void Window__writeImagePNG(void* context, void* data, int size) { CardinalBaseUI* const ui = static_cast(context); if (char* const screenshot = String::asBase64(data, size).getAndReleaseBuffer()) { ui->setState("screenshot", screenshot); - remoteUtils::sendScreenshotToRemote(ui->remoteDetails, screenshot); + if (ui->remoteDetails != nullptr) + remoteUtils::sendScreenshotToRemote(ui->remoteDetails, screenshot); std::free(screenshot); } } @@ -731,10 +732,10 @@ void Window::step() { if (internal->generateScreenshotStep == kScreenshotStepSaving) { // Write pixels to PNG - const int stride = winWidth * depth; - uint8_t* const pixelsWithOffset = pixels + (stride * y); Window__flipBitmap(pixels, winWidth, winHeight, depth); winHeight -= y; + const int stride = winWidth * depth; + uint8_t* const pixelsWithOffset = pixels + (stride * y); #ifdef STBI_WRITE_NO_STDIO Window__downscaleBitmap(pixelsWithOffset, winWidth, winHeight); stbi_write_png_to_func(Window__writeImagePNG, internal->ui, @@ -744,8 +745,10 @@ void Window::step() { #endif internal->generateScreenshotStep = kScreenshotStepNone; +#ifdef CARDINAL_TRANSPARENT_SCREENSHOTS APP->scene->menuBar->show(); APP->scene->rack->children.front()->show(); +#endif } delete[] pixels;