1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#include "Screenshot.h"
#include <vector>
#include "Rendering/GL/myGL.h"
#include "Rendering/GlobalRendering.h"
#include "Rendering/Textures/Bitmap.h"
#include "System/StringUtil.h"
#include "System/Config/ConfigHandler.h"
#include "System/Log/ILog.h"
#include "System/FileSystem/FileSystem.h"
#include "System/FileSystem/FileHandler.h"
#include "System/Threading/ThreadPool.h"
#undef CreateDirectory
CONFIG(int, ScreenshotCounter).defaultValue(0);
struct FunctionArgs
{
std::vector<uint8_t> pixelbuf;
std::string filename;
int x;
int y;
};
void TakeScreenshot(std::string type)
{
if (type.empty())
type = "jpg";
if (!FileSystem::CreateDirectory("screenshots"))
return;
FunctionArgs args;
args.x = globalRendering->dualScreenMode? globalRendering->viewSizeX << 1: globalRendering->viewSizeX;
args.y = globalRendering->viewSizeY;
args.x += ((4 - (args.x % 4)) * int((args.x % 4) != 0));
const int shotCounter = configHandler->GetInt("ScreenshotCounter");
// note: we no longer increment the counter until a "file not found" occurs
// since that stalls the thread and might run concurrently with an IL write
args.filename.assign("screenshots/screen" + IntToString(shotCounter, "%05d") + "." + type);
args.pixelbuf.resize(args.x * args.y * 4);
configHandler->Set("ScreenshotCounter", shotCounter + 1);
glReadPixels(0, 0, args.x, args.y, GL_RGBA, GL_UNSIGNED_BYTE, &args.pixelbuf[0]);
ThreadPool::Enqueue([](const FunctionArgs& args) {
CBitmap bmp(&args.pixelbuf[0], args.x, args.y);
bmp.ReverseYAxis();
bmp.Save(args.filename, true, true);
}, args);
}
|