save state screenshots, fix video

This commit is contained in:
dborth 2009-04-06 07:27:40 +00:00
parent 5efb6e6a69
commit 734a557da5
3 changed files with 40 additions and 15 deletions

View File

@ -17,6 +17,8 @@
#include <string.h> #include <string.h>
#include <malloc.h> #include <malloc.h>
#include <fat.h> #include <fat.h>
#include "pngu/pngu.h"
#include "types.h" #include "types.h"
#include "state.h" #include "state.h"
#include "x6502.h" #include "x6502.h"
@ -26,6 +28,7 @@
#include "filebrowser.h" #include "filebrowser.h"
#include "memcardop.h" #include "memcardop.h"
#include "fileop.h" #include "fileop.h"
#include "gcvideo.h"
extern "C" { extern "C" {
/*** External functions ***/ /*** External functions ***/
@ -296,6 +299,7 @@ bool SaveState (char * filepath, int method, bool silent)
bool retval = false; bool retval = false;
int datasize; int datasize;
int offset = 0; int offset = 0;
int imgSize = 0; // image screenshot bytes written
if(method == METHOD_AUTO) if(method == METHOD_AUTO)
method = autoSaveMethod(silent); method = autoSaveMethod(silent);
@ -320,15 +324,39 @@ bool SaveState (char * filepath, int method, bool silent)
} }
offset = SaveFile(filepath, datasize, method, silent); offset = SaveFile(filepath, datasize, method, silent);
if (offset > 0)
{
if ( !silent )
InfoPrompt("Save successful");
retval = true;
}
} }
FreeSaveBuffer (); FreeSaveBuffer ();
// save screenshot - I would prefer to do this from gameScreenTex
if(gameScreenTex2 != NULL && method != METHOD_MC_SLOTA && method != METHOD_MC_SLOTB)
{
AllocSaveBuffer ();
IMGCTX pngContext = PNGU_SelectImageFromBuffer(savebuffer);
if (pngContext != NULL)
{
imgSize = PNGU_EncodeFromGXTexture(pngContext, 640, 480, gameScreenTex2, 0);
PNGU_ReleaseImageContext(pngContext);
}
if(imgSize > 0)
{
char screenpath[1024];
filepath[strlen(filepath)-4] = 0;
sprintf(screenpath, "%s.png", filepath);
SaveFile(screenpath, imgSize, method, silent);
}
FreeSaveBuffer ();
}
if (offset > 0)
{
if (!silent)
InfoPrompt("Save successful");
retval = true;
}
return retval; return retval;
} }

View File

@ -242,10 +242,8 @@ vbgetback (void *arg)
{ {
while (1) while (1)
{ {
/*if(GCSettings.timing != vmode_60hz) VIDEO_WaitVSync();
VIDEO_WaitVSync(); SyncSpeed();
else*/
SyncSpeed();
LWP_SuspendThread (vbthread); LWP_SuspendThread (vbthread);
} }
@ -265,7 +263,7 @@ InitVideoThread ()
LWP_InitQueue (&videoblankqueue); LWP_InitQueue (&videoblankqueue);
/*** Create the thread on this queue ***/ /*** Create the thread on this queue ***/
LWP_CreateThread (&vbthread, vbgetback, NULL, vbstack, TSTACK, 77); LWP_CreateThread (&vbthread, vbgetback, NULL, vbstack, TSTACK, 100);
} }
/**************************************************************************** /****************************************************************************
@ -744,13 +742,12 @@ void RenderFrame(unsigned char *XBuf)
// load texture into GX // load texture into GX
DCFlushRange(texturemem, TEX_WIDTH * TEX_HEIGHT * 2); DCFlushRange(texturemem, TEX_WIDTH * TEX_HEIGHT * 2);
GX_LoadTexObj (&texobj, GX_TEXMAP0); GX_LoadTexObj (&texobj, GX_TEXMAP0);
GX_InvalidateTexAll();
// render textured quad // render textured quad
draw_square(view); draw_square(view);
GX_DrawDone(); GX_DrawDone();
// EFB is ready to be coied into XFB // EFB is ready to be copied into XFB
VIDEO_SetNextFramebuffer(xfb[whichfb]); VIDEO_SetNextFramebuffer(xfb[whichfb]);
VIDEO_Flush(); VIDEO_Flush();
copynow = GX_TRUE; copynow = GX_TRUE;

View File

@ -258,7 +258,7 @@ decodePrefsData (int method)
verMinor >= 0 && verMinor <= 9 && verMinor >= 0 && verMinor <= 9 &&
verPoint >= 0 && verPoint <= 9)) verPoint >= 0 && verPoint <= 9))
result = false; result = false;
else if(verMajor == 2 && verPoint < 7) // less than version 2.0.7 else if(verMajor <= 3) // less than version 3.0.0
result = false; // reset settings result = false; // reset settings
else if(verMajor > curMajor || verMinor > curMinor || verPoint > curPoint) // some future version else if(verMajor > curMajor || verMinor > curMinor || verPoint > curPoint) // some future version
result = false; // reset settings result = false; // reset settings