From c6c042aa52d73720172e00500b5768bcf092bc85 Mon Sep 17 00:00:00 2001 From: Hirek Date: Wed, 17 Sep 2025 17:34:53 +0200 Subject: [PATCH] Fix screenshot manager on OpenGL renderers --- CMakeLists.txt | 12 +++--- screenshot.cpp | 104 ++++++++++++++++++++++++------------------------- 2 files changed, 58 insertions(+), 58 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 72762d95..0eef1607 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -339,7 +339,7 @@ if (WIN32) set(SOURCES ${SOURCES} "windows.cpp" "Console.cpp" "Console/LPT.cpp" "Console/PoKeys55.cpp") #set(GLFW3_INCLUDE_DIR ${GLFW3_INCLUDE_DIR} "${DEPS_DIR}/glfw/include/") - #set(PNG_INCLUDE_DIRS ${PNG_INCLUDE_DIRS} "${DEPS_DIR}/libpng/include/") + set(PNG_INCLUDE_DIRS ${PNG_INCLUDE_DIRS} "${DEPS_DIR}/libpng/include/") #set(ZLIB_INCLUDE_DIR ${ZLIB_INCLUDE_DIR} "${DEPS_DIR}/zlib/") set(OPENAL_INCLUDE_DIR ${OPENAL_INCLUDE_DIR} "${DEPS_DIR}/openal/include") set(LIBSNDFILE_INCLUDE_DIR ${LIBSNDFILE_INCLUDE_DIR} "${DEPS_DIR}/libsndfile/include") @@ -358,7 +358,7 @@ if (WIN32) set (PREFIX "-${ARCH}") #set(GLFW3_LIBRARIES ${GLFW3_LIBRARIES} "${DEPS_DIR}/glfw/lib/${ARCH}/glfw3dll.lib") - #set(PNG_LIBRARIES ${PNG_LIBRARIES} "${DEPS_DIR}/libpng/lib/${ARCH}/libpng16.lib") + set(PNG_LIBRARIES ${PNG_LIBRARIES} "${DEPS_DIR}/libpng/lib/${ARCH}/libpng16.lib") set(OPENAL_LIBRARY ${OPENAL_LIBRARY} "${DEPS_DIR}/openal/lib/${ARCH}/OpenAL32.lib") set(LIBSNDFILE_LIBRARY ${LIBSNDFILE_LIBRARY} "${DEPS_DIR}/libsndfile/lib/${ARCH}/libsndfile-1.lib") set(LUAJIT_LIBRARIES ${LUAJIT_LIBRARIES} "${DEPS_DIR}/luajit/lib/${ARCH}/lua51.lib") @@ -463,11 +463,11 @@ if (WITH_PYTHON) endif() if (NOT WIN32) - #find_package(PNG 1.6 REQUIRED) - #target_link_libraries(${PROJECT_NAME} PNG::PNG) + find_package(PNG 1.6 REQUIRED) + target_link_libraries(${PROJECT_NAME} PNG::PNG) else() - #include_directories(${PNG_INCLUDE_DIRS}) - #target_link_libraries(${PROJECT_NAME} ${PNG_LIBRARIES}) + include_directories(${PNG_INCLUDE_DIRS}) + target_link_libraries(${PROJECT_NAME} ${PNG_LIBRARIES}) endif() find_package(Threads REQUIRED) diff --git a/screenshot.cpp b/screenshot.cpp index 06407846..1685f64a 100644 --- a/screenshot.cpp +++ b/screenshot.cpp @@ -2,66 +2,66 @@ #include "screenshot.h" #include "Globals.h" #include "Logs.h" -//#include +#include void screenshot_manager::screenshot_save_thread( char *img, int w, int h ) { -// png_image png; -// memset(&png, 0, sizeof(png_image)); -// png.version = PNG_IMAGE_VERSION; -// png.width = w; -// png.height = h; -// -// int stride; -// if (Global.gfx_usegles) -// { -// png.format = PNG_FORMAT_RGBA; -// stride = -w * 4; -// -// for (int y = 0; y < h; y++) -// for (int x = 0; x < w; x++) -// img[(y * w + x) * 4 + 3] = 0xFF; -// } -// else -// { -// png.format = PNG_FORMAT_RGB; -// stride = -w * 3; -// } -// -// char datetime[64]; -// time_t timer; -// struct tm* tm_info; -// time(&timer); -// tm_info = localtime(&timer); -// strftime(datetime, 64, "%Y-%m-%d_%H-%M-%S", tm_info); -// -// uint64_t perf; -//#ifdef _WIN32 -// QueryPerformanceCounter((LARGE_INTEGER*)&perf); -//#elif __unix__ -// timespec ts; -// clock_gettime(CLOCK_REALTIME, &ts); -// perf = ts.tv_nsec; -//#endif -// -// std::string filename = Global.screenshot_dir + "/" + std::string(datetime) + -// "_" + std::to_string(perf) + ".png"; -// -// if (png_image_write_to_file(&png, filename.c_str(), 0, img, stride, nullptr) == 1) -// WriteLog("saved " + filename); -// else -// WriteLog("failed to save " + filename); + png_image png; + memset(&png, 0, sizeof(png_image)); + png.version = PNG_IMAGE_VERSION; + png.width = w; + png.height = h; + + int stride; + if (Global.gfx_usegles) + { + png.format = PNG_FORMAT_RGBA; + stride = -w * 4; + + for (int y = 0; y < h; y++) + for (int x = 0; x < w; x++) + img[(y * w + x) * 4 + 3] = 0xFF; + } + else + { + png.format = PNG_FORMAT_RGB; + stride = -w * 3; + } + + char datetime[64]; + time_t timer; + struct tm* tm_info; + time(&timer); + tm_info = localtime(&timer); + strftime(datetime, 64, "%Y-%m-%d_%H-%M-%S", tm_info); + + uint64_t perf; +#ifdef _WIN32 + QueryPerformanceCounter((LARGE_INTEGER*)&perf); +#elif __unix__ + timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + perf = ts.tv_nsec; +#endif + + std::string filename = Global.screenshot_dir + "/" + std::string(datetime) + + "_" + std::to_string(perf) + ".png"; + + if (png_image_write_to_file(&png, filename.c_str(), 0, img, stride, nullptr) == 1) + WriteLog("saved " + filename); + else + WriteLog("failed to save " + filename); delete[] img; } void screenshot_manager::make_screenshot() { - // char *img = new char[Global.fb_size.x * Global.fb_size.y * 4]; - // glReadPixels(0, 0, Global.fb_size.x, Global.fb_size.y, Global.gfx_usegles ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)img); - ////m7t: use pbo - // - // std::thread t(screenshot_save_thread, img, Global.fb_size.x, Global.fb_size.y); - //t.detach(); + char *img = new char[Global.fb_size.x * Global.fb_size.y * 4]; + glReadPixels(0, 0, Global.fb_size.x, Global.fb_size.y, Global.gfx_usegles ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)img); + //m7t: use pbo + + std::thread t(screenshot_save_thread, img, Global.fb_size.x, Global.fb_size.y); + t.detach(); }