Merge remote-tracking branch 'origin/main'

This commit is contained in:
2025-05-30 14:28:28 -05:00
2 changed files with 65 additions and 1 deletions

View File

@@ -178,6 +178,8 @@ public:
}
}
void TakeScreenshot();
protected:
private:
};

View File

@@ -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);
}
@@ -215,7 +219,7 @@ void FractalInspectorApp::CreateMenu() {
auto* misc = toolbar->AddSubmenu("Miscellaneous");
{
misc->AddButton("Take Screenshot");
misc->AddButton("Take Screenshot", [this] () { this->TakeScreenshot(); });
misc->AddButton("Take Collage");
}
@@ -670,3 +674,61 @@ void FractalInspectorApp::OnKeyDown(const ReWindow::KeyDownEvent &e) {
void FractalInspectorApp::OnKeyUp(const ReWindow::KeyUpEvent &e) {
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()));
}