From 9ea1ca4fae70f6e46d5b49e2ce54c1dc3b6fba02 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Thu, 20 Sep 2018 21:12:48 +0200 Subject: [PATCH] new file format with versioning and layer opacity --- scripts/pre-build.py | 6 ++++++ src/app_dialogs.cpp | 5 ++++- src/canvas.cpp | 42 ++++++++++++++++++++++++++++----------- src/canvas.h | 43 ++++++++++++++++++++++++++++++++++++++++ src/node_panel_layer.cpp | 3 ++- src/node_panel_layer.h | 2 +- src/version.cpp | 4 ++++ src/version.h | 4 ++++ 8 files changed, 94 insertions(+), 15 deletions(-) diff --git a/scripts/pre-build.py b/scripts/pre-build.py index dfd3947..bf46ac4 100644 --- a/scripts/pre-build.py +++ b/scripts/pre-build.py @@ -13,11 +13,17 @@ config = sys.argv[1].lower() version = "%s.%d (%s-%s-%s)" % (tag, revcount, shorthash, branch, config) version_number = "%s.%d" % (tag, revcount) +version_parts = version_number.split('.') + print("Compiling version: %s" % version) version_gen_h = '// AUTO GENERATED FILE - DON\'T MODIFY\n' version_gen_h += '#define PP_VERSION_NUMBER_STRING "%s"\n' % version_number version_gen_h += '#define PP_VERSION_STRING "%s"\n' % version +version_gen_h += '#define PP_VERSION_MAJOR %s\n' % version_parts[0] +version_gen_h += '#define PP_VERSION_MINOR %s\n' % version_parts[1] +version_gen_h += '#define PP_VERSION_FIX %s\n' % version_parts[2] +version_gen_h += '#define PP_VERSION_BUILD %s\n' % version_parts[3] version_gen_h += '#define PP_RC_BUILD_VERSION %s\n' % version_number.replace('.',',') version_gen_h += '#define PP_RC_BUILD_VERSION_STRING "%s\\0"\n' % version version_gen_h += '#define PP_RC_PRODUCT_VERSION %s,0\n' % tag.replace('.',',') diff --git a/src/app_dialogs.cpp b/src/app_dialogs.cpp index 48e8eb2..78732dc 100644 --- a/src/app_dialogs.cpp +++ b/src/app_dialogs.cpp @@ -200,7 +200,10 @@ void App::dialog_browse() async_start(); title_update(); for (auto& i : canvas->m_canvas->m_order) - layers->add_layer(canvas->m_canvas->m_layers[i].m_name.c_str()); + { + auto* l = layers->add_layer(canvas->m_canvas->m_layers[i].m_name.c_str()); + l->m_opacity->m_value.x = canvas->m_canvas->m_layers[i].m_opacity; + } async_end(); }); dialog->destroy(); diff --git a/src/canvas.cpp b/src/canvas.cpp index a1f9380..7d55451 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -1532,9 +1532,12 @@ void ui::Canvas::project_save_thread(std::string file_path) return; } + PPIHeader ppi_header; + fwrite(&ppi_header, sizeof(PPIHeader), 1, fp); + // load thumbnail App::I.async_start(); - Image thumb = thumbnail_generate(128, 128); + Image thumb = thumbnail_generate(ppi_header.thumb_header.width, ppi_header.thumb_header.height); auto pb = std::make_shared(); pb->m_manager = &App::I.layout; pb->init(); @@ -1547,9 +1550,6 @@ void ui::Canvas::project_save_thread(std::string file_path) App::I.async_end(); thumb.flip(); - fwrite(&thumb.width, sizeof(int), 1, fp); - fwrite(&thumb.height, sizeof(int), 1, fp); - fwrite(&thumb.comp, sizeof(int), 1, fp); fwrite(thumb.data(), thumb.size(), 1, fp); fwrite(&m_width, sizeof(int), 1, fp); @@ -1561,11 +1561,14 @@ void ui::Canvas::project_save_thread(std::string file_path) int progress = 0; int total = (int)m_layers.size() * 6; - for (int i = 0; i < (int)m_layers.size(); i++) + for (int i = 0; i < (int)m_layers.size(); i++) { int n_order = m_order[i]; fwrite(&n_order, sizeof(int), 1, fp); + float layer_alpha = m_layers[i].m_opacity; + fwrite(&layer_alpha, sizeof(float), 1, fp); + int name_len = (int)m_layers[i].m_name.size(); fwrite(&name_len, sizeof(int), 1, fp); fwrite(m_layers[i].m_name.data(), name_len, 1, fp); @@ -1642,6 +1645,12 @@ void ui::Canvas::project_open_thread(std::string file_path) return; // should probably return a bool } + PPIHeader ppi_header; + fread(&ppi_header, sizeof(PPIHeader), 1, fp); + + if (!ppi_header.valid()) + return; + gl_state gl; std::shared_ptr pb; if (App::I.layout.m_loaded) @@ -1661,12 +1670,11 @@ void ui::Canvas::project_open_thread(std::string file_path) App::I.async_end(); } - LOG("skip thumb"); // skip thumbnail Image thumb; - fread(&thumb.width, sizeof(int), 1, fp); - fread(&thumb.height, sizeof(int), 1, fp); - fread(&thumb.comp, sizeof(int), 1, fp); + thumb.width = ppi_header.thumb_header.width; + thumb.height = ppi_header.thumb_header.height; + thumb.comp = ppi_header.thumb_header.comp; fseek(fp, thumb.size(), SEEK_CUR); fread(&m_width, sizeof(int), 1, fp); @@ -1698,6 +1706,9 @@ void ui::Canvas::project_open_thread(std::string file_path) int n_order; fread(&n_order, sizeof(int), 1, fp); + float layer_opacity; + fread(&layer_opacity, sizeof(float), 1, fp); + int name_len; fread(&name_len, sizeof(int), 1, fp); std::string name(name_len, '\0'); @@ -1745,6 +1756,7 @@ void ui::Canvas::project_open_thread(std::string file_path) App::I.async_start(); tmp_layers.emplace_back(); + tmp_layers.back().m_opacity = layer_opacity; tmp_layers.back().create(m_width, m_height, name.c_str()); tmp_layers.back().restore(snap); tmp_order.push_back(n_order); @@ -1844,10 +1856,16 @@ ui::Image ui::Canvas::thumbnail_read(std::string data_path) LOG("cannot read project %s", data_path.c_str()); return {}; // return empty image } + PPIHeader ppi_header; + fread(&ppi_header, sizeof(PPIHeader), 1, fp); + + if (!ppi_header.valid()) + return {}; + Image thumb; - fread(&thumb.width, sizeof(int), 1, fp); - fread(&thumb.height, sizeof(int), 1, fp); - fread(&thumb.comp, sizeof(int), 1, fp); + thumb.width = ppi_header.thumb_header.width; + thumb.height = ppi_header.thumb_header.height; + thumb.comp = ppi_header.thumb_header.comp; thumb.create(); fread((uint8_t*)thumb.data(), thumb.size(), 1, fp); fclose(fp); diff --git a/src/canvas.h b/src/canvas.h index 19edad9..2335b8f 100644 --- a/src/canvas.h +++ b/src/canvas.h @@ -42,6 +42,49 @@ public: void destroy(); }; +struct PPIThumb +{ + int width = 128; + int height = 128; + int comp = 4; + bool valid() const + { + return (width == 128 && height == 128 && comp == 4); + } +}; + +struct PPIDocVersion +{ + int major = 0; + int minor = 1; +}; + +struct PPISoftVersion +{ + int major = g_version_major; + int minor = g_version_minor; + int fix = g_version_fix; + int build = g_version_build; +}; + +struct PPIHeader +{ + char magic[4]{ 'P', 'P', 'I', 0 }; + PPIDocVersion doc_version; + PPISoftVersion soft_version; + PPIThumb thumb_header; + bool valid() + { + if (strcmp(magic, "PPI") != 0) + return false; + if (doc_version.major != 0 || doc_version.minor != 1) + return false; + if (!thumb_header.valid()) + return false; + return true; + } +}; + class Canvas { public: diff --git a/src/node_panel_layer.cpp b/src/node_panel_layer.cpp index 0572101..f7847c3 100644 --- a/src/node_panel_layer.cpp +++ b/src/node_panel_layer.cpp @@ -162,7 +162,7 @@ void NodePanelLayer::init() LOG("done init"); } -void NodePanelLayer::add_layer(const char* name) +NodeLayer* NodePanelLayer::add_layer(const char* name) { NodeLayer* l = new NodeLayer; m_layers_container->add_child(l); @@ -179,6 +179,7 @@ void NodePanelLayer::add_layer(const char* name) m_current_layer = l; m_current_layer->m_selected = true; m_layers.push_back(l); + return l; } void NodePanelLayer::add_layer() diff --git a/src/node_panel_layer.h b/src/node_panel_layer.h index 1aa7c3d..93330f6 100644 --- a/src/node_panel_layer.h +++ b/src/node_panel_layer.h @@ -52,7 +52,7 @@ public: virtual Node* clone_instantiate() const override; virtual void init() override; void add_layer(); - void add_layer(const char* name); + NodeLayer* add_layer(const char* name); NodeLayer* get_layer_at(int index); void remove_layer(NodeLayer* layer); void handle_layer_opacity(NodeLayer* target, float value); diff --git a/src/version.cpp b/src/version.cpp index acbc1b0..067a6cb 100644 --- a/src/version.cpp +++ b/src/version.cpp @@ -4,6 +4,10 @@ const char* g_version = PP_VERSION_STRING; const char* g_version_number = PP_VERSION_NUMBER_STRING; const char* g_window_title = "PanoPainter " PP_VERSION_NUMBER_STRING; +const int g_version_major = PP_VERSION_MAJOR; +const int g_version_minor = PP_VERSION_MINOR; +const int g_version_fix = PP_VERSION_FIX; +const int g_version_build = PP_VERSION_BUILD; #ifdef _WIN32 #include "windows.h" diff --git a/src/version.h b/src/version.h index 70fd567..6ce4e6e 100644 --- a/src/version.h +++ b/src/version.h @@ -3,6 +3,10 @@ extern const char* g_version; extern const char* g_version_number; extern const char* g_window_title; +extern const int g_version_major; +extern const int g_version_minor; +extern const int g_version_fix; +extern const int g_version_build; #ifdef _WIN32 extern const wchar_t* g_version_w;