mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-14 13:50:13 +00:00
GLK: Implemented debugger dumppic command
This commit is contained in:
parent
a04bdb3d7c
commit
97d4a60cfb
@ -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
|
||||
|
@ -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
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user