diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/crashlog.cpp | 22 | ||||
-rw-r--r-- | src/crashlog.h | 10 | ||||
-rw-r--r-- | src/openttd.cpp | 1 | ||||
-rw-r--r-- | src/screenshot.cpp | 2 | ||||
-rw-r--r-- | src/screenshot.h | 1 |
5 files changed, 35 insertions, 1 deletions
diff --git a/src/crashlog.cpp b/src/crashlog.cpp index 46c98ec88..fd8469f17 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -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; } diff --git a/src/crashlog.h b/src/crashlog.h index b6fe2d458..5bc48dd3b 100644 --- a/src/crashlog.h +++ b/src/crashlog.h @@ -155,6 +155,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 * information like paths to the console. diff --git a/src/openttd.cpp b/src/openttd.cpp index 9d2c23afb..4840aca3e 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -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); diff --git a/src/screenshot.cpp b/src/screenshot.cpp index 995fb1acf..05f2881a5 100644 --- a/src/screenshot.cpp +++ b/src/screenshot.cpp @@ -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: diff --git a/src/screenshot.h b/src/screenshot.h index 410ca59a0..81b97f9ad 100644 --- a/src/screenshot.h +++ b/src/screenshot.h @@ -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 }; |