Taseditor: changed fm3 format to version 3

This commit is contained in:
ansstuff 2012-11-13 16:20:06 +00:00
parent 80bd1aaf02
commit 5f8013e45e
14 changed files with 136 additions and 44 deletions

View File

@ -484,9 +484,12 @@ void BOOKMARKS::save(EMUFILE *os, bool really_save)
} }
} }
// returns true if couldn't load // returns true if couldn't load
bool BOOKMARKS::load(EMUFILE *is, bool really_load) bool BOOKMARKS::load(EMUFILE *is, unsigned int offset)
{ {
if (!really_load) if (offset)
{
if (is->fseek(offset, SEEK_SET)) goto error;
} else
{ {
reset(); reset();
branches.reset(); branches.reset();
@ -514,7 +517,7 @@ bool BOOKMARKS::load(EMUFILE *is, bool really_load)
RedrawBookmarksCaption(); RedrawBookmarksCaption();
return false; return false;
error: error:
FCEU_printf("Error loading bookmarks\n"); FCEU_printf("Error loading Bookmarks\n");
reset(); reset();
branches.reset(); branches.reset();
return true; return true;

View File

@ -57,7 +57,7 @@ public:
void update(); void update();
void save(EMUFILE *os, bool really_save = true); void save(EMUFILE *os, bool really_save = true);
bool load(EMUFILE *is, bool really_load = true); bool load(EMUFILE *is, unsigned int offset);
void command(int command_id, int slot = -1); void command(int command_id, int slot = -1);

View File

@ -255,10 +255,13 @@ void GREENZONE::save(EMUFILE *os, bool really_save)
} }
} }
// returns true if couldn't load // returns true if couldn't load
bool GREENZONE::load(EMUFILE *is, bool really_load) bool GREENZONE::load(EMUFILE *is, unsigned int offset)
{ {
free(); free();
if (!really_load) if (offset)
{
if (is->fseek(offset, SEEK_SET)) goto error;
} else
{ {
reset(); reset();
playback.StartFromZero(); // reset Playback cursor to frame 0 playback.StartFromZero(); // reset Playback cursor to frame 0

View File

@ -23,7 +23,7 @@ public:
void update(); void update();
void save(EMUFILE *os, bool really_save = true); void save(EMUFILE *os, bool really_save = true);
bool load(EMUFILE *is, bool really_load = true); bool load(EMUFILE *is, unsigned int offset);
void AdjustUp(); void AdjustUp();
void AdjustDown(); void AdjustDown();

View File

@ -1013,23 +1013,27 @@ void HISTORY::save(EMUFILE *os, bool really_save)
} }
} }
// returns true if couldn't load // returns true if couldn't load
bool HISTORY::load(EMUFILE *is, bool really_load) bool HISTORY::load(EMUFILE *is, unsigned int offset)
{ {
if (!really_load) int i = -1;
SNAPSHOT snap;
BOOKMARK bookm;
if (offset)
{
if (is->fseek(offset, SEEK_SET)) goto error;
} else
{ {
reset(); reset();
return false; return false;
} }
int i = -1;
SNAPSHOT snap;
BOOKMARK bookm;
// read "HISTORY" string // read "HISTORY" string
char save_id[HISTORY_ID_LEN]; char save_id[HISTORY_ID_LEN];
if ((int)is->fread(save_id, HISTORY_ID_LEN) < HISTORY_ID_LEN) goto error; if ((int)is->fread(save_id, HISTORY_ID_LEN) < HISTORY_ID_LEN) goto error;
if (!strcmp(history_skipsave_id, save_id)) if (!strcmp(history_skipsave_id, save_id))
{ {
// string says to skip loading History // string says to skip loading History
FCEU_printf("No history in the file\n"); FCEU_printf("No History in the file\n");
reset(); reset();
return false; return false;
} }
@ -1092,7 +1096,7 @@ bool HISTORY::load(EMUFILE *is, bool really_load)
RedrawHistoryList(); RedrawHistoryList();
return false; return false;
error: error:
FCEU_printf("Error loading history\n"); FCEU_printf("Error loading History\n");
reset(); reset();
return true; return true;
} }

View File

@ -100,7 +100,7 @@ public:
void HistorySizeChanged(); void HistorySizeChanged();
void save(EMUFILE *os, bool really_save = true); void save(EMUFILE *os, bool really_save = true);
bool load(EMUFILE *is, bool really_load = true); bool load(EMUFILE *is, unsigned int offset);
void undo(); void undo();
void redo(); void redo();

View File

@ -82,9 +82,12 @@ void MARKERS_MANAGER::save(EMUFILE *os, bool really_save)
} }
} }
// returns true if couldn't load // returns true if couldn't load
bool MARKERS_MANAGER::load(EMUFILE *is, bool really_load) bool MARKERS_MANAGER::load(EMUFILE *is, unsigned int offset)
{ {
if (!really_load) if (offset)
{
if (is->fseek(offset, SEEK_SET)) goto error;
} else
{ {
reset(); reset();
return false; return false;

View File

@ -32,7 +32,7 @@ public:
void update(); void update();
void save(EMUFILE *os, bool really_save = true); void save(EMUFILE *os, bool really_save = true);
bool load(EMUFILE *is, bool really_load = true); bool load(EMUFILE *is, unsigned int offset);
int GetMarkersSize(); int GetMarkersSize();
bool SetMarkersSize(int new_size); bool SetMarkersSize(int new_size);

View File

@ -841,7 +841,7 @@ void PIANO_ROLL::save(EMUFILE *os, bool really_save)
{ {
if (really_save) if (really_save)
{ {
update(); UpdateItemCount();
// write "PIANO_ROLL" string // write "PIANO_ROLL" string
os->fwrite(piano_roll_save_id, PIANO_ROLL_ID_LEN); os->fwrite(piano_roll_save_id, PIANO_ROLL_ID_LEN);
// write current top item // write current top item
@ -854,11 +854,14 @@ void PIANO_ROLL::save(EMUFILE *os, bool really_save)
} }
} }
// returns true if couldn't load // returns true if couldn't load
bool PIANO_ROLL::load(EMUFILE *is, bool really_load) bool PIANO_ROLL::load(EMUFILE *is, unsigned int offset)
{ {
reset(); reset();
update(); UpdateItemCount();
if (!really_load) if (offset)
{
if (is->fseek(offset, SEEK_SET)) goto error;
} else
{ {
// scroll to the beginning // scroll to the beginning
ListView_EnsureVisible(hwndList, 0, FALSE); ListView_EnsureVisible(hwndList, 0, FALSE);

View File

@ -158,7 +158,7 @@ public:
void update(); void update();
void save(EMUFILE *os, bool really_save = true); void save(EMUFILE *os, bool really_save = true);
bool load(EMUFILE *is, bool really_load = true); bool load(EMUFILE *is, unsigned int offset);
void RedrawList(); void RedrawList();
void RedrawRow(int index); void RedrawRow(int index);

View File

@ -267,9 +267,12 @@ void SELECTION::save(EMUFILE *os, bool really_save)
} }
} }
// returns true if couldn't load // returns true if couldn't load
bool SELECTION::load(EMUFILE *is, bool really_load) bool SELECTION::load(EMUFILE *is, unsigned int offset)
{ {
if (!really_load) if (offset)
{
if (is->fseek(offset, SEEK_SET)) goto error;
} else
{ {
reset(); reset();
return false; return false;

View File

@ -22,7 +22,7 @@ public:
void RedrawMarker(); void RedrawMarker();
void save(EMUFILE *os, bool really_save = true); void save(EMUFILE *os, bool really_save = true);
bool load(EMUFILE *is, bool really_load = true); bool load(EMUFILE *is, unsigned int offset);
void saveSelection(SelectionFrames& selection, EMUFILE *os); void saveSelection(SelectionFrames& selection, EMUFILE *os);
bool loadSelection(SelectionFrames& selection, EMUFILE *is); bool loadSelection(SelectionFrames& selection, EMUFILE *is);
bool skiploadSelection(EMUFILE *is); bool skiploadSelection(EMUFILE *is);

View File

@ -13,7 +13,7 @@ Project - Manager of working project
* stores the info about current project filename and about having unsaved changes * stores the info about current project filename and about having unsaved changes
* implements saving and loading project files from filesystem * implements saving and loading project files from filesystem
* implements autosave function * implements autosave function
* stores resources: autosave period scale, default filename * stores resources: autosave period scale, default filename, fm3 format offsets
------------------------------------------------------------------------------------ */ ------------------------------------------------------------------------------------ */
#include "taseditor_project.h" #include "taseditor_project.h"
@ -128,23 +128,44 @@ bool TASEDITOR_PROJECT::save(const char* different_name, bool save_binary, bool
currMovieData.loadFrameCount = currMovieData.records.size(); currMovieData.loadFrameCount = currMovieData.records.size();
currMovieData.emuVersion = FCEU_VERSION_NUMERIC; currMovieData.emuVersion = FCEU_VERSION_NUMERIC;
currMovieData.dump(ofs, save_binary); currMovieData.dump(ofs, save_binary);
unsigned int taseditor_data_offset = ofs->ftell();
// save header: fm3 version + saved_stuff // save header: fm3 version + saved_stuff
write32le(PROJECT_FILE_CURRENT_VERSION, ofs); write32le(PROJECT_FILE_CURRENT_VERSION, ofs);
unsigned int saved_stuff = 0; unsigned int saved_stuff_map = 0;
if (save_markers) saved_stuff |= MARKERS_SAVED; if (save_markers) saved_stuff_map |= MARKERS_SAVED;
if (save_bookmarks) saved_stuff |= BOOKMARKS_SAVED; if (save_bookmarks) saved_stuff_map |= BOOKMARKS_SAVED;
if (save_greenzone) saved_stuff |= GREENZONE_SAVED; if (save_greenzone) saved_stuff_map |= GREENZONE_SAVED;
if (save_history) saved_stuff |= HISTORY_SAVED; if (save_history) saved_stuff_map |= HISTORY_SAVED;
if (save_piano_roll) saved_stuff |= PIANO_ROLL_SAVED; if (save_piano_roll) saved_stuff_map |= PIANO_ROLL_SAVED;
if (save_selection) saved_stuff |= SELECTION_SAVED; if (save_selection) saved_stuff_map |= SELECTION_SAVED;
write32le(saved_stuff, ofs); write32le(saved_stuff_map, ofs);
unsigned int number_of_pointers = DEFAULT_NUMBER_OF_POINTERS;
write32le(saved_stuff_map, ofs);
// write dummy zeros to the file, where the offsets will be
for (unsigned int i = 0; i < number_of_pointers; ++i)
write32le(0, ofs);
// save specified modules // save specified modules
unsigned int markers_offset = ofs->ftell();
markers_manager.save(ofs, save_markers); markers_manager.save(ofs, save_markers);
unsigned int bookmarks_offset = ofs->ftell();
bookmarks.save(ofs, save_bookmarks); bookmarks.save(ofs, save_bookmarks);
unsigned int greenzone_offset = ofs->ftell();
greenzone.save(ofs, save_greenzone); greenzone.save(ofs, save_greenzone);
unsigned int history_offset = ofs->ftell();
history.save(ofs, save_history); history.save(ofs, save_history);
unsigned int piano_roll_offset = ofs->ftell();
piano_roll.save(ofs, save_piano_roll); piano_roll.save(ofs, save_piano_roll);
unsigned int selection_offset = ofs->ftell();
selection.save(ofs, save_selection); selection.save(ofs, save_selection);
// now write offsets (pointers)
ofs->fseek(taseditor_data_offset + PROJECT_FILE_OFFSET_OF_POINTERS_DATA, SEEK_SET);
write32le(markers_offset, ofs);
write32le(bookmarks_offset, ofs);
write32le(greenzone_offset, ofs);
write32le(history_offset, ofs);
write32le(piano_roll_offset, ofs);
write32le(selection_offset, ofs);
// finish
delete ofs; delete ofs;
playback.updateProgressbar(); playback.updateProgressbar();
// also set project.changed to false, unless it was SaveCompact // also set project.changed to false, unless it was SaveCompact
@ -161,6 +182,7 @@ bool TASEDITOR_PROJECT::save(const char* different_name, bool save_binary, bool
bool TASEDITOR_PROJECT::load(const char* fullname) bool TASEDITOR_PROJECT::load(const char* fullname)
{ {
bool load_all = true; bool load_all = true;
unsigned int taseditor_data_offset = 0;
EMUFILE_FILE ifs(fullname, "rb"); EMUFILE_FILE ifs(fullname, "rb");
if (ifs.fail()) if (ifs.fail())
@ -206,6 +228,7 @@ bool TASEDITOR_PROJECT::load(const char* fullname)
return false; return false;
} }
} }
taseditor_data_offset = ifs.ftell();
// load fm3 version from header and check it // load fm3 version from header and check it
unsigned int file_version; unsigned int file_version;
if (read32le(&file_version, &ifs)) if (read32le(&file_version, &ifs))
@ -253,16 +276,60 @@ bool TASEDITOR_PROJECT::load(const char* fullname)
return false; return false;
} }
unsigned int saved_stuff; unsigned int saved_stuff = 0;
unsigned int number_of_pointers = 0;
unsigned int data_offset = 0;
unsigned int pointer_offset = taseditor_data_offset + PROJECT_FILE_OFFSET_OF_POINTERS_DATA;
if (load_all) if (load_all)
{
read32le(&saved_stuff, &ifs); read32le(&saved_stuff, &ifs);
// load modules read32le(&number_of_pointers, &ifs);
markers_manager.load(&ifs, load_all); // load modules
bookmarks.load(&ifs, load_all); if (number_of_pointers-- && !(ifs.fseek(pointer_offset, SEEK_SET)) && read32le(&data_offset, &ifs))
greenzone.load(&ifs, load_all); pointer_offset += sizeof(unsigned int);
history.load(&ifs, load_all); else
piano_roll.load(&ifs, load_all); data_offset = 0;
selection.load(&ifs, load_all); markers_manager.load(&ifs, data_offset);
if (number_of_pointers-- && !(ifs.fseek(pointer_offset, SEEK_SET)) && read32le(&data_offset, &ifs))
pointer_offset += sizeof(unsigned int);
else
data_offset = 0;
bookmarks.load(&ifs, data_offset);
if (number_of_pointers-- && !(ifs.fseek(pointer_offset, SEEK_SET)) && read32le(&data_offset, &ifs))
pointer_offset += sizeof(unsigned int);
else
data_offset = 0;
greenzone.load(&ifs, data_offset);
if (number_of_pointers-- && !(ifs.fseek(pointer_offset, SEEK_SET)) && read32le(&data_offset, &ifs))
pointer_offset += sizeof(unsigned int);
else
data_offset = 0;
history.load(&ifs, data_offset);
if (number_of_pointers-- && !(ifs.fseek(pointer_offset, SEEK_SET)) && read32le(&data_offset, &ifs))
pointer_offset += sizeof(unsigned int);
else
data_offset = 0;
piano_roll.load(&ifs, data_offset);
if (number_of_pointers-- && !(ifs.fseek(pointer_offset, SEEK_SET)) && read32le(&data_offset, &ifs))
pointer_offset += sizeof(unsigned int);
else
data_offset = 0;
selection.load(&ifs, data_offset);
} else
{
// reset modules
markers_manager.load(&ifs, 0);
bookmarks.load(&ifs, 0);
greenzone.load(&ifs, 0);
history.load(&ifs, 0);
piano_roll.load(&ifs, 0);
selection.load(&ifs, 0);
}
// reset other modules // reset other modules
playback.reset(); playback.reset();
recorder.reset(); recorder.reset();

View File

@ -29,7 +29,13 @@
#define PIANO_ROLL_SAVED 16 #define PIANO_ROLL_SAVED 16
#define SELECTION_SAVED 32 #define SELECTION_SAVED 32
#define PROJECT_FILE_CURRENT_VERSION 2 #define PROJECT_FILE_CURRENT_VERSION 3
#define PROJECT_FILE_OFFSET_OF_VERSION_NUMBER 0
#define PROJECT_FILE_OFFSET_OF_SAVED_MODULES_MAP (PROJECT_FILE_OFFSET_OF_VERSION_NUMBER + 4)
#define PROJECT_FILE_OFFSET_OF_NUMBER_OF_POINTERS (PROJECT_FILE_OFFSET_OF_SAVED_MODULES_MAP + 4)
#define DEFAULT_NUMBER_OF_POINTERS 6
#define PROJECT_FILE_OFFSET_OF_POINTERS_DATA (PROJECT_FILE_OFFSET_OF_NUMBER_OF_POINTERS + 4)
class TASEDITOR_PROJECT class TASEDITOR_PROJECT
{ {