GLK: Implemented debugger dumppic command

This commit is contained in:
Paul Gilbert 2019-07-29 21:04:04 -07:00
parent a04bdb3d7c
commit 97d4a60cfb
2 changed files with 92 additions and 5 deletions

View File

@ -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

View File

@ -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 {
@ -34,6 +36,11 @@ class Debugger : public GUI::Debugger {
private:
GlkEngine *_vm;
/**
* Saves a decoded raw image to a PNG file
*/
void saveRawPicture(const RawDecoder &rd, Common::WriteStream &ws);
/**
* Dump a picture
*/