From f0b33ec2031469c660d186e69c8b132a566c66fb Mon Sep 17 00:00:00 2001 From: mart0258 Date: Fri, 18 Dec 2009 05:40:38 +0000 Subject: [PATCH] Win - TASEdit updates - display readonly in-window and allow saving greenzone. --- src/drivers/win/tasedit.cpp | 13 +++++ src/drivers/win/taseditlib/taseditproj.cpp | 17 +++++-- src/movie.cpp | 59 ++++++++++++++++++++++ src/movie.h | 4 ++ 4 files changed, 88 insertions(+), 5 deletions(-) diff --git a/src/drivers/win/tasedit.cpp b/src/drivers/win/tasedit.cpp index 7e696c35..32b9d10b 100644 --- a/src/drivers/win/tasedit.cpp +++ b/src/drivers/win/tasedit.cpp @@ -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() diff --git a/src/drivers/win/taseditlib/taseditproj.cpp b/src/drivers/win/taseditlib/taseditproj.cpp index d1983b36..c145faca 100644 --- a/src/drivers/win/taseditlib/taseditproj.cpp +++ b/src/drivers/win/taseditlib/taseditproj.cpp @@ -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(); diff --git a/src/movie.cpp b/src/movie.cpp index 34dfc488..c93de47b 100644 --- a/src/movie.cpp +++ b/src/movie.cpp @@ -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.loadFrameCounttellg(); diff --git a/src/movie.h b/src/movie.h index b5cd28c7..380e3e82 100644 --- a/src/movie.h +++ b/src/movie.h @@ -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);