diff --git a/src/abr.cpp b/src/abr.cpp index 9369039..5514549 100644 --- a/src/abr.cpp +++ b/src/abr.cpp @@ -25,6 +25,7 @@ bool ABR::section_samp() { auto samp_size = ru32(); auto uid = rpascal(); + printf("sample brush %s\n", uid.c_str()); skip(4); auto image = parse_vmem(); if (image->channels.size() >= 3) @@ -67,6 +68,7 @@ bool ABR::section_patt() auto image_mode = ru32(); if (!(image_mode == 1 || image_mode == 3)) { + printf("skip image mode %d\n", image_mode); skip(patt_length - 8); snap(); continue; @@ -113,16 +115,16 @@ bool ABR::section_patt() std::shared_ptr ABR::parse_vmem() { // Virtual Memory Array List - auto version = ru32(); // = 3 - auto length = ru32(); - auto rect = rrect(); - auto channels = ru32(); + auto vmem_version = ru32(); // = 3 + auto vmem_length = ru32(); + auto vmem_rect = rrect(); + auto vmem_channels = ru32(); // The following is a virtual memory array, // repeated for the number of channels // + one for a user mask + one for a sheet mask. - channels += 2; // user and sheet mask - auto ret = std::make_shared(version, rect); - for (int ch = 0; ch < channels; ch++) + vmem_channels += 2; // user and sheet mask + auto ret = std::make_shared(vmem_version, vmem_rect); + for (int ch = 0; ch < vmem_channels; ch++) { auto array_written = ru32(); // skip if 0 if (array_written == 0) @@ -147,6 +149,7 @@ std::shared_ptr ABR::parse_vmem() } else if (compression == 1) { + auto start = pos(); auto height = rect.height(); // contain the compressed length of each scanline std::vector scanlines; @@ -160,6 +163,7 @@ std::shared_ptr ABR::parse_vmem() raw.insert(raw.end(), decoded.begin(), decoded.end()); } ret->channels.emplace_back(depth, rect, compression, raw); + auto len = pos() - start; } else { @@ -300,6 +304,7 @@ bool ABR::open(const std::string& path) init(asset.read_all(), asset.m_len, BinaryStream::ByteOrder::BigEndian); auto version_major = ru16(); auto version_minor = ru16(); + printf("ABR %d.%d\n", version_major, version_minor); while (!eof()) { if (rstring(4) != "8BIM") diff --git a/src/abr.h b/src/abr.h index 2f8f2f1..4d4e4f0 100644 --- a/src/abr.h +++ b/src/abr.h @@ -105,8 +105,9 @@ public: n = -n + 1; j++; + auto ch = ru8(); for (int c = 0; c < n; c++) - data.push_back(ru8()); + data.push_back(ch); } else { @@ -213,7 +214,7 @@ class ABR : public BinaryStream Type::Vec items; virtual std::string str(int indent, const std::string& prefix) const override { - auto ret = std::string(indent, '-') + fmt::format("list: {} props:", items.size()); + auto ret = std::string(indent, '-') + fmt::format("list: {} items:", items.size()); for (int i = 0; i < items.size(); i++) ret += "\n" + items[i]->str(indent + 1, fmt::format("{}) ", i)); return ret; @@ -371,11 +372,11 @@ private: auto& method = m_parser_table[t]; return method(); } - else if (m_parser_table.find(pick(4)) != m_parser_table.end()) - { - auto& method = m_parser_table[rstring(4)]; - return method(); - } + //else if (m_parser_table.find(pick(4)) != m_parser_table.end()) + //{ + // auto& method = m_parser_table[rstring(4)]; + // return method(); + //} return nullptr; } std::map> m_parser_table; diff --git a/src/app.h b/src/app.h index 9120ad8..e0e12c3 100644 --- a/src/app.h +++ b/src/app.h @@ -56,8 +56,6 @@ public: LayoutManager layout; NodeMessageBox* msgbox; NodeSettings* settings; - NodePopupMenu* popup = nullptr; - NodePopupMenu* subpopup = nullptr; NodePopupMenu* menu_file = nullptr; NodePopupMenu* menu_edit = nullptr; NodePopupMenu* menu_layers = nullptr; diff --git a/src/app_dialogs.cpp b/src/app_dialogs.cpp index 4b95209..9795a84 100644 --- a/src/app_dialogs.cpp +++ b/src/app_dialogs.cpp @@ -478,9 +478,6 @@ void App::dialog_resize() ActionManager::clear(); dialog->destroy(); }; - - popup->mouse_release(); - popup->destroy(); } void App::dialog_export_cubes() @@ -517,7 +514,4 @@ void App::dialog_layer_rename() dialog->destroy(); App::I.hideKeyboard(); }; - - popup->mouse_release(); - popup->destroy(); } diff --git a/src/app_layout.cpp b/src/app_layout.cpp index fd45ed7..906c45b 100644 --- a/src/app_layout.cpp +++ b/src/app_layout.cpp @@ -379,7 +379,7 @@ void App::init_menu_file() { menu_file->on_click = [=](Node*) { glm::vec2 pos = menu_file->m_pos + glm::vec2(0, menu_file->m_size.y); - popup = (NodePopupMenu*)layout[const_hash("file-menu")]->m_children[0]->clone(); + auto popup = (NodePopupMenu*)layout[const_hash("file-menu")]->m_children[0]->clone(); popup->update(); if (YGNodeStyleGetDirection(layout[main_id]->y_node) == YGDirectionRTL) pos.x = pos.x - popup->m_size.x + menu_file->m_size.x; @@ -393,13 +393,13 @@ void App::init_menu_file() popup->m_capture_children = false; if (auto b = popup->find("file-newdoc")) - b->on_click = [this](Node*) { + b->on_click = [this, popup](Node*) { dialog_newdoc(); popup->mouse_release(); popup->destroy(); }; if (auto b = popup->find("file-import")) - b->on_click = [this](Node*) { + b->on_click = [this, popup](Node*) { App::I.pick_image([this](std::string path){ Image img; async_start(); @@ -422,7 +422,7 @@ void App::init_menu_file() popup->destroy(); }; if (auto b = popup->find("file-open")) - b->on_click = [this](Node*) { + b->on_click = [this, popup](Node*) { //dialog_open(); App::I.pick_file({"ppi","PPI"}, [this](std::string path){ App::I.open_document(path); @@ -431,13 +431,13 @@ void App::init_menu_file() popup->destroy(); }; if (auto b = popup->find("file-browse")) - b->on_click = [this](Node*) { + b->on_click = [this, popup](Node*) { dialog_browse(); popup->mouse_release(); popup->destroy(); }; if (auto b = popup->find("file-save")) - b->on_click = [this](Node*) { + b->on_click = [this, popup](Node*) { if (Canvas::I->m_newdoc) { dialog_save(); @@ -450,27 +450,27 @@ void App::init_menu_file() popup->destroy(); }; if (auto b = popup->find("file-save-as")) - b->on_click = [this](Node*) { + b->on_click = [this, popup](Node*) { dialog_save(); popup->mouse_release(); popup->destroy(); }; if (auto b = popup->find("file-save-ver")) - b->on_click = [this](Node*) { + b->on_click = [this, popup](Node*) { Canvas::I->m_newdoc ? dialog_save() : dialog_save_ver(); popup->mouse_release(); popup->destroy(); }; if (auto b = popup->find("file-export")) - b->on_click = [this](Node*) { + b->on_click = [this, popup](Node*) { dialog_export(".jpg"); popup->mouse_release(); popup->destroy(); }; if (auto b = popup->find("file-export-tick")) - b->on_click = [this,b](Node*) { + b->on_click = [this, b, popup](Node*) { glm::vec2 pos = b->m_pos + glm::vec2(b->m_size.x, 0); - subpopup = (NodePopupMenu*)layout[const_hash("file-submenu-export")]->m_children[0]->clone(); + auto subpopup = (NodePopupMenu*)layout[const_hash("file-submenu-export")]->m_children[0]->clone(); subpopup->update(); if (YGNodeStyleGetDirection(layout[main_id]->y_node) == YGDirectionRTL) pos.x = pos.x - subpopup->m_size.x + b->m_size.x; @@ -482,14 +482,14 @@ void App::init_menu_file() subpopup->m_mouse_ignore = false; subpopup->m_flood_events = true; subpopup->m_capture_children = false; - subpopup->find("file-submenu-export-png")->on_click = [this](Node*) { + subpopup->find("file-submenu-export-png")->on_click = [this, subpopup, popup](Node*) { dialog_export(".png"); subpopup->mouse_release(); subpopup->destroy(); popup->mouse_release(); popup->destroy(); }; - subpopup->find("file-submenu-export-layers")->on_click = [this](Node*) { + subpopup->find("file-submenu-export-layers")->on_click = [this, subpopup, popup](Node*) { dialog_export_layers(); subpopup->mouse_release(); subpopup->destroy(); @@ -498,31 +498,31 @@ void App::init_menu_file() }; }; if (auto b = popup->find("file-share")) - b->on_click = [this](Node*) { + b->on_click = [this, popup](Node*) { share_file(doc_path); popup->mouse_release(); popup->destroy(); }; if (auto b = popup->find("file-resize")) - b->on_click = [this](Node*) { + b->on_click = [this, popup](Node*) { dialog_resize(); popup->mouse_release(); popup->destroy(); }; if (auto b = popup->find("file-export-cubes")) - b->on_click = [this](Node*) { + b->on_click = [this, popup](Node*) { dialog_export_cubes(); popup->mouse_release(); popup->destroy(); }; if (auto b = popup->find("file-cloud-upload")) - b->on_click = [this](Node*) { + b->on_click = [this, popup](Node*) { cloud_upload(); popup->mouse_release(); popup->destroy(); }; if (auto b = popup->find("file-cloud-browse")) - b->on_click = [this](Node*) { + b->on_click = [this, popup](Node*) { cloud_browse(); popup->mouse_release(); popup->destroy(); @@ -537,7 +537,7 @@ void App::init_menu_edit() { menu_file->on_click = [=](Node*) { glm::vec2 pos = menu_file->m_pos + glm::vec2(0, menu_file->m_size.y); - popup = (NodePopupMenu*)layout[const_hash("edit-menu")]->m_children[0]->clone(); + auto popup = (NodePopupMenu*)layout[const_hash("edit-menu")]->m_children[0]->clone(); popup->update(); if (YGNodeStyleGetDirection(layout[main_id]->y_node) == YGDirectionRTL) pos.x = pos.x - popup->m_size.x + menu_file->m_size.x; @@ -559,7 +559,7 @@ void App::init_menu_timelapse() { menu_file->on_click = [=](Node*) { glm::vec2 pos = menu_file->m_pos + glm::vec2(0, menu_file->m_size.y); - popup = (NodePopupMenu*)layout[const_hash("timelapse-menu")]->m_children[0]->clone(); + auto popup = (NodePopupMenu*)layout[const_hash("timelapse-menu")]->m_children[0]->clone(); popup->update(); if (YGNodeStyleGetDirection(layout[main_id]->y_node) == YGDirectionRTL) pos.x = pos.x - popup->m_size.x + menu_file->m_size.x; @@ -580,19 +580,19 @@ void App::init_menu_timelapse() } } - popup->find("timelapse-start")->on_click = [this](Node*) { + popup->find("timelapse-start")->on_click = [this, popup](Node*) { App::I.rec_running ? App::I.rec_stop() : App::I.rec_start(); popup->mouse_release(); popup->destroy(); }; - popup->find("timelapse-clear")->on_click = [this](Node*) { + popup->find("timelapse-clear")->on_click = [this, popup](Node*) { App::I.rec_clear(); popup->mouse_release(); popup->destroy(); }; - popup->find("timelapse-export")->on_click = [this](Node*) { + popup->find("timelapse-export")->on_click = [this, popup](Node*) { popup->mouse_release(); popup->destroy(); App::I.rec_export(""); @@ -607,7 +607,7 @@ void App::init_menu_about() { menu_file->on_click = [=](Node*) { glm::vec2 pos = menu_file->m_pos + glm::vec2(0, menu_file->m_size.y); - popup = (NodePopupMenu*)layout[const_hash("about-menu")]->m_children[0]->clone(); + auto popup = (NodePopupMenu*)layout[const_hash("about-menu")]->m_children[0]->clone(); popup->update(); if (YGNodeStyleGetDirection(layout[main_id]->y_node) == YGDirectionRTL) pos.x = pos.x - popup->m_size.x + menu_file->m_size.x; @@ -620,13 +620,13 @@ void App::init_menu_about() popup->m_flood_events = true; popup->m_capture_children = false; - popup->find("about-app")->on_click = [this](Node*) { + popup->find("about-app")->on_click = [this, popup](Node*) { dialog_about(); popup->mouse_release(); popup->destroy(); }; - popup->find("about-doc")->on_click = [this](Node*) { + popup->find("about-doc")->on_click = [this, popup](Node*) { // auto path = Asset::absolute("data/doc/test.pdf"); // display_file(path); dialog_usermanual(); @@ -642,7 +642,7 @@ void App::init_menu_about() sprintf(label, "What's new in %d.%d.%d?", g_version_major, g_version_minor, g_version_fix); text->set_text(label); } - item->on_click = [this](Node*) { + item->on_click = [this, popup](Node*) { dialog_changelog(); popup->mouse_release(); popup->destroy(); @@ -651,15 +651,17 @@ void App::init_menu_about() if (auto b = popup->find("about-crash")) { - b->on_click = [this](Node*) { + b->on_click = [this, popup](Node*) { LOG("crashing"); App::I.crash_test(); + popup->mouse_release(); + popup->destroy(); }; } if (auto b = popup->find("about-perf")) { - b->on_click = [this](Node*) { + b->on_click = [this, popup](Node*) { LOG("perf"); auto start = std::chrono::high_resolution_clock::now(); Canvas::I->stroke_start({ 0, 0, 0 }, 0.9f, Canvas::I->m_current_brush); @@ -684,6 +686,8 @@ void App::init_menu_about() static char str[256]; sprintf(str, "Time %lld ms", ms); App::I.message_box("Performance test", str); + popup->mouse_release(); + popup->destroy(); }; } }; @@ -702,7 +706,7 @@ void App::init_menu_layer() { menu_file->on_click = [=](Node*) { glm::vec2 pos = menu_file->m_pos + glm::vec2(0, menu_file->m_size.y); - popup = (NodePopupMenu*)layout[const_hash("layers-menu")]->m_children[0]->clone(); + auto popup = (NodePopupMenu*)layout[const_hash("layers-menu")]->m_children[0]->clone(); popup->update(); if (YGNodeStyleGetDirection(layout[main_id]->y_node) == YGDirectionRTL) pos.x = pos.x - popup->m_size.x + menu_file->m_size.x; @@ -714,20 +718,20 @@ void App::init_menu_layer() popup->m_mouse_ignore = false; popup->m_flood_events = true; popup->m_capture_children = false; - popup->find("clear-grids")->on_click = [this](Node*) { + popup->find("clear-grids")->on_click = [this, popup](Node*) { CanvasModeGrid* mode = (CanvasModeGrid*)Canvas::modes[(int)kCanvasMode::Grid][0]; mode->clear(); popup->mouse_release(); popup->destroy(); }; - popup->find("camera-reset")->on_click = [this](Node*) { + popup->find("camera-reset")->on_click = [this, popup](Node*) { canvas->reset_camera(); popup->mouse_release(); popup->destroy(); }; - popup->find("layer-clear")->on_click = [this](Node*) { + popup->find("layer-clear")->on_click = [this, popup](Node*) { canvas->m_canvas->clear(); popup->mouse_release(); popup->destroy(); @@ -737,8 +741,10 @@ void App::init_menu_layer() find("menu-label")-> set_text(("Clear Layer " + layers->m_current_layer->m_label_text).c_str()); - popup->find("layer-rename")->on_click = [this](Node*) { + popup->find("layer-rename")->on_click = [this, popup](Node*) { dialog_layer_rename(); + popup->mouse_release(); + popup->destroy(); }; if (layers->m_current_layer) popup->find("layer-rename")-> @@ -749,7 +755,7 @@ void App::init_menu_layer() find("menu-label")-> set_text("Rename Layer (Select a layer)"); - popup->find("layer-merge")->on_click = [this](Node*) { + popup->find("layer-merge")->on_click = [this, popup](Node*) { const auto& order = canvas->m_canvas->m_order; //layers->get_child_index(layers->) int current_idx_order = std::distance(order.begin(), std::find(order.begin(), order.end(), canvas->m_canvas->m_current_layer_idx));