Win - TASEdit updates - display readonly in-window and allow saving greenzone.
This commit is contained in:
parent
28cc8f5aae
commit
f0b33ec203
|
@ -158,6 +158,19 @@ void UpdateTasEdit()
|
|||
|
||||
lastCursor = newCursor;
|
||||
}
|
||||
|
||||
static int old_movie_readonly=-1;
|
||||
if (old_movie_readonly != movie_readonly)
|
||||
{
|
||||
old_movie_readonly = movie_readonly;
|
||||
if (movie_readonly)
|
||||
{
|
||||
SetWindowText(hwndTasEdit, "TAS Editor");
|
||||
} else
|
||||
{
|
||||
SetWindowText(hwndTasEdit, "TAS Editor (Recording)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RedrawList()
|
||||
|
|
|
@ -63,9 +63,12 @@ bool TASEDIT_PROJECT::SaveProject()
|
|||
std::ofstream ofs;
|
||||
//ofs << GetProjectName() << std::endl;
|
||||
//ofs << GetFM2Name() << std::endl;
|
||||
ofs.open(filename);
|
||||
ofs.open(filename, std::ios_base::binary);
|
||||
|
||||
currMovieData.dump(&ofs, true);
|
||||
ofs.put('\0'); // TODO: Add main branch name.
|
||||
currMovieData.dumpGreenzone(&ofs, true);
|
||||
|
||||
ofs.close();
|
||||
|
||||
changed=false;
|
||||
|
@ -78,14 +81,18 @@ extern bool LoadFM2(MovieData& movieData, std::istream* fp, int size, bool stopA
|
|||
bool TASEDIT_PROJECT::LoadProject(std::string PFN)
|
||||
{
|
||||
const char* filename = PFN.c_str();
|
||||
//char buf[4096];
|
||||
|
||||
SetProjectName(PFN);
|
||||
std::ifstream ifs;
|
||||
ifs.open(filename);
|
||||
//ifs.getline(ifs, 4090);
|
||||
//ifs.getline(ifs, 4090);
|
||||
ifs.open(filename, std::ios_base::binary);
|
||||
|
||||
LoadFM2(currMovieData, &ifs, INT_MAX, false);
|
||||
LoadSubtitles(currMovieData);
|
||||
|
||||
char asdf;
|
||||
ifs.get(asdf); // TODO: Add main branch name.
|
||||
currMovieData.loadGreenzone(&ifs, true);
|
||||
|
||||
poweron(true);
|
||||
|
||||
ifs.close();
|
||||
|
|
|
@ -380,6 +380,10 @@ void MovieData::installValue(std::string& key, std::string& val)
|
|||
StringToBytes(val,&savestate[0],len); // decodes either base64 or hex
|
||||
}
|
||||
}
|
||||
else if (key == "length")
|
||||
{
|
||||
installInt(val, loadFrameCount);
|
||||
}
|
||||
}
|
||||
|
||||
int MovieData::dump(std::ostream *os, bool binary)
|
||||
|
@ -408,6 +412,10 @@ int MovieData::dump(std::ostream *os, bool binary)
|
|||
|
||||
if(savestate.size() != 0)
|
||||
*os << "savestate " << BytesToString(&savestate[0],savestate.size()) << endl;
|
||||
|
||||
if(FCEUMOV_Mode(MOVIEMODE_TASEDIT))
|
||||
*os << "length " << this->records.size() << endl;
|
||||
|
||||
if(binary)
|
||||
{
|
||||
//put one | to start the binary dump
|
||||
|
@ -423,6 +431,51 @@ int MovieData::dump(std::ostream *os, bool binary)
|
|||
return end-start;
|
||||
}
|
||||
|
||||
int MovieData::dumpGreenzone(std::ostream *os, bool binary)
|
||||
{
|
||||
int start = os->tellp();
|
||||
int frame, size;
|
||||
for (int i=0; i<(int)records.size(); ++i)
|
||||
{
|
||||
if (records[i].savestate.empty())
|
||||
continue;
|
||||
frame=i;
|
||||
size=records[i].savestate.size();
|
||||
write32le(frame, os);
|
||||
write32le(size, os);
|
||||
|
||||
os->write(&records[i].savestate[0], size);
|
||||
}
|
||||
frame=-1;
|
||||
size=currMovieData.greenZoneCount;
|
||||
write32le(frame, os);
|
||||
write32le(size, os);
|
||||
|
||||
int end= os->tellp();
|
||||
|
||||
return end-start;
|
||||
}
|
||||
|
||||
int MovieData::loadGreenzone(std::istream *is, bool binary)
|
||||
{
|
||||
int frame, size;
|
||||
while(1)
|
||||
{
|
||||
if (!read32le((uint32 *)&frame, is)) {size=0; break;}
|
||||
if (!read32le((uint32 *)&size, is)) {size=0; break;}
|
||||
if (frame==-1) break;
|
||||
int pos = is->tellg();
|
||||
FCEUSS_LoadFP(is, SSLOADPARAM_NOBACKUP);
|
||||
is->seekg(pos+size);
|
||||
}
|
||||
greenZoneCount=size;
|
||||
|
||||
UpdateTasEdit();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int FCEUMOV_GetFrame(void)
|
||||
{
|
||||
return currFrameCounter;
|
||||
|
@ -495,6 +548,9 @@ static void LoadFM2_binarychunk(MovieData& movieData, std::istream* fp, int size
|
|||
int todo = std::min(size, flen);
|
||||
|
||||
int numRecords = todo/recordsize;
|
||||
if (movieData.loadFrameCount!=-1 && movieData.loadFrameCount<numRecords)
|
||||
numRecords=movieData.loadFrameCount;
|
||||
|
||||
movieData.records.resize(numRecords);
|
||||
for(int i=0;i<numRecords;i++)
|
||||
{
|
||||
|
@ -505,6 +561,9 @@ static void LoadFM2_binarychunk(MovieData& movieData, std::istream* fp, int size
|
|||
//yuck... another custom text parser.
|
||||
bool LoadFM2(MovieData& movieData, std::istream* fp, int size, bool stopAfterHeader)
|
||||
{
|
||||
// Non-TAS projects consume until EOF
|
||||
movieData.installValue(std::string("length"), std::string("-1"));
|
||||
|
||||
//first, look for an fcm signature
|
||||
char fcmbuf[3];
|
||||
std::ios::pos_type curr = fp->tellg();
|
||||
|
|
|
@ -183,6 +183,7 @@ public:
|
|||
|
||||
//----TasEdit stuff---
|
||||
int greenZoneCount;
|
||||
int loadFrameCount;
|
||||
//----
|
||||
|
||||
int getNumRecords() { return records.size(); }
|
||||
|
@ -218,6 +219,9 @@ public:
|
|||
void truncateAt(int frame);
|
||||
void installValue(std::string& key, std::string& val);
|
||||
int dump(std::ostream* os, bool binary);
|
||||
int dumpGreenzone(std::ostream *os, bool binary);
|
||||
int loadGreenzone(std::istream *is, bool binary);
|
||||
|
||||
void clearRecordRange(int start, int len);
|
||||
void insertEmpty(int at, int frames);
|
||||
|
||||
|
|
Loading…
Reference in New Issue