Merge remote-tracking branch 'origin/main'
This commit is contained in:
@@ -178,6 +178,8 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TakeScreenshot();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
private:
|
private:
|
||||||
};
|
};
|
||||||
|
@@ -90,6 +90,10 @@ void FractalInspectorApp::ParseCmdLineMessage(const std::string &message) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (misc::string_matches(cmd, {"screenshot", "screeny", "capture"})) {
|
||||||
|
return TakeScreenshot();
|
||||||
|
}
|
||||||
|
|
||||||
console->Log(std::format("No such command: {}", cmd), Colors::Red);
|
console->Log(std::format("No such command: {}", cmd), Colors::Red);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,7 +219,7 @@ void FractalInspectorApp::CreateMenu() {
|
|||||||
|
|
||||||
auto* misc = toolbar->AddSubmenu("Miscellaneous");
|
auto* misc = toolbar->AddSubmenu("Miscellaneous");
|
||||||
{
|
{
|
||||||
misc->AddButton("Take Screenshot");
|
misc->AddButton("Take Screenshot", [this] () { this->TakeScreenshot(); });
|
||||||
misc->AddButton("Take Collage");
|
misc->AddButton("Take Collage");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -670,3 +674,61 @@ void FractalInspectorApp::OnKeyDown(const ReWindow::KeyDownEvent &e) {
|
|||||||
void FractalInspectorApp::OnKeyUp(const ReWindow::KeyUpEvent &e) {
|
void FractalInspectorApp::OnKeyUp(const ReWindow::KeyUpEvent &e) {
|
||||||
scene->ObserveKeyInput(e.key, false);
|
scene->ObserveKeyInput(e.key, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FractalInspectorApp::TakeScreenshot() {
|
||||||
|
std::vector<Color4> pdatac4 = this->canvas->GetTexture()->GetPixelData();
|
||||||
|
std::vector<Color3> pdatac3;
|
||||||
|
pdatac3.reserve(pdatac4.size());
|
||||||
|
for (auto Color:pdatac4) {
|
||||||
|
pdatac3.emplace_back(Color.r, Color.g, Color.b);
|
||||||
|
}
|
||||||
|
uint8_t* frameBuffer = reinterpret_cast<uint8_t*>(pdatac3.data());
|
||||||
|
|
||||||
|
time_t t = std::time(nullptr);
|
||||||
|
tm tm = *std::localtime(&t);
|
||||||
|
|
||||||
|
std::ostringstream filename;
|
||||||
|
filename << std::put_time(&tm, "%Y-%m-%d %H-%M-%S") << ".bmp";
|
||||||
|
|
||||||
|
std::ofstream file(filename.str(), std::ios::out | std::ios::binary);
|
||||||
|
|
||||||
|
Vector2i wh = this->canvas->GetDimensions();
|
||||||
|
|
||||||
|
int fileSize = 54 + 3 * wh.x * wh.y;
|
||||||
|
unsigned char bmpfileheader[14] = {'B', 'M', 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0};
|
||||||
|
unsigned char bmpinfoheader[40] = {40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0};
|
||||||
|
bmpfileheader[2] = (unsigned char) (fileSize);
|
||||||
|
bmpfileheader[3] = (unsigned char) (fileSize >> 8);
|
||||||
|
bmpfileheader[4] = (unsigned char) (fileSize >> 16);
|
||||||
|
bmpfileheader[5] = (unsigned char) (fileSize >> 24);
|
||||||
|
bmpinfoheader[4] = (unsigned char) (width);
|
||||||
|
bmpinfoheader[5] = (unsigned char) (width >> 8);
|
||||||
|
bmpinfoheader[6] = (unsigned char) (width >> 16);
|
||||||
|
bmpinfoheader[7] = (unsigned char) (width >> 24);
|
||||||
|
bmpinfoheader[8] = (unsigned char) (height);
|
||||||
|
bmpinfoheader[9] = (unsigned char) (height >> 8);
|
||||||
|
bmpinfoheader[10] = (unsigned char) (height >> 16);
|
||||||
|
bmpinfoheader[11] = (unsigned char) (height >> 24);
|
||||||
|
|
||||||
|
file.write((char*)bmpfileheader, 14);
|
||||||
|
file.write((char*)bmpinfoheader, 40);
|
||||||
|
|
||||||
|
int padding = (4 - (width * 3) % 4) % 4;
|
||||||
|
for (int y = 0; y < height; ++y) {
|
||||||
|
for (int x = 0; x < width; ++x) {
|
||||||
|
unsigned char pixel[3];
|
||||||
|
pixel[0] = frameBuffer[(y * width + x) * 3 + 2];
|
||||||
|
pixel[1] = frameBuffer[(y * width + x) * 3 + 1];
|
||||||
|
pixel[2] = frameBuffer[(y * width + x) * 3];
|
||||||
|
file.write((char*)pixel, 3);
|
||||||
|
}
|
||||||
|
for (int p = 0; p < padding; ++p) {
|
||||||
|
file.write((char*)"\0", 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
console->Log(std::format("Took screenshot: {}", filename.str()));
|
||||||
|
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user