adding screenshot to savestate files
authorJavier S. Pedro <maemo@javispedro.com>
Wed, 3 Aug 2011 01:51:48 +0000 (03:51 +0200)
committerJavier S. Pedro <maemo@javispedro.com>
Wed, 3 Aug 2011 01:51:48 +0000 (03:51 +0200)
platform/sdl.cpp
screenshot.cpp
screenshot.h
snapshot.cpp

index cd540c7..cca3153 100644 (file)
@@ -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();
index 7908f29..9a6e43a 100644 (file)
@@ -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);
 
index 15da6f6..4304745 100644 (file)
@@ -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
index d2ee654..7e259bf 100644 (file)
@@ -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;