Fix crash when generating screenshots (F9 key)

Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
falkTX 2023-08-28 09:35:00 +02:00
parent 1c6cc082d9
commit 08763a2318
No known key found for this signature in database
GPG key ID: CDBAA37ABC74FBA0
2 changed files with 9 additions and 6 deletions

View file

@ -72,7 +72,7 @@ void Engine_setAboutToClose(Engine*);
void Engine_setRemoteDetails(Engine*, remoteUtils::RemoteDetails*); void Engine_setRemoteDetails(Engine*, remoteUtils::RemoteDetails*);
} }
namespace window { namespace window {
void WindowSetPluginUI(Window* window, DISTRHO_NAMESPACE::UI* ui); void WindowSetPluginUI(Window* window, CardinalBaseUI* ui);
void WindowSetMods(Window* window, int mods); void WindowSetMods(Window* window, int mods);
void WindowSetInternalSize(rack::window::Window* window, math::Vec size); void WindowSetInternalSize(rack::window::Window* window, math::Vec size);
} }

View file

@ -153,7 +153,7 @@ enum ScreenshotStep {
struct Window::Internal { struct Window::Internal {
std::string lastWindowTitle; std::string lastWindowTitle;
DISTRHO_NAMESPACE::UI* ui = nullptr; CardinalBaseUI* ui = nullptr;
DGL_NAMESPACE::NanoTopLevelWidget* tlw = nullptr; DGL_NAMESPACE::NanoTopLevelWidget* tlw = nullptr;
DISTRHO_NAMESPACE::WindowParameters params; DISTRHO_NAMESPACE::WindowParameters params;
DISTRHO_NAMESPACE::WindowParametersCallback* callback = nullptr; 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 nanovg context failed, init only bare minimum
if (window->vg == nullptr) if (window->vg == nullptr)
@ -598,7 +598,8 @@ static void Window__writeImagePNG(void* context, void* data, int size) {
CardinalBaseUI* const ui = static_cast<CardinalBaseUI*>(context); CardinalBaseUI* const ui = static_cast<CardinalBaseUI*>(context);
if (char* const screenshot = String::asBase64(data, size).getAndReleaseBuffer()) { if (char* const screenshot = String::asBase64(data, size).getAndReleaseBuffer()) {
ui->setState("screenshot", screenshot); ui->setState("screenshot", screenshot);
remoteUtils::sendScreenshotToRemote(ui->remoteDetails, screenshot); if (ui->remoteDetails != nullptr)
remoteUtils::sendScreenshotToRemote(ui->remoteDetails, screenshot);
std::free(screenshot); std::free(screenshot);
} }
} }
@ -731,10 +732,10 @@ void Window::step() {
if (internal->generateScreenshotStep == kScreenshotStepSaving) if (internal->generateScreenshotStep == kScreenshotStepSaving)
{ {
// Write pixels to PNG // Write pixels to PNG
const int stride = winWidth * depth;
uint8_t* const pixelsWithOffset = pixels + (stride * y);
Window__flipBitmap(pixels, winWidth, winHeight, depth); Window__flipBitmap(pixels, winWidth, winHeight, depth);
winHeight -= y; winHeight -= y;
const int stride = winWidth * depth;
uint8_t* const pixelsWithOffset = pixels + (stride * y);
#ifdef STBI_WRITE_NO_STDIO #ifdef STBI_WRITE_NO_STDIO
Window__downscaleBitmap(pixelsWithOffset, winWidth, winHeight); Window__downscaleBitmap(pixelsWithOffset, winWidth, winHeight);
stbi_write_png_to_func(Window__writeImagePNG, internal->ui, stbi_write_png_to_func(Window__writeImagePNG, internal->ui,
@ -744,8 +745,10 @@ void Window::step() {
#endif #endif
internal->generateScreenshotStep = kScreenshotStepNone; internal->generateScreenshotStep = kScreenshotStepNone;
#ifdef CARDINAL_TRANSPARENT_SCREENSHOTS
APP->scene->menuBar->show(); APP->scene->menuBar->show();
APP->scene->rack->children.front()->show(); APP->scene->rack->children.front()->show();
#endif
} }
delete[] pixels; delete[] pixels;