aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2019-07-29 21:04:04 -0700
committerPaul Gilbert2019-07-29 22:05:19 -0700
commit97d4a60cfb635f59c2e35e144ce3337046f84977 (patch)
tree1500dce6b23be3fd07f3defe6848810feebda7d9
parenta04bdb3d7c77897f562c65166dcf30a82d1825b7 (diff)
downloadscummvm-rg350-97d4a60cfb635f59c2e35e144ce3337046f84977.tar.gz
scummvm-rg350-97d4a60cfb635f59c2e35e144ce3337046f84977.tar.bz2
scummvm-rg350-97d4a60cfb635f59c2e35e144ce3337046f84977.zip
GLK: Implemented debugger dumppic command
-rw-r--r--engines/glk/debugger.cpp90
-rw-r--r--engines/glk/debugger.h7
2 files changed, 92 insertions, 5 deletions
diff --git a/engines/glk/debugger.cpp b/engines/glk/debugger.cpp
index 57188db756..2f13f6bfbd 100644
--- a/engines/glk/debugger.cpp
+++ b/engines/glk/debugger.cpp
@@ -20,14 +20,17 @@
*
*/
-#include "common/file.h"
-#include "glk/glk.h"
#include "glk/debugger.h"
+#include "glk/glk.h"
+#include "glk/raw_decoder.h"
+#include "common/file.h"
+#include "graphics/managed_surface.h"
+#include "image/png.h"
namespace Glk {
Debugger::Debugger(GlkEngine *vm) : GUI::Debugger(), _vm(vm) {
- registerCmd("dumppic", WRAP_METHOD(Debugger, cmdExit));
+ registerCmd("dumppic", WRAP_METHOD(Debugger, cmdDumpPic));
}
int Debugger::strToInt(const char *s) {
@@ -48,13 +51,90 @@ int Debugger::strToInt(const char *s) {
bool Debugger::cmdDumpPic(int argc, const char **argv) {
if (argc != 2) {
- debugPrintf("Format: dumppic <picture number>");
+ debugPrintf("Format: dumppic <picture number>\n");
} else {
+ Common::File f;
int picNum = strToInt(argv[1]);
- warning("TODO: dumpPic %d", picNum);
+
+ Common::String filename = Common::String::format("pic%d.png", picNum);
+ if (!f.exists(filename))
+ filename = Common::String::format("pic%d.jpg", picNum);
+
+ if (f.open(filename)) {
+ // png or jpeg file
+ Common::DumpFile df;
+ if (df.open(filename)) {
+ // Write out a copy of the file
+ byte *data = new byte[f.size()];
+ f.read(data, f.size());
+ df.write(data, f.size());
+ delete[] data;
+ df.close();
+
+ debugPrintf("Dumped picture\n");
+ } else {
+ debugPrintf("Could not find specified picture\n");
+ }
+ } else if (f.exists(Common::String::format("pic%d.rect"))) {
+ debugPrintf("Picture is only a placeholder rectangle\n");
+ } else if (f.open(Common::String::format("pic%d.raw", picNum))) {
+ // Raw picture
+#ifdef USE_PNG
+ Common::DumpFile df;
+ RawDecoder rd;
+
+ if (rd.loadStream(f) && df.open(Common::String::format("pic%d.png", picNum))) {
+ saveRawPicture(rd, df);
+ debugPrintf("Dumped picture\n");
+ } else {
+ debugPrintf("Couldn't save picture\n");
+ }
+#else
+ debugPrintf("PNG support needed to dump raw pictures\n");
+#endif
+ } else {
+ debugPrintf("No such picture exists\n");
+ }
}
return true;
}
+void Debugger::saveRawPicture(const RawDecoder &rd, Common::WriteStream &ws) {
+#ifdef USE_PNG
+ const Graphics::Surface *surface = rd.getSurface();
+ const byte *palette = rd.getPalette();
+ int paletteCount = rd.getPaletteColorCount();
+ int palStart = rd.getPaletteStartIndex();
+ int transColor = rd.getTransparentColor();
+
+ // If the image doesn't have a palette, we can directly write out the image
+ if (!palette) {
+ Image::writePNG(ws, *surface);
+ return;
+ }
+
+ // Create a new RGBA temporary surface
+ Graphics::PixelFormat format(4, 8, 8, 8, 8, 24, 16, 8, 0);
+ Graphics::ManagedSurface destSurface(surface->w, surface->h, format);
+
+ for (uint y = 0; y < surface->h; ++y) {
+ const byte *srcP = (const byte *)surface->getBasePtr(0, y);
+ uint32 *destP = (uint32 *)destSurface.getBasePtr(0, y);
+
+ for (uint x = 0; x < surface->w; ++x, ++srcP, ++destP) {
+ if ((int)*srcP == transColor || (int)*srcP < palStart) {
+ *destP = format.ARGBToColor(0, 0, 0, 0);
+ } else {
+ assert(*srcP < paletteCount);
+ const byte *palP = &palette[*srcP * 3];
+ *destP = format.ARGBToColor(255, palP[0], palP[1], palP[2]);
+ }
+ }
+ }
+
+ Image::writePNG(ws, destSurface);
+#endif
+}
+
} // End of namespace Glk
diff --git a/engines/glk/debugger.h b/engines/glk/debugger.h
index d09ef99ae8..0555829a95 100644
--- a/engines/glk/debugger.h
+++ b/engines/glk/debugger.h
@@ -24,7 +24,9 @@
#define GLK_DEBUGGER_H
#include "common/scummsys.h"
+#include "common/stream.h"
#include "gui/debugger.h"
+#include "glk/raw_decoder.h"
namespace Glk {
@@ -35,6 +37,11 @@ private:
GlkEngine *_vm;
/**
+ * Saves a decoded raw image to a PNG file
+ */
+ void saveRawPicture(const RawDecoder &rd, Common::WriteStream &ws);
+
+ /**
* Dump a picture
*/
bool cmdDumpPic(int argc, const char **argv);