diff --git a/src/eventthread.cpp b/src/eventthread.cpp index 699155e..89774ce 100644 --- a/src/eventthread.cpp +++ b/src/eventthread.cpp @@ -185,6 +185,9 @@ void EventThread::process(RGSSThreadData &rtData) break; } + if (event.key.keysym.scancode == SDL_SCANCODE_F3) + rtData.rqScreenshot = true; + keyStates[event.key.keysym.scancode] = true; break; diff --git a/src/eventthread.h b/src/eventthread.h index bbe32cc..e76a73f 100644 --- a/src/eventthread.h +++ b/src/eventthread.h @@ -176,6 +176,8 @@ struct RGSSThreadData QByteArray rgssErrorMsg; + volatile bool rqScreenshot; + RGSSThreadData(EventThread *ethread, const char *argv0, SDL_Window *window) @@ -184,7 +186,8 @@ struct RGSSThreadData ethread(ethread), argv0(argv0), window(window), - sizeResoRatio(1, 1) + sizeResoRatio(1, 1), + rqScreenshot(false) {} }; diff --git a/src/graphics.cpp b/src/graphics.cpp index 331e84d..187af91 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -37,8 +37,10 @@ #include #include +#include #include +#include #include struct PingPong @@ -513,6 +515,44 @@ struct GraphicsPrivate swapGLBuffer(); } + + void writeScreenshot(const char *filename) + { + int bpp; + uint32_t rm, gm, bm, am; + SDL_PixelFormatEnumToMasks(SDL_PIXELFORMAT_ABGR8888, &bpp, &rm, &gm, &bm, &am); + + /* Discard alpha channel because it might have bogus values */ + SDL_Surface *screenshot = + SDL_CreateRGBSurface(0, scRes.x, scRes.y, bpp, rm, gm, bm, 0); + + screen.getPP().bindLastBuffer(); + + glReadPixels(0, 0, scSize.x, scSize.y, GL_RGBA, GL_UNSIGNED_BYTE, screenshot->pixels); + + IMG_SavePNG(screenshot, filename); + + SDL_FreeSurface(screenshot); + } + + void checkScreenshotRq() + { + if (!threadData->rqScreenshot) + return; + + threadData->rqScreenshot = false; + + struct timeval tv; + gettimeofday(&tv, 0); + struct tm tm = *localtime(&tv.tv_sec); + + char filename[32]; + + snprintf(filename, sizeof(filename), "%d%02d%02d-%02d%02d%02d.png", + tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); + + writeScreenshot(filename); + } }; Graphics::Graphics(RGSSThreadData *data) @@ -536,6 +576,8 @@ void Graphics::update() // p->cpuTimer->endTiming(); // p->gpuTimer->startTiming(); + p->checkScreenshotRq(); + if (p->frozen) return;