From 91d659c39881e7ac8aad7d9e23cda0d2c3de2f38 Mon Sep 17 00:00:00 2001 From: "Javier S. Pedro" Date: Wed, 3 Aug 2011 03:51:48 +0200 Subject: [PATCH] adding screenshot to savestate files --- platform/sdl.cpp | 8 ++++---- screenshot.cpp | 10 +++++----- screenshot.h | 2 +- snapshot.cpp | 21 +++++++++++++++------ 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/platform/sdl.cpp b/platform/sdl.cpp index cd540c7..cca3153 100644 --- a/platform/sdl.cpp +++ b/platform/sdl.cpp @@ -269,17 +269,17 @@ int main(int argc, char ** argv) { #endif } while (!Config.quitting); - // Deinitialization + // Prepare for pause S9xAudioOutputEnable(false); S9xDeinitInputDevices(); - S9xDeinitAudioOutput(); - S9xDeinitDisplay(); // Save state Memory.SaveSRAM(S9xGetFilename(FILE_SRAM)); pauseGame(); - // Late deinitialization + // Deinitialization + S9xDeinitAudioOutput(); + S9xDeinitDisplay(); S9xGraphicsDeinit(); Memory.Deinit(); S9xUnloadConfig(); diff --git a/screenshot.cpp b/screenshot.cpp index 7908f29..9a6e43a 100644 --- a/screenshot.cpp +++ b/screenshot.cpp @@ -110,9 +110,9 @@ static void write_data(png_structp png_ptr, png_bytep data, png_size_t length) png_size_t new_size = p->size + length; if (!p->buffer) { - p->buffer = (png_bytep) malloc(p->buf_size); p->buf_size = new_size + 256; - p->size = new_size; + p->size = 0; + p->buffer = (png_bytep) malloc(p->buf_size); if (!p->buffer) { png_error(png_ptr, "Out of memory"); return; @@ -182,12 +182,12 @@ static void write_png(png_structp png_ptr, png_infop info_ptr) } png_write_row(png_ptr, row_data); } - delete row_data; + delete [] row_data; png_write_end(png_ptr, info_ptr); } -void * S9xScreenshot(size_t *size, bool compression) +void * S9xScreenshot(size_t *size) { ScreenshotPriv priv = { 0 }; @@ -211,7 +211,7 @@ void * S9xScreenshot(size_t *size, bool compression) } png_set_write_fn(png_ptr, &priv, write_data, flush_data); - png_set_compression_level(png_ptr, Z_NO_COMPRESSION); + png_set_compression_level(png_ptr, Z_BEST_SPEED); write_png(png_ptr, info_ptr); diff --git a/screenshot.h b/screenshot.h index 15da6f6..4304745 100644 --- a/screenshot.h +++ b/screenshot.h @@ -90,7 +90,7 @@ #ifndef SCREENSHOT_H #define SCREENSHOT_H -void * S9xScreenshot(size_t *size, bool compression); +void * S9xScreenshot(size_t *size); bool S9xSaveScreenshot(const char * file); #endif diff --git a/snapshot.cpp b/snapshot.cpp index d2ee654..7e259bf 100644 --- a/snapshot.cpp +++ b/snapshot.cpp @@ -56,6 +56,7 @@ #endif #include "srtc.h" #include "sdd1.h" +#include "screenshot.h" #define dprintf(...) /* disabled */ @@ -391,7 +392,6 @@ static STREAM ss_st; static void Freeze (); static int Unfreeze (); -static void FreezeSnapshot (const char *name); static void FreezeStruct (const char *name, void *base, FreezeData *fields, int num_fields); static void FreezeBlock (const char *name, uint8 *block, int size); @@ -512,6 +512,15 @@ static void Freeze () if (Settings.SuperFX) S9xSuperFXPostSaveState (); #endif +#ifdef CONF_PNG + /* Save a PNG screenshot for convenience. */ + size_t png_size; + uint8 *png = (uint8*) S9xScreenshot(&png_size); + if (png) { + FreezeBlock("PNG", png, png_size); + free(png); + } +#endif } static int Unfreeze() @@ -770,7 +779,7 @@ void FreezeStruct(const char *name, void *base, FreezeData *fields, FreezeBlock (name, block, len); - delete block; + delete[] block; } void FreezeBlock (const char *name, uint8 *block, int size) @@ -806,7 +815,7 @@ int UnfreezeStruct (const char *name, void *base, FreezeData *fields, if ((result = UnfreezeBlock (name, block, len)) != SUCCESS) { - free(block); + delete[] block; return (result); } @@ -871,7 +880,7 @@ int UnfreezeStruct (const char *name, void *base, FreezeData *fields, } } - delete block; + delete[] block; return (result); } @@ -904,9 +913,9 @@ int UnfreezeBlock(const char *name, uint8 *block, int size) if (rem) { - char *junk = (char*)malloc(rem); + char *junk = new char [rem]; READ_STREAM(junk, rem, ss_st); - free(junk); + delete[] junk; } return SUCCESS; -- 1.7.9.5