2008-08-06 03:09:59 +02:00
|
|
|
/****************************************************************************
|
2008-09-12 07:28:40 +02:00
|
|
|
* Snes9x 1.51 Nintendo Wii/Gamecube Port
|
2008-08-14 00:44:59 +02:00
|
|
|
*
|
|
|
|
* softdev July 2006
|
|
|
|
* crunchy2 May 2007-July 2007
|
2008-11-12 08:50:39 +01:00
|
|
|
* Michniewski 2008
|
2009-03-11 18:28:37 +01:00
|
|
|
* Tantric 2008-2009
|
2008-08-14 00:44:59 +02:00
|
|
|
*
|
|
|
|
* freeze.cpp
|
2008-09-12 07:28:40 +02:00
|
|
|
***************************************************************************/
|
|
|
|
|
2009-02-07 04:01:10 +01:00
|
|
|
#include <malloc.h>
|
2008-08-06 03:09:59 +02:00
|
|
|
#include <gccore.h>
|
|
|
|
#include <stdio.h>
|
2009-03-11 18:28:37 +01:00
|
|
|
|
2008-08-06 03:09:59 +02:00
|
|
|
#include "snes9x.h"
|
2009-11-25 07:35:14 +01:00
|
|
|
#include "port.h"
|
2008-08-06 03:09:59 +02:00
|
|
|
#include "memmap.h"
|
|
|
|
#include "snapshot.h"
|
|
|
|
|
2008-10-03 07:26:01 +02:00
|
|
|
#include "snes9xGX.h"
|
2008-12-18 19:36:30 +01:00
|
|
|
#include "fileop.h"
|
2009-03-11 18:28:37 +01:00
|
|
|
#include "filebrowser.h"
|
|
|
|
#include "menu.h"
|
|
|
|
#include "video.h"
|
2009-11-25 07:35:14 +01:00
|
|
|
#include "pngu.h"
|
2008-08-06 03:09:59 +02:00
|
|
|
|
2009-11-25 07:35:14 +01:00
|
|
|
bool8 S9xOpenSnapshotFile(const char *filepath, bool8 readonly, STREAM *file)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2009-11-25 07:35:14 +01:00
|
|
|
return FALSE;
|
2008-08-06 03:09:59 +02:00
|
|
|
}
|
|
|
|
|
2009-11-25 07:35:14 +01:00
|
|
|
void S9xCloseSnapshotFile(STREAM s)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2008-09-12 07:28:40 +02:00
|
|
|
/****************************************************************************
|
2009-11-25 07:35:14 +01:00
|
|
|
* SaveSnapshot
|
2008-09-12 07:28:40 +02:00
|
|
|
***************************************************************************/
|
2008-08-07 05:25:02 +02:00
|
|
|
|
2008-08-06 03:09:59 +02:00
|
|
|
int
|
2009-11-25 07:35:14 +01:00
|
|
|
SaveSnapshot (char * filepath, bool silent)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2009-03-12 08:07:52 +01:00
|
|
|
int imgSize = 0; // image screenshot bytes written
|
2009-10-02 00:35:12 +02:00
|
|
|
int device;
|
|
|
|
|
|
|
|
if(!FindDevice(filepath, &device))
|
2008-11-12 08:50:39 +01:00
|
|
|
return 0;
|
2008-08-07 05:25:02 +02:00
|
|
|
|
2009-04-15 07:55:17 +02:00
|
|
|
// save screenshot - I would prefer to do this from gameScreenTex
|
2009-11-29 09:12:40 +01:00
|
|
|
if(gameScreenTex2 != NULL)
|
2009-04-15 07:55:17 +02:00
|
|
|
{
|
|
|
|
AllocSaveBuffer ();
|
|
|
|
|
|
|
|
IMGCTX pngContext = PNGU_SelectImageFromBuffer(savebuffer);
|
|
|
|
|
|
|
|
if (pngContext != NULL)
|
|
|
|
{
|
|
|
|
imgSize = PNGU_EncodeFromGXTexture(pngContext, screenwidth, screenheight, gameScreenTex2, 0);
|
|
|
|
PNGU_ReleaseImageContext(pngContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(imgSize > 0)
|
|
|
|
{
|
|
|
|
char screenpath[1024];
|
|
|
|
strncpy(screenpath, filepath, 1024);
|
|
|
|
screenpath[strlen(screenpath)-4] = 0;
|
|
|
|
sprintf(screenpath, "%s.png", screenpath);
|
2009-10-02 00:35:12 +02:00
|
|
|
SaveFile(screenpath, imgSize, silent);
|
2009-04-15 07:55:17 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
FreeSaveBuffer ();
|
|
|
|
}
|
|
|
|
|
2009-11-25 07:35:14 +01:00
|
|
|
STREAM fp = OPEN_STREAM(filepath, "wb");
|
|
|
|
|
|
|
|
if(!fp)
|
2008-08-07 05:25:02 +02:00
|
|
|
{
|
2009-11-25 07:35:14 +01:00
|
|
|
if(!silent)
|
|
|
|
ErrorPrompt("Save failed!");
|
|
|
|
return 0;
|
2008-08-07 05:25:02 +02:00
|
|
|
}
|
|
|
|
|
2009-11-25 07:35:14 +01:00
|
|
|
S9xFreezeToStream(fp);
|
|
|
|
CLOSE_STREAM(fp);
|
2008-11-12 08:50:39 +01:00
|
|
|
|
2009-11-25 07:35:14 +01:00
|
|
|
if(!silent)
|
|
|
|
InfoPrompt("Save successful");
|
|
|
|
return 1;
|
2008-08-06 03:09:59 +02:00
|
|
|
}
|
|
|
|
|
2009-03-11 18:28:37 +01:00
|
|
|
int
|
2009-11-25 07:35:14 +01:00
|
|
|
SaveSnapshotAuto (bool silent)
|
2009-03-11 18:28:37 +01:00
|
|
|
{
|
|
|
|
char filepath[1024];
|
|
|
|
|
2009-10-02 00:35:12 +02:00
|
|
|
if(!MakeFilePath(filepath, FILE_SNAPSHOT, Memory.ROMFilename, 0))
|
2009-03-20 09:26:10 +01:00
|
|
|
return false;
|
|
|
|
|
2009-11-25 07:35:14 +01:00
|
|
|
return SaveSnapshot(filepath, silent);
|
2009-03-11 18:28:37 +01:00
|
|
|
}
|
|
|
|
|
2008-09-12 07:28:40 +02:00
|
|
|
/****************************************************************************
|
2009-11-25 07:35:14 +01:00
|
|
|
* LoadSnapshot
|
2008-09-12 07:28:40 +02:00
|
|
|
***************************************************************************/
|
2008-08-06 03:09:59 +02:00
|
|
|
int
|
2009-11-25 07:35:14 +01:00
|
|
|
LoadSnapshot (char * filepath, bool silent)
|
2008-08-06 03:09:59 +02:00
|
|
|
{
|
2009-10-02 00:35:12 +02:00
|
|
|
int device;
|
|
|
|
|
|
|
|
if(!FindDevice(filepath, &device))
|
2009-03-11 18:28:37 +01:00
|
|
|
return 0;
|
2008-08-07 05:25:02 +02:00
|
|
|
|
2009-11-25 07:35:14 +01:00
|
|
|
STREAM fp = OPEN_STREAM(filepath, "rb");
|
2008-08-07 05:25:02 +02:00
|
|
|
|
2009-11-25 07:35:14 +01:00
|
|
|
if(!fp)
|
2008-11-12 08:50:39 +01:00
|
|
|
{
|
2009-11-25 07:35:14 +01:00
|
|
|
if(!silent)
|
|
|
|
ErrorPrompt("Unable to open snapshot!");
|
|
|
|
return 0;
|
|
|
|
}
|
2008-08-07 05:25:02 +02:00
|
|
|
|
2009-11-25 07:35:14 +01:00
|
|
|
int result = S9xUnfreezeFromStream(fp);
|
|
|
|
CLOSE_STREAM(fp);
|
2008-08-07 05:25:02 +02:00
|
|
|
|
2009-11-25 07:35:14 +01:00
|
|
|
if (result == SUCCESS)
|
|
|
|
return 1;
|
|
|
|
/*
|
|
|
|
switch (result)
|
2008-08-12 05:25:16 +02:00
|
|
|
{
|
2009-11-25 07:35:14 +01:00
|
|
|
case WRONG_FORMAT:
|
|
|
|
S9xMessage(S9X_ERROR, S9X_WRONG_FORMAT, SAVE_ERR_WRONG_FORMAT);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case WRONG_VERSION:
|
|
|
|
S9xMessage(S9X_ERROR, S9X_WRONG_VERSION, SAVE_ERR_WRONG_VERSION);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SNAPSHOT_INCONSISTENT:
|
|
|
|
S9xMessage(S9X_ERROR, S9X_SNAPSHOT_INCONSISTENT, MOVIE_ERR_SNAPSHOT_INCONSISTENT);
|
|
|
|
break;
|
2008-08-12 05:25:16 +02:00
|
|
|
}
|
2009-11-25 07:35:14 +01:00
|
|
|
*/
|
|
|
|
return 0;
|
2008-08-06 03:09:59 +02:00
|
|
|
}
|
2009-03-11 18:28:37 +01:00
|
|
|
|
|
|
|
int
|
2009-11-25 07:35:14 +01:00
|
|
|
LoadSnapshotAuto (bool silent)
|
2009-03-11 18:28:37 +01:00
|
|
|
{
|
|
|
|
char filepath[1024];
|
|
|
|
|
2009-10-02 00:35:12 +02:00
|
|
|
if(!MakeFilePath(filepath, FILE_SNAPSHOT, Memory.ROMFilename, 0))
|
2009-03-16 07:58:50 +01:00
|
|
|
return false;
|
2009-03-11 18:28:37 +01:00
|
|
|
|
2009-11-25 07:35:14 +01:00
|
|
|
return LoadSnapshot(filepath, silent);
|
2009-03-11 18:28:37 +01:00
|
|
|
}
|