Skip to content

Commit

Permalink
GLK: Implemented debugger dumppic command
Browse files Browse the repository at this point in the history
  • Loading branch information
dreammaster committed Jul 30, 2019
1 parent a04bdb3 commit 97d4a60
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 5 deletions.
90 changes: 85 additions & 5 deletions engines/glk/debugger.cpp
Expand Up @@ -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) {
Expand All @@ -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
7 changes: 7 additions & 0 deletions engines/glk/debugger.h
Expand Up @@ -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 {

Expand All @@ -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
*/
Expand Down

0 comments on commit 97d4a60

Please sign in to comment.