diff options
-rw-r--r-- | readme.txt | 3 | ||||
-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 |
6 files changed, 37 insertions, 2 deletions
diff --git a/readme.txt b/readme.txt index 28745fd17..4cbb5dbd2 100644 --- a/readme.txt +++ b/readme.txt @@ -68,7 +68,8 @@ When you are sure it is not already reported you should: forum thread related to that patch pack. * Make it reproducible for the developers. In other words, create a savegame in which you can reproduce the issue once loaded. It is very useful to give - us the crash.dmp, crash.sav and crash.log which are created on crashes. + us the crash.dmp, crash.sav, crash.log and crash screenshot which are + created on crashes. * Check whether the bug is already reported on our bug tracker. This includes searching for recently closed bug reports as the bug might already be fixed. 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 }; |