(svn r18156) -Add: crash screenshot, created from blitter buffer

This commit is contained in:
smatz
2009-11-17 23:12:42 +00:00
parent 8894008ed7
commit 0c4cada640
6 changed files with 37 additions and 2 deletions

View File

@@ -21,6 +21,8 @@
#include "sound/sound_driver.hpp"
#include "video/video_driver.hpp"
#include "saveload/saveload.h"
#include "screenshot.h"
#include "gfx_func.h"
#include <squirrel.h>
#include "ai/ai_info.hpp"
@@ -249,6 +251,17 @@ bool CrashLog::WriteSavegame(char *filename, const char *filename_last) const
}
}
bool CrashLog::WriteScreenshot(char *filename, const char *filename_last) const
{
/* Don't draw when we have invalid screen size */
if (_screen.width < 1 || _screen.height < 1 || _screen.dst_ptr == NULL) return false;
RequestScreenshot(SC_RAW, "crash");
bool res = MakeScreenshot();
if (res) strecpy(filename, _full_screenshot_name, filename_last);
return res;
}
bool CrashLog::MakeCrashLog() const
{
/* Don't keep looping logging crashes. */
@@ -292,6 +305,15 @@ bool CrashLog::MakeCrashLog() const
printf("Writing crash savegame failed. Please attach the last (auto)save to any bug reports.\n\n");
}
printf("Writing crash screenshot...\n");
bret = this->WriteScreenshot(filename, lastof(filename));
if (bret) {
printf("Crash screenshot written to %s. Please add this file to any bug reports.\n\n", filename);
} else {
ret = false;
printf("Writing crash screenshot failed.\n\n");
}
return ret;
}

View File

@@ -154,6 +154,16 @@ public:
*/
bool WriteSavegame(char *filename, const char *filename_last) const;
/**
* Write the (crash) screenshot to a file.
* @note On success the filename will be filled with the full path of the
* screenshot. Make sure filename is at least \c MAX_PATH big.
* @param filename Output for the filename of the written file.
* @param filename_last The last position in the filename buffer.
* @return true when the crash screenshot was successfully made.
*/
bool WriteScreenshot(char *filename, const char *filename_last) const;
/**
* Makes the crash log, writes it to a file and then subsequently tries
* to make a crash dump and crash savegame. It uses DEBUG to write

View File

@@ -123,7 +123,6 @@ void CDECL error(const char *s, ...)
va_end(va);
ShowOSErrorBox(buf, true);
if (_video_driver != NULL) _video_driver->Stop();
/* Set the error message for the crash log and then invoke it. */
CrashLog::SetErrorMessage(buf);

View File

@@ -644,6 +644,8 @@ bool MakeScreenshot()
case SC_VIEWPORT:
UndrawMouseCursor();
DrawDirtyBlocks();
/* FALL THROUGH */
case SC_RAW:
_screenshot_type = SC_NONE;
return MakeSmallScreenshot();
case SC_WORLD:

View File

@@ -21,6 +21,7 @@ void SetScreenshotFormat(int i);
enum ScreenshotType {
SC_NONE, ///< No screenshot requested
SC_VIEWPORT, ///< Screenshot of viewport
SC_RAW, ///< Raw screenshot from blitter buffer
SC_WORLD, ///< World screenshot
};