/* render/screenshot.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include #include "auxiliary/functions.h" #include "core/core.h" #include "filesystem/filesystem.h" #include "render/state.h" #include "render/screenshot.h" #include "render/image.h" #include "render/jpgfile.h" #include "render/pngfile.h" #include "render/tgafile.h" #include "render/gl.h" namespace render { core::Cvar *Screenshot::screenshotformat = 0; core::Cvar *Screenshot::screenshotquality = 0; int Screenshot::number = 0; void Screenshot::save() { bool available = false; std::string filename; const int TYPETGA = 0; const int TYPEPNG = 1; const int TYPEJPG = 2; int filetype = TYPETGA; // make sure the screenshots folder exists filename.assign(filesystem::writedir()); filename.append("screenshots"); if (!sys::directory_exists(filename)) { sys::mkdir(filename); } filename += '/'; aux::lowercase(screenshotformat->str()); if ((screenshotformat->str().compare("jpg") == 0) || (screenshotformat->str().compare("jpeg") == 0)) { filetype = TYPEJPG; if (screenshotquality->value() == 0) { (*screenshotquality) = 85; } else if (screenshotquality->value() < 10) { (*screenshotquality) = 10; } else if (screenshotquality->value() > 100) { (*screenshotquality) = 100; } } else if (screenshotformat->str().compare("png") == 0) { filetype = TYPEPNG; } else if (screenshotformat->str().compare("tga") == 0) { filetype = TYPETGA; } else { filetype = TYPETGA; (*screenshotformat) = "tga"; } // find the first available screenshots/osirion-yyyymmdd-hhmm-xxxx.ext std::stringstream filenamestr; int day, month, year, hour, min; sys::get_datetime(year, month, day, hour, min); filenamestr << filesystem::writedir() << "screenshots/osirion" << '-'; // date filenamestr << std::setfill('0') << std::setw(4) << year << std::setw(2) << month << std::setw(2) << day << '-'; // time filenamestr << std::setfill('0') << std::setw(2) << hour << std::setw(2) << min << '-'; do { std::stringstream nstr; nstr << std::setw(4) << std::setfill('0') << number; // sequence number filename.assign(filenamestr.str()); filename.append(nstr.str()); // extension filename.append("."); filename.append(screenshotformat->str()); FILE *handle = fopen(filename.c_str(), "r"); if (handle) { fclose(handle); } else { available = true; } number++; } while (!available); render::Image image(State::width(), State::height(), 3); glReadPixels(0, 0, (GLsizei) State::width(), (GLsizei) State::height(), GL_RGB, GL_UNSIGNED_BYTE, (void *) image.data()); image.flip(); if (filetype == TYPEPNG) { /* if ((Camera::width() % 8 != 0 ) || (Camera::height() % 8 != 0 )) { image.pad(); }*/ render::PNG::save(filename.c_str(), image); } else if (filetype == TYPEJPG) { /* if ((Camera::width() % 8 != 0 ) || (Camera::height() % 8 != 0 )) { image.pad(); } */ render::JPG::save(filename.c_str(), image, (int) screenshotquality->value()); } else if (filetype == TYPETGA) { render::TGA::save(filename.c_str(), image); } } } // namsepace render