diff --git a/src/commands/cmd_open_file.cpp b/src/commands/cmd_open_file.cpp index 6afb0089d..bb7ff2f48 100644 --- a/src/commands/cmd_open_file.cpp +++ b/src/commands/cmd_open_file.cpp @@ -150,8 +150,8 @@ void OpenFileCommand::onExecute(Context* context) bool unrecent = false; if (fop) { - if (fop->error) { - console.printf(fop->error); + if (fop->has_error()) { + console.printf(fop->error.c_str()); fop_free(fop); unrecent = true; @@ -180,14 +180,14 @@ void OpenFileCommand::onExecute(Context* context) thread.join(); // Show any error - if (fop->error) - console.printf(fop->error); + if (fop->has_error()) + console.printf(fop->error.c_str()); Sprite *sprite = fop->sprite; if (sprite) { UIContext* context = UIContext::instance(); - App::instance()->getRecentFiles()->addRecentFile(fop->filename); + App::instance()->getRecentFiles()->addRecentFile(fop->filename.c_str()); context->add_sprite(sprite); set_sprite_in_more_reliable_editor(sprite); diff --git a/src/commands/cmd_save_file.cpp b/src/commands/cmd_save_file.cpp index 36f37fc93..066a45378 100644 --- a/src/commands/cmd_save_file.cpp +++ b/src/commands/cmd_save_file.cpp @@ -121,9 +121,9 @@ static void save_sprite_in_background(Sprite* sprite, bool mark_as_saved) thread.join(); /* show any error */ - if (fop->error) { + if (fop->has_error()) { Console console; - console.printf(fop->error); + console.printf(fop->error.c_str()); } /* no error? */ else { diff --git a/src/file/ase_format.cpp b/src/file/ase_format.cpp index aa35883da..5b244c537 100644 --- a/src/file/ase_format.cpp +++ b/src/file/ase_format.cpp @@ -135,7 +135,7 @@ static bool load_ASE(FileOp *fop) int c, frame; FILE *f; - f = fopen(fop->filename, "rb"); + f = fopen(fop->filename.c_str(), "rb"); if (!f) return false; @@ -290,7 +290,7 @@ static bool save_ASE(FileOp *fop) int frame; FILE *f; - f = fopen(fop->filename, "wb"); + f = fopen(fop->filename.c_str(), "wb"); if (!f) return false; diff --git a/src/file/bmp_format.cpp b/src/file/bmp_format.cpp index c0a09ade8..c8d54706d 100644 --- a/src/file/bmp_format.cpp +++ b/src/file/bmp_format.cpp @@ -577,7 +577,7 @@ static bool load_BMP(FileOp *fop) unsigned long biSize; int type, format; - f = fopen(fop->filename, "rb"); + f = fopen(fop->filename.c_str(), "rb"); if (!f) return false; @@ -717,7 +717,7 @@ static bool save_BMP(FileOp *fop) bfSize = 54 + biSizeImage; /* header + image data */ } - f = fopen(fop->filename, "wb"); + f = fopen(fop->filename.c_str(), "wb"); if (!f) { fop_error(fop, "Error creating file.\n"); return false; diff --git a/src/file/file.cpp b/src/file/file.cpp index 66501a965..04199b846 100644 --- a/src/file/file.cpp +++ b/src/file/file.cpp @@ -21,15 +21,13 @@ #include #include -#include "gui/jalert.h" -#include "gui/jlist.h" - #include "app.h" #include "base/mutex.h" #include "base/scoped_lock.h" #include "console.h" #include "file/file.h" #include "file/format_options.h" +#include "gui/jalert.h" #include "modules/gui.h" #include "modules/palettes.h" #include "raster/raster.h" @@ -112,9 +110,9 @@ Sprite *sprite_load(const char *filename) fop_operate(fop); fop_done(fop); - if (fop->error) { + if (fop->has_error()) { Console console; - console.printf(fop->error); + console.printf(fop->error.c_str()); } sprite = fop->sprite; @@ -134,12 +132,12 @@ int sprite_save(Sprite *sprite) fop_operate(fop); fop_done(fop); - if (fop->error) { + if (fop->has_error()) { Console console; - console.printf(fop->error); + console.printf(fop->error.c_str()); } - ret = (fop->error == NULL) ? 0: -1; + ret = (!fop->has_error() ? 0: -1); fop_free(fop); return ret; @@ -180,7 +178,7 @@ FileOp *fop_to_load_sprite(const char *filename, int flags) fop_prepare_for_sequence(fop); /* per now, we want load just one file */ - jlist_append(fop->seq.filename_list, jstrdup(filename)); + fop->seq.filename_list.push_back(filename); /* don't load the sequence (just the one file/one frame) */ if (!(flags & FILE_LOAD_SEQUENCE_NONE)) { @@ -203,8 +201,7 @@ FileOp *fop_to_load_sprite(const char *filename, int flags) break; /* add this file name to the list */ - jlist_append(fop->seq.filename_list, - jstrdup(buf)); + fop->seq.filename_list.push_back(buf); } } @@ -212,26 +209,26 @@ FileOp *fop_to_load_sprite(const char *filename, int flags) if ((flags & FILE_LOAD_SEQUENCE_ASK) && App::instance()->isGui()) { /* really want load all files? */ - if ((jlist_length(fop->seq.filename_list) > 1) && + if ((fop->seq.filename_list.size() > 1) && (jalert("Notice" "<seq.filename_list) > 1) { - JLink link = jlist_last(fop->seq.filename_list); - jfree(link->data); - jlist_delete_link(fop->seq.filename_list, link); + if (fop->seq.filename_list.size() > 1) { + fop->seq.filename_list.erase(fop->seq.filename_list.begin()+1, + fop->seq.filename_list.end()); } } } } } else - fop->filename = jstrdup(filename); + fop->filename = filename; /* load just one frame */ if (flags & FILE_LOAD_ONE_FRAME) @@ -390,8 +387,7 @@ FileOp *fop_to_save_sprite(Sprite *sprite) /* to save one frame */ if (fop->sprite->getTotalFrames() == 1) { - jlist_append(fop->seq.filename_list, - jstrdup(fop->sprite->getFilename())); + fop->seq.filename_list.push_back(fop->sprite->getFilename()); } /* to save more frames */ else { @@ -410,12 +406,12 @@ FileOp *fop_to_save_sprite(Sprite *sprite) for (frame=0; framesprite->getTotalFrames(); frame++) { /* get the name for this frame */ usprintf(buf, "%s%0*d%s", left, width, start_from+frame, right); - jlist_append(fop->seq.filename_list, jstrdup(buf)); + fop->seq.filename_list.push_back(buf); } } } else - fop->filename = jstrdup(fop->sprite->getFilename()); + fop->filename = fop->sprite->getFilename(); /* configure output format? */ if (fop->format->get_options != NULL) { @@ -452,10 +448,9 @@ void fop_operate(FileOp *fop) fop->format != NULL && fop->format->load != NULL) { /* load a sequence */ - if (fop->seq.filename_list != NULL) { + if (fop->is_sequence()) { int frame, frames, image_index = 0; Image *old_image; - JLink link; bool loadres; /* default palette */ @@ -481,7 +476,7 @@ void fop_operate(FileOp *fop) } while (0) /* load the sequence */ - frames = jlist_length(fop->seq.filename_list); + frames = fop->seq.filename_list.size(); frame = 0; old_image = NULL; @@ -489,14 +484,16 @@ void fop_operate(FileOp *fop) fop->seq.progress_offset = 0.0f; fop->seq.progress_fraction = 1.0f / (float)frames; - JI_LIST_FOR_EACH(fop->seq.filename_list, link) { - fop->filename = reinterpret_cast(link->data); + std::vector::iterator it = fop->seq.filename_list.begin(); + std::vector::iterator end = fop->seq.filename_list.end(); + for (; it != end; ++it) { + fop->filename = it->c_str(); /* call the "load" procedure to read the first bitmap */ loadres = (*fop->format->load)(fop); if (!loadres) { fop_error(fop, "Error loading frame %d from file \"%s\"\n", - frame+1, fop->filename); + frame+1, fop->filename.c_str()); } /* for the first frame... */ @@ -551,7 +548,7 @@ void fop_operate(FileOp *fop) frame++; fop->seq.progress_offset += fop->seq.progress_fraction; } - fop->filename = jstrdup((char*)jlist_first_data(fop->seq.filename_list)); + fop->filename = *fop->seq.filename_list.begin(); // Final setup if (fop->sprite != NULL) { @@ -571,7 +568,7 @@ void fop_operate(FileOp *fop) /* call the "load" procedure */ if (!(*fop->format->load)(fop)) fop_error(fop, "Error loading sprite from file \"%s\"\n", - fop->filename); + fop->filename.c_str()); } if (fop->sprite != NULL) { @@ -582,10 +579,10 @@ void fop_operate(FileOp *fop) } /* set the filename */ - if (fop->seq.filename_list) - fop->sprite->setFilename(reinterpret_cast(jlist_first_data(fop->seq.filename_list))); + if (fop->is_sequence()) + fop->sprite->setFilename(fop->seq.filename_list.begin()->c_str()); else - fop->sprite->setFilename(fop->filename); + fop->sprite->setFilename(fop->filename.c_str()); // Quantize a palette for RGB images if (fop->sprite->getImgType() == IMAGE_RGB) @@ -599,7 +596,7 @@ void fop_operate(FileOp *fop) fop->format != NULL && fop->format->save != NULL) { /* save a sequence */ - if (fop->seq.filename_list != NULL) { + if (fop->is_sequence()) { ASSERT(fop->format->flags & FILE_SUPPORT_SEQUENCES); /* create a temporary bitmap */ @@ -625,20 +622,18 @@ void fop_operate(FileOp *fop) ->copyColorsTo(fop->seq.palette); /* setup the filename to be used */ - fop->filename = reinterpret_cast - (jlist_nth_data(fop->seq.filename_list, - fop->sprite->getCurrentFrame())); + fop->filename = fop->seq.filename_list[fop->sprite->getCurrentFrame()]; /* call the "save" procedure... did it fail? */ if (!(*fop->format->save)(fop)) { fop_error(fop, "Error saving frame %d in the file \"%s\"\n", - fop->sprite->getCurrentFrame()+1, fop->filename); + fop->sprite->getCurrentFrame()+1, fop->filename.c_str()); break; } fop->seq.progress_offset += fop->seq.progress_fraction; } - fop->filename = jstrdup(reinterpret_cast(jlist_first_data(fop->seq.filename_list))); + fop->filename = *fop->seq.filename_list.begin(); // Destroy the image image_free(fop->seq.image); @@ -655,7 +650,7 @@ void fop_operate(FileOp *fop) /* call the "save" procedure */ if (!(*fop->format->save)(fop)) fop_error(fop, "Error saving the sprite in the file \"%s\"\n", - fop->filename); + fop->filename.c_str()); } } @@ -682,22 +677,6 @@ void fop_stop(FileOp *fop) void fop_free(FileOp *fop) { - if (fop->filename) - jfree(fop->filename); - - if (fop->error) - jfree(fop->error); - - if (fop->seq.filename_list) { - JLink link; - - /* free old filenames strings */ - JI_LIST_FOR_EACH(fop->seq.filename_list, link) - jfree(link->data); - - jlist_free(fop->seq.filename_list); - } - if (fop->seq.palette != NULL) delete fop->seq.palette; @@ -784,20 +763,10 @@ void fop_error(FileOp *fop, const char *format, ...) uvszprintf(buf_error, sizeof(buf_error), format, ap); va_end(ap); + // Concatenate the new error { ScopedLock lock(*fop->mutex); - - // Concatenate old errors with the new one - if (fop->error) { - char *old_error = fop->error; - fop->error = reinterpret_cast(jmalloc(ustrsizez(old_error) + ustrsizez(buf_error) + 1)); - ustrcpy(fop->error, old_error); - ustrcat(fop->error, buf_error); - jfree(old_error); - } - /* first error */ - else - fop->error = jstrdup(buf_error); + fop->error += buf_error; } } @@ -807,7 +776,7 @@ void fop_progress(FileOp *fop, float progress) ScopedLock lock(*fop->mutex); - if (fop->seq.filename_list != NULL) { + if (fop->is_sequence()) { fop->progress = fop->seq.progress_offset + fop->seq.progress_fraction*progress; @@ -858,16 +827,13 @@ static FileOp *fop_new(FileOpType type) fop->type = type; fop->format = NULL; fop->sprite = NULL; - fop->filename = NULL; fop->mutex = new Mutex(); fop->progress = 0.0f; - fop->error = NULL; fop->done = false; fop->stop = false; fop->oneframe = false; - fop->seq.filename_list = NULL; fop->seq.palette = NULL; fop->seq.image = NULL; fop->seq.progress_offset = 0.0f; @@ -881,7 +847,6 @@ static FileOp *fop_new(FileOpType type) static void fop_prepare_for_sequence(FileOp *fop) { - fop->seq.filename_list = jlist_new(); fop->seq.palette = new Palette(0, 256); fop->seq.format_options = NULL; } diff --git a/src/file/file.h b/src/file/file.h index ac3cb10ae..c6a8365de 100644 --- a/src/file/file.h +++ b/src/file/file.h @@ -19,8 +19,9 @@ #ifndef FILE_FILE_H_INCLUDED #define FILE_FILE_H_INCLUDED -#include "gui/jbase.h" #include +#include +#include #define FILE_SUPPORT_RGB (1<<0) #define FILE_SUPPORT_RGBA (1<<1) @@ -77,12 +78,12 @@ struct FileOp FileOpType type; /* operation type: 0=load, 1=save */ FileFormat* format; Sprite* sprite; /* loaded sprite, or sprite to be saved */ - char* filename; /* file-name to load/save */ + std::string filename; /* file-name to load/save */ /* shared fields between threads */ Mutex* mutex; /* mutex to access to the next two fields */ float progress; /* progress (1.0 is ready) */ - char* error; /* error string */ + std::string error; /* error string */ bool done : 1; /* true if the operation finished */ bool stop : 1; /* force the break of the operation */ bool oneframe : 1; /* load just one frame (in formats @@ -91,7 +92,7 @@ struct FileOp /* data for sequences */ struct { - JList filename_list; /* all file names to load/save */ + std::vector filename_list; /* all file names to load/save */ Palette* palette; /* palette of the sequence */ Image* image; /* image to be saved/loaded */ /* for the progress bar */ @@ -104,6 +105,15 @@ struct FileOp Cel* last_cel; FormatOptions* format_options; } seq; + + bool has_error() const { + return !this->error.empty(); + } + + bool is_sequence() const { + return !this->seq.filename_list.empty(); + } + }; /* available extensions for each load/save operation */ diff --git a/src/file/fli_format.cpp b/src/file/fli_format.cpp index 10e99f312..fb61d2f2b 100644 --- a/src/file/fli_format.cpp +++ b/src/file/fli_format.cpp @@ -72,7 +72,7 @@ static bool load_FLI(FileOp *fop) FILE *f; /* open the file to read in binary mode */ - f = fopen(fop->filename, "rb"); + f = fopen(fop->filename.c_str(), "rb"); if (!f) return false; @@ -241,7 +241,7 @@ static bool save_FLI(FileOp *fop) fli_header.oframe1 = fli_header.oframe2 = 0; /* open the file to write in binary mode */ - f = fopen(fop->filename, "wb"); + f = fopen(fop->filename.c_str(), "wb"); if (!f) return false; diff --git a/src/file/gif_format.cpp b/src/file/gif_format.cpp index cd8da0ff0..e3fb38cba 100644 --- a/src/file/gif_format.cpp +++ b/src/file/gif_format.cpp @@ -87,7 +87,7 @@ static bool load_GIF(FileOp *fop) bool ret = false; int i, c; - gif = gif_load_animation(fop->filename, + gif = gif_load_animation(fop->filename.c_str(), reinterpret_cast(fop_progress), fop); if (!gif) { fop_error(fop, "Error loading GIF file.\n"); @@ -439,7 +439,7 @@ static bool save_GIF(FileOp *fop) opal = npal; } - ret = gif_save_animation(fop->filename, gif, + ret = gif_save_animation(fop->filename.c_str(), gif, reinterpret_cast(fop_progress), fop); gif_destroy_animation(gif); return ret == 0 ? true: false; diff --git a/src/file/ico_format.cpp b/src/file/ico_format.cpp index d7b064cbb..a242fae27 100644 --- a/src/file/ico_format.cpp +++ b/src/file/ico_format.cpp @@ -76,7 +76,7 @@ struct BITMAPINFOHEADER static bool load_ICO(FileOp *fop) { - FILE* f = fopen(fop->filename, "rb"); + FILE* f = fopen(fop->filename.c_str(), "rb"); if (!f) return false; @@ -229,7 +229,7 @@ static bool save_ICO(FileOp *fop) int c, x, y, b, m, v; int num = sprite->getTotalFrames(); - FILE* f = fopen(fop->filename, "wb"); + FILE* f = fopen(fop->filename.c_str(), "wb"); if (!f) return false; diff --git a/src/file/jpeg_format.cpp b/src/file/jpeg_format.cpp index c21012079..d33ad70b5 100644 --- a/src/file/jpeg_format.cpp +++ b/src/file/jpeg_format.cpp @@ -89,7 +89,7 @@ static bool load_JPEG(FileOp *fop) JDIMENSION buffer_height; int c; - file = fopen(fop->filename, "rb"); + file = fopen(fop->filename.c_str(), "rb"); if (!file) return false; @@ -232,7 +232,7 @@ static bool save_JPEG(FileOp *fop) int c; /* Open the file for write in it. */ - file = fopen(fop->filename, "wb"); + file = fopen(fop->filename.c_str(), "wb"); if (!file) { fop_error(fop, "Error creating file.\n"); return false; diff --git a/src/file/pcx_format.cpp b/src/file/pcx_format.cpp index 87486ce9f..3bd42ebfc 100644 --- a/src/file/pcx_format.cpp +++ b/src/file/pcx_format.cpp @@ -52,7 +52,7 @@ static bool load_PCX(FileOp *fop) int x, y; char ch = 0; - f = fopen(fop->filename, "rb"); + f = fopen(fop->filename.c_str(), "rb"); if (!f) return false; @@ -187,7 +187,7 @@ static bool save_PCX(FileOp *fop) char runchar; char ch = 0; - f = fopen(fop->filename, "wb"); + f = fopen(fop->filename.c_str(), "wb"); if (!f) { fop_error(fop, "Error creating file.\n"); return false; diff --git a/src/file/png_format.cpp b/src/file/png_format.cpp index 869fd1950..45e4e7cb0 100644 --- a/src/file/png_format.cpp +++ b/src/file/png_format.cpp @@ -67,7 +67,7 @@ static bool load_PNG(FileOp *fop) int imgtype; FILE *fp; - fp = fopen(fop->filename, "rb"); + fp = fopen(fop->filename.c_str(), "rb"); if (!fp) return false; @@ -303,7 +303,7 @@ static bool save_PNG(FileOp *fop) FILE *fp; /* open the file */ - fp = fopen(fop->filename, "wb"); + fp = fopen(fop->filename.c_str(), "wb"); if (fp == NULL) return false; diff --git a/src/file/tga_format.cpp b/src/file/tga_format.cpp index 754995519..f08f382c6 100644 --- a/src/file/tga_format.cpp +++ b/src/file/tga_format.cpp @@ -199,7 +199,7 @@ static bool load_TGA(FileOp *fop) FILE *f; int type; - f = fopen(fop->filename, "rb"); + f = fopen(fop->filename.c_str(), "rb"); if (!f) return false; @@ -405,7 +405,7 @@ static bool save_TGA(FileOp *fop) bool need_pal = (image->imgtype == IMAGE_INDEXED)? true: false; FILE *f; - f = fopen(fop->filename, "wb"); + f = fopen(fop->filename.c_str(), "wb"); if (!f) { fop_error(fop, "Error creating file.\n"); return false; diff --git a/src/widgets/fileview.cpp b/src/widgets/fileview.cpp index af9314504..8ff58704e 100644 --- a/src/widgets/fileview.cpp +++ b/src/widgets/fileview.cpp @@ -714,7 +714,7 @@ static bool fileview_generate_thumbnail(JWidget widget, IFileItem* fileitem) if (!fop) return true; - if (fop->error) { + if (fop->has_error()) { fop_free(fop); } else {