diff --git a/CMakeLists.txt b/CMakeLists.txt index c4b3236..eb88510 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,6 +82,7 @@ set(SRC_NIN10KITGUI gui/nin10kitviewer.cpp gui/imageutil.cpp gui/exporter.cpp + gui/wxlogger.cpp ) find_package(wxWidgets REQUIRED core base) diff --git a/gui/exporter.cpp b/gui/exporter.cpp index 65d3f21..22fcc50 100644 --- a/gui/exporter.cpp +++ b/gui/exporter.cpp @@ -91,12 +91,20 @@ void DoExport(int mode, const std::string& filename, std::vector& f } } - if (params.device == "GBA") - DoGBAExport(params.images, params.tileset_images); - else if (params.device == "DS") - DoDSExport(params.images, params.tileset_images); - else if (params.device == "3DS") - Do3DSExport(params.images, params.tileset_images); + try + { + if (params.device == "GBA") + DoGBAExport(params.images, params.tileset_images); + else if (params.device == "DS") + DoDSExport(params.images, params.tileset_images); + else if (params.device == "3DS") + Do3DSExport(params.images, params.tileset_images); + } + catch (const char* e) + { + WarnLog("Export failed"); + return; + } InfoLog("Export complete now writing files"); // Write the files diff --git a/gui/nin10kit.cpp b/gui/nin10kit.cpp index 5db7df9..6d02607 100644 --- a/gui/nin10kit.cpp +++ b/gui/nin10kit.cpp @@ -166,7 +166,13 @@ void Nin10KitFrame::OnView(wxCommandEvent& event) viewer = new Nin10KitViewerFrame(); viewer->Connect(wxEVT_CLOSE_WINDOW, wxCloseEventHandler(Nin10KitFrame::OnCloseView), NULL, this); - viewer->Set(mode->GetSelection(), images); + if (!viewer->Set(mode->GetSelection(), images)) + { + viewer->Close(true); + delete viewer; + viewer = NULL; + return; + } viewer->Show(true); } diff --git a/gui/nin10kitapp.cpp b/gui/nin10kitapp.cpp index 780ae8e..26ee776 100644 --- a/gui/nin10kitapp.cpp +++ b/gui/nin10kitapp.cpp @@ -5,12 +5,13 @@ #include "cmd-line-parser-helper.hpp" #include "cpercep.hpp" -#include "logger.hpp" +#include "wxlogger.hpp" IMPLEMENT_APP_NO_MAIN(Nin10KitApp); int main(int argc, char** argv) { + logger.reset(new LoggerWx()); Magick::InitializeMagick(*argv); cpercep_init(); diff --git a/gui/nin10kitviewer.cpp b/gui/nin10kitviewer.cpp index 1b2c0c1..a1f1ced 100644 --- a/gui/nin10kitviewer.cpp +++ b/gui/nin10kitviewer.cpp @@ -16,7 +16,7 @@ Nin10KitViewerFrame::~Nin10KitViewerFrame() { } -void Nin10KitViewerFrame::Set(int prog_mode, std::map& images) +bool Nin10KitViewerFrame::Set(int prog_mode, std::map& images) { std::string mode, device; int bpp; @@ -24,15 +24,24 @@ void Nin10KitViewerFrame::Set(int prog_mode, std::map& i GetModeInfo(prog_mode, mode, device, bpp); VerboseLog("Viewing in mode %s", mode.c_str()); - if (mode == "3") - UpdateMode3(images); - else if (mode == "4") - UpdateMode4(images); - else if (mode == "0") - UpdateMode0(images, bpp); - else if (mode == "SPRITES") - UpdateSprites(images, bpp); + try + { + if (mode == "3") + UpdateMode3(images); + else if (mode == "4") + UpdateMode4(images); + else if (mode == "0") + UpdateMode0(images, bpp); + else if (mode == "SPRITES") + UpdateSprites(images, bpp); + } + catch (const char* e) + { + WarnLog("Conversion failed"); + return false; + } UpdateGraphicsWindow(); + return true; } void Nin10KitViewerFrame::UpdateMode3(std::map& images) diff --git a/gui/nin10kitviewer.hpp b/gui/nin10kitviewer.hpp index 4e29cf1..39c376f 100644 --- a/gui/nin10kitviewer.hpp +++ b/gui/nin10kitviewer.hpp @@ -12,7 +12,7 @@ class Nin10KitViewerFrame : public Nin10KitViewerGUI public: Nin10KitViewerFrame(); ~Nin10KitViewerFrame(); - void Set(int mode, std::map& images); + bool Set(int mode, std::map& images); void OnPrev(wxCommandEvent& event); void OnNext(wxCommandEvent& event); private: diff --git a/shared/image8.cpp b/shared/image8.cpp index aa69d83..fa7ba53 100644 --- a/shared/image8.cpp +++ b/shared/image8.cpp @@ -74,11 +74,16 @@ Magick::Image Image8Bpp::ToMagick() const Image8BppScene::Image8BppScene(const std::vector& images16, const std::string& name) : Scene(name), palette(new Palette(name)) { + for (const auto& image : images16) + { + if (image.width & 1) + FatalLog("Image: %s width is not a multiple of 2. Please fix", name.c_str()); + } GetPalette(images16, params.palette, params.transparent_color, params.offset, *palette); images.reserve(images16.size()); - for (unsigned int i = 0; i < images16.size(); i++) - images.emplace_back(new Image8Bpp(images16[i], palette)); + for (const auto& image : images16) + images.emplace_back(new Image8Bpp(image, palette)); } const Image8Bpp& Image8BppScene::GetImage(int index) const diff --git a/shared/logger.hpp b/shared/logger.hpp index 357d99d..4ef666c 100644 --- a/shared/logger.hpp +++ b/shared/logger.hpp @@ -20,14 +20,13 @@ class AbstractLogger public: AbstractLogger(std::ostream* target = &std::cerr) : out(target), log_level(LogLevel::INFO), log_time(true) {} virtual ~AbstractLogger() {} - void Log(LogLevel level, const char* format, va_list ap); + virtual void Log(LogLevel level, const char* format, va_list ap); virtual void DoLog(LogLevel level, const char* format, va_list ap) {} void SetLogTarget(std::ostream* stream) {out = stream;} void SetLogLevel(LogLevel level) {log_level = level;} void SetLogTime(bool logging_time) {log_time = logging_time;} protected: std::ostream* out; - private: LogLevel log_level; bool log_time; }; diff --git a/shared/map.cpp b/shared/map.cpp index 502c5c6..b628331 100644 --- a/shared/map.cpp +++ b/shared/map.cpp @@ -8,6 +8,8 @@ Map::Map(const Image16Bpp& image, int bpp) : Image(image.width / 8, image.height / 8, image.name, image.filename, image.frame, image.animated), data(width * height), tileset(NULL), export_shared_info(true) { + if ((image.width != 256 && image.width != 512) || (image.height != 256 && image.height != 512)) + FatalLog("Invalid map size for image %s, (%d %d) Please fix", image.name.c_str(), image.width, image.height); // Create tileset according to bpp tileset.reset(new Tileset(image, bpp)); @@ -26,6 +28,9 @@ Map::Map(const Image16Bpp& image, int bpp) : Image(image.width / 8, image.height Map::Map(const Image16Bpp& image, std::shared_ptr& global_tileset) : Image(image.width / 8, image.height / 8, image.name, image.filename, image.frame, image.animated), data(width * height), tileset(global_tileset), export_shared_info(false) { + if ((image.width != 256 && image.width != 512) || (image.height != 256 && image.height != 512)) + FatalLog("Invalid map size for image %s, (%d %d) Please fix", image.name.c_str(), image.width, image.height); + switch(tileset->bpp) { case 4: @@ -144,6 +149,12 @@ void Map::WriteExport(std::ostream& file) const MapScene::MapScene(const std::vector& images16, const std::string& _name, int bpp) : Scene(_name), tileset(NULL) { + for (const auto& image : images16) + { + if ((image.width != 256 && image.width != 512) || (image.height != 256 && image.height != 512)) + FatalLog("Invalid map size for image %s, (%d %d) Please fix", image.name.c_str(), image.width, image.height); + } + tileset.reset(new Tileset(images16, name, bpp)); for (const auto& image : images16) diff --git a/shared/sprite.cpp b/shared/sprite.cpp index 8545390..c69bbc6 100644 --- a/shared/sprite.cpp +++ b/shared/sprite.cpp @@ -32,7 +32,7 @@ Sprite::Sprite(const Image16Bpp& image, std::shared_ptr& global_palette shape = sprite_shapes[key]; size = sprite_sizes[key]; if (size == -1 || image.width & 7 || image.height & 7) - FatalLog("Invalid sprite size, (%d %d) Please fix", image.width, image.height); + FatalLog("Invalid sprite size for image %s, (%d %d) Please fix", image.name.c_str(), image.width, image.height); // Is actually an 8 or 4bpp image Image8Bpp image8(image, palette); @@ -49,7 +49,7 @@ Sprite::Sprite(const Image16Bpp& image, int _bpp) : Image(image.width / 8, image shape = sprite_shapes[key]; size = sprite_sizes[key]; if (size == -1 || image.width & 7 || image.height & 7) - FatalLog("Invalid sprite size, (%d %d) Please fix", image.width, image.height); + FatalLog("Invalid sprite size for image %s, (%d %d) Please fix", image.name.c_str(), image.width, image.height); GetPalette(image.pixels, 1 << bpp, params.transparent_color, 0, *palette); // Is actually an 8 or 4bpp image