summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--readme.txt3
-rw-r--r--src/crashlog.cpp22
-rw-r--r--src/crashlog.h10
-rw-r--r--src/openttd.cpp1
-rw-r--r--src/screenshot.cpp2
-rw-r--r--src/screenshot.h1
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
};