From cea08b7a890a6c6c76b90cecbff6863681e2a3fd Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 23 Mar 2022 12:12:16 +0100 Subject: [PATCH 001/249] changeless From faad0aa7799788eed6df7305df13c827106b566e Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 16 May 2023 14:23:47 -0400 Subject: [PATCH 002/249] pass neon path as command line argument --- emscripten/testNeon.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/emscripten/testNeon.sh b/emscripten/testNeon.sh index 3bd16175df4..6e543fedf33 100755 --- a/emscripten/testNeon.sh +++ b/emscripten/testNeon.sh @@ -16,9 +16,9 @@ cd build # Moves the needed verovio.js into Neon cp verovio.js verovio_new.js -mv verovio_new.js [location_of_your_Neon]/Neon/verovio-util +mv verovio_new.js $1/verovio-util -cd [location_of_your_Neon]/Neon/verovio-util +cd $1/verovio-util rm verovio.js; mv verovio_new.js verovio.js From 0bbfe648e5488f90edd6f214385f7998e48c0fef Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 16 May 2023 14:23:47 -0400 Subject: [PATCH 003/249] pass neon path as command line argument --- emscripten/testNeon.sh | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 emscripten/testNeon.sh diff --git a/emscripten/testNeon.sh b/emscripten/testNeon.sh new file mode 100644 index 00000000000..0158466bf4a --- /dev/null +++ b/emscripten/testNeon.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# This is a little script that compiles verovio using buildToolkit +# and moves the output, verovio.js, into Neon/verovio-util. +# It then starts up a local instance of Neon using yarn so the +# developer can see the changes as soon as possible. +# Please change [location_of_your_Neon] with the actual path. +# For example: ~/Desktop/DDMAL + + +# Builds verovio for Neon +./buildToolkit -x "Gootville,Petaluma" -DHPX + +cd build + +# Moves the needed verovio.js into Neon +cp verovio.js verovio_new.js + +mv verovio_new.js /Users/yinanzhou/SIMSSA/Neon/verovio-util + +cd /Users/yinanzhou/SIMSSA/Neon/verovio-util + +rm verovio.js; mv verovio_new.js verovio.js + +# Runs Neon +yarn build && yarn start \ No newline at end of file From 39c0099cec6ee9de627ee8b27aa92cc2422007b2 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Wed, 5 Jul 2023 16:30:52 -0400 Subject: [PATCH 004/249] Remove testNeon.sh from git --- emscripten/testNeon.sh | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 emscripten/testNeon.sh diff --git a/emscripten/testNeon.sh b/emscripten/testNeon.sh deleted file mode 100644 index 0158466bf4a..00000000000 --- a/emscripten/testNeon.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -# This is a little script that compiles verovio using buildToolkit -# and moves the output, verovio.js, into Neon/verovio-util. -# It then starts up a local instance of Neon using yarn so the -# developer can see the changes as soon as possible. -# Please change [location_of_your_Neon] with the actual path. -# For example: ~/Desktop/DDMAL - - -# Builds verovio for Neon -./buildToolkit -x "Gootville,Petaluma" -DHPX - -cd build - -# Moves the needed verovio.js into Neon -cp verovio.js verovio_new.js - -mv verovio_new.js /Users/yinanzhou/SIMSSA/Neon/verovio-util - -cd /Users/yinanzhou/SIMSSA/Neon/verovio-util - -rm verovio.js; mv verovio_new.js verovio.js - -# Runs Neon -yarn build && yarn start \ No newline at end of file From 118eeb652f800536195a23e8c480219c04ed4bda Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 10 Jul 2023 11:49:20 -0400 Subject: [PATCH 005/249] MatchHeight editor action for bbox --- include/vrv/editortoolkit_neume.h | 2 + src/editortoolkit_neume.cpp | 80 +++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/include/vrv/editortoolkit_neume.h b/include/vrv/editortoolkit_neume.h index dfeb65043e5..a31242d2970 100644 --- a/include/vrv/editortoolkit_neume.h +++ b/include/vrv/editortoolkit_neume.h @@ -44,6 +44,7 @@ class EditorToolkitNeume : public EditorToolkit { bool Insert(std::string elementType, std::string staffId, int ulx, int uly, int lrx, int lry, std::vector> attributes); bool InsertToSyllable(std::string elementId); + bool MatchHeight(std::string elementId); bool Merge(std::vector elementIds); bool MoveOutsideSyllable(std::string elementId); bool Set(std::string elementId, std::string attrType, std::string attrValue); @@ -72,6 +73,7 @@ class EditorToolkitNeume : public EditorToolkit { bool ParseInsertAction(jsonxx::Object param, std::string *elementType, std::string *staffId, int *ulx, int *uly, int *lrx, int *lry, std::vector> *attributes); bool ParseInsertToSyllableAction(jsonxx::Object param, std::string *elementId); + bool ParseMatchHeightAction(jsonxx::Object param, std::string *elementId); bool ParseMergeAction(jsonxx::Object param, std::vector *elementIds); bool ParseMoveOutsideSyllableAction(jsonxx::Object param, std::string *elementId); bool ParseSetAction(jsonxx::Object param, std::string *elementId, std::string *attrType, std::string *attrValue); diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index aa60f6b3559..132b579e4d6 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -183,6 +183,13 @@ bool EditorToolkitNeume::ParseEditorAction(const std::string &json_editorAction) return this->SplitNeume(elementId, ncId); } } + else if (action == "matchHeight") { + std::string elementId; + if (this->ParseMatchHeightAction(json.get("param"), &elementId)) { + return this->MatchHeight(elementId); + } + LogWarning("Could not parse the insert action"); + } else if (action == "merge") { std::vector elementIds; if (this->ParseMergeAction(json.get("param"), &elementIds)) { @@ -1596,6 +1603,72 @@ bool EditorToolkitNeume::DisplaceClefOctave(std::string elementId, std::string d return true; } +bool EditorToolkitNeume::MatchHeight(std::string elementId) +{ + if (!m_doc->GetDrawingPage()) { + LogError("Could not get drawing page"); + m_infoObject.import("status", "FAILURE"); + m_infoObject.import("message", "Could not get drawing page."); + return false; + } + if (m_doc->GetType() != Facs) { + LogError("Drawing page without facsimile"); + m_infoObject.import("status", "FAILURE"); + m_infoObject.import("message", "Drawing page without facsimile is unsupported."); + return false; + } + + Object *element = m_doc->GetDrawingPage()->FindDescendantByID(elementId); + assert(element); + Object *staffParent = element->GetFirstAncestor(STAFF); + if (element == NULL) { + LogError("No element exists with ID '%s'.", elementId.c_str()); + m_infoObject.import("status", "FAILURE"); + m_infoObject.import("message", "No element exists with ID" + elementId + "."); + return false; + } + if (!element->Is(SYL)) { + LogError("Element is of type %s, but only element can match height.", element->GetClassName().c_str()); + m_infoObject.import("status", "FAILURE"); + m_infoObject.import( + "message", "Element is of type " + element->GetClassName() + ", but only element can match height."); + return false; + } + + // get the position of the selected bbox + int uly; + int lry; + if (dynamic_cast(element)->HasFacs()) { + uly = element->GetFacsimileInterface()->GetZone()->GetUly(); + lry = element->GetFacsimileInterface()->GetZone()->GetLry(); + } + else { + LogError("Selected '%s' without facsimile", element->GetClassName().c_str()); + m_infoObject.import("status", "FAILURE"); + m_infoObject.import("message", "Selected '" + element->GetClassName() + "' without facsimile is unsupported."); + return false; + } + + // find all syls in staff + ListOfObjects syls; + ClassIdComparison ac(SYL); + staffParent->FindAllDescendantsByComparison(&syls, &ac); + Syl *syl; + Zone *zone; + + for (auto it = syls.begin(); it != syls.end(); ++it) { + syl = dynamic_cast(*it); + zone = syl->GetFacsimileInterface()->GetZone(); + assert(zone); + zone->SetUly(uly); + zone->SetLry(lry); + } + + m_infoObject.import("status", "OK"); + m_infoObject.import("message", ""); + return true; +} + bool EditorToolkitNeume::Merge(std::vector elementIds) { if (!m_doc->GetDrawingPage()) return false; @@ -3777,6 +3850,13 @@ bool EditorToolkitNeume::ParseDisplaceClefAction(jsonxx::Object param, std::stri return true; } +bool EditorToolkitNeume::ParseMatchHeightAction(jsonxx::Object param, std::string *elementId) +{ + if (!param.has("elementId")) return false; + (*elementId) = param.get("elementId"); + return true; +} + bool EditorToolkitNeume::ParseMergeAction(jsonxx::Object param, std::vector *elementIds) { if (!param.has("elementIds")) return false; From 9e30b5428509ac320a70897b8da91b26b5ad73a1 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Wed, 12 Jul 2023 17:25:17 -0400 Subject: [PATCH 006/249] Add overlap correction on x-axis --- src/editortoolkit_neume.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 132b579e4d6..8054cf2780b 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -1655,11 +1655,25 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) staffParent->FindAllDescendantsByComparison(&syls, &ac); Syl *syl; Zone *zone; + int rightMost = -1; + int itUlx; + int itLrx; for (auto it = syls.begin(); it != syls.end(); ++it) { syl = dynamic_cast(*it); zone = syl->GetFacsimileInterface()->GetZone(); assert(zone); + + // adjust x-axis first + itUlx = zone->GetUlx(); + itLrx = zone->GetLrx(); + if (itLrx > rightMost) { + // correct overlap + if (itUlx < rightMost) zone->SetUlx(rightMost); + // Update right most point if needed + rightMost = itLrx; + } + zone->SetUly(uly); zone->SetLry(lry); } From bd90014631971c2ae441eb960b8a354c2185cb40 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Thu, 13 Jul 2023 15:14:05 -0400 Subject: [PATCH 007/249] Add staff rotation offset --- src/editortoolkit_neume.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 8054cf2780b..9ff8db76b7e 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -1636,11 +1636,15 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) } // get the position of the selected bbox + int ulx; int uly; - int lry; + int height; + int lrx; if (dynamic_cast(element)->HasFacs()) { + ulx = element->GetFacsimileInterface()->GetZone()->GetUlx(); uly = element->GetFacsimileInterface()->GetZone()->GetUly(); - lry = element->GetFacsimileInterface()->GetZone()->GetLry(); + lrx = element->GetFacsimileInterface()->GetZone()->GetLrx(); + height = element->GetFacsimileInterface()->GetZone()->GetLry() - uly; } else { LogError("Selected '%s' without facsimile", element->GetClassName().c_str()); @@ -1655,9 +1659,11 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) staffParent->FindAllDescendantsByComparison(&syls, &ac); Syl *syl; Zone *zone; - int rightMost = -1; int itUlx; int itLrx; + int offsetY; + int rightMost = -1; + double theta = staffParent->GetFacsimileInterface()->GetZone()->GetRotate(); for (auto it = syls.begin(); it != syls.end(); ++it) { syl = dynamic_cast(*it); @@ -1674,8 +1680,14 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) rightMost = itLrx; } - zone->SetUly(uly); - zone->SetLry(lry); + offsetY = 0; + if (theta) { + double factor = 1.3; + offsetY = (int)((itUlx - ulx) * tan(theta * M_PI / 180.0) / factor); + } + + zone->SetUly(uly + offsetY); + zone->SetLry(uly + offsetY + height); } m_infoObject.import("status", "OK"); From 939be300897df2cd8aaebd323e0873c9ae028b93 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Thu, 13 Jul 2023 16:50:21 -0400 Subject: [PATCH 008/249] Adjust original bbox size for ungrouping --- src/editortoolkit_neume.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 9ff8db76b7e..bd17ef5b4f4 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2988,6 +2988,10 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector // if the element is a syl then we want to keep it attached to the first node if (el->Is(SYL)) { + Zone *zone = dynamic_cast(el->GetFacsimileInterface()->GetZone()); + + zone->SetLrx(zone->GetUlx() + 100); + zone->SetLry(zone->GetUly() + 200); continue; } From 467e074b47a94ab53aeca31e038d3dab3ecf8297 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Fri, 14 Jul 2023 15:20:47 -0400 Subject: [PATCH 009/249] Fix ungroup when syllable start with layer element --- src/editortoolkit_neume.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index bd17ef5b4f4..88f2b5922a2 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2932,8 +2932,10 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector sparent->ReorderByXPos(); fparent->ClearRelinquishedChildren(); fparent->ReorderByXPos(); + uuidArray << (*it); + it = elementIds.erase(it); + el = m_doc->GetDrawingPage()->FindDescendantByID(*it); } - continue; } if (elementIds.begin() == it || firstIsSyl) { // if the element is a syl we want it to stay attached to the first element From 28efa4b0d3e247cda1401ae23ebfe8d8ba96ce3b Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Fri, 14 Jul 2023 16:12:22 -0400 Subject: [PATCH 010/249] Clean up comments --- src/editortoolkit_neume.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 88f2b5922a2..26ecf7e5af6 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2997,12 +2997,6 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector continue; } - // if (el->Is(DIVLINE) || el->Is(ACCID)) { - // el->MoveItselfTo(sparent); - // fparent->ClearRelinquishedChildren(); - // continue; - // } - if (groupType == "nc") { Nc *nc = dynamic_cast(el); assert(nc); @@ -3096,15 +3090,11 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector FacsimileInterface *fi = syl->GetFacsimileInterface(); assert(fi); fi->AttachZone(zone); - - // syl->ResetFacsimile(); - // syl->SetFacs(zone->GetID()); } } if (ligNum != 1) { // if not 1st nc in ligature, add child - uuidArray << newParent->GetID(); sparent->AddChild(newParent); From bad01cfb1dcc9885709bb41e7bf7f72f3ba149bd Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 24 Jul 2023 16:22:34 -0400 Subject: [PATCH 011/249] Refactor ungroup bbox --- src/editortoolkit_neume.cpp | 67 +++++++++---------------------------- 1 file changed, 15 insertions(+), 52 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 26ecf7e5af6..ee3d1f303f0 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2845,6 +2845,7 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector int ligNum = 0; // for ligature in ungroupNcs int firstIsLig = false; bool firstIsSyl = false; + Zone *oldSylZone = NULL; Clef *oldClef = NULL; ClassIdComparison ac(CLEF); ListOfObjects syllables; // List of syllables used. groupType=neume only. @@ -2977,6 +2978,9 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector if (oldClef == NULL) { oldClef = dynamic_cast(sparent)->GetCurrentClef(); } + + // Get orginal syl zone + oldSylZone = dynamic_cast(currentParent->GetFirst(SYL)->GetFacsimileInterface()->GetZone()); } else { @@ -2990,10 +2994,9 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector // if the element is a syl then we want to keep it attached to the first node if (el->Is(SYL)) { - Zone *zone = dynamic_cast(el->GetFacsimileInterface()->GetZone()); - - zone->SetLrx(zone->GetUlx() + 100); - zone->SetLry(zone->GetUly() + 200); + if (oldSylZone) { + oldSylZone->SetLrx(oldSylZone->GetUlx() + 100); + } continue; } @@ -3035,55 +3038,15 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector if (m_doc->GetType() == Facs) { Zone *zone = new Zone(); - // Use syllable parent positions if possible - FacsimileInterface *syllableFi = NULL; - if (syl->GetFirstAncestor(SYLLABLE)->GetFacsimileInterface()->HasFacs()) { - syllableFi = syl->GetFirstAncestor(SYLLABLE)->GetFacsimileInterface(); - Zone *tempZone = dynamic_cast(syllableFi->GetZone()); - zone->SetUlx(tempZone->GetUlx()); - zone->SetUly(tempZone->GetUly()); - zone->SetLrx(tempZone->GetLrx()); - zone->SetLry(tempZone->GetLry()); - } - // otherwise get a boundingbox that comprises all the neumes in the syllable - else { - ListOfObjects children; - InterfaceComparison comp(INTERFACE_FACSIMILE); - syl->GetFirstAncestor(SYLLABLE)->FindAllDescendantsByComparison(&children, &comp); - for (auto iter2 = children.begin(); iter2 != children.end(); ++iter2) { - FacsimileInterface *temp = (*iter2)->GetFacsimileInterface(); - assert(temp); - Zone *tempZone = vrv_cast(temp->GetZone()); - assert(tempZone); - if (temp->HasFacs()) { - if (syllableFi == NULL) { - zone->SetUlx(tempZone->GetUlx()); - zone->SetUly(tempZone->GetUly()); - zone->SetLrx(tempZone->GetLrx()); - zone->SetLry(tempZone->GetLry()); - } - else { - if (tempZone->GetUlx() < zone->GetUlx()) { - zone->SetUlx(tempZone->GetUlx()); - } - if (tempZone->GetUly() < zone->GetUly()) { - zone->SetUly(tempZone->GetUly()); - } - if (tempZone->GetLrx() > zone->GetLrx()) { - zone->SetLrx(tempZone->GetLrx()); - } - if (tempZone->GetLry() > zone->GetLry()) { - zone->SetLry(tempZone->GetLry()); - } - } - } - } - } + zone->SetUlx(el->GetFirst(NC)->GetFacsimileInterface()->GetZone()->GetUlx()); + zone->SetUly(oldSylZone->GetUly()); + zone->SetLrx(el->GetLast(NC)->GetFacsimileInterface()->GetZone()->GetLrx()); + zone->SetLry(oldSylZone->GetLry()); - // make the bounding box a little bigger and lower so it's easier to edit - zone->SetUly(zone->GetUly() + 100); - zone->SetLrx(zone->GetLrx() + 100); - zone->SetLry(zone->GetLry() + 200); + // Make bbox larger if it has less than 2 ncs + if (newParent->GetChildCount(NC, 2) <= 2) { + zone->SetLrx(zone->GetLrx() + 50); + } assert(m_doc->GetFacsimile()); m_doc->GetFacsimile()->FindDescendantByType(SURFACE)->AddChild(zone); From 5456a4cb645ff21460d4042f92195932a6df9d86 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 24 Jul 2023 16:23:34 -0400 Subject: [PATCH 012/249] Clean up --- src/editortoolkit_neume.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index ee3d1f303f0..15a2616f740 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2950,7 +2950,6 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector Nc *nc = dynamic_cast(el); assert(nc); if (nc->HasLigated() && nc->GetLigated() == BOOLEAN_true) { - // ligNum++; firstIsLig = true; } @@ -3003,7 +3002,6 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector if (groupType == "nc") { Nc *nc = dynamic_cast(el); assert(nc); - // if (nc->HasLigated()) continue; if (firstIsLig) { // if 1st is ligature, neglect 2nd, go to the next nc From d69ae9e353a3de2bdeeab075fa21ea4e89a3a452 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 25 Jul 2023 11:30:52 -0400 Subject: [PATCH 013/249] Remove x-axis adjustment --- src/editortoolkit_neume.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 15a2616f740..43f34d7f7fd 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -1660,9 +1660,9 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) Syl *syl; Zone *zone; int itUlx; - int itLrx; + // int itLrx; int offsetY; - int rightMost = -1; + // int rightMost = -1; double theta = staffParent->GetFacsimileInterface()->GetZone()->GetRotate(); for (auto it = syls.begin(); it != syls.end(); ++it) { @@ -1670,17 +1670,18 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) zone = syl->GetFacsimileInterface()->GetZone(); assert(zone); - // adjust x-axis first - itUlx = zone->GetUlx(); - itLrx = zone->GetLrx(); - if (itLrx > rightMost) { - // correct overlap - if (itUlx < rightMost) zone->SetUlx(rightMost); - // Update right most point if needed - rightMost = itLrx; - } + // // adjust x-axis first + // itUlx = zone->GetUlx(); + // itLrx = zone->GetLrx(); + // if (itLrx > rightMost) { + // // correct overlap + // if (itUlx < rightMost) zone->SetUlx(rightMost); + // // Update right most point if needed + // rightMost = itLrx; + // } offsetY = 0; + itUlx = zone->GetUlx(); if (theta) { double factor = 1.3; offsetY = (int)((itUlx - ulx) * tan(theta * M_PI / 180.0) / factor); From 7c1dc57786a5ef333fc1d95ad5435ad5ec15a821 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Thu, 27 Jul 2023 16:57:47 -0400 Subject: [PATCH 014/249] Fix ungroup when firstIsSyl --- src/editortoolkit_neume.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 43f34d7f7fd..037591d462e 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2944,6 +2944,10 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector // we'll still need to initialize all the parents, thus the bool if (el->Is(SYL)) { firstIsSyl = true; + oldSylZone = dynamic_cast(el->GetFacsimileInterface()->GetZone()); + if (oldSylZone) { + oldSylZone->SetLrx(oldSylZone->GetUlx() + 100); + } continue; } else if (groupType == "nc") { @@ -2980,7 +2984,9 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector } // Get orginal syl zone - oldSylZone = dynamic_cast(currentParent->GetFirst(SYL)->GetFacsimileInterface()->GetZone()); + if (!oldSylZone) { + oldSylZone = dynamic_cast(currentParent->GetFirst(SYL)->GetFacsimileInterface()->GetZone()); + } } else { From 4d66a78924e87caecb14c670b2a066d0a9646bb1 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Fri, 28 Jul 2023 17:17:43 -0400 Subject: [PATCH 015/249] Remove redundant new syl for insert action --- src/editortoolkit_neume.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 037591d462e..72745a2a16d 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -874,8 +874,6 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in if (m_doc->GetType() == Facs) { FacsimileInterface *fi = vrv_cast(syl->GetFacsimileInterface()); assert(fi); - Text *text = new Text(); - syl->AddChild(text); Zone *sylZone = new Zone(); // calculate bboxUlx and bboxUly wrt rotation using sine rule From 6769c821af488b36f30cbb6d8aca28bdc0bb7496 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Sun, 30 Jul 2023 16:46:13 -0400 Subject: [PATCH 016/249] Remove unnecessary doubleParent check --- src/editortoolkit_neume.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 72745a2a16d..20f2af437d0 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2648,16 +2648,14 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e // also in this case we need to make sure that the facsimile of the resulting syl is correct else { if (elementClass == NC) { - if (doubleParent) { - parent = new Neume(); - for (auto it = elements.begin(); it != elements.end(); ++it) { - if ((*it)->GetParent() != parent && !(*it)->Is(SYL)) { - (*it)->MoveItselfTo(parent); - parent->ReorderByXPos(); - } + parent = new Neume(); + for (auto it = elements.begin(); it != elements.end(); ++it) { + if ((*it)->GetParent() != parent && !(*it)->Is(SYL)) { + (*it)->MoveItselfTo(parent); + parent->ReorderByXPos(); } - doubleParent->AddChild(parent); } + doubleParent->AddChild(parent); Layer *layer = dynamic_cast(parent->GetFirstAncestor(LAYER)); if (!layer) { From 599b28aae381503936d820183dc9039e9c41517d Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Sun, 30 Jul 2023 16:50:29 -0400 Subject: [PATCH 017/249] Rename doubleParent to secondParent --- src/editortoolkit_neume.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 20f2af437d0..9573a407a8c 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2314,7 +2314,7 @@ bool EditorToolkitNeume::Resize(std::string elementId, int ulx, int uly, int lrx bool EditorToolkitNeume::Group(std::string groupType, std::vector elementIds) { - Object *parent = NULL, *doubleParent = NULL; + Object *parent = NULL, *secondParent = NULL; std::map parents; std::set elements; std::vector sortedElements; @@ -2441,9 +2441,9 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } - if (doubleParent == NULL) { - doubleParent = par->GetParent(); - if (doubleParent == NULL) { + if (secondParent == NULL) { + secondParent = par->GetParent(); + if (secondParent == NULL) { LogError("No second level parent!"); m_infoObject.import("status", "FAILURE"); m_infoObject.import("message", "No second level parent."); @@ -2451,7 +2451,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } else { - if (par->GetParent() != doubleParent) { + if (par->GetParent() != secondParent) { LogError("No shared second level parent!"); m_infoObject.import("status", "FAILURE"); m_infoObject.import("message", "No shared second level parent."); @@ -2620,10 +2620,10 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } parent->ReorderByXPos(); - if (doubleParent == NULL) { + if (secondParent == NULL) { return false; } - doubleParent->AddChild(parent); + secondParent->AddChild(parent); Layer *layer = vrv_cast(parent->GetFirstAncestor(LAYER)); assert(layer); @@ -2655,7 +2655,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e parent->ReorderByXPos(); } } - doubleParent->AddChild(parent); + secondParent->AddChild(parent); Layer *layer = dynamic_cast(parent->GetFirstAncestor(LAYER)); if (!layer) { @@ -2733,11 +2733,11 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } - if (doubleParent == NULL) { + if (secondParent == NULL) { LogError("No second level parent!"); return false; } - doubleParent->AddChild(fullSyllable); + secondParent->AddChild(fullSyllable); Layer *layer = vrv_cast(fullSyllable->GetFirstAncestor(LAYER)); assert(layer); if (ulx >= 0 && uly >= 0 && lrx >= 0 && lry >= 0) { @@ -2779,11 +2779,11 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e Object *obj = (*it).first; obj->ClearRelinquishedChildren(); if (obj->GetChildCount() == 0) { - if (doubleParent == NULL) { + if (secondParent == NULL) { LogError("No second level parent!"); return false; } - doubleParent->DeleteChild(obj); + secondParent->DeleteChild(obj); } else if (obj->GetChildCount() == (obj->GetChildCount(SYL) + obj->GetChildCount(DIVLINE) + obj->GetChildCount(ACCID) @@ -2807,11 +2807,11 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e parent->ReorderByXPos(); obj->ClearRelinquishedChildren(); } - if (doubleParent == NULL) { + if (secondParent == NULL) { LogError("No second level parent!"); return false; } - doubleParent->DeleteChild(obj); + secondParent->DeleteChild(obj); } } From cf6e7e8c6d049936c22c0e50e3ebf6d4144e0f99 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Sun, 30 Jul 2023 16:57:04 -0400 Subject: [PATCH 018/249] Optimize parents counting --- src/editortoolkit_neume.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 9573a407a8c..108465c45c5 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2458,13 +2458,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e return false; } } - auto possibleEntry = parents.find(el->GetParent()); - if (possibleEntry == parents.end()) { - parents.emplace(el->GetParent(), 1); - } - else { - possibleEntry->second += 1; - } + parents[par]++; elements.insert(el); } From 1ce2b26d1aea740e6183c2bc2fd871a42c119524 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Sun, 30 Jul 2023 16:59:10 -0400 Subject: [PATCH 019/249] Clean up --- src/editortoolkit_neume.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 108465c45c5..6686c8d4b77 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2475,16 +2475,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e return false; } - // auto it = elementIds.begin(); - // Object *el = m_doc->GetDrawingPage()->FindDescendantByID(*it); - // Layer *layer = dynamic_cast(el->GetFirstAncestor(LAYER)); - // if (!layer) { - // LogError("Elements does not have Layer parent. This should not happen."); - // m_infoObject.import("status", "FAILURE"); - // m_infoObject.import("message", "Elements does not have Layer parent."); - // return false; - // } - std::copy(elements.begin(), elements.end(), std::back_inserter(sortedElements)); std::stable_sort(sortedElements.begin(), sortedElements.end(), Object::sortByUlx); From d1070c804b7f90f723a56f37dfec9f0f87e76ce0 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Sun, 30 Jul 2023 17:18:21 -0400 Subject: [PATCH 020/249] Remove unnecessary conversion --- src/editortoolkit_neume.cpp | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 6686c8d4b77..1498e8b6b38 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2316,8 +2316,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e { Object *parent = NULL, *secondParent = NULL; std::map parents; - std::set elements; - std::vector sortedElements; + ListOfObjects elements; std::vector fullParents; std::map clefsBefore; @@ -2459,7 +2458,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } parents[par]++; - elements.insert(el); + elements.push_back(el); } if (parents.size() == 0) { @@ -2475,34 +2474,29 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e return false; } - std::copy(elements.begin(), elements.end(), std::back_inserter(sortedElements)); - std::stable_sort(sortedElements.begin(), sortedElements.end(), Object::sortByUlx); - ListOfObjects clefs; - std::set syllables; - ListOfObjects sortedSyllables; + ListOfObjects syllables; ClassIdComparison clefComp(CLEF); InterfaceComparison pitchComp(INTERFACE_PITCH); Clef *newClef = NULL; - m_doc->GetDrawingPage()->FindAllDescendantsBetween(&clefs, &clefComp, - sortedElements.front()->GetFirstAncestor(SYLLABLE), sortedElements.back()->GetFirstAncestor(SYLLABLE)); + m_doc->GetDrawingPage()->FindAllDescendantsBetween( + &clefs, &clefComp, elements.front()->GetFirstAncestor(SYLLABLE), elements.back()->GetFirstAncestor(SYLLABLE)); // if there are clefs between the elements getting grouped // some elements will need their pitch adjusted for the new clef // clefsBefore maps the syllable parent to its clef before the group // so we can reassociate any pitched children from their old clef to the new one if (clefs.size() != 0) { - for (auto it = sortedElements.begin(); it != sortedElements.end(); ++it) { + for (auto it = elements.begin(); it != elements.end(); ++it) { if ((*it)->Is(SYLLABLE)) { - syllables.insert(dynamic_cast(*it)); + syllables.push_back(dynamic_cast(*it)); } else { - syllables.insert((*it)->GetFirstAncestor(SYLLABLE)); + syllables.push_back((*it)->GetFirstAncestor(SYLLABLE)); } } - std::copy(syllables.begin(), syllables.end(), std::back_inserter(sortedSyllables)); - for (auto it = sortedSyllables.begin(); it != sortedSyllables.end(); ++it) { + for (auto it = syllables.begin(); it != syllables.end(); ++it) { Clef *tempClef = dynamic_cast(m_doc->GetDrawingPage()->FindPreviousChild(&clefComp, (*it))); if (tempClef == NULL) { Layer *layer = vrv_cast((*it)->GetFirstAncestor(LAYER)); @@ -2510,7 +2504,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } clefsBefore.insert(std::pair(dynamic_cast(*it), tempClef)); } - newClef = clefsBefore[dynamic_cast(sortedSyllables.front())]; + newClef = clefsBefore[dynamic_cast(syllables.front())]; } // find parents where all of their children are being grouped @@ -2746,8 +2740,8 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e // change the pitch of any pitched elements whose clef may have changed assert(newClef); ListOfObjects pitchedChildren; - if (sortedSyllables.size()) { - for (auto it = sortedSyllables.begin(); it != sortedSyllables.end(); ++it) { + if (syllables.size()) { + for (auto it = syllables.begin(); it != syllables.end(); ++it) { Syllable *syllable = dynamic_cast(*it); if (clefsBefore[syllable] != newClef) { syllable->FindAllDescendantsByComparison(&pitchedChildren, &pitchComp); From 0e81f754152aa8ea79718c765a0b16e2fb5b21c1 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 31 Jul 2023 11:28:45 -0400 Subject: [PATCH 021/249] Move second level parent check --- src/editortoolkit_neume.cpp | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 1498e8b6b38..a15438f63e0 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2440,23 +2440,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } - if (secondParent == NULL) { - secondParent = par->GetParent(); - if (secondParent == NULL) { - LogError("No second level parent!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No second level parent."); - return false; - } - } - else { - if (par->GetParent() != secondParent) { - LogError("No shared second level parent!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No shared second level parent."); - return false; - } - } parents[par]++; elements.push_back(el); } @@ -2507,11 +2490,25 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e newClef = clefsBefore[dynamic_cast(syllables.front())]; } + // check if share second level parent + secondParent = (*parents.begin()).first->GetParent(); + if (secondParent == NULL) { + LogError("No second level parent!"); + m_infoObject.import("status", "FAILURE"); + m_infoObject.import("message", "No second level parent."); + return false; + } // find parents where all of their children are being grouped for (auto it = parents.begin(); it != parents.end(); ++it) { auto parentPair = *it; Object *par = parentPair.first; int expected; + if (par->GetParent() != secondParent) { + LogError("No shared second level parent!"); + m_infoObject.import("status", "FAILURE"); + m_infoObject.import("message", "No shared second level parent."); + return false; + } if (par->GetClassId() == SYLLABLE) { expected = par->GetChildCount(NEUME); } From 3b2c0daf1a6b7b1961e3a1c1e54020c23cbd2e0f Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 31 Jul 2023 11:29:17 -0400 Subject: [PATCH 022/249] Clean up --- src/editortoolkit_neume.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index a15438f63e0..5ccba2b6447 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2588,9 +2588,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e FacsimileInterface *fi = vrv_cast((*syl).GetFacsimileInterface()); assert(fi); fi->AttachZone(zone); - - // syl->ResetFacsimile(); - // syl->SetFacs(zone->GetID()); } } From 4a1e0ea71499d6e12c4067f1ce6a17a602684683 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 31 Jul 2023 11:30:22 -0400 Subject: [PATCH 023/249] Remove unnecessary second level parent check --- src/editortoolkit_neume.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 5ccba2b6447..e484b8fbd5b 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2592,9 +2592,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } parent->ReorderByXPos(); - if (secondParent == NULL) { - return false; - } secondParent->AddChild(parent); Layer *layer = vrv_cast(parent->GetFirstAncestor(LAYER)); From 5f8dfc243837d2d541afc3c41b2502c5dce0f918 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 31 Jul 2023 13:14:45 -0400 Subject: [PATCH 024/249] Simplify syl zone calculation --- src/editortoolkit_neume.cpp | 57 +++++++++++++------------------------ 1 file changed, 19 insertions(+), 38 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index e484b8fbd5b..595b02139e6 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2519,6 +2519,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e fullParents.push_back(parentPair.first); } } + // if there are no full parents we need to make a new one to attach everything to if (fullParents.empty()) { if (elementClass == NC) { @@ -2526,10 +2527,18 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } else if (elementClass == NEUME) { parent = new Syllable(); + int lry; + int uly; for (auto it = elements.begin(); it != elements.end(); ++it) { - if ((*it)->GetParent() != parent && !(*it)->Is(SYL)) { - (*it)->MoveItselfTo(parent); + if ((*it)->GetParent() != parent) { + if (!(*it)->Is(SYL)) { + (*it)->MoveItselfTo(parent); + } + else { + lry = (*it)->GetFacsimileInterface()->GetZone()->GetLry(); + uly = (*it)->GetFacsimileInterface()->GetZone()->GetUly(); + } } } @@ -2545,43 +2554,15 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e if (m_doc->GetType() == Facs) { Zone *zone = new Zone(); - // if it's syllable parent has position values just use those - FacsimileInterface *syllableFi = NULL; - if (syl->GetFirstAncestor(SYLLABLE)->GetFacsimileInterface()->HasFacs()) { - syllableFi = syl->GetFirstAncestor(SYLLABLE)->GetFacsimileInterface(); - Zone *tempZone = dynamic_cast(syllableFi->GetZone()); - zone->SetUlx(tempZone->GetUlx()); - zone->SetUly(tempZone->GetUly()); - zone->SetLrx(tempZone->GetLrx()); - zone->SetLry(tempZone->GetLry()); - } - // otherwise get a boundingbox that comprises all the neumes in the syllable - else { - ListOfObjects children; - InterfaceComparison comp(INTERFACE_FACSIMILE); - syl->GetFirstAncestor(SYLLABLE)->FindAllDescendantsByComparison(&children, &comp); - for (auto iter2 = children.begin(); iter2 != children.end(); ++iter2) { - FacsimileInterface *temp = (*iter2)->GetFacsimileInterface(); - assert(temp); - Zone *tempZone = vrv_cast(temp->GetZone()); - assert(tempZone); - if (temp->HasFacs()) { - zone->SetUlx(tempZone->GetUlx()); - zone->SetUly(tempZone->GetUly()); - zone->SetLrx(tempZone->GetLrx()); - zone->SetLry(tempZone->GetLry()); - } - } - } - - // make the bounding box a little bigger and lower so it's easier to edit - const int offSetUly = 100; - const int offSetLrx = 100; - const int offSetLry = 200; + zone->SetUlx(parent->GetFirst(NC)->GetFacsimileInterface()->GetZone()->GetUlx()); + zone->SetUly(uly); + zone->SetLrx(parent->GetLast(NC)->GetFacsimileInterface()->GetZone()->GetLrx()); + zone->SetLry(lry); - zone->SetUly(zone->GetUly() + offSetUly); - zone->SetLrx(zone->GetLrx() + offSetLrx); - zone->SetLry(zone->GetLry() + offSetLry); + // Make bbox larger if it has less than 2 ncs + if (parent->GetChildCount(NC, 2) <= 2) { + zone->SetLrx(zone->GetLrx() + 50); + } assert(m_doc->GetFacsimile()); m_doc->GetFacsimile()->FindDescendantByType(SURFACE)->AddChild(zone); From 83a727666a20ae11c2342556de7e5bf356b266ea Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 31 Jul 2023 13:30:20 -0400 Subject: [PATCH 025/249] Optimize reordering --- src/editortoolkit_neume.cpp | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 595b02139e6..cb920b9db20 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2572,12 +2572,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } - parent->ReorderByXPos(); secondParent->AddChild(parent); - - Layer *layer = vrv_cast(parent->GetFirstAncestor(LAYER)); - assert(layer); - layer->ReorderByXPos(); } // if there's only one full parent we just add the other elements to it @@ -2590,7 +2585,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e (*it)->MoveItselfTo(parent); } } - parent->ReorderByXPos(); } // if there is more than 1 full parent we need to concat syl's @@ -2602,20 +2596,9 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e for (auto it = elements.begin(); it != elements.end(); ++it) { if ((*it)->GetParent() != parent && !(*it)->Is(SYL)) { (*it)->MoveItselfTo(parent); - parent->ReorderByXPos(); } } secondParent->AddChild(parent); - - Layer *layer = dynamic_cast(parent->GetFirstAncestor(LAYER)); - if (!layer) { - LogError("Elements does not have Layer parent. This should not happen."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Elements does not have Layer parent."); - return false; - } - - layer->ReorderByXPos(); } else { std::sort(fullParents.begin(), fullParents.end(), Object::sortByUlx); @@ -2688,8 +2671,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e return false; } secondParent->AddChild(fullSyllable); - Layer *layer = vrv_cast(fullSyllable->GetFirstAncestor(LAYER)); - assert(layer); if (ulx >= 0 && uly >= 0 && lrx >= 0 && lry >= 0) { FacsimileInterface *facsInter = vrv_cast(fullSyl->GetFacsimileInterface()); assert(facsInter); @@ -2704,7 +2685,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e assert(lry >= 0); zone->SetLry(lry); } - layer->ReorderByXPos(); parent = fullSyllable; } } @@ -2765,6 +2745,10 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } + Layer *layer = dynamic_cast(parent->GetFirstAncestor(LAYER)); + assert(layer); + layer->ReorderByXPos(); + m_infoObject.import("uuid", parent->GetID()); m_infoObject.import("status", status); m_infoObject.import("message", message); From ecc5cbb9e0d5cbc9562f5111aa5133200fc19d2a Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 31 Jul 2023 15:48:36 -0400 Subject: [PATCH 026/249] Rename fullSyllable to parent --- src/editortoolkit_neume.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index cb920b9db20..c82401bc2c0 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2602,7 +2602,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } else { std::sort(fullParents.begin(), fullParents.end(), Object::sortByUlx); - Syllable *fullSyllable = new Syllable(); + Syllable *parent = new Syllable(); Syl *fullSyl = NULL; // construct concatenated string of all the syls @@ -2656,13 +2656,13 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e Text *text = vrv_cast(fullSyl->FindDescendantByType(TEXT)); assert(text); text->SetText(fullString); - assert(fullSyllable); - fullSyllable->AddChild(fullSyl); + assert(parent); + parent->AddChild(fullSyl); // Move elements to the new group syllable for (auto it = elements.begin(); it != elements.end(); ++it) { - if ((*it)->GetParent() != fullSyllable && !(*it)->Is(SYL)) { - (*it)->MoveItselfTo(fullSyllable); + if ((*it)->GetParent() != parent && !(*it)->Is(SYL)) { + (*it)->MoveItselfTo(parent); } } @@ -2670,7 +2670,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e LogError("No second level parent!"); return false; } - secondParent->AddChild(fullSyllable); + secondParent->AddChild(parent); if (ulx >= 0 && uly >= 0 && lrx >= 0 && lry >= 0) { FacsimileInterface *facsInter = vrv_cast(fullSyl->GetFacsimileInterface()); assert(facsInter); @@ -2685,7 +2685,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e assert(lry >= 0); zone->SetLry(lry); } - parent = fullSyllable; } } From 8fe8581088aedf6fda37f3cffbd99a5820a297f5 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 1 Aug 2023 16:15:37 -0400 Subject: [PATCH 027/249] Refactor multiple full parents --- src/editortoolkit_neume.cpp | 79 +++++++++++-------------------------- 1 file changed, 22 insertions(+), 57 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index c82401bc2c0..04d47a875c9 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2601,17 +2601,23 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e secondParent->AddChild(parent); } else { - std::sort(fullParents.begin(), fullParents.end(), Object::sortByUlx); Syllable *parent = new Syllable(); Syl *fullSyl = NULL; + int ulx, uly, lrx, lry; // construct concatenated string of all the syls std::u32string fullString = U""; for (auto it = fullParents.begin(); it != fullParents.end(); ++it) { Syl *syl = dynamic_cast((*it)->FindDescendantByType(SYL)); - if (syl != NULL) { + if (syl != NULL && m_doc->GetType() == Facs) { + Zone *zone = dynamic_cast(syl->GetFacsimileInterface()->GetZone()); + if (fullSyl == NULL) { fullSyl = syl; + ulx = zone->GetUlx(); + uly = zone->GetUly(); + lrx = zone->GetLrx(); + lry = zone->GetLry(); } Text *text = dynamic_cast(syl->FindDescendantByType(TEXT)); @@ -2619,46 +2625,13 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e std::u32string currentString = text->GetText(); fullString = fullString + currentString; } + + ulx = zone->GetUlx() < ulx ? zone->GetUlx() : ulx; + uly = zone->GetUly() < uly ? zone->GetUly() : uly; + lrx = zone->GetLrx() > lrx ? zone->GetLrx() : lrx; + lry = zone->GetLry() > lry ? zone->GetLry() : lry; } } - // find the new boundingbox comprising all of the text - int ulx = -1, uly = -1, lrx = -1, lry = -1; - for (auto it = fullParents.begin(); it != fullParents.end(); ++it) { - Object *par = vrv_cast(*it); - assert(par); - Syl *descSyl = vrv_cast(par->FindDescendantByType(SYL)); - assert(descSyl); - // FacsimileInterface *facsInter = dynamic_cast - // ((*it)->FindDescendantByType(SYL)->GetFacsimileInterface()); - if (descSyl != NULL) { - FacsimileInterface *facsInter - = dynamic_cast(descSyl->GetFacsimileInterface()); - - if (facsInter != NULL) { - if (ulx == -1 || ulx > facsInter->GetDrawingX()) { - ulx = facsInter->GetDrawingX(); - } - - if (lrx < facsInter->GetWidth() + facsInter->GetDrawingX()) { - lrx = facsInter->GetWidth() + facsInter->GetDrawingX(); - } - - if (uly == -1 || uly > facsInter->GetDrawingY()) { - uly = facsInter->GetDrawingY(); - } - if (lry < facsInter->GetHeight() + facsInter->GetDrawingY()) { - lry = facsInter->GetHeight() + facsInter->GetDrawingY(); - } - } - } - } - assert(fullSyl); - Text *text = vrv_cast(fullSyl->FindDescendantByType(TEXT)); - assert(text); - text->SetText(fullString); - assert(parent); - parent->AddChild(fullSyl); - // Move elements to the new group syllable for (auto it = elements.begin(); it != elements.end(); ++it) { if ((*it)->GetParent() != parent && !(*it)->Is(SYL)) { @@ -2666,25 +2639,19 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } - if (secondParent == NULL) { - LogError("No second level parent!"); - return false; - } - secondParent->AddChild(parent); - if (ulx >= 0 && uly >= 0 && lrx >= 0 && lry >= 0) { - FacsimileInterface *facsInter = vrv_cast(fullSyl->GetFacsimileInterface()); - assert(facsInter); - Zone *zone = vrv_cast(facsInter->GetZone()); - assert(zone); - assert(ulx >= 0); + Text *fullText = dynamic_cast(fullSyl->FindDescendantByType(TEXT)); + fullText->SetText(fullString); + parent->AddChild(fullSyl); + + if (m_doc->GetType() == Facs) { + Zone *zone = dynamic_cast(fullSyl->GetFacsimileInterface()->GetZone()); zone->SetUlx(ulx); - assert(uly >= 0); zone->SetUly(uly); - assert(lrx >= 0); zone->SetLrx(lrx); - assert(lry >= 0); zone->SetLry(lry); } + + secondParent->AddChild(parent); } } @@ -2744,9 +2711,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } - Layer *layer = dynamic_cast(parent->GetFirstAncestor(LAYER)); - assert(layer); - layer->ReorderByXPos(); + secondParent->ReorderByXPos(); m_infoObject.import("uuid", parent->GetID()); m_infoObject.import("status", status); From c631643c099d739dfa6835d20fc3dfb393cdd687 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 1 Aug 2023 18:05:45 -0400 Subject: [PATCH 028/249] Fix bbox calculation for empty full parent --- src/editortoolkit_neume.cpp | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 04d47a875c9..de6db9e906a 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2527,18 +2527,11 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } else if (elementClass == NEUME) { parent = new Syllable(); - int lry; - int uly; + Object *oldSyl = (*elements.begin())->GetFirstAncestor(SYLLABLE)->GetFirst(SYL); for (auto it = elements.begin(); it != elements.end(); ++it) { - if ((*it)->GetParent() != parent) { - if (!(*it)->Is(SYL)) { - (*it)->MoveItselfTo(parent); - } - else { - lry = (*it)->GetFacsimileInterface()->GetZone()->GetLry(); - uly = (*it)->GetFacsimileInterface()->GetZone()->GetUly(); - } + if (!(*it)->Is(SYL)) { + (*it)->MoveItselfTo(parent); } } @@ -2554,10 +2547,10 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e if (m_doc->GetType() == Facs) { Zone *zone = new Zone(); - zone->SetUlx(parent->GetFirst(NC)->GetFacsimileInterface()->GetZone()->GetUlx()); - zone->SetUly(uly); - zone->SetLrx(parent->GetLast(NC)->GetFacsimileInterface()->GetZone()->GetLrx()); - zone->SetLry(lry); + zone->SetUlx(parent->GetFirst(NEUME)->GetFirst(NC)->GetFacsimileInterface()->GetZone()->GetUlx()); + zone->SetUly(oldSyl->GetFacsimileInterface()->GetZone()->GetUly()); + zone->SetLrx(parent->GetLast(NEUME)->GetLast(NC)->GetFacsimileInterface()->GetZone()->GetLrx()); + zone->SetLry(oldSyl->GetFacsimileInterface()->GetZone()->GetLry()); // Make bbox larger if it has less than 2 ncs if (parent->GetChildCount(NC, 2) <= 2) { @@ -2566,7 +2559,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e assert(m_doc->GetFacsimile()); m_doc->GetFacsimile()->FindDescendantByType(SURFACE)->AddChild(zone); - FacsimileInterface *fi = vrv_cast((*syl).GetFacsimileInterface()); + FacsimileInterface *fi = syl->GetFacsimileInterface(); assert(fi); fi->AttachZone(zone); } From 0b6f65492b7af2135018370d45729e378c6bde19 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 1 Aug 2023 18:10:30 -0400 Subject: [PATCH 029/249] Remove unnecessary checks & reordering --- src/editortoolkit_neume.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index de6db9e906a..f137fada668 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2668,10 +2668,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e Object *obj = (*it).first; obj->ClearRelinquishedChildren(); if (obj->GetChildCount() == 0) { - if (secondParent == NULL) { - LogError("No second level parent!"); - return false; - } secondParent->DeleteChild(obj); } else if (obj->GetChildCount() @@ -2683,23 +2679,16 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } while ((leftover = obj->FindDescendantByType(DIVLINE)) != NULL) { leftover->MoveItselfTo(parent); - parent->ReorderByXPos(); obj->ClearRelinquishedChildren(); } while ((leftover = obj->FindDescendantByType(ACCID)) != NULL) { leftover->MoveItselfTo(parent); - parent->ReorderByXPos(); obj->ClearRelinquishedChildren(); } while ((leftover = obj->FindDescendantByType(CLEF)) != NULL) { leftover->MoveItselfTo(parent); - parent->ReorderByXPos(); obj->ClearRelinquishedChildren(); } - if (secondParent == NULL) { - LogError("No second level parent!"); - return false; - } secondParent->DeleteChild(obj); } } From fabe667bf59430aa2216401b60241ec3c7762d68 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 1 Aug 2023 18:14:44 -0400 Subject: [PATCH 030/249] Remove unused variable --- src/editortoolkit_neume.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index f137fada668..59fbe82b1f4 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -1637,11 +1637,9 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) int ulx; int uly; int height; - int lrx; if (dynamic_cast(element)->HasFacs()) { ulx = element->GetFacsimileInterface()->GetZone()->GetUlx(); uly = element->GetFacsimileInterface()->GetZone()->GetUly(); - lrx = element->GetFacsimileInterface()->GetZone()->GetLrx(); height = element->GetFacsimileInterface()->GetZone()->GetLry() - uly; } else { From 926131e8f0365e8eb752f3654da35d26ff41c8ba Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Wed, 2 Aug 2023 16:12:11 -0400 Subject: [PATCH 031/249] Preserve ordering of multiple ligated nc in the same neume --- src/object.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/object.cpp b/src/object.cpp index 17b6f97426c..113358a8d69 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -1298,7 +1298,10 @@ bool Object::sortByUlx(Object *a, Object *b) if (a->Is(NC) && b->Is(NC)) { Nc *nca = dynamic_cast(a); Nc *ncb = dynamic_cast(b); - if (nca->HasLigated() && ncb->HasLigated() && (a->GetParent() == b->GetParent())) { + Zone *zonea = dynamic_cast(nca->GetFacsimileInterface()->GetZone()); + Zone *zoneb = dynamic_cast(ncb->GetFacsimileInterface()->GetZone()); + if (nca->HasLigated() && ncb->HasLigated() && (a->GetParent() == b->GetParent()) + && (zonea->GetUlx() == zoneb->GetUly())) { Object *parent = a->GetParent(); assert(parent); if (abs(parent->GetChildIndex(a) - parent->GetChildIndex(b)) == 1) { From 0fa95a9b6be39ac9512a8b2e9abe5f82a741f0f1 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Thu, 3 Aug 2023 10:41:03 -0400 Subject: [PATCH 032/249] Add validity check && correction --- src/object.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/object.cpp b/src/object.cpp index 113358a8d69..63e8fa0ca2d 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -1299,9 +1299,11 @@ bool Object::sortByUlx(Object *a, Object *b) Nc *nca = dynamic_cast(a); Nc *ncb = dynamic_cast(b); Zone *zonea = dynamic_cast(nca->GetFacsimileInterface()->GetZone()); + assert(zonea); Zone *zoneb = dynamic_cast(ncb->GetFacsimileInterface()->GetZone()); + assert(zoneb); if (nca->HasLigated() && ncb->HasLigated() && (a->GetParent() == b->GetParent()) - && (zonea->GetUlx() == zoneb->GetUly())) { + && (zonea->GetUlx() == zoneb->GetUlx())) { Object *parent = a->GetParent(); assert(parent); if (abs(parent->GetChildIndex(a) - parent->GetChildIndex(b)) == 1) { From 8f93fd319911cafe2301bebc3cdfe980f8f20c75 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 14 Aug 2023 14:37:15 -0400 Subject: [PATCH 033/249] Convert m_infoObject to m_editInfo --- include/vrv/editortoolkit_neume.h | 7 +- src/editortoolkit_neume.cpp | 622 +++++++++++++++--------------- 2 files changed, 315 insertions(+), 314 deletions(-) diff --git a/include/vrv/editortoolkit_neume.h b/include/vrv/editortoolkit_neume.h index a31242d2970..108b50e5266 100644 --- a/include/vrv/editortoolkit_neume.h +++ b/include/vrv/editortoolkit_neume.h @@ -31,8 +31,8 @@ namespace vrv { class EditorToolkitNeume : public EditorToolkit { public: EditorToolkitNeume(Doc *doc, View *view) : EditorToolkit(doc, view) {} - bool ParseEditorAction(const std::string &json_editorAction); - virtual std::string EditInfo() { return m_infoObject.json(); }; + bool ParseEditorAction(const std::string &json_editorAction) override; + std::string EditInfo() override; /** * Experimental editor functions. @@ -100,9 +100,6 @@ class EditorToolkitNeume : public EditorToolkit { bool AdjustPitchFromPosition(Object *obj, Clef *clef = NULL); bool AdjustClefLineFromPosition(Clef *clef, Staff *staff = NULL); ///@} - -private: - jsonxx::Object m_infoObject; }; //-------------------------------------------------------------------------------- diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 59fbe82b1f4..38fde2bee57 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -40,25 +40,29 @@ //-------------------------------------------------------------------------------- namespace vrv { +std::string EditorToolkitNeume::EditInfo() +{ + return m_editInfo.json(); +} bool EditorToolkitNeume::ParseEditorAction(const std::string &json_editorAction) { jsonxx::Object json; - m_infoObject.reset(); + // m_editInfo.reset(); // Read JSON actions if (!json.parse(json_editorAction)) { LogError("Cannot parse JSON std::string."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Cannot parse JSON from std::string " + json_editorAction); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Cannot parse JSON from std::string " + json_editorAction); return false; } if (!json.has("action") || (!json.has("param") && !json.has("param"))) { LogWarning("Incorrectly formatted JSON action"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "JSON action misformatted."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "JSON action misformatted."); return false; } @@ -66,8 +70,8 @@ bool EditorToolkitNeume::ParseEditorAction(const std::string &json_editorAction) if (action != "chain" && json.has("param")) { LogWarning("Only 'chain' uses 'param' as an array."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "'param' can only be an array for a chain action."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "'param' can only be an array for a chain action."); return false; } @@ -238,8 +242,8 @@ bool EditorToolkitNeume::ParseEditorAction(const std::string &json_editorAction) else { LogWarning("Unknown action type '%s'.", action.c_str()); } - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Action " + action + " could not be parsed or is unknown."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Action " + action + " could not be parsed or is unknown."); return false; } @@ -251,15 +255,15 @@ bool EditorToolkitNeume::Chain(jsonxx::Array actions) for (int i = 0; i < (int)actions.size(); i++) { if (!actions.has(0)) { LogError("Action %d was not an object", i); - m_infoObject.reset(); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Action " + std::to_string(i) + " was not an object."); + m_editInfo.reset(); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Action " + std::to_string(i) + " was not an object."); return false; } status |= this->ParseEditorAction(actions.get(i).json()); - results.import(std::to_string(i), m_infoObject); + results.import(std::to_string(i), m_editInfo); } - m_infoObject = results; + m_editInfo = results; return status; } @@ -480,8 +484,8 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) std::string status = "OK", message = ""; if (!m_doc->GetDrawingPage()) { LogError("Could not get drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get drawing page."); return false; } @@ -513,8 +517,8 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) Layer *layer = dynamic_cast(element->GetFirstAncestor(LAYER)); if (!layer) { LogError("Element does not have Layer parent. This should not happen."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Element does not have Layer parent."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element does not have Layer parent."); return false; } @@ -593,8 +597,8 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) Clef *clef = dynamic_cast(element); if (!clef->HasFacs()) { LogError("Clef dragging is only supported for clefs with facsimiles!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Clef dragging is only supported for clefs with facsimiles."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Clef dragging is only supported for clefs with facsimiles."); return false; } FacsimileInterface *fi = (*clef).GetFacsimileInterface(); @@ -645,8 +649,8 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) Staff *staff = vrv_cast(element); if (!staff->HasFacs()) { LogError("Staff dragging is only supported for staves with facsimiles!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Staff dragging is only supported for staves with facsimiles."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Staff dragging is only supported for staves with facsimiles."); return false; } @@ -674,8 +678,8 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) Syl *syl = dynamic_cast(element); if (!syl->HasFacs()) { LogError("Syl (boundingbox) dragging is only supported for syls with facsimiles!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Syl dragging is only supported for syls with facsimiles."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Syl dragging is only supported for syls with facsimiles."); return false; } FacsimileInterface *fi = (*syl).GetFacsimileInterface(); @@ -688,8 +692,8 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) Accid *accid = dynamic_cast(element); if (!accid->HasFacs()) { LogError("Accid dragging is only supported for accid with facsimiles!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Accid dragging is only supported for accid with facsimiles."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Accid dragging is only supported for accid with facsimiles."); return false; } FacsimileInterface *fi = (*accid).GetFacsimileInterface(); @@ -705,8 +709,8 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) DivLine *divLine = dynamic_cast(element); if (!divLine->HasFacs()) { LogError("DivLine dragging is only supported for divLine with facsimiles!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "DivLine dragging is only supported for divLine with facsimiles."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "DivLine dragging is only supported for divLine with facsimiles."); return false; } FacsimileInterface *fi = (*divLine).GetFacsimileInterface(); @@ -720,14 +724,14 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) } else { LogWarning("Unsupported element for dragging."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Unsupported element for dragging."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Unsupported element for dragging."); return false; } Layer *layer = vrv_cast(element->GetFirstAncestor(LAYER)); layer->ReorderByXPos(); // Reflect position order of elements internally (and in the resulting output file) - m_infoObject.import("status", status); - m_infoObject.import("message", message); + m_editInfo.import("status", status); + m_editInfo.import("message", message); return true; } @@ -736,14 +740,14 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in { if (!m_doc->GetDrawingPage()) { LogError("Could not get drawing page"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get drawing page."); return false; } if (m_doc->GetType() != Facs) { LogError("Drawing page without facsimile"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Drawing page without facsimile is unsupported."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Drawing page without facsimile is unsupported."); return false; } @@ -820,9 +824,9 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in parent->InsertChild(newStaff, i); parent->Modify(); - m_infoObject.import("uuid", newStaff->GetID()); - m_infoObject.import("status", status); - m_infoObject.import("message", message); + m_editInfo.import("uuid", newStaff->GetID()); + m_editInfo.import("status", status); + m_editInfo.import("message", message); return true; } @@ -832,17 +836,17 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in parent->AddChild(newStaff); parent->Modify(); - m_infoObject.import("uuid", newStaff->GetID()); - m_infoObject.import("status", status); - m_infoObject.import("message", message); + m_editInfo.import("uuid", newStaff->GetID()); + m_editInfo.import("status", status); + m_editInfo.import("message", message); return true; } if (staff == NULL) { LogError("A staff must exist in the page to add a non-staff element."); delete zone; - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "A staff must exist in the page to add a non-staff element."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "A staff must exist in the page to add a non-staff element."); return false; } Layer *layer = vrv_cast(staff->FindDescendantByType(LAYER)); @@ -929,8 +933,8 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in delete nc; LogError("Failed to set pitch."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to set pitch."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to set pitch."); return false; } @@ -992,8 +996,8 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in LogError("Unsupported character in contour."); delete newNc; delete newZone; - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Unsupported character in contour."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Unsupported character in contour."); return false; } @@ -1018,10 +1022,10 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in } } if (elementType == "nc") { - m_infoObject.import("uuid", nc->GetID()); + m_editInfo.import("uuid", nc->GetID()); } else { - m_infoObject.import("uuid", neume->GetID()); + m_editInfo.import("uuid", neume->GetID()); } } else if (elementType == "clef") { @@ -1046,8 +1050,8 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in LogError("A clef shape must be specified."); delete clef; - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "A clef shape must be specified."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "A clef shape must be specified."); return false; } clef->SetShape(clefShape); @@ -1068,7 +1072,7 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in assert(surface); surface->AddChild(zone); layer->AddChild(clef); - m_infoObject.import("uuid", clef->GetID()); + m_editInfo.import("uuid", clef->GetID()); layer->ReorderByXPos(); // ensure pitched elements associated with this clef keep their x,y positions @@ -1119,11 +1123,11 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in if (!AdjustPitchFromPosition(custos)) { LogError("Failed to set pitch."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to set pitch."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to set pitch."); return false; } - m_infoObject.import("uuid", custos->GetID()); + m_editInfo.import("uuid", custos->GetID()); } else if (elementType == "accid") { Accid *accid = new Accid(); @@ -1144,8 +1148,8 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in LogError("A accid type must be specified."); delete accid; - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "A accid type must be specified."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "A accid type must be specified."); return false; } @@ -1170,7 +1174,7 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in zone->SetLry(uly + noteHeight); layer->ReorderByXPos(); - m_infoObject.import("uuid", accid->GetID()); + m_editInfo.import("uuid", accid->GetID()); } else if (elementType == "divLine") { DivLine *divLine = new DivLine(); @@ -1208,8 +1212,8 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in LogError("A divLine type must be specified."); delete divLine; - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "A divLine type must be specified."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "A divLine type must be specified."); return false; } @@ -1234,18 +1238,18 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in zone->SetLry(uly + noteHeight); layer->ReorderByXPos(); - m_infoObject.import("uuid", divLine->GetID()); + m_editInfo.import("uuid", divLine->GetID()); } else { delete zone; LogError("Unsupported type '%s' for insertion", elementType.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Unsupported type '" + elementType + "' for insertion."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Unsupported type '" + elementType + "' for insertion."); return false; } layer->ReorderByXPos(); - m_infoObject.import("status", status); - m_infoObject.import("message", message); + m_editInfo.import("status", status); + m_editInfo.import("message", message); return true; } @@ -1253,14 +1257,14 @@ bool EditorToolkitNeume::InsertToSyllable(std::string elementId) { if (!m_doc->GetDrawingPage()) { LogError("Could not get drawing page"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get drawing page."); return false; } if (m_doc->GetType() != Facs) { LogError("Drawing page without facsimile"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Drawing page without facsimile is unsupported."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Drawing page without facsimile is unsupported."); return false; } @@ -1271,23 +1275,23 @@ bool EditorToolkitNeume::InsertToSyllable(std::string elementId) if (element == NULL) { LogError("No element exists with ID '%s'.", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No element exists with ID" + elementId + "."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No element exists with ID" + elementId + "."); return false; } if (!(element->Is(DIVLINE) || element->Is(ACCID) || element->Is(CLEF))) { LogError("Element is of type %s, but only Divlines and Accids can be inserted into syllables.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element is of type " + element->GetClassName() + ", but only DivLines, Accids, and Clefs can be inserted into syllables."); return false; } if (!parent->Is(LAYER)) { LogError("The selected %s is not a child of layer.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "The selected " + element->GetClassName() + "is not a child of layer."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "The selected " + element->GetClassName() + "is not a child of layer."); return false; } @@ -1300,8 +1304,8 @@ bool EditorToolkitNeume::InsertToSyllable(std::string elementId) } else { LogError("Selected '%s' without facsimile", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Selected '" + element->GetClassName() + "' without facsimile is unsupported."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Selected '" + element->GetClassName() + "' without facsimile is unsupported."); return false; } @@ -1325,8 +1329,8 @@ bool EditorToolkitNeume::InsertToSyllable(std::string elementId) } else { LogError("A syllable must exist in the staff to insert a '%s' into.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import( + m_editInfo.import("status", "FAILURE"); + m_editInfo.import( "message", "A syllable must exist in the staff to insert a '" + element->GetClassName() + "' into."); return false; } @@ -1396,8 +1400,8 @@ bool EditorToolkitNeume::InsertToSyllable(std::string elementId) } } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -1405,14 +1409,14 @@ bool EditorToolkitNeume::MoveOutsideSyllable(std::string elementId) { if (!m_doc->GetDrawingPage()) { LogError("Could not get drawing page"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get drawing page."); return false; } if (m_doc->GetType() != Facs) { LogError("Drawing page without facsimile"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Drawing page without facsimile is unsupported."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Drawing page without facsimile is unsupported."); return false; } @@ -1423,23 +1427,23 @@ bool EditorToolkitNeume::MoveOutsideSyllable(std::string elementId) if (element == NULL) { LogError("No element exists with ID '%s'.", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No element exists with ID" + elementId + "."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No element exists with ID" + elementId + "."); return false; } if (!(element->Is(DIVLINE) || element->Is(ACCID) || element->Is(CLEF))) { LogError("Element is of type %s, but only Divlines, Accids, and Clefs can be moved out of syllables.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element is of type " + element->GetClassName() + ", but only DivLines and Accids can be inserted into syllables."); return false; } if (!parent->Is(SYLLABLE)) { LogError("The selected %s is not a child of syllable.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "The selected " + element->GetClassName() + "is not a child of syllable."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "The selected " + element->GetClassName() + "is not a child of syllable."); return false; } @@ -1519,8 +1523,8 @@ bool EditorToolkitNeume::MoveOutsideSyllable(std::string elementId) // INSIDE do nothing } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -1528,15 +1532,15 @@ bool EditorToolkitNeume::DisplaceClefOctave(std::string elementId, std::string d { if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } if (direction != "above" && direction != "below") { LogError("Direction can only be either \"above\" or \"below\"."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Direction can only be either \"above\" or \"below\"."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Direction can only be either \"above\" or \"below\"."); return false; } @@ -1544,8 +1548,8 @@ bool EditorToolkitNeume::DisplaceClefOctave(std::string elementId, std::string d Object *obj = page->FindDescendantByID(elementId); if (obj == NULL || !obj->Is(CLEF)) { LogError("This action can only be done on clefs!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "This action can only be done on clefs!"); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "This action can only be done on clefs!"); return false; } @@ -1560,8 +1564,8 @@ bool EditorToolkitNeume::DisplaceClefOctave(std::string elementId, std::string d if (octaveDis > 3 || octaveDis < -3) { LogError("Clefs can only be displaced 3 octaves."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Clefs can only be displaced 3 octaves."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Clefs can only be displaced 3 octaves."); return false; } @@ -1596,8 +1600,8 @@ bool EditorToolkitNeume::DisplaceClefOctave(std::string elementId, std::string d nc->SetOct(nc->GetOct() + move); }); - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -1605,14 +1609,14 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) { if (!m_doc->GetDrawingPage()) { LogError("Could not get drawing page"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get drawing page."); return false; } if (m_doc->GetType() != Facs) { LogError("Drawing page without facsimile"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Drawing page without facsimile is unsupported."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Drawing page without facsimile is unsupported."); return false; } @@ -1621,14 +1625,14 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) Object *staffParent = element->GetFirstAncestor(STAFF); if (element == NULL) { LogError("No element exists with ID '%s'.", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No element exists with ID" + elementId + "."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No element exists with ID" + elementId + "."); return false; } if (!element->Is(SYL)) { LogError("Element is of type %s, but only element can match height.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import( + m_editInfo.import("status", "FAILURE"); + m_editInfo.import( "message", "Element is of type " + element->GetClassName() + ", but only element can match height."); return false; } @@ -1644,8 +1648,8 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) } else { LogError("Selected '%s' without facsimile", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Selected '" + element->GetClassName() + "' without facsimile is unsupported."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Selected '" + element->GetClassName() + "' without facsimile is unsupported."); return false; } @@ -1687,8 +1691,8 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) zone->SetLry(uly + offsetY + height); } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -1705,15 +1709,15 @@ bool EditorToolkitNeume::Merge(std::vector elementIds) } else { LogError("Staff with ID '%s' does not exist!", it->c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Staff with ID '" + *it + "' does not exist."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Staff with ID '" + *it + "' does not exist."); return false; } } if (staves.size() < 2) { LogError("At least two staves must be provided."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "At least two staves must be provided."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "At least two staves must be provided."); return false; } @@ -1774,9 +1778,9 @@ bool EditorToolkitNeume::Merge(std::vector elementIds) fillLayer->ReorderByXPos(); - m_infoObject.import("uuid", fillStaff->GetID()); - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("uuid", fillStaff->GetID()); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); // TODO change zones for staff children @@ -1818,8 +1822,8 @@ bool EditorToolkitNeume::Set(std::string elementId, std::string attrType, std::s m_doc->PrepareData(); m_doc->GetDrawingPage()->LayOut(true); } - m_infoObject.import("status", success ? "OK" : "FAILURE"); - m_infoObject.import("message", success ? "" : "Could not set attribute '" + attrType + "' to '" + attrValue + "'."); + m_editInfo.import("status", success ? "OK" : "FAILURE"); + m_editInfo.import("message", success ? "" : "Could not set attribute '" + attrType + "' to '" + attrValue + "'."); return success; } @@ -1829,15 +1833,15 @@ bool EditorToolkitNeume::SetText(std::string elementId, const std::string &text) std::string status = "OK", message = ""; const std::u32string wtext = UTF8to32(text); if (!m_doc->GetDrawingPage()) { - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not find drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not find drawing page."); return false; } Object *element = m_doc->GetDrawingPage()->FindDescendantByID(elementId); if (element == NULL) { LogWarning("No element with ID '%s' exists", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No element with ID '" + elementId + "' exists."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No element with ID '" + elementId + "' exists."); return false; } @@ -1921,12 +1925,12 @@ bool EditorToolkitNeume::SetText(std::string elementId, const std::string &text) } else { LogError("Element type '%s' is unsupported for SetText", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Element type '" + element->GetClassName() + "' is unsupported for SetText."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element type '" + element->GetClassName() + "' is unsupported for SetText."); return false; } - m_infoObject.import("status", success ? status : "FAILURE"); - m_infoObject.import("message", success ? message : "SetText method failed."); + m_editInfo.import("status", success ? status : "FAILURE"); + m_editInfo.import("message", success ? message : "SetText method failed."); return success; } @@ -1934,8 +1938,8 @@ bool EditorToolkitNeume::SetClef(std::string elementId, std::string shape) { if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } ListOfObjects objects; @@ -1958,8 +1962,8 @@ bool EditorToolkitNeume::SetClef(std::string elementId, std::string shape) success = AttModule::SetShared(clef, "shape", shape); if (!success) { LogError("Unable to set clef shape"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Unable to set clef shape."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Unable to set clef shape."); return false; } @@ -1986,8 +1990,8 @@ bool EditorToolkitNeume::SetClef(std::string elementId, std::string shape) m_doc->PrepareData(); m_doc->GetDrawingPage()->LayOut(true); } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -1995,23 +1999,23 @@ bool EditorToolkitNeume::Split(std::string elementId, int x) { if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } Staff *staff = dynamic_cast(m_doc->GetDrawingPage()->FindDescendantByID(elementId)); // Validate parameters if (staff == NULL) { LogError("Either no element exists with ID '%s' or it is not a staff.", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Either no element exists with ID '" + elementId + "' or it is not a staff."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Either no element exists with ID '" + elementId + "' or it is not a staff."); return false; } if (staff->GetZone()->GetUlx() > x || staff->GetZone()->GetLrx() < x) { LogError("The 'x' parameter is not within the bounds of the original staff."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "The 'x' parameter is not within bounds of the original staff."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "The 'x' parameter is not within bounds of the original staff."); return false; } @@ -2025,19 +2029,19 @@ bool EditorToolkitNeume::Split(std::string elementId, int x) if (!this->Insert("staff", "auto", newUlx, newUly, newLrx, newLry, v)) { LogError("Failed to create a second staff."); - m_infoObject.reset(); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to create a second staff."); + m_editInfo.reset(); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to create a second staff."); return false; } Staff *splitStaff - = dynamic_cast(m_doc->GetDrawingPage()->FindDescendantByID(m_infoObject.get("uuid"))); + = dynamic_cast(m_doc->GetDrawingPage()->FindDescendantByID(m_editInfo.get("uuid"))); assert(splitStaff); if (splitStaff == NULL) { LogError("Split staff is null"); - m_infoObject.reset(); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Split staff is null."); + m_editInfo.reset(); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Split staff is null."); return false; } @@ -2079,9 +2083,9 @@ bool EditorToolkitNeume::Split(std::string elementId, int x) } } layer->ClearRelinquishedChildren(); - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); - m_infoObject.import("uuid", splitStaff->GetID()); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); + m_editInfo.import("uuid", splitStaff->GetID()); return true; } @@ -2089,8 +2093,8 @@ bool EditorToolkitNeume::Remove(std::string elementId) { if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } Object *obj = m_doc->GetDrawingPage()->FindDescendantByID(elementId); @@ -2102,7 +2106,7 @@ bool EditorToolkitNeume::Remove(std::string elementId) isClef = obj->Is(CLEF); Object *parent = obj->GetParent(); assert(parent); - m_infoObject.import("uuid", elementId); + m_editInfo.import("uuid", elementId); // Remove Zone for element (if any) InterfaceComparison ic(INTERFACE_FACSIMILE); ListOfObjects fiChildren; @@ -2143,9 +2147,9 @@ bool EditorToolkitNeume::Remove(std::string elementId) if (!result) { LogError("Failed to delete the desired element (%s)", elementId.c_str()); - m_infoObject.reset(); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to delete the desired element (" + elementId + ")."); + m_editInfo.reset(); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to delete the desired element (" + elementId + ")."); return false; } @@ -2163,9 +2167,9 @@ bool EditorToolkitNeume::Remove(std::string elementId) if (!result) { LogError("Failed to delete the desired element (%s)", elementId.c_str()); - m_infoObject.reset(); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to delete the desired element (" + elementId + ")."); + m_editInfo.reset(); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to delete the desired element (" + elementId + ")."); return false; } // Check if this leaves any containers empty and delete them @@ -2179,9 +2183,9 @@ bool EditorToolkitNeume::Remove(std::string elementId) result &= parent->DeleteChild(obj); if (!result) { LogError("Failed to delete empty neume (%s)", neumeId.c_str()); - m_infoObject.reset(); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to delete empty neume (" + neumeId + ")."); + m_editInfo.reset(); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to delete empty neume (" + neumeId + ")."); return false; } } @@ -2209,16 +2213,16 @@ bool EditorToolkitNeume::Remove(std::string elementId) result &= parent->DeleteChild(obj); if (!result) { LogError("Failed to delete empty syllable (%s)", syllableId.c_str()); - m_infoObject.reset(); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to delete empty syllable (" + syllableId + ")."); + m_editInfo.reset(); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to delete empty syllable (" + syllableId + ")."); return false; } } } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -2226,22 +2230,22 @@ bool EditorToolkitNeume::Resize(std::string elementId, int ulx, int uly, int lrx { if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } if (m_doc->GetType() != Facs) { LogWarning("Resizing is only available in facsimile mode."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Resizing is only available in facsimile mode."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Resizing is only available in facsimile mode."); return false; } Object *obj = m_doc->GetDrawingPage()->FindDescendantByID(elementId); if (obj == NULL) { LogError("Object with ID '%s' not found.", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Object with ID '" + elementId + "' could not be found."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Object with ID '" + elementId + "' could not be found."); return false; } if (obj->Is(STAFF)) { @@ -2249,8 +2253,8 @@ bool EditorToolkitNeume::Resize(std::string elementId, int ulx, int uly, int lrx assert(staff); if (!staff->HasFacs()) { LogError("This staff does not have a facsimile."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "This staff does not have a facsimile."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "This staff does not have a facsimile."); return false; } Zone *zone = staff->GetZone(); @@ -2270,8 +2274,8 @@ bool EditorToolkitNeume::Resize(std::string elementId, int ulx, int uly, int lrx assert(syl); if (!syl->HasFacs()) { LogError("This syl (bounding box) does not have a facsimile"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "This syl does not have a facsimile."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "This syl does not have a facsimile."); return false; } Zone *zone = syl->GetZone(); @@ -2301,12 +2305,12 @@ bool EditorToolkitNeume::Resize(std::string elementId, int ulx, int uly, int lrx } else { LogError("Element of type '%s' is unsupported.", obj->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Element of type '" + obj->GetClassName() + "' is unsupported."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element of type '" + obj->GetClassName() + "' is unsupported."); return false; } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -2323,16 +2327,16 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e // Get the current drawing page if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } if (elementIds.size() == 0) { LogWarning("No element IDs to group!"); status = "WARNING"; message = "No element IDs to group!"; - m_infoObject.import("status", status); - m_infoObject.import("message", message); + m_editInfo.import("status", status); + m_editInfo.import("message", message); return true; } ClassId elementClass; @@ -2344,8 +2348,8 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } else { LogError("Invalid groupType: %s", groupType.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Invalid groupType: " + groupType); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Invalid groupType: " + groupType); return false; } @@ -2355,15 +2359,15 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e Object *el = m_doc->GetDrawingPage()->FindDescendantByID(*it); if (el == NULL) { LogError("Could not get element with ID %s", it->c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get element with ID " + *it); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get element with ID " + *it); return false; } if (el->GetClassId() != elementClass) { LogError("Element %s was of class %s. Expected class %s", el->GetID().c_str(), el->GetClassName().c_str(), groupType.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element " + el->GetID() + " was of class " + el->GetClassName() + " but expected class " + groupType + "."); return false; @@ -2373,8 +2377,8 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e Object *par = el->GetParent(); if (par == NULL) { LogError("Parent of %s is null!", el->GetID().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Parent of " + el->GetID() + " is null."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Parent of " + el->GetID() + " is null."); return false; } @@ -2402,20 +2406,20 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e std::vector elementIds0 = { elementIds.begin(), elementIds.begin() + idx }; Group("neume", elementIds0); - if (m_infoObject.get("status") == "FAILURE") { + if (m_editInfo.get("status") == "FAILURE") { resultId0 = linkedID; } else { - resultId0 = m_infoObject.get("uuid"); + resultId0 = m_editInfo.get("uuid"); } std::vector elementIds1 = { elementIds.begin() + idx, elementIds.end() }; Group("neume", elementIds1); - if (m_infoObject.get("status") == "FAILURE") { + if (m_editInfo.get("status") == "FAILURE") { resultId1 = par->GetID(); } else { - resultId1 = m_infoObject.get("uuid"); + resultId1 = m_editInfo.get("uuid"); par = m_doc->GetDrawingPage()->FindDescendantByID(resultId1); } @@ -2431,9 +2435,9 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e uuidArray << resultId0; uuidArray << resultId1; - m_infoObject.import("uuid", uuidArray); - m_infoObject.import("status", status); - m_infoObject.import("message", message); + m_editInfo.import("uuid", uuidArray); + m_editInfo.import("status", status); + m_editInfo.import("message", message); return true; } } @@ -2444,14 +2448,14 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e if (parents.size() == 0) { LogError("Could not get the parent."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the parent."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the parent."); return false; } else if (parents.size() == 1) { LogError("The selected elements are already grouped."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "The selected elements are already grouped."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "The selected elements are already grouped."); return false; } @@ -2492,8 +2496,8 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e secondParent = (*parents.begin()).first->GetParent(); if (secondParent == NULL) { LogError("No second level parent!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No second level parent."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No second level parent."); return false; } // find parents where all of their children are being grouped @@ -2503,8 +2507,8 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e int expected; if (par->GetParent() != secondParent) { LogError("No shared second level parent!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No shared second level parent."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No shared second level parent."); return false; } if (par->GetClassId() == SYLLABLE) { @@ -2693,9 +2697,9 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e secondParent->ReorderByXPos(); - m_infoObject.import("uuid", parent->GetID()); - m_infoObject.import("status", status); - m_infoObject.import("message", message); + m_editInfo.import("uuid", parent->GetID()); + m_editInfo.import("status", status); + m_editInfo.import("message", message); return true; } @@ -2730,8 +2734,8 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector // Check if you can get drawing page if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } @@ -2793,8 +2797,8 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector } else { LogError("Unable to toggle ligature within ungroup ncs!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Unable to toggle ligature within ungroup ncs."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Unable to toggle ligature within ungroup ncs."); return false; } } @@ -2865,8 +2869,8 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector else { LogError("Invalid groupType for ungrouping"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Invalid groupType for ungrouping."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Invalid groupType for ungrouping."); return false; } } @@ -2968,9 +2972,9 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector } } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); - m_infoObject.import("uuid", uuidArray); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); + m_editInfo.import("uuid", uuidArray); return true; } @@ -2979,8 +2983,8 @@ bool EditorToolkitNeume::SplitNeume(std::string neumeId, std::string ncId) // Check if you can get drawing page if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } @@ -3002,8 +3006,8 @@ bool EditorToolkitNeume::SplitNeume(std::string neumeId, std::string ncId) int nLen = fparent->GetChildCount(); if (nLen == 0) { LogError("The selected neume has no children."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "The selected neume has no children."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "The selected neume has no children."); return false; } @@ -3011,8 +3015,8 @@ bool EditorToolkitNeume::SplitNeume(std::string neumeId, std::string ncId) int fIdx = fparent->GetChildIndex(elNc); if (fIdx == -1) { LogError("The selected neume component is not a child of the selected neume."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "The selected neume component is not a child of the selected neume."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "The selected neume component is not a child of the selected neume."); return false; } // if click on a ligature, ncId point to the second nc in the ligature, thus minus 1 @@ -3046,9 +3050,9 @@ bool EditorToolkitNeume::SplitNeume(std::string neumeId, std::string ncId) // insert newParent to sparent sparent->InsertAfter(fparent, newParent); - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); - m_infoObject.import("uuid", uuidArray); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); + m_editInfo.import("uuid", uuidArray); return true; } @@ -3057,15 +3061,15 @@ bool EditorToolkitNeume::ChangeGroup(std::string elementId, std::string contour) // Check if you can get drawing page if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } Neume *el = dynamic_cast(m_doc->GetDrawingPage()->FindDescendantByID(elementId)); if (el == NULL) { LogError("Unable to find neume with id %s", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Unable to find neume with id " + elementId + "."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Unable to find neume with id " + elementId + "."); return false; } Nc *firstChild = NULL; @@ -3129,8 +3133,8 @@ bool EditorToolkitNeume::ChangeGroup(std::string elementId, std::string contour) LogError("Unsupported character in contour."); delete newNc; delete zone; - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Unsupported character in contour."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Unsupported character in contour."); return false; } zone->SetUlx(newUlx); @@ -3153,9 +3157,9 @@ bool EditorToolkitNeume::ChangeGroup(std::string elementId, std::string contour) initialLry = newLry; prevNc = newNc; } - m_infoObject.import("uuid", el->GetID()); - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("uuid", el->GetID()); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -3173,8 +3177,8 @@ bool EditorToolkitNeume::ToggleLigature(std::vector elementIds) // Check if you can get drawing page if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } @@ -3188,8 +3192,8 @@ bool EditorToolkitNeume::ToggleLigature(std::vector elementIds) int secondIdx = secondNc->GetIdx(); if (std::abs(firstIdx - secondIdx) != 1) { LogError("The selected ncs are not adjacent."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "The selected ncs are not adjacent."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "The selected ncs are not adjacent."); return false; } @@ -3247,20 +3251,20 @@ bool EditorToolkitNeume::ToggleLigature(std::vector elementIds) } // else { // LogError("isLigature is invalid!"); - // m_infoObject.import("status", "FAILURE"); - // m_infoObject.import("message", "isLigature value '" + isLigature + "' is invalid."); + // m_editInfo.import("status", "FAILURE"); + // m_editInfo.import("message", "isLigature value '" + isLigature + "' is invalid."); // return false; // } if (success1 && success2 && m_doc->GetType() != Facs) { m_doc->PrepareData(); m_doc->GetDrawingPage()->LayOut(true); } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); if (!(success1 && success2)) { LogWarning("Unable to update ligature attribute"); - m_infoObject.import("message", "Unable to update ligature attribute."); - m_infoObject.import("status", "WARNING"); + m_editInfo.import("message", "Unable to update ligature attribute."); + m_editInfo.import("status", "WARNING"); } surface->AddChild(zone); @@ -3271,15 +3275,15 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) { if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } if (m_doc->GetType() != Facs) { LogWarning("Staff re-association is only available in facsimile mode."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Staff re-association is only available in facsimile mode."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Staff re-association is only available in facsimile mode."); return false; } @@ -3287,8 +3291,8 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) assert(element); if (element == NULL) { LogError("No element exists with ID '%s'.", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No element exists with ID" + elementId + "."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No element exists with ID" + elementId + "."); return false; } @@ -3296,8 +3300,8 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) || element->Is(ACCID))) { LogError("Element is of type %s, but only Syllables, Custos, Clefs, Divlines, and Accids can change staves.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element is of type " + element->GetClassName() + ", but only Syllables, Custos, Clefs, DivLines, and Accids can change staves."); return false; @@ -3318,8 +3322,8 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) LayerElement *layerElement = dynamic_cast(element); if (!layerElement->GenerateZoneBounds(&ulx, &uly, &lrx, &lry)) { LogError("Couldn't generate bounding box for syllable."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Couldn't generate bounding box for syllable."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Couldn't generate bounding box for syllable."); return false; } comp.x = (lrx + ulx) / 2; @@ -3327,8 +3331,8 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) } else { LogError("This element does not have a facsimile."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "This element does not have a facsimile."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "This element does not have a facsimile."); return false; } @@ -3341,8 +3345,8 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) } else { LogError("Could not find any staves. This should not happen"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not find any staves. This should not happen"); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not find any staves. This should not happen"); return false; } @@ -3351,8 +3355,8 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) assert(parent); if (parent == NULL || sParent == NULL) { LogError("Couldn't find staff parent of element with id '%s'", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Couldn't find staff parent of element with id " + elementId); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Couldn't find staff parent of element with id " + elementId); return false; } @@ -3360,16 +3364,16 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) assert(LAYER); if (layer == NULL) { LogError("Couldn't find layer child of staff. This should not happen"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Couldn't find layer child of staff. This should not happen"); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Couldn't find layer child of staff. This should not happen"); return false; } if (layer == parent) { - m_infoObject.import("status", "WARNING"); - m_infoObject.import("message", "Moving to the same staff as before."); - m_infoObject.import("elementId", elementId); - m_infoObject.import("newStaffId", staff->GetID()); + m_editInfo.import("status", "WARNING"); + m_editInfo.import("message", "Moving to the same staff as before."); + m_editInfo.import("elementId", elementId); + m_editInfo.import("newStaffId", staff->GetID()); return true; } @@ -3427,8 +3431,8 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) // Adjust clefline if (!AdjustClefLineFromPosition(dynamic_cast(element), staff)) { LogError("Could not adjust clef line of %s", element->GetID().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to set clef line from facsimile."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to set clef line from facsimile."); return false; } @@ -3456,19 +3460,19 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) if (!(element->Is(ACCID) || element->Is(DIVLINE))) { if (!AdjustPitchFromPosition(element)) { LogError("Could not adjust pitch of %s", element->GetID().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to properly set pitch."); - m_infoObject.import("elementId", element->GetID()); - m_infoObject.import("newStaffId", staff->GetID()); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to properly set pitch."); + m_editInfo.import("elementId", element->GetID()); + m_editInfo.import("newStaffId", staff->GetID()); return false; } } } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); - m_infoObject.import("elementId", elementId); - m_infoObject.import("newStaffId", staff->GetID()); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); + m_editInfo.import("elementId", elementId); + m_editInfo.import("newStaffId", staff->GetID()); return true; } @@ -3476,15 +3480,15 @@ bool EditorToolkitNeume::ChangeStaffTo(std::string elementId, std::string staffI { if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } if (m_doc->GetType() != Facs) { LogWarning("Staff re-association is only available in facsimile mode."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Staff re-association is only available in facsimile mode."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Staff re-association is only available in facsimile mode."); return false; } @@ -3492,16 +3496,16 @@ bool EditorToolkitNeume::ChangeStaffTo(std::string elementId, std::string staffI assert(element); if (element == NULL) { LogError("No element exists with ID '%s'.", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No element exists with ID" + elementId + "."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No element exists with ID" + elementId + "."); return false; } if (!(element->Is(CLEF) || element->Is(DIVLINE) || element->Is(ACCID))) { LogError("Element is of type %s, but only Clefs, Divlines, and Accids can change to a specified staff.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element is of type " + element->GetClassName() + ", but only Clefs, Divlines, and Accids can change to a specified staff."); return false; @@ -3511,8 +3515,8 @@ bool EditorToolkitNeume::ChangeStaffTo(std::string elementId, std::string staffI if (!staff) { LogError("Could not find any staves. This should not happen"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not find any staves. This should not happen"); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not find any staves. This should not happen"); return false; } @@ -3521,8 +3525,8 @@ bool EditorToolkitNeume::ChangeStaffTo(std::string elementId, std::string staffI assert(parent); if (parent == NULL || sParent == NULL) { LogError("Couldn't find staff parent of element with id '%s'", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Couldn't find staff parent of element with id " + elementId); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Couldn't find staff parent of element with id " + elementId); return false; } @@ -3530,16 +3534,16 @@ bool EditorToolkitNeume::ChangeStaffTo(std::string elementId, std::string staffI assert(LAYER); if (layer == NULL) { LogError("Couldn't find layer child of staff. This should not happen"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Couldn't find layer child of staff. This should not happen"); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Couldn't find layer child of staff. This should not happen"); return false; } if (layer == parent) { - m_infoObject.import("status", "WARNING"); - m_infoObject.import("message", "Moving to the same staff as before."); - m_infoObject.import("elementId", elementId); - m_infoObject.import("newStaffId", staff->GetID()); + m_editInfo.import("status", "WARNING"); + m_editInfo.import("message", "Moving to the same staff as before."); + m_editInfo.import("elementId", elementId); + m_editInfo.import("newStaffId", staff->GetID()); return true; } @@ -3597,8 +3601,8 @@ bool EditorToolkitNeume::ChangeStaffTo(std::string elementId, std::string staffI // Adjust clefline if (!AdjustClefLineFromPosition(dynamic_cast(element), staff)) { LogError("Could not adjust clef line of %s", element->GetID().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to set clef line from facsimile."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to set clef line from facsimile."); return false; } @@ -3625,10 +3629,10 @@ bool EditorToolkitNeume::ChangeStaffTo(std::string elementId, std::string staffI parent->ReorderByXPos(); } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); - m_infoObject.import("elementId", elementId); - m_infoObject.import("newStaffId", staff->GetID()); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); + m_editInfo.import("elementId", elementId); + m_editInfo.import("newStaffId", staff->GetID()); return true; } From 0a1727fbffb91a6384c4b66a4c9e075827a6c14a Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 14 Aug 2023 14:48:46 -0400 Subject: [PATCH 034/249] Fix outer scope shadowing --- src/editortoolkit_neume.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 38fde2bee57..29a811d4b0a 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2596,7 +2596,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e secondParent->AddChild(parent); } else { - Syllable *parent = new Syllable(); + parent = new Syllable(); Syl *fullSyl = NULL; int ulx, uly, lrx, lry; From ffcf15178a55895d221be5ee2ceece19488b8f38 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 14 Aug 2023 14:49:21 -0400 Subject: [PATCH 035/249] Clean up comments --- src/editortoolkit_neume.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 29a811d4b0a..9e35505ccd3 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2401,9 +2401,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e std::string resultId0; std::string resultId1; - // LogMessage("%s", chainArray.get(0).json().c_str()); - // for_each(elementIds.begin(), elementIds.begin()+idx,[](std::string s){LogMessage("%s", s.c_str());}); - std::vector elementIds0 = { elementIds.begin(), elementIds.begin() + idx }; Group("neume", elementIds0); if (m_editInfo.get("status") == "FAILURE") { From 83ac0e7ab2e068e0e0894f6d96a08026fe9df13f Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 14 Aug 2023 16:56:28 -0400 Subject: [PATCH 036/249] Break when last element --- src/editortoolkit_neume.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 9e35505ccd3..270ac94a86a 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2811,6 +2811,7 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector fparent->ReorderByXPos(); uuidArray << (*it); it = elementIds.erase(it); + if (it == elementIds.end()) break; el = m_doc->GetDrawingPage()->FindDescendantByID(*it); } } From 37232c1ce6c92c09870f8ecd7c14713004d6f050 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 15 Aug 2023 16:50:29 -0400 Subject: [PATCH 037/249] Reset m_editInfo for OOM error --- src/editortoolkit_neume.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 270ac94a86a..cb1432194b4 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -48,7 +48,7 @@ std::string EditorToolkitNeume::EditInfo() bool EditorToolkitNeume::ParseEditorAction(const std::string &json_editorAction) { jsonxx::Object json; - // m_editInfo.reset(); + m_editInfo.reset(); // Read JSON actions if (!json.parse(json_editorAction)) { From 12ea581cbcaa610c1f93c945830275d9490e41d1 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Thu, 17 Aug 2023 18:15:41 -0400 Subject: [PATCH 038/249] Refactor new bbox zone && add staff rotation offset --- src/editortoolkit_neume.cpp | 66 ++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index cb1432194b4..802668a5da2 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -857,12 +857,12 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in Syl *syl = new Syl(); Neume *neume = new Neume(); Nc *nc = new Nc(); + Zone *sylZone; std::string contour = ""; nc->AttachZone(zone); Surface *surface = vrv_cast(facsimile->FindDescendantByType(SURFACE)); surface->AddChild(zone); - zone->SetUlx(ulx); Text *text = new Text(); std::u32string str = U""; @@ -874,57 +874,48 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in syllable->AddChild(syl); layer->AddChild(syllable); + const int noteHeight + = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_HEIGHT_TO_STAFF_SIZE_RATIO); + const int noteWidth + = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_WIDTH_TO_STAFF_SIZE_RATIO); + ulx -= noteWidth / 2; + + // calculate staff rotation offset + double theta = staff->GetDrawingRotate(); + int offsetY = 0; + if (theta) { + double factor = 1.3; + offsetY = (int)((ulx - staff->GetFacsimileInterface()->GetZone()->GetUlx()) * tan(theta * M_PI / 180.0) + / factor); + } + + // Set up facsimile + zone->SetUlx(ulx); + zone->SetUly(uly + offsetY); + zone->SetLrx(ulx + noteWidth); + zone->SetLry(uly + offsetY + noteHeight); + // add syl bounding box if Facs if (m_doc->GetType() == Facs) { FacsimileInterface *fi = vrv_cast(syl->GetFacsimileInterface()); assert(fi); - Zone *sylZone = new Zone(); + sylZone = new Zone(); - // calculate bboxUlx and bboxUly wrt rotation using sine rule - int draw_w = staff->GetWidth(); int draw_h = staff->GetHeight(); - double theta = staff->GetDrawingRotate(); int staffUly = staff->GetDrawingY(); - int x = ulx - staff->GetDrawingX(); - int bboxUlx = ulx; - int bboxUly; - // if staff rotates downward to the right - if (theta > 0) { - int y = (int)((draw_w - x) * tan(theta * M_PI / 180.0)); - bboxUly = staffUly + draw_h - y; - } - // if staff rotates upwards to the right - else { - int y = (int)(x * tan(-theta * M_PI / 180.0)); - int h = (int)(draw_w * tan(-theta * M_PI / 180.0)); - bboxUly = staffUly + (draw_h - h) - y; - } // width height and offset can be adjusted - int bboxWidth = 225; int bboxHeight = 175; int bboxOffsetX = 50; - sylZone->SetUlx(bboxUlx - bboxOffsetX); - sylZone->SetUly(bboxUly); - sylZone->SetLrx(bboxUlx + bboxWidth - bboxOffsetX); - sylZone->SetLry(bboxUly + bboxHeight); + sylZone->SetUlx(ulx); + sylZone->SetUly(staffUly + draw_h + offsetY); + sylZone->SetLrx(ulx + noteWidth + bboxOffsetX); + sylZone->SetLry(staffUly + draw_h + offsetY + bboxHeight); surface->AddChild(sylZone); fi->AttachZone(sylZone); } - const int noteHeight - = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_HEIGHT_TO_STAFF_SIZE_RATIO); - const int noteWidth - = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_WIDTH_TO_STAFF_SIZE_RATIO); - ulx -= noteWidth / 2; - // uly -= noteHeight / 2; - // Set up facsimile - zone->SetUlx(ulx); - zone->SetUly(uly); - zone->SetLrx(ulx + noteWidth); - zone->SetLry(uly + noteHeight); - layer->ReorderByXPos(); if (!AdjustPitchFromPosition(syllable)) { @@ -1005,12 +996,13 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in newUly += (newUlx - ulx) * tan(-staff->GetDrawingRotate() * M_PI / 180.0); newZone->SetUlx(newUlx); newZone->SetUly(newUly); - ; newZone->SetLrx(newUlx + noteWidth); newZone->SetLry(newUly + noteHeight); newNc->AttachZone(newZone); + if (sylZone) sylZone->SetLrx(newUlx + noteWidth); + assert(surface); surface->AddChild(newZone); From 8330f3b6b51c92aed6642a9733881f5270d409bd Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Fri, 27 Oct 2023 16:32:50 -0400 Subject: [PATCH 039/249] Add empty syl for follows syllable if precedes becomes empty --- src/editortoolkit_neume.cpp | 41 ++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 802668a5da2..67f5dc19638 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2197,7 +2197,46 @@ bool EditorToolkitNeume::Remove(std::string elementId) = dynamic_cast(m_doc->GetDrawingPage()->FindDescendantByID(linkedID)); if (linkedSyllable != NULL) { if (linkedSyllable->HasPrecedes()) linkedSyllable->SetPrecedes(""); - if (linkedSyllable->HasFollows()) linkedSyllable->SetFollows(""); + if (linkedSyllable->HasFollows()) { + linkedSyllable->SetFollows(""); + // Create an empty syl for the second part + Syl *syl = new Syl(); + Text *text = new Text(); + std::u32string str = U""; + text->SetText(str); + syl->AddChild(text); + linkedSyllable->AddChild(syl); + + // Create default bounding box if facs + if (m_doc->GetType() == Facs) { + Zone *zone = new Zone(); + + zone->SetUlx(linkedSyllable->GetFirst(NEUME) + ->GetFirst(NC) + ->GetFacsimileInterface() + ->GetZone() + ->GetUlx()); + zone->SetUly( + linkedSyllable->GetAncestorStaff()->GetFacsimileInterface()->GetZone()->GetLry()); + zone->SetLrx(linkedSyllable->GetLast(NEUME) + ->GetLast(NC) + ->GetFacsimileInterface() + ->GetZone() + ->GetLrx()); + zone->SetLry(zone->GetUly() + 100); + + // Make bbox larger if it has less than 2 ncs + if (linkedSyllable->GetChildCount(NC, 2) <= 2) { + zone->SetLrx(zone->GetLrx() + 50); + } + + assert(m_doc->GetFacsimile()); + m_doc->GetFacsimile()->FindDescendantByType(SURFACE)->AddChild(zone); + FacsimileInterface *fi = syl->GetFacsimileInterface(); + assert(fi); + fi->AttachZone(zone); + } + }; } } // Delete the syllable empty of neumes From a82d7518c910b5a705f25b9a98106acd343bba8d Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Fri, 1 Dec 2023 17:14:09 -0500 Subject: [PATCH 040/249] Set column value for newly inserted staff if has columns --- src/editortoolkit_neume.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 67f5dc19638..048d90eba4c 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -782,10 +782,12 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in if (elementType == "staff") { Object *parent; Staff *newStaff; + std::string columnValue; // Use closest existing staff (if there is one) if (staff) { parent = staff->GetParent(); assert(parent); + columnValue = staff->GetType(); int n = parent->GetChildCount() + 1; newStaff = new Staff(n); newStaff->m_drawingStaffDef = staff->m_drawingStaffDef; @@ -810,6 +812,7 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in assert(surface); surface->AddChild(zone); newStaff->AttachZone(zone); + if (columnValue.length()) newStaff->SetType(columnValue); Layer *newLayer = new Layer(); newStaff->AddChild(newLayer); From 3e5ba64599352a29bee3d05d260b007736469440 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 4 Dec 2023 20:38:54 -0500 Subject: [PATCH 041/249] Unlink syllable when removed --- include/vrv/editortoolkit_neume.h | 1 + src/editortoolkit_neume.cpp | 108 +++++++++++++++++------------- 2 files changed, 62 insertions(+), 47 deletions(-) diff --git a/include/vrv/editortoolkit_neume.h b/include/vrv/editortoolkit_neume.h index 108b50e5266..11828f083cb 100644 --- a/include/vrv/editortoolkit_neume.h +++ b/include/vrv/editortoolkit_neume.h @@ -55,6 +55,7 @@ class EditorToolkitNeume : public EditorToolkit { bool Remove(std::string elementId); bool Resize(std::string elementId, int ulx, int uly, int lrx, int lry, float resize = NAN); bool Group(std::string groupType, std::vector elementIds); + void UnlinkSyllable(Syllable *syllable); bool Ungroup(std::string groupType, std::vector elementIds); bool ChangeGroup(std::string elementId, std::string contour); bool ToggleLigature(std::vector elementIds); diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 048d90eba4c..3eb7ec10a7e 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2084,6 +2084,58 @@ bool EditorToolkitNeume::Split(std::string elementId, int x) return true; } +void EditorToolkitNeume::UnlinkSyllable(Syllable *syllable) +{ + if (!m_doc->GetDrawingPage()) { + LogError("Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); + return; + } + + assert(syllable); + + std::string linkedID = (syllable->HasPrecedes() ? syllable->GetPrecedes() : syllable->GetFollows()); + if (linkedID.compare(0, 1, "#") == 0) linkedID.erase(0, 1); + Syllable *linkedSyllable = dynamic_cast(m_doc->GetDrawingPage()->FindDescendantByID(linkedID)); + if (linkedSyllable != NULL) { + if (linkedSyllable->HasPrecedes()) linkedSyllable->SetPrecedes(""); + if (linkedSyllable->HasFollows()) { + linkedSyllable->SetFollows(""); + + // Create an empty syl for the second part + Syl *syl = new Syl(); + Text *text = new Text(); + std::u32string str = U""; + text->SetText(str); + syl->AddChild(text); + linkedSyllable->AddChild(syl); + + // Create default bounding box if facs + if (m_doc->GetType() == Facs) { + Zone *zone = new Zone(); + + zone->SetUlx( + linkedSyllable->GetFirst(NEUME)->GetFirst(NC)->GetFacsimileInterface()->GetZone()->GetUlx()); + zone->SetUly(linkedSyllable->GetAncestorStaff()->GetFacsimileInterface()->GetZone()->GetLry()); + zone->SetLrx(linkedSyllable->GetLast(NEUME)->GetLast(NC)->GetFacsimileInterface()->GetZone()->GetLrx()); + zone->SetLry(zone->GetUly() + 100); + + // Make bbox larger if it has less than 2 ncs + if (linkedSyllable->GetChildCount(NC, 2) <= 2) { + zone->SetLrx(zone->GetLrx() + 50); + } + + assert(m_doc->GetFacsimile()); + m_doc->GetFacsimile()->FindDescendantByType(SURFACE)->AddChild(zone); + FacsimileInterface *fi = syl->GetFacsimileInterface(); + assert(fi); + fi->AttachZone(zone); + } + } + } +} + bool EditorToolkitNeume::Remove(std::string elementId) { if (!m_doc->GetDrawingPage()) { @@ -2156,6 +2208,14 @@ bool EditorToolkitNeume::Remove(std::string elementId) } } + if (obj->Is(SYLLABLE)) { + Syllable *syllable = dynamic_cast(obj); + assert(syllable); + if (syllable->HasPrecedes() || syllable->HasFollows()) { + UnlinkSyllable(syllable); + } + } + if (!result) { result = parent->DeleteChild(obj); } @@ -2194,53 +2254,7 @@ bool EditorToolkitNeume::Remove(std::string elementId) Syllable *li = dynamic_cast(obj); assert(li); if (li->HasPrecedes() || li->HasFollows()) { - std::string linkedID = (li->HasPrecedes() ? li->GetPrecedes() : li->GetFollows()); - if (linkedID.compare(0, 1, "#") == 0) linkedID.erase(0, 1); - Syllable *linkedSyllable - = dynamic_cast(m_doc->GetDrawingPage()->FindDescendantByID(linkedID)); - if (linkedSyllable != NULL) { - if (linkedSyllable->HasPrecedes()) linkedSyllable->SetPrecedes(""); - if (linkedSyllable->HasFollows()) { - linkedSyllable->SetFollows(""); - // Create an empty syl for the second part - Syl *syl = new Syl(); - Text *text = new Text(); - std::u32string str = U""; - text->SetText(str); - syl->AddChild(text); - linkedSyllable->AddChild(syl); - - // Create default bounding box if facs - if (m_doc->GetType() == Facs) { - Zone *zone = new Zone(); - - zone->SetUlx(linkedSyllable->GetFirst(NEUME) - ->GetFirst(NC) - ->GetFacsimileInterface() - ->GetZone() - ->GetUlx()); - zone->SetUly( - linkedSyllable->GetAncestorStaff()->GetFacsimileInterface()->GetZone()->GetLry()); - zone->SetLrx(linkedSyllable->GetLast(NEUME) - ->GetLast(NC) - ->GetFacsimileInterface() - ->GetZone() - ->GetLrx()); - zone->SetLry(zone->GetUly() + 100); - - // Make bbox larger if it has less than 2 ncs - if (linkedSyllable->GetChildCount(NC, 2) <= 2) { - zone->SetLrx(zone->GetLrx() + 50); - } - - assert(m_doc->GetFacsimile()); - m_doc->GetFacsimile()->FindDescendantByType(SURFACE)->AddChild(zone); - FacsimileInterface *fi = syl->GetFacsimileInterface(); - assert(fi); - fi->AttachZone(zone); - } - }; - } + UnlinkSyllable(li); } // Delete the syllable empty of neumes std::string syllableId = obj->GetID(); From e847556a0aeb060f8c36621a54acafbaa7418d4d Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 11 Dec 2023 17:14:31 -0500 Subject: [PATCH 042/249] Handle empty staff when inserting new staff --- src/editortoolkit_neume.cpp | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 3eb7ec10a7e..bb0756c02cf 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -816,28 +816,27 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in Layer *newLayer = new Layer(); newStaff->AddChild(newLayer); - // Find index to insert new staff - ListOfObjects staves = parent->FindAllDescendantsByType(STAFF, false); - std::vector stavesVector(staves.begin(), staves.end()); - stavesVector.push_back(newStaff); - StaffSort staffSort; - std::stable_sort(stavesVector.begin(), stavesVector.end(), staffSort); - for (int i = 0; i < (int)staves.size(); ++i) { - if (stavesVector.at(i) == newStaff) { - parent->InsertChild(newStaff, i); - parent->Modify(); - - m_editInfo.import("uuid", newStaff->GetID()); - m_editInfo.import("status", status); - m_editInfo.import("message", message); - - return true; + if (staff) { + // Find index to insert new staff + ListOfObjects staves = parent->FindAllDescendantsByType(STAFF, false); + std::vector stavesVector(staves.begin(), staves.end()); + stavesVector.push_back(newStaff); + StaffSort staffSort; + std::stable_sort(stavesVector.begin(), stavesVector.end(), staffSort); + for (int i = 0; i < (int)staves.size(); ++i) { + if (stavesVector.at(i) == newStaff) { + parent->InsertChild(newStaff, i); + parent->Modify(); + + m_editInfo.import("uuid", newStaff->GetID()); + m_editInfo.import("status", status); + m_editInfo.import("message", message); + + return true; + } } } - LogWarning("Failed to insert newStaff into staff"); - message += "Failed to insert newStaff into staves."; parent->AddChild(newStaff); - parent->Modify(); m_editInfo.import("uuid", newStaff->GetID()); m_editInfo.import("status", status); From fe3a0526d7fc8b84fe15b234edc022a14ee18224 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 12 Dec 2023 17:06:45 -0500 Subject: [PATCH 043/249] New for blank files in neume notation --- src/iomei.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/iomei.cpp b/src/iomei.cpp index ac3f89bde36..77b60e7a0d8 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -4467,6 +4467,13 @@ bool MEIInput::ReadSectionChildren(Object *parent, pugi::xml_node parentNode) LogWarning("Unsupported '<%s>' within
", current.name()); } } + + // New for blank files in neume notation + if (!unmeasured && parent->Is(SECTION) && (m_doc->m_notationType == NOTATIONTYPE_neume)) { + unmeasured = new Measure(false); + m_doc->SetMensuralMusicOnly(true); + parent->AddChild(unmeasured); + } return success; } From c4eb5b0abdb8e4d09cc52a52645e73f1ec003c3c Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 15 Dec 2023 12:27:50 +0100 Subject: [PATCH 044/249] Start 4.2.0-dev --- CHANGELOG.md | 2 ++ Verovio.podspec | 2 +- bindings/java/pom.xml | 2 +- bindings/python/.pypi-version | 2 +- codemeta.json | 4 ++-- emscripten/npm/package.json | 2 +- include/vrv/vrvdef.h | 2 +- 7 files changed, 9 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c18e42c337..6b095c12dbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Changelog ## [unreleased] + +## [4.1.0] - 2023-12-15 * Support for staves ordered by `scoreDef` * Support for `rend@letterspacing` and `syl@letterspacing` in MEI vu * Support for `nc@loc` diff --git a/Verovio.podspec b/Verovio.podspec index 8f86ea829c2..e401987e0fa 100644 --- a/Verovio.podspec +++ b/Verovio.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Verovio' - s.version = '4.1.0-dev' + s.version = '4.2.0-dev' s.license = { :type => 'LGPL', :file => 'COPYING' } s.homepage = 'https://www.verovio.org/index.xhtml' s.authors = { 'Contributors List' => 'https://github.com/rism-digital/verovio/graphs/contributors' } diff --git a/bindings/java/pom.xml b/bindings/java/pom.xml index 633d49437fa..33ef0597eb8 100644 --- a/bindings/java/pom.xml +++ b/bindings/java/pom.xml @@ -4,7 +4,7 @@ org.rism.verovio VerovioToolkit - 4.1.0-dev + 4.2.0-dev jar VerovioToolkit diff --git a/bindings/python/.pypi-version b/bindings/python/.pypi-version index e41fa9d0265..84066c019f4 100644 --- a/bindings/python/.pypi-version +++ b/bindings/python/.pypi-version @@ -1,3 +1,3 @@ # dummy file used by setup.py for counting revisions when publishing to test.pypi # counting can be reset by making a change to this file -4.1.0 +4.2.0 diff --git a/codemeta.json b/codemeta.json index 6500f6e0ea9..390078a93ba 100644 --- a/codemeta.json +++ b/codemeta.json @@ -4,8 +4,8 @@ "identifier": "Verovio", "name": "Verovio", "description": "Verovio is a fast, portable and lightweight open-source library for engraving Music Encoding Initiative (MEI) music scores into SVG.", - "softwareVersion": "4.1.0-dev", - "datePublished": "2023-09-05", + "softwareVersion": "4.2.0-dev", + "datePublished": "2023-12-15", "license": "https://www.gnu.org/licenses/lgpl-3.0", "programmingLanguage": [{ "@type": "ComputerLanguage", diff --git a/emscripten/npm/package.json b/emscripten/npm/package.json index 61df76651f5..68404c71027 100644 --- a/emscripten/npm/package.json +++ b/emscripten/npm/package.json @@ -1,6 +1,6 @@ { "name": "verovio", - "version": "4.1.0-alpha", + "version": "4.2.0-alpha", "description": "This is the stable version of the verovio package", "main": "dist/verovio-toolkit-wasm.js", "exports": { diff --git a/include/vrv/vrvdef.h b/include/vrv/vrvdef.h index 03128926e46..86ead543896 100644 --- a/include/vrv/vrvdef.h +++ b/include/vrv/vrvdef.h @@ -39,7 +39,7 @@ namespace vrv { //---------------------------------------------------------------------------- #define VERSION_MAJOR 4 -#define VERSION_MINOR 1 +#define VERSION_MINOR 2 #define VERSION_REVISION 0 // Adds "-dev" in the version number - should be set to false for releases #define VERSION_DEV true From 39ba8dbfd4f2dc5fce748007cc3660b616a5dfac Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Mon, 18 Dec 2023 09:20:43 +0100 Subject: [PATCH 045/249] Add multiple page breaks if MusicXML encodes blank pages --- src/iomusxml.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index 7fa4fb31d3c..8bd7d0181b5 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -3694,7 +3694,12 @@ void MusicXmlInput::ReadMusicXmlPrint(pugi::xml_node node, Section *section) assert(node); assert(section); - if (node.attribute("new-page").as_bool()) { + int pageBreaks = node.attribute("blank-page").as_int(); + if (node.attribute("new-page").as_bool() || pageBreaks > 0) { + pageBreaks++; + } + + for (int i = 0; i < pageBreaks; i++) { Pb *pb = new Pb(); section->AddChild(pb); } From 65b544861ce10575273e2658a0c227f9f26e08c7 Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Mon, 18 Dec 2023 11:52:36 +0100 Subject: [PATCH 046/249] Follow MusicXML specs: Only output blank pages if new-page="yes" --- src/iomusxml.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index 8bd7d0181b5..ffa16e0bd0b 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -3694,14 +3694,12 @@ void MusicXmlInput::ReadMusicXmlPrint(pugi::xml_node node, Section *section) assert(node); assert(section); - int pageBreaks = node.attribute("blank-page").as_int(); - if (node.attribute("new-page").as_bool() || pageBreaks > 0) { - pageBreaks++; - } - - for (int i = 0; i < pageBreaks; i++) { - Pb *pb = new Pb(); - section->AddChild(pb); + if (node.attribute("new-page").as_bool()) { + int pageBreaks = node.attribute("blank-page").as_int() + 1; + for (int i = 0; i < pageBreaks; ++i) { + Pb *pb = new Pb(); + section->AddChild(pb); + } } if (node.attribute("new-system").as_bool()) { From 5b73ba1ecffc30fa88132fadc883e73ab184fb94 Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Tue, 19 Dec 2023 09:14:40 +0100 Subject: [PATCH 047/249] Make loop boundary a constant Co-authored-by: Laurent Pugin --- src/iomusxml.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index ffa16e0bd0b..e7501b40ae1 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -3695,7 +3695,7 @@ void MusicXmlInput::ReadMusicXmlPrint(pugi::xml_node node, Section *section) assert(section); if (node.attribute("new-page").as_bool()) { - int pageBreaks = node.attribute("blank-page").as_int() + 1; + const int pageBreaks = node.attribute("blank-page").as_int() + 1; for (int i = 0; i < pageBreaks; ++i) { Pb *pb = new Pb(); section->AddChild(pb); From 3ded68c67693dc7a80639aef3548751c1b2da016 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 19 Dec 2023 10:20:53 +0100 Subject: [PATCH 048/249] Fix crash when converting mensural notation from Humdrum --- src/doc.cpp | 3 +++ src/iohumdrum.cpp | 1 + 2 files changed, 4 insertions(+) diff --git a/src/doc.cpp b/src/doc.cpp index e79a92b74b0..e1dc8fb97de 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -1291,6 +1291,9 @@ void Doc::ConvertToCastOffMensuralDoc(bool castOff) m_isMensuralMusicOnly = false; } + // Calling Doc::PrepareData is expected to collect visible scores + assert(m_dataPreparationDone); + // Make sure the document is not cast-off this->UnCastOffDoc(); diff --git a/src/iohumdrum.cpp b/src/iohumdrum.cpp index 4353e83816a..be58d5bb7ca 100644 --- a/src/iohumdrum.cpp +++ b/src/iohumdrum.cpp @@ -31612,6 +31612,7 @@ void HumdrumInput::finalizeDocument(Doc *doc) if (m_mens) { doc->SetMensuralMusicOnly(true); doc->m_notationType = NOTATIONTYPE_mensural; + doc->PrepareData(); doc->ConvertToCastOffMensuralDoc(true); } } From 459b29399672c425e5257bec053e32d4badcf601 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 19 Dec 2023 16:37:58 -0500 Subject: [PATCH 049/249] Fix removing clef error --- src/editortoolkit_neume.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index bb0756c02cf..e793f336fdf 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2146,10 +2146,11 @@ bool EditorToolkitNeume::Remove(std::string elementId) Object *obj = m_doc->GetDrawingPage()->FindDescendantByID(elementId); assert(obj); bool result = false; - bool isNeumeOrNc, isNc, isClef; + bool isNeumeOrNc, isNc, isClef, isSyllable; isNeumeOrNc = (obj->Is(NC) || obj->Is(NEUME)); isNc = obj->Is(NC); isClef = obj->Is(CLEF); + isSyllable = obj->Is(SYLLABLE); Object *parent = obj->GetParent(); assert(parent); m_editInfo.import("uuid", elementId); @@ -2206,8 +2207,7 @@ bool EditorToolkitNeume::Remove(std::string elementId) pi->AdjustPitchForNewClef(clef, previousClef); } } - - if (obj->Is(SYLLABLE)) { + else if (isSyllable) { Syllable *syllable = dynamic_cast(obj); assert(syllable); if (syllable->HasPrecedes() || syllable->HasFollows()) { From 5a5cc737411a7d36a3544c54bb98442e354b288a Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Thu, 21 Dec 2023 16:07:26 -0500 Subject: [PATCH 050/249] Fix staff rotation offset for inserted syllables --- src/editortoolkit_neume.cpp | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index e793f336fdf..c4d60dd438d 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -880,22 +880,12 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_HEIGHT_TO_STAFF_SIZE_RATIO); const int noteWidth = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_WIDTH_TO_STAFF_SIZE_RATIO); - ulx -= noteWidth / 2; - - // calculate staff rotation offset - double theta = staff->GetDrawingRotate(); - int offsetY = 0; - if (theta) { - double factor = 1.3; - offsetY = (int)((ulx - staff->GetFacsimileInterface()->GetZone()->GetUlx()) * tan(theta * M_PI / 180.0) - / factor); - } // Set up facsimile zone->SetUlx(ulx); - zone->SetUly(uly + offsetY); + zone->SetUly(uly); zone->SetLrx(ulx + noteWidth); - zone->SetLry(uly + offsetY + noteHeight); + zone->SetLry(uly + noteHeight); // add syl bounding box if Facs if (m_doc->GetType() == Facs) { @@ -903,17 +893,25 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in assert(fi); sylZone = new Zone(); - int draw_h = staff->GetHeight(); - int staffUly = staff->GetDrawingY(); + int staffLry = staff->GetFacsimileInterface()->GetZone()->GetLry(); // width height and offset can be adjusted int bboxHeight = 175; int bboxOffsetX = 50; + // calculate staff rotation offset + double theta = staff->GetDrawingRotate(); + int offsetY = 0; + if (theta) { + double factor = 1.3; + offsetY = (int)((ulx - staff->GetFacsimileInterface()->GetZone()->GetUlx()) * tan(theta * M_PI / 180.0) + / factor); + } + sylZone->SetUlx(ulx); - sylZone->SetUly(staffUly + draw_h + offsetY); + sylZone->SetUly(staffLry + offsetY); sylZone->SetLrx(ulx + noteWidth + bboxOffsetX); - sylZone->SetLry(staffUly + draw_h + offsetY + bboxHeight); + sylZone->SetLry(staffLry + offsetY + bboxHeight); surface->AddChild(sylZone); fi->AttachZone(sylZone); } From 7d091c98511452bd0850c9fbd534a92f88d042d3 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Fri, 22 Dec 2023 09:57:46 +0100 Subject: [PATCH 051/249] Fixed: Dependabot warning on scipy This should fix the scipy security warning by updating the dependencies for the "fonts" scripts. --- fonts/poetry.lock | 576 +++++++++++++++++++++++----------------------- 1 file changed, 287 insertions(+), 289 deletions(-) diff --git a/fonts/poetry.lock b/fonts/poetry.lock index 7c516f071b4..bd9153bf74d 100644 --- a/fonts/poetry.lock +++ b/fonts/poetry.lock @@ -1,25 +1,14 @@ # This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. -[[package]] -name = "appnope" -version = "0.1.3" -description = "Disable App Nap on macOS >= 10.9" -optional = false -python-versions = "*" -files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, -] - [[package]] name = "astroid" -version = "2.14.2" +version = "2.15.8" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.7.2" files = [ - {file = "astroid-2.14.2-py3-none-any.whl", hash = "sha256:0e0e3709d64fbffd3037e4ff403580550f14471fd3eaae9fa11cc9a5c7901153"}, - {file = "astroid-2.14.2.tar.gz", hash = "sha256:a3cf9f02c53dd259144a7e8f3ccd75d67c9a8c716ef183e0c1f291bc5d7bb3cf"}, + {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, + {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, ] [package.dependencies] @@ -32,31 +21,21 @@ wrapt = [ [[package]] name = "asttokens" -version = "2.2.1" +version = "2.4.1" description = "Annotate AST trees with source code positions" optional = false python-versions = "*" files = [ - {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, - {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, ] [package.dependencies] -six = "*" +six = ">=1.12.0" [package.extras] -test = ["astroid", "pytest"] - -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -optional = false -python-versions = "*" -files = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "black" @@ -95,13 +74,13 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "click" -version = "8.1.3" +version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -131,149 +110,160 @@ files = [ [[package]] name = "dill" -version = "0.3.6" -description = "serialize all of python" +version = "0.3.7" +description = "serialize all of Python" optional = false python-versions = ">=3.7" files = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, ] [package.extras] graph = ["objgraph (>=1.7.2)"] [[package]] -name = "executing" +name = "exceptiongroup" version = "1.2.0" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, ] [package.extras] -tests = ["asttokens", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] [[package]] name = "ipython" -version = "8.10.0" +version = "8.18.1" description = "IPython: Productive Interactive Computing" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "ipython-8.10.0-py3-none-any.whl", hash = "sha256:b38c31e8fc7eff642fc7c597061fff462537cf2314e3225a19c906b7b0d8a345"}, - {file = "ipython-8.10.0.tar.gz", hash = "sha256:b13a1d6c1f5818bd388db53b7107d17454129a70de2b87481d555daede5eb49e"}, + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, ] [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=3.0.30,<3.1.0" +prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} [package.extras] -all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] black = ["black"] -doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] nbformat = ["nbformat"] notebook = ["ipywidgets", "notebook"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] -test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] [[package]] name = "isort" -version = "5.12.0" +version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] +colors = ["colorama (>=0.4.6)"] [[package]] name = "jedi" -version = "0.18.2" +version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, - {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, ] [package.dependencies] -parso = ">=0.8.0,<0.9.0" +parso = ">=0.8.3,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "lazy-object-proxy" -version = "1.9.0" +version = "1.10.0" description = "A fast and thorough lazy object proxy." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, + {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win32.whl", hash = "sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win32.whl", hash = "sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win32.whl", hash = "sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win32.whl", hash = "sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win32.whl", hash = "sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd"}, + {file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"}, ] [[package]] @@ -356,39 +346,47 @@ files = [ [[package]] name = "numpy" -version = "1.24.2" +version = "1.26.2" description = "Fundamental package for array computing in Python" optional = false -python-versions = ">=3.8" -files = [ - {file = "numpy-1.24.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eef70b4fc1e872ebddc38cddacc87c19a3709c0e3e5d20bf3954c147b1dd941d"}, - {file = "numpy-1.24.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8d2859428712785e8a8b7d2b3ef0a1d1565892367b32f915c4a4df44d0e64f5"}, - {file = "numpy-1.24.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6524630f71631be2dabe0c541e7675db82651eb998496bbe16bc4f77f0772253"}, - {file = "numpy-1.24.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a51725a815a6188c662fb66fb32077709a9ca38053f0274640293a14fdd22978"}, - {file = "numpy-1.24.2-cp310-cp310-win32.whl", hash = "sha256:2620e8592136e073bd12ee4536149380695fbe9ebeae845b81237f986479ffc9"}, - {file = "numpy-1.24.2-cp310-cp310-win_amd64.whl", hash = "sha256:97cf27e51fa078078c649a51d7ade3c92d9e709ba2bfb97493007103c741f1d0"}, - {file = "numpy-1.24.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7de8fdde0003f4294655aa5d5f0a89c26b9f22c0a58790c38fae1ed392d44a5a"}, - {file = "numpy-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4173bde9fa2a005c2c6e2ea8ac1618e2ed2c1c6ec8a7657237854d42094123a0"}, - {file = "numpy-1.24.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cecaed30dc14123020f77b03601559fff3e6cd0c048f8b5289f4eeabb0eb281"}, - {file = "numpy-1.24.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a23f8440561a633204a67fb44617ce2a299beecf3295f0d13c495518908e910"}, - {file = "numpy-1.24.2-cp311-cp311-win32.whl", hash = "sha256:e428c4fbfa085f947b536706a2fc349245d7baa8334f0c5723c56a10595f9b95"}, - {file = "numpy-1.24.2-cp311-cp311-win_amd64.whl", hash = "sha256:557d42778a6869c2162deb40ad82612645e21d79e11c1dc62c6e82a2220ffb04"}, - {file = "numpy-1.24.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d0a2db9d20117bf523dde15858398e7c0858aadca7c0f088ac0d6edd360e9ad2"}, - {file = "numpy-1.24.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c72a6b2f4af1adfe193f7beb91ddf708ff867a3f977ef2ec53c0ffb8283ab9f5"}, - {file = "numpy-1.24.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29e6bd0ec49a44d7690ecb623a8eac5ab8a923bce0bea6293953992edf3a76a"}, - {file = "numpy-1.24.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eabd64ddb96a1239791da78fa5f4e1693ae2dadc82a76bc76a14cbb2b966e96"}, - {file = "numpy-1.24.2-cp38-cp38-win32.whl", hash = "sha256:e3ab5d32784e843fc0dd3ab6dcafc67ef806e6b6828dc6af2f689be0eb4d781d"}, - {file = "numpy-1.24.2-cp38-cp38-win_amd64.whl", hash = "sha256:76807b4063f0002c8532cfeac47a3068a69561e9c8715efdad3c642eb27c0756"}, - {file = "numpy-1.24.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4199e7cfc307a778f72d293372736223e39ec9ac096ff0a2e64853b866a8e18a"}, - {file = "numpy-1.24.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:adbdce121896fd3a17a77ab0b0b5eedf05a9834a18699db6829a64e1dfccca7f"}, - {file = "numpy-1.24.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:889b2cc88b837d86eda1b17008ebeb679d82875022200c6e8e4ce6cf549b7acb"}, - {file = "numpy-1.24.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f64bb98ac59b3ea3bf74b02f13836eb2e24e48e0ab0145bbda646295769bd780"}, - {file = "numpy-1.24.2-cp39-cp39-win32.whl", hash = "sha256:63e45511ee4d9d976637d11e6c9864eae50e12dc9598f531c035265991910468"}, - {file = "numpy-1.24.2-cp39-cp39-win_amd64.whl", hash = "sha256:a77d3e1163a7770164404607b7ba3967fb49b24782a6ef85d9b5f54126cc39e5"}, - {file = "numpy-1.24.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92011118955724465fb6853def593cf397b4a1367495e0b59a7e69d40c4eb71d"}, - {file = "numpy-1.24.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9006288bcf4895917d02583cf3411f98631275bc67cce355a7f39f8c14338fa"}, - {file = "numpy-1.24.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:150947adbdfeceec4e5926d956a06865c1c690f2fd902efede4ca6fe2e657c3f"}, - {file = "numpy-1.24.2.tar.gz", hash = "sha256:003a9f530e880cb2cd177cba1af7220b9aa42def9c4afc2a2fc3ee6be7eb2b22"}, +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f"}, + {file = "numpy-1.26.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75"}, + {file = "numpy-1.26.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe"}, + {file = "numpy-1.26.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523"}, + {file = "numpy-1.26.2-cp310-cp310-win32.whl", hash = "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9"}, + {file = "numpy-1.26.2-cp310-cp310-win_amd64.whl", hash = "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841"}, + {file = "numpy-1.26.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a"}, + {file = "numpy-1.26.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7"}, + {file = "numpy-1.26.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8"}, + {file = "numpy-1.26.2-cp311-cp311-win32.whl", hash = "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186"}, + {file = "numpy-1.26.2-cp311-cp311-win_amd64.whl", hash = "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0"}, + {file = "numpy-1.26.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7"}, + {file = "numpy-1.26.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6"}, + {file = "numpy-1.26.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec"}, + {file = "numpy-1.26.2-cp312-cp312-win32.whl", hash = "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167"}, + {file = "numpy-1.26.2-cp312-cp312-win_amd64.whl", hash = "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef"}, + {file = "numpy-1.26.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3"}, + {file = "numpy-1.26.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210"}, + {file = "numpy-1.26.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36"}, + {file = "numpy-1.26.2-cp39-cp39-win32.whl", hash = "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80"}, + {file = "numpy-1.26.2-cp39-cp39-win_amd64.whl", hash = "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d"}, + {file = "numpy-1.26.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841"}, + {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, ] [[package]] @@ -408,64 +406,53 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pathspec" -version = "0.11.0" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pathspec-0.11.0-py3-none-any.whl", hash = "sha256:3a66eb970cbac598f9e5ccb5b2cf58930cd8e3ed86d393d541eaf2d8b1705229"}, - {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "pexpect" -version = "4.8.0" +version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] [package.dependencies] ptyprocess = ">=0.5" -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -optional = false -python-versions = "*" -files = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] - [[package]] name = "platformdirs" -version = "3.0.0" +version = "4.1.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.0.0-py3-none-any.whl", hash = "sha256:b1d5eb14f221506f50d6604a561f4c5786d9e80355219694a1b244bcd96f4567"}, - {file = "platformdirs-3.0.0.tar.gz", hash = "sha256:8a1228abb1ef82d788f74139988b137e78692984ec7b08eaa6c65f1723af28f9"}, + {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, + {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, ] [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "prompt-toolkit" -version = "3.0.36" +version = "3.0.43" description = "Library for building powerful interactive command lines in Python" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.36-py3-none-any.whl", hash = "sha256:aa64ad242a462c5ff0363a7b9cfe696c20d55d9fc60c11fd8e632d064804d305"}, - {file = "prompt_toolkit-3.0.36.tar.gz", hash = "sha256:3e163f254bef5a03b146397d7c1963bd3e2812f0964bb9a24e6ec761fd28db63"}, + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, ] [package.dependencies] @@ -498,31 +485,32 @@ tests = ["pytest"] [[package]] name = "pygments" -version = "2.15.0" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.15.0-py3-none-any.whl", hash = "sha256:77a3299119af881904cd5ecd1ac6a66214b6e9bed1f2db16993b54adede64094"}, - {file = "Pygments-2.15.0.tar.gz", hash = "sha256:f7e36cffc4c517fbc252861b9a6e4644ca0e5abadf9a113c72d1358ad09b9500"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pylint" -version = "2.16.2" +version = "2.17.7" description = "python code static checker" optional = false python-versions = ">=3.7.2" files = [ - {file = "pylint-2.16.2-py3-none-any.whl", hash = "sha256:ff22dde9c2128cd257c145cfd51adeff0be7df4d80d669055f24a962b351bbe4"}, - {file = "pylint-2.16.2.tar.gz", hash = "sha256:13b2c805a404a9bf57d002cd5f054ca4d40b0b87542bdaba5e05321ae8262c84"}, + {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, + {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, ] [package.dependencies] -astroid = ">=2.14.2,<=2.16.0-dev0" +astroid = ">=2.15.8,<=2.17.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, @@ -541,41 +529,45 @@ testutils = ["gitpython (>3)"] [[package]] name = "scipy" -version = "1.9.3" +version = "1.11.4" description = "Fundamental algorithms for scientific computing in Python" optional = false -python-versions = ">=3.8" -files = [ - {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, - {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"}, - {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"}, - {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"}, - {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"}, - {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, - {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, +python-versions = ">=3.9" +files = [ + {file = "scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710"}, + {file = "scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41"}, + {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4"}, + {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56"}, + {file = "scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446"}, + {file = "scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3"}, + {file = "scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be"}, + {file = "scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8"}, + {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c"}, + {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff"}, + {file = "scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993"}, + {file = "scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd"}, + {file = "scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6"}, + {file = "scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d"}, + {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4"}, + {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79"}, + {file = "scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660"}, + {file = "scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97"}, + {file = "scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7"}, + {file = "scipy-1.11.4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec"}, + {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea"}, + {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937"}, + {file = "scipy-1.11.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd"}, + {file = "scipy-1.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65"}, + {file = "scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa"}, ] [package.dependencies] -numpy = ">=1.18.5,<1.26.0" +numpy = ">=1.21.6,<1.28.0" [package.extras] -dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] -doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] -test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "six" @@ -590,13 +582,13 @@ files = [ [[package]] name = "stack-data" -version = "0.6.2" +version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" files = [ - {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, - {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, ] [package.dependencies] @@ -609,13 +601,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "svgpathtools" -version = "1.6.0" +version = "1.6.1" description = "A collection of tools for manipulating and analyzing SVG Path objects and Bezier curves." optional = false python-versions = "*" files = [ - {file = "svgpathtools-1.6.0-py2.py3-none-any.whl", hash = "sha256:b046301769de58fe3d35a3f633914455b5bafba52dddfe0a41ec57ac1bcb9439"}, - {file = "svgpathtools-1.6.0.tar.gz", hash = "sha256:c0b934eed29acaeb09988afb4d15c5984366847236e21b80c079d8edb5ac0c4e"}, + {file = "svgpathtools-1.6.1-py2.py3-none-any.whl", hash = "sha256:39967f9a817b8a12cc6dd1646fc162d522fca6c3fd5f8c94913c15ee4cb3a906"}, + {file = "svgpathtools-1.6.1.tar.gz", hash = "sha256:7054e6de1953e295bf565d535d585695453b09f8db4a2f7c4853348732097a3e"}, ] [package.dependencies] @@ -647,123 +639,129 @@ files = [ [[package]] name = "tomlkit" -version = "0.11.6" +version = "0.12.3" description = "Style preserving TOML library" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, - {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, + {file = "tomlkit-0.12.3-py3-none-any.whl", hash = "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba"}, + {file = "tomlkit-0.12.3.tar.gz", hash = "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"}, ] [[package]] name = "traitlets" -version = "5.9.0" +version = "5.14.0" description = "Traitlets Python configuration system" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, - {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, + {file = "traitlets-5.14.0-py3-none-any.whl", hash = "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33"}, + {file = "traitlets-5.14.0.tar.gz", hash = "sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "typing-extensions" -version = "4.5.0" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.9.0" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, - {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] [[package]] name = "wcwidth" -version = "0.2.6" +version = "0.2.12" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, + {file = "wcwidth-0.2.12-py2.py3-none-any.whl", hash = "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c"}, + {file = "wcwidth-0.2.12.tar.gz", hash = "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02"}, ] [[package]] name = "wrapt" -version = "1.14.1" +version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, - {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, - {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, - {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, - {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, - {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, - {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, - {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, - {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, - {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, - {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, - {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, - {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, - {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, - {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, - {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] [metadata] From 78afb12997ddeaf8a8c80e2643bee3828b7cc2b9 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 09:00:34 +0100 Subject: [PATCH 052/249] Use ExtractIDFragment function --- src/preparedatafunctor.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/preparedatafunctor.cpp b/src/preparedatafunctor.cpp index e33f0daa2fd..bf6a106a6e3 100644 --- a/src/preparedatafunctor.cpp +++ b/src/preparedatafunctor.cpp @@ -380,8 +380,7 @@ FunctorCode PrepareFacsimileFunctor::VisitObject(Object *object) FacsimileInterface *interface = object->GetFacsimileInterface(); assert(interface); if (interface->HasFacs()) { - std::string facsID = ((interface->GetFacs().compare(0, 1, "#") == 0) ? interface->GetFacs().substr(1) - : interface->GetFacs()); + std::string facsID = ExtractIDFragment(interface->GetFacs()); Zone *zone = m_facsimile->FindZoneByID(facsID); if (zone != NULL) { interface->AttachZone(zone); From d449c0a96c6d0529d73d287a4cae1cb7b52f9431 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 16 May 2023 14:23:47 -0400 Subject: [PATCH 053/249] pass neon path as command line argument --- emscripten/testNeon.sh | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 emscripten/testNeon.sh diff --git a/emscripten/testNeon.sh b/emscripten/testNeon.sh new file mode 100644 index 00000000000..0158466bf4a --- /dev/null +++ b/emscripten/testNeon.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# This is a little script that compiles verovio using buildToolkit +# and moves the output, verovio.js, into Neon/verovio-util. +# It then starts up a local instance of Neon using yarn so the +# developer can see the changes as soon as possible. +# Please change [location_of_your_Neon] with the actual path. +# For example: ~/Desktop/DDMAL + + +# Builds verovio for Neon +./buildToolkit -x "Gootville,Petaluma" -DHPX + +cd build + +# Moves the needed verovio.js into Neon +cp verovio.js verovio_new.js + +mv verovio_new.js /Users/yinanzhou/SIMSSA/Neon/verovio-util + +cd /Users/yinanzhou/SIMSSA/Neon/verovio-util + +rm verovio.js; mv verovio_new.js verovio.js + +# Runs Neon +yarn build && yarn start \ No newline at end of file From 9f8ef22d9fc68a74a95d6de1ea1973c40be4bbfb Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Wed, 5 Jul 2023 16:30:52 -0400 Subject: [PATCH 054/249] Remove testNeon.sh from git --- emscripten/testNeon.sh | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 emscripten/testNeon.sh diff --git a/emscripten/testNeon.sh b/emscripten/testNeon.sh deleted file mode 100644 index 0158466bf4a..00000000000 --- a/emscripten/testNeon.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -# This is a little script that compiles verovio using buildToolkit -# and moves the output, verovio.js, into Neon/verovio-util. -# It then starts up a local instance of Neon using yarn so the -# developer can see the changes as soon as possible. -# Please change [location_of_your_Neon] with the actual path. -# For example: ~/Desktop/DDMAL - - -# Builds verovio for Neon -./buildToolkit -x "Gootville,Petaluma" -DHPX - -cd build - -# Moves the needed verovio.js into Neon -cp verovio.js verovio_new.js - -mv verovio_new.js /Users/yinanzhou/SIMSSA/Neon/verovio-util - -cd /Users/yinanzhou/SIMSSA/Neon/verovio-util - -rm verovio.js; mv verovio_new.js verovio.js - -# Runs Neon -yarn build && yarn start \ No newline at end of file From e6bc31854e78fff0d8fd126fc97181bb743bab32 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 10 Jul 2023 11:49:20 -0400 Subject: [PATCH 055/249] MatchHeight editor action for bbox --- include/vrv/editortoolkit_neume.h | 2 + src/editortoolkit_neume.cpp | 80 +++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/include/vrv/editortoolkit_neume.h b/include/vrv/editortoolkit_neume.h index dfeb65043e5..a31242d2970 100644 --- a/include/vrv/editortoolkit_neume.h +++ b/include/vrv/editortoolkit_neume.h @@ -44,6 +44,7 @@ class EditorToolkitNeume : public EditorToolkit { bool Insert(std::string elementType, std::string staffId, int ulx, int uly, int lrx, int lry, std::vector> attributes); bool InsertToSyllable(std::string elementId); + bool MatchHeight(std::string elementId); bool Merge(std::vector elementIds); bool MoveOutsideSyllable(std::string elementId); bool Set(std::string elementId, std::string attrType, std::string attrValue); @@ -72,6 +73,7 @@ class EditorToolkitNeume : public EditorToolkit { bool ParseInsertAction(jsonxx::Object param, std::string *elementType, std::string *staffId, int *ulx, int *uly, int *lrx, int *lry, std::vector> *attributes); bool ParseInsertToSyllableAction(jsonxx::Object param, std::string *elementId); + bool ParseMatchHeightAction(jsonxx::Object param, std::string *elementId); bool ParseMergeAction(jsonxx::Object param, std::vector *elementIds); bool ParseMoveOutsideSyllableAction(jsonxx::Object param, std::string *elementId); bool ParseSetAction(jsonxx::Object param, std::string *elementId, std::string *attrType, std::string *attrValue); diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index e355c23fd64..880c7b4454c 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -184,6 +184,13 @@ bool EditorToolkitNeume::ParseEditorAction(const std::string &json_editorAction) return this->SplitNeume(elementId, ncId); } } + else if (action == "matchHeight") { + std::string elementId; + if (this->ParseMatchHeightAction(json.get("param"), &elementId)) { + return this->MatchHeight(elementId); + } + LogWarning("Could not parse the insert action"); + } else if (action == "merge") { std::vector elementIds; if (this->ParseMergeAction(json.get("param"), &elementIds)) { @@ -1595,6 +1602,72 @@ bool EditorToolkitNeume::DisplaceClefOctave(std::string elementId, std::string d return true; } +bool EditorToolkitNeume::MatchHeight(std::string elementId) +{ + if (!m_doc->GetDrawingPage()) { + LogError("Could not get drawing page"); + m_infoObject.import("status", "FAILURE"); + m_infoObject.import("message", "Could not get drawing page."); + return false; + } + if (m_doc->GetType() != Facs) { + LogError("Drawing page without facsimile"); + m_infoObject.import("status", "FAILURE"); + m_infoObject.import("message", "Drawing page without facsimile is unsupported."); + return false; + } + + Object *element = m_doc->GetDrawingPage()->FindDescendantByID(elementId); + assert(element); + Object *staffParent = element->GetFirstAncestor(STAFF); + if (element == NULL) { + LogError("No element exists with ID '%s'.", elementId.c_str()); + m_infoObject.import("status", "FAILURE"); + m_infoObject.import("message", "No element exists with ID" + elementId + "."); + return false; + } + if (!element->Is(SYL)) { + LogError("Element is of type %s, but only element can match height.", element->GetClassName().c_str()); + m_infoObject.import("status", "FAILURE"); + m_infoObject.import( + "message", "Element is of type " + element->GetClassName() + ", but only element can match height."); + return false; + } + + // get the position of the selected bbox + int uly; + int lry; + if (dynamic_cast(element)->HasFacs()) { + uly = element->GetFacsimileInterface()->GetZone()->GetUly(); + lry = element->GetFacsimileInterface()->GetZone()->GetLry(); + } + else { + LogError("Selected '%s' without facsimile", element->GetClassName().c_str()); + m_infoObject.import("status", "FAILURE"); + m_infoObject.import("message", "Selected '" + element->GetClassName() + "' without facsimile is unsupported."); + return false; + } + + // find all syls in staff + ListOfObjects syls; + ClassIdComparison ac(SYL); + staffParent->FindAllDescendantsByComparison(&syls, &ac); + Syl *syl; + Zone *zone; + + for (auto it = syls.begin(); it != syls.end(); ++it) { + syl = dynamic_cast(*it); + zone = syl->GetFacsimileInterface()->GetZone(); + assert(zone); + zone->SetUly(uly); + zone->SetLry(lry); + } + + m_infoObject.import("status", "OK"); + m_infoObject.import("message", ""); + return true; +} + bool EditorToolkitNeume::Merge(std::vector elementIds) { if (!m_doc->GetDrawingPage()) return false; @@ -3776,6 +3849,13 @@ bool EditorToolkitNeume::ParseDisplaceClefAction(jsonxx::Object param, std::stri return true; } +bool EditorToolkitNeume::ParseMatchHeightAction(jsonxx::Object param, std::string *elementId) +{ + if (!param.has("elementId")) return false; + (*elementId) = param.get("elementId"); + return true; +} + bool EditorToolkitNeume::ParseMergeAction(jsonxx::Object param, std::vector *elementIds) { if (!param.has("elementIds")) return false; From f41a0a0f88707da27de4e2e9f5406b97d0af89db Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Wed, 12 Jul 2023 17:25:17 -0400 Subject: [PATCH 056/249] Add overlap correction on x-axis --- src/editortoolkit_neume.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 880c7b4454c..b0692ef2e3a 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -1654,11 +1654,25 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) staffParent->FindAllDescendantsByComparison(&syls, &ac); Syl *syl; Zone *zone; + int rightMost = -1; + int itUlx; + int itLrx; for (auto it = syls.begin(); it != syls.end(); ++it) { syl = dynamic_cast(*it); zone = syl->GetFacsimileInterface()->GetZone(); assert(zone); + + // adjust x-axis first + itUlx = zone->GetUlx(); + itLrx = zone->GetLrx(); + if (itLrx > rightMost) { + // correct overlap + if (itUlx < rightMost) zone->SetUlx(rightMost); + // Update right most point if needed + rightMost = itLrx; + } + zone->SetUly(uly); zone->SetLry(lry); } From 23057412c0e701b1572f6fa7d5b1851ea823add0 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Thu, 13 Jul 2023 15:14:05 -0400 Subject: [PATCH 057/249] Add staff rotation offset --- src/editortoolkit_neume.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index b0692ef2e3a..7df8954643e 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -1635,11 +1635,15 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) } // get the position of the selected bbox + int ulx; int uly; - int lry; + int height; + int lrx; if (dynamic_cast(element)->HasFacs()) { + ulx = element->GetFacsimileInterface()->GetZone()->GetUlx(); uly = element->GetFacsimileInterface()->GetZone()->GetUly(); - lry = element->GetFacsimileInterface()->GetZone()->GetLry(); + lrx = element->GetFacsimileInterface()->GetZone()->GetLrx(); + height = element->GetFacsimileInterface()->GetZone()->GetLry() - uly; } else { LogError("Selected '%s' without facsimile", element->GetClassName().c_str()); @@ -1654,9 +1658,11 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) staffParent->FindAllDescendantsByComparison(&syls, &ac); Syl *syl; Zone *zone; - int rightMost = -1; int itUlx; int itLrx; + int offsetY; + int rightMost = -1; + double theta = staffParent->GetFacsimileInterface()->GetZone()->GetRotate(); for (auto it = syls.begin(); it != syls.end(); ++it) { syl = dynamic_cast(*it); @@ -1673,8 +1679,14 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) rightMost = itLrx; } - zone->SetUly(uly); - zone->SetLry(lry); + offsetY = 0; + if (theta) { + double factor = 1.3; + offsetY = (int)((itUlx - ulx) * tan(theta * M_PI / 180.0) / factor); + } + + zone->SetUly(uly + offsetY); + zone->SetLry(uly + offsetY + height); } m_infoObject.import("status", "OK"); From 187d98256fa5bfeb532ff5e7701f48a32cd316fb Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Thu, 13 Jul 2023 16:50:21 -0400 Subject: [PATCH 058/249] Adjust original bbox size for ungrouping --- src/editortoolkit_neume.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 7df8954643e..3747bcba517 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2987,6 +2987,10 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector // if the element is a syl then we want to keep it attached to the first node if (el->Is(SYL)) { + Zone *zone = dynamic_cast(el->GetFacsimileInterface()->GetZone()); + + zone->SetLrx(zone->GetUlx() + 100); + zone->SetLry(zone->GetUly() + 200); continue; } From 81fd49f34631a8477e15024527203a7e9997957e Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Fri, 14 Jul 2023 15:20:47 -0400 Subject: [PATCH 059/249] Fix ungroup when syllable start with layer element --- src/editortoolkit_neume.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 3747bcba517..3979269ad3d 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2931,8 +2931,10 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector sparent->ReorderByXPos(); fparent->ClearRelinquishedChildren(); fparent->ReorderByXPos(); + uuidArray << (*it); + it = elementIds.erase(it); + el = m_doc->GetDrawingPage()->FindDescendantByID(*it); } - continue; } if (elementIds.begin() == it || firstIsSyl) { // if the element is a syl we want it to stay attached to the first element From dea073b10e8209e762547bfdafb3c0375198b065 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Fri, 14 Jul 2023 16:12:22 -0400 Subject: [PATCH 060/249] Clean up comments --- src/editortoolkit_neume.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 3979269ad3d..ec0430a7b29 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2996,12 +2996,6 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector continue; } - // if (el->Is(DIVLINE) || el->Is(ACCID)) { - // el->MoveItselfTo(sparent); - // fparent->ClearRelinquishedChildren(); - // continue; - // } - if (groupType == "nc") { Nc *nc = dynamic_cast(el); assert(nc); @@ -3095,15 +3089,11 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector FacsimileInterface *fi = syl->GetFacsimileInterface(); assert(fi); fi->AttachZone(zone); - - // syl->ResetFacsimile(); - // syl->SetFacs(zone->GetID()); } } if (ligNum != 1) { // if not 1st nc in ligature, add child - uuidArray << newParent->GetID(); sparent->AddChild(newParent); From 89321b8033222ddac0e4cf059bf6dfbad50f0499 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 24 Jul 2023 16:22:34 -0400 Subject: [PATCH 061/249] Refactor ungroup bbox --- src/editortoolkit_neume.cpp | 67 +++++++++---------------------------- 1 file changed, 15 insertions(+), 52 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index ec0430a7b29..c0f63cfee33 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2844,6 +2844,7 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector int ligNum = 0; // for ligature in ungroupNcs int firstIsLig = false; bool firstIsSyl = false; + Zone *oldSylZone = NULL; Clef *oldClef = NULL; ClassIdComparison ac(CLEF); ListOfObjects syllables; // List of syllables used. groupType=neume only. @@ -2976,6 +2977,9 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector if (oldClef == NULL) { oldClef = dynamic_cast(sparent)->GetCurrentClef(); } + + // Get orginal syl zone + oldSylZone = dynamic_cast(currentParent->GetFirst(SYL)->GetFacsimileInterface()->GetZone()); } else { @@ -2989,10 +2993,9 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector // if the element is a syl then we want to keep it attached to the first node if (el->Is(SYL)) { - Zone *zone = dynamic_cast(el->GetFacsimileInterface()->GetZone()); - - zone->SetLrx(zone->GetUlx() + 100); - zone->SetLry(zone->GetUly() + 200); + if (oldSylZone) { + oldSylZone->SetLrx(oldSylZone->GetUlx() + 100); + } continue; } @@ -3034,55 +3037,15 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector if (m_doc->GetType() == Facs) { Zone *zone = new Zone(); - // Use syllable parent positions if possible - FacsimileInterface *syllableFi = NULL; - if (syl->GetFirstAncestor(SYLLABLE)->GetFacsimileInterface()->HasFacs()) { - syllableFi = syl->GetFirstAncestor(SYLLABLE)->GetFacsimileInterface(); - Zone *tempZone = dynamic_cast(syllableFi->GetZone()); - zone->SetUlx(tempZone->GetUlx()); - zone->SetUly(tempZone->GetUly()); - zone->SetLrx(tempZone->GetLrx()); - zone->SetLry(tempZone->GetLry()); - } - // otherwise get a boundingbox that comprises all the neumes in the syllable - else { - ListOfObjects children; - InterfaceComparison comp(INTERFACE_FACSIMILE); - syl->GetFirstAncestor(SYLLABLE)->FindAllDescendantsByComparison(&children, &comp); - for (auto iter2 = children.begin(); iter2 != children.end(); ++iter2) { - FacsimileInterface *temp = (*iter2)->GetFacsimileInterface(); - assert(temp); - Zone *tempZone = vrv_cast(temp->GetZone()); - assert(tempZone); - if (temp->HasFacs()) { - if (syllableFi == NULL) { - zone->SetUlx(tempZone->GetUlx()); - zone->SetUly(tempZone->GetUly()); - zone->SetLrx(tempZone->GetLrx()); - zone->SetLry(tempZone->GetLry()); - } - else { - if (tempZone->GetUlx() < zone->GetUlx()) { - zone->SetUlx(tempZone->GetUlx()); - } - if (tempZone->GetUly() < zone->GetUly()) { - zone->SetUly(tempZone->GetUly()); - } - if (tempZone->GetLrx() > zone->GetLrx()) { - zone->SetLrx(tempZone->GetLrx()); - } - if (tempZone->GetLry() > zone->GetLry()) { - zone->SetLry(tempZone->GetLry()); - } - } - } - } - } + zone->SetUlx(el->GetFirst(NC)->GetFacsimileInterface()->GetZone()->GetUlx()); + zone->SetUly(oldSylZone->GetUly()); + zone->SetLrx(el->GetLast(NC)->GetFacsimileInterface()->GetZone()->GetLrx()); + zone->SetLry(oldSylZone->GetLry()); - // make the bounding box a little bigger and lower so it's easier to edit - zone->SetUly(zone->GetUly() + 100); - zone->SetLrx(zone->GetLrx() + 100); - zone->SetLry(zone->GetLry() + 200); + // Make bbox larger if it has less than 2 ncs + if (newParent->GetChildCount(NC, 2) <= 2) { + zone->SetLrx(zone->GetLrx() + 50); + } assert(m_doc->GetFacsimile()); m_doc->GetFacsimile()->FindDescendantByType(SURFACE)->AddChild(zone); From 9cb464b86377993d3c7a4304af6c949d7b1fd63b Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 24 Jul 2023 16:23:34 -0400 Subject: [PATCH 062/249] Clean up --- src/editortoolkit_neume.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index c0f63cfee33..a08fb58f098 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2949,7 +2949,6 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector Nc *nc = dynamic_cast(el); assert(nc); if (nc->HasLigated() && nc->GetLigated() == BOOLEAN_true) { - // ligNum++; firstIsLig = true; } @@ -3002,7 +3001,6 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector if (groupType == "nc") { Nc *nc = dynamic_cast(el); assert(nc); - // if (nc->HasLigated()) continue; if (firstIsLig) { // if 1st is ligature, neglect 2nd, go to the next nc From b302f3e76f9356a9cafe9160b83c0c53c0aa9c3e Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 25 Jul 2023 11:30:52 -0400 Subject: [PATCH 063/249] Remove x-axis adjustment --- src/editortoolkit_neume.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index a08fb58f098..30e4e7b5794 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -1659,9 +1659,9 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) Syl *syl; Zone *zone; int itUlx; - int itLrx; + // int itLrx; int offsetY; - int rightMost = -1; + // int rightMost = -1; double theta = staffParent->GetFacsimileInterface()->GetZone()->GetRotate(); for (auto it = syls.begin(); it != syls.end(); ++it) { @@ -1669,17 +1669,18 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) zone = syl->GetFacsimileInterface()->GetZone(); assert(zone); - // adjust x-axis first - itUlx = zone->GetUlx(); - itLrx = zone->GetLrx(); - if (itLrx > rightMost) { - // correct overlap - if (itUlx < rightMost) zone->SetUlx(rightMost); - // Update right most point if needed - rightMost = itLrx; - } + // // adjust x-axis first + // itUlx = zone->GetUlx(); + // itLrx = zone->GetLrx(); + // if (itLrx > rightMost) { + // // correct overlap + // if (itUlx < rightMost) zone->SetUlx(rightMost); + // // Update right most point if needed + // rightMost = itLrx; + // } offsetY = 0; + itUlx = zone->GetUlx(); if (theta) { double factor = 1.3; offsetY = (int)((itUlx - ulx) * tan(theta * M_PI / 180.0) / factor); From 92fe5f6d70e5e64da3b3997339683dc36636ba06 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Thu, 27 Jul 2023 16:57:47 -0400 Subject: [PATCH 064/249] Fix ungroup when firstIsSyl --- src/editortoolkit_neume.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 30e4e7b5794..9188864f0bb 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2943,6 +2943,10 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector // we'll still need to initialize all the parents, thus the bool if (el->Is(SYL)) { firstIsSyl = true; + oldSylZone = dynamic_cast(el->GetFacsimileInterface()->GetZone()); + if (oldSylZone) { + oldSylZone->SetLrx(oldSylZone->GetUlx() + 100); + } continue; } else if (groupType == "nc") { @@ -2979,7 +2983,9 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector } // Get orginal syl zone - oldSylZone = dynamic_cast(currentParent->GetFirst(SYL)->GetFacsimileInterface()->GetZone()); + if (!oldSylZone) { + oldSylZone = dynamic_cast(currentParent->GetFirst(SYL)->GetFacsimileInterface()->GetZone()); + } } else { From a0e3dcdf9c649c7dcceb8a3f8df224d41603e418 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Fri, 28 Jul 2023 17:17:43 -0400 Subject: [PATCH 065/249] Remove redundant new syl for insert action --- src/editortoolkit_neume.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 9188864f0bb..abef4f7c69f 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -875,8 +875,6 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in if (m_doc->GetType() == Facs) { FacsimileInterface *fi = vrv_cast(syl->GetFacsimileInterface()); assert(fi); - Text *text = new Text(); - syl->AddChild(text); Zone *sylZone = new Zone(); // calculate bboxUlx and bboxUly wrt rotation using sine rule From 0b26cc73174a1204280ff2fc877d8d42646d4dca Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Sun, 30 Jul 2023 16:46:13 -0400 Subject: [PATCH 066/249] Remove unnecessary doubleParent check --- src/editortoolkit_neume.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index abef4f7c69f..9bf1655b406 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2647,16 +2647,14 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e // also in this case we need to make sure that the facsimile of the resulting syl is correct else { if (elementClass == NC) { - if (doubleParent) { - parent = new Neume(); - for (auto it = elements.begin(); it != elements.end(); ++it) { - if ((*it)->GetParent() != parent && !(*it)->Is(SYL)) { - (*it)->MoveItselfTo(parent); - parent->ReorderByXPos(); - } + parent = new Neume(); + for (auto it = elements.begin(); it != elements.end(); ++it) { + if ((*it)->GetParent() != parent && !(*it)->Is(SYL)) { + (*it)->MoveItselfTo(parent); + parent->ReorderByXPos(); } - doubleParent->AddChild(parent); } + doubleParent->AddChild(parent); Layer *layer = dynamic_cast(parent->GetFirstAncestor(LAYER)); if (!layer) { From 682d11d91a259010d35b81ee7e553d40fd80f0a8 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Sun, 30 Jul 2023 16:50:29 -0400 Subject: [PATCH 067/249] Rename doubleParent to secondParent --- src/editortoolkit_neume.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 9bf1655b406..057d536f5ae 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2313,7 +2313,7 @@ bool EditorToolkitNeume::Resize(std::string elementId, int ulx, int uly, int lrx bool EditorToolkitNeume::Group(std::string groupType, std::vector elementIds) { - Object *parent = NULL, *doubleParent = NULL; + Object *parent = NULL, *secondParent = NULL; std::map parents; std::set elements; std::vector sortedElements; @@ -2440,9 +2440,9 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } - if (doubleParent == NULL) { - doubleParent = par->GetParent(); - if (doubleParent == NULL) { + if (secondParent == NULL) { + secondParent = par->GetParent(); + if (secondParent == NULL) { LogError("No second level parent!"); m_infoObject.import("status", "FAILURE"); m_infoObject.import("message", "No second level parent."); @@ -2450,7 +2450,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } else { - if (par->GetParent() != doubleParent) { + if (par->GetParent() != secondParent) { LogError("No shared second level parent!"); m_infoObject.import("status", "FAILURE"); m_infoObject.import("message", "No shared second level parent."); @@ -2619,10 +2619,10 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } parent->ReorderByXPos(); - if (doubleParent == NULL) { + if (secondParent == NULL) { return false; } - doubleParent->AddChild(parent); + secondParent->AddChild(parent); Layer *layer = vrv_cast(parent->GetFirstAncestor(LAYER)); assert(layer); @@ -2654,7 +2654,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e parent->ReorderByXPos(); } } - doubleParent->AddChild(parent); + secondParent->AddChild(parent); Layer *layer = dynamic_cast(parent->GetFirstAncestor(LAYER)); if (!layer) { @@ -2732,11 +2732,11 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } - if (doubleParent == NULL) { + if (secondParent == NULL) { LogError("No second level parent!"); return false; } - doubleParent->AddChild(fullSyllable); + secondParent->AddChild(fullSyllable); Layer *layer = vrv_cast(fullSyllable->GetFirstAncestor(LAYER)); assert(layer); if (ulx >= 0 && uly >= 0 && lrx >= 0 && lry >= 0) { @@ -2778,11 +2778,11 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e Object *obj = (*it).first; obj->ClearRelinquishedChildren(); if (obj->GetChildCount() == 0) { - if (doubleParent == NULL) { + if (secondParent == NULL) { LogError("No second level parent!"); return false; } - doubleParent->DeleteChild(obj); + secondParent->DeleteChild(obj); } else if (obj->GetChildCount() == (obj->GetChildCount(SYL) + obj->GetChildCount(DIVLINE) + obj->GetChildCount(ACCID) @@ -2806,11 +2806,11 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e parent->ReorderByXPos(); obj->ClearRelinquishedChildren(); } - if (doubleParent == NULL) { + if (secondParent == NULL) { LogError("No second level parent!"); return false; } - doubleParent->DeleteChild(obj); + secondParent->DeleteChild(obj); } } From 6d29f65d6f501249002aaea1981e33a08f012d4b Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Sun, 30 Jul 2023 16:57:04 -0400 Subject: [PATCH 068/249] Optimize parents counting --- src/editortoolkit_neume.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 057d536f5ae..db13d027509 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2457,13 +2457,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e return false; } } - auto possibleEntry = parents.find(el->GetParent()); - if (possibleEntry == parents.end()) { - parents.emplace(el->GetParent(), 1); - } - else { - possibleEntry->second += 1; - } + parents[par]++; elements.insert(el); } From ee769848d8bd7adfb7a8312949d2f7d369dbe6ce Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Sun, 30 Jul 2023 16:59:10 -0400 Subject: [PATCH 069/249] Clean up --- src/editortoolkit_neume.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index db13d027509..695156fd75e 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2474,16 +2474,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e return false; } - // auto it = elementIds.begin(); - // Object *el = m_doc->GetDrawingPage()->FindDescendantByID(*it); - // Layer *layer = dynamic_cast(el->GetFirstAncestor(LAYER)); - // if (!layer) { - // LogError("Elements does not have Layer parent. This should not happen."); - // m_infoObject.import("status", "FAILURE"); - // m_infoObject.import("message", "Elements does not have Layer parent."); - // return false; - // } - std::copy(elements.begin(), elements.end(), std::back_inserter(sortedElements)); std::stable_sort(sortedElements.begin(), sortedElements.end(), Object::sortByUlx); From affe5b4d1d187a8ccecac8c6959b64eafe258ef1 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Sun, 30 Jul 2023 17:18:21 -0400 Subject: [PATCH 070/249] Remove unnecessary conversion --- src/editortoolkit_neume.cpp | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 695156fd75e..df5d45d534e 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2315,8 +2315,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e { Object *parent = NULL, *secondParent = NULL; std::map parents; - std::set elements; - std::vector sortedElements; + ListOfObjects elements; std::vector fullParents; std::map clefsBefore; @@ -2458,7 +2457,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } parents[par]++; - elements.insert(el); + elements.push_back(el); } if (parents.size() == 0) { @@ -2474,34 +2473,29 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e return false; } - std::copy(elements.begin(), elements.end(), std::back_inserter(sortedElements)); - std::stable_sort(sortedElements.begin(), sortedElements.end(), Object::sortByUlx); - ListOfObjects clefs; - std::set syllables; - ListOfObjects sortedSyllables; + ListOfObjects syllables; ClassIdComparison clefComp(CLEF); InterfaceComparison pitchComp(INTERFACE_PITCH); Clef *newClef = NULL; - m_doc->GetDrawingPage()->FindAllDescendantsBetween(&clefs, &clefComp, - sortedElements.front()->GetFirstAncestor(SYLLABLE), sortedElements.back()->GetFirstAncestor(SYLLABLE)); + m_doc->GetDrawingPage()->FindAllDescendantsBetween( + &clefs, &clefComp, elements.front()->GetFirstAncestor(SYLLABLE), elements.back()->GetFirstAncestor(SYLLABLE)); // if there are clefs between the elements getting grouped // some elements will need their pitch adjusted for the new clef // clefsBefore maps the syllable parent to its clef before the group // so we can reassociate any pitched children from their old clef to the new one if (clefs.size() != 0) { - for (auto it = sortedElements.begin(); it != sortedElements.end(); ++it) { + for (auto it = elements.begin(); it != elements.end(); ++it) { if ((*it)->Is(SYLLABLE)) { - syllables.insert(dynamic_cast(*it)); + syllables.push_back(dynamic_cast(*it)); } else { - syllables.insert((*it)->GetFirstAncestor(SYLLABLE)); + syllables.push_back((*it)->GetFirstAncestor(SYLLABLE)); } } - std::copy(syllables.begin(), syllables.end(), std::back_inserter(sortedSyllables)); - for (auto it = sortedSyllables.begin(); it != sortedSyllables.end(); ++it) { + for (auto it = syllables.begin(); it != syllables.end(); ++it) { Clef *tempClef = dynamic_cast(m_doc->GetDrawingPage()->FindPreviousChild(&clefComp, (*it))); if (tempClef == NULL) { Layer *layer = vrv_cast((*it)->GetFirstAncestor(LAYER)); @@ -2509,7 +2503,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } clefsBefore.insert(std::pair(dynamic_cast(*it), tempClef)); } - newClef = clefsBefore[dynamic_cast(sortedSyllables.front())]; + newClef = clefsBefore[dynamic_cast(syllables.front())]; } // find parents where all of their children are being grouped @@ -2745,8 +2739,8 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e // change the pitch of any pitched elements whose clef may have changed assert(newClef); ListOfObjects pitchedChildren; - if (sortedSyllables.size()) { - for (auto it = sortedSyllables.begin(); it != sortedSyllables.end(); ++it) { + if (syllables.size()) { + for (auto it = syllables.begin(); it != syllables.end(); ++it) { Syllable *syllable = dynamic_cast(*it); if (clefsBefore[syllable] != newClef) { syllable->FindAllDescendantsByComparison(&pitchedChildren, &pitchComp); From 88a7b37405dd8a5a01acdf84ba73d8c1bdc35683 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 31 Jul 2023 11:28:45 -0400 Subject: [PATCH 071/249] Move second level parent check --- src/editortoolkit_neume.cpp | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index df5d45d534e..6ea4fb0bda8 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2439,23 +2439,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } - if (secondParent == NULL) { - secondParent = par->GetParent(); - if (secondParent == NULL) { - LogError("No second level parent!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No second level parent."); - return false; - } - } - else { - if (par->GetParent() != secondParent) { - LogError("No shared second level parent!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No shared second level parent."); - return false; - } - } parents[par]++; elements.push_back(el); } @@ -2506,11 +2489,25 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e newClef = clefsBefore[dynamic_cast(syllables.front())]; } + // check if share second level parent + secondParent = (*parents.begin()).first->GetParent(); + if (secondParent == NULL) { + LogError("No second level parent!"); + m_infoObject.import("status", "FAILURE"); + m_infoObject.import("message", "No second level parent."); + return false; + } // find parents where all of their children are being grouped for (auto it = parents.begin(); it != parents.end(); ++it) { auto parentPair = *it; Object *par = parentPair.first; int expected; + if (par->GetParent() != secondParent) { + LogError("No shared second level parent!"); + m_infoObject.import("status", "FAILURE"); + m_infoObject.import("message", "No shared second level parent."); + return false; + } if (par->GetClassId() == SYLLABLE) { expected = par->GetChildCount(NEUME); } From 3c91687ea8a32945e2d59fe240e24686a949c0e5 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 31 Jul 2023 11:29:17 -0400 Subject: [PATCH 072/249] Clean up --- src/editortoolkit_neume.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 6ea4fb0bda8..1bbc257c66c 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2587,9 +2587,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e FacsimileInterface *fi = vrv_cast((*syl).GetFacsimileInterface()); assert(fi); fi->AttachZone(zone); - - // syl->ResetFacsimile(); - // syl->SetFacs(zone->GetID()); } } From 8cc6061ae3bbeae18476b70b19567744f430769b Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 31 Jul 2023 11:30:22 -0400 Subject: [PATCH 073/249] Remove unnecessary second level parent check --- src/editortoolkit_neume.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 1bbc257c66c..3ca84d14d52 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2591,9 +2591,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } parent->ReorderByXPos(); - if (secondParent == NULL) { - return false; - } secondParent->AddChild(parent); Layer *layer = vrv_cast(parent->GetFirstAncestor(LAYER)); From 08c4dcf939e08bb714bc3a7e7a52008b5d3d001a Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 31 Jul 2023 13:14:45 -0400 Subject: [PATCH 074/249] Simplify syl zone calculation --- src/editortoolkit_neume.cpp | 57 +++++++++++++------------------------ 1 file changed, 19 insertions(+), 38 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 3ca84d14d52..b93f1ba1579 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2518,6 +2518,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e fullParents.push_back(parentPair.first); } } + // if there are no full parents we need to make a new one to attach everything to if (fullParents.empty()) { if (elementClass == NC) { @@ -2525,10 +2526,18 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } else if (elementClass == NEUME) { parent = new Syllable(); + int lry; + int uly; for (auto it = elements.begin(); it != elements.end(); ++it) { - if ((*it)->GetParent() != parent && !(*it)->Is(SYL)) { - (*it)->MoveItselfTo(parent); + if ((*it)->GetParent() != parent) { + if (!(*it)->Is(SYL)) { + (*it)->MoveItselfTo(parent); + } + else { + lry = (*it)->GetFacsimileInterface()->GetZone()->GetLry(); + uly = (*it)->GetFacsimileInterface()->GetZone()->GetUly(); + } } } @@ -2544,43 +2553,15 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e if (m_doc->GetType() == Facs) { Zone *zone = new Zone(); - // if it's syllable parent has position values just use those - FacsimileInterface *syllableFi = NULL; - if (syl->GetFirstAncestor(SYLLABLE)->GetFacsimileInterface()->HasFacs()) { - syllableFi = syl->GetFirstAncestor(SYLLABLE)->GetFacsimileInterface(); - Zone *tempZone = dynamic_cast(syllableFi->GetZone()); - zone->SetUlx(tempZone->GetUlx()); - zone->SetUly(tempZone->GetUly()); - zone->SetLrx(tempZone->GetLrx()); - zone->SetLry(tempZone->GetLry()); - } - // otherwise get a boundingbox that comprises all the neumes in the syllable - else { - ListOfObjects children; - InterfaceComparison comp(INTERFACE_FACSIMILE); - syl->GetFirstAncestor(SYLLABLE)->FindAllDescendantsByComparison(&children, &comp); - for (auto iter2 = children.begin(); iter2 != children.end(); ++iter2) { - FacsimileInterface *temp = (*iter2)->GetFacsimileInterface(); - assert(temp); - Zone *tempZone = vrv_cast(temp->GetZone()); - assert(tempZone); - if (temp->HasFacs()) { - zone->SetUlx(tempZone->GetUlx()); - zone->SetUly(tempZone->GetUly()); - zone->SetLrx(tempZone->GetLrx()); - zone->SetLry(tempZone->GetLry()); - } - } - } - - // make the bounding box a little bigger and lower so it's easier to edit - const int offSetUly = 100; - const int offSetLrx = 100; - const int offSetLry = 200; + zone->SetUlx(parent->GetFirst(NC)->GetFacsimileInterface()->GetZone()->GetUlx()); + zone->SetUly(uly); + zone->SetLrx(parent->GetLast(NC)->GetFacsimileInterface()->GetZone()->GetLrx()); + zone->SetLry(lry); - zone->SetUly(zone->GetUly() + offSetUly); - zone->SetLrx(zone->GetLrx() + offSetLrx); - zone->SetLry(zone->GetLry() + offSetLry); + // Make bbox larger if it has less than 2 ncs + if (parent->GetChildCount(NC, 2) <= 2) { + zone->SetLrx(zone->GetLrx() + 50); + } assert(m_doc->GetFacsimile()); m_doc->GetFacsimile()->FindDescendantByType(SURFACE)->AddChild(zone); From 3c901209f2f4e3a747a0ff5a65ec8e2e50e9b234 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 31 Jul 2023 13:30:20 -0400 Subject: [PATCH 075/249] Optimize reordering --- src/editortoolkit_neume.cpp | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index b93f1ba1579..0f3af38680d 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2571,12 +2571,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } - parent->ReorderByXPos(); secondParent->AddChild(parent); - - Layer *layer = vrv_cast(parent->GetFirstAncestor(LAYER)); - assert(layer); - layer->ReorderByXPos(); } // if there's only one full parent we just add the other elements to it @@ -2589,7 +2584,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e (*it)->MoveItselfTo(parent); } } - parent->ReorderByXPos(); } // if there is more than 1 full parent we need to concat syl's @@ -2601,20 +2595,9 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e for (auto it = elements.begin(); it != elements.end(); ++it) { if ((*it)->GetParent() != parent && !(*it)->Is(SYL)) { (*it)->MoveItselfTo(parent); - parent->ReorderByXPos(); } } secondParent->AddChild(parent); - - Layer *layer = dynamic_cast(parent->GetFirstAncestor(LAYER)); - if (!layer) { - LogError("Elements does not have Layer parent. This should not happen."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Elements does not have Layer parent."); - return false; - } - - layer->ReorderByXPos(); } else { std::sort(fullParents.begin(), fullParents.end(), Object::sortByUlx); @@ -2687,8 +2670,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e return false; } secondParent->AddChild(fullSyllable); - Layer *layer = vrv_cast(fullSyllable->GetFirstAncestor(LAYER)); - assert(layer); if (ulx >= 0 && uly >= 0 && lrx >= 0 && lry >= 0) { FacsimileInterface *facsInter = vrv_cast(fullSyl->GetFacsimileInterface()); assert(facsInter); @@ -2703,7 +2684,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e assert(lry >= 0); zone->SetLry(lry); } - layer->ReorderByXPos(); parent = fullSyllable; } } @@ -2764,6 +2744,10 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } + Layer *layer = dynamic_cast(parent->GetFirstAncestor(LAYER)); + assert(layer); + layer->ReorderByXPos(); + m_infoObject.import("uuid", parent->GetID()); m_infoObject.import("status", status); m_infoObject.import("message", message); From 87bc478aa03a96cc3d8b129db18228326cfe44a0 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 31 Jul 2023 15:48:36 -0400 Subject: [PATCH 076/249] Rename fullSyllable to parent --- src/editortoolkit_neume.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 0f3af38680d..9607b387ac1 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2601,7 +2601,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } else { std::sort(fullParents.begin(), fullParents.end(), Object::sortByUlx); - Syllable *fullSyllable = new Syllable(); + Syllable *parent = new Syllable(); Syl *fullSyl = NULL; // construct concatenated string of all the syls @@ -2655,13 +2655,13 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e Text *text = vrv_cast(fullSyl->FindDescendantByType(TEXT)); assert(text); text->SetText(fullString); - assert(fullSyllable); - fullSyllable->AddChild(fullSyl); + assert(parent); + parent->AddChild(fullSyl); // Move elements to the new group syllable for (auto it = elements.begin(); it != elements.end(); ++it) { - if ((*it)->GetParent() != fullSyllable && !(*it)->Is(SYL)) { - (*it)->MoveItselfTo(fullSyllable); + if ((*it)->GetParent() != parent && !(*it)->Is(SYL)) { + (*it)->MoveItselfTo(parent); } } @@ -2669,7 +2669,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e LogError("No second level parent!"); return false; } - secondParent->AddChild(fullSyllable); + secondParent->AddChild(parent); if (ulx >= 0 && uly >= 0 && lrx >= 0 && lry >= 0) { FacsimileInterface *facsInter = vrv_cast(fullSyl->GetFacsimileInterface()); assert(facsInter); @@ -2684,7 +2684,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e assert(lry >= 0); zone->SetLry(lry); } - parent = fullSyllable; } } From d5fc196a72333b8cdd15255673b99dcd45cacb90 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 1 Aug 2023 16:15:37 -0400 Subject: [PATCH 077/249] Refactor multiple full parents --- src/editortoolkit_neume.cpp | 79 +++++++++++-------------------------- 1 file changed, 22 insertions(+), 57 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 9607b387ac1..8bebe73d0dc 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2600,17 +2600,23 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e secondParent->AddChild(parent); } else { - std::sort(fullParents.begin(), fullParents.end(), Object::sortByUlx); Syllable *parent = new Syllable(); Syl *fullSyl = NULL; + int ulx, uly, lrx, lry; // construct concatenated string of all the syls std::u32string fullString = U""; for (auto it = fullParents.begin(); it != fullParents.end(); ++it) { Syl *syl = dynamic_cast((*it)->FindDescendantByType(SYL)); - if (syl != NULL) { + if (syl != NULL && m_doc->GetType() == Facs) { + Zone *zone = dynamic_cast(syl->GetFacsimileInterface()->GetZone()); + if (fullSyl == NULL) { fullSyl = syl; + ulx = zone->GetUlx(); + uly = zone->GetUly(); + lrx = zone->GetLrx(); + lry = zone->GetLry(); } Text *text = dynamic_cast(syl->FindDescendantByType(TEXT)); @@ -2618,46 +2624,13 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e std::u32string currentString = text->GetText(); fullString = fullString + currentString; } + + ulx = zone->GetUlx() < ulx ? zone->GetUlx() : ulx; + uly = zone->GetUly() < uly ? zone->GetUly() : uly; + lrx = zone->GetLrx() > lrx ? zone->GetLrx() : lrx; + lry = zone->GetLry() > lry ? zone->GetLry() : lry; } } - // find the new boundingbox comprising all of the text - int ulx = -1, uly = -1, lrx = -1, lry = -1; - for (auto it = fullParents.begin(); it != fullParents.end(); ++it) { - Object *par = vrv_cast(*it); - assert(par); - Syl *descSyl = vrv_cast(par->FindDescendantByType(SYL)); - assert(descSyl); - // FacsimileInterface *facsInter = dynamic_cast - // ((*it)->FindDescendantByType(SYL)->GetFacsimileInterface()); - if (descSyl != NULL) { - FacsimileInterface *facsInter - = dynamic_cast(descSyl->GetFacsimileInterface()); - - if (facsInter != NULL) { - if (ulx == -1 || ulx > facsInter->GetDrawingX()) { - ulx = facsInter->GetDrawingX(); - } - - if (lrx < facsInter->GetWidth() + facsInter->GetDrawingX()) { - lrx = facsInter->GetWidth() + facsInter->GetDrawingX(); - } - - if (uly == -1 || uly > facsInter->GetDrawingY()) { - uly = facsInter->GetDrawingY(); - } - if (lry < facsInter->GetHeight() + facsInter->GetDrawingY()) { - lry = facsInter->GetHeight() + facsInter->GetDrawingY(); - } - } - } - } - assert(fullSyl); - Text *text = vrv_cast(fullSyl->FindDescendantByType(TEXT)); - assert(text); - text->SetText(fullString); - assert(parent); - parent->AddChild(fullSyl); - // Move elements to the new group syllable for (auto it = elements.begin(); it != elements.end(); ++it) { if ((*it)->GetParent() != parent && !(*it)->Is(SYL)) { @@ -2665,25 +2638,19 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } - if (secondParent == NULL) { - LogError("No second level parent!"); - return false; - } - secondParent->AddChild(parent); - if (ulx >= 0 && uly >= 0 && lrx >= 0 && lry >= 0) { - FacsimileInterface *facsInter = vrv_cast(fullSyl->GetFacsimileInterface()); - assert(facsInter); - Zone *zone = vrv_cast(facsInter->GetZone()); - assert(zone); - assert(ulx >= 0); + Text *fullText = dynamic_cast(fullSyl->FindDescendantByType(TEXT)); + fullText->SetText(fullString); + parent->AddChild(fullSyl); + + if (m_doc->GetType() == Facs) { + Zone *zone = dynamic_cast(fullSyl->GetFacsimileInterface()->GetZone()); zone->SetUlx(ulx); - assert(uly >= 0); zone->SetUly(uly); - assert(lrx >= 0); zone->SetLrx(lrx); - assert(lry >= 0); zone->SetLry(lry); } + + secondParent->AddChild(parent); } } @@ -2743,9 +2710,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } } - Layer *layer = dynamic_cast(parent->GetFirstAncestor(LAYER)); - assert(layer); - layer->ReorderByXPos(); + secondParent->ReorderByXPos(); m_infoObject.import("uuid", parent->GetID()); m_infoObject.import("status", status); From a52ba37f6d6752b8a4a8dea1a5c7f0efc9a3eba9 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 1 Aug 2023 18:05:45 -0400 Subject: [PATCH 078/249] Fix bbox calculation for empty full parent --- src/editortoolkit_neume.cpp | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 8bebe73d0dc..73538765a79 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2526,18 +2526,11 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } else if (elementClass == NEUME) { parent = new Syllable(); - int lry; - int uly; + Object *oldSyl = (*elements.begin())->GetFirstAncestor(SYLLABLE)->GetFirst(SYL); for (auto it = elements.begin(); it != elements.end(); ++it) { - if ((*it)->GetParent() != parent) { - if (!(*it)->Is(SYL)) { - (*it)->MoveItselfTo(parent); - } - else { - lry = (*it)->GetFacsimileInterface()->GetZone()->GetLry(); - uly = (*it)->GetFacsimileInterface()->GetZone()->GetUly(); - } + if (!(*it)->Is(SYL)) { + (*it)->MoveItselfTo(parent); } } @@ -2553,10 +2546,10 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e if (m_doc->GetType() == Facs) { Zone *zone = new Zone(); - zone->SetUlx(parent->GetFirst(NC)->GetFacsimileInterface()->GetZone()->GetUlx()); - zone->SetUly(uly); - zone->SetLrx(parent->GetLast(NC)->GetFacsimileInterface()->GetZone()->GetLrx()); - zone->SetLry(lry); + zone->SetUlx(parent->GetFirst(NEUME)->GetFirst(NC)->GetFacsimileInterface()->GetZone()->GetUlx()); + zone->SetUly(oldSyl->GetFacsimileInterface()->GetZone()->GetUly()); + zone->SetLrx(parent->GetLast(NEUME)->GetLast(NC)->GetFacsimileInterface()->GetZone()->GetLrx()); + zone->SetLry(oldSyl->GetFacsimileInterface()->GetZone()->GetLry()); // Make bbox larger if it has less than 2 ncs if (parent->GetChildCount(NC, 2) <= 2) { @@ -2565,7 +2558,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e assert(m_doc->GetFacsimile()); m_doc->GetFacsimile()->FindDescendantByType(SURFACE)->AddChild(zone); - FacsimileInterface *fi = vrv_cast((*syl).GetFacsimileInterface()); + FacsimileInterface *fi = syl->GetFacsimileInterface(); assert(fi); fi->AttachZone(zone); } From f35390d1fc3dc1a6a875b4bf4789b0326e224353 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 1 Aug 2023 18:10:30 -0400 Subject: [PATCH 079/249] Remove unnecessary checks & reordering --- src/editortoolkit_neume.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 73538765a79..3a0ad6178a9 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2667,10 +2667,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e Object *obj = (*it).first; obj->ClearRelinquishedChildren(); if (obj->GetChildCount() == 0) { - if (secondParent == NULL) { - LogError("No second level parent!"); - return false; - } secondParent->DeleteChild(obj); } else if (obj->GetChildCount() @@ -2682,23 +2678,16 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } while ((leftover = obj->FindDescendantByType(DIVLINE)) != NULL) { leftover->MoveItselfTo(parent); - parent->ReorderByXPos(); obj->ClearRelinquishedChildren(); } while ((leftover = obj->FindDescendantByType(ACCID)) != NULL) { leftover->MoveItselfTo(parent); - parent->ReorderByXPos(); obj->ClearRelinquishedChildren(); } while ((leftover = obj->FindDescendantByType(CLEF)) != NULL) { leftover->MoveItselfTo(parent); - parent->ReorderByXPos(); obj->ClearRelinquishedChildren(); } - if (secondParent == NULL) { - LogError("No second level parent!"); - return false; - } secondParent->DeleteChild(obj); } } From 11425b4bbc59b82ce5f4eb23f66678def3b22ffb Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 1 Aug 2023 18:14:44 -0400 Subject: [PATCH 080/249] Remove unused variable --- src/editortoolkit_neume.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 3a0ad6178a9..44f49fba0fc 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -1636,11 +1636,9 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) int ulx; int uly; int height; - int lrx; if (dynamic_cast(element)->HasFacs()) { ulx = element->GetFacsimileInterface()->GetZone()->GetUlx(); uly = element->GetFacsimileInterface()->GetZone()->GetUly(); - lrx = element->GetFacsimileInterface()->GetZone()->GetLrx(); height = element->GetFacsimileInterface()->GetZone()->GetLry() - uly; } else { From dc01be2ae49b7b66b1753c7a3d7fb792ecbc8e9c Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Wed, 2 Aug 2023 16:12:11 -0400 Subject: [PATCH 081/249] Preserve ordering of multiple ligated nc in the same neume --- src/object.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/object.cpp b/src/object.cpp index bd6a76b6c67..c9c303b72c7 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -1272,7 +1272,10 @@ bool Object::sortByUlx(Object *a, Object *b) if (a->Is(NC) && b->Is(NC)) { Nc *nca = dynamic_cast(a); Nc *ncb = dynamic_cast(b); - if (nca->HasLigated() && ncb->HasLigated() && (a->GetParent() == b->GetParent())) { + Zone *zonea = dynamic_cast(nca->GetFacsimileInterface()->GetZone()); + Zone *zoneb = dynamic_cast(ncb->GetFacsimileInterface()->GetZone()); + if (nca->HasLigated() && ncb->HasLigated() && (a->GetParent() == b->GetParent()) + && (zonea->GetUlx() == zoneb->GetUly())) { Object *parent = a->GetParent(); assert(parent); if (abs(parent->GetChildIndex(a) - parent->GetChildIndex(b)) == 1) { From 9abbe67bb2429852cda906ed1325fb8ae840e12f Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Thu, 3 Aug 2023 10:41:03 -0400 Subject: [PATCH 082/249] Add validity check && correction --- src/object.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/object.cpp b/src/object.cpp index c9c303b72c7..086e4589db2 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -1273,9 +1273,11 @@ bool Object::sortByUlx(Object *a, Object *b) Nc *nca = dynamic_cast(a); Nc *ncb = dynamic_cast(b); Zone *zonea = dynamic_cast(nca->GetFacsimileInterface()->GetZone()); + assert(zonea); Zone *zoneb = dynamic_cast(ncb->GetFacsimileInterface()->GetZone()); + assert(zoneb); if (nca->HasLigated() && ncb->HasLigated() && (a->GetParent() == b->GetParent()) - && (zonea->GetUlx() == zoneb->GetUly())) { + && (zonea->GetUlx() == zoneb->GetUlx())) { Object *parent = a->GetParent(); assert(parent); if (abs(parent->GetChildIndex(a) - parent->GetChildIndex(b)) == 1) { From 51f2b105eb9ee8d47fc4ce02df4e33cf19408971 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 14 Aug 2023 14:37:15 -0400 Subject: [PATCH 083/249] Convert m_infoObject to m_editInfo --- include/vrv/editortoolkit_neume.h | 7 +- src/editortoolkit_neume.cpp | 622 +++++++++++++++--------------- 2 files changed, 315 insertions(+), 314 deletions(-) diff --git a/include/vrv/editortoolkit_neume.h b/include/vrv/editortoolkit_neume.h index a31242d2970..108b50e5266 100644 --- a/include/vrv/editortoolkit_neume.h +++ b/include/vrv/editortoolkit_neume.h @@ -31,8 +31,8 @@ namespace vrv { class EditorToolkitNeume : public EditorToolkit { public: EditorToolkitNeume(Doc *doc, View *view) : EditorToolkit(doc, view) {} - bool ParseEditorAction(const std::string &json_editorAction); - virtual std::string EditInfo() { return m_infoObject.json(); }; + bool ParseEditorAction(const std::string &json_editorAction) override; + std::string EditInfo() override; /** * Experimental editor functions. @@ -100,9 +100,6 @@ class EditorToolkitNeume : public EditorToolkit { bool AdjustPitchFromPosition(Object *obj, Clef *clef = NULL); bool AdjustClefLineFromPosition(Clef *clef, Staff *staff = NULL); ///@} - -private: - jsonxx::Object m_infoObject; }; //-------------------------------------------------------------------------------- diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 44f49fba0fc..7f55e3298ad 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -41,25 +41,29 @@ //-------------------------------------------------------------------------------- namespace vrv { +std::string EditorToolkitNeume::EditInfo() +{ + return m_editInfo.json(); +} bool EditorToolkitNeume::ParseEditorAction(const std::string &json_editorAction) { jsonxx::Object json; - m_infoObject.reset(); + // m_editInfo.reset(); // Read JSON actions if (!json.parse(json_editorAction)) { LogError("Cannot parse JSON std::string."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Cannot parse JSON from std::string " + json_editorAction); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Cannot parse JSON from std::string " + json_editorAction); return false; } if (!json.has("action") || (!json.has("param") && !json.has("param"))) { LogWarning("Incorrectly formatted JSON action"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "JSON action misformatted."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "JSON action misformatted."); return false; } @@ -67,8 +71,8 @@ bool EditorToolkitNeume::ParseEditorAction(const std::string &json_editorAction) if (action != "chain" && json.has("param")) { LogWarning("Only 'chain' uses 'param' as an array."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "'param' can only be an array for a chain action."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "'param' can only be an array for a chain action."); return false; } @@ -239,8 +243,8 @@ bool EditorToolkitNeume::ParseEditorAction(const std::string &json_editorAction) else { LogWarning("Unknown action type '%s'.", action.c_str()); } - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Action " + action + " could not be parsed or is unknown."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Action " + action + " could not be parsed or is unknown."); return false; } @@ -252,15 +256,15 @@ bool EditorToolkitNeume::Chain(jsonxx::Array actions) for (int i = 0; i < (int)actions.size(); i++) { if (!actions.has(0)) { LogError("Action %d was not an object", i); - m_infoObject.reset(); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Action " + std::to_string(i) + " was not an object."); + m_editInfo.reset(); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Action " + std::to_string(i) + " was not an object."); return false; } status |= this->ParseEditorAction(actions.get(i).json()); - results.import(std::to_string(i), m_infoObject); + results.import(std::to_string(i), m_editInfo); } - m_infoObject = results; + m_editInfo = results; return status; } @@ -481,8 +485,8 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) std::string status = "OK", message = ""; if (!m_doc->GetDrawingPage()) { LogError("Could not get drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get drawing page."); return false; } @@ -514,8 +518,8 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) Layer *layer = dynamic_cast(element->GetFirstAncestor(LAYER)); if (!layer) { LogError("Element does not have Layer parent. This should not happen."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Element does not have Layer parent."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element does not have Layer parent."); return false; } @@ -594,8 +598,8 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) Clef *clef = dynamic_cast(element); if (!clef->HasFacs()) { LogError("Clef dragging is only supported for clefs with facsimiles!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Clef dragging is only supported for clefs with facsimiles."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Clef dragging is only supported for clefs with facsimiles."); return false; } FacsimileInterface *fi = (*clef).GetFacsimileInterface(); @@ -646,8 +650,8 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) Staff *staff = vrv_cast(element); if (!staff->HasFacs()) { LogError("Staff dragging is only supported for staves with facsimiles!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Staff dragging is only supported for staves with facsimiles."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Staff dragging is only supported for staves with facsimiles."); return false; } @@ -675,8 +679,8 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) Syl *syl = dynamic_cast(element); if (!syl->HasFacs()) { LogError("Syl (boundingbox) dragging is only supported for syls with facsimiles!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Syl dragging is only supported for syls with facsimiles."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Syl dragging is only supported for syls with facsimiles."); return false; } FacsimileInterface *fi = (*syl).GetFacsimileInterface(); @@ -689,8 +693,8 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) Accid *accid = dynamic_cast(element); if (!accid->HasFacs()) { LogError("Accid dragging is only supported for accid with facsimiles!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Accid dragging is only supported for accid with facsimiles."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Accid dragging is only supported for accid with facsimiles."); return false; } FacsimileInterface *fi = (*accid).GetFacsimileInterface(); @@ -706,8 +710,8 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) DivLine *divLine = dynamic_cast(element); if (!divLine->HasFacs()) { LogError("DivLine dragging is only supported for divLine with facsimiles!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "DivLine dragging is only supported for divLine with facsimiles."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "DivLine dragging is only supported for divLine with facsimiles."); return false; } FacsimileInterface *fi = (*divLine).GetFacsimileInterface(); @@ -721,14 +725,14 @@ bool EditorToolkitNeume::Drag(std::string elementId, int x, int y) } else { LogWarning("Unsupported element for dragging."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Unsupported element for dragging."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Unsupported element for dragging."); return false; } Layer *layer = vrv_cast(element->GetFirstAncestor(LAYER)); layer->ReorderByXPos(); // Reflect position order of elements internally (and in the resulting output file) - m_infoObject.import("status", status); - m_infoObject.import("message", message); + m_editInfo.import("status", status); + m_editInfo.import("message", message); return true; } @@ -737,14 +741,14 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in { if (!m_doc->GetDrawingPage()) { LogError("Could not get drawing page"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get drawing page."); return false; } if (m_doc->GetType() != Facs) { LogError("Drawing page without facsimile"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Drawing page without facsimile is unsupported."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Drawing page without facsimile is unsupported."); return false; } @@ -821,9 +825,9 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in parent->InsertChild(newStaff, i); parent->Modify(); - m_infoObject.import("uuid", newStaff->GetID()); - m_infoObject.import("status", status); - m_infoObject.import("message", message); + m_editInfo.import("uuid", newStaff->GetID()); + m_editInfo.import("status", status); + m_editInfo.import("message", message); return true; } @@ -833,17 +837,17 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in parent->AddChild(newStaff); parent->Modify(); - m_infoObject.import("uuid", newStaff->GetID()); - m_infoObject.import("status", status); - m_infoObject.import("message", message); + m_editInfo.import("uuid", newStaff->GetID()); + m_editInfo.import("status", status); + m_editInfo.import("message", message); return true; } if (staff == NULL) { LogError("A staff must exist in the page to add a non-staff element."); delete zone; - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "A staff must exist in the page to add a non-staff element."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "A staff must exist in the page to add a non-staff element."); return false; } Layer *layer = vrv_cast(staff->FindDescendantByType(LAYER)); @@ -930,8 +934,8 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in delete nc; LogError("Failed to set pitch."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to set pitch."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to set pitch."); return false; } @@ -993,8 +997,8 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in LogError("Unsupported character in contour."); delete newNc; delete newZone; - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Unsupported character in contour."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Unsupported character in contour."); return false; } @@ -1019,10 +1023,10 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in } } if (elementType == "nc") { - m_infoObject.import("uuid", nc->GetID()); + m_editInfo.import("uuid", nc->GetID()); } else { - m_infoObject.import("uuid", neume->GetID()); + m_editInfo.import("uuid", neume->GetID()); } } else if (elementType == "clef") { @@ -1047,8 +1051,8 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in LogError("A clef shape must be specified."); delete clef; - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "A clef shape must be specified."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "A clef shape must be specified."); return false; } clef->SetShape(clefShape); @@ -1069,7 +1073,7 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in assert(surface); surface->AddChild(zone); layer->AddChild(clef); - m_infoObject.import("uuid", clef->GetID()); + m_editInfo.import("uuid", clef->GetID()); layer->ReorderByXPos(); // ensure pitched elements associated with this clef keep their x,y positions @@ -1120,11 +1124,11 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in if (!AdjustPitchFromPosition(custos)) { LogError("Failed to set pitch."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to set pitch."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to set pitch."); return false; } - m_infoObject.import("uuid", custos->GetID()); + m_editInfo.import("uuid", custos->GetID()); } else if (elementType == "accid") { Accid *accid = new Accid(); @@ -1145,8 +1149,8 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in LogError("A accid type must be specified."); delete accid; - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "A accid type must be specified."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "A accid type must be specified."); return false; } @@ -1171,7 +1175,7 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in zone->SetLry(uly + noteHeight); layer->ReorderByXPos(); - m_infoObject.import("uuid", accid->GetID()); + m_editInfo.import("uuid", accid->GetID()); } else if (elementType == "divLine") { DivLine *divLine = new DivLine(); @@ -1209,8 +1213,8 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in LogError("A divLine type must be specified."); delete divLine; - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "A divLine type must be specified."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "A divLine type must be specified."); return false; } @@ -1235,18 +1239,18 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in zone->SetLry(uly + noteHeight); layer->ReorderByXPos(); - m_infoObject.import("uuid", divLine->GetID()); + m_editInfo.import("uuid", divLine->GetID()); } else { delete zone; LogError("Unsupported type '%s' for insertion", elementType.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Unsupported type '" + elementType + "' for insertion."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Unsupported type '" + elementType + "' for insertion."); return false; } layer->ReorderByXPos(); - m_infoObject.import("status", status); - m_infoObject.import("message", message); + m_editInfo.import("status", status); + m_editInfo.import("message", message); return true; } @@ -1254,14 +1258,14 @@ bool EditorToolkitNeume::InsertToSyllable(std::string elementId) { if (!m_doc->GetDrawingPage()) { LogError("Could not get drawing page"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get drawing page."); return false; } if (m_doc->GetType() != Facs) { LogError("Drawing page without facsimile"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Drawing page without facsimile is unsupported."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Drawing page without facsimile is unsupported."); return false; } @@ -1272,23 +1276,23 @@ bool EditorToolkitNeume::InsertToSyllable(std::string elementId) if (element == NULL) { LogError("No element exists with ID '%s'.", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No element exists with ID" + elementId + "."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No element exists with ID" + elementId + "."); return false; } if (!(element->Is(DIVLINE) || element->Is(ACCID) || element->Is(CLEF))) { LogError("Element is of type %s, but only Divlines and Accids can be inserted into syllables.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element is of type " + element->GetClassName() + ", but only DivLines, Accids, and Clefs can be inserted into syllables."); return false; } if (!parent->Is(LAYER)) { LogError("The selected %s is not a child of layer.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "The selected " + element->GetClassName() + "is not a child of layer."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "The selected " + element->GetClassName() + "is not a child of layer."); return false; } @@ -1301,8 +1305,8 @@ bool EditorToolkitNeume::InsertToSyllable(std::string elementId) } else { LogError("Selected '%s' without facsimile", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Selected '" + element->GetClassName() + "' without facsimile is unsupported."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Selected '" + element->GetClassName() + "' without facsimile is unsupported."); return false; } @@ -1316,8 +1320,8 @@ bool EditorToolkitNeume::InsertToSyllable(std::string elementId) if (neumes.empty()) { LogError("A syllable must exist in the staff to insert a '%s' into.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import( + m_editInfo.import("status", "FAILURE"); + m_editInfo.import( "message", "A syllable must exist in the staff to insert a '" + element->GetClassName() + "' into."); return false; } @@ -1395,8 +1399,8 @@ bool EditorToolkitNeume::InsertToSyllable(std::string elementId) } } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -1404,14 +1408,14 @@ bool EditorToolkitNeume::MoveOutsideSyllable(std::string elementId) { if (!m_doc->GetDrawingPage()) { LogError("Could not get drawing page"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get drawing page."); return false; } if (m_doc->GetType() != Facs) { LogError("Drawing page without facsimile"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Drawing page without facsimile is unsupported."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Drawing page without facsimile is unsupported."); return false; } @@ -1422,23 +1426,23 @@ bool EditorToolkitNeume::MoveOutsideSyllable(std::string elementId) if (element == NULL) { LogError("No element exists with ID '%s'.", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No element exists with ID" + elementId + "."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No element exists with ID" + elementId + "."); return false; } if (!(element->Is(DIVLINE) || element->Is(ACCID) || element->Is(CLEF))) { LogError("Element is of type %s, but only Divlines, Accids, and Clefs can be moved out of syllables.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element is of type " + element->GetClassName() + ", but only DivLines and Accids can be inserted into syllables."); return false; } if (!parent->Is(SYLLABLE)) { LogError("The selected %s is not a child of syllable.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "The selected " + element->GetClassName() + "is not a child of syllable."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "The selected " + element->GetClassName() + "is not a child of syllable."); return false; } @@ -1518,8 +1522,8 @@ bool EditorToolkitNeume::MoveOutsideSyllable(std::string elementId) // INSIDE do nothing } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -1527,15 +1531,15 @@ bool EditorToolkitNeume::DisplaceClefOctave(std::string elementId, std::string d { if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } if (direction != "above" && direction != "below") { LogError("Direction can only be either \"above\" or \"below\"."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Direction can only be either \"above\" or \"below\"."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Direction can only be either \"above\" or \"below\"."); return false; } @@ -1543,8 +1547,8 @@ bool EditorToolkitNeume::DisplaceClefOctave(std::string elementId, std::string d Object *obj = page->FindDescendantByID(elementId); if (obj == NULL || !obj->Is(CLEF)) { LogError("This action can only be done on clefs!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "This action can only be done on clefs!"); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "This action can only be done on clefs!"); return false; } @@ -1559,8 +1563,8 @@ bool EditorToolkitNeume::DisplaceClefOctave(std::string elementId, std::string d if (octaveDis > 3 || octaveDis < -3) { LogError("Clefs can only be displaced 3 octaves."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Clefs can only be displaced 3 octaves."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Clefs can only be displaced 3 octaves."); return false; } @@ -1595,8 +1599,8 @@ bool EditorToolkitNeume::DisplaceClefOctave(std::string elementId, std::string d nc->SetOct(nc->GetOct() + move); }); - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -1604,14 +1608,14 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) { if (!m_doc->GetDrawingPage()) { LogError("Could not get drawing page"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get drawing page."); return false; } if (m_doc->GetType() != Facs) { LogError("Drawing page without facsimile"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Drawing page without facsimile is unsupported."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Drawing page without facsimile is unsupported."); return false; } @@ -1620,14 +1624,14 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) Object *staffParent = element->GetFirstAncestor(STAFF); if (element == NULL) { LogError("No element exists with ID '%s'.", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No element exists with ID" + elementId + "."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No element exists with ID" + elementId + "."); return false; } if (!element->Is(SYL)) { LogError("Element is of type %s, but only element can match height.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import( + m_editInfo.import("status", "FAILURE"); + m_editInfo.import( "message", "Element is of type " + element->GetClassName() + ", but only element can match height."); return false; } @@ -1643,8 +1647,8 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) } else { LogError("Selected '%s' without facsimile", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Selected '" + element->GetClassName() + "' without facsimile is unsupported."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Selected '" + element->GetClassName() + "' without facsimile is unsupported."); return false; } @@ -1686,8 +1690,8 @@ bool EditorToolkitNeume::MatchHeight(std::string elementId) zone->SetLry(uly + offsetY + height); } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -1704,15 +1708,15 @@ bool EditorToolkitNeume::Merge(std::vector elementIds) } else { LogError("Staff with ID '%s' does not exist!", it->c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Staff with ID '" + *it + "' does not exist."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Staff with ID '" + *it + "' does not exist."); return false; } } if (staves.size() < 2) { LogError("At least two staves must be provided."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "At least two staves must be provided."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "At least two staves must be provided."); return false; } @@ -1773,9 +1777,9 @@ bool EditorToolkitNeume::Merge(std::vector elementIds) fillLayer->ReorderByXPos(); - m_infoObject.import("uuid", fillStaff->GetID()); - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("uuid", fillStaff->GetID()); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); // TODO change zones for staff children @@ -1817,8 +1821,8 @@ bool EditorToolkitNeume::Set(std::string elementId, std::string attrType, std::s m_doc->PrepareData(); m_doc->GetDrawingPage()->LayOut(true); } - m_infoObject.import("status", success ? "OK" : "FAILURE"); - m_infoObject.import("message", success ? "" : "Could not set attribute '" + attrType + "' to '" + attrValue + "'."); + m_editInfo.import("status", success ? "OK" : "FAILURE"); + m_editInfo.import("message", success ? "" : "Could not set attribute '" + attrType + "' to '" + attrValue + "'."); return success; } @@ -1828,15 +1832,15 @@ bool EditorToolkitNeume::SetText(std::string elementId, const std::string &text) std::string status = "OK", message = ""; const std::u32string wtext = UTF8to32(text); if (!m_doc->GetDrawingPage()) { - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not find drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not find drawing page."); return false; } Object *element = m_doc->GetDrawingPage()->FindDescendantByID(elementId); if (element == NULL) { LogWarning("No element with ID '%s' exists", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No element with ID '" + elementId + "' exists."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No element with ID '" + elementId + "' exists."); return false; } @@ -1920,12 +1924,12 @@ bool EditorToolkitNeume::SetText(std::string elementId, const std::string &text) } else { LogError("Element type '%s' is unsupported for SetText", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Element type '" + element->GetClassName() + "' is unsupported for SetText."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element type '" + element->GetClassName() + "' is unsupported for SetText."); return false; } - m_infoObject.import("status", success ? status : "FAILURE"); - m_infoObject.import("message", success ? message : "SetText method failed."); + m_editInfo.import("status", success ? status : "FAILURE"); + m_editInfo.import("message", success ? message : "SetText method failed."); return success; } @@ -1933,8 +1937,8 @@ bool EditorToolkitNeume::SetClef(std::string elementId, std::string shape) { if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } ListOfObjects objects; @@ -1957,8 +1961,8 @@ bool EditorToolkitNeume::SetClef(std::string elementId, std::string shape) success = AttModule::SetShared(clef, "shape", shape); if (!success) { LogError("Unable to set clef shape"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Unable to set clef shape."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Unable to set clef shape."); return false; } @@ -1985,8 +1989,8 @@ bool EditorToolkitNeume::SetClef(std::string elementId, std::string shape) m_doc->PrepareData(); m_doc->GetDrawingPage()->LayOut(true); } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -1994,23 +1998,23 @@ bool EditorToolkitNeume::Split(std::string elementId, int x) { if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } Staff *staff = dynamic_cast(m_doc->GetDrawingPage()->FindDescendantByID(elementId)); // Validate parameters if (staff == NULL) { LogError("Either no element exists with ID '%s' or it is not a staff.", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Either no element exists with ID '" + elementId + "' or it is not a staff."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Either no element exists with ID '" + elementId + "' or it is not a staff."); return false; } if (staff->GetZone()->GetUlx() > x || staff->GetZone()->GetLrx() < x) { LogError("The 'x' parameter is not within the bounds of the original staff."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "The 'x' parameter is not within bounds of the original staff."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "The 'x' parameter is not within bounds of the original staff."); return false; } @@ -2024,19 +2028,19 @@ bool EditorToolkitNeume::Split(std::string elementId, int x) if (!this->Insert("staff", "auto", newUlx, newUly, newLrx, newLry, v)) { LogError("Failed to create a second staff."); - m_infoObject.reset(); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to create a second staff."); + m_editInfo.reset(); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to create a second staff."); return false; } Staff *splitStaff - = dynamic_cast(m_doc->GetDrawingPage()->FindDescendantByID(m_infoObject.get("uuid"))); + = dynamic_cast(m_doc->GetDrawingPage()->FindDescendantByID(m_editInfo.get("uuid"))); assert(splitStaff); if (splitStaff == NULL) { LogError("Split staff is null"); - m_infoObject.reset(); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Split staff is null."); + m_editInfo.reset(); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Split staff is null."); return false; } @@ -2078,9 +2082,9 @@ bool EditorToolkitNeume::Split(std::string elementId, int x) } } layer->ClearRelinquishedChildren(); - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); - m_infoObject.import("uuid", splitStaff->GetID()); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); + m_editInfo.import("uuid", splitStaff->GetID()); return true; } @@ -2088,8 +2092,8 @@ bool EditorToolkitNeume::Remove(std::string elementId) { if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } Object *obj = m_doc->GetDrawingPage()->FindDescendantByID(elementId); @@ -2101,7 +2105,7 @@ bool EditorToolkitNeume::Remove(std::string elementId) isClef = obj->Is(CLEF); Object *parent = obj->GetParent(); assert(parent); - m_infoObject.import("uuid", elementId); + m_editInfo.import("uuid", elementId); // Remove Zone for element (if any) InterfaceComparison ic(INTERFACE_FACSIMILE); ListOfObjects fiChildren; @@ -2142,9 +2146,9 @@ bool EditorToolkitNeume::Remove(std::string elementId) if (!result) { LogError("Failed to delete the desired element (%s)", elementId.c_str()); - m_infoObject.reset(); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to delete the desired element (" + elementId + ")."); + m_editInfo.reset(); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to delete the desired element (" + elementId + ")."); return false; } @@ -2162,9 +2166,9 @@ bool EditorToolkitNeume::Remove(std::string elementId) if (!result) { LogError("Failed to delete the desired element (%s)", elementId.c_str()); - m_infoObject.reset(); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to delete the desired element (" + elementId + ")."); + m_editInfo.reset(); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to delete the desired element (" + elementId + ")."); return false; } // Check if this leaves any containers empty and delete them @@ -2178,9 +2182,9 @@ bool EditorToolkitNeume::Remove(std::string elementId) result &= parent->DeleteChild(obj); if (!result) { LogError("Failed to delete empty neume (%s)", neumeId.c_str()); - m_infoObject.reset(); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to delete empty neume (" + neumeId + ")."); + m_editInfo.reset(); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to delete empty neume (" + neumeId + ")."); return false; } } @@ -2208,16 +2212,16 @@ bool EditorToolkitNeume::Remove(std::string elementId) result &= parent->DeleteChild(obj); if (!result) { LogError("Failed to delete empty syllable (%s)", syllableId.c_str()); - m_infoObject.reset(); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to delete empty syllable (" + syllableId + ")."); + m_editInfo.reset(); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to delete empty syllable (" + syllableId + ")."); return false; } } } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -2225,22 +2229,22 @@ bool EditorToolkitNeume::Resize(std::string elementId, int ulx, int uly, int lrx { if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } if (m_doc->GetType() != Facs) { LogWarning("Resizing is only available in facsimile mode."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Resizing is only available in facsimile mode."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Resizing is only available in facsimile mode."); return false; } Object *obj = m_doc->GetDrawingPage()->FindDescendantByID(elementId); if (obj == NULL) { LogError("Object with ID '%s' not found.", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Object with ID '" + elementId + "' could not be found."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Object with ID '" + elementId + "' could not be found."); return false; } if (obj->Is(STAFF)) { @@ -2248,8 +2252,8 @@ bool EditorToolkitNeume::Resize(std::string elementId, int ulx, int uly, int lrx assert(staff); if (!staff->HasFacs()) { LogError("This staff does not have a facsimile."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "This staff does not have a facsimile."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "This staff does not have a facsimile."); return false; } Zone *zone = staff->GetZone(); @@ -2269,8 +2273,8 @@ bool EditorToolkitNeume::Resize(std::string elementId, int ulx, int uly, int lrx assert(syl); if (!syl->HasFacs()) { LogError("This syl (bounding box) does not have a facsimile"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "This syl does not have a facsimile."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "This syl does not have a facsimile."); return false; } Zone *zone = syl->GetZone(); @@ -2300,12 +2304,12 @@ bool EditorToolkitNeume::Resize(std::string elementId, int ulx, int uly, int lrx } else { LogError("Element of type '%s' is unsupported.", obj->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Element of type '" + obj->GetClassName() + "' is unsupported."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element of type '" + obj->GetClassName() + "' is unsupported."); return false; } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -2322,16 +2326,16 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e // Get the current drawing page if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } if (elementIds.size() == 0) { LogWarning("No element IDs to group!"); status = "WARNING"; message = "No element IDs to group!"; - m_infoObject.import("status", status); - m_infoObject.import("message", message); + m_editInfo.import("status", status); + m_editInfo.import("message", message); return true; } ClassId elementClass; @@ -2343,8 +2347,8 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e } else { LogError("Invalid groupType: %s", groupType.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Invalid groupType: " + groupType); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Invalid groupType: " + groupType); return false; } @@ -2354,15 +2358,15 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e Object *el = m_doc->GetDrawingPage()->FindDescendantByID(*it); if (el == NULL) { LogError("Could not get element with ID %s", it->c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get element with ID " + *it); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get element with ID " + *it); return false; } if (el->GetClassId() != elementClass) { LogError("Element %s was of class %s. Expected class %s", el->GetID().c_str(), el->GetClassName().c_str(), groupType.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element " + el->GetID() + " was of class " + el->GetClassName() + " but expected class " + groupType + "."); return false; @@ -2372,8 +2376,8 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e Object *par = el->GetParent(); if (par == NULL) { LogError("Parent of %s is null!", el->GetID().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Parent of " + el->GetID() + " is null."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Parent of " + el->GetID() + " is null."); return false; } @@ -2401,20 +2405,20 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e std::vector elementIds0 = { elementIds.begin(), elementIds.begin() + idx }; Group("neume", elementIds0); - if (m_infoObject.get("status") == "FAILURE") { + if (m_editInfo.get("status") == "FAILURE") { resultId0 = linkedID; } else { - resultId0 = m_infoObject.get("uuid"); + resultId0 = m_editInfo.get("uuid"); } std::vector elementIds1 = { elementIds.begin() + idx, elementIds.end() }; Group("neume", elementIds1); - if (m_infoObject.get("status") == "FAILURE") { + if (m_editInfo.get("status") == "FAILURE") { resultId1 = par->GetID(); } else { - resultId1 = m_infoObject.get("uuid"); + resultId1 = m_editInfo.get("uuid"); par = m_doc->GetDrawingPage()->FindDescendantByID(resultId1); } @@ -2430,9 +2434,9 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e uuidArray << resultId0; uuidArray << resultId1; - m_infoObject.import("uuid", uuidArray); - m_infoObject.import("status", status); - m_infoObject.import("message", message); + m_editInfo.import("uuid", uuidArray); + m_editInfo.import("status", status); + m_editInfo.import("message", message); return true; } } @@ -2443,14 +2447,14 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e if (parents.size() == 0) { LogError("Could not get the parent."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the parent."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the parent."); return false; } else if (parents.size() == 1) { LogError("The selected elements are already grouped."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "The selected elements are already grouped."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "The selected elements are already grouped."); return false; } @@ -2491,8 +2495,8 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e secondParent = (*parents.begin()).first->GetParent(); if (secondParent == NULL) { LogError("No second level parent!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No second level parent."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No second level parent."); return false; } // find parents where all of their children are being grouped @@ -2502,8 +2506,8 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e int expected; if (par->GetParent() != secondParent) { LogError("No shared second level parent!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No shared second level parent."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No shared second level parent."); return false; } if (par->GetClassId() == SYLLABLE) { @@ -2692,9 +2696,9 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e secondParent->ReorderByXPos(); - m_infoObject.import("uuid", parent->GetID()); - m_infoObject.import("status", status); - m_infoObject.import("message", message); + m_editInfo.import("uuid", parent->GetID()); + m_editInfo.import("status", status); + m_editInfo.import("message", message); return true; } @@ -2729,8 +2733,8 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector // Check if you can get drawing page if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } @@ -2792,8 +2796,8 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector } else { LogError("Unable to toggle ligature within ungroup ncs!"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Unable to toggle ligature within ungroup ncs."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Unable to toggle ligature within ungroup ncs."); return false; } } @@ -2864,8 +2868,8 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector else { LogError("Invalid groupType for ungrouping"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Invalid groupType for ungrouping."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Invalid groupType for ungrouping."); return false; } } @@ -2967,9 +2971,9 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector } } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); - m_infoObject.import("uuid", uuidArray); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); + m_editInfo.import("uuid", uuidArray); return true; } @@ -2978,8 +2982,8 @@ bool EditorToolkitNeume::SplitNeume(std::string neumeId, std::string ncId) // Check if you can get drawing page if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } @@ -3001,8 +3005,8 @@ bool EditorToolkitNeume::SplitNeume(std::string neumeId, std::string ncId) int nLen = fparent->GetChildCount(); if (nLen == 0) { LogError("The selected neume has no children."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "The selected neume has no children."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "The selected neume has no children."); return false; } @@ -3010,8 +3014,8 @@ bool EditorToolkitNeume::SplitNeume(std::string neumeId, std::string ncId) int fIdx = fparent->GetChildIndex(elNc); if (fIdx == -1) { LogError("The selected neume component is not a child of the selected neume."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "The selected neume component is not a child of the selected neume."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "The selected neume component is not a child of the selected neume."); return false; } // if click on a ligature, ncId point to the second nc in the ligature, thus minus 1 @@ -3045,9 +3049,9 @@ bool EditorToolkitNeume::SplitNeume(std::string neumeId, std::string ncId) // insert newParent to sparent sparent->InsertAfter(fparent, newParent); - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); - m_infoObject.import("uuid", uuidArray); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); + m_editInfo.import("uuid", uuidArray); return true; } @@ -3056,15 +3060,15 @@ bool EditorToolkitNeume::ChangeGroup(std::string elementId, std::string contour) // Check if you can get drawing page if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } Neume *el = dynamic_cast(m_doc->GetDrawingPage()->FindDescendantByID(elementId)); if (el == NULL) { LogError("Unable to find neume with id %s", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Unable to find neume with id " + elementId + "."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Unable to find neume with id " + elementId + "."); return false; } Nc *firstChild = NULL; @@ -3128,8 +3132,8 @@ bool EditorToolkitNeume::ChangeGroup(std::string elementId, std::string contour) LogError("Unsupported character in contour."); delete newNc; delete zone; - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Unsupported character in contour."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Unsupported character in contour."); return false; } zone->SetUlx(newUlx); @@ -3152,9 +3156,9 @@ bool EditorToolkitNeume::ChangeGroup(std::string elementId, std::string contour) initialLry = newLry; prevNc = newNc; } - m_infoObject.import("uuid", el->GetID()); - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("uuid", el->GetID()); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); return true; } @@ -3172,8 +3176,8 @@ bool EditorToolkitNeume::ToggleLigature(std::vector elementIds) // Check if you can get drawing page if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } @@ -3187,8 +3191,8 @@ bool EditorToolkitNeume::ToggleLigature(std::vector elementIds) int secondIdx = secondNc->GetIdx(); if (std::abs(firstIdx - secondIdx) != 1) { LogError("The selected ncs are not adjacent."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "The selected ncs are not adjacent."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "The selected ncs are not adjacent."); return false; } @@ -3246,20 +3250,20 @@ bool EditorToolkitNeume::ToggleLigature(std::vector elementIds) } // else { // LogError("isLigature is invalid!"); - // m_infoObject.import("status", "FAILURE"); - // m_infoObject.import("message", "isLigature value '" + isLigature + "' is invalid."); + // m_editInfo.import("status", "FAILURE"); + // m_editInfo.import("message", "isLigature value '" + isLigature + "' is invalid."); // return false; // } if (success1 && success2 && m_doc->GetType() != Facs) { m_doc->PrepareData(); m_doc->GetDrawingPage()->LayOut(true); } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); if (!(success1 && success2)) { LogWarning("Unable to update ligature attribute"); - m_infoObject.import("message", "Unable to update ligature attribute."); - m_infoObject.import("status", "WARNING"); + m_editInfo.import("message", "Unable to update ligature attribute."); + m_editInfo.import("status", "WARNING"); } surface->AddChild(zone); @@ -3270,15 +3274,15 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) { if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } if (m_doc->GetType() != Facs) { LogWarning("Staff re-association is only available in facsimile mode."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Staff re-association is only available in facsimile mode."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Staff re-association is only available in facsimile mode."); return false; } @@ -3286,8 +3290,8 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) assert(element); if (element == NULL) { LogError("No element exists with ID '%s'.", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No element exists with ID" + elementId + "."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No element exists with ID" + elementId + "."); return false; } @@ -3295,8 +3299,8 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) || element->Is(ACCID))) { LogError("Element is of type %s, but only Syllables, Custos, Clefs, Divlines, and Accids can change staves.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element is of type " + element->GetClassName() + ", but only Syllables, Custos, Clefs, DivLines, and Accids can change staves."); return false; @@ -3317,8 +3321,8 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) LayerElement *layerElement = dynamic_cast(element); if (!layerElement->GenerateZoneBounds(&ulx, &uly, &lrx, &lry)) { LogError("Couldn't generate bounding box for syllable."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Couldn't generate bounding box for syllable."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Couldn't generate bounding box for syllable."); return false; } comp.x = (lrx + ulx) / 2; @@ -3326,8 +3330,8 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) } else { LogError("This element does not have a facsimile."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "This element does not have a facsimile."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "This element does not have a facsimile."); return false; } @@ -3340,8 +3344,8 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) } else { LogError("Could not find any staves. This should not happen"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not find any staves. This should not happen"); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not find any staves. This should not happen"); return false; } @@ -3350,8 +3354,8 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) assert(parent); if (parent == NULL || sParent == NULL) { LogError("Couldn't find staff parent of element with id '%s'", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Couldn't find staff parent of element with id " + elementId); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Couldn't find staff parent of element with id " + elementId); return false; } @@ -3359,16 +3363,16 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) assert(LAYER); if (layer == NULL) { LogError("Couldn't find layer child of staff. This should not happen"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Couldn't find layer child of staff. This should not happen"); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Couldn't find layer child of staff. This should not happen"); return false; } if (layer == parent) { - m_infoObject.import("status", "WARNING"); - m_infoObject.import("message", "Moving to the same staff as before."); - m_infoObject.import("elementId", elementId); - m_infoObject.import("newStaffId", staff->GetID()); + m_editInfo.import("status", "WARNING"); + m_editInfo.import("message", "Moving to the same staff as before."); + m_editInfo.import("elementId", elementId); + m_editInfo.import("newStaffId", staff->GetID()); return true; } @@ -3426,8 +3430,8 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) // Adjust clefline if (!AdjustClefLineFromPosition(dynamic_cast(element), staff)) { LogError("Could not adjust clef line of %s", element->GetID().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to set clef line from facsimile."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to set clef line from facsimile."); return false; } @@ -3455,19 +3459,19 @@ bool EditorToolkitNeume::ChangeStaff(std::string elementId) if (!(element->Is(ACCID) || element->Is(DIVLINE))) { if (!AdjustPitchFromPosition(element)) { LogError("Could not adjust pitch of %s", element->GetID().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to properly set pitch."); - m_infoObject.import("elementId", element->GetID()); - m_infoObject.import("newStaffId", staff->GetID()); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to properly set pitch."); + m_editInfo.import("elementId", element->GetID()); + m_editInfo.import("newStaffId", staff->GetID()); return false; } } } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); - m_infoObject.import("elementId", elementId); - m_infoObject.import("newStaffId", staff->GetID()); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); + m_editInfo.import("elementId", elementId); + m_editInfo.import("newStaffId", staff->GetID()); return true; } @@ -3475,15 +3479,15 @@ bool EditorToolkitNeume::ChangeStaffTo(std::string elementId, std::string staffI { if (!m_doc->GetDrawingPage()) { LogError("Could not get the drawing page"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); return false; } if (m_doc->GetType() != Facs) { LogWarning("Staff re-association is only available in facsimile mode."); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Staff re-association is only available in facsimile mode."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Staff re-association is only available in facsimile mode."); return false; } @@ -3491,16 +3495,16 @@ bool EditorToolkitNeume::ChangeStaffTo(std::string elementId, std::string staffI assert(element); if (element == NULL) { LogError("No element exists with ID '%s'.", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "No element exists with ID" + elementId + "."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "No element exists with ID" + elementId + "."); return false; } if (!(element->Is(CLEF) || element->Is(DIVLINE) || element->Is(ACCID))) { LogError("Element is of type %s, but only Clefs, Divlines, and Accids can change to a specified staff.", element->GetClassName().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Element is of type " + element->GetClassName() + ", but only Clefs, Divlines, and Accids can change to a specified staff."); return false; @@ -3510,8 +3514,8 @@ bool EditorToolkitNeume::ChangeStaffTo(std::string elementId, std::string staffI if (!staff) { LogError("Could not find any staves. This should not happen"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Could not find any staves. This should not happen"); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not find any staves. This should not happen"); return false; } @@ -3520,8 +3524,8 @@ bool EditorToolkitNeume::ChangeStaffTo(std::string elementId, std::string staffI assert(parent); if (parent == NULL || sParent == NULL) { LogError("Couldn't find staff parent of element with id '%s'", elementId.c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Couldn't find staff parent of element with id " + elementId); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Couldn't find staff parent of element with id " + elementId); return false; } @@ -3529,16 +3533,16 @@ bool EditorToolkitNeume::ChangeStaffTo(std::string elementId, std::string staffI assert(LAYER); if (layer == NULL) { LogError("Couldn't find layer child of staff. This should not happen"); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Couldn't find layer child of staff. This should not happen"); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Couldn't find layer child of staff. This should not happen"); return false; } if (layer == parent) { - m_infoObject.import("status", "WARNING"); - m_infoObject.import("message", "Moving to the same staff as before."); - m_infoObject.import("elementId", elementId); - m_infoObject.import("newStaffId", staff->GetID()); + m_editInfo.import("status", "WARNING"); + m_editInfo.import("message", "Moving to the same staff as before."); + m_editInfo.import("elementId", elementId); + m_editInfo.import("newStaffId", staff->GetID()); return true; } @@ -3596,8 +3600,8 @@ bool EditorToolkitNeume::ChangeStaffTo(std::string elementId, std::string staffI // Adjust clefline if (!AdjustClefLineFromPosition(dynamic_cast(element), staff)) { LogError("Could not adjust clef line of %s", element->GetID().c_str()); - m_infoObject.import("status", "FAILURE"); - m_infoObject.import("message", "Failed to set clef line from facsimile."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Failed to set clef line from facsimile."); return false; } @@ -3624,10 +3628,10 @@ bool EditorToolkitNeume::ChangeStaffTo(std::string elementId, std::string staffI parent->ReorderByXPos(); } - m_infoObject.import("status", "OK"); - m_infoObject.import("message", ""); - m_infoObject.import("elementId", elementId); - m_infoObject.import("newStaffId", staff->GetID()); + m_editInfo.import("status", "OK"); + m_editInfo.import("message", ""); + m_editInfo.import("elementId", elementId); + m_editInfo.import("newStaffId", staff->GetID()); return true; } From 8e0d846cc3f326f4ef45d3daac2eb2715edeca88 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 14 Aug 2023 14:48:46 -0400 Subject: [PATCH 084/249] Fix outer scope shadowing --- src/editortoolkit_neume.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 7f55e3298ad..cfc0b513083 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2595,7 +2595,7 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e secondParent->AddChild(parent); } else { - Syllable *parent = new Syllable(); + parent = new Syllable(); Syl *fullSyl = NULL; int ulx, uly, lrx, lry; From 31dcb03c1f003b845fbd43f8e512ebd9e2ffdf94 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 14 Aug 2023 14:49:21 -0400 Subject: [PATCH 085/249] Clean up comments --- src/editortoolkit_neume.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index cfc0b513083..b565321602d 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2400,9 +2400,6 @@ bool EditorToolkitNeume::Group(std::string groupType, std::vector e std::string resultId0; std::string resultId1; - // LogMessage("%s", chainArray.get(0).json().c_str()); - // for_each(elementIds.begin(), elementIds.begin()+idx,[](std::string s){LogMessage("%s", s.c_str());}); - std::vector elementIds0 = { elementIds.begin(), elementIds.begin() + idx }; Group("neume", elementIds0); if (m_editInfo.get("status") == "FAILURE") { From f3a565111fde416729014f189a41f471d2d09633 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 14 Aug 2023 16:56:28 -0400 Subject: [PATCH 086/249] Break when last element --- src/editortoolkit_neume.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index b565321602d..decb9bc5ca6 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2810,6 +2810,7 @@ bool EditorToolkitNeume::Ungroup(std::string groupType, std::vector fparent->ReorderByXPos(); uuidArray << (*it); it = elementIds.erase(it); + if (it == elementIds.end()) break; el = m_doc->GetDrawingPage()->FindDescendantByID(*it); } } From 7b96407768f77f6e0ec7122fdb5163509c82ef9e Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 15 Aug 2023 16:50:29 -0400 Subject: [PATCH 087/249] Reset m_editInfo for OOM error --- src/editortoolkit_neume.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index decb9bc5ca6..5a9dd322d76 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -49,7 +49,7 @@ std::string EditorToolkitNeume::EditInfo() bool EditorToolkitNeume::ParseEditorAction(const std::string &json_editorAction) { jsonxx::Object json; - // m_editInfo.reset(); + m_editInfo.reset(); // Read JSON actions if (!json.parse(json_editorAction)) { From 6238cffd718b9e77007932ab6a230d75709ed1b4 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Thu, 17 Aug 2023 18:15:41 -0400 Subject: [PATCH 088/249] Refactor new bbox zone && add staff rotation offset --- src/editortoolkit_neume.cpp | 66 ++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 5a9dd322d76..769fc5e0c34 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -858,12 +858,12 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in Syl *syl = new Syl(); Neume *neume = new Neume(); Nc *nc = new Nc(); + Zone *sylZone; std::string contour = ""; nc->AttachZone(zone); Surface *surface = vrv_cast(facsimile->FindDescendantByType(SURFACE)); surface->AddChild(zone); - zone->SetUlx(ulx); Text *text = new Text(); std::u32string str = U""; @@ -875,57 +875,48 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in syllable->AddChild(syl); layer->AddChild(syllable); + const int noteHeight + = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_HEIGHT_TO_STAFF_SIZE_RATIO); + const int noteWidth + = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_WIDTH_TO_STAFF_SIZE_RATIO); + ulx -= noteWidth / 2; + + // calculate staff rotation offset + double theta = staff->GetDrawingRotate(); + int offsetY = 0; + if (theta) { + double factor = 1.3; + offsetY = (int)((ulx - staff->GetFacsimileInterface()->GetZone()->GetUlx()) * tan(theta * M_PI / 180.0) + / factor); + } + + // Set up facsimile + zone->SetUlx(ulx); + zone->SetUly(uly + offsetY); + zone->SetLrx(ulx + noteWidth); + zone->SetLry(uly + offsetY + noteHeight); + // add syl bounding box if Facs if (m_doc->GetType() == Facs) { FacsimileInterface *fi = vrv_cast(syl->GetFacsimileInterface()); assert(fi); - Zone *sylZone = new Zone(); + sylZone = new Zone(); - // calculate bboxUlx and bboxUly wrt rotation using sine rule - int draw_w = staff->GetWidth(); int draw_h = staff->GetHeight(); - double theta = staff->GetDrawingRotate(); int staffUly = staff->GetDrawingY(); - int x = ulx - staff->GetDrawingX(); - int bboxUlx = ulx; - int bboxUly; - // if staff rotates downward to the right - if (theta > 0) { - int y = (int)((draw_w - x) * tan(theta * M_PI / 180.0)); - bboxUly = staffUly + draw_h - y; - } - // if staff rotates upwards to the right - else { - int y = (int)(x * tan(-theta * M_PI / 180.0)); - int h = (int)(draw_w * tan(-theta * M_PI / 180.0)); - bboxUly = staffUly + (draw_h - h) - y; - } // width height and offset can be adjusted - int bboxWidth = 225; int bboxHeight = 175; int bboxOffsetX = 50; - sylZone->SetUlx(bboxUlx - bboxOffsetX); - sylZone->SetUly(bboxUly); - sylZone->SetLrx(bboxUlx + bboxWidth - bboxOffsetX); - sylZone->SetLry(bboxUly + bboxHeight); + sylZone->SetUlx(ulx); + sylZone->SetUly(staffUly + draw_h + offsetY); + sylZone->SetLrx(ulx + noteWidth + bboxOffsetX); + sylZone->SetLry(staffUly + draw_h + offsetY + bboxHeight); surface->AddChild(sylZone); fi->AttachZone(sylZone); } - const int noteHeight - = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_HEIGHT_TO_STAFF_SIZE_RATIO); - const int noteWidth - = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_WIDTH_TO_STAFF_SIZE_RATIO); - ulx -= noteWidth / 2; - // uly -= noteHeight / 2; - // Set up facsimile - zone->SetUlx(ulx); - zone->SetUly(uly); - zone->SetLrx(ulx + noteWidth); - zone->SetLry(uly + noteHeight); - layer->ReorderByXPos(); if (!AdjustPitchFromPosition(syllable)) { @@ -1006,12 +997,13 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in newUly += (newUlx - ulx) * tan(-staff->GetDrawingRotate() * M_PI / 180.0); newZone->SetUlx(newUlx); newZone->SetUly(newUly); - ; newZone->SetLrx(newUlx + noteWidth); newZone->SetLry(newUly + noteHeight); newNc->AttachZone(newZone); + if (sylZone) sylZone->SetLrx(newUlx + noteWidth); + assert(surface); surface->AddChild(newZone); From 7be37548e61310d0b62e265a4e0a93ddeca557db Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Fri, 27 Oct 2023 16:32:50 -0400 Subject: [PATCH 089/249] Add empty syl for follows syllable if precedes becomes empty --- src/editortoolkit_neume.cpp | 41 ++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 769fc5e0c34..7bea9763139 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2196,7 +2196,46 @@ bool EditorToolkitNeume::Remove(std::string elementId) = dynamic_cast(m_doc->GetDrawingPage()->FindDescendantByID(linkedID)); if (linkedSyllable != NULL) { if (linkedSyllable->HasPrecedes()) linkedSyllable->SetPrecedes(""); - if (linkedSyllable->HasFollows()) linkedSyllable->SetFollows(""); + if (linkedSyllable->HasFollows()) { + linkedSyllable->SetFollows(""); + // Create an empty syl for the second part + Syl *syl = new Syl(); + Text *text = new Text(); + std::u32string str = U""; + text->SetText(str); + syl->AddChild(text); + linkedSyllable->AddChild(syl); + + // Create default bounding box if facs + if (m_doc->GetType() == Facs) { + Zone *zone = new Zone(); + + zone->SetUlx(linkedSyllable->GetFirst(NEUME) + ->GetFirst(NC) + ->GetFacsimileInterface() + ->GetZone() + ->GetUlx()); + zone->SetUly( + linkedSyllable->GetAncestorStaff()->GetFacsimileInterface()->GetZone()->GetLry()); + zone->SetLrx(linkedSyllable->GetLast(NEUME) + ->GetLast(NC) + ->GetFacsimileInterface() + ->GetZone() + ->GetLrx()); + zone->SetLry(zone->GetUly() + 100); + + // Make bbox larger if it has less than 2 ncs + if (linkedSyllable->GetChildCount(NC, 2) <= 2) { + zone->SetLrx(zone->GetLrx() + 50); + } + + assert(m_doc->GetFacsimile()); + m_doc->GetFacsimile()->FindDescendantByType(SURFACE)->AddChild(zone); + FacsimileInterface *fi = syl->GetFacsimileInterface(); + assert(fi); + fi->AttachZone(zone); + } + }; } } // Delete the syllable empty of neumes From b0916d7e41de50fd0066625fcbe26aa2aabdc3e5 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Fri, 1 Dec 2023 17:14:09 -0500 Subject: [PATCH 090/249] Set column value for newly inserted staff if has columns --- src/editortoolkit_neume.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 7bea9763139..1fe7b435ff8 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -783,10 +783,12 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in if (elementType == "staff") { Object *parent; Staff *newStaff; + std::string columnValue; // Use closest existing staff (if there is one) if (staff) { parent = staff->GetParent(); assert(parent); + columnValue = staff->GetType(); int n = parent->GetChildCount() + 1; newStaff = new Staff(n); newStaff->m_drawingStaffDef = staff->m_drawingStaffDef; @@ -811,6 +813,7 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in assert(surface); surface->AddChild(zone); newStaff->AttachZone(zone); + if (columnValue.length()) newStaff->SetType(columnValue); Layer *newLayer = new Layer(); newStaff->AddChild(newLayer); From 8e884fa5b0ca4b6a23c82d3b72aa4a171ce8294f Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 4 Dec 2023 20:38:54 -0500 Subject: [PATCH 091/249] Unlink syllable when removed --- include/vrv/editortoolkit_neume.h | 1 + src/editortoolkit_neume.cpp | 108 +++++++++++++++++------------- 2 files changed, 62 insertions(+), 47 deletions(-) diff --git a/include/vrv/editortoolkit_neume.h b/include/vrv/editortoolkit_neume.h index 108b50e5266..11828f083cb 100644 --- a/include/vrv/editortoolkit_neume.h +++ b/include/vrv/editortoolkit_neume.h @@ -55,6 +55,7 @@ class EditorToolkitNeume : public EditorToolkit { bool Remove(std::string elementId); bool Resize(std::string elementId, int ulx, int uly, int lrx, int lry, float resize = NAN); bool Group(std::string groupType, std::vector elementIds); + void UnlinkSyllable(Syllable *syllable); bool Ungroup(std::string groupType, std::vector elementIds); bool ChangeGroup(std::string elementId, std::string contour); bool ToggleLigature(std::vector elementIds); diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 1fe7b435ff8..d1c4b9de3ed 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2083,6 +2083,58 @@ bool EditorToolkitNeume::Split(std::string elementId, int x) return true; } +void EditorToolkitNeume::UnlinkSyllable(Syllable *syllable) +{ + if (!m_doc->GetDrawingPage()) { + LogError("Could not get the drawing page."); + m_editInfo.import("status", "FAILURE"); + m_editInfo.import("message", "Could not get the drawing page."); + return; + } + + assert(syllable); + + std::string linkedID = (syllable->HasPrecedes() ? syllable->GetPrecedes() : syllable->GetFollows()); + if (linkedID.compare(0, 1, "#") == 0) linkedID.erase(0, 1); + Syllable *linkedSyllable = dynamic_cast(m_doc->GetDrawingPage()->FindDescendantByID(linkedID)); + if (linkedSyllable != NULL) { + if (linkedSyllable->HasPrecedes()) linkedSyllable->SetPrecedes(""); + if (linkedSyllable->HasFollows()) { + linkedSyllable->SetFollows(""); + + // Create an empty syl for the second part + Syl *syl = new Syl(); + Text *text = new Text(); + std::u32string str = U""; + text->SetText(str); + syl->AddChild(text); + linkedSyllable->AddChild(syl); + + // Create default bounding box if facs + if (m_doc->GetType() == Facs) { + Zone *zone = new Zone(); + + zone->SetUlx( + linkedSyllable->GetFirst(NEUME)->GetFirst(NC)->GetFacsimileInterface()->GetZone()->GetUlx()); + zone->SetUly(linkedSyllable->GetAncestorStaff()->GetFacsimileInterface()->GetZone()->GetLry()); + zone->SetLrx(linkedSyllable->GetLast(NEUME)->GetLast(NC)->GetFacsimileInterface()->GetZone()->GetLrx()); + zone->SetLry(zone->GetUly() + 100); + + // Make bbox larger if it has less than 2 ncs + if (linkedSyllable->GetChildCount(NC, 2) <= 2) { + zone->SetLrx(zone->GetLrx() + 50); + } + + assert(m_doc->GetFacsimile()); + m_doc->GetFacsimile()->FindDescendantByType(SURFACE)->AddChild(zone); + FacsimileInterface *fi = syl->GetFacsimileInterface(); + assert(fi); + fi->AttachZone(zone); + } + } + } +} + bool EditorToolkitNeume::Remove(std::string elementId) { if (!m_doc->GetDrawingPage()) { @@ -2155,6 +2207,14 @@ bool EditorToolkitNeume::Remove(std::string elementId) } } + if (obj->Is(SYLLABLE)) { + Syllable *syllable = dynamic_cast(obj); + assert(syllable); + if (syllable->HasPrecedes() || syllable->HasFollows()) { + UnlinkSyllable(syllable); + } + } + if (!result) { result = parent->DeleteChild(obj); } @@ -2193,53 +2253,7 @@ bool EditorToolkitNeume::Remove(std::string elementId) Syllable *li = dynamic_cast(obj); assert(li); if (li->HasPrecedes() || li->HasFollows()) { - std::string linkedID = (li->HasPrecedes() ? li->GetPrecedes() : li->GetFollows()); - if (linkedID.compare(0, 1, "#") == 0) linkedID.erase(0, 1); - Syllable *linkedSyllable - = dynamic_cast(m_doc->GetDrawingPage()->FindDescendantByID(linkedID)); - if (linkedSyllable != NULL) { - if (linkedSyllable->HasPrecedes()) linkedSyllable->SetPrecedes(""); - if (linkedSyllable->HasFollows()) { - linkedSyllable->SetFollows(""); - // Create an empty syl for the second part - Syl *syl = new Syl(); - Text *text = new Text(); - std::u32string str = U""; - text->SetText(str); - syl->AddChild(text); - linkedSyllable->AddChild(syl); - - // Create default bounding box if facs - if (m_doc->GetType() == Facs) { - Zone *zone = new Zone(); - - zone->SetUlx(linkedSyllable->GetFirst(NEUME) - ->GetFirst(NC) - ->GetFacsimileInterface() - ->GetZone() - ->GetUlx()); - zone->SetUly( - linkedSyllable->GetAncestorStaff()->GetFacsimileInterface()->GetZone()->GetLry()); - zone->SetLrx(linkedSyllable->GetLast(NEUME) - ->GetLast(NC) - ->GetFacsimileInterface() - ->GetZone() - ->GetLrx()); - zone->SetLry(zone->GetUly() + 100); - - // Make bbox larger if it has less than 2 ncs - if (linkedSyllable->GetChildCount(NC, 2) <= 2) { - zone->SetLrx(zone->GetLrx() + 50); - } - - assert(m_doc->GetFacsimile()); - m_doc->GetFacsimile()->FindDescendantByType(SURFACE)->AddChild(zone); - FacsimileInterface *fi = syl->GetFacsimileInterface(); - assert(fi); - fi->AttachZone(zone); - } - }; - } + UnlinkSyllable(li); } // Delete the syllable empty of neumes std::string syllableId = obj->GetID(); From f6a7ecfc391aed4678c8df20a1b82a8101918b23 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Mon, 11 Dec 2023 17:14:31 -0500 Subject: [PATCH 092/249] Handle empty staff when inserting new staff --- src/editortoolkit_neume.cpp | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index d1c4b9de3ed..7fe8ec86401 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -817,28 +817,27 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in Layer *newLayer = new Layer(); newStaff->AddChild(newLayer); - // Find index to insert new staff - ListOfObjects staves = parent->FindAllDescendantsByType(STAFF, false); - std::vector stavesVector(staves.begin(), staves.end()); - stavesVector.push_back(newStaff); - StaffSort staffSort; - std::stable_sort(stavesVector.begin(), stavesVector.end(), staffSort); - for (int i = 0; i < (int)staves.size(); ++i) { - if (stavesVector.at(i) == newStaff) { - parent->InsertChild(newStaff, i); - parent->Modify(); - - m_editInfo.import("uuid", newStaff->GetID()); - m_editInfo.import("status", status); - m_editInfo.import("message", message); - - return true; + if (staff) { + // Find index to insert new staff + ListOfObjects staves = parent->FindAllDescendantsByType(STAFF, false); + std::vector stavesVector(staves.begin(), staves.end()); + stavesVector.push_back(newStaff); + StaffSort staffSort; + std::stable_sort(stavesVector.begin(), stavesVector.end(), staffSort); + for (int i = 0; i < (int)staves.size(); ++i) { + if (stavesVector.at(i) == newStaff) { + parent->InsertChild(newStaff, i); + parent->Modify(); + + m_editInfo.import("uuid", newStaff->GetID()); + m_editInfo.import("status", status); + m_editInfo.import("message", message); + + return true; + } } } - LogWarning("Failed to insert newStaff into staff"); - message += "Failed to insert newStaff into staves."; parent->AddChild(newStaff); - parent->Modify(); m_editInfo.import("uuid", newStaff->GetID()); m_editInfo.import("status", status); From bcbde28d54f075e8b7507b4cc7ec21258e493802 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 12 Dec 2023 17:06:45 -0500 Subject: [PATCH 093/249] New for blank files in neume notation --- src/iomei.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/iomei.cpp b/src/iomei.cpp index aaa69f00c64..3a5fd146a75 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -4472,6 +4472,13 @@ bool MEIInput::ReadSectionChildren(Object *parent, pugi::xml_node parentNode) LogWarning("Unsupported '<%s>' within
", current.name()); } } + + // New for blank files in neume notation + if (!unmeasured && parent->Is(SECTION) && (m_doc->m_notationType == NOTATIONTYPE_neume)) { + unmeasured = new Measure(false); + m_doc->SetMensuralMusicOnly(true); + parent->AddChild(unmeasured); + } return success; } From 4a1c61fa96f68fdd7b4d23b3c969b3fcc9b8e2b9 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Tue, 19 Dec 2023 16:37:58 -0500 Subject: [PATCH 094/249] Fix removing clef error --- src/editortoolkit_neume.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index 7fe8ec86401..b80c98efcac 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -2145,10 +2145,11 @@ bool EditorToolkitNeume::Remove(std::string elementId) Object *obj = m_doc->GetDrawingPage()->FindDescendantByID(elementId); assert(obj); bool result = false; - bool isNeumeOrNc, isNc, isClef; + bool isNeumeOrNc, isNc, isClef, isSyllable; isNeumeOrNc = (obj->Is(NC) || obj->Is(NEUME)); isNc = obj->Is(NC); isClef = obj->Is(CLEF); + isSyllable = obj->Is(SYLLABLE); Object *parent = obj->GetParent(); assert(parent); m_editInfo.import("uuid", elementId); @@ -2205,8 +2206,7 @@ bool EditorToolkitNeume::Remove(std::string elementId) pi->AdjustPitchForNewClef(clef, previousClef); } } - - if (obj->Is(SYLLABLE)) { + else if (isSyllable) { Syllable *syllable = dynamic_cast(obj); assert(syllable); if (syllable->HasPrecedes() || syllable->HasFollows()) { From 6ed5103e3c439bc7b7d55c61ebdb9c588767f4e1 Mon Sep 17 00:00:00 2001 From: Yinan Zhou Date: Thu, 21 Dec 2023 16:07:26 -0500 Subject: [PATCH 095/249] Fix staff rotation offset for inserted syllables --- src/editortoolkit_neume.cpp | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/editortoolkit_neume.cpp b/src/editortoolkit_neume.cpp index b80c98efcac..2b1d30f6dc8 100644 --- a/src/editortoolkit_neume.cpp +++ b/src/editortoolkit_neume.cpp @@ -881,22 +881,12 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_HEIGHT_TO_STAFF_SIZE_RATIO); const int noteWidth = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_WIDTH_TO_STAFF_SIZE_RATIO); - ulx -= noteWidth / 2; - - // calculate staff rotation offset - double theta = staff->GetDrawingRotate(); - int offsetY = 0; - if (theta) { - double factor = 1.3; - offsetY = (int)((ulx - staff->GetFacsimileInterface()->GetZone()->GetUlx()) * tan(theta * M_PI / 180.0) - / factor); - } // Set up facsimile zone->SetUlx(ulx); - zone->SetUly(uly + offsetY); + zone->SetUly(uly); zone->SetLrx(ulx + noteWidth); - zone->SetLry(uly + offsetY + noteHeight); + zone->SetLry(uly + noteHeight); // add syl bounding box if Facs if (m_doc->GetType() == Facs) { @@ -904,17 +894,25 @@ bool EditorToolkitNeume::Insert(std::string elementType, std::string staffId, in assert(fi); sylZone = new Zone(); - int draw_h = staff->GetHeight(); - int staffUly = staff->GetDrawingY(); + int staffLry = staff->GetFacsimileInterface()->GetZone()->GetLry(); // width height and offset can be adjusted int bboxHeight = 175; int bboxOffsetX = 50; + // calculate staff rotation offset + double theta = staff->GetDrawingRotate(); + int offsetY = 0; + if (theta) { + double factor = 1.3; + offsetY = (int)((ulx - staff->GetFacsimileInterface()->GetZone()->GetUlx()) * tan(theta * M_PI / 180.0) + / factor); + } + sylZone->SetUlx(ulx); - sylZone->SetUly(staffUly + draw_h + offsetY); + sylZone->SetUly(staffLry + offsetY); sylZone->SetLrx(ulx + noteWidth + bboxOffsetX); - sylZone->SetLry(staffUly + draw_h + offsetY + bboxHeight); + sylZone->SetLry(staffLry + offsetY + bboxHeight); surface->AddChild(sylZone); fi->AttachZone(sylZone); } From 3b005e8391a78478870c0ca1cc912f2bc7e8de27 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 09:23:17 +0100 Subject: [PATCH 096/249] Add Doc::IsFacs helper (and others) and use it --- include/vrv/doc.h | 4 ++++ src/doc.cpp | 8 ++++---- src/iomei.cpp | 2 +- src/layer.cpp | 2 +- src/layerelement.cpp | 4 ++-- src/staff.cpp | 8 ++++---- src/view.cpp | 2 +- src/view_element.cpp | 16 ++++++++-------- src/view_neume.cpp | 12 ++++++------ src/view_page.cpp | 4 ++-- 10 files changed, 33 insertions(+), 29 deletions(-) diff --git a/include/vrv/doc.h b/include/vrv/doc.h index d32fd434a3b..3952633bb49 100644 --- a/include/vrv/doc.h +++ b/include/vrv/doc.h @@ -114,6 +114,10 @@ class Doc : public Object { ///@{ DocType GetType() const { return m_type; } void SetType(DocType type); + bool IsFacs() const { return (m_type == Facs); } + bool IsRaw() const { return (m_type == Raw); } + bool IsRendering() const { return (m_type == Rendering); } + bool IsTranscription() const { return (m_type == Transcription); } ///@} /** diff --git a/src/doc.cpp b/src/doc.cpp index e1dc8fb97de..19a52cf8215 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -869,7 +869,7 @@ void Doc::PrepareData() } /************ Resolve @facs ************/ - if (this->GetType() == Facs) { + if (this->IsFacs()) { // Associate zones with elements PrepareFacsimileFunctor prepareFacsimile(this->GetFacsimile()); this->Process(prepareFacsimile); @@ -1284,7 +1284,7 @@ void Doc::ConvertToCastOffMensuralDoc(bool castOff) if (this->GetType() == Transcription) return; // Do not convert facs files - if (this->GetType() == Facs) return; + if (this->IsFacs()) return; // We are converting to measure music in a definite way if (this->GetOptions()->m_mensuralToMeasure.GetValue()) { @@ -2088,7 +2088,7 @@ int Doc::GetAdjustedDrawingPageHeight() const { assert(m_drawingPage); - if ((this->GetType() == Transcription) || (this->GetType() == Facs)) { + if ((this->GetType() == Transcription) || this->IsFacs()) { return m_drawingPage->m_pageHeight / DEFINITION_FACTOR; } @@ -2100,7 +2100,7 @@ int Doc::GetAdjustedDrawingPageWidth() const { assert(m_drawingPage); - if ((this->GetType() == Transcription) || (this->GetType() == Facs)) { + if ((this->GetType() == Transcription) || this->IsFacs()) { return m_drawingPage->m_pageWidth / DEFINITION_FACTOR; } diff --git a/src/iomei.cpp b/src/iomei.cpp index aaa69f00c64..ed8028cf3f7 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -6940,7 +6940,7 @@ bool MEIInput::ReadStem(Object *parent, pugi::xml_node stem) bool MEIInput::ReadSyl(Object *parent, pugi::xml_node syl) { // Add empty text node for empty syl element for invisible bbox in neume notation - if (!syl.first_child() && (m_doc->GetType() == Facs) && (m_doc->m_notationType == NOTATIONTYPE_neume)) { + if (!syl.first_child() && m_doc->IsFacs() && (m_doc->m_notationType == NOTATIONTYPE_neume)) { syl.text().set(""); } Syl *vrvSyl = new Syl(); diff --git a/src/layer.cpp b/src/layer.cpp index a2ea2da1ba4..a05d48903f1 100644 --- a/src/layer.cpp +++ b/src/layer.cpp @@ -273,7 +273,7 @@ const Clef *Layer::GetClefFacs(const LayerElement *test) const { const Doc *doc = vrv_cast(this->GetFirstAncestor(DOC)); assert(doc); - if (doc->GetType() == Facs) { + if (doc->IsFacs()) { ListOfConstObjects clefs; ClassIdComparison ac(CLEF); doc->FindAllDescendantsBetween(&clefs, &ac, doc->GetFirst(CLEF), test); diff --git a/src/layerelement.cpp b/src/layerelement.cpp index 589bc8e4dd9..90d453f4569 100644 --- a/src/layerelement.cpp +++ b/src/layerelement.cpp @@ -400,7 +400,7 @@ int LayerElement::GetDrawingX() const if (this->HasFacs()) { const Doc *doc = vrv_cast(this->GetFirstAncestor(DOC)); assert(doc); - if (doc->GetType() == Facs) { + if (doc->IsFacs()) { return FacsimileInterface::GetDrawingX(); } } @@ -448,7 +448,7 @@ int LayerElement::GetDrawingY() const if (this->HasFacs()) { const Doc *doc = vrv_cast(this->GetFirstAncestor(DOC)); assert(doc); - if (doc->GetType() == Facs) { + if (doc->IsFacs()) { return FacsimileInterface::GetDrawingY(); } } diff --git a/src/staff.cpp b/src/staff.cpp index 3d91195fea9..9a01f64d063 100644 --- a/src/staff.cpp +++ b/src/staff.cpp @@ -125,7 +125,7 @@ int Staff::GetDrawingX() const if (this->HasFacs()) { const Doc *doc = vrv_cast(this->GetFirstAncestor(DOC)); assert(doc); - if (doc->GetType() == Facs) { + if (doc->IsFacs()) { return FacsimileInterface::GetDrawingX(); } } @@ -137,7 +137,7 @@ int Staff::GetDrawingY() const if (this->HasFacs()) { const Doc *doc = vrv_cast(this->GetFirstAncestor(DOC)); assert(DOC); - if (doc->GetType() == Facs) { + if (doc->IsFacs()) { return FacsimileInterface::GetDrawingY(); } } @@ -160,7 +160,7 @@ double Staff::GetDrawingRotate() const if (this->HasFacs()) { const Doc *doc = vrv_cast(this->GetFirstAncestor(DOC)); assert(doc); - if (doc->GetType() == Facs) { + if (doc->IsFacs()) { return FacsimileInterface::GetDrawingRotate(); } } @@ -172,7 +172,7 @@ void Staff::AdjustDrawingStaffSize() if (this->HasFacs()) { Doc *doc = vrv_cast(this->GetFirstAncestor(DOC)); assert(doc); - if (doc->GetType() == Facs) { + if (doc->IsFacs()) { double rotate = this->GetDrawingRotate(); Zone *zone = this->GetZone(); assert(zone); diff --git a/src/view.cpp b/src/view.cpp index f9ee518f1eb..f474d7c3b8a 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -74,7 +74,7 @@ void View::SetPage(int pageIdx, bool doLayout) m_doc->ScoreDefSetCurrentDoc(); // if we once deal with multiple views, it would be better // to redo the layout only when necessary? - if (m_doc->GetType() == Transcription || m_doc->GetType() == Facs) { + if (m_doc->GetType() == Transcription || m_doc->IsFacs()) { m_currentPage->LayOutTranscription(); } else { diff --git a/src/view_element.cpp b/src/view_element.cpp index c970d76b031..eab43c14a38 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -301,12 +301,12 @@ void View::DrawAccid(DeviceContext *dc, LayerElement *element, Layer *layer, Sta if (notationType == NOTATIONTYPE_neume) { int rotateOffset = 0; - if ((m_doc->GetType() == Facs) && (staff->GetDrawingRotate() != 0)) { + if (m_doc->IsFacs() && (staff->GetDrawingRotate() != 0)) { double deg = staff->GetDrawingRotate(); int xDiff = x - staff->GetDrawingX(); rotateOffset = int(xDiff * tan(deg * M_PI / 180.0)); } - if (accid->HasFacs() && (m_doc->GetType() == Facs)) { + if (accid->HasFacs() && m_doc->IsFacs()) { y = ToLogicalY(y); } y -= rotateOffset; @@ -671,7 +671,7 @@ void View::DrawClef(DeviceContext *dc, LayerElement *element, Layer *layer, Staf if (clef->HasLine()) { y -= m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) * (staff->m_drawingLines - clef->GetLine()); - if ((m_doc->GetType() == Facs) && (staff->GetDrawingRotate() != 0)) { + if (m_doc->IsFacs() && (staff->GetDrawingRotate() != 0)) { double deg = staff->GetDrawingRotate(); int xDiff = x - staff->GetDrawingX(); y -= int(xDiff * tan(deg * M_PI / 180.0)); @@ -689,7 +689,7 @@ void View::DrawClef(DeviceContext *dc, LayerElement *element, Layer *layer, Staf this->DrawSmuflCode(dc, x, y, sym, staff->m_drawingStaffSize, false); - if ((m_doc->GetType() == Facs) && element->HasFacs()) { + if (m_doc->IsFacs() && element->HasFacs()) { const int noteHeight = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_HEIGHT_TO_STAFF_SIZE_RATIO); const int noteWidth @@ -748,7 +748,7 @@ void View::DrawCustos(DeviceContext *dc, LayerElement *element, Layer *layer, St const int sym = custos->GetCustosGlyph(staff->m_drawingNotationType); int x, y; - if (custos->HasFacs() && m_doc->GetType() == Facs) { + if (custos->HasFacs() && m_doc->IsFacs()) { x = custos->GetDrawingX(); // Recalculate y from pitch to prevent visual/meaning mismatch Clef *clef = layer->GetClef(element); @@ -777,7 +777,7 @@ void View::DrawCustos(DeviceContext *dc, LayerElement *element, Layer *layer, St y -= m_doc->GetDrawingUnit(staff->m_drawingStaffSize); } - if ((m_doc->GetType() == Facs) && (staff->GetDrawingRotate() != 0)) { + if (m_doc->IsFacs() && (staff->GetDrawingRotate() != 0)) { double deg = staff->GetDrawingRotate(); int xDiff = x - staff->GetDrawingX(); y -= int(xDiff * tan(deg * M_PI / 180.0)); @@ -785,7 +785,7 @@ void View::DrawCustos(DeviceContext *dc, LayerElement *element, Layer *layer, St this->DrawSmuflCode(dc, x, y, sym, staff->m_drawingStaffSize, false, true); - if ((m_doc->GetType() == Facs) && element->HasFacs()) { + if (m_doc->IsFacs() && element->HasFacs()) { const int noteHeight = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / 2); const int noteWidth = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / 1.4); @@ -1770,7 +1770,7 @@ void View::DrawSyl(DeviceContext *dc, LayerElement *element, Layer *layer, Staff TextDrawingParams params; params.m_x = syl->GetDrawingX(); params.m_y = syl->GetDrawingY(); - if (m_doc->GetType() == Facs) { + if (m_doc->IsFacs()) { params.m_width = syl->GetDrawingWidth(); params.m_height = syl->GetDrawingHeight(); } diff --git a/src/view_neume.cpp b/src/view_neume.cpp index cbdf0b8c624..eeeaed614b1 100644 --- a/src/view_neume.cpp +++ b/src/view_neume.cpp @@ -204,12 +204,12 @@ void View::DrawNc(DeviceContext *dc, LayerElement *element, Layer *layer, Staff = (int)(m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) / NOTE_WIDTH_TO_STAFF_SIZE_RATIO); int noteY, noteX; int yValue; - if (nc->HasFacs() && (m_doc->GetType() == Facs)) { + if (nc->HasFacs() && m_doc->IsFacs()) { noteY = ToLogicalY(staff->GetDrawingY()); noteX = nc->GetDrawingX(); params.at(0).xOffset = 0; } - else if (neume->HasFacs() && (m_doc->GetType() == Facs)) { + else if (neume->HasFacs() && m_doc->IsFacs()) { noteY = ToLogicalY(staff->GetDrawingY()); noteX = neume->GetDrawingX() + position * noteWidth; } @@ -229,7 +229,7 @@ void View::DrawNc(DeviceContext *dc, LayerElement *element, Layer *layer, Staff } int octaveOffset = (nc->GetOct() - clefOctave) * ((staffSize / 2) * 7); int rotateOffset; - if ((m_doc->GetType() == Facs) && (staff->GetDrawingRotate() != 0)) { + if (m_doc->IsFacs() && (staff->GetDrawingRotate() != 0)) { double deg = staff->GetDrawingRotate(); int xDiff = noteX - staff->GetDrawingX(); rotateOffset = int(xDiff * tan(deg * M_PI / 180.0)); @@ -265,7 +265,7 @@ void View::DrawNc(DeviceContext *dc, LayerElement *element, Layer *layer, Staff } // adjust facsimile values of element based on where it is rendered if necessary - if ((m_doc->GetType() == Facs) && element->HasFacs()) { + if (m_doc->IsFacs() && element->HasFacs()) { FacsimileInterface *fi = element->GetFacsimileInterface(); fi->GetZone()->SetUlx(noteX); fi->GetZone()->SetUly(ToDeviceContextY(yValue)); @@ -380,7 +380,7 @@ void View::DrawDivLine(DeviceContext *dc, LayerElement *element, Layer *layer, S } int x, y; - if ((m_doc->GetType() == Facs) && (divLine->HasFacs())) { + if (m_doc->IsFacs() && (divLine->HasFacs())) { x = divLine->GetDrawingX(); y = ToLogicalY(staff->GetDrawingY()); } @@ -393,7 +393,7 @@ void View::DrawDivLine(DeviceContext *dc, LayerElement *element, Layer *layer, S y -= (m_doc->GetDrawingUnit(staff->m_drawingStaffSize)) * 3; int rotateOffset; - if ((m_doc->GetType() == Facs) && (staff->GetDrawingRotate() != 0)) { + if (m_doc->IsFacs() && (staff->GetDrawingRotate() != 0)) { double deg = staff->GetDrawingRotate(); int xDiff = x - staff->GetDrawingX(); rotateOffset = int(xDiff * tan(deg * M_PI / 180.0)); diff --git a/src/view_page.cpp b/src/view_page.cpp index 7a49126257c..51d8b78be5c 100644 --- a/src/view_page.cpp +++ b/src/view_page.cpp @@ -1238,7 +1238,7 @@ void View::DrawStaff(DeviceContext *dc, Staff *staff, Measure *measure, System * dc->StartGraphic(staff, "", staff->GetID()); - if (m_doc->GetType() == Facs) { + if (m_doc->IsFacs()) { staff->SetFromFacsimile(m_doc); } @@ -1283,7 +1283,7 @@ void View::DrawStaffLines(DeviceContext *dc, Staff *staff, Measure *measure, Sys int j, x1, x2, y1, y2; - if (staff->HasFacs() && (m_doc->GetType() == Facs)) { + if (staff->HasFacs() && m_doc->IsFacs()) { double d = staff->GetDrawingRotate(); x1 = staff->GetDrawingX(); x2 = x1 + staff->GetWidth(); From a2667ae15381bd5b08123bdd44c4336e54df933e Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 09:31:29 +0100 Subject: [PATCH 097/249] Use Doc::IsTranscription helper --- src/doc.cpp | 6 +++--- src/iomei.cpp | 22 +++++++++++----------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/doc.cpp b/src/doc.cpp index 19a52cf8215..8d1710d09e3 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -1281,7 +1281,7 @@ void Doc::ConvertToCastOffMensuralDoc(bool castOff) if (!m_isMensuralMusicOnly) return; // Do not convert transcription files - if (this->GetType() == Transcription) return; + if (this->IsTranscription()) return; // Do not convert facs files if (this->IsFacs()) return; @@ -2088,7 +2088,7 @@ int Doc::GetAdjustedDrawingPageHeight() const { assert(m_drawingPage); - if ((this->GetType() == Transcription) || this->IsFacs()) { + if (this->IsTranscription() || this->IsFacs()) { return m_drawingPage->m_pageHeight / DEFINITION_FACTOR; } @@ -2100,7 +2100,7 @@ int Doc::GetAdjustedDrawingPageWidth() const { assert(m_drawingPage); - if ((this->GetType() == Transcription) || this->IsFacs()) { + if (this->IsTranscription() || this->IsFacs()) { return m_drawingPage->m_pageWidth / DEFINITION_FACTOR; } diff --git a/src/iomei.cpp b/src/iomei.cpp index ed8028cf3f7..07ed3f6ce56 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -4141,7 +4141,7 @@ bool MEIInput::ReadPage(Object *parent, pugi::xml_node page) Page *vrvPage = new Page(); this->SetMeiID(page, vrvPage); - if ((m_doc->GetType() == Transcription) && (m_meiversion == meiVersion_MEIVERSION_2013)) { + if (m_doc->IsTranscription() && (m_meiversion == meiVersion_MEIVERSION_2013)) { UpgradePageTo_3_0_0(vrvPage, m_doc); } @@ -4180,12 +4180,12 @@ bool MEIInput::ReadPage(Object *parent, pugi::xml_node page) parent->AddChild(vrvPage); bool success = this->ReadPageChildren(vrvPage, page); - if (success && (m_doc->GetType() == Transcription) && (vrvPage->GetPPUFactor() != 1.0)) { + if (success && m_doc->IsTranscription() && (vrvPage->GetPPUFactor() != 1.0)) { ApplyPPUFactorFunctor applyPPUFactor; vrvPage->Process(applyPPUFactor); } - if ((m_doc->GetType() == Transcription) && (m_meiversion == meiVersion_MEIVERSION_2013)) { + if (m_doc->IsTranscription() && (m_meiversion == meiVersion_MEIVERSION_2013)) { UpgradePageTo_5_0(vrvPage); } @@ -4563,7 +4563,7 @@ bool MEIInput::ReadSystem(Object *parent, pugi::xml_node system) vrvSystem->m_systemRightMar = system.attribute("system.rightmar").as_int(); system.remove_attribute("system.rightmar"); } - if (system.attribute("uly") && (m_doc->GetType() == Transcription)) { + if (system.attribute("uly") && m_doc->IsTranscription()) { vrvSystem->m_yAbs = system.attribute("uly").as_int() * DEFINITION_FACTOR; system.remove_attribute("uly"); } @@ -4612,7 +4612,7 @@ bool MEIInput::ReadSystemChildren(Object *parent, pugi::xml_node parentNode) assert(system); unmeasured = new Measure(false); m_doc->SetMensuralMusicOnly(true); - if ((m_doc->GetType() == Transcription) && (m_meiversion == meiVersion_MEIVERSION_2013)) { + if (m_doc->IsTranscription() && (m_meiversion == meiVersion_MEIVERSION_2013)) { UpgradeMeasureTo_3_0_0(unmeasured, system); } system->AddChild(unmeasured); @@ -5348,11 +5348,11 @@ bool MEIInput::ReadMeasure(Object *parent, pugi::xml_node measure) vrvMeasure->ReadPointing(measure); vrvMeasure->ReadTyped(measure); - if ((m_doc->GetType() == Transcription) && (m_meiversion == meiVersion_MEIVERSION_2013)) { + if (m_doc->IsTranscription() && (m_meiversion == meiVersion_MEIVERSION_2013)) { UpgradeMeasureTo_5_0(measure); } - if (measure.attribute("coord.x1") && measure.attribute("coord.x2") && (m_doc->GetType() == Transcription)) { + if (measure.attribute("coord.x1") && measure.attribute("coord.x2") && m_doc->IsTranscription()) { vrvMeasure->ReadCoordX1(measure); vrvMeasure->ReadCoordX2(measure); vrvMeasure->m_xAbs = vrvMeasure->GetCoordX1() * DEFINITION_FACTOR; @@ -6042,11 +6042,11 @@ bool MEIInput::ReadStaff(Object *parent, pugi::xml_node staff) vrvStaff->ReadTyped(staff); vrvStaff->ReadVisibility(staff); - if ((m_doc->GetType() == Transcription) && (m_meiversion == meiVersion_MEIVERSION_2013)) { + if (m_doc->IsTranscription() && (m_meiversion == meiVersion_MEIVERSION_2013)) { UpgradeStaffTo_5_0(staff); } - if (staff.attribute("coord.y1") && (m_doc->GetType() == Transcription)) { + if (staff.attribute("coord.y1") && m_doc->IsTranscription()) { vrvStaff->ReadCoordY1(staff); vrvStaff->m_yAbs = vrvStaff->GetCoordY1() * DEFINITION_FACTOR; } @@ -6281,11 +6281,11 @@ bool MEIInput::ReadLayerElement(pugi::xml_node element, LayerElement *object) object->ReadLabelled(element); object->ReadTyped(element); - if ((m_doc->GetType() == Transcription) && (m_meiversion == meiVersion_MEIVERSION_2013)) { + if (m_doc->IsTranscription() && (m_meiversion == meiVersion_MEIVERSION_2013)) { UpgradeLayerElementTo_5_0(element); } - if (element.attribute("coord.x1") && (m_doc->GetType() == Transcription)) { + if (element.attribute("coord.x1") && m_doc->IsTranscription()) { object->ReadCoordX1(element); object->m_xAbs = object->GetCoordX1() * DEFINITION_FACTOR; } From 28b980855fb3e381f78477b207e2ce2439d6b8f5 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 09:38:25 +0100 Subject: [PATCH 098/249] Use Doc type helpers in Toolkit and in DrawClef --- src/toolkit.cpp | 10 +++++----- src/view_element.cpp | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/toolkit.cpp b/src/toolkit.cpp index cb8fe6e8ada..bcfd058ebe3 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -751,7 +751,7 @@ bool Toolkit::LoadData(const std::string &data) // Always set breaks to 'none' with Transcription or Facs rendering - rendering them differenty requires the MEI // to be converted - if (m_doc.GetType() == Transcription || m_doc.GetType() == Facs) breaks = BREAKS_none; + if (m_doc.IsTranscription() || m_doc.IsFacs()) breaks = BREAKS_none; if (breaks != BREAKS_none) { if (input->GetLayoutInformation() == LAYOUT_ENCODED @@ -1402,7 +1402,7 @@ void Toolkit::RedoLayout(const std::string &jsonOptions) this->ResetLogBuffer(); - if ((this->GetPageCount() == 0) || (m_doc.GetType() == Transcription) || (m_doc.GetType() == Facs)) { + if ((this->GetPageCount() == 0) || m_doc.IsTranscription() || m_doc.IsFacs()) { LogWarning("No data to re-layout"); return; } @@ -1465,7 +1465,7 @@ bool Toolkit::RenderToDeviceContext(int pageNo, DeviceContext *deviceContext) if (adjustWidth || (breaks == BREAKS_none)) width = m_doc.GetAdjustedDrawingPageWidth(); if (adjustHeight || (breaks == BREAKS_none)) height = m_doc.GetAdjustedDrawingPageHeight(); - if (m_doc.GetType() == Transcription) { + if (m_doc.IsTranscription()) { width = m_doc.GetAdjustedDrawingPageWidth(); height = m_doc.GetAdjustedDrawingPageHeight(); } @@ -1488,7 +1488,7 @@ bool Toolkit::RenderToDeviceContext(int pageNo, DeviceContext *deviceContext) deviceContext->SetWidth(width); deviceContext->SetHeight(height); - if (m_doc.GetType() == Facs) { + if (m_doc.IsFacs()) { deviceContext->SetWidth(m_doc.GetFacsimile()->GetMaxX()); deviceContext->SetHeight(m_doc.GetFacsimile()->GetMaxY()); } @@ -1524,7 +1524,7 @@ std::string Toolkit::RenderToSVG(int pageNo, bool xmlDeclaration) svg.SetMMOutput(true); } - if (m_doc.GetType() == Facs) { + if (m_doc.IsFacs()) { svg.SetFacsimile(true); } diff --git a/src/view_element.cpp b/src/view_element.cpp index eab43c14a38..82ba0443207 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -653,7 +653,7 @@ void View::DrawClef(DeviceContext *dc, LayerElement *element, Layer *layer, Staf } int x, y; - if (m_doc->GetType() == Facs && clef->HasFacs()) { + if (m_doc->IsFacs() && clef->HasFacs()) { y = ToLogicalY(staff->GetDrawingY()); x = clef->GetDrawingX(); } From b071364e2c374b24c99da8cf12f4db1a3bef3f39 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 10:02:30 +0100 Subject: [PATCH 099/249] Remove unnecessary check in FacsimileInterface::GetSurfaceY * Same check is performed in Surface::GetMaxY --- src/facsimileinterface.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/facsimileinterface.cpp b/src/facsimileinterface.cpp index 6ef3a50b88a..420b18be836 100644 --- a/src/facsimileinterface.cpp +++ b/src/facsimileinterface.cpp @@ -79,12 +79,7 @@ int FacsimileInterface::GetSurfaceY() const assert(m_zone); Surface *surface = vrv_cast(m_zone->GetFirstAncestor(SURFACE)); assert(surface); - if (surface->HasLry()) { - return surface->GetLry(); - } - else { - return surface->GetMaxY(); - } + return surface->GetMaxY(); } void FacsimileInterface::AttachZone(Zone *zone) From d8600ed22957539dc191f82060141a95af8162e2 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 10:37:59 +0100 Subject: [PATCH 100/249] Read and write `staff@facs` through Read/WriteFacsimileInterface * Also remove call to Read/WriteFacsimileInterface in LayerElement child classes --- src/iomei.cpp | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/iomei.cpp b/src/iomei.cpp index 07ed3f6ce56..ba53ace1cb0 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -2216,7 +2216,7 @@ void MEIOutput::WriteStaff(pugi::xml_node currentNode, Staff *staff) assert(staff); this->WriteXmlId(currentNode, staff); - staff->WriteFacsimile(currentNode); + this->WriteFacsimileInterface(currentNode, staff); staff->WriteNInteger(currentNode); staff->WriteTyped(currentNode); staff->WriteVisibility(currentNode); @@ -2298,6 +2298,7 @@ void MEIOutput::WriteLayerElement(pugi::xml_node currentNode, LayerElement *elem assert(element); this->WriteXmlId(currentNode, element); + this->WriteFacsimileInterface(currentNode, element); this->WriteLinkingInterface(currentNode, element); element->WriteLabelled(currentNode); element->WriteTyped(currentNode); @@ -2320,7 +2321,6 @@ void MEIOutput::WriteAccid(pugi::xml_node currentNode, Accid *accid) } WriteLayerElement(currentNode, accid); - WriteFacsimileInterface(currentNode, accid); WritePositionInterface(currentNode, accid); accid->WriteAccidental(currentNode); accid->WriteAccidentalGes(currentNode); @@ -2433,7 +2433,6 @@ void MEIOutput::WriteClef(pugi::xml_node currentNode, Clef *clef) } this->WriteLayerElement(currentNode, clef); - this->WriteFacsimileInterface(currentNode, clef); clef->WriteClefLog(currentNode); clef->WriteClefShape(currentNode); clef->WriteColor(currentNode); @@ -2451,7 +2450,6 @@ void MEIOutput::WriteCustos(pugi::xml_node currentNode, Custos *custos) { assert(custos); - this->WriteFacsimileInterface(currentNode, custos); this->WritePitchInterface(currentNode, custos); this->WritePositionInterface(currentNode, custos); this->WriteLayerElement(currentNode, custos); @@ -2465,7 +2463,6 @@ void MEIOutput::WriteDivLine(pugi::xml_node currentNode, DivLine *divLine) assert(divLine); this->WriteLayerElement(currentNode, divLine); - this->WriteFacsimileInterface(currentNode, divLine); divLine->WriteDivLineLog(currentNode); divLine->WriteColor(currentNode); divLine->WriteVisibility(currentNode); @@ -2698,7 +2695,6 @@ void MEIOutput::WriteNc(pugi::xml_node currentNode, Nc *nc) this->WriteLayerElement(currentNode, nc); this->WriteDurationInterface(currentNode, nc); - this->WriteFacsimileInterface(currentNode, nc); this->WritePitchInterface(currentNode, nc); this->WritePositionInterface(currentNode, nc); nc->WriteColor(currentNode); @@ -2711,7 +2707,6 @@ void MEIOutput::WriteNeume(pugi::xml_node currentNode, Neume *neume) assert(neume); this->WriteLayerElement(currentNode, neume); - this->WriteFacsimileInterface(currentNode, neume); neume->WriteColor(currentNode); } @@ -2830,7 +2825,6 @@ void MEIOutput::WriteSyl(pugi::xml_node currentNode, Syl *syl) assert(syl); this->WriteLayerElement(currentNode, syl); - this->WriteFacsimileInterface(currentNode, syl); syl->WriteLang(currentNode); syl->WriteTypography(currentNode); syl->WriteSylLog(currentNode); @@ -6036,8 +6030,8 @@ bool MEIInput::ReadStaff(Object *parent, pugi::xml_node staff) { Staff *vrvStaff = new Staff(); this->SetMeiID(staff, vrvStaff); + this->ReadFacsimileInterface(staff, vrvStaff); - vrvStaff->ReadFacsimile(staff); vrvStaff->ReadNInteger(staff); vrvStaff->ReadTyped(staff); vrvStaff->ReadVisibility(staff); @@ -6277,6 +6271,7 @@ bool MEIInput::ReadLayerChildren(Object *parent, pugi::xml_node parentNode, Obje bool MEIInput::ReadLayerElement(pugi::xml_node element, LayerElement *object) { this->SetMeiID(element, object); + this->ReadFacsimileInterface(element, object); this->ReadLinkingInterface(element, object); object->ReadLabelled(element); object->ReadTyped(element); @@ -6299,7 +6294,6 @@ bool MEIInput::ReadAccid(Object *parent, pugi::xml_node accid) this->ReadLayerElement(accid, vrvAccid); ReadPositionInterface(accid, vrvAccid); - ReadFacsimileInterface(accid, vrvAccid); vrvAccid->ReadAccidental(accid); vrvAccid->ReadAccidentalGes(accid); vrvAccid->ReadAccidLog(accid); @@ -6444,7 +6438,6 @@ bool MEIInput::ReadClef(Object *parent, pugi::xml_node clef) { Clef *vrvClef = new Clef(); this->ReadLayerElement(clef, vrvClef); - this->ReadFacsimileInterface(clef, vrvClef); vrvClef->ReadClefLog(clef); vrvClef->ReadClefShape(clef); @@ -6502,7 +6495,6 @@ bool MEIInput::ReadDivLine(Object *parent, pugi::xml_node divLine) DivLine *vrvDivLine = new DivLine(); this->ReadLayerElement(divLine, vrvDivLine); - this->ReadFacsimileInterface(divLine, vrvDivLine); vrvDivLine->ReadDivLineLog(divLine); vrvDivLine->ReadColor(divLine); vrvDivLine->ReadVisibility(divLine); @@ -6785,7 +6777,6 @@ bool MEIInput::ReadNc(Object *parent, pugi::xml_node nc) this->ReadLayerElement(nc, vrvNc); this->ReadDurationInterface(nc, vrvNc); - this->ReadFacsimileInterface(nc, vrvNc); this->ReadPitchInterface(nc, vrvNc); this->ReadPositionInterface(nc, vrvNc); vrvNc->ReadColor(nc); @@ -6800,7 +6791,6 @@ bool MEIInput::ReadNeume(Object *parent, pugi::xml_node neume) { Neume *vrvNeume = new Neume(); this->ReadLayerElement(neume, vrvNeume); - this->ReadFacsimileInterface(neume, vrvNeume); vrvNeume->ReadColor(neume); From 24bc829ff1e29163177c4a24eecab8586b50e4f5 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 10:40:02 +0100 Subject: [PATCH 101/249] Add FacsimileInterface to Measure --- include/vrv/measure.h | 2 ++ src/iomei.cpp | 3 +++ src/measure.cpp | 3 +++ 3 files changed, 8 insertions(+) diff --git a/include/vrv/measure.h b/include/vrv/measure.h index e9fe0cef9ca..f431913b8a3 100644 --- a/include/vrv/measure.h +++ b/include/vrv/measure.h @@ -11,6 +11,7 @@ #include "atts_cmn.h" #include "atts_shared.h" #include "barline.h" +#include "facsimileinterface.h" #include "horizontalaligner.h" #include "object.h" @@ -34,6 +35,7 @@ class TimestampAttr; * For internally simplication of processing, unmeasured music is contained in one single measure object */ class Measure : public Object, + public FacsimileInterface, public AttBarring, public AttCoordX1, public AttCoordX2, diff --git a/src/iomei.cpp b/src/iomei.cpp index ba53ace1cb0..e612b02b1c9 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -1883,6 +1883,8 @@ void MEIOutput::WriteMeasure(pugi::xml_node currentNode, Measure *measure) assert(measure); this->WriteXmlId(currentNode, measure); + this->WriteFacsimileInterface(currentNode, measure); + measure->WriteBarring(currentNode); measure->WriteMeasureLog(currentNode); measure->WriteMeterConformanceBar(currentNode); @@ -5334,6 +5336,7 @@ bool MEIInput::ReadMeasure(Object *parent, pugi::xml_node measure) m_doc->SetMensuralMusicOnly(false); } this->SetMeiID(measure, vrvMeasure); + this->ReadFacsimileInterface(measure, vrvMeasure); vrvMeasure->ReadBarring(measure); vrvMeasure->ReadMeasureLog(measure); diff --git a/src/measure.cpp b/src/measure.cpp index b6cff691a5a..3e5cf77f2db 100644 --- a/src/measure.cpp +++ b/src/measure.cpp @@ -56,6 +56,7 @@ static const ClassRegistrar s_factory("measure", MEASURE); Measure::Measure(bool measureMusic, int logMeasureNb) : Object(MEASURE, "measure-") + , FacsimileInterface() , AttBarring() , AttCoordX1() , AttCoordX2() @@ -73,6 +74,7 @@ Measure::Measure(bool measureMusic, int logMeasureNb) this->RegisterAttClass(ATT_NNUMBERLIKE); this->RegisterAttClass(ATT_POINTING); this->RegisterAttClass(ATT_TYPED); + this->RegisterInterface(FacsimileInterface::GetAttClasses(), FacsimileInterface::IsInterface()); m_measuredMusic = measureMusic; @@ -121,6 +123,7 @@ void Measure::CloneReset() void Measure::Reset() { Object::Reset(); + FacsimileInterface::Reset(); this->ResetCoordX1(); this->ResetCoordX2(); this->ResetMeasureLog(); From da9470f6e878719ceff966262d6411da54acfaa5 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 11:12:28 +0100 Subject: [PATCH 102/249] Add FacsimileInterface getters to Measure --- Verovio.xcodeproj/project.pbxproj | 16 ++++++++ include/vrv/facsimilefunctor.h | 62 +++++++++++++++++++++++++++++++ include/vrv/measure.h | 11 ++++++ src/facsimilefunctor.cp | 45 ++++++++++++++++++++++ 4 files changed, 134 insertions(+) create mode 100644 include/vrv/facsimilefunctor.h create mode 100644 src/facsimilefunctor.cp diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index b129cb6e9af..ff5bdc6da47 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -800,6 +800,12 @@ 4DE96E3B21C4373200CB85BE /* bracketspan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DE96E3A21C4373200CB85BE /* bracketspan.cpp */; }; 4DE96E3C21C4373200CB85BE /* bracketspan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DE96E3A21C4373200CB85BE /* bracketspan.cpp */; }; 4DE96E3D21C4373200CB85BE /* bracketspan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DE96E3A21C4373200CB85BE /* bracketspan.cpp */; }; + 4DEBE6E12B36E78900B67DFB /* facsimilefunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DEBE6E02B36E78900B67DFB /* facsimilefunctor.h */; }; + 4DEBE6E22B36E78900B67DFB /* facsimilefunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DEBE6E02B36E78900B67DFB /* facsimilefunctor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4DEBE6E42B36E79600B67DFB /* facsimilefunctor.cp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cp */; }; + 4DEBE6E52B36E79600B67DFB /* facsimilefunctor.cp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cp */; }; + 4DEBE6E62B36E9B300B67DFB /* facsimilefunctor.cp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cp */; }; + 4DEBE6E72B36E9B400B67DFB /* facsimilefunctor.cp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cp */; }; 4DEC4D5A21C800A000D1D273 /* abbr.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DEC4D5921C8009600D1D273 /* abbr.h */; }; 4DEC4D7A21C8048700D1D273 /* abbr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEC4D7921C8048700D1D273 /* abbr.cpp */; }; 4DEC4D7B21C8048700D1D273 /* abbr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEC4D7921C8048700D1D273 /* abbr.cpp */; }; @@ -2014,6 +2020,8 @@ 4DE644F41EDBEA01002FBE6C /* breath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = breath.cpp; path = src/breath.cpp; sourceTree = ""; }; 4DE96E3821C4370E00CB85BE /* bracketspan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bracketspan.h; path = include/vrv/bracketspan.h; sourceTree = ""; }; 4DE96E3A21C4373200CB85BE /* bracketspan.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bracketspan.cpp; path = src/bracketspan.cpp; sourceTree = ""; }; + 4DEBE6E02B36E78900B67DFB /* facsimilefunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = facsimilefunctor.h; path = include/vrv/facsimilefunctor.h; sourceTree = ""; }; + 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = facsimilefunctor.cp; path = src/facsimilefunctor.cp; sourceTree = ""; }; 4DEC4D5921C8009600D1D273 /* abbr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = abbr.h; path = include/vrv/abbr.h; sourceTree = ""; }; 4DEC4D7921C8048700D1D273 /* abbr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = abbr.cpp; path = src/abbr.cpp; sourceTree = ""; }; 4DEC4D7D21C804C500D1D273 /* add.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = add.cpp; path = src/add.cpp; sourceTree = ""; }; @@ -3012,6 +3020,8 @@ E7265E6D29DC6FD200D11F41 /* castofffunctor.h */, E763EF4129E939FB0029E56D /* convertfunctor.cpp */, E763EF3E29E939C00029E56D /* convertfunctor.h */, + 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cp */, + 4DEBE6E02B36E78900B67DFB /* facsimilefunctor.h */, E74A806028BC9111005274E7 /* findfunctor.cpp */, E74A806528BC97D5005274E7 /* findfunctor.h */, E722106528F856C4002CD6E9 /* findlayerelementsfunctor.cpp */, @@ -3384,6 +3394,7 @@ 40DA9C3720905CEB006BED92 /* ioabc.h in Headers */, 4DB3D8CD1F83D11100B5FC2B /* harm.h in Headers */, 40D45EC2204EEAFB009C1EC9 /* instrdef.h in Headers */, + 4DEBE6E12B36E78900B67DFB /* facsimilefunctor.h in Headers */, 4D94E0E22995411100F49F89 /* meibasic.h in Headers */, BD2E4D9B2875882200B04350 /* stem.h in Headers */, 4DACC9EA2990F29A00B55913 /* attmodule.h in Headers */, @@ -3441,6 +3452,7 @@ E7908EA0298582090004C1F9 /* alignfunctor.h in Headers */, BB4C4B9822A932E5001F6AF0 /* durationinterface.h in Headers */, BB4C4BB722A932F6001F6AF0 /* jsonxx.h in Headers */, + 4DEBE6E22B36E78900B67DFB /* facsimilefunctor.h in Headers */, BB4C4B1622A932C8001F6AF0 /* systemelement.h in Headers */, BB4C4AC622A932B6001F6AF0 /* measure.h in Headers */, E741AD00299A3D3500854426 /* calcslurdirectionfunctor.h in Headers */, @@ -3926,6 +3938,7 @@ E7F39C6229A62B430055DBE0 /* adjustclefchangesfunctor.cpp in Sources */, E79320682991454000D80975 /* calcstemfunctor.cpp in Sources */, 4DED4F18294733140073E504 /* altsyminterface.cpp in Sources */, + 4DEBE6E72B36E9B400B67DFB /* facsimilefunctor.cp in Sources */, 4DEF8A6521B7AAF90093A76B /* f.cpp in Sources */, 4D2073F922A3BCE000E0765F /* tabdursym.cpp in Sources */, 4D16940B1E3A44F300569BF4 /* keysig.cpp in Sources */, @@ -4206,6 +4219,7 @@ 8F086EF1188539540037FD8E /* keysig.cpp in Sources */, E74A806C28BC98B2005274E7 /* functorinterface.cpp in Sources */, E7870357299CF06D00156DC4 /* adjustarpegfunctor.cpp in Sources */, + 4DEBE6E62B36E9B300B67DFB /* facsimilefunctor.cp in Sources */, 4DEC4D9E21C81E9400D1D273 /* orig.cpp in Sources */, 4DDBBB5D1C7AE45900054AFF /* hairpin.cpp in Sources */, 4D43C30C1A9BB22A00EA28F3 /* view_mensural.cpp in Sources */, @@ -4489,6 +4503,7 @@ 4DB3D8D51F83D12B00B5FC2B /* tempo.cpp in Sources */, 4DEC4DA021C81E9400D1D273 /* orig.cpp in Sources */, E7F39C6329A62B440055DBE0 /* adjustclefchangesfunctor.cpp in Sources */, + 4DEBE6E42B36E79600B67DFB /* facsimilefunctor.cp in Sources */, E79320692991454000D80975 /* calcstemfunctor.cpp in Sources */, 8F3DD33E18854B2E0051330C /* beam.cpp in Sources */, 4DED4F19294733140073E504 /* altsyminterface.cpp in Sources */, @@ -4771,6 +4786,7 @@ E793206A2991454100D80975 /* calcstemfunctor.cpp in Sources */, BB4C4AD722A932B6001F6AF0 /* staff.cpp in Sources */, 4DED4F1A294733140073E504 /* altsyminterface.cpp in Sources */, + 4DEBE6E52B36E79600B67DFB /* facsimilefunctor.cp in Sources */, BB4C4B9F22A932E5001F6AF0 /* positioninterface.cpp in Sources */, BB4C4B5322A932D7001F6AF0 /* halfmrpt.cpp in Sources */, BB4C4B8722A932DF001F6AF0 /* num.cpp in Sources */, diff --git a/include/vrv/facsimilefunctor.h b/include/vrv/facsimilefunctor.h new file mode 100644 index 00000000000..f31c3b887cc --- /dev/null +++ b/include/vrv/facsimilefunctor.h @@ -0,0 +1,62 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: facsimilefunctor.h +// Author: Laurent Pugin +// Created: 2023 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_FACSIMILEFUNCTOR_H__ +#define __VRV_FACSIMILEFUNCTOR_H__ + +#include "functor.h" + +namespace vrv { + +class LayerElement; +class Measure; +class Staff; + +//---------------------------------------------------------------------------- +// SyncFromFacsimileFunctor +//---------------------------------------------------------------------------- + +/** + * This class sync the layout encoded in the facsimile to m_Abs members + */ +class SyncFromFacsimileFunctor : public Functor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + SyncFromFacsimileFunctor(); + virtual ~SyncFromFacsimileFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return false; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitLayerElement(LayerElement *layerElement) override; + FunctorCode VisitMeasure(Measure *measure) override; + FunctorCode VisitStaff(Staff *staff) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // +}; + +} // namespace vrv + +#endif // __VRV_FACSIMILEFUNCTOR_H__ diff --git a/include/vrv/measure.h b/include/vrv/measure.h index f431913b8a3..e76832df519 100644 --- a/include/vrv/measure.h +++ b/include/vrv/measure.h @@ -65,6 +65,17 @@ class Measure : public Object, */ void CloneReset() override; + /** + * @name Getter to interfaces + */ + ///@{ + FacsimileInterface *GetFacsimileInterface() override { return vrv_cast(this); } + const FacsimileInterface *GetFacsimileInterface() const override + { + return vrv_cast(this); + } + ///@} + /** * Return true if measured music (otherwise we have fake measures) */ diff --git a/src/facsimilefunctor.cp b/src/facsimilefunctor.cp new file mode 100644 index 00000000000..4b3aaa946bd --- /dev/null +++ b/src/facsimilefunctor.cp @@ -0,0 +1,45 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: facsimilefunctor.cpp +// Author: Laurent Pugin +// Created: 2023 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#include "facsimilefunctor.h" + +//---------------------------------------------------------------------------- + +#include "doc.h" +#include "layerelement.h" +#include "measure.h" +#include "staff.h" +#include "vrv.h" + +//---------------------------------------------------------------------------- + +namespace vrv { + +//---------------------------------------------------------------------------- +// SyncFromFacsimileFunctor +//---------------------------------------------------------------------------- + +SyncFromFacsimileFunctor::SyncFromFacsimileFunctor() : Functor() +{ +} + +FunctorCode SyncFromFacsimileFunctor::VisitLayerElement(LayerElement *layerElement) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode SyncFromFacsimileFunctor::VisitMeasure(Measure *measure) +{ + return FUNCTOR_CONTINUE; +} + +FunctorCode SyncFromFacsimileFunctor::VisitStaff(Staff *staff) +{ + return FUNCTOR_CONTINUE; +} + +} // namespace vrv From dabd14bd4976f95140beeb5b76894c235080abab Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 16:06:08 +0000 Subject: [PATCH 103/249] Add Doc::SyncFromFacsimileDoc and implement functor --- include/vrv/doc.h | 7 ++++++- src/doc.cpp | 10 ++++++++++ src/facsimilefunctor.cp | 17 +++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/include/vrv/doc.h b/include/vrv/doc.h index 3952633bb49..f4113c32aff 100644 --- a/include/vrv/doc.h +++ b/include/vrv/doc.h @@ -109,7 +109,6 @@ class Doc : public Object { /** * Getter and setter for the DocType. - * The setter resets the document. */ ///@{ DocType GetType() const { return m_type; } @@ -370,6 +369,12 @@ class Doc : public Object { */ void ConvertMarkupDoc(bool permanent = true); + /** + * Sync the coordinate provided trought to m_Abs. + * Call the SyncToFacsimile functor. + */ + void SyncFromFacsimileDoc(); + /** * Transpose the content of the doc. */ diff --git a/src/doc.cpp b/src/doc.cpp index 8d1710d09e3..b48afdd4b5d 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -23,6 +23,7 @@ #include "convertfunctor.h" #include "docselection.h" #include "expansion.h" +#include "facsimilefunctor.h" #include "featureextractor.h" #include "functor.h" #include "glyph.h" @@ -1391,6 +1392,15 @@ void Doc::ConvertMarkupDoc(bool permanent) } } +void Doc::SyncFromFacsimileDoc() +{ + PrepareFacsimileFunctor prepareFacsimile(this->GetFacsimile()); + this->Process(prepareFacsimile); + + SyncFromFacsimileFunctor syncFacsimileFunctor; + this->Process(syncFacsimileFunctor); +} + void Doc::TransposeDoc() { Transposer transposer; diff --git a/src/facsimilefunctor.cp b/src/facsimilefunctor.cp index 4b3aaa946bd..2b932db87d6 100644 --- a/src/facsimilefunctor.cp +++ b/src/facsimilefunctor.cp @@ -12,8 +12,10 @@ #include "doc.h" #include "layerelement.h" #include "measure.h" + #include "staff.h" #include "vrv.h" +#include "zone.h" //---------------------------------------------------------------------------- @@ -29,16 +31,31 @@ SyncFromFacsimileFunctor::SyncFromFacsimileFunctor() : Functor() FunctorCode SyncFromFacsimileFunctor::VisitLayerElement(LayerElement *layerElement) { + if (!layerElement->Is({NOTE, REST})) return FUNCTOR_CONTINUE; + + Zone *zone = layerElement->GetZone(); + assert(zone); + layerElement->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; + return FUNCTOR_CONTINUE; } FunctorCode SyncFromFacsimileFunctor::VisitMeasure(Measure *measure) { + Zone *zone = measure->GetZone(); + assert(zone); + measure->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; + measure->m_xAbs2 = zone->GetLrx() * DEFINITION_FACTOR; + return FUNCTOR_CONTINUE; } FunctorCode SyncFromFacsimileFunctor::VisitStaff(Staff *staff) { + Zone *zone = staff->GetZone(); + assert(zone); + staff->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; + return FUNCTOR_CONTINUE; } From 70b1646e0c36636d21aafc5d36087e5f0659db85 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 16:07:15 +0000 Subject: [PATCH 104/249] Fix missing Read/Write zone coordinated ul --- src/iomei.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/iomei.cpp b/src/iomei.cpp index e612b02b1c9..db220383508 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -2896,6 +2896,7 @@ void MEIOutput::WriteZone(pugi::xml_node currentNode, Zone *zone) assert(zone); this->WriteXmlId(currentNode, zone); zone->WriteCoordinated(currentNode); + zone->WriteCoordinatedUl(currentNode); zone->WriteTyped(currentNode); } @@ -8517,6 +8518,7 @@ bool MEIInput::ReadZone(Surface *parent, pugi::xml_node zone) Zone *vrvZone = new Zone(); this->SetMeiID(zone, vrvZone); vrvZone->ReadCoordinated(zone); + vrvZone->ReadCoordinatedUl(zone); vrvZone->ReadTyped(zone); parent->AddChild(vrvZone); return true; From cdc8cab0cbc716219d3c9cc05186e10b02d46ef6 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 16:07:45 +0000 Subject: [PATCH 105/249] Fix overlooked Doc type helper --- src/view.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/view.cpp b/src/view.cpp index f474d7c3b8a..666db7ba544 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -74,7 +74,7 @@ void View::SetPage(int pageIdx, bool doLayout) m_doc->ScoreDefSetCurrentDoc(); // if we once deal with multiple views, it would be better // to redo the layout only when necessary? - if (m_doc->GetType() == Transcription || m_doc->IsFacs()) { + if (m_doc->IsTranscription() || m_doc->IsFacs()) { m_currentPage->LayOutTranscription(); } else { From f3ac85b0ef11de84e14c7e3f2aa52e03b258bdfd Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 16:08:33 +0000 Subject: [PATCH 106/249] Initial implementation of call to SyncFromFacsimileDoc --- src/iomei.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/iomei.cpp b/src/iomei.cpp index db220383508..68a5839469d 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -3902,6 +3902,12 @@ bool MEIInput::ReadDoc(pugi::xml_node root) m_doc->m_drawingPageHeight = m_doc->GetFacsimile()->GetMaxY(); m_doc->m_drawingPageWidth = m_doc->GetFacsimile()->GetMaxX(); } + // Temporary solution to set the document type to Transcription when using + else if (m_doc->HasFacsimile() && !m_doc->GetFacsimile()->GetType().empty()) { + m_doc->SetType(StrToDocType(m_doc->GetFacsimile()->GetType())); + m_doc->m_drawingPageHeight = m_doc->GetFacsimile()->GetMaxY(); + m_doc->m_drawingPageWidth = m_doc->GetFacsimile()->GetMaxX(); + } if (facsimile.next_sibling("facsimile")) { LogWarning("Only first is processed"); } @@ -3991,6 +3997,10 @@ bool MEIInput::ReadDoc(pugi::xml_node root) m_doc->ConvertMarkupDoc(!m_doc->GetOptions()->m_preserveAnalyticalMarkup.GetValue()); } + if (success && m_doc->IsTranscription()) { + m_doc->SyncFromFacsimileDoc(); + } + if (success && !m_hasScoreDef) { LogWarning("No scoreDef provided, trying to generate one..."); success = m_doc->GenerateDocumentScoreDef(); From 6742a01751dbdf5644703006781f5e2a0fdff9bd Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 18:03:05 +0000 Subject: [PATCH 107/249] Add FacsimileInterface to Pb and Sb --- include/vrv/pb.h | 13 ++++++++++++- include/vrv/sb.h | 13 ++++++++++++- src/iomei.cpp | 4 ++++ src/pb.cpp | 4 +++- src/sb.cpp | 4 +++- 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/include/vrv/pb.h b/include/vrv/pb.h index 92cecf39fd6..11f66ab2b0a 100644 --- a/include/vrv/pb.h +++ b/include/vrv/pb.h @@ -9,6 +9,7 @@ #define __VRV_PB_H__ #include "atts_shared.h" +#include "facsimileinterface.h" #include "systemelement.h" namespace vrv { @@ -21,7 +22,7 @@ namespace vrv { * This class represents a MEI pb in score-based MEI. * In page-based MEI, it remains as is as. Actual pages are represented by Page objects. */ -class Pb : public SystemElement, public AttNNumberLike { +class Pb : public SystemElement, public FacsimileInterface, public AttNNumberLike { public: /** * @name Constructors, destructors, and other standard methods @@ -35,6 +36,16 @@ class Pb : public SystemElement, public AttNNumberLike { std::string GetClassName() const override { return "Pb"; } ///@} + /** + * @name Getter to interfaces + */ + ///@{ + FacsimileInterface *GetFacsimileInterface() override { return vrv_cast(this); } + const FacsimileInterface *GetFacsimileInterface() const override + { + return vrv_cast(this); + } + //----------// // Functors // //----------// diff --git a/include/vrv/sb.h b/include/vrv/sb.h index 83d4812dd7a..f1d43319e0e 100644 --- a/include/vrv/sb.h +++ b/include/vrv/sb.h @@ -9,6 +9,7 @@ #define __VRV_SB_H__ #include "atts_shared.h" +#include "facsimileinterface.h" #include "systemelement.h" namespace vrv { @@ -21,7 +22,7 @@ namespace vrv { * This class represents a MEI sb in score-based MEI. * In page-based MEI, it remains as it is. Actual systems are represented by System objects. */ -class Sb : public SystemElement, public AttNNumberLike { +class Sb : public SystemElement, public FacsimileInterface, public AttNNumberLike { public: /** * @name Constructors, destructors, and other standard methods @@ -35,6 +36,16 @@ class Sb : public SystemElement, public AttNNumberLike { std::string GetClassName() const override { return "Sb"; } ///@} + /** + * @name Getter to interfaces + */ + ///@{ + FacsimileInterface *GetFacsimileInterface() override { return vrv_cast(this); } + const FacsimileInterface *GetFacsimileInterface() const override + { + return vrv_cast(this); + } + //----------// // Functors // //----------// diff --git a/src/iomei.cpp b/src/iomei.cpp index 68a5839469d..c3779dc75fd 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -1698,6 +1698,7 @@ void MEIOutput::WritePb(pugi::xml_node currentNode, Pb *pb) assert(pb); this->WriteSystemElement(currentNode, pb); + this->WriteFacsimileInterface(currentNode, pb); pb->WriteNNumberLike(currentNode); } @@ -1706,6 +1707,7 @@ void MEIOutput::WriteSb(pugi::xml_node currentNode, Sb *sb) assert(sb); this->WriteSystemElement(currentNode, sb); + this->WriteFacsimileInterface(currentNode, sb); sb->WriteNNumberLike(currentNode); } @@ -4528,6 +4530,7 @@ bool MEIInput::ReadPb(Object *parent, pugi::xml_node pb) Pb *vrvPb = new Pb(); this->ReadSystemElement(pb, vrvPb); + this->ReadFacsimileInterface(pb, vrvPb); vrvPb->ReadNNumberLike(pb); @@ -4544,6 +4547,7 @@ bool MEIInput::ReadSb(Object *parent, pugi::xml_node sb) Sb *vrvSb = new Sb(); this->ReadSystemElement(sb, vrvSb); + this->ReadFacsimileInterface(sb, vrvSb); vrvSb->ReadNNumberLike(sb); diff --git a/src/pb.cpp b/src/pb.cpp index 9b7386736a8..10f68009081 100644 --- a/src/pb.cpp +++ b/src/pb.cpp @@ -29,9 +29,10 @@ namespace vrv { static const ClassRegistrar s_factory("pb", PB); -Pb::Pb() : SystemElement(PB, "pb-"), AttNNumberLike() +Pb::Pb() : SystemElement(PB, "pb-"), FacsimileInterface(), AttNNumberLike() { this->RegisterAttClass(ATT_NNUMBERLIKE); + this->RegisterInterface(FacsimileInterface::GetAttClasses(), FacsimileInterface::IsInterface()); this->Reset(); } @@ -41,6 +42,7 @@ Pb::~Pb() {} void Pb::Reset() { SystemElement::Reset(); + FacsimileInterface::Reset(); this->ResetNNumberLike(); } diff --git a/src/sb.cpp b/src/sb.cpp index 33a33c0bdf6..883f46a7e1c 100644 --- a/src/sb.cpp +++ b/src/sb.cpp @@ -29,9 +29,10 @@ namespace vrv { static const ClassRegistrar s_factory("sb", SB); -Sb::Sb() : SystemElement(SB, "sb-"), AttNNumberLike() +Sb::Sb() : SystemElement(SB, "sb-"), FacsimileInterface(), AttNNumberLike() { this->RegisterAttClass(ATT_NNUMBERLIKE); + this->RegisterInterface(FacsimileInterface::GetAttClasses(), FacsimileInterface::IsInterface()); this->Reset(); } @@ -41,6 +42,7 @@ Sb::~Sb() {} void Sb::Reset() { SystemElement::Reset(); + FacsimileInterface::Reset(); this->ResetNNumberLike(); } From 808aa9d78f2225efff3bc8d58a0c7fdf0db6a083 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 18:21:44 +0000 Subject: [PATCH 108/249] Sync Pb facsimile in SyncFromFacsimile functor * Placeholder for sb but not tested nor enabled --- include/vrv/facsimilefunctor.h | 10 +++++++ src/facsimilefunctor.cp | 51 +++++++++++++++++++++++++++++++++- src/iomei.cpp | 3 +- 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/include/vrv/facsimilefunctor.h b/include/vrv/facsimilefunctor.h index f31c3b887cc..3df74f90dcd 100644 --- a/include/vrv/facsimilefunctor.h +++ b/include/vrv/facsimilefunctor.h @@ -14,7 +14,11 @@ namespace vrv { class LayerElement; class Measure; +class Page; +class Pb; +class Sb; class Staff; +class System; //---------------------------------------------------------------------------- // SyncFromFacsimileFunctor @@ -44,7 +48,11 @@ class SyncFromFacsimileFunctor : public Functor { ///@{ FunctorCode VisitLayerElement(LayerElement *layerElement) override; FunctorCode VisitMeasure(Measure *measure) override; + FunctorCode VisitPage(Page *page) override; + FunctorCode VisitPb(Pb *pb) override; + FunctorCode VisitSb(Sb *sb) override; FunctorCode VisitStaff(Staff *staff) override; + FunctorCode VisitSystem(System *system) override; ///@} protected: @@ -55,6 +63,8 @@ class SyncFromFacsimileFunctor : public Functor { // private: // + Page *m_currentPage; + System *m_currentSystem; }; } // namespace vrv diff --git a/src/facsimilefunctor.cp b/src/facsimilefunctor.cp index 2b932db87d6..bfb5495fd44 100644 --- a/src/facsimilefunctor.cp +++ b/src/facsimilefunctor.cp @@ -12,8 +12,11 @@ #include "doc.h" #include "layerelement.h" #include "measure.h" - +#include "page.h" +#include "pb.h" +#include "sb.h" #include "staff.h" +#include "system.h" #include "vrv.h" #include "zone.h" @@ -27,6 +30,8 @@ namespace vrv { SyncFromFacsimileFunctor::SyncFromFacsimileFunctor() : Functor() { + m_currentPage = NULL; + m_currentSystem = NULL; } FunctorCode SyncFromFacsimileFunctor::VisitLayerElement(LayerElement *layerElement) @@ -50,6 +55,42 @@ FunctorCode SyncFromFacsimileFunctor::VisitMeasure(Measure *measure) return FUNCTOR_CONTINUE; } +FunctorCode SyncFromFacsimileFunctor::VisitPage(Page *page) +{ + m_currentPage = page; + + return FUNCTOR_CONTINUE; +} + + +FunctorCode SyncFromFacsimileFunctor::VisitPb(Pb *pb) +{ + // This would happen if we run the functor on data not converted to page-based + assert(m_currentPage); + + Zone *zone = pb->GetZone(); + assert(zone); + m_currentPage->m_pageHeight = zone->GetLry() * DEFINITION_FACTOR; + m_currentPage->m_pageWidth = zone->GetLrx() * DEFINITION_FACTOR; + + return FUNCTOR_CONTINUE; +} + +FunctorCode SyncFromFacsimileFunctor::VisitSb(Sb *sb) +{ + // This would happen if we run the functor on data not converted to page-based + assert(m_currentSystem); + + Zone *zone = sb->GetZone(); + /* + assert(zone); + m_currentSystem->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; + m_currentSystem->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; + */ + + return FUNCTOR_CONTINUE; +} + FunctorCode SyncFromFacsimileFunctor::VisitStaff(Staff *staff) { Zone *zone = staff->GetZone(); @@ -59,4 +100,12 @@ FunctorCode SyncFromFacsimileFunctor::VisitStaff(Staff *staff) return FUNCTOR_CONTINUE; } +FunctorCode SyncFromFacsimileFunctor::VisitSystem(System *system) +{ + m_currentSystem = system; + + return FUNCTOR_CONTINUE; +} + + } // namespace vrv diff --git a/src/iomei.cpp b/src/iomei.cpp index c3779dc75fd..9dd0095f1dd 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -3907,8 +3907,7 @@ bool MEIInput::ReadDoc(pugi::xml_node root) // Temporary solution to set the document type to Transcription when using else if (m_doc->HasFacsimile() && !m_doc->GetFacsimile()->GetType().empty()) { m_doc->SetType(StrToDocType(m_doc->GetFacsimile()->GetType())); - m_doc->m_drawingPageHeight = m_doc->GetFacsimile()->GetMaxY(); - m_doc->m_drawingPageWidth = m_doc->GetFacsimile()->GetMaxX(); + // Facsimile data eventually sync with Doc::SyncFromFacsimileDoc below } if (facsimile.next_sibling("facsimile")) { LogWarning("Only first is processed"); From a1a7a933b7f42fb0d9a1ee94f7d12accd1619501 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 18:41:50 +0000 Subject: [PATCH 109/249] Scaffold SyncFromFacsimileFunctor --- Verovio.xcodeproj/project.pbxproj | 20 +++--- include/vrv/facsimilefunctor.h | 47 +++++++++++++ ...csimilefunctor.cp => facsimilefunctor.cpp} | 66 +++++++++++++++++++ 3 files changed, 123 insertions(+), 10 deletions(-) rename src/{facsimilefunctor.cp => facsimilefunctor.cpp} (63%) diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index ff5bdc6da47..6a55d542017 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -802,10 +802,10 @@ 4DE96E3D21C4373200CB85BE /* bracketspan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DE96E3A21C4373200CB85BE /* bracketspan.cpp */; }; 4DEBE6E12B36E78900B67DFB /* facsimilefunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DEBE6E02B36E78900B67DFB /* facsimilefunctor.h */; }; 4DEBE6E22B36E78900B67DFB /* facsimilefunctor.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DEBE6E02B36E78900B67DFB /* facsimilefunctor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4DEBE6E42B36E79600B67DFB /* facsimilefunctor.cp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cp */; }; - 4DEBE6E52B36E79600B67DFB /* facsimilefunctor.cp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cp */; }; - 4DEBE6E62B36E9B300B67DFB /* facsimilefunctor.cp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cp */; }; - 4DEBE6E72B36E9B400B67DFB /* facsimilefunctor.cp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cp */; }; + 4DEBE6E42B36E79600B67DFB /* facsimilefunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cpp */; }; + 4DEBE6E52B36E79600B67DFB /* facsimilefunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cpp */; }; + 4DEBE6E62B36E9B300B67DFB /* facsimilefunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cpp */; }; + 4DEBE6E72B36E9B400B67DFB /* facsimilefunctor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cpp */; }; 4DEC4D5A21C800A000D1D273 /* abbr.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DEC4D5921C8009600D1D273 /* abbr.h */; }; 4DEC4D7A21C8048700D1D273 /* abbr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEC4D7921C8048700D1D273 /* abbr.cpp */; }; 4DEC4D7B21C8048700D1D273 /* abbr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DEC4D7921C8048700D1D273 /* abbr.cpp */; }; @@ -2021,7 +2021,7 @@ 4DE96E3821C4370E00CB85BE /* bracketspan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bracketspan.h; path = include/vrv/bracketspan.h; sourceTree = ""; }; 4DE96E3A21C4373200CB85BE /* bracketspan.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bracketspan.cpp; path = src/bracketspan.cpp; sourceTree = ""; }; 4DEBE6E02B36E78900B67DFB /* facsimilefunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = facsimilefunctor.h; path = include/vrv/facsimilefunctor.h; sourceTree = ""; }; - 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = facsimilefunctor.cp; path = src/facsimilefunctor.cp; sourceTree = ""; }; + 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = facsimilefunctor.cpp; path = src/facsimilefunctor.cpp; sourceTree = ""; }; 4DEC4D5921C8009600D1D273 /* abbr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = abbr.h; path = include/vrv/abbr.h; sourceTree = ""; }; 4DEC4D7921C8048700D1D273 /* abbr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = abbr.cpp; path = src/abbr.cpp; sourceTree = ""; }; 4DEC4D7D21C804C500D1D273 /* add.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = add.cpp; path = src/add.cpp; sourceTree = ""; }; @@ -3020,7 +3020,7 @@ E7265E6D29DC6FD200D11F41 /* castofffunctor.h */, E763EF4129E939FB0029E56D /* convertfunctor.cpp */, E763EF3E29E939C00029E56D /* convertfunctor.h */, - 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cp */, + 4DEBE6E32B36E79600B67DFB /* facsimilefunctor.cpp */, 4DEBE6E02B36E78900B67DFB /* facsimilefunctor.h */, E74A806028BC9111005274E7 /* findfunctor.cpp */, E74A806528BC97D5005274E7 /* findfunctor.h */, @@ -3938,7 +3938,7 @@ E7F39C6229A62B430055DBE0 /* adjustclefchangesfunctor.cpp in Sources */, E79320682991454000D80975 /* calcstemfunctor.cpp in Sources */, 4DED4F18294733140073E504 /* altsyminterface.cpp in Sources */, - 4DEBE6E72B36E9B400B67DFB /* facsimilefunctor.cp in Sources */, + 4DEBE6E72B36E9B400B67DFB /* facsimilefunctor.cpp in Sources */, 4DEF8A6521B7AAF90093A76B /* f.cpp in Sources */, 4D2073F922A3BCE000E0765F /* tabdursym.cpp in Sources */, 4D16940B1E3A44F300569BF4 /* keysig.cpp in Sources */, @@ -4219,7 +4219,7 @@ 8F086EF1188539540037FD8E /* keysig.cpp in Sources */, E74A806C28BC98B2005274E7 /* functorinterface.cpp in Sources */, E7870357299CF06D00156DC4 /* adjustarpegfunctor.cpp in Sources */, - 4DEBE6E62B36E9B300B67DFB /* facsimilefunctor.cp in Sources */, + 4DEBE6E62B36E9B300B67DFB /* facsimilefunctor.cpp in Sources */, 4DEC4D9E21C81E9400D1D273 /* orig.cpp in Sources */, 4DDBBB5D1C7AE45900054AFF /* hairpin.cpp in Sources */, 4D43C30C1A9BB22A00EA28F3 /* view_mensural.cpp in Sources */, @@ -4503,7 +4503,7 @@ 4DB3D8D51F83D12B00B5FC2B /* tempo.cpp in Sources */, 4DEC4DA021C81E9400D1D273 /* orig.cpp in Sources */, E7F39C6329A62B440055DBE0 /* adjustclefchangesfunctor.cpp in Sources */, - 4DEBE6E42B36E79600B67DFB /* facsimilefunctor.cp in Sources */, + 4DEBE6E42B36E79600B67DFB /* facsimilefunctor.cpp in Sources */, E79320692991454000D80975 /* calcstemfunctor.cpp in Sources */, 8F3DD33E18854B2E0051330C /* beam.cpp in Sources */, 4DED4F19294733140073E504 /* altsyminterface.cpp in Sources */, @@ -4786,7 +4786,7 @@ E793206A2991454100D80975 /* calcstemfunctor.cpp in Sources */, BB4C4AD722A932B6001F6AF0 /* staff.cpp in Sources */, 4DED4F1A294733140073E504 /* altsyminterface.cpp in Sources */, - 4DEBE6E52B36E79600B67DFB /* facsimilefunctor.cp in Sources */, + 4DEBE6E52B36E79600B67DFB /* facsimilefunctor.cpp in Sources */, BB4C4B9F22A932E5001F6AF0 /* positioninterface.cpp in Sources */, BB4C4B5322A932D7001F6AF0 /* halfmrpt.cpp in Sources */, BB4C4B8722A932DF001F6AF0 /* num.cpp in Sources */, diff --git a/include/vrv/facsimilefunctor.h b/include/vrv/facsimilefunctor.h index 3df74f90dcd..5073049d496 100644 --- a/include/vrv/facsimilefunctor.h +++ b/include/vrv/facsimilefunctor.h @@ -67,6 +67,53 @@ class SyncFromFacsimileFunctor : public Functor { System *m_currentSystem; }; +//---------------------------------------------------------------------------- +// SyncToFacsimileFunctor +//---------------------------------------------------------------------------- + +/** + * This class sync the layout calculated to the facsimile + */ +class SyncToFacsimileFunctor : public Functor { +public: + /** + * @name Constructors, destructors + */ + ///@{ + SyncToFacsimileFunctor(); + virtual ~SyncToFacsimileFunctor() = default; + ///@} + + /* + * Abstract base implementation + */ + bool ImplementsEndInterface() const override { return false; } + + /* + * Functor interface + */ + ///@{ + FunctorCode VisitLayerElement(LayerElement *layerElement) override; + FunctorCode VisitMeasure(Measure *measure) override; + FunctorCode VisitPage(Page *page) override; + FunctorCode VisitPb(Pb *pb) override; + FunctorCode VisitSb(Sb *sb) override; + FunctorCode VisitStaff(Staff *staff) override; + FunctorCode VisitSystem(System *system) override; + ///@} + +protected: + // +private: + // +public: + // +private: + // + Page *m_currentPage; + System *m_currentSystem; +}; + } // namespace vrv #endif // __VRV_FACSIMILEFUNCTOR_H__ diff --git a/src/facsimilefunctor.cp b/src/facsimilefunctor.cpp similarity index 63% rename from src/facsimilefunctor.cp rename to src/facsimilefunctor.cpp index bfb5495fd44..7923024c713 100644 --- a/src/facsimilefunctor.cp +++ b/src/facsimilefunctor.cpp @@ -107,5 +107,71 @@ FunctorCode SyncFromFacsimileFunctor::VisitSystem(System *system) return FUNCTOR_CONTINUE; } +//---------------------------------------------------------------------------- +// SyncToFacsimileFunctor +//---------------------------------------------------------------------------- + +SyncToFacsimileFunctor::SyncToFacsimileFunctor() : Functor() +{ + m_currentPage = NULL; + m_currentSystem = NULL; +} + +FunctorCode SyncToFacsimileFunctor::VisitLayerElement(LayerElement *layerElement) +{ + if (!layerElement->Is({NOTE, REST})) return FUNCTOR_CONTINUE; + + //layerElement->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; + + return FUNCTOR_CONTINUE; +} + +FunctorCode SyncToFacsimileFunctor::VisitMeasure(Measure *measure) +{ + //measure->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; + //measure->m_xAbs2 = zone->GetLrx() * DEFINITION_FACTOR; + + return FUNCTOR_CONTINUE; +} + +FunctorCode SyncToFacsimileFunctor::VisitPage(Page *page) +{ + m_currentPage = page; + + return FUNCTOR_CONTINUE; +} + + +FunctorCode SyncToFacsimileFunctor::VisitPb(Pb *pb) +{ + //m_currentPage->m_pageHeight = zone->GetLry() * DEFINITION_FACTOR; + //m_currentPage->m_pageWidth = zone->GetLrx() * DEFINITION_FACTOR; + + return FUNCTOR_CONTINUE; +} + +FunctorCode SyncToFacsimileFunctor::VisitSb(Sb *sb) +{ + //m_currentSystem->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; + //m_currentSystem->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; + + return FUNCTOR_CONTINUE; +} + +FunctorCode SyncToFacsimileFunctor::VisitStaff(Staff *staff) +{ + //staff->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; + + return FUNCTOR_CONTINUE; +} + +FunctorCode SyncToFacsimileFunctor::VisitSystem(System *system) +{ + m_currentSystem = system; + + return FUNCTOR_CONTINUE; +} + + } // namespace vrv From 44e83659b6e9c6a46d5f4ce55f1be0346321278e Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 18:44:15 +0000 Subject: [PATCH 110/249] Fix format --- src/facsimilefunctor.cpp | 52 +++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/src/facsimilefunctor.cpp b/src/facsimilefunctor.cpp index 7923024c713..68e54dbbe7a 100644 --- a/src/facsimilefunctor.cpp +++ b/src/facsimilefunctor.cpp @@ -36,12 +36,12 @@ SyncFromFacsimileFunctor::SyncFromFacsimileFunctor() : Functor() FunctorCode SyncFromFacsimileFunctor::VisitLayerElement(LayerElement *layerElement) { - if (!layerElement->Is({NOTE, REST})) return FUNCTOR_CONTINUE; - + if (!layerElement->Is({ NOTE, REST })) return FUNCTOR_CONTINUE; + Zone *zone = layerElement->GetZone(); assert(zone); layerElement->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; - + return FUNCTOR_CONTINUE; } @@ -51,18 +51,17 @@ FunctorCode SyncFromFacsimileFunctor::VisitMeasure(Measure *measure) assert(zone); measure->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; measure->m_xAbs2 = zone->GetLrx() * DEFINITION_FACTOR; - + return FUNCTOR_CONTINUE; } FunctorCode SyncFromFacsimileFunctor::VisitPage(Page *page) { m_currentPage = page; - + return FUNCTOR_CONTINUE; } - FunctorCode SyncFromFacsimileFunctor::VisitPb(Pb *pb) { // This would happen if we run the functor on data not converted to page-based @@ -87,7 +86,7 @@ FunctorCode SyncFromFacsimileFunctor::VisitSb(Sb *sb) m_currentSystem->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; m_currentSystem->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; */ - + return FUNCTOR_CONTINUE; } @@ -96,14 +95,14 @@ FunctorCode SyncFromFacsimileFunctor::VisitStaff(Staff *staff) Zone *zone = staff->GetZone(); assert(zone); staff->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; - + return FUNCTOR_CONTINUE; } FunctorCode SyncFromFacsimileFunctor::VisitSystem(System *system) { m_currentSystem = system; - + return FUNCTOR_CONTINUE; } @@ -119,59 +118,56 @@ SyncToFacsimileFunctor::SyncToFacsimileFunctor() : Functor() FunctorCode SyncToFacsimileFunctor::VisitLayerElement(LayerElement *layerElement) { - if (!layerElement->Is({NOTE, REST})) return FUNCTOR_CONTINUE; - - //layerElement->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; - + if (!layerElement->Is({ NOTE, REST })) return FUNCTOR_CONTINUE; + + // layerElement->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; + return FUNCTOR_CONTINUE; } FunctorCode SyncToFacsimileFunctor::VisitMeasure(Measure *measure) { - //measure->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; - //measure->m_xAbs2 = zone->GetLrx() * DEFINITION_FACTOR; - + // measure->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; + // measure->m_xAbs2 = zone->GetLrx() * DEFINITION_FACTOR; + return FUNCTOR_CONTINUE; } FunctorCode SyncToFacsimileFunctor::VisitPage(Page *page) { m_currentPage = page; - + return FUNCTOR_CONTINUE; } - FunctorCode SyncToFacsimileFunctor::VisitPb(Pb *pb) { - //m_currentPage->m_pageHeight = zone->GetLry() * DEFINITION_FACTOR; - //m_currentPage->m_pageWidth = zone->GetLrx() * DEFINITION_FACTOR; + // m_currentPage->m_pageHeight = zone->GetLry() * DEFINITION_FACTOR; + // m_currentPage->m_pageWidth = zone->GetLrx() * DEFINITION_FACTOR; return FUNCTOR_CONTINUE; } FunctorCode SyncToFacsimileFunctor::VisitSb(Sb *sb) { - //m_currentSystem->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; - //m_currentSystem->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; - + // m_currentSystem->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; + // m_currentSystem->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; + return FUNCTOR_CONTINUE; } FunctorCode SyncToFacsimileFunctor::VisitStaff(Staff *staff) { - //staff->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; - + // staff->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; + return FUNCTOR_CONTINUE; } FunctorCode SyncToFacsimileFunctor::VisitSystem(System *system) { m_currentSystem = system; - + return FUNCTOR_CONTINUE; } - - } // namespace vrv From 85c6b517af3b44a1089c53b0d955d6184bd6e584 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 27 Dec 2023 09:39:21 +0000 Subject: [PATCH 111/249] Implement SyncToFacsimile --- include/vrv/doc.h | 6 ++++++ include/vrv/facsimilefunctor.h | 13 ++++++++++-- src/doc.cpp | 25 ++++++++++++++++++++-- src/facsimilefunctor.cpp | 39 ++++++++++++++++++++++++++++++++-- 4 files changed, 77 insertions(+), 6 deletions(-) diff --git a/include/vrv/doc.h b/include/vrv/doc.h index f4113c32aff..c6573a53d09 100644 --- a/include/vrv/doc.h +++ b/include/vrv/doc.h @@ -375,6 +375,12 @@ class Doc : public Object { */ void SyncFromFacsimileDoc(); + /** + * Sync the coordinate provided in rendering to a . + * The document must have encoded layout and the option --break encoded must have enabled. + */ + void SyncToFacsimileDoc(); + /** * Transpose the content of the doc. */ diff --git a/include/vrv/facsimilefunctor.h b/include/vrv/facsimilefunctor.h index 5073049d496..626b7c71a38 100644 --- a/include/vrv/facsimilefunctor.h +++ b/include/vrv/facsimilefunctor.h @@ -18,6 +18,7 @@ class Page; class Pb; class Sb; class Staff; +class Surface; class System; //---------------------------------------------------------------------------- @@ -80,7 +81,7 @@ class SyncToFacsimileFunctor : public Functor { * @name Constructors, destructors */ ///@{ - SyncToFacsimileFunctor(); + SyncToFacsimileFunctor(Doc *doc, Surface *surface, int height, int width); virtual ~SyncToFacsimileFunctor() = default; ///@} @@ -105,10 +106,18 @@ class SyncToFacsimileFunctor : public Functor { protected: // private: - // + /** Create zone if not exist */ + Zone *GetZone(FacsimileInterface *interface); public: // private: + /** The doc */ + Doc *m_doc; + /** Page height and width */ + int m_height; + int m_width; + /** The surface we are going to add / update zone */ + Surface *m_surface; // Page *m_currentPage; System *m_currentSystem; diff --git a/src/doc.cpp b/src/doc.cpp index b48afdd4b5d..b909bb5f4d0 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -59,6 +59,7 @@ #include "staff.h" #include "staffdef.h" #include "staffgrp.h" +#include "surface.h" #include "syl.h" #include "syllable.h" #include "system.h" @@ -1397,8 +1398,28 @@ void Doc::SyncFromFacsimileDoc() PrepareFacsimileFunctor prepareFacsimile(this->GetFacsimile()); this->Process(prepareFacsimile); - SyncFromFacsimileFunctor syncFacsimileFunctor; - this->Process(syncFacsimileFunctor); + SyncFromFacsimileFunctor syncFromFacsimileFunctor; + this->Process(syncFromFacsimileFunctor); +} + +void Doc::SyncToFacsimileDoc() +{ + // Create a new facsimile object if we do not have one already + if (!this->HasFacsimile()) { + Facsimile *facsimile = new Facsimile(); + this->SetFacsimile(facsimile); + } + if (!m_facsimile->FindDescendantByType(SURFACE)) { + m_facsimile->AddChild(new Surface()); + } + m_facsimile->SetType("transcription"); + Surface *surface = vrv_cast(m_facsimile->FindDescendantByType(SURFACE)); + assert(surface); + + const int width = m_options->m_pageWidth.GetUnfactoredValue(); + const int height = m_options->m_pageHeight.GetUnfactoredValue(); + SyncToFacsimileFunctor syncToFacimileFunctor(this, surface, height, width); + this->Process(syncToFacimileFunctor); } void Doc::TransposeDoc() diff --git a/src/facsimilefunctor.cpp b/src/facsimilefunctor.cpp index 68e54dbbe7a..57756c828f3 100644 --- a/src/facsimilefunctor.cpp +++ b/src/facsimilefunctor.cpp @@ -16,6 +16,7 @@ #include "pb.h" #include "sb.h" #include "staff.h" +#include "surface.h" #include "system.h" #include "vrv.h" #include "zone.h" @@ -110,8 +111,12 @@ FunctorCode SyncFromFacsimileFunctor::VisitSystem(System *system) // SyncToFacsimileFunctor //---------------------------------------------------------------------------- -SyncToFacsimileFunctor::SyncToFacsimileFunctor() : Functor() +SyncToFacsimileFunctor::SyncToFacsimileFunctor(Doc *doc, Surface *surface, int height, int width) : Functor() { + m_doc = doc; + m_height = height; + m_width = width; + m_surface = surface; m_currentPage = NULL; m_currentSystem = NULL; } @@ -121,6 +126,8 @@ FunctorCode SyncToFacsimileFunctor::VisitLayerElement(LayerElement *layerElement if (!layerElement->Is({ NOTE, REST })) return FUNCTOR_CONTINUE; // layerElement->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; + Zone *zone = this->GetZone(layerElement); + zone->SetUlx(layerElement->GetDrawingX() / DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } @@ -129,6 +136,9 @@ FunctorCode SyncToFacsimileFunctor::VisitMeasure(Measure *measure) { // measure->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; // measure->m_xAbs2 = zone->GetLrx() * DEFINITION_FACTOR; + Zone *zone = this->GetZone(measure); + zone->SetUlx(measure->GetDrawingX() / DEFINITION_FACTOR); + zone->SetLrx(measure->GetDrawingX() + measure->GetWidth() / DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } @@ -136,6 +146,8 @@ FunctorCode SyncToFacsimileFunctor::VisitMeasure(Measure *measure) FunctorCode SyncToFacsimileFunctor::VisitPage(Page *page) { m_currentPage = page; + m_doc->SetDrawingPage(page->GetIdx()); + page->LayOut(); return FUNCTOR_CONTINUE; } @@ -144,7 +156,10 @@ FunctorCode SyncToFacsimileFunctor::VisitPb(Pb *pb) { // m_currentPage->m_pageHeight = zone->GetLry() * DEFINITION_FACTOR; // m_currentPage->m_pageWidth = zone->GetLrx() * DEFINITION_FACTOR; - + Zone *zone = this->GetZone(pb); + zone->SetLry(m_height); + zone->SetLrx(m_width); + return FUNCTOR_CONTINUE; } @@ -152,6 +167,9 @@ FunctorCode SyncToFacsimileFunctor::VisitSb(Sb *sb) { // m_currentSystem->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; // m_currentSystem->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; + Zone *zone = this->GetZone(sb); + zone->SetUlx(m_currentSystem->GetDrawingX() / DEFINITION_FACTOR); + zone->SetUly(m_currentSystem->GetDrawingY() / DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } @@ -159,6 +177,8 @@ FunctorCode SyncToFacsimileFunctor::VisitSb(Sb *sb) FunctorCode SyncToFacsimileFunctor::VisitStaff(Staff *staff) { // staff->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; + Zone *zone = this->GetZone(staff); + zone->SetUly(staff->GetDrawingY() / DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } @@ -170,4 +190,19 @@ FunctorCode SyncToFacsimileFunctor::VisitSystem(System *system) return FUNCTOR_CONTINUE; } +Zone *SyncToFacsimileFunctor::GetZone(FacsimileInterface *interface) +{ + if (interface->GetZone()) { + // Here we should probably check if the zone is a child of m_surface + return interface->GetZone(); + } + else { + Zone *zone = new Zone(); + m_surface->AddChild(zone); + interface->SetFacs(StringFormat("#%s", zone->GetID().c_str())); + interface->AttachZone(zone); + return interface->GetZone(); + } +} + } // namespace vrv From aa34af471e5f5e92fb7d99ce594d637558ac3e06 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 27 Dec 2023 09:39:32 +0000 Subject: [PATCH 112/249] Read sb@facs --- src/facsimilefunctor.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/facsimilefunctor.cpp b/src/facsimilefunctor.cpp index 57756c828f3..4dd47302093 100644 --- a/src/facsimilefunctor.cpp +++ b/src/facsimilefunctor.cpp @@ -82,11 +82,9 @@ FunctorCode SyncFromFacsimileFunctor::VisitSb(Sb *sb) assert(m_currentSystem); Zone *zone = sb->GetZone(); - /* assert(zone); m_currentSystem->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; m_currentSystem->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; - */ return FUNCTOR_CONTINUE; } From 220f0fbdc56a46bae22b4200dba55d9d0ec89790 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 27 Dec 2023 09:40:03 +0000 Subject: [PATCH 113/249] Call SyncToFacsimileDoc (testing) * To be reverted --- src/toolkit.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/toolkit.cpp b/src/toolkit.cpp index bcfd058ebe3..f178da04c5b 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -857,6 +857,8 @@ std::string Toolkit::GetMEI(const std::string &jsonOptions) hadSelection = true; m_doc.DeactiveateSelection(); } + + m_doc.SyncToFacsimileDoc(); MEIOutput meioutput(&m_doc); meioutput.SetScoreBasedMEI(scoreBased); From d89dc949357cb22a8fd062515af56bf3b533cb70 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sat, 23 Dec 2023 16:07:15 +0000 Subject: [PATCH 114/249] Fix missing Read/Write zone coordinated ul --- src/iomei.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/iomei.cpp b/src/iomei.cpp index 97556fbbde0..6ff5920f6c4 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -2900,6 +2900,7 @@ void MEIOutput::WriteZone(pugi::xml_node currentNode, Zone *zone) assert(zone); this->WriteXmlId(currentNode, zone); zone->WriteCoordinated(currentNode); + zone->WriteCoordinatedUl(currentNode); zone->WriteTyped(currentNode); } @@ -8531,6 +8532,7 @@ bool MEIInput::ReadZone(Surface *parent, pugi::xml_node zone) Zone *vrvZone = new Zone(); this->SetMeiID(zone, vrvZone); vrvZone->ReadCoordinated(zone); + vrvZone->ReadCoordinatedUl(zone); vrvZone->ReadTyped(zone); parent->AddChild(vrvZone); return true; From 065805f6286d6f228c0bd34a0be3298e85ea00b8 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 27 Dec 2023 21:15:04 +0000 Subject: [PATCH 115/249] Remove FunctorParams old mentions * Clang formatting --- include/vrv/doc.h | 2 +- include/vrv/durationinterface.h | 1 - include/vrv/object.h | 1 - include/vrv/vrvdef.h | 2 +- src/toolkit.cpp | 2 +- 5 files changed, 3 insertions(+), 5 deletions(-) diff --git a/include/vrv/doc.h b/include/vrv/doc.h index c6573a53d09..788483f2554 100644 --- a/include/vrv/doc.h +++ b/include/vrv/doc.h @@ -380,7 +380,7 @@ class Doc : public Object { * The document must have encoded layout and the option --break encoded must have enabled. */ void SyncToFacsimileDoc(); - + /** * Transpose the content of the doc. */ diff --git a/include/vrv/durationinterface.h b/include/vrv/durationinterface.h index 67bf2caab43..17d0ec0cc22 100644 --- a/include/vrv/durationinterface.h +++ b/include/vrv/durationinterface.h @@ -16,7 +16,6 @@ namespace vrv { -class FunctorParams; class Mensur; class Object; diff --git a/include/vrv/object.h b/include/vrv/object.h index 1cb3f41ff41..31bbf863f95 100644 --- a/include/vrv/object.h +++ b/include/vrv/object.h @@ -31,7 +31,6 @@ class EditorialElement; class Output; class Filters; class Functor; -class FunctorParams; class Functor; class ConstFunctor; class LinkingInterface; diff --git a/include/vrv/vrvdef.h b/include/vrv/vrvdef.h index 86ead543896..8178d672501 100644 --- a/include/vrv/vrvdef.h +++ b/include/vrv/vrvdef.h @@ -61,7 +61,7 @@ namespace vrv { #ifdef VRV_DYNAMIC_CAST // To be used for all cases where type is cheched through Object::m_type #define vrv_cast dynamic_cast -// To be used for all FunctorParams casts within Functors +// To be used for params casts within Functors #define vrv_params_cast dynamic_cast #else #define vrv_cast static_cast diff --git a/src/toolkit.cpp b/src/toolkit.cpp index f178da04c5b..c946c020aca 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -857,7 +857,7 @@ std::string Toolkit::GetMEI(const std::string &jsonOptions) hadSelection = true; m_doc.DeactiveateSelection(); } - + m_doc.SyncToFacsimileDoc(); MEIOutput meioutput(&m_doc); From 4cc1e8309111afc5f18d8fa7c3abce0da5b48554 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 27 Dec 2023 21:19:54 +0000 Subject: [PATCH 116/249] Allow surface within surface * Not MEI valid structure --- include/vrv/iomei.h | 2 +- src/iomei.cpp | 9 ++++++++- src/surface.cpp | 3 +++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/vrv/iomei.h b/include/vrv/iomei.h index 6b0d7800119..6f0b358c3db 100644 --- a/include/vrv/iomei.h +++ b/include/vrv/iomei.h @@ -846,7 +846,7 @@ class MEIInput : public Input { ///@{ bool ReadFacsimile(Doc *doc, pugi::xml_node facsimile); bool ReadGraphic(Object *parent, pugi::xml_node graphic); - bool ReadSurface(Facsimile *parent, pugi::xml_node surface); + bool ReadSurface(Object *parent, pugi::xml_node surface); bool ReadTupletSpanAsTuplet(Measure *measure, pugi::xml_node tupletSpan); bool ReadZone(Surface *parent, pugi::xml_node zone); ///@} diff --git a/src/iomei.cpp b/src/iomei.cpp index 9dd0095f1dd..f7ac28f32c7 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -2883,6 +2883,10 @@ void MEIOutput::WriteSurface(pugi::xml_node currentNode, Surface *surface) pugi::xml_node childNode = currentNode.append_child("graphic"); this->WriteGraphic(childNode, dynamic_cast(child)); } + else if (child->GetClassId() == SURFACE) { + pugi::xml_node childNode = currentNode.append_child("surface"); + this->WriteSurface(childNode, dynamic_cast(child)); + } else if (child->GetClassId() == ZONE) { pugi::xml_node childNode = currentNode.append_child("zone"); this->WriteZone(childNode, dynamic_cast(child)); @@ -8502,7 +8506,7 @@ bool MEIInput::ReadGraphic(Object *parent, pugi::xml_node graphic) return true; } -bool MEIInput::ReadSurface(Facsimile *parent, pugi::xml_node surface) +bool MEIInput::ReadSurface(Object *parent, pugi::xml_node surface) { assert(parent); Surface *vrvSurface = new Surface(); @@ -8514,6 +8518,9 @@ bool MEIInput::ReadSurface(Facsimile *parent, pugi::xml_node surface) if (strcmp(child.name(), "graphic") == 0) { this->ReadGraphic(vrvSurface, child); } + else if (strcmp(child.name(), "surface") == 0) { + this->ReadSurface(vrvSurface, child); + } else if (strcmp(child.name(), "zone") == 0) { this->ReadZone(vrvSurface, child); } diff --git a/src/surface.cpp b/src/surface.cpp index 3c0b01d1b43..799f8477e26 100644 --- a/src/surface.cpp +++ b/src/surface.cpp @@ -49,6 +49,9 @@ bool Surface::IsSupportedChild(Object *object) if (object->Is(GRAPHIC)) { assert(dynamic_cast(object)); } + else if (object->Is(SURFACE)) { + assert(dynamic_cast(object)); + } else if (object->Is(ZONE)) { assert(dynamic_cast(object)); } From af4fe04ece718cb99b3880f46b308d9213ccfc8e Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 27 Dec 2023 21:20:51 +0000 Subject: [PATCH 117/249] Read and write att.coordinated.ul in Surface (missing) --- src/iomei.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/iomei.cpp b/src/iomei.cpp index f7ac28f32c7..dbe70a5232d 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -2876,6 +2876,7 @@ void MEIOutput::WriteSurface(pugi::xml_node currentNode, Surface *surface) assert(surface); this->WriteXmlId(currentNode, surface); surface->WriteCoordinated(currentNode); + surface->WriteCoordinatedUl(currentNode); surface->WriteTyped(currentNode); for (Object *child = surface->GetFirst(); child != NULL; child = surface->GetNext()) { @@ -8512,6 +8513,7 @@ bool MEIInput::ReadSurface(Object *parent, pugi::xml_node surface) Surface *vrvSurface = new Surface(); this->SetMeiID(surface, vrvSurface); vrvSurface->ReadCoordinated(surface); + vrvSurface->ReadCoordinatedUl(surface); vrvSurface->ReadTyped(surface); for (pugi::xml_node child = surface.first_child(); child; child = child.next_sibling()) { From 8a4a76a09ffd015af94b4ab2e29e2cfb3a4d3dee Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 27 Dec 2023 21:21:50 +0000 Subject: [PATCH 118/249] Output facsimile with nested surface (invalid MEI) --- include/vrv/facsimilefunctor.h | 11 ++++---- include/vrv/facsimileinterface.h | 3 +-- src/doc.cpp | 9 +++---- src/facsimilefunctor.cpp | 45 ++++++++++++++++++++------------ 4 files changed, 38 insertions(+), 30 deletions(-) diff --git a/include/vrv/facsimilefunctor.h b/include/vrv/facsimilefunctor.h index 626b7c71a38..4f3ae259fe5 100644 --- a/include/vrv/facsimilefunctor.h +++ b/include/vrv/facsimilefunctor.h @@ -9,6 +9,7 @@ #define __VRV_FACSIMILEFUNCTOR_H__ #include "functor.h" +#include "view.h" namespace vrv { @@ -81,7 +82,7 @@ class SyncToFacsimileFunctor : public Functor { * @name Constructors, destructors */ ///@{ - SyncToFacsimileFunctor(Doc *doc, Surface *surface, int height, int width); + SyncToFacsimileFunctor(Doc *doc); virtual ~SyncToFacsimileFunctor() = default; ///@} @@ -107,20 +108,20 @@ class SyncToFacsimileFunctor : public Functor { // private: /** Create zone if not exist */ - Zone *GetZone(FacsimileInterface *interface); + Zone *GetZone(FacsimileInterface *interface, std::string type); + public: // private: /** The doc */ Doc *m_doc; - /** Page height and width */ - int m_height; - int m_width; /** The surface we are going to add / update zone */ Surface *m_surface; // Page *m_currentPage; System *m_currentSystem; + // + View m_view; }; } // namespace vrv diff --git a/include/vrv/facsimileinterface.h b/include/vrv/facsimileinterface.h index cbc46f7ddb3..6faa2ab80b9 100644 --- a/include/vrv/facsimileinterface.h +++ b/include/vrv/facsimileinterface.h @@ -13,8 +13,7 @@ #include "interface.h" namespace vrv { -class FunctorParams; -class View; + class Zone; //---------------------------------------------------------------------------- diff --git a/src/doc.cpp b/src/doc.cpp index b909bb5f4d0..1b5d917a0d5 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -1413,12 +1413,9 @@ void Doc::SyncToFacsimileDoc() m_facsimile->AddChild(new Surface()); } m_facsimile->SetType("transcription"); - Surface *surface = vrv_cast(m_facsimile->FindDescendantByType(SURFACE)); - assert(surface); - - const int width = m_options->m_pageWidth.GetUnfactoredValue(); - const int height = m_options->m_pageHeight.GetUnfactoredValue(); - SyncToFacsimileFunctor syncToFacimileFunctor(this, surface, height, width); + m_facsimile->ClearChildren(); + + SyncToFacsimileFunctor syncToFacimileFunctor(this); this->Process(syncToFacimileFunctor); } diff --git a/src/facsimilefunctor.cpp b/src/facsimilefunctor.cpp index 4dd47302093..62a3e61b795 100644 --- a/src/facsimilefunctor.cpp +++ b/src/facsimilefunctor.cpp @@ -109,12 +109,11 @@ FunctorCode SyncFromFacsimileFunctor::VisitSystem(System *system) // SyncToFacsimileFunctor //---------------------------------------------------------------------------- -SyncToFacsimileFunctor::SyncToFacsimileFunctor(Doc *doc, Surface *surface, int height, int width) : Functor() +SyncToFacsimileFunctor::SyncToFacsimileFunctor(Doc *doc) : Functor() { m_doc = doc; - m_height = height; - m_width = width; - m_surface = surface; + m_view.SetDoc(doc); + m_surface = NULL; m_currentPage = NULL; m_currentSystem = NULL; } @@ -124,8 +123,8 @@ FunctorCode SyncToFacsimileFunctor::VisitLayerElement(LayerElement *layerElement if (!layerElement->Is({ NOTE, REST })) return FUNCTOR_CONTINUE; // layerElement->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; - Zone *zone = this->GetZone(layerElement); - zone->SetUlx(layerElement->GetDrawingX() / DEFINITION_FACTOR); + Zone *zone = this->GetZone(layerElement, layerElement->GetClassName()); + zone->SetUlx(m_view.ToLogicalX(layerElement->GetDrawingX()) / DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } @@ -134,7 +133,7 @@ FunctorCode SyncToFacsimileFunctor::VisitMeasure(Measure *measure) { // measure->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; // measure->m_xAbs2 = zone->GetLrx() * DEFINITION_FACTOR; - Zone *zone = this->GetZone(measure); + Zone *zone = this->GetZone(measure, measure->GetClassName()); zone->SetUlx(measure->GetDrawingX() / DEFINITION_FACTOR); zone->SetLrx(measure->GetDrawingX() + measure->GetWidth() / DEFINITION_FACTOR); @@ -146,6 +145,18 @@ FunctorCode SyncToFacsimileFunctor::VisitPage(Page *page) m_currentPage = page; m_doc->SetDrawingPage(page->GetIdx()); page->LayOut(); + // + Surface *surface = new Surface(); + assert(m_doc->GetFacsimile()); + m_doc->GetFacsimile()->AddChild(surface); + surface->SetLrx(m_doc->m_drawingPageWidth / DEFINITION_FACTOR); + surface->SetLry(m_doc->m_drawingPageHeight / DEFINITION_FACTOR); + m_surface = new Surface(); + surface->AddChild(m_surface); + m_surface->SetUlx(m_doc->m_drawingPageMarginLeft / DEFINITION_FACTOR); + m_surface->SetUly(m_doc->m_drawingPageMarginRight / DEFINITION_FACTOR); + m_surface->SetLrx(m_doc->m_drawingPageContentWidth / DEFINITION_FACTOR); + m_surface->SetLry(m_doc->m_drawingPageContentHeight / DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } @@ -154,10 +165,8 @@ FunctorCode SyncToFacsimileFunctor::VisitPb(Pb *pb) { // m_currentPage->m_pageHeight = zone->GetLry() * DEFINITION_FACTOR; // m_currentPage->m_pageWidth = zone->GetLrx() * DEFINITION_FACTOR; - Zone *zone = this->GetZone(pb); - zone->SetLry(m_height); - zone->SetLrx(m_width); - + // Zone *zone = this->GetZone(pb, pb->GetClassName()); + return FUNCTOR_CONTINUE; } @@ -165,9 +174,9 @@ FunctorCode SyncToFacsimileFunctor::VisitSb(Sb *sb) { // m_currentSystem->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; // m_currentSystem->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; - Zone *zone = this->GetZone(sb); - zone->SetUlx(m_currentSystem->GetDrawingX() / DEFINITION_FACTOR); - zone->SetUly(m_currentSystem->GetDrawingY() / DEFINITION_FACTOR); + Zone *zone = this->GetZone(sb, sb->GetClassName()); + zone->SetUlx(m_view.ToLogicalX(m_currentSystem->GetDrawingX()) / DEFINITION_FACTOR); + zone->SetUly(m_view.ToLogicalY(m_currentSystem->GetDrawingY()) / DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } @@ -175,8 +184,8 @@ FunctorCode SyncToFacsimileFunctor::VisitSb(Sb *sb) FunctorCode SyncToFacsimileFunctor::VisitStaff(Staff *staff) { // staff->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; - Zone *zone = this->GetZone(staff); - zone->SetUly(staff->GetDrawingY() / DEFINITION_FACTOR); + Zone *zone = this->GetZone(staff, staff->GetClassName()); + zone->SetUly(m_view.ToLogicalY(staff->GetDrawingY()) / DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } @@ -188,7 +197,7 @@ FunctorCode SyncToFacsimileFunctor::VisitSystem(System *system) return FUNCTOR_CONTINUE; } -Zone *SyncToFacsimileFunctor::GetZone(FacsimileInterface *interface) +Zone *SyncToFacsimileFunctor::GetZone(FacsimileInterface *interface, std::string type) { if (interface->GetZone()) { // Here we should probably check if the zone is a child of m_surface @@ -196,6 +205,8 @@ Zone *SyncToFacsimileFunctor::GetZone(FacsimileInterface *interface) } else { Zone *zone = new Zone(); + std::transform(type.begin(), type.end(), type.begin(), ::tolower); + zone->SetType(type); m_surface->AddChild(zone); interface->SetFacs(StringFormat("#%s", zone->GetID().c_str())); interface->AttachZone(zone); From 82845f9bfb57a333a22217525b5a3734380639c3 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 28 Dec 2023 10:08:51 +0000 Subject: [PATCH 119/249] Add pseudo functors to FacsimileInterface --- include/vrv/facsimileinterface.h | 21 ++++++++++++++++- include/vrv/preparedatafunctor.h | 5 ++++ src/facsimileinterface.cpp | 40 +++++++++++++++++++++++++++++++- 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/include/vrv/facsimileinterface.h b/include/vrv/facsimileinterface.h index 6faa2ab80b9..7afafef144b 100644 --- a/include/vrv/facsimileinterface.h +++ b/include/vrv/facsimileinterface.h @@ -14,6 +14,10 @@ namespace vrv { +class Facsimile; +class PrepareFacsimileFunctor; +class ResetDataFunctor; +class Surface; class Zone; //---------------------------------------------------------------------------- @@ -55,8 +59,23 @@ class FacsimileInterface : public Interface, public AttFacsimile { const Zone *GetZone() const { return m_zone; } ///@} + //-----------------// + // Pseudo functors // + //-----------------// + + /** + * We have functor code in the interface for avoiding code duplication in each implementation class. + * Since we are in an interface, we need to pass the object (implementation) to + * the pseudo functor method. + */ + ///@{ + FunctorCode InterfacePrepareFacsimile(PrepareFacsimileFunctor &functor, Object *object); + FunctorCode InterfaceResetData(ResetDataFunctor &functor, Object *object); + ///@} + private: - Zone *m_zone = NULL; + Zone *m_zone; + Surface *m_surface; }; } // namespace vrv #endif diff --git a/include/vrv/preparedatafunctor.h b/include/vrv/preparedatafunctor.h index 412ef9f3918..793d1e66c0e 100644 --- a/include/vrv/preparedatafunctor.h +++ b/include/vrv/preparedatafunctor.h @@ -218,6 +218,11 @@ class PrepareFacsimileFunctor : public Functor { */ const ListOfObjects &GetZonelessSyls() const { return m_zonelessSyls; } + /* + * Getter for the facsimile + */ + Facsimile *GetFacsimile() const { return m_facsimile; } + /* * Functor interface */ diff --git a/src/facsimileinterface.cpp b/src/facsimileinterface.cpp index 420b18be836..d6caee2e131 100644 --- a/src/facsimileinterface.cpp +++ b/src/facsimileinterface.cpp @@ -15,6 +15,7 @@ #include "doc.h" #include "facsimile.h" +#include "preparedatafunctor.h" #include "surface.h" #include "syllable.h" #include "view.h" @@ -34,7 +35,9 @@ FacsimileInterface::~FacsimileInterface() {} void FacsimileInterface::Reset() { this->ResetFacsimile(); - this->AttachZone(NULL); + + m_zone = NULL; + m_surface = NULL; } int FacsimileInterface::GetDrawingX() const @@ -99,4 +102,39 @@ void FacsimileInterface::AttachZone(Zone *zone) } } +//---------------------------------------------------------------------------- +// Interface pseudo functor (redirected) +//---------------------------------------------------------------------------- + +FunctorCode FacsimileInterface::InterfacePrepareFacsimile(PrepareFacsimileFunctor &functor, Object *object) +{ + assert(functor.GetFacsimile()); + Facsimile *facsimile = functor.GetFacsimile(); + std::string facsID = ExtractIDFragment(this->GetFacs()); + Object *facsDescendant = facsimile->FindDescendantByID(facsID); + if (!facsDescendant) { + LogWarning("Could not find @facs '%s' in facsimile element", facsID.c_str()); + return FUNCTOR_CONTINUE; + } + + if (facsDescendant->Is(ZONE)) { + m_zone = vrv_cast(facsDescendant); + assert(m_zone); + } + else if (facsDescendant->Is(SURFACE)) { + m_surface = vrv_cast(facsDescendant); + assert(m_surface); + } + + return FUNCTOR_CONTINUE; +} + +FunctorCode FacsimileInterface::InterfaceResetData(ResetDataFunctor &functor, Object *object) +{ + m_zone = NULL; + m_surface = NULL; + + return FUNCTOR_CONTINUE; +} + } // namespace vrv From 0eb3ce4806c1de5cd2cc391a7aa271c36f0ff931 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 28 Dec 2023 10:09:42 +0000 Subject: [PATCH 120/249] Make sure ResetData parent is always called * Also add call to FascimileInterface::ResetDataInterface --- include/vrv/resetfunctor.h | 1 + src/preparedatafunctor.cpp | 6 +----- src/resetfunctor.cpp | 44 ++++++++++++++++++++++++++++++-------- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/include/vrv/resetfunctor.h b/include/vrv/resetfunctor.h index 2e681f1d877..f8f4d5c1032 100644 --- a/include/vrv/resetfunctor.h +++ b/include/vrv/resetfunctor.h @@ -62,6 +62,7 @@ class ResetDataFunctor : public Functor { FunctorCode VisitMeasure(Measure *measure) override; FunctorCode VisitMRest(MRest *mRest) override; FunctorCode VisitNote(Note *note) override; + FunctorCode VisitObject(Object *object) override; FunctorCode VisitRepeatMark(RepeatMark *repeatMark) override; FunctorCode VisitRest(Rest *rest) override; FunctorCode VisitSection(Section *section) override; diff --git a/src/preparedatafunctor.cpp b/src/preparedatafunctor.cpp index bf6a106a6e3..98b7b07152e 100644 --- a/src/preparedatafunctor.cpp +++ b/src/preparedatafunctor.cpp @@ -380,11 +380,7 @@ FunctorCode PrepareFacsimileFunctor::VisitObject(Object *object) FacsimileInterface *interface = object->GetFacsimileInterface(); assert(interface); if (interface->HasFacs()) { - std::string facsID = ExtractIDFragment(interface->GetFacs()); - Zone *zone = m_facsimile->FindZoneByID(facsID); - if (zone != NULL) { - interface->AttachZone(zone); - } + interface->InterfacePrepareFacsimile(*this, object); } // Zoneless syl else if (object->Is(SYL)) { diff --git a/src/resetfunctor.cpp b/src/resetfunctor.cpp index 8a09f26fe80..6c53b73e881 100644 --- a/src/resetfunctor.cpp +++ b/src/resetfunctor.cpp @@ -63,10 +63,7 @@ FunctorCode ResetDataFunctor::VisitArpeg(Arpeg *arpeg) { // Call parent one too this->VisitControlElement(arpeg); - - PlistInterface *interface = arpeg->GetPlistInterface(); - assert(interface); - interface->InterfaceResetData(*this, arpeg); + arpeg->PlistInterface::InterfaceResetData(*this, arpeg); return FUNCTOR_CONTINUE; } @@ -184,6 +181,9 @@ FunctorCode ResetDataFunctor::VisitDots(Dots *dots) FunctorCode ResetDataFunctor::VisitEditorialElement(EditorialElement *editorialElement) { + // Call parent one too + this->VisitObject(editorialElement); + if (editorialElement->IsSystemMilestone()) { editorialElement->SystemMilestoneInterface::InterfaceResetData(*this); } @@ -194,7 +194,6 @@ FunctorCode ResetDataFunctor::VisitEditorialElement(EditorialElement *editorialE FunctorCode ResetDataFunctor::VisitEnding(Ending *ending) { this->VisitFloatingObject(ending); - ending->SystemMilestoneInterface::InterfaceResetData(*this); return FUNCTOR_CONTINUE; @@ -203,10 +202,7 @@ FunctorCode ResetDataFunctor::VisitEnding(Ending *ending) FunctorCode ResetDataFunctor::VisitF(F *f) { this->VisitTextElement(f); - - TimeSpanningInterface *interface = f->GetTimeSpanningInterface(); - assert(interface); - interface->InterfaceResetData(*this, f); + f->TimeSpanningInterface::InterfaceResetData(*this, f); return FUNCTOR_CONTINUE; } @@ -222,10 +218,19 @@ FunctorCode ResetDataFunctor::VisitFlag(Flag *flag) FunctorCode ResetDataFunctor::VisitFloatingObject(FloatingObject *floatingObject) { + // Call parent one too + this->VisitObject(floatingObject); + floatingObject->ResetDrawing(); floatingObject->SetDrawingGrpId(0); // Pass it to the pseudo functor of the interface + if (floatingObject->HasInterface(INTERFACE_FACSIMILE)) { + FacsimileInterface *interface = floatingObject->GetFacsimileInterface(); + assert(interface); + interface->InterfaceResetData(*this, floatingObject); + } + // else / else if because TimpeSpanningInterface::InterfaceResetData resets TimePointingInterface if (floatingObject->HasInterface(INTERFACE_TIME_SPANNING)) { TimeSpanningInterface *interface = floatingObject->GetTimeSpanningInterface(); assert(interface); @@ -265,6 +270,9 @@ FunctorCode ResetDataFunctor::VisitHairpin(Hairpin *hairpin) FunctorCode ResetDataFunctor::VisitLayer(Layer *layer) { + // Call parent one too + this->VisitObject(layer); + layer->SetCrossStaffFromAbove(false); layer->SetCrossStaffFromBelow(false); return FUNCTOR_CONTINUE; @@ -272,6 +280,10 @@ FunctorCode ResetDataFunctor::VisitLayer(Layer *layer) FunctorCode ResetDataFunctor::VisitLayerElement(LayerElement *layerElement) { + // Call parent one too + this->VisitObject(layerElement); + layerElement->FacsimileInterface::InterfaceResetData(*this, layerElement); + layerElement->SetIsInBeamSpan(false); layerElement->SetDrawingCueSize(false); layerElement->m_crossStaff = NULL; @@ -299,6 +311,10 @@ FunctorCode ResetDataFunctor::VisitLigature(Ligature *ligature) FunctorCode ResetDataFunctor::VisitMeasure(Measure *measure) { + // Call parent one too + this->VisitObject(measure); + measure->FacsimileInterface::InterfaceResetData(*this, measure); + measure->m_timestampAligner.Reset(); measure->SetDrawingEnding(NULL); return FUNCTOR_CONTINUE; @@ -327,6 +343,11 @@ FunctorCode ResetDataFunctor::VisitNote(Note *note) return FUNCTOR_CONTINUE; } +FunctorCode ResetDataFunctor::VisitObject(Object *object) +{ + return FUNCTOR_CONTINUE; +} + FunctorCode ResetDataFunctor::VisitRepeatMark(RepeatMark *repeatMark) { // Call parent one too @@ -348,6 +369,7 @@ FunctorCode ResetDataFunctor::VisitRest(Rest *rest) FunctorCode ResetDataFunctor::VisitSection(Section *section) { + // Call parent one too this->VisitFloatingObject(section); if (section->IsSystemMilestone()) { @@ -369,6 +391,10 @@ FunctorCode ResetDataFunctor::VisitSlur(Slur *slur) FunctorCode ResetDataFunctor::VisitStaff(Staff *staff) { + // Call parent one too + this->VisitObject(staff); + staff->FacsimileInterface::InterfaceResetData(*this, staff); + staff->m_timeSpanningElements.clear(); staff->ClearLedgerLines(); return FUNCTOR_CONTINUE; From 238e3bbdbd62483396ca3635ebb7b1089fd0179e Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 28 Dec 2023 10:13:23 +0000 Subject: [PATCH 121/249] Revert "Allow surface within surface" This reverts commit 4cc1e8309111afc5f18d8fa7c3abce0da5b48554. --- include/vrv/iomei.h | 2 +- src/iomei.cpp | 9 +-------- src/surface.cpp | 3 --- 3 files changed, 2 insertions(+), 12 deletions(-) diff --git a/include/vrv/iomei.h b/include/vrv/iomei.h index 6f0b358c3db..6b0d7800119 100644 --- a/include/vrv/iomei.h +++ b/include/vrv/iomei.h @@ -846,7 +846,7 @@ class MEIInput : public Input { ///@{ bool ReadFacsimile(Doc *doc, pugi::xml_node facsimile); bool ReadGraphic(Object *parent, pugi::xml_node graphic); - bool ReadSurface(Object *parent, pugi::xml_node surface); + bool ReadSurface(Facsimile *parent, pugi::xml_node surface); bool ReadTupletSpanAsTuplet(Measure *measure, pugi::xml_node tupletSpan); bool ReadZone(Surface *parent, pugi::xml_node zone); ///@} diff --git a/src/iomei.cpp b/src/iomei.cpp index dbe70a5232d..039e39b29e8 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -2884,10 +2884,6 @@ void MEIOutput::WriteSurface(pugi::xml_node currentNode, Surface *surface) pugi::xml_node childNode = currentNode.append_child("graphic"); this->WriteGraphic(childNode, dynamic_cast(child)); } - else if (child->GetClassId() == SURFACE) { - pugi::xml_node childNode = currentNode.append_child("surface"); - this->WriteSurface(childNode, dynamic_cast(child)); - } else if (child->GetClassId() == ZONE) { pugi::xml_node childNode = currentNode.append_child("zone"); this->WriteZone(childNode, dynamic_cast(child)); @@ -8507,7 +8503,7 @@ bool MEIInput::ReadGraphic(Object *parent, pugi::xml_node graphic) return true; } -bool MEIInput::ReadSurface(Object *parent, pugi::xml_node surface) +bool MEIInput::ReadSurface(Facsimile *parent, pugi::xml_node surface) { assert(parent); Surface *vrvSurface = new Surface(); @@ -8520,9 +8516,6 @@ bool MEIInput::ReadSurface(Object *parent, pugi::xml_node surface) if (strcmp(child.name(), "graphic") == 0) { this->ReadGraphic(vrvSurface, child); } - else if (strcmp(child.name(), "surface") == 0) { - this->ReadSurface(vrvSurface, child); - } else if (strcmp(child.name(), "zone") == 0) { this->ReadZone(vrvSurface, child); } diff --git a/src/surface.cpp b/src/surface.cpp index 799f8477e26..3c0b01d1b43 100644 --- a/src/surface.cpp +++ b/src/surface.cpp @@ -49,9 +49,6 @@ bool Surface::IsSupportedChild(Object *object) if (object->Is(GRAPHIC)) { assert(dynamic_cast(object)); } - else if (object->Is(SURFACE)) { - assert(dynamic_cast(object)); - } else if (object->Is(ZONE)) { assert(dynamic_cast(object)); } From 3a5dda70b23cd67fe7d3176f252a462a760b89be Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 28 Dec 2023 11:49:56 +0000 Subject: [PATCH 122/249] Make a separate Doc::UpdatePageDrawingSizes method --- include/vrv/doc.h | 5 +++++ src/doc.cpp | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/vrv/doc.h b/include/vrv/doc.h index 788483f2554..3a60bfe6c6b 100644 --- a/include/vrv/doc.h +++ b/include/vrv/doc.h @@ -398,6 +398,11 @@ class Doc : public Object { */ Page *SetDrawingPage(int pageIdx); + /** + * Update the drawing page sizes when a page is set as drawing page. + */ + void UpdatePageDrawingSizes(); + /** * Reset drawing page to NULL. * This might be necessary if we have replaced a page in the document. diff --git a/src/doc.cpp b/src/doc.cpp index 1b5d917a0d5..ce24cb3dbed 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -2038,6 +2038,15 @@ Page *Doc::SetDrawingPage(int pageIdx) m_drawingPage = vrv_cast(pages->GetChild(pageIdx)); assert(m_drawingPage); + UpdatePageDrawingSizes(); + + return m_drawingPage; +} + +void Doc::UpdatePageDrawingSizes() +{ + assert(m_drawingPage); + int glyph_size; // we use the page members only if set (!= -1) @@ -2103,8 +2112,6 @@ Page *Doc::SetDrawingPage(int pageIdx) glyph_size = this->GetGlyphWidth(SMUFL_E0A2_noteheadWhole, 100, 0); m_drawingBrevisWidth = (int)((glyph_size * 0.8) / 2); - - return m_drawingPage; } int Doc::CalcMusicFontSize() From 64110d14b35c3c7269372deeefecbce9143911cd Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 28 Dec 2023 12:19:56 +0000 Subject: [PATCH 123/249] Adjust the implementation of SyncFromFacsimile * Read page size from the surface attributes * Convert to logical units --- include/vrv/facsimilefunctor.h | 11 ++++- src/doc.cpp | 2 +- src/facsimilefunctor.cpp | 82 +++++++++++++++++++--------------- src/facsimileinterface.cpp | 4 +- 4 files changed, 59 insertions(+), 40 deletions(-) diff --git a/include/vrv/facsimilefunctor.h b/include/vrv/facsimilefunctor.h index 4f3ae259fe5..1273343626c 100644 --- a/include/vrv/facsimilefunctor.h +++ b/include/vrv/facsimilefunctor.h @@ -35,7 +35,7 @@ class SyncFromFacsimileFunctor : public Functor { * @name Constructors, destructors */ ///@{ - SyncFromFacsimileFunctor(); + SyncFromFacsimileFunctor(Doc *doc); virtual ~SyncFromFacsimileFunctor() = default; ///@} @@ -64,6 +64,10 @@ class SyncFromFacsimileFunctor : public Functor { public: // private: + /** The doc */ + Doc *m_doc; + // + View m_view; // Page *m_currentPage; System *m_currentSystem; @@ -115,13 +119,16 @@ class SyncToFacsimileFunctor : public Functor { private: /** The doc */ Doc *m_doc; + // + View m_view; /** The surface we are going to add / update zone */ Surface *m_surface; // Page *m_currentPage; System *m_currentSystem; // - View m_view; + int m_pageMarginTop; + int m_pageMarginLeft; }; } // namespace vrv diff --git a/src/doc.cpp b/src/doc.cpp index ce24cb3dbed..d138ced9ba9 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -1398,7 +1398,7 @@ void Doc::SyncFromFacsimileDoc() PrepareFacsimileFunctor prepareFacsimile(this->GetFacsimile()); this->Process(prepareFacsimile); - SyncFromFacsimileFunctor syncFromFacsimileFunctor; + SyncFromFacsimileFunctor syncFromFacsimileFunctor(this); this->Process(syncFromFacsimileFunctor); } diff --git a/src/facsimilefunctor.cpp b/src/facsimilefunctor.cpp index 62a3e61b795..eb97b6ed18d 100644 --- a/src/facsimilefunctor.cpp +++ b/src/facsimilefunctor.cpp @@ -29,8 +29,10 @@ namespace vrv { // SyncFromFacsimileFunctor //---------------------------------------------------------------------------- -SyncFromFacsimileFunctor::SyncFromFacsimileFunctor() : Functor() +SyncFromFacsimileFunctor::SyncFromFacsimileFunctor(Doc *doc) : Functor() { + m_doc = doc; + m_view.SetDoc(doc); m_currentPage = NULL; m_currentSystem = NULL; } @@ -41,7 +43,7 @@ FunctorCode SyncFromFacsimileFunctor::VisitLayerElement(LayerElement *layerEleme Zone *zone = layerElement->GetZone(); assert(zone); - layerElement->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; + layerElement->m_xAbs = m_view.ToLogicalX(zone->GetUlx() * DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } @@ -50,8 +52,8 @@ FunctorCode SyncFromFacsimileFunctor::VisitMeasure(Measure *measure) { Zone *zone = measure->GetZone(); assert(zone); - measure->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; - measure->m_xAbs2 = zone->GetLrx() * DEFINITION_FACTOR; + measure->m_xAbs = m_view.ToLogicalX(zone->GetUlx() * DEFINITION_FACTOR); + measure->m_xAbs2 = m_view.ToLogicalX(zone->GetLrx() * DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } @@ -59,6 +61,7 @@ FunctorCode SyncFromFacsimileFunctor::VisitMeasure(Measure *measure) FunctorCode SyncFromFacsimileFunctor::VisitPage(Page *page) { m_currentPage = page; + m_doc->SetDrawingPage(m_currentPage->GetIdx()); return FUNCTOR_CONTINUE; } @@ -69,9 +72,20 @@ FunctorCode SyncFromFacsimileFunctor::VisitPb(Pb *pb) assert(m_currentPage); Zone *zone = pb->GetZone(); - assert(zone); - m_currentPage->m_pageHeight = zone->GetLry() * DEFINITION_FACTOR; - m_currentPage->m_pageWidth = zone->GetLrx() * DEFINITION_FACTOR; + assert(zone && zone->GetParent()); + Surface *surface = (zone->GetParent()->Is(SURFACE)) ? vrv_cast(zone->GetParent()) : NULL; + // Use the parent surface attributes if given + if (surface && surface->HasLrx() && surface->HasLry()) { + m_currentPage->m_pageHeight = surface->GetLry() * DEFINITION_FACTOR; + m_currentPage->m_pageWidth = surface->GetLrx() * DEFINITION_FACTOR; + } + // Fallback on zone + else { + m_currentPage->m_pageHeight = zone->GetLry() * DEFINITION_FACTOR; + m_currentPage->m_pageWidth = zone->GetLrx() * DEFINITION_FACTOR; + } + // Update the page size to have to View::ToLogicalX/Y valid + m_doc->UpdatePageDrawingSizes(); return FUNCTOR_CONTINUE; } @@ -83,8 +97,8 @@ FunctorCode SyncFromFacsimileFunctor::VisitSb(Sb *sb) Zone *zone = sb->GetZone(); assert(zone); - m_currentSystem->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; - m_currentSystem->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; + m_currentSystem->m_xAbs = m_view.ToLogicalX(zone->GetUlx() * DEFINITION_FACTOR); + m_currentSystem->m_yAbs = m_view.ToLogicalY(zone->GetUly() * DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } @@ -93,7 +107,7 @@ FunctorCode SyncFromFacsimileFunctor::VisitStaff(Staff *staff) { Zone *zone = staff->GetZone(); assert(zone); - staff->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; + staff->m_yAbs = m_view.ToLogicalY(zone->GetUly() * DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } @@ -116,26 +130,26 @@ SyncToFacsimileFunctor::SyncToFacsimileFunctor(Doc *doc) : Functor() m_surface = NULL; m_currentPage = NULL; m_currentSystem = NULL; + m_pageMarginTop = 0; + m_pageMarginLeft = 0; } FunctorCode SyncToFacsimileFunctor::VisitLayerElement(LayerElement *layerElement) { if (!layerElement->Is({ NOTE, REST })) return FUNCTOR_CONTINUE; - // layerElement->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; Zone *zone = this->GetZone(layerElement, layerElement->GetClassName()); - zone->SetUlx(m_view.ToLogicalX(layerElement->GetDrawingX()) / DEFINITION_FACTOR); + zone->SetUlx(m_view.ToDeviceContextX(layerElement->GetDrawingX()) / DEFINITION_FACTOR + m_pageMarginLeft); return FUNCTOR_CONTINUE; } FunctorCode SyncToFacsimileFunctor::VisitMeasure(Measure *measure) { - // measure->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; - // measure->m_xAbs2 = zone->GetLrx() * DEFINITION_FACTOR; Zone *zone = this->GetZone(measure, measure->GetClassName()); - zone->SetUlx(measure->GetDrawingX() / DEFINITION_FACTOR); - zone->SetLrx(measure->GetDrawingX() + measure->GetWidth() / DEFINITION_FACTOR); + zone->SetUlx(m_view.ToDeviceContextX(measure->GetDrawingX()) / DEFINITION_FACTOR + m_pageMarginLeft); + zone->SetLrx( + m_view.ToDeviceContextX(measure->GetDrawingX() + measure->GetWidth()) / DEFINITION_FACTOR + m_pageMarginLeft); return FUNCTOR_CONTINUE; } @@ -146,46 +160,44 @@ FunctorCode SyncToFacsimileFunctor::VisitPage(Page *page) m_doc->SetDrawingPage(page->GetIdx()); page->LayOut(); // - Surface *surface = new Surface(); - assert(m_doc->GetFacsimile()); - m_doc->GetFacsimile()->AddChild(surface); - surface->SetLrx(m_doc->m_drawingPageWidth / DEFINITION_FACTOR); - surface->SetLry(m_doc->m_drawingPageHeight / DEFINITION_FACTOR); m_surface = new Surface(); - surface->AddChild(m_surface); - m_surface->SetUlx(m_doc->m_drawingPageMarginLeft / DEFINITION_FACTOR); - m_surface->SetUly(m_doc->m_drawingPageMarginRight / DEFINITION_FACTOR); - m_surface->SetLrx(m_doc->m_drawingPageContentWidth / DEFINITION_FACTOR); - m_surface->SetLry(m_doc->m_drawingPageContentHeight / DEFINITION_FACTOR); + assert(m_doc->GetFacsimile()); + m_doc->GetFacsimile()->AddChild(m_surface); + m_surface->SetLrx(m_doc->m_drawingPageWidth / DEFINITION_FACTOR); + m_surface->SetLry(m_doc->m_drawingPageHeight / DEFINITION_FACTOR); + // Because the facsimile output zone positions include the margins, we will add them to each zone + m_pageMarginTop = m_doc->m_drawingPageMarginTop / DEFINITION_FACTOR; + m_pageMarginLeft = m_doc->m_drawingPageMarginLeft / DEFINITION_FACTOR; return FUNCTOR_CONTINUE; } FunctorCode SyncToFacsimileFunctor::VisitPb(Pb *pb) { - // m_currentPage->m_pageHeight = zone->GetLry() * DEFINITION_FACTOR; - // m_currentPage->m_pageWidth = zone->GetLrx() * DEFINITION_FACTOR; - // Zone *zone = this->GetZone(pb, pb->GetClassName()); + Zone *zone = this->GetZone(pb, pb->GetClassName()); + // The Pb zone values are currently not used in SyncFromFacsimileFunctor because the + // page sizes are synced from the parent Surface and zone positions include margins + zone->SetUlx(m_pageMarginLeft); + zone->SetUly(m_pageMarginTop); + zone->SetLrx(m_doc->m_drawingPageContentWidth / DEFINITION_FACTOR + m_pageMarginLeft); + zone->SetLry(m_doc->m_drawingPageContentHeight / DEFINITION_FACTOR + m_pageMarginTop); return FUNCTOR_CONTINUE; } FunctorCode SyncToFacsimileFunctor::VisitSb(Sb *sb) { - // m_currentSystem->m_xAbs = zone->GetUlx() * DEFINITION_FACTOR; - // m_currentSystem->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; Zone *zone = this->GetZone(sb, sb->GetClassName()); - zone->SetUlx(m_view.ToLogicalX(m_currentSystem->GetDrawingX()) / DEFINITION_FACTOR); - zone->SetUly(m_view.ToLogicalY(m_currentSystem->GetDrawingY()) / DEFINITION_FACTOR); + zone->SetUlx(m_view.ToDeviceContextX(m_currentSystem->GetDrawingX()) / DEFINITION_FACTOR + m_pageMarginLeft); + zone->SetUly(m_view.ToDeviceContextY(m_currentSystem->GetDrawingY()) / DEFINITION_FACTOR + m_pageMarginTop); return FUNCTOR_CONTINUE; } FunctorCode SyncToFacsimileFunctor::VisitStaff(Staff *staff) { - // staff->m_yAbs = zone->GetUly() * DEFINITION_FACTOR; Zone *zone = this->GetZone(staff, staff->GetClassName()); - zone->SetUly(m_view.ToLogicalY(staff->GetDrawingY()) / DEFINITION_FACTOR); + zone->SetUly(m_view.ToDeviceContextY(staff->GetDrawingY()) / DEFINITION_FACTOR + m_pageMarginTop); return FUNCTOR_CONTINUE; } diff --git a/src/facsimileinterface.cpp b/src/facsimileinterface.cpp index d6caee2e131..93dd965da22 100644 --- a/src/facsimileinterface.cpp +++ b/src/facsimileinterface.cpp @@ -35,7 +35,7 @@ FacsimileInterface::~FacsimileInterface() {} void FacsimileInterface::Reset() { this->ResetFacsimile(); - + m_zone = NULL; m_surface = NULL; } @@ -116,7 +116,7 @@ FunctorCode FacsimileInterface::InterfacePrepareFacsimile(PrepareFacsimileFuncto LogWarning("Could not find @facs '%s' in facsimile element", facsID.c_str()); return FUNCTOR_CONTINUE; } - + if (facsDescendant->Is(ZONE)) { m_zone = vrv_cast(facsDescendant); assert(m_zone); From ca055284bbdac22aa97ad4fed49064e36a0a0d9d Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 28 Dec 2023 14:15:53 +0000 Subject: [PATCH 124/249] Remove unused vrv_params_cast --- include/vrv/vrvdef.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/include/vrv/vrvdef.h b/include/vrv/vrvdef.h index 8178d672501..eb3644af011 100644 --- a/include/vrv/vrvdef.h +++ b/include/vrv/vrvdef.h @@ -61,11 +61,8 @@ namespace vrv { #ifdef VRV_DYNAMIC_CAST // To be used for all cases where type is cheched through Object::m_type #define vrv_cast dynamic_cast -// To be used for params casts within Functors -#define vrv_params_cast dynamic_cast #else #define vrv_cast static_cast -#define vrv_params_cast static_cast #endif //---------------------------------------------------------------------------- From cc9269df0bd0ba3f2d47e6698f92d237f90c57e1 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 28 Dec 2023 19:17:22 +0000 Subject: [PATCH 125/249] Add mei-facs output option in the command-line tool --- src/options.cpp | 2 +- src/toolkit.cpp | 17 +++++++++++++++-- tools/main.cpp | 14 +++++++++----- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/options.cpp b/src/options.cpp index 08aa84dad59..294837d2679 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -954,7 +954,7 @@ Options::Options() m_baseOptions.AddOption(&m_scale); m_outputTo.SetInfo("Output to", - "Select output format to: \"mei\", \"mei-pb\", \"mei-basic\", \"svg\", \"midi\", \"timemap\", " + "Select output format to: \"mei\", \"mei-pb\", \"mei-facs\", \"mei-basic\", \"svg\", \"midi\", \"timemap\", " "\"expansionmap\", \"humdrum\" or " "\"pae\""); m_outputTo.Init("svg"); diff --git a/src/toolkit.cpp b/src/toolkit.cpp index c946c020aca..b7a31251bd2 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -152,6 +152,9 @@ bool Toolkit::SetOutputTo(std::string const &outputTo) else if (outputTo == "mei-pb") { m_outputTo = MEI; } + else if (outputTo == "mei-facs") { + m_outputTo = MEI; + } else if (outputTo == "midi") { m_outputTo = MIDI; } @@ -816,6 +819,7 @@ std::string Toolkit::GetMEI(const std::string &jsonOptions) std::string firstMeasure; std::string lastMeasure; std::string mdiv; + bool generateFacs = false; jsonxx::Object json; @@ -838,6 +842,7 @@ std::string Toolkit::GetMEI(const std::string &jsonOptions) if (json.has("firstMeasure")) firstMeasure = json.get("firstMeasure"); if (json.has("lastMeasure")) lastMeasure = json.get("lastMeasure"); if (json.has("mdiv")) mdiv = json.get("mdiv"); + if (json.has("generateFacs")) generateFacs = json.get("generateFacs"); } } @@ -858,8 +863,6 @@ std::string Toolkit::GetMEI(const std::string &jsonOptions) m_doc.DeactiveateSelection(); } - m_doc.SyncToFacsimileDoc(); - MEIOutput meioutput(&m_doc); meioutput.SetScoreBasedMEI(scoreBased); meioutput.SetBasic(basic); @@ -875,6 +878,16 @@ std::string Toolkit::GetMEI(const std::string &jsonOptions) if (!lastMeasure.empty()) meioutput.SetLastMeasure(lastMeasure); if (!mdiv.empty()) meioutput.SetMdiv(mdiv); + if (generateFacs) { + if (meioutput.HasFilter() || !scoreBased || (m_options->m_breaks.GetValue() != BREAKS_encoded) + || m_doc.HasSelection()) { + LogError("Generating facsimile is only possible with all pages, encoded breaks, score-based output and " + "without selection."); + return ""; + } + m_doc.SyncToFacsimileDoc(); + } + std::string output = meioutput.GetOutput(); if (hadSelection) m_doc.ReactivateSelection(false); diff --git a/tools/main.cpp b/tools/main.cpp index 6f5aba3d793..3c0c8ee647f 100644 --- a/tools/main.cpp +++ b/tools/main.cpp @@ -279,10 +279,11 @@ int main(int argc, char **argv) } if ((outformat != "svg") && (outformat != "mei") && (outformat != "mei-basic") && (outformat != "mei-pb") - && (outformat != "midi") && (outformat != "timemap") && (outformat != "expansionmap") - && (outformat != "humdrum") && (outformat != "hum") && (outformat != "pae")) { + && (outformat != "mei-facs") && (outformat != "midi") && (outformat != "timemap") + && (outformat != "expansionmap") && (outformat != "humdrum") && (outformat != "hum") && (outformat != "pae")) { std::cerr << "Output format (" << outformat - << ") can only be 'mei', 'mei-basic', 'mei-pb', 'svg', 'midi', 'timemap', 'expansionmap', 'humdrum' " + << ") can only be 'mei', 'mei-basic', 'mei-pb', mei-facs', 'svg', 'midi', 'timemap', 'expansionmap', " + "'humdrum' " "or 'pae'." << std::endl; exit(1); @@ -553,10 +554,12 @@ int main(int argc, char **argv) const char *scoreBased = (outformat == "mei-pb") ? "false" : "true"; const char *basic = (outformat == "mei-basic") ? "true" : "false"; const char *removeIds = (options->m_removeIds.GetValue()) ? "true" : "false"; + const char *generateFacs = (outformat == "mei-facs") ? "true" : "false"; outfile += ".mei"; if (all_pages) { std::string params - = vrv::StringFormat("{'scoreBased': %s, 'basic': %s, 'removeIds': %s}", scoreBased, basic, removeIds); + = vrv::StringFormat("{'scoreBased': %s, 'basic': %s, 'removeIds': %s, 'generateFacs': %s}", scoreBased, + basic, removeIds, generateFacs); if (std_output) { std::string output; std::cout << toolkit.GetMEI(params); @@ -570,7 +573,8 @@ int main(int argc, char **argv) } else { std::string params = vrv::StringFormat( - "{'scoreBased': %s, 'basic': %s, 'pageNo': %d, 'removeIds': %s}", scoreBased, basic, page, removeIds); + "{'scoreBased': %s, 'basic': %s, 'pageNo': %d, 'removeIds': %s, 'generateFacs': %s}", scoreBased, basic, + page, removeIds, generateFacs); if (std_output) { std::cout << toolkit.GetMEI(params); } From 972ae2cc11922fa0258a1c0c220253a5777eeee9 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 29 Dec 2023 07:52:05 +0000 Subject: [PATCH 126/249] Move call to Doc::SyncFromFacsimile to Toolkit::LoadData --- src/iomei.cpp | 4 ---- src/toolkit.cpp | 15 ++++++++++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/iomei.cpp b/src/iomei.cpp index 7aa1a46e76d..66c7cf2076c 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -3999,10 +3999,6 @@ bool MEIInput::ReadDoc(pugi::xml_node root) m_doc->ConvertMarkupDoc(!m_doc->GetOptions()->m_preserveAnalyticalMarkup.GetValue()); } - if (success && m_doc->IsTranscription()) { - m_doc->SyncFromFacsimileDoc(); - } - if (success && !m_hasScoreDef) { LogWarning("No scoreDef provided, trying to generate one..."); success = m_doc->GenerateDocumentScoreDef(); diff --git a/src/toolkit.cpp b/src/toolkit.cpp index b7a31251bd2..4821605cf8b 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -752,9 +752,14 @@ bool Toolkit::LoadData(const std::string &data) breaks = BREAKS_none; } - // Always set breaks to 'none' with Transcription or Facs rendering - rendering them differenty requires the MEI - // to be converted - if (m_doc.IsTranscription() || m_doc.IsFacs()) breaks = BREAKS_none; + // Always set breaks to 'none' with Facs rendering + if (m_doc.IsFacs()) breaks = BREAKS_none; + + // Always set breaks to 'none' or 'encoded' with Transcription rendering + // rendering them differenty requires the MEI + if (m_doc.IsTranscription()) { + breaks = (m_doc.HasFacsimile()) ? BREAKS_encoded : BREAKS_none; + } if (breaks != BREAKS_none) { if (input->GetLayoutInformation() == LAYOUT_ENCODED @@ -787,6 +792,10 @@ bool Toolkit::LoadData(const std::string &data) } } + if (m_doc.IsTranscription() && m_doc.HasFacsimile()) { + m_doc.SyncFromFacsimileDoc(); + } + delete input; m_view.SetDoc(&m_doc); From 6d05ef624340fba31c3ce65fe19d221321a8f804 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 29 Dec 2023 11:58:11 +0100 Subject: [PATCH 127/249] Rename m_*Abs members to m_drawingFacs* --- include/vrv/doc.h | 2 +- include/vrv/layerelement.h | 2 +- include/vrv/measure.h | 4 +-- include/vrv/staff.h | 2 +- include/vrv/system.h | 4 +-- src/adjustxrelfortranscriptionfunctor.cpp | 2 +- src/facsimilefunctor.cpp | 12 ++++---- src/iomei.cpp | 34 +++++++++++------------ src/layerelement.cpp | 8 +++--- src/measure.cpp | 16 +++++------ src/miscfunctor.cpp | 12 ++++---- src/staff.cpp | 4 +-- src/system.cpp | 8 +++--- 13 files changed, 55 insertions(+), 55 deletions(-) diff --git a/include/vrv/doc.h b/include/vrv/doc.h index 3a60bfe6c6b..8b387ef995a 100644 --- a/include/vrv/doc.h +++ b/include/vrv/doc.h @@ -370,7 +370,7 @@ class Doc : public Object { void ConvertMarkupDoc(bool permanent = true); /** - * Sync the coordinate provided trought to m_Abs. + * Sync the coordinate provided trought to m_drawingFacsX/Y. * Call the SyncToFacsimile functor. */ void SyncFromFacsimileDoc(); diff --git a/include/vrv/layerelement.h b/include/vrv/layerelement.h index af0917a61d7..085fa811845 100644 --- a/include/vrv/layerelement.h +++ b/include/vrv/layerelement.h @@ -386,7 +386,7 @@ class LayerElement : public Object, public: /** Absolute position X. This is used for facsimile (transcription) encoding */ - int m_xAbs; + int m_drawingFacsX; /** * This stores a pointer to the cross-staff (if any) and the appropriate layer * See PrepareCrossStaffFunctor diff --git a/include/vrv/measure.h b/include/vrv/measure.h index e76832df519..49ab432a0d7 100644 --- a/include/vrv/measure.h +++ b/include/vrv/measure.h @@ -371,8 +371,8 @@ class Measure : public Object, * This is the left and right position of the measure. */ ///@{ - int m_xAbs; - int m_xAbs2; + int m_drawingFacsX1; + int m_drawingFacsX2; ///@} /** diff --git a/include/vrv/staff.h b/include/vrv/staff.h index db2edc25618..51cbdbd9346 100644 --- a/include/vrv/staff.h +++ b/include/vrv/staff.h @@ -226,7 +226,7 @@ class Staff : public Object, * The Y absolute position of the staff for facsimile (transcription) encodings. * This is the top left corner of the staff (the X position is the position of the system). */ - int m_yAbs; + int m_drawingFacsY; StaffDef *m_drawingStaffDef; diff --git a/include/vrv/system.h b/include/vrv/system.h index a8900f2a9c5..7485e2abfbe 100644 --- a/include/vrv/system.h +++ b/include/vrv/system.h @@ -191,12 +191,12 @@ class System : public Object, public DrawingListInterface, public AttTyped { * The Y absolute position of the staff for facsimile (transcription) encodings. * This is the top left corner of the system. */ - int m_yAbs; + int m_drawingFacsY; /** * The x absolute position of the system for facsimile layouts. * This is the top left corner of the system. */ - int m_xAbs; + int m_drawingFacsX; /** * The width used by the abbreviated labels at the left of the system. * It is used internally when calculating the layout and it is not stored in the file. diff --git a/src/adjustxrelfortranscriptionfunctor.cpp b/src/adjustxrelfortranscriptionfunctor.cpp index c4e4c1f20d4..be005259ec4 100644 --- a/src/adjustxrelfortranscriptionfunctor.cpp +++ b/src/adjustxrelfortranscriptionfunctor.cpp @@ -21,7 +21,7 @@ AdjustXRelForTranscriptionFunctor::AdjustXRelForTranscriptionFunctor() : Functor FunctorCode AdjustXRelForTranscriptionFunctor::VisitLayerElement(LayerElement *layerElement) { - if (layerElement->m_xAbs == VRV_UNSET) return FUNCTOR_CONTINUE; + if (layerElement->m_drawingFacsX == VRV_UNSET) return FUNCTOR_CONTINUE; if (layerElement->IsScoreDefElement()) return FUNCTOR_SIBLINGS; diff --git a/src/facsimilefunctor.cpp b/src/facsimilefunctor.cpp index eb97b6ed18d..73ec1ef23ca 100644 --- a/src/facsimilefunctor.cpp +++ b/src/facsimilefunctor.cpp @@ -43,7 +43,7 @@ FunctorCode SyncFromFacsimileFunctor::VisitLayerElement(LayerElement *layerEleme Zone *zone = layerElement->GetZone(); assert(zone); - layerElement->m_xAbs = m_view.ToLogicalX(zone->GetUlx() * DEFINITION_FACTOR); + layerElement->m_drawingFacsX = m_view.ToLogicalX(zone->GetUlx() * DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } @@ -52,8 +52,8 @@ FunctorCode SyncFromFacsimileFunctor::VisitMeasure(Measure *measure) { Zone *zone = measure->GetZone(); assert(zone); - measure->m_xAbs = m_view.ToLogicalX(zone->GetUlx() * DEFINITION_FACTOR); - measure->m_xAbs2 = m_view.ToLogicalX(zone->GetLrx() * DEFINITION_FACTOR); + measure->m_drawingFacsX1 = m_view.ToLogicalX(zone->GetUlx() * DEFINITION_FACTOR); + measure->m_drawingFacsX2 = m_view.ToLogicalX(zone->GetLrx() * DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } @@ -97,8 +97,8 @@ FunctorCode SyncFromFacsimileFunctor::VisitSb(Sb *sb) Zone *zone = sb->GetZone(); assert(zone); - m_currentSystem->m_xAbs = m_view.ToLogicalX(zone->GetUlx() * DEFINITION_FACTOR); - m_currentSystem->m_yAbs = m_view.ToLogicalY(zone->GetUly() * DEFINITION_FACTOR); + m_currentSystem->m_drawingFacsX = m_view.ToLogicalX(zone->GetUlx() * DEFINITION_FACTOR); + m_currentSystem->m_drawingFacsY = m_view.ToLogicalY(zone->GetUly() * DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } @@ -107,7 +107,7 @@ FunctorCode SyncFromFacsimileFunctor::VisitStaff(Staff *staff) { Zone *zone = staff->GetZone(); assert(zone); - staff->m_yAbs = m_view.ToLogicalY(zone->GetUly() * DEFINITION_FACTOR); + staff->m_drawingFacsY = m_view.ToLogicalY(zone->GetUly() * DEFINITION_FACTOR); return FUNCTOR_CONTINUE; } diff --git a/src/iomei.cpp b/src/iomei.cpp index 66c7cf2076c..d9487f9020d 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -1640,8 +1640,8 @@ void MEIOutput::WriteSystem(pugi::xml_node currentNode, System *system) currentNode.append_attribute("system.rightmar") = StringFormat("%d", system->m_systemRightMar / DEFINITION_FACTOR).c_str(); // y positions - if (system->m_yAbs != VRV_UNSET) { - currentNode.append_attribute("uly") = StringFormat("%d", system->m_yAbs / DEFINITION_FACTOR).c_str(); + if (system->m_drawingFacsY != VRV_UNSET) { + currentNode.append_attribute("uly") = StringFormat("%d", system->m_drawingFacsY / DEFINITION_FACTOR).c_str(); } system->WriteTyped(currentNode); } @@ -1894,9 +1894,9 @@ void MEIOutput::WriteMeasure(pugi::xml_node currentNode, Measure *measure) measure->WritePointing(currentNode); measure->WriteTyped(currentNode); // For now we copy the adjusted value of coord.x1 and coord.x2 to xAbs and xAbs2 respectively - if ((measure->m_xAbs != VRV_UNSET) && (measure->m_xAbs2 != VRV_UNSET)) { - measure->SetCoordX1(measure->m_xAbs / DEFINITION_FACTOR); - measure->SetCoordX2(measure->m_xAbs2 / DEFINITION_FACTOR); + if ((measure->m_drawingFacsX1 != VRV_UNSET) && (measure->m_drawingFacsX2 != VRV_UNSET)) { + measure->SetCoordX1(measure->m_drawingFacsX1 / DEFINITION_FACTOR); + measure->SetCoordX2(measure->m_drawingFacsX2 / DEFINITION_FACTOR); measure->WriteCoordX1(currentNode); measure->WriteCoordX2(currentNode); } @@ -2226,8 +2226,8 @@ void MEIOutput::WriteStaff(pugi::xml_node currentNode, Staff *staff) staff->WriteVisibility(currentNode); // y position - if (staff->m_yAbs != VRV_UNSET) { - staff->SetCoordY1(staff->m_yAbs / DEFINITION_FACTOR); + if (staff->m_drawingFacsY != VRV_UNSET) { + staff->SetCoordY1(staff->m_drawingFacsY / DEFINITION_FACTOR); staff->WriteCoordY1(currentNode); } } @@ -2306,8 +2306,8 @@ void MEIOutput::WriteLayerElement(pugi::xml_node currentNode, LayerElement *elem this->WriteLinkingInterface(currentNode, element); element->WriteLabelled(currentNode); element->WriteTyped(currentNode); - if (element->m_xAbs != VRV_UNSET) { - element->SetCoordX1(element->m_xAbs / DEFINITION_FACTOR); + if (element->m_drawingFacsX != VRV_UNSET) { + element->SetCoordX1(element->m_drawingFacsX / DEFINITION_FACTOR); element->WriteCoordX1(currentNode); } } @@ -4578,7 +4578,7 @@ bool MEIInput::ReadSystem(Object *parent, pugi::xml_node system) system.remove_attribute("system.rightmar"); } if (system.attribute("uly") && m_doc->IsTranscription()) { - vrvSystem->m_yAbs = system.attribute("uly").as_int() * DEFINITION_FACTOR; + vrvSystem->m_drawingFacsY = system.attribute("uly").as_int() * DEFINITION_FACTOR; system.remove_attribute("uly"); } @@ -5370,8 +5370,8 @@ bool MEIInput::ReadMeasure(Object *parent, pugi::xml_node measure) if (measure.attribute("coord.x1") && measure.attribute("coord.x2") && m_doc->IsTranscription()) { vrvMeasure->ReadCoordX1(measure); vrvMeasure->ReadCoordX2(measure); - vrvMeasure->m_xAbs = vrvMeasure->GetCoordX1() * DEFINITION_FACTOR; - vrvMeasure->m_xAbs2 = vrvMeasure->GetCoordX2() * DEFINITION_FACTOR; + vrvMeasure->m_drawingFacsX1 = vrvMeasure->GetCoordX1() * DEFINITION_FACTOR; + vrvMeasure->m_drawingFacsX2 = vrvMeasure->GetCoordX2() * DEFINITION_FACTOR; } parent->AddChild(vrvMeasure); @@ -6063,7 +6063,7 @@ bool MEIInput::ReadStaff(Object *parent, pugi::xml_node staff) if (staff.attribute("coord.y1") && m_doc->IsTranscription()) { vrvStaff->ReadCoordY1(staff); - vrvStaff->m_yAbs = vrvStaff->GetCoordY1() * DEFINITION_FACTOR; + vrvStaff->m_drawingFacsY = vrvStaff->GetCoordY1() * DEFINITION_FACTOR; } if (!vrvStaff->HasN() || (vrvStaff->GetN() == 0)) { @@ -6303,7 +6303,7 @@ bool MEIInput::ReadLayerElement(pugi::xml_node element, LayerElement *object) if (element.attribute("coord.x1") && m_doc->IsTranscription()) { object->ReadCoordX1(element); - object->m_xAbs = object->GetCoordX1() * DEFINITION_FACTOR; + object->m_drawingFacsX = object->GetCoordX1() * DEFINITION_FACTOR; } return true; @@ -8471,14 +8471,14 @@ void MEIInput::UpgradeMeasureTo_3_0_0(Measure *measure, System *system) assert(system); assert(!measure->IsMeasuredMusic()); - if (system->m_yAbs == VRV_UNSET) return; + if (system->m_drawingFacsY == VRV_UNSET) return; if (system->m_systemRightMar == VRV_UNSET) return; if (system->m_systemRightMar == VRV_UNSET) return; Page *page = vrv_cast(system->GetFirstAncestor(PAGE)); assert(page); - measure->m_xAbs = system->m_systemLeftMar; - measure->m_xAbs2 = page->m_pageWidth - system->m_systemRightMar; + measure->m_drawingFacsX1 = system->m_systemLeftMar; + measure->m_drawingFacsX2 = page->m_pageWidth - system->m_systemRightMar; } void MEIInput::UpgradePageTo_3_0_0(Page *page, Doc *doc) diff --git a/src/layerelement.cpp b/src/layerelement.cpp index 90d453f4569..459d4c505df 100644 --- a/src/layerelement.cpp +++ b/src/layerelement.cpp @@ -127,7 +127,7 @@ void LayerElement::Reset() this->ResetLabelled(); this->ResetTyped(); - m_xAbs = VRV_UNSET; + m_drawingFacsX = VRV_UNSET; m_drawingYRel = 0; m_drawingXRel = 0; m_drawingCueSize = false; @@ -405,8 +405,8 @@ int LayerElement::GetDrawingX() const } } - // Since m_xAbs is the left position, we adjust the XRel accordingly in AdjustXRelForTranscription - if (m_xAbs != VRV_UNSET) return m_xAbs + this->GetDrawingXRel(); + // Since m_drawingFacsX is the left position, we adjust the XRel accordingly in AdjustXRelForTranscription + if (m_drawingFacsX != VRV_UNSET) return m_drawingFacsX + this->GetDrawingXRel(); if (m_cachedDrawingX != VRV_UNSET) return m_cachedDrawingX; @@ -532,7 +532,7 @@ void LayerElement::CacheYRel(bool restore) void LayerElement::CenterDrawingX() { - if (m_xAbs != VRV_UNSET) return; + if (m_drawingFacsX != VRV_UNSET) return; this->SetDrawingXRel(0); diff --git a/src/measure.cpp b/src/measure.cpp index 3e5cf77f2db..4439fe36ce8 100644 --- a/src/measure.cpp +++ b/src/measure.cpp @@ -137,8 +137,8 @@ void Measure::Reset() this->ResetDrawingScoreDef(); m_timestampAligner.Reset(); - m_xAbs = VRV_UNSET; - m_xAbs2 = VRV_UNSET; + m_drawingFacsX1 = VRV_UNSET; + m_drawingFacsX2 = VRV_UNSET; m_drawingXRel = 0; m_cachedXRel = VRV_UNSET; @@ -150,8 +150,8 @@ void Measure::Reset() m_leftBarLine.SetForm(this->GetLeft()); if (!m_measuredMusic) { - m_xAbs = VRV_UNSET; - m_xAbs2 = VRV_UNSET; + m_drawingFacsX1 = VRV_UNSET; + m_drawingFacsX2 = VRV_UNSET; } m_drawingEnding = NULL; @@ -216,12 +216,12 @@ int Measure::GetDrawingX() const if (!this->IsMeasuredMusic()) { const System *system = vrv_cast(this->GetFirstAncestor(SYSTEM)); assert(system); - if (system->m_yAbs != VRV_UNSET) { + if (system->m_drawingFacsY != VRV_UNSET) { return (system->m_systemLeftMar); } } - if (m_xAbs != VRV_UNSET) return m_xAbs; + if (m_drawingFacsX1 != VRV_UNSET) return m_drawingFacsX1; if (m_cachedDrawingX != VRV_UNSET) return m_cachedDrawingX; @@ -356,7 +356,7 @@ int Measure::GetWidth() const if (!this->IsMeasuredMusic()) { const System *system = vrv_cast(this->GetFirstAncestor(SYSTEM)); assert(system); - if (system->m_yAbs != VRV_UNSET) { + if (system->m_drawingFacsY != VRV_UNSET) { const Page *page = vrv_cast(system->GetFirstAncestor(PAGE)); assert(page); // xAbs2 = page->m_pageWidth - system->m_systemRightMar; @@ -364,7 +364,7 @@ int Measure::GetWidth() const } } - if (m_xAbs2 != VRV_UNSET) return (m_xAbs2 - m_xAbs); + if (m_drawingFacsX2 != VRV_UNSET) return (m_drawingFacsX2 - m_drawingFacsX1); assert(m_measureAligner.GetRightAlignment()); return m_measureAligner.GetRightAlignment()->GetXRel(); diff --git a/src/miscfunctor.cpp b/src/miscfunctor.cpp index c592281c499..9c3677a2823 100644 --- a/src/miscfunctor.cpp +++ b/src/miscfunctor.cpp @@ -32,15 +32,15 @@ FunctorCode ApplyPPUFactorFunctor::VisitLayerElement(LayerElement *layerElement) { if (layerElement->IsScoreDefElement()) return FUNCTOR_SIBLINGS; - if (layerElement->m_xAbs != VRV_UNSET) layerElement->m_xAbs /= m_page->GetPPUFactor(); + if (layerElement->m_drawingFacsX != VRV_UNSET) layerElement->m_drawingFacsX /= m_page->GetPPUFactor(); return FUNCTOR_CONTINUE; } FunctorCode ApplyPPUFactorFunctor::VisitMeasure(Measure *measure) { - if (measure->m_xAbs != VRV_UNSET) measure->m_xAbs /= m_page->GetPPUFactor(); - if (measure->m_xAbs2 != VRV_UNSET) measure->m_xAbs2 /= m_page->GetPPUFactor(); + if (measure->m_drawingFacsX1 != VRV_UNSET) measure->m_drawingFacsX1 /= m_page->GetPPUFactor(); + if (measure->m_drawingFacsX2 != VRV_UNSET) measure->m_drawingFacsX2 /= m_page->GetPPUFactor(); return FUNCTOR_CONTINUE; } @@ -60,15 +60,15 @@ FunctorCode ApplyPPUFactorFunctor::VisitPage(Page *page) FunctorCode ApplyPPUFactorFunctor::VisitStaff(Staff *staff) { - if (staff->m_yAbs != VRV_UNSET) staff->m_yAbs /= m_page->GetPPUFactor(); + if (staff->m_drawingFacsY != VRV_UNSET) staff->m_drawingFacsY /= m_page->GetPPUFactor(); return FUNCTOR_CONTINUE; } FunctorCode ApplyPPUFactorFunctor::VisitSystem(System *system) { - if (system->m_xAbs != VRV_UNSET) system->m_xAbs /= m_page->GetPPUFactor(); - if (system->m_yAbs != VRV_UNSET) system->m_yAbs /= m_page->GetPPUFactor(); + if (system->m_drawingFacsX != VRV_UNSET) system->m_drawingFacsX /= m_page->GetPPUFactor(); + if (system->m_drawingFacsY != VRV_UNSET) system->m_drawingFacsY /= m_page->GetPPUFactor(); system->m_systemLeftMar *= m_page->GetPPUFactor(); system->m_systemRightMar *= m_page->GetPPUFactor(); diff --git a/src/staff.cpp b/src/staff.cpp index 9a01f64d063..28b69219213 100644 --- a/src/staff.cpp +++ b/src/staff.cpp @@ -66,7 +66,7 @@ void Staff::Reset() this->ResetTyped(); this->ResetVisibility(); - m_yAbs = VRV_UNSET; + m_drawingFacsY = VRV_UNSET; m_drawingStaffSize = 100; m_drawingLines = 5; @@ -142,7 +142,7 @@ int Staff::GetDrawingY() const } } - if (m_yAbs != VRV_UNSET) return m_yAbs; + if (m_drawingFacsY != VRV_UNSET) return m_drawingFacsY; if (!m_staffAlignment) return 0; diff --git a/src/system.cpp b/src/system.cpp index f7deae78600..2a070dba54f 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -74,9 +74,9 @@ void System::Reset() m_systemLeftMar = 0; m_systemRightMar = 0; - m_xAbs = VRV_UNSET; + m_drawingFacsX = VRV_UNSET; m_drawingXRel = 0; - m_yAbs = VRV_UNSET; + m_drawingFacsY = VRV_UNSET; m_drawingYRel = 0; m_drawingTotalWidth = 0; m_drawingJustifiableWidth = 0; @@ -111,7 +111,7 @@ bool System::IsSupportedChild(Object *child) int System::GetDrawingX() const { - if (m_xAbs != VRV_UNSET) return m_xAbs; + if (m_drawingFacsX != VRV_UNSET) return m_drawingFacsX; m_cachedDrawingX = 0; return m_drawingXRel; @@ -119,7 +119,7 @@ int System::GetDrawingX() const int System::GetDrawingY() const { - if (m_yAbs != VRV_UNSET) return m_yAbs; + if (m_drawingFacsY != VRV_UNSET) return m_drawingFacsY; m_cachedDrawingY = 0; return m_drawingYRel; From bc5b52ab8a4c726a4d1c839ce410985189be5e8d Mon Sep 17 00:00:00 2001 From: David Bauer Date: Wed, 3 Jan 2024 14:06:38 +0100 Subject: [PATCH 128/249] Revert "Fix crash when converting mensural notation from Humdrum" This reverts commit 3ded68c67693dc7a80639aef3548751c1b2da016. --- src/doc.cpp | 3 --- src/iohumdrum.cpp | 1 - 2 files changed, 4 deletions(-) diff --git a/src/doc.cpp b/src/doc.cpp index 8d1710d09e3..01c2024601d 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -1291,9 +1291,6 @@ void Doc::ConvertToCastOffMensuralDoc(bool castOff) m_isMensuralMusicOnly = false; } - // Calling Doc::PrepareData is expected to collect visible scores - assert(m_dataPreparationDone); - // Make sure the document is not cast-off this->UnCastOffDoc(); diff --git a/src/iohumdrum.cpp b/src/iohumdrum.cpp index be58d5bb7ca..4353e83816a 100644 --- a/src/iohumdrum.cpp +++ b/src/iohumdrum.cpp @@ -31612,7 +31612,6 @@ void HumdrumInput::finalizeDocument(Doc *doc) if (m_mens) { doc->SetMensuralMusicOnly(true); doc->m_notationType = NOTATIONTYPE_mensural; - doc->PrepareData(); doc->ConvertToCastOffMensuralDoc(true); } } From 3ae599edf9ed1171cf3fe9d17a5d4daf82ff6abe Mon Sep 17 00:00:00 2001 From: David Bauer Date: Wed, 3 Jan 2024 14:51:52 +0100 Subject: [PATCH 129/249] Generic version of Doc::GetCorrespondingScore --- include/vrv/doc.h | 2 ++ src/doc.cpp | 11 ++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/include/vrv/doc.h b/include/vrv/doc.h index 3952633bb49..a5f5c17f2e9 100644 --- a/include/vrv/doc.h +++ b/include/vrv/doc.h @@ -163,6 +163,8 @@ class Doc : public Object { ///@{ Score *GetCorrespondingScore(const Object *object); const Score *GetCorrespondingScore(const Object *object) const; + // Generic version that does not necessarily rely on precalculated visible scores + const Score *GetCorrespondingScore(const Object *object, const std::list &scores) const; ///@} /** diff --git a/src/doc.cpp b/src/doc.cpp index 01c2024601d..62c596e4684 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -1523,10 +1523,15 @@ Score *Doc::GetCorrespondingScore(const Object *object) const Score *Doc::GetCorrespondingScore(const Object *object) const { - assert(!m_visibleScores.empty()); + return this->GetCorrespondingScore(object, m_visibleScores); +} - const Score *correspondingScore = m_visibleScores.front(); - for (Score *score : m_visibleScores) { +const Score *Doc::GetCorrespondingScore(const Object *object, const std::list &scores) const +{ + assert(!scores.empty()); + + const Score *correspondingScore = scores.front(); + for (Score *score : scores) { if ((score == object) || Object::IsPreOrdered(score, object)) { correspondingScore = score; } From 34d358e7266e928ef24a1717e05148e4bc05ff50 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Thu, 4 Jan 2024 18:18:45 +0100 Subject: [PATCH 130/249] check fTrem attributes --- src/view_beam.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/view_beam.cpp b/src/view_beam.cpp index 1be6bdbe31c..24bd8006935 100644 --- a/src/view_beam.cpp +++ b/src/view_beam.cpp @@ -150,8 +150,8 @@ void View::DrawFTremSegment(DeviceContext *dc, Staff *staff, FTrem *fTrem) secondElement->m_x += (m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize)) / 2; } - // Number of bars to draw - const int allBars = fTrem->GetBeams(); + // Number of beams to draw + const int allBars = fTrem->HasBeams() ? fTrem->GetBeams() : fTrem->GetUnitdur() - DURATION_4; int floatingBars = fTrem->HasBeamsFloat() ? fTrem->GetBeamsFloat() : 0; int fullBars = allBars - floatingBars; From b9f27b988bf735c14b6882107c86eeecb7a5da06 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Thu, 4 Jan 2024 18:25:46 +0100 Subject: [PATCH 131/249] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b095c12dbf..2a415ca506a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## [unreleased] +* Support for `fTrem@unitdur` (@eNote-GmbH) ## [4.1.0] - 2023-12-15 * Support for staves ordered by `scoreDef` From 32a863df94414019da4a3f6d63045c4ec61074bf Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 4 Jan 2024 21:20:25 +0100 Subject: [PATCH 132/249] Track scores in ScoreDefSetCurrentPageFunctor --- include/vrv/doc.h | 1 + include/vrv/setscoredeffunctor.h | 4 +++- src/doc.cpp | 5 +++++ src/setscoredeffunctor.cpp | 11 +++++++++-- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/include/vrv/doc.h b/include/vrv/doc.h index a5f5c17f2e9..be4b8d27d87 100644 --- a/include/vrv/doc.h +++ b/include/vrv/doc.h @@ -164,6 +164,7 @@ class Doc : public Object { Score *GetCorrespondingScore(const Object *object); const Score *GetCorrespondingScore(const Object *object) const; // Generic version that does not necessarily rely on precalculated visible scores + Score *GetCorrespondingScore(const Object *object, const std::list &scores); const Score *GetCorrespondingScore(const Object *object, const std::list &scores) const; ///@} diff --git a/include/vrv/setscoredeffunctor.h b/include/vrv/setscoredeffunctor.h index 5d4d417c455..60e3d9af41d 100644 --- a/include/vrv/setscoredeffunctor.h +++ b/include/vrv/setscoredeffunctor.h @@ -88,6 +88,7 @@ class ScoreDefSetCurrentPageFunctor : public DocFunctor { */ ///@{ FunctorCode VisitPageEnd(Page *page) override; + FunctorCode VisitScore(Score *score) override; ///@} protected: @@ -97,7 +98,8 @@ class ScoreDefSetCurrentPageFunctor : public DocFunctor { public: // private: - // + // The list of all scores + std::list m_scores; }; //---------------------------------------------------------------------------- diff --git a/src/doc.cpp b/src/doc.cpp index 62c596e4684..74fff4f5adf 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -1526,6 +1526,11 @@ const Score *Doc::GetCorrespondingScore(const Object *object) const return this->GetCorrespondingScore(object, m_visibleScores); } +Score *Doc::GetCorrespondingScore(const Object *object, const std::list &scores) +{ + return const_cast(std::as_const(*this).GetCorrespondingScore(object, scores)); +} + const Score *Doc::GetCorrespondingScore(const Object *object, const std::list &scores) const { assert(!scores.empty()); diff --git a/src/setscoredeffunctor.cpp b/src/setscoredeffunctor.cpp index 144bc4d3248..29f6548c8ce 100644 --- a/src/setscoredeffunctor.cpp +++ b/src/setscoredeffunctor.cpp @@ -68,11 +68,18 @@ FunctorCode ScoreDefSetCurrentPageFunctor::VisitPageEnd(Page *page) { const Object *firstSystem = page->GetFirst(SYSTEM); const Object *reference = firstSystem ? firstSystem : page; - page->m_score = m_doc->GetCorrespondingScore(reference); + page->m_score = m_doc->GetCorrespondingScore(reference, m_scores); const Object *lastSystem = page->GetLast(SYSTEM); reference = lastSystem ? lastSystem : page; - page->m_scoreEnd = m_doc->GetCorrespondingScore(reference); + page->m_scoreEnd = m_doc->GetCorrespondingScore(reference, m_scores); + + return FUNCTOR_CONTINUE; +} + +FunctorCode ScoreDefSetCurrentPageFunctor::VisitScore(Score *score) +{ + m_scores.push_back(score); return FUNCTOR_CONTINUE; } From e77dfdd2b2b18ce2b13f654043fc15fe217ec720 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 4 Jan 2024 21:24:02 +0100 Subject: [PATCH 133/249] Remove unused --- src/verticalaligner.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/verticalaligner.cpp b/src/verticalaligner.cpp index 0bf5b3ed82e..60cbad6b3b7 100644 --- a/src/verticalaligner.cpp +++ b/src/verticalaligner.cpp @@ -48,7 +48,6 @@ void SystemAligner::Reset() m_spacingTypes.clear(); m_system = NULL; - ArrayOfObjects &children = this->GetChildrenForModification(); m_bottomAlignment = new StaffAlignment(); m_bottomAlignment->SetStaff(NULL, NULL, this->GetAboveSpacingType(NULL)); m_bottomAlignment->SetParentSystem(this->GetSystem()); From c07e5fa091ddb6c17d3285ca26b51076521bddb0 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Sat, 6 Jan 2024 22:39:40 +0100 Subject: [PATCH 134/249] allow fTrem in beam --- src/beam.cpp | 4 ++++ src/iomei.cpp | 3 +++ src/view_beam.cpp | 8 ++++++++ 3 files changed, 15 insertions(+) diff --git a/src/beam.cpp b/src/beam.cpp index 335d7c536fb..775ccb9f55a 100644 --- a/src/beam.cpp +++ b/src/beam.cpp @@ -19,6 +19,7 @@ #include "btrem.h" #include "doc.h" #include "editorial.h" +#include "ftrem.h" #include "functor.h" #include "gracegrp.h" #include "layer.h" @@ -1634,6 +1635,9 @@ bool Beam::IsSupportedChild(Object *child) else if (child->Is(CLEF)) { assert(dynamic_cast(child)); } + else if (child->Is(FTREM)) { + assert(dynamic_cast(child)); + } else if (child->Is(GRACEGRP)) { assert(dynamic_cast(child)); } diff --git a/src/iomei.cpp b/src/iomei.cpp index 6ff5920f6c4..f349669a21e 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -3533,6 +3533,9 @@ bool MEIInput::IsAllowed(std::string element, Object *filterParent) else if (element == "clef") { return true; } + else if (element == "fTrem") { + return true; + } else if (element == "graceGrp") { return true; } diff --git a/src/view_beam.cpp b/src/view_beam.cpp index 1be6bdbe31c..4fbaf6582f0 100644 --- a/src/view_beam.cpp +++ b/src/view_beam.cpp @@ -49,6 +49,14 @@ void View::DrawBeam(DeviceContext *dc, LayerElement *element, Layer *layer, Staf return; } + if (beam->GetFirst(FTREM)) { + // If there is a fTrem we ignore the beam and just handle its children + dc->StartGraphic(element, "", element->GetID()); + this->DrawLayerChildren(dc, beam, layer, staff, measure); + dc->EndGraphic(element, this); + return; + } + beam->m_beamSegment.InitCoordRefs(beam->GetElementCoords()); data_BEAMPLACE initialPlace = beam->GetPlace(); From 3a03a72143665dd104c6c117ce0034ee5dbbce19 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 9 Jan 2024 15:13:21 +0100 Subject: [PATCH 135/249] Make a vector of possible output formats --- tools/main.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tools/main.cpp b/tools/main.cpp index 3c0c8ee647f..c3eca7deec5 100644 --- a/tools/main.cpp +++ b/tools/main.cpp @@ -278,13 +278,12 @@ int main(int argc, char **argv) exit(1); } - if ((outformat != "svg") && (outformat != "mei") && (outformat != "mei-basic") && (outformat != "mei-pb") - && (outformat != "mei-facs") && (outformat != "midi") && (outformat != "timemap") - && (outformat != "expansionmap") && (outformat != "humdrum") && (outformat != "hum") && (outformat != "pae")) { + const std::vector outformats = { "mei", "mei-basic", "mei-pb", "mei-facs", "svg", "midi", "timemap", + "expansionmap", "humdrum", "hum", "pae" }; + if (std::find(outformats.begin(), outformats.end(), outformat) == outformats.end()) { std::cerr << "Output format (" << outformat << ") can only be 'mei', 'mei-basic', 'mei-pb', mei-facs', 'svg', 'midi', 'timemap', 'expansionmap', " - "'humdrum' " - "or 'pae'." + "'humdrum', 'hum', or 'pae'." << std::endl; exit(1); } From 6baff7119a32ed320c3c34341ecf91f127abbee6 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 9 Jan 2024 16:16:47 +0100 Subject: [PATCH 136/249] Fix repeating pattern repetition in PAE parsing. Closes #3570 --- src/iopae.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/iopae.cpp b/src/iopae.cpp index 888dfb0b62d..306c96c4d6b 100644 --- a/src/iopae.cpp +++ b/src/iopae.cpp @@ -3438,6 +3438,13 @@ bool PAEInput::ConvertRepeatedFigure() figure.push_back(*token); } } + // We are starting a new figure to be repeated + else if (token->m_char == '!') { + token->m_char = 0; + figureToken = &(*token); + figure.clear(); + status = pae::FIGURE_START; + } // We have completed a figure and will be repeating it else if (status == pae::FIGURE_END || status == pae::FIGURE_REPEAT) { // Repeat the figure. That is simply add it to the map @@ -3452,8 +3459,8 @@ bool PAEInput::ConvertRepeatedFigure() --token; status = pae::FIGURE_REPEAT; } - // End of repetitions - this includes the end of a measure - else { + // End of repetitions - this does not include the end of a measure + else if (!this->Was(*token, pae::MEASURE)) { // Make sure we repeated the figure at least once (is this too pedantic?) if (status == pae::FIGURE_END) { LogPAE(ERR_010_REP_UNUSED, *figureToken); @@ -3464,13 +3471,6 @@ bool PAEInput::ConvertRepeatedFigure() figure.clear(); } } - // We are starting a new figure to be repeated - else if (token->m_char == '!') { - token->m_char = 0; - figureToken = &(*token); - figure.clear(); - status = pae::FIGURE_START; - } // We should not have a repeat sign not after a figure end else if (token->m_char == 'f') { LogPAE(ERR_011_REP_NO_FIGURE, *token); From 6ffba7ff388011dcf4bfd1fb19ec28dbb7ec24cb Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 19 Jan 2024 10:43:18 +0100 Subject: [PATCH 137/249] Try C++20 --- .github/workflows/ci_build.yml | 2 +- cmake/CMakeLists.txt | 4 ++-- setup.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci_build.yml b/.github/workflows/ci_build.yml index 08437b037dc..5dd93eaacb2 100644 --- a/.github/workflows/ci_build.yml +++ b/.github/workflows/ci_build.yml @@ -6,7 +6,7 @@ on: # but only for the branches specified branches: # Push events on develop branch - - develop + - develop-c++20 # Push events on ci-test branch (uncomment if needed for testing purposes) # - ci-test paths-ignore: diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 5cddd3ed514..0c865ce37df 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -48,7 +48,7 @@ if(MSVC) add_definitions(/wd4244) # suppress warning of possible loss of precision add_definitions(-DNO_PAE_SUPPORT) # regex is working differently under Windows so PAE is not supported (yet) add_definitions(-DUSE_PAE_OLD_PARSER) - add_definitions(/std:c++17) + add_definitions(/std:c++20) include_directories(../include/win32) else() if(CMAKE_BUILD_TYPE MATCHES Debug) @@ -60,7 +60,7 @@ else() # jsonxx raises -Wdollar-in-identifier-extension # gcc 8.3.1 does not like -Wdollar-in-identifier-extension option. add_definitions(-Wall -W -pedantic -Wno-unused-parameter -Wno-dollar-in-identifier-extension) - add_definitions(-std=c++17) + add_definitions(-std=c++20) # extra warnings similar to Xcode compiling settings (most probably covered by -Wall): # https://github.com/llvm-mirror/clang/blob/master/include/clang/Basic/DiagnosticGroups.td diff --git a/setup.py b/setup.py index fc1f38b2709..a310909ee60 100644 --- a/setup.py +++ b/setup.py @@ -83,10 +83,10 @@ def get_version() -> str: # extra compile arguments EXTRA_COMPILE_ARGS = ['-DPYTHON_BINDING'] if platform.system() != 'Windows': - EXTRA_COMPILE_ARGS += ['-std=c++17', + EXTRA_COMPILE_ARGS += ['-std=c++20', '-Wno-write-strings', '-Wno-overloaded-virtual', '-g0'] else: - EXTRA_COMPILE_ARGS += ['/std:c++17', + EXTRA_COMPILE_ARGS += ['/std:c++20', '-DNO_PAE_SUPPORT'] verovio_module = Extension('verovio._verovio', From 6971b2ee96110f915cef35d92100c44b9ce5ee44 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 19 Jan 2024 10:44:21 +0100 Subject: [PATCH 138/249] add quotes --- .github/workflows/ci_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_build.yml b/.github/workflows/ci_build.yml index 5dd93eaacb2..6fae0ad4aa0 100644 --- a/.github/workflows/ci_build.yml +++ b/.github/workflows/ci_build.yml @@ -6,7 +6,7 @@ on: # but only for the branches specified branches: # Push events on develop branch - - develop-c++20 + - "develop-c++20" # Push events on ci-test branch (uncomment if needed for testing purposes) # - ci-test paths-ignore: From c6cd6143d8b68cd330d20659ae0f819d63aea045 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 19 Jan 2024 10:48:05 +0100 Subject: [PATCH 139/249] rename branch --- .github/workflows/ci_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_build.yml b/.github/workflows/ci_build.yml index 6fae0ad4aa0..f48281b5631 100644 --- a/.github/workflows/ci_build.yml +++ b/.github/workflows/ci_build.yml @@ -6,7 +6,7 @@ on: # but only for the branches specified branches: # Push events on develop branch - - "develop-c++20" + - 'develop-c20' # Push events on ci-test branch (uncomment if needed for testing purposes) # - ci-test paths-ignore: From 3921011a1f07bd917d10bf18c4a5bd6fd6a71e39 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 19 Jan 2024 11:02:15 +0100 Subject: [PATCH 140/249] Reset cache --- .github/workflows/ci_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_build.yml b/.github/workflows/ci_build.yml index f48281b5631..c03acec7977 100644 --- a/.github/workflows/ci_build.yml +++ b/.github/workflows/ci_build.yml @@ -44,7 +44,7 @@ env: # emscripten EM_VERSION: latest EM_CACHE_FOLDER: "emsdk-cache" - EM_CACHE_ID: 2 + EM_CACHE_ID: 3 # gh-pages GH_PAGES_REPO: ${{ github.repository_owner }}/verovio.org # works from rism-digital and from forks From 199368a88683730aa78878d5f545753956e31c3c Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 19 Jan 2024 11:10:45 +0100 Subject: [PATCH 141/249] Change C++ version in emscripten --- emscripten/buildToolkit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emscripten/buildToolkit b/emscripten/buildToolkit index b6f20e5a7ae..afde9dd2b76 100755 --- a/emscripten/buildToolkit +++ b/emscripten/buildToolkit @@ -55,7 +55,7 @@ my ($lightQ, $version, $chattyQ, $helpQ, $exclusion, $wasmQ, $makeQ, $modularize my ($nopae, $nohumdrum, $nomusicxml, $nodarms); my ($FLAGS_NAME, $VERSION, $CHATTY); -my $cpp = 17; # c++ version to compile (11, 14, 17) +my $cpp = 20; # c++ version to compile (11, 14, 17) my $VEROVIO_ROOT = ".."; Getopt::Long::Configure("bundling"); From 29fbb92e28635d5f5a6dde7484a303b68705a15d Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 19 Jan 2024 11:21:00 +0100 Subject: [PATCH 142/249] Move LedgerLine up for some compilers --- include/vrv/staff.h | 86 ++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/include/vrv/staff.h b/include/vrv/staff.h index 51cbdbd9346..cd68fe3eaa4 100644 --- a/include/vrv/staff.h +++ b/include/vrv/staff.h @@ -23,6 +23,49 @@ class Syl; class TimeSpanningInterface; class Tuning; +//---------------------------------------------------------------------------- +// LedgerLine +//---------------------------------------------------------------------------- + +/** + * This is a class with no MEI equivalent for representing legder lines. + * A ledger line is represented by a list of dashes. + * Each dash is represented by a pair of points (left - right). + */ +class LedgerLine { +public: + /** + * @name Constructors, destructors, reset methods + * Reset method reset all attribute classes + */ + ///@{ + LedgerLine(); + virtual ~LedgerLine(); + virtual void Reset(); + ///@} + + /** + * Add a dash to the ledger line object. + * If necessary merges overlapping dashes. + */ + void AddDash(int left, int right, int extension); + +protected: + // +private: + // +public: + /** + * A list of dashes relative to the staff position. + */ + std::list> m_dashes; + +protected: + // +private: + // +}; + //---------------------------------------------------------------------------- // Staff //---------------------------------------------------------------------------- @@ -249,49 +292,6 @@ class Staff : public Object, ///@} }; -//---------------------------------------------------------------------------- -// LedgerLine -//---------------------------------------------------------------------------- - -/** - * This is a class with no MEI equivalent for representing legder lines. - * A ledger line is represented by a list of dashes. - * Each dash is represented by a pair of points (left - right). - */ -class LedgerLine { -public: - /** - * @name Constructors, destructors, reset methods - * Reset method reset all attribute classes - */ - ///@{ - LedgerLine(); - virtual ~LedgerLine(); - virtual void Reset(); - ///@} - - /** - * Add a dash to the ledger line object. - * If necessary merges overlapping dashes. - */ - void AddDash(int left, int right, int extension); - -protected: - // -private: - // -public: - /** - * A list of dashes relative to the staff position. - */ - std::list> m_dashes; - -protected: - // -private: - // -}; - } // namespace vrv #endif From c858185fddd292d6985540c69ec5111d65b22585 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 19 Jan 2024 11:24:00 +0100 Subject: [PATCH 143/249] Remove clang 6.0 and add 10 --- .github/workflows/ci_build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_build.yml b/.github/workflows/ci_build.yml index c03acec7977..b763aec2ebb 100644 --- a/.github/workflows/ci_build.yml +++ b/.github/workflows/ci_build.yml @@ -88,11 +88,11 @@ jobs: - os: ubuntu-20.04 compiler: clang - version: "6.0" + version: "9" - os: ubuntu-20.04 compiler: clang - version: "9" + version: "10" - os: ubuntu-20.04 compiler: clang From 4e37f51e98c54f8b32d31835e7007f5117ed07a1 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 19 Jan 2024 12:12:22 +0100 Subject: [PATCH 144/249] Change g++ and clang CI to 10 to 12 versions --- .github/workflows/ci_build.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci_build.yml b/.github/workflows/ci_build.yml index b763aec2ebb..5b91884c2b1 100644 --- a/.github/workflows/ci_build.yml +++ b/.github/workflows/ci_build.yml @@ -76,23 +76,23 @@ jobs: include: - os: ubuntu-20.04 compiler: g++ - version: "9" + version: "10" - os: ubuntu-20.04 compiler: g++ - version: "10" + version: "11" - os: ubuntu-20.04 compiler: g++ - version: "11" + version: "12" - os: ubuntu-20.04 compiler: clang - version: "9" + version: "10" - os: ubuntu-20.04 compiler: clang - version: "10" + version: "11" - os: ubuntu-20.04 compiler: clang From c03b92def94ff042ceb3c43a73cbdca03118aed5 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 19 Jan 2024 12:12:44 +0100 Subject: [PATCH 145/249] Change xcode to c++20 --- Verovio.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index 6a55d542017..111c13c9f03 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -5024,7 +5024,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; @@ -5083,7 +5083,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; From 9b80afefca01402c9cd5636a86947fae903003e8 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 19 Jan 2024 12:16:10 +0100 Subject: [PATCH 146/249] Try g++12 on ubuntu 22.04 --- .github/workflows/ci_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_build.yml b/.github/workflows/ci_build.yml index 5b91884c2b1..af74d63ba6a 100644 --- a/.github/workflows/ci_build.yml +++ b/.github/workflows/ci_build.yml @@ -82,7 +82,7 @@ jobs: compiler: g++ version: "11" - - os: ubuntu-20.04 + - os: ubuntu-22.04 compiler: g++ version: "12" From 50aff1c3290c1d8992f1d2a843491cd04cd06fb6 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sun, 21 Jan 2024 10:30:18 +0100 Subject: [PATCH 147/249] Update README.md * Add DOI badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fbed8c471cc..a15c89f03ec 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,9 @@ [![PyPI - Wheel](https://img.shields.io/pypi/wheel/verovio)](https://pypi.org/project/verovio/) [![AppVeyor status](https://ci.appveyor.com/api/projects/status/121cxhmtwurxffh0?svg=true)](https://ci.appveyor.com/project/LaurentPugin/verovio-r1t6l) [![GH Actions status](https://github.com/rism-digital/verovio/workflows/Verovio%20CI%20Build/badge.svg)](https://github.com/rism-digital/verovio/actions?query=workflow%3A%22Verovio+CI+Build%22) - [![PyPI - Downlaods](https://img.shields.io/pypi/dm/verovio?label=PyPI%20downloads)](https://pypi.org/project/verovio/) [![NPM - Downlaods](https://img.shields.io/npm/dm/verovio?label=NPM%20-%20downloads)](https://www.npmjs.com/package/verovio) +[![DOI](https://zenodo.org/badge/15762693.svg)](https://zenodo.org/doi/10.5281/zenodo.10544792) Verovio is a fast, portable and lightweight library for engraving [Music Encoding Initiative (MEI)](http://www.music-encoding.org) digital scores into SVG images. Verovio also contains on-the-fly converters to render [Plaine & Easie Code](https://www.iaml.info/plaine-easie-code), [Humdrum](https://www.humdrum.org), [Musedata](https://musedata.org), [MusicXML](https://www.musicxml.com), [EsAC](http://esac-data.org), and [ABC](https://en.wikipedia.org/wiki/ABC_notation) digital scores. From 5df899b47d270d9dffc1cfa2ce02606419063b1c Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 23 Jan 2024 09:24:50 +0100 Subject: [PATCH 148/249] Use C++20 contains() --- src/accid.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/accid.cpp b/src/accid.cpp index 4f3ba9b2dea..73a12003ff8 100644 --- a/src/accid.cpp +++ b/src/accid.cpp @@ -162,7 +162,7 @@ void Accid::AdjustX(LayerElement *element, const Doc *doc, int staffSize, std::v leftAccids.push_back(accid); return; } - if (adjustedAccids.count(accid) == 0) return; + if (!adjustedAccids.contains(accid)) return; } int xRelShift = 0; From 25eec3c9da8a5faf5c053f07fbe971a8eaaaaf7c Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 24 Jan 2024 14:11:41 +0100 Subject: [PATCH 149/249] Fix issue with stem length of 0.0. Fixes #3577 * Test suite evaluated locally --- src/calcdotsfunctor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calcdotsfunctor.cpp b/src/calcdotsfunctor.cpp index af628ebbdad..b979a50aa66 100644 --- a/src/calcdotsfunctor.cpp +++ b/src/calcdotsfunctor.cpp @@ -182,7 +182,7 @@ bool CalcDotsFunctor::IsDotOverlappingWithFlag(const Note *note, const int staff if (!stem) return false; const Flag *flag = vrv_cast(stem->GetFirst(FLAG)); - if (!flag) return false; + if (!flag || (flag->m_drawingNbFlags == 0)) return false; // for the purposes of vertical spacing we care only up to 16th flags - shorter ones grow upwards char32_t flagGlyph = SMUFL_E242_flag16thUp; From 48a25225db5d41b8df750795760f25cb40cc99b2 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 24 Jan 2024 16:49:53 +0100 Subject: [PATCH 150/249] Create CITATION.cff [skip-ci] --- CITATION.cff | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 00000000000..0c6717b7a34 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,13 @@ +cff-version: 1.2.0 +title: Verovio +message: 'If you use this software, please cite it as below.' +type: software +repository-code: 'https://github.com/rism-digital/verovio' +url: 'https://www.verovio.org' +repository: 'https://github.com/rism-digital/verovio.org' +abstract: >- + Verovio is a fast, portable and lightweight open-source + library for engraving Music Encoding Initiative (MEI) + music scores into SVG. +license: LGPL-3.0 +date-released: '2023-12-15' From b02188af9fc5034b2a37bb94170f061e382eed49 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 24 Jan 2024 17:20:39 +0100 Subject: [PATCH 151/249] Update CITATION.cff [skip-ci] * add preferred citation --- CITATION.cff | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CITATION.cff b/CITATION.cff index 0c6717b7a34..490a5fa3abf 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -11,3 +11,19 @@ abstract: >- music scores into SVG. license: LGPL-3.0 date-released: '2023-12-15' + +preferred-citation: + type: conference-paper + authors: + - given-names: Laurent + family-names: Pugin + - given-names: Rodolfo + family-names: Zitellini + - given-names: Perry + family-names: Roland + conference: "15th International Society for Music Information Retrieval Conference (ISMIR 2014)" + month: 10 + start: 107 # First page number + end: 112 # Last page number + title: "Verovio: A Library for Engraving MEI Music Notation into SVG" + year: 2014 From 3a637dd5f6b3ef757aac3c9a2492fa18a9a3e80a Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 24 Jan 2024 17:24:02 +0100 Subject: [PATCH 152/249] Update CITATION.cff [skip-ci] * change to collection-title --- CITATION.cff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CITATION.cff b/CITATION.cff index 490a5fa3abf..02a863d452f 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -21,7 +21,7 @@ preferred-citation: family-names: Zitellini - given-names: Perry family-names: Roland - conference: "15th International Society for Music Information Retrieval Conference (ISMIR 2014)" + collection-title: "Proceedings of the 15th International Society for Music Information Retrieval Conference (ISMIR 2014)" month: 10 start: 107 # First page number end: 112 # Last page number From 175f0f49673ee3e0ac33bf41da4e46bc587b127d Mon Sep 17 00:00:00 2001 From: Jakub Pavlik Date: Wed, 24 Jan 2024 19:44:37 +0100 Subject: [PATCH 153/249] change -r long option to --resource-path it's been written this way both on the web and in the output of -h base but the actual long option was --resources --- tools/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/main.cpp b/tools/main.cpp index c3eca7deec5..f8ef2ea6827 100644 --- a/tools/main.cpp +++ b/tools/main.cpp @@ -96,7 +96,7 @@ int main(int argc, char **argv) { "log-level", required_argument, 0, 'l' }, // { "outfile", required_argument, 0, 'o' }, // { "page", required_argument, 0, 'p' }, // - { "resources", required_argument, 0, 'r' }, // + { "resource-path", required_argument, 0, 'r' }, // { "scale", required_argument, 0, 's' }, // { "output-to", required_argument, 0, 't' }, // { "version", no_argument, 0, 'v' }, // From 762f6a99be8bc99c9a99bfc1c025d7574df2e22a Mon Sep 17 00:00:00 2001 From: Jakub Pavlik Date: Wed, 24 Jan 2024 20:55:00 +0100 Subject: [PATCH 154/249] base options: single place to define them generate configuration for getopt_long() from the Options --- tools/main.cpp | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/tools/main.cpp b/tools/main.cpp index f8ef2ea6827..cd59ae6e21f 100644 --- a/tools/main.cpp +++ b/tools/main.cpp @@ -72,6 +72,8 @@ bool optionExists(const std::string &option, int argc, char **argv, std::string return false; } +#define OPTION_TO_GETOPT(opt, has_arg) { vrv::FromCamelCase(opt.GetKey()).c_str(), has_arg, 0, opt.GetShortOption() } + int main(int argc, char **argv) { std::string infile; @@ -89,18 +91,20 @@ int main(int argc, char **argv) // The fonts will be loaded later with Resources::InitFonts() vrv::Toolkit toolkit(false); + vrv::Options *options = toolkit.GetOptionsObj(); + static struct option base_options[] = { // - { "all-pages", no_argument, 0, 'a' }, // - { "input-from", required_argument, 0, 'f' }, // - { "help", required_argument, 0, 'h' }, // - { "log-level", required_argument, 0, 'l' }, // - { "outfile", required_argument, 0, 'o' }, // - { "page", required_argument, 0, 'p' }, // - { "resource-path", required_argument, 0, 'r' }, // - { "scale", required_argument, 0, 's' }, // - { "output-to", required_argument, 0, 't' }, // - { "version", no_argument, 0, 'v' }, // - { "xml-id-seed", required_argument, 0, 'x' }, // + OPTION_TO_GETOPT(options->m_allPages, no_argument), // + OPTION_TO_GETOPT(options->m_inputFrom, required_argument), // + OPTION_TO_GETOPT(options->m_help, required_argument), // + OPTION_TO_GETOPT(options->m_logLevel, required_argument), // + OPTION_TO_GETOPT(options->m_outfile, required_argument), // + OPTION_TO_GETOPT(options->m_page, required_argument), // + OPTION_TO_GETOPT(options->m_resourcePath, required_argument), // + OPTION_TO_GETOPT(options->m_scale, required_argument), // + OPTION_TO_GETOPT(options->m_outputTo, required_argument), // + OPTION_TO_GETOPT(options->m_version, no_argument), // + OPTION_TO_GETOPT(options->m_xmlIdSeed, required_argument), // // standard input - long options only or - as filename { "stdin", no_argument, 0, 'z' }, // { 0, 0, 0, 0 } @@ -108,7 +112,6 @@ int main(int argc, char **argv) int baseSize = sizeof(base_options) / sizeof(option); - vrv::Options *options = toolkit.GetOptionsObj(); const vrv::MapOfStrOptions *params = options->GetItems(); int mapSize = (int)params->size(); From 985137d264f2d765aa3fdad9eddafcd35970ff5a Mon Sep 17 00:00:00 2001 From: Jakub Pavlik Date: Thu, 25 Jan 2024 16:16:33 +0100 Subject: [PATCH 155/249] Fix code style --- tools/main.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/main.cpp b/tools/main.cpp index cd59ae6e21f..c8e64610686 100644 --- a/tools/main.cpp +++ b/tools/main.cpp @@ -72,7 +72,10 @@ bool optionExists(const std::string &option, int argc, char **argv, std::string return false; } -#define OPTION_TO_GETOPT(opt, has_arg) { vrv::FromCamelCase(opt.GetKey()).c_str(), has_arg, 0, opt.GetShortOption() } +#define OPTION_TO_GETOPT(opt, has_arg) \ + { \ + vrv::FromCamelCase(opt.GetKey()).c_str(), has_arg, 0, opt.GetShortOption() \ + } int main(int argc, char **argv) { From b93375262b3afafc3ca99b703d3f9f0fd9d359ea Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 25 Jan 2024 16:41:39 +0100 Subject: [PATCH 156/249] Try to use getopt.h on windows --- tools/main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/main.cpp b/tools/main.cpp index c3eca7deec5..4d3e16baab7 100644 --- a/tools/main.cpp +++ b/tools/main.cpp @@ -13,11 +13,11 @@ #include #include -#ifndef _WIN32 +//#ifndef _WIN32 #include -#else -#include "win_getopt.h" -#endif +//#else +//#include "win_getopt.h" +//#endif //---------------------------------------------------------------------------- From 3d4f5d12ec056450f3a7088d1403f6f774beac06 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 25 Jan 2024 16:45:37 +0100 Subject: [PATCH 157/249] Revert "Try to use getopt.h on windows" This reverts commit b93375262b3afafc3ca99b703d3f9f0fd9d359ea. --- tools/main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/main.cpp b/tools/main.cpp index 4d3e16baab7..c3eca7deec5 100644 --- a/tools/main.cpp +++ b/tools/main.cpp @@ -13,11 +13,11 @@ #include #include -//#ifndef _WIN32 +#ifndef _WIN32 #include -//#else -//#include "win_getopt.h" -//#endif +#else +#include "win_getopt.h" +#endif //---------------------------------------------------------------------------- From 1b3c74e091e3dd7d0384b28735222145caabbd92 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 25 Jan 2024 16:46:01 +0100 Subject: [PATCH 158/249] Make char * const --- include/win32/win_getopt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/win32/win_getopt.h b/include/win32/win_getopt.h index 1dd690ee212..b9d07be071e 100644 --- a/include/win32/win_getopt.h +++ b/include/win32/win_getopt.h @@ -76,7 +76,7 @@ static int parse_long_options(char * const *, const char *, static int gcd(int, int); static void permute_args(int, int, int, char * const *); -static char *place = EMSG; /* option letter processing */ +static const char *place = EMSG; /* option letter processing */ /* XXX: set optreset to 1 rather than these two */ static int nonopt_start = -1; /* first non option argument (for permute) */ From 44c829c0e3ccd75137329d354059afbb23e5d61f Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 25 Jan 2024 16:49:45 +0100 Subject: [PATCH 159/249] Change another char * to const --- include/win32/win_getopt.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/win32/win_getopt.h b/include/win32/win_getopt.h index b9d07be071e..6a5f0c60b19 100644 --- a/include/win32/win_getopt.h +++ b/include/win32/win_getopt.h @@ -243,7 +243,8 @@ static int parse_long_options(char * const *nargv, const char *options, const struct option *long_options, int *idx, int short_too) { - char *current_argv, *has_equal; + const char *current_argv; + char *has_equal; size_t current_argv_len; int i, ambiguous, match; From f0f71b2883aa729b3bf129817f4b0a4bec75494e Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 25 Jan 2024 16:52:18 +0100 Subject: [PATCH 160/249] Change one more to const --- include/win32/win_getopt.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/include/win32/win_getopt.h b/include/win32/win_getopt.h index 6a5f0c60b19..007b5ac37a6 100644 --- a/include/win32/win_getopt.h +++ b/include/win32/win_getopt.h @@ -243,8 +243,7 @@ static int parse_long_options(char * const *nargv, const char *options, const struct option *long_options, int *idx, int short_too) { - const char *current_argv; - char *has_equal; + const char *current_argv, *has_equal; size_t current_argv_len; int i, ambiguous, match; From a5d89dfcbd8f40a71587eb8745b733cd1e450d00 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 25 Jan 2024 16:55:13 +0100 Subject: [PATCH 161/249] One more --- include/win32/win_getopt.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/win32/win_getopt.h b/include/win32/win_getopt.h index 007b5ac37a6..d8dd0019aee 100644 --- a/include/win32/win_getopt.h +++ b/include/win32/win_getopt.h @@ -36,7 +36,7 @@ int optopt = '?'; /* character checked for validity */ #undef optreset /* see getopt.h */ #define optreset __mingw_optreset int optreset; /* reset getopt */ -char *optarg; /* argument associated with option */ +const char *optarg; /* argument associated with option */ #endif //extern int optind; /* index of first non-option in argv */ From 5ef32ede5819a163d4eb95bfc2e5257bd00c8e01 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 25 Jan 2024 17:14:07 +0100 Subject: [PATCH 162/249] Fix compiler warning warning C5055 --- src/measure.cpp | 2 +- src/midifunctor.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/measure.cpp b/src/measure.cpp index 4439fe36ce8..9685588985b 100644 --- a/src/measure.cpp +++ b/src/measure.cpp @@ -497,7 +497,7 @@ int Measure::EnclosesTime(int time) const { int repeat = 1; double timeDuration - = m_measureAligner.GetRightAlignment()->GetTime() * DURATION_4 / DUR_MAX * 60.0 / m_currentTempo * 1000.0 + 0.5; + = m_measureAligner.GetRightAlignment()->GetTime() * static_cast(DURATION_4) / DUR_MAX * 60.0 / m_currentTempo * 1000.0 + 0.5; std::vector::const_iterator iter; for (iter = m_realTimeOffsetMilliseconds.begin(); iter != m_realTimeOffsetMilliseconds.end(); ++iter) { if ((time >= *iter) && (time <= *iter + timeDuration)) return repeat; diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp index cdff91503cc..e69294e662f 100644 --- a/src/midifunctor.cpp +++ b/src/midifunctor.cpp @@ -240,7 +240,7 @@ FunctorCode InitMaxMeasureDurationFunctor::VisitMeasureEnd(Measure *measure) measure->SetCurrentTempo(tempo); const double scoreTimeIncrement - = measure->m_measureAligner.GetRightAlignment()->GetTime() * m_multiRestFactor * DURATION_4 / DUR_MAX; + = measure->m_measureAligner.GetRightAlignment()->GetTime() * m_multiRestFactor * static_cast(DURATION_4) / DUR_MAX; m_currentScoreTime += scoreTimeIncrement; m_currentRealTimeSeconds += scoreTimeIncrement * 60.0 / tempo; m_multiRestFactor = 1; @@ -698,7 +698,7 @@ FunctorCode GenerateMIDIFunctor::VisitPedal(const Pedal *pedal) { if (!pedal->HasDir()) return FUNCTOR_CONTINUE; - double pedalTime = pedal->GetStart()->GetAlignment()->GetTime() * DURATION_4 / DUR_MAX; + double pedalTime = pedal->GetStart()->GetAlignment()->GetTime() * static_cast(DURATION_4) / DUR_MAX; double startTime = m_totalTime + pedalTime; int tpq = m_midiFile->getTPQ(); From 533f30dc93f80d1dcc7728e8b968decd027536c0 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 25 Jan 2024 17:14:30 +0100 Subject: [PATCH 163/249] Fix compiler warning C4305 --- src/view_neume.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/view_neume.cpp b/src/view_neume.cpp index eeeaed614b1..971a8bf3304 100644 --- a/src/view_neume.cpp +++ b/src/view_neume.cpp @@ -74,10 +74,10 @@ void View::DrawNc(DeviceContext *dc, LayerElement *element, Layer *layer, Staff struct drawingParams { wchar_t fontNo = SMUFL_E990_chantPunctum; wchar_t fontNoLiq[5] = {}; - float xOffset = 0; - float yOffset = 0; - float xOffsetLiq[5] = { 0, 0, 0, 0, 0 }; - float yOffsetLiq[5] = { 0, 0, 0, 0, 0 }; + double xOffset = 0; + double yOffset = 0; + double xOffsetLiq[5] = { 0, 0, 0, 0, 0 }; + double yOffsetLiq[5] = { 0, 0, 0, 0, 0 }; }; std::vector params; params.push_back(drawingParams()); From 46e8e9059ae148b1e2aeae3839a6f0e8714a0dbb Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 25 Jan 2024 17:32:31 +0100 Subject: [PATCH 164/249] Fix formatting --- src/measure.cpp | 5 +++-- src/midifunctor.cpp | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/measure.cpp b/src/measure.cpp index 9685588985b..7b566400378 100644 --- a/src/measure.cpp +++ b/src/measure.cpp @@ -496,8 +496,9 @@ const Staff *Measure::GetBottomVisibleStaff() const int Measure::EnclosesTime(int time) const { int repeat = 1; - double timeDuration - = m_measureAligner.GetRightAlignment()->GetTime() * static_cast(DURATION_4) / DUR_MAX * 60.0 / m_currentTempo * 1000.0 + 0.5; + double timeDuration = m_measureAligner.GetRightAlignment()->GetTime() * static_cast(DURATION_4) / DUR_MAX + * 60.0 / m_currentTempo * 1000.0 + + 0.5; std::vector::const_iterator iter; for (iter = m_realTimeOffsetMilliseconds.begin(); iter != m_realTimeOffsetMilliseconds.end(); ++iter) { if ((time >= *iter) && (time <= *iter + timeDuration)) return repeat; diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp index e69294e662f..5bf7f6246e8 100644 --- a/src/midifunctor.cpp +++ b/src/midifunctor.cpp @@ -239,8 +239,8 @@ FunctorCode InitMaxMeasureDurationFunctor::VisitMeasureEnd(Measure *measure) const double tempo = this->GetAdjustedTempo(); measure->SetCurrentTempo(tempo); - const double scoreTimeIncrement - = measure->m_measureAligner.GetRightAlignment()->GetTime() * m_multiRestFactor * static_cast(DURATION_4) / DUR_MAX; + const double scoreTimeIncrement = measure->m_measureAligner.GetRightAlignment()->GetTime() * m_multiRestFactor + * static_cast(DURATION_4) / DUR_MAX; m_currentScoreTime += scoreTimeIncrement; m_currentRealTimeSeconds += scoreTimeIncrement * 60.0 / tempo; m_multiRestFactor = 1; From c9ddec064646fc76db831348d2c8500164610412 Mon Sep 17 00:00:00 2001 From: Jakub Pavlik Date: Sat, 27 Jan 2024 22:54:16 +0100 Subject: [PATCH 165/249] base options: also argument requirement governed by the Option object --- include/vrv/options.h | 5 ++++- src/options.cpp | 2 +- tools/main.cpp | 27 ++++++++++++++------------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/include/vrv/options.h b/include/vrv/options.h index ad4c87eb7ae..2cb3eff0844 100644 --- a/include/vrv/options.h +++ b/include/vrv/options.h @@ -122,6 +122,7 @@ class Option { void SetShortOption(char shortOption, bool isCmdOnly); char GetShortOption() const { return m_shortOption; } bool IsCmdOnly() const { return m_isCmdOnly; } + bool IsArgumentRequired() const { return true; } /** * Return a JSON object for the option @@ -186,6 +187,8 @@ class OptionBool : public Option { bool GetDefault() const { return m_defaultValue; } bool SetValue(bool value); + bool IsArgumentRequired() const { return false; } + private: // public: @@ -593,7 +596,7 @@ class Options { // These options are only given for documentation - except for m_scale // They are ordered by short option alphabetical order OptionBool m_standardOutput; - OptionBool m_help; + OptionString m_help; OptionBool m_allPages; OptionString m_inputFrom; OptionString m_logLevel; diff --git a/src/options.cpp b/src/options.cpp index 294837d2679..b634bf9924b 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -905,7 +905,7 @@ Options::Options() m_baseOptions.AddOption(&m_standardOutput); m_help.SetInfo("Help", "Display this message"); - m_help.Init(false); + m_help.Init(""); m_help.SetKey("help"); m_help.SetShortOption('h', true); m_baseOptions.AddOption(&m_help); diff --git a/tools/main.cpp b/tools/main.cpp index c8e64610686..98586b0da42 100644 --- a/tools/main.cpp +++ b/tools/main.cpp @@ -72,9 +72,10 @@ bool optionExists(const std::string &option, int argc, char **argv, std::string return false; } -#define OPTION_TO_GETOPT(opt, has_arg) \ +#define OPTION_TO_GETOPT(opt) \ { \ - vrv::FromCamelCase(opt.GetKey()).c_str(), has_arg, 0, opt.GetShortOption() \ + vrv::FromCamelCase(opt.GetKey()).c_str(), opt.IsArgumentRequired() ? required_argument : no_argument, 0, \ + opt.GetShortOption() \ } int main(int argc, char **argv) @@ -97,17 +98,17 @@ int main(int argc, char **argv) vrv::Options *options = toolkit.GetOptionsObj(); static struct option base_options[] = { // - OPTION_TO_GETOPT(options->m_allPages, no_argument), // - OPTION_TO_GETOPT(options->m_inputFrom, required_argument), // - OPTION_TO_GETOPT(options->m_help, required_argument), // - OPTION_TO_GETOPT(options->m_logLevel, required_argument), // - OPTION_TO_GETOPT(options->m_outfile, required_argument), // - OPTION_TO_GETOPT(options->m_page, required_argument), // - OPTION_TO_GETOPT(options->m_resourcePath, required_argument), // - OPTION_TO_GETOPT(options->m_scale, required_argument), // - OPTION_TO_GETOPT(options->m_outputTo, required_argument), // - OPTION_TO_GETOPT(options->m_version, no_argument), // - OPTION_TO_GETOPT(options->m_xmlIdSeed, required_argument), // + OPTION_TO_GETOPT(options->m_allPages), // + OPTION_TO_GETOPT(options->m_inputFrom), // + OPTION_TO_GETOPT(options->m_help), // + OPTION_TO_GETOPT(options->m_logLevel), // + OPTION_TO_GETOPT(options->m_outfile), // + OPTION_TO_GETOPT(options->m_page), // + OPTION_TO_GETOPT(options->m_resourcePath), // + OPTION_TO_GETOPT(options->m_scale), // + OPTION_TO_GETOPT(options->m_outputTo), // + OPTION_TO_GETOPT(options->m_version), // + OPTION_TO_GETOPT(options->m_xmlIdSeed), // // standard input - long options only or - as filename { "stdin", no_argument, 0, 'z' }, // { 0, 0, 0, 0 } From 43cbfdead83b5bd707cad410f460ab4551e38da5 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Mon, 29 Jan 2024 10:07:51 +0100 Subject: [PATCH 166/249] Fix dangling pointer with an additional map --- tools/main.cpp | 46 ++++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/tools/main.cpp b/tools/main.cpp index 98586b0da42..ab9593f207f 100644 --- a/tools/main.cpp +++ b/tools/main.cpp @@ -72,11 +72,11 @@ bool optionExists(const std::string &option, int argc, char **argv, std::string return false; } -#define OPTION_TO_GETOPT(opt) \ - { \ - vrv::FromCamelCase(opt.GetKey()).c_str(), opt.IsArgumentRequired() ? required_argument : no_argument, 0, \ - opt.GetShortOption() \ - } +option optionStruct(vrv::Option *option, const std::map &optionNames) +{ + return { optionNames.at(option).c_str(), option->IsArgumentRequired() ? required_argument : no_argument, 0, + option->GetShortOption() }; +} int main(int argc, char **argv) { @@ -97,18 +97,32 @@ int main(int argc, char **argv) vrv::Options *options = toolkit.GetOptionsObj(); + // map storing lower-case option names + std::map optionNames + = { { &options->m_allPages, vrv::FromCamelCase(options->m_allPages.GetKey()) }, + { &options->m_inputFrom, vrv::FromCamelCase(options->m_inputFrom.GetKey()) }, + { &options->m_help, vrv::FromCamelCase(options->m_help.GetKey()) }, + { &options->m_logLevel, vrv::FromCamelCase(options->m_logLevel.GetKey()) }, + { &options->m_outfile, vrv::FromCamelCase(options->m_outfile.GetKey()) }, + { &options->m_page, vrv::FromCamelCase(options->m_page.GetKey()) }, + { &options->m_resourcePath, vrv::FromCamelCase(options->m_resourcePath.GetKey()) }, + { &options->m_scale, vrv::FromCamelCase(options->m_scale.GetKey()) }, + { &options->m_outputTo, vrv::FromCamelCase(options->m_outputTo.GetKey()) }, + { &options->m_version, vrv::FromCamelCase(options->m_version.GetKey()) }, + { &options->m_xmlIdSeed, vrv::FromCamelCase(options->m_xmlIdSeed.GetKey()) } }; + static struct option base_options[] = { // - OPTION_TO_GETOPT(options->m_allPages), // - OPTION_TO_GETOPT(options->m_inputFrom), // - OPTION_TO_GETOPT(options->m_help), // - OPTION_TO_GETOPT(options->m_logLevel), // - OPTION_TO_GETOPT(options->m_outfile), // - OPTION_TO_GETOPT(options->m_page), // - OPTION_TO_GETOPT(options->m_resourcePath), // - OPTION_TO_GETOPT(options->m_scale), // - OPTION_TO_GETOPT(options->m_outputTo), // - OPTION_TO_GETOPT(options->m_version), // - OPTION_TO_GETOPT(options->m_xmlIdSeed), // + optionStruct(&options->m_allPages, optionNames), // + optionStruct(&options->m_inputFrom, optionNames), // + optionStruct(&options->m_help, optionNames), // + optionStruct(&options->m_logLevel, optionNames), // + optionStruct(&options->m_outfile, optionNames), // + optionStruct(&options->m_page, optionNames), // + optionStruct(&options->m_resourcePath, optionNames), // + optionStruct(&options->m_scale, optionNames), // + optionStruct(&options->m_outputTo, optionNames), // + optionStruct(&options->m_version, optionNames), // + optionStruct(&options->m_xmlIdSeed, optionNames), // // standard input - long options only or - as filename { "stdin", no_argument, 0, 'z' }, // { 0, 0, 0, 0 } From 98e5533bd3524c70ca95e91c103206b9fff67026 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Mon, 29 Jan 2024 12:54:22 +0100 Subject: [PATCH 167/249] Adjust README and CHANGELOG --- CHANGELOG.md | 1 + README.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a415ca506a..fdc3eedc0ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## [unreleased] * Support for `fTrem@unitdur` (@eNote-GmbH) +* Upgrade to C++20 ## [4.1.0] - 2023-12-15 * Support for staves ordered by `scoreDef` diff --git a/README.md b/README.md index fbed8c471cc..6de43d50cf1 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Verovio is a fast, portable and lightweight library for engraving [Music Encoding Initiative (MEI)](http://www.music-encoding.org) digital scores into SVG images. Verovio also contains on-the-fly converters to render [Plaine & Easie Code](https://www.iaml.info/plaine-easie-code), [Humdrum](https://www.humdrum.org), [Musedata](https://musedata.org), [MusicXML](https://www.musicxml.com), [EsAC](http://esac-data.org), and [ABC](https://en.wikipedia.org/wiki/ABC_notation) digital scores. -Verovio is written in standard 2017 C++ and can be compiled as a standalone command-line tool, used as a compiled music-rendering library for applications (Qt, python), or compiled into Javascript using the Emscripten LLVM-to-JavaScript compiler. Check out the JavaScript toolkit version of verovio running in the [MEI Viewer](http://www.verovio.org/mei-viewer.xhtml) as well as the [app](http://www.verovio.org/app.html) or [tutorials](https://book.verovio.org/first-steps/) for web integration and user interaction. +Verovio is written in standard 2020 C++ and can be compiled as a standalone command-line tool, used as a compiled music-rendering library for applications (Qt, python), or compiled into Javascript using the Emscripten LLVM-to-JavaScript compiler. Check out the JavaScript toolkit version of verovio running in the [MEI Viewer](http://www.verovio.org/mei-viewer.xhtml) as well as the [app](http://www.verovio.org/app.html) or [tutorials](https://book.verovio.org/first-steps/) for web integration and user interaction. ![Choice interaction](https://raw.githubusercontent.com/rism-digital/verovio.org/gh-pages/movies/reflow.gif) From f5ad4c2c3f44813bf95fc66b997503b5acfbe547 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Mon, 29 Jan 2024 13:17:54 +0100 Subject: [PATCH 168/249] update actions --- .github/workflows/ci_build.yml | 6 +++--- .github/workflows/python-ci-wheel.yml | 4 ++-- .github/workflows/tests_build.yml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci_build.yml b/.github/workflows/ci_build.yml index 08437b037dc..014f9a18b28 100644 --- a/.github/workflows/ci_build.yml +++ b/.github/workflows/ci_build.yml @@ -276,7 +276,7 @@ jobs: - name: Upload js build artifact (${{ matrix.toolkit.target }}) if: ${{ matrix.toolkit.upload == true }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ env.TOOLKIT_BUILD }} path: ${{ github.workspace }}/${{ env.TEMP_DIR }}/${{ matrix.toolkit.filepath }} @@ -301,7 +301,7 @@ jobs: run: cp data/*.css $GITHUB_WORKSPACE/$TEMP_DIR/data/ - name: Upload font data artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ env.TOOLKIT_BUILD }} path: ${{ github.workspace }}/${{ env.TEMP_DIR }} @@ -455,7 +455,7 @@ jobs: run: (cat verovio.conf ; echo "OUTPUT_DIRECTORY = $GITHUB_WORKSPACE/$DOXYGEN_DIR") | doxygen - - name: Upload doxygen build artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ env.DOC_BUILD }} path: ${{ github.workspace }}/${{ env.DOXYGEN_DIR }} diff --git a/.github/workflows/python-ci-wheel.yml b/.github/workflows/python-ci-wheel.yml index 219ed29ce00..2f167e83020 100644 --- a/.github/workflows/python-ci-wheel.yml +++ b/.github/workflows/python-ci-wheel.yml @@ -132,7 +132,7 @@ jobs: #===============================================# # Upload artifacts - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: cibuildwheel-${{ runner.os }}-python-${{ matrix.python-version }} path: ./wheelhouse/*.whl @@ -208,7 +208,7 @@ jobs: #===============================================# # Upload artifact - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: sdist-${{ runner.os }}-python-3.9 path: dist/*.tar.gz diff --git a/.github/workflows/tests_build.yml b/.github/workflows/tests_build.yml index 042d65eaf72..bddd36f0a67 100644 --- a/.github/workflows/tests_build.yml +++ b/.github/workflows/tests_build.yml @@ -109,7 +109,7 @@ jobs: ls -al - name: Upload results as artefacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: test-suite-diff path: ${{ github.workspace }}/${{ env.OUTPUT_DIR }}/ From e94d62df8ae0c25b860944adddcb5feb5965e1d6 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 31 Jan 2024 10:17:22 +0100 Subject: [PATCH 169/249] Revert "Update actions to remove deprecation warning" --- .github/workflows/ci_build.yml | 6 +++--- .github/workflows/python-ci-wheel.yml | 4 ++-- .github/workflows/tests_build.yml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci_build.yml b/.github/workflows/ci_build.yml index 947667de083..f6bbe77946c 100644 --- a/.github/workflows/ci_build.yml +++ b/.github/workflows/ci_build.yml @@ -276,7 +276,7 @@ jobs: - name: Upload js build artifact (${{ matrix.toolkit.target }}) if: ${{ matrix.toolkit.upload == true }} - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v3 with: name: ${{ env.TOOLKIT_BUILD }} path: ${{ github.workspace }}/${{ env.TEMP_DIR }}/${{ matrix.toolkit.filepath }} @@ -301,7 +301,7 @@ jobs: run: cp data/*.css $GITHUB_WORKSPACE/$TEMP_DIR/data/ - name: Upload font data artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v3 with: name: ${{ env.TOOLKIT_BUILD }} path: ${{ github.workspace }}/${{ env.TEMP_DIR }} @@ -455,7 +455,7 @@ jobs: run: (cat verovio.conf ; echo "OUTPUT_DIRECTORY = $GITHUB_WORKSPACE/$DOXYGEN_DIR") | doxygen - - name: Upload doxygen build artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v3 with: name: ${{ env.DOC_BUILD }} path: ${{ github.workspace }}/${{ env.DOXYGEN_DIR }} diff --git a/.github/workflows/python-ci-wheel.yml b/.github/workflows/python-ci-wheel.yml index 2f167e83020..219ed29ce00 100644 --- a/.github/workflows/python-ci-wheel.yml +++ b/.github/workflows/python-ci-wheel.yml @@ -132,7 +132,7 @@ jobs: #===============================================# # Upload artifacts - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v3 with: name: cibuildwheel-${{ runner.os }}-python-${{ matrix.python-version }} path: ./wheelhouse/*.whl @@ -208,7 +208,7 @@ jobs: #===============================================# # Upload artifact - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v3 with: name: sdist-${{ runner.os }}-python-3.9 path: dist/*.tar.gz diff --git a/.github/workflows/tests_build.yml b/.github/workflows/tests_build.yml index bddd36f0a67..042d65eaf72 100644 --- a/.github/workflows/tests_build.yml +++ b/.github/workflows/tests_build.yml @@ -109,7 +109,7 @@ jobs: ls -al - name: Upload results as artefacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v3 with: name: test-suite-diff path: ${{ github.workspace }}/${{ env.OUTPUT_DIR }}/ From a6d436ea0d358afc35fc4aadf3b8809be7f39ef5 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Mon, 29 Jan 2024 21:04:32 +0100 Subject: [PATCH 170/249] Run forward twice --- src/doc.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/doc.cpp b/src/doc.cpp index e6c4313ba15..5f36ed7264a 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -609,18 +609,16 @@ void Doc::PrepareData() // Try to match all spanning elements (slur, tie, etc) by processing backwards PrepareTimeSpanningFunctor prepareTimeSpanning; - prepareTimeSpanning.SetDirection(BACKWARD); this->Process(prepareTimeSpanning); prepareTimeSpanning.SetDataCollectionCompleted(); - // First we try backwards because normally the spanning elements are at the end of - // the measure. However, in some case, one (or both) end points will appear afterwards - // in the encoding. For these, the previous iteration will not have resolved the link and - // the spanning elements will remain in the timeSpanningElements array. We try again forwards - // but this time without filling the list (that is only will the remaining elements) + // First we try a forward pass which should collect most of the spanning elements. + // However, in some cases, one (or both) end points might appear a few measures + // before the spanning element in the encoding. For these, the previous iteration will not have resolved the link + // and the spanning elements will remain in the timeSpanningElements array. We try again forwards but this time + // without filling the list (that is only resolving remaining elements). const ListOfSpanningInterOwnerPairs &interfaceOwnerPairs = prepareTimeSpanning.GetInterfaceOwnerPairs(); if (!interfaceOwnerPairs.empty()) { - prepareTimeSpanning.SetDirection(FORWARD); this->Process(prepareTimeSpanning); } From dd226338a6075a0cc8eb0eb7937dc5669df14231 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Tue, 30 Jan 2024 22:05:17 +0100 Subject: [PATCH 171/249] Collect all time spanning descendants on first measure visit --- include/vrv/preparedatafunctor.h | 7 +++- src/preparedatafunctor.cpp | 67 +++++++++++++++++++++----------- 2 files changed, 50 insertions(+), 24 deletions(-) diff --git a/include/vrv/preparedatafunctor.h b/include/vrv/preparedatafunctor.h index 793d1e66c0e..1a185a7ba7c 100644 --- a/include/vrv/preparedatafunctor.h +++ b/include/vrv/preparedatafunctor.h @@ -493,18 +493,23 @@ class PrepareTimeSpanningFunctor : public Functor, public CollectAndProcess { FunctorCode VisitF(F *f) override; FunctorCode VisitFloatingObject(FloatingObject *floatingObject) override; FunctorCode VisitLayerElement(LayerElement *layerElement) override; + FunctorCode VisitMeasure(Measure *measure) override; FunctorCode VisitMeasureEnd(Measure *measure) override; ///@} protected: // private: - // + // Delegates to the pseudo functor of the interface + FunctorCode CallPseudoFunctor(Object *timeSpanningObject); + public: // private: // The interface list that holds the current elements to match ListOfSpanningInterOwnerPairs m_timeSpanningInterfaces; + // Indicates whether we currently traverse a measure + bool m_insideMeasure; }; //---------------------------------------------------------------------------- diff --git a/src/preparedatafunctor.cpp b/src/preparedatafunctor.cpp index 98b7b07152e..2d9226da362 100644 --- a/src/preparedatafunctor.cpp +++ b/src/preparedatafunctor.cpp @@ -650,7 +650,10 @@ FunctorCode PrepareTimePointingFunctor::VisitMeasureEnd(Measure *measure) // PrepareTimeSpanningFunctor //---------------------------------------------------------------------------- -PrepareTimeSpanningFunctor::PrepareTimeSpanningFunctor() : Functor(), CollectAndProcess() {} +PrepareTimeSpanningFunctor::PrepareTimeSpanningFunctor() : Functor(), CollectAndProcess() +{ + m_insideMeasure = false; +} void PrepareTimeSpanningFunctor::InsertInterfaceOwnerPair(Object *owner, TimeSpanningInterface *interface) { @@ -659,19 +662,16 @@ void PrepareTimeSpanningFunctor::InsertInterfaceOwnerPair(Object *owner, TimeSpa FunctorCode PrepareTimeSpanningFunctor::VisitF(F *f) { - // Pass it to the pseudo functor of the interface - TimeSpanningInterface *interface = f->GetTimeSpanningInterface(); - assert(interface); - return interface->InterfacePrepareTimeSpanning(*this, f); + if (!m_insideMeasure) { + return this->CallPseudoFunctor(f); + } + return FUNCTOR_CONTINUE; } FunctorCode PrepareTimeSpanningFunctor::VisitFloatingObject(FloatingObject *floatingObject) { - // Pass it to the pseudo functor of the interface - if (floatingObject->HasInterface(INTERFACE_TIME_SPANNING)) { - TimeSpanningInterface *interface = floatingObject->GetTimeSpanningInterface(); - assert(interface); - return interface->InterfacePrepareTimeSpanning(*this, floatingObject); + if (!m_insideMeasure && floatingObject->HasInterface(INTERFACE_TIME_SPANNING)) { + return this->CallPseudoFunctor(floatingObject); } return FUNCTOR_CONTINUE; } @@ -699,28 +699,49 @@ FunctorCode PrepareTimeSpanningFunctor::VisitLayerElement(LayerElement *layerEle return FUNCTOR_CONTINUE; } -FunctorCode PrepareTimeSpanningFunctor::VisitMeasureEnd(Measure *measure) +FunctorCode PrepareTimeSpanningFunctor::VisitMeasure(Measure *measure) { - if (this->IsProcessingData()) { - return FUNCTOR_CONTINUE; + if (this->IsCollectingData()) { + ListOfObjects timeSpanningObjects; + InterfaceComparison ic(INTERFACE_TIME_SPANNING); + measure->FindAllDescendantsByComparison(&timeSpanningObjects, &ic); + for (Object *object : timeSpanningObjects) { + this->CallPseudoFunctor(object); + } } + m_insideMeasure = true; - ListOfSpanningInterOwnerPairs::iterator iter = m_timeSpanningInterfaces.begin(); - while (iter != m_timeSpanningInterfaces.end()) { - // At the end of the measure (going backward) we remove elements for which we do not need to match the end (for - // now). Eventually, we could consider them, for example if we want to display their spanning or for improved - // midi output - if (iter->second->GetClassId() == HARM) { - iter = m_timeSpanningInterfaces.erase(iter); - } - else { - ++iter; + return FUNCTOR_CONTINUE; +} + +FunctorCode PrepareTimeSpanningFunctor::VisitMeasureEnd(Measure *measure) +{ + if (this->IsCollectingData()) { + ListOfSpanningInterOwnerPairs::iterator iter = m_timeSpanningInterfaces.begin(); + while (iter != m_timeSpanningInterfaces.end()) { + // At the end of the measure we remove elements for which we do not need to match the end (for now). + // Eventually, we could consider them, for example if we want to display their spanning or for + // improved midi output + if (iter->second->GetClassId() == HARM) { + iter = m_timeSpanningInterfaces.erase(iter); + } + else { + ++iter; + } } } + m_insideMeasure = false; return FUNCTOR_CONTINUE; } +FunctorCode PrepareTimeSpanningFunctor::CallPseudoFunctor(Object *timeSpanningObject) +{ + TimeSpanningInterface *interface = timeSpanningObject->GetTimeSpanningInterface(); + assert(interface); + return interface->InterfacePrepareTimeSpanning(*this, timeSpanningObject); +} + //---------------------------------------------------------------------------- // PrepareTimestampsFunctor //---------------------------------------------------------------------------- From c3da438596b93f1adcc091e51a2481f3ae8f41ee Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Feb 2024 08:15:48 +0100 Subject: [PATCH 172/249] Update iOS Framework to C++20 (missed) [skip-ci] --- Verovio.xcodeproj/project.pbxproj | 4 ++-- bindings/iOS/all.h | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index 111c13c9f03..d5ec055fae2 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -5191,7 +5191,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_COMMA = YES; @@ -5246,7 +5246,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_COMMA = YES; diff --git a/bindings/iOS/all.h b/bindings/iOS/all.h index 9c77adf6e96..9698250ef2e 100644 --- a/bindings/iOS/all.h +++ b/bindings/iOS/all.h @@ -94,6 +94,7 @@ #import #import #import +#import #import #import #import From 9d2e254bc550807e7ca5931f8da7908e150e43d9 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Wed, 8 Nov 2023 12:32:47 +0100 Subject: [PATCH 173/249] shorten trill extender --- src/view_control.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/view_control.cpp b/src/view_control.cpp index e491dda4abb..9a0065f0ce9 100644 --- a/src/view_control.cpp +++ b/src/view_control.cpp @@ -1063,7 +1063,10 @@ void View::DrawTrillExtension( } // Adjust the x2 for endid - if (!trill->GetEnd()->Is(TIMESTAMP_ATTR)) x2 -= trill->GetEnd()->GetDrawingRadius(m_doc); + if (!trill->GetEnd()->Is(TIMESTAMP_ATTR)) { + x2 -= trill->GetEnd()->GetDrawingRadius(m_doc); + } + x2 -= m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize); int length = x2 - x1; Point orig(x1, y); From b66ded88daabadb8d59440ab902f84b3a79a4ee5 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 6 Feb 2024 12:58:56 +0100 Subject: [PATCH 174/249] Fix missing virtual qualifier for Option::IsArgumentRequire --- include/vrv/options.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/vrv/options.h b/include/vrv/options.h index 2cb3eff0844..42f59ce1b77 100644 --- a/include/vrv/options.h +++ b/include/vrv/options.h @@ -122,7 +122,7 @@ class Option { void SetShortOption(char shortOption, bool isCmdOnly); char GetShortOption() const { return m_shortOption; } bool IsCmdOnly() const { return m_isCmdOnly; } - bool IsArgumentRequired() const { return true; } + virtual bool IsArgumentRequired() const { return true; } /** * Return a JSON object for the option @@ -187,7 +187,7 @@ class OptionBool : public Option { bool GetDefault() const { return m_defaultValue; } bool SetValue(bool value); - bool IsArgumentRequired() const { return false; } + bool IsArgumentRequired() const override { return false; } private: // From e141bd6ae20e88db967e57570611353b6dbcbe37 Mon Sep 17 00:00:00 2001 From: Fernando Herrera Date: Mon, 22 Jan 2024 08:07:00 +0100 Subject: [PATCH 175/249] Add fontname support for clef and meter symbols. Add extra fonts support. --- include/vrv/clef.h | 1 + include/vrv/metersig.h | 3 ++ include/vrv/options.h | 1 + include/vrv/resources.h | 43 +++++++++++++---- include/vrv/svgdevicecontext.h | 28 +++++++++-- include/vrv/toolkit.h | 2 +- include/vrv/view.h | 3 ++ src/clef.cpp | 3 ++ src/iomei.cpp | 3 ++ src/metersig.cpp | 26 +++++++++- src/options.cpp | 4 ++ src/resources.cpp | 88 ++++++++++++++++++++++++---------- src/svgdevicecontext.cpp | 50 +++++++++++++++---- src/toolkit.cpp | 18 ++++--- src/view_element.cpp | 18 +++++-- src/view_graph.cpp | 19 ++++++++ 16 files changed, 251 insertions(+), 59 deletions(-) diff --git a/include/vrv/clef.h b/include/vrv/clef.h index 9dcd9e635b7..bc16c6fdc42 100644 --- a/include/vrv/clef.h +++ b/include/vrv/clef.h @@ -35,6 +35,7 @@ class Clef : public LayerElement, public AttOctave, public AttOctaveDisplacement, public AttStaffIdent, + public AttTypography, public AttVisibility { public: /** diff --git a/include/vrv/metersig.h b/include/vrv/metersig.h index df024fd5149..610458329b1 100644 --- a/include/vrv/metersig.h +++ b/include/vrv/metersig.h @@ -8,6 +8,7 @@ #ifndef __VRV_METERSIG_H__ #define __VRV_METERSIG_H__ +#include "atts_externalsymbols.h" #include "atts_shared.h" #include "atts_visual.h" #include "layerelement.h" @@ -25,8 +26,10 @@ class ScoreDefInterface; */ class MeterSig : public LayerElement, public AttEnclosingChars, + public AttExtSymNames, public AttMeterSigLog, public AttMeterSigVis, + public AttTypography, public AttVisibility { public: /** diff --git a/include/vrv/options.h b/include/vrv/options.h index 42f59ce1b77..3ba1c0a7827 100644 --- a/include/vrv/options.h +++ b/include/vrv/options.h @@ -689,6 +689,7 @@ class Options { OptionDbl m_extenderLineMinSpace; OptionDbl m_fingeringScale; OptionString m_font; + OptionArray m_addCustomFont; OptionDbl m_graceFactor; OptionBool m_graceRhythmAlign; OptionBool m_graceRightAlign; diff --git a/include/vrv/resources.h b/include/vrv/resources.h index 597ae6b6545..bd3e3594c8a 100644 --- a/include/vrv/resources.h +++ b/include/vrv/resources.h @@ -56,12 +56,13 @@ class Resources { */ ///@{ /** Init the SMufL music and text fonts */ - bool InitFonts(); + bool InitFonts(const std::vector &extraFonts, const std::string &defaultFont); /** Init the text font (bounding boxes and ASCII only) */ bool InitTextFont(const std::string &fontName, const StyleAttributes &style); /** Select a particular font */ - bool SetFont(const std::string &fontName); - std::string GetCurrentFontName() const { return m_fontName; } + bool SetCurrentFont(const std::string &fontName, bool allowLoading = false); + std::string GetCurrentFont() const { return m_currentFontName; } + bool IsFontLoaded(const std::string &fontName) const { return m_loadedFonts.find(fontName) != m_loadedFonts.end(); } ///@} /** @@ -89,6 +90,8 @@ class Resources { void SelectTextFont(data_FONTWEIGHT fontWeight, data_FONTSTYLE fontStyle) const; /** Returns the glyph (if exists) for the text font (bounding box and ASCII only) */ const Glyph *GetTextGlyph(char32_t code) const; + /** Returns true if the specified font is loaded and it contains the requested glyph */ + bool FontHasGlyphAvailable(const std::string &fontName, char32_t smuflCode) const; ///@} /** @@ -98,15 +101,35 @@ class Resources { static char32_t GetSmuflGlyphForUnicodeChar(const char32_t unicodeChar); private: - bool LoadFont(const std::string &fontName, bool withFallback = true); + class LoadedFont { + public: + // LoadedFont() {}; + LoadedFont( + const std::string &name, const std::string &path, const GlyphTable &glyphTable, bool useFallback = true) + : m_name(name), m_path(path), m_glyphTable(glyphTable), m_useFallback(useFallback){}; + ~LoadedFont(){}; + const std::string GetName() const { return m_name; }; + const std::string GetPath() const { return m_path; }; + const GlyphTable &GetGlyphTable() const { return m_glyphTable; }; + bool useFallback() const { return m_useFallback; }; + + private: + std::string m_name; + /** The path to the resources directory (e.g., for the svg/ subdirectory with fonts as XML */ + std::string m_path; + /** The loaded SMuFL font */ + GlyphTable m_glyphTable; + /** If the font have a fallback when a glyph is not present **/ + const bool m_useFallback; + }; + + bool LoadFont(const std::string &fontName, bool withFallback = true, bool buildNameTable = false); + const GlyphTable &GetCurrentGlyphTable() const { return m_loadedFonts.at(m_currentFontName).GetGlyphTable(); }; -private: - /** The font name of the font that is currently loaded */ - std::string m_fontName; - /** The path to the resources directory (e.g., for the svg/ subdirectory with fonts as XML */ std::string m_path; - /** The loaded SMuFL font */ - GlyphTable m_fontGlyphTable; + std::string m_defaultFontName; + std::map m_loadedFonts; + std::string m_currentFontName; /** A text font used for bounding box calculations */ GlyphTextMap m_textFont; mutable StyleAttributes m_currentStyle; diff --git a/include/vrv/svgdevicecontext.h b/include/vrv/svgdevicecontext.h index 0e7b43e4afd..b69471e7e37 100644 --- a/include/vrv/svgdevicecontext.h +++ b/include/vrv/svgdevicecontext.h @@ -29,6 +29,7 @@ class Resources; namespace vrv { + //---------------------------------------------------------------------------- // SvgDeviceContext //---------------------------------------------------------------------------- @@ -328,9 +329,28 @@ class SvgDeviceContext : public DeviceContext { bool m_committed; // did we flushed the file? int m_originX, m_originY; - // holds the list of glyphs from the smufl font used so far - // they will be added at the end of the file as - std::set m_smuflGlyphs; + // Here we hold references to all different glyphs used so far, + // including any glyph for the same code but from different fonts. + // They will be added at the end of the file as . + // With multiple font support we need to keep track of: + // a) the path to the glyph (to check if is has been already added) + // b) the id assigned to glyphs on the (that is has been consumed by the already rendered elements) + // To keep things as similar as possible to previous versions we generate ids with as uuuu-ss (where uuuu is the Smulf code + // for the glyph and ss the per-session suffix) for most of the cases (single font usage). When the same glyph has been used + // from several fonts we use uuuu-n-ss where n indicates the collision count . Maybe we don't need to + // keep this pattern and can simplify this. + class GlyphRef { + public: + GlyphRef(const Glyph *glyph, int idx, const std::string &postfix); + const Glyph* GetGlyph() const { return m_glyph; }; + const std::string& GetRefId() const { return m_refId; }; + private: + const Glyph* m_glyph; + std::string m_refId; + }; + const std::string InsertGlyphRef(const Glyph *glyph); + std::map m_smuflGlyphs; + std::map m_glyphCodesCounter; // pugixml data pugi::xml_document m_svgDoc; @@ -358,7 +378,7 @@ class SvgDeviceContext : public DeviceContext { bool m_removeXlink; // indentation value (-1 for tabs) int m_indent; - // prefix to be added to font glyphs + // postfix to be added to font glyphs std::string m_glyphPostfixId; // embedding of the smufl text font option_SMUFLTEXTFONT m_smuflTextFont; diff --git a/include/vrv/toolkit.h b/include/vrv/toolkit.h index 268175e3217..14a5499baeb 100644 --- a/include/vrv/toolkit.h +++ b/include/vrv/toolkit.h @@ -77,7 +77,7 @@ class Toolkit { std::string GetResourcePath() const; /** - * Set the resource path for the Toolkit instance. + * Set the resource path for the Toolkit instance and any extra fonts * * This method needs to be called if the constructor had initFont=false or if the resource path * needs to be changed. diff --git a/include/vrv/view.h b/include/vrv/view.h index 2c5473db68d..7f8c3750def 100644 --- a/include/vrv/view.h +++ b/include/vrv/view.h @@ -567,6 +567,9 @@ class View { DeviceContext *dc, int y1, SegmentedLine &line, int width, int dashLength = 0, int gapLength = 0); void DrawSmuflCode( DeviceContext *dc, int x, int y, char32_t code, int staffSize, bool dimin, bool setBBGlyph = false); + int DrawSmuflCodeWithCustomFont(DeviceContext *dc, const std::string &customFont, int x, int y, char32_t code, + int staffSize, bool dimin, bool setBBGlyph = false); + void DrawThickBezierCurve( DeviceContext *dc, Point bezier[4], int thickness, int staffSize, int penWidth, int penStyle = AxSOLID); void DrawPartFilledRectangle(DeviceContext *dc, int x1, int y1, int x2, int y2, int fillSection); diff --git a/src/clef.cpp b/src/clef.cpp index d14a60822dc..3e73f0cc14d 100644 --- a/src/clef.cpp +++ b/src/clef.cpp @@ -41,6 +41,7 @@ Clef::Clef() , AttOctave() , AttOctaveDisplacement() , AttStaffIdent() + , AttTypography() , AttVisibility() { this->RegisterAttClass(ATT_CLEFLOG); @@ -53,6 +54,7 @@ Clef::Clef() this->RegisterAttClass(ATT_OCTAVE); this->RegisterAttClass(ATT_OCTAVEDISPLACEMENT); this->RegisterAttClass(ATT_STAFFIDENT); + this->RegisterAttClass(ATT_TYPOGRAPHY); this->RegisterAttClass(ATT_VISIBILITY); this->Reset(); @@ -73,6 +75,7 @@ void Clef::Reset() this->ResetOctave(); this->ResetOctaveDisplacement(); this->ResetStaffIdent(); + this->ResetTypography(); this->ResetVisibility(); } diff --git a/src/iomei.cpp b/src/iomei.cpp index 1cac00367ae..ad9afa02d92 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -6473,6 +6473,7 @@ bool MEIInput::ReadClef(Object *parent, pugi::xml_node clef) vrvClef->ReadOctave(clef); vrvClef->ReadOctaveDisplacement(clef); vrvClef->ReadStaffIdent(clef); + vrvClef->ReadTypography(clef); vrvClef->ReadVisibility(clef); parent->AddChild(vrvClef); @@ -6689,8 +6690,10 @@ bool MEIInput::ReadMeterSig(Object *parent, pugi::xml_node meterSig) } vrvMeterSig->ReadEnclosingChars(meterSig); + vrvMeterSig->ReadExtSymNames(meterSig); vrvMeterSig->ReadMeterSigLog(meterSig); vrvMeterSig->ReadMeterSigVis(meterSig); + vrvMeterSig->ReadTypography(meterSig); vrvMeterSig->ReadVisibility(meterSig); parent->AddChild(vrvMeterSig); diff --git a/src/metersig.cpp b/src/metersig.cpp index e27022f9d79..ccd59b25e93 100644 --- a/src/metersig.cpp +++ b/src/metersig.cpp @@ -16,6 +16,7 @@ //---------------------------------------------------------------------------- #include "functor.h" +#include "resources.h" #include "scoredefinterface.h" #include "smufl.h" #include "vrv.h" @@ -29,11 +30,19 @@ namespace vrv { static const ClassRegistrar s_factory("meterSig", METERSIG); MeterSig::MeterSig() - : LayerElement(METERSIG, "msig-"), AttEnclosingChars(), AttMeterSigLog(), AttMeterSigVis(), AttVisibility() + : LayerElement(METERSIG, "msig-") + , AttEnclosingChars() + , AttExtSymNames() + , AttMeterSigLog() + , AttMeterSigVis() + , AttTypography() + , AttVisibility() { this->RegisterAttClass(ATT_ENCLOSINGCHARS); + this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_METERSIGLOG); this->RegisterAttClass(ATT_METERSIGVIS); + this->RegisterAttClass(ATT_TYPOGRAPHY); this->RegisterAttClass(ATT_VISIBILITY); this->Reset(); @@ -45,8 +54,10 @@ void MeterSig::Reset() { LayerElement::Reset(); this->ResetEnclosingChars(); + this->ResetExtSymNames(); this->ResetMeterSigLog(); this->ResetMeterSigVis(); + this->ResetTypography(); this->ResetVisibility(); } @@ -97,6 +108,19 @@ int MeterSig::GetTotalCount() const char32_t MeterSig::GetSymbolGlyph() const { char32_t glyph = 0; + const Resources *resources = this->GetDocResources(); + + // If there is glyph.num, prioritize it + if (this->HasGlyphNum()) { + glyph = this->GetGlyphNum(); + if (NULL != resources->GetGlyph(glyph)) return glyph; + } + // If there is glyph.name (second priority) + else if (this->HasGlyphName()) { + glyph = resources->GetGlyphCode(this->GetGlyphName()); + if (NULL != resources->GetGlyph(glyph)) return glyph; + } + switch (this->GetSym()) { case METERSIGN_common: glyph = SMUFL_E08A_timeSigCommon; break; case METERSIGN_cut: glyph = SMUFL_E08B_timeSigCutCommon; break; diff --git a/src/options.cpp b/src/options.cpp index b634bf9924b..afd5e00d881 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -1290,6 +1290,10 @@ Options::Options() m_font.Init("Leipzig"); this->Register(&m_font, "font", &m_generalLayout); + m_addCustomFont.SetInfo("Add custom font", "Add a custom music font"); + m_addCustomFont.Init(); + this->Register(&m_addCustomFont, "addCustomFont", &m_generalLayout); + m_graceFactor.SetInfo("Grace factor", "The grace size ratio numerator"); m_graceFactor.Init(0.75, 0.5, 1.0); this->Register(&m_graceFactor, "graceFactor", &m_generalLayout); diff --git a/src/resources.cpp b/src/resources.cpp index 114821fbe0a..1730742b5a0 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -50,19 +50,27 @@ Resources::Resources() m_currentStyle = k_defaultStyle; } -bool Resources::InitFonts() +bool Resources::InitFonts(const std::vector &extraFonts, const std::string &defaultFont) { - // We will need to rethink this for adding the option to add custom fonts - // Font Bravura first since it is expected to have always all symbols - if (!LoadFont("Bravura", false)) LogError("Bravura font could not be loaded."); - // The Leipzig as the default font - if (!LoadFont("Leipzig", false)) LogError("Leipzig font could not be loaded."); + // We need to rethink this for handling multiple fonts in an optimal way - if (m_fontGlyphTable.size() < SMUFL_COUNT) { - LogError("Expected %d default SMuFL glyphs but could load only %d.", SMUFL_COUNT, m_fontGlyphTable.size()); - return false; + // Font Bravura first. As it is expected to have always all symbols we build the code -> name table from it + if (!LoadFont("Bravura", false, true)) LogError("Bravura font could not be loaded."); + // Leipzig is our initial default font + if (!LoadFont("Leipzig", false)) LogError("Leipzig font could not be loaded."); + // options supplied fonts + for (const std::string &font : extraFonts) { + if (!LoadFont(font, true)) LogError("Option supplied font %s could not be loaded.", font.c_str()); + } + // and the default font provided in options, if it is not on: of the previous + if (!defaultFont.empty() && !IsFontLoaded(defaultFont)) { + if (!LoadFont(defaultFont, false)) + LogError("%s default font could not be loaded. Fallballing to Leipzig", defaultFont.c_str()); } + m_defaultFontName = IsFontLoaded(defaultFont) ? defaultFont : "Leipzig"; + m_currentFontName = m_defaultFontName; + struct TextFontInfo_type { const StyleAttributes m_style; const std::string m_fileName; @@ -86,19 +94,29 @@ bool Resources::InitFonts() return true; } -bool Resources::SetFont(const std::string &fontName) +bool Resources::SetCurrentFont(const std::string &fontName, bool allowLoading) { - return LoadFont(fontName); + if (IsFontLoaded(fontName)) { + m_currentFontName = fontName; + return true; + } + else if (allowLoading && LoadFont(fontName)) { + m_currentFontName = fontName; + return true; + } + else { + return false; + } } const Glyph *Resources::GetGlyph(char32_t smuflCode) const { - return m_fontGlyphTable.count(smuflCode) ? &m_fontGlyphTable.at(smuflCode) : NULL; + return GetCurrentGlyphTable().count(smuflCode) ? &GetCurrentGlyphTable().at(smuflCode) : NULL; } const Glyph *Resources::GetGlyph(const std::string &smuflName) const { - return m_glyphNameTable.count(smuflName) ? &m_fontGlyphTable.at(m_glyphNameTable.at(smuflName)) : NULL; + return m_glyphNameTable.count(smuflName) ? &GetCurrentGlyphTable().at(m_glyphNameTable.at(smuflName)) : NULL; } char32_t Resources::GetGlyphCode(const std::string &smuflName) const @@ -108,13 +126,31 @@ char32_t Resources::GetGlyphCode(const std::string &smuflName) const bool Resources::IsSmuflFallbackNeeded(const std::u32string &text) const { + if (!m_loadedFonts.at(m_currentFontName).useFallback()) { + return false; + } for (char32_t c : text) { const Glyph *glyph = this->GetGlyph(c); - if (glyph && glyph->GetFallback()) return true; + if (glyph == NULL) return true; } return false; } +bool Resources::FontHasGlyphAvailable(const std::string &fontName, char32_t smuflCode) const +{ + if (!IsFontLoaded(fontName)) { + return false; + } + + const GlyphTable &table = m_loadedFonts.at(fontName).GetGlyphTable(); + if (table.find(smuflCode) != table.end()) { + return true; + } + else { + return false; + } +} + void Resources::SelectTextFont(data_FONTWEIGHT fontWeight, data_FONTSTYLE fontStyle) const { if (fontWeight == FONTWEIGHT_NONE) { @@ -158,7 +194,7 @@ char32_t Resources::GetSmuflGlyphForUnicodeChar(const char32_t unicodeChar) return smuflChar; } -bool Resources::LoadFont(const std::string &fontName, bool withFallback) +bool Resources::LoadFont(const std::string &fontName, bool withFallback, bool buildNameTable) { pugi::xml_document doc; const std::string filename = Resources::GetPath() + "/" + fontName + ".xml"; @@ -174,11 +210,7 @@ bool Resources::LoadFont(const std::string &fontName, bool withFallback) return false; } - if (withFallback) { - for (auto &glyph : m_fontGlyphTable) { - glyph.second.SetFallback(true); - } - } + GlyphTable glyphTable; const int unitsPerEm = atoi(root.attribute("units-per-em").value()); @@ -211,12 +243,20 @@ bool Resources::LoadFont(const std::string &fontName, bool withFallback) } const char32_t smuflCode = (char32_t)strtol(c_attribute.value(), NULL, 16); - glyph.SetFallback(false); - m_fontGlyphTable[smuflCode] = glyph; - m_glyphNameTable[n_attribute.value()] = smuflCode; + glyphTable[smuflCode] = glyph; + if (buildNameTable) { + m_glyphNameTable[n_attribute.value()] = smuflCode; + } + } + + if (buildNameTable && glyphTable.size() < SMUFL_COUNT) { + LogError("Expected %d default SMuFL glyphs but could load only %d.", SMUFL_COUNT, glyphTable.size()); + return false; } - m_fontName = fontName; + m_loadedFonts.insert(std::pair( + fontName, Resources::LoadedFont(fontName, m_path, glyphTable, withFallback))); + return true; } diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index 4451b067d8c..8dc8f4184e6 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -84,6 +84,40 @@ bool SvgDeviceContext::CopyFileToStream(const std::string &filename, std::ostrea return true; } +SvgDeviceContext::GlyphRef::GlyphRef(const Glyph *glyph, int idx, const std::string &postfix) : m_glyph(glyph) +{ + if (idx == 0) { + m_refId = StringFormat("%s-%s", glyph->GetCodeStr().c_str(), postfix.c_str()); + } + else { + m_refId = StringFormat("%s-%d-%s", glyph->GetCodeStr().c_str(), idx, postfix.c_str()); + } +}; + +const std::string SvgDeviceContext::InsertGlyphRef(const Glyph *glyph) +{ + const std::string code = glyph->GetCodeStr(); + const std::string path = glyph->GetPath(); + + if (m_smuflGlyphs.find(path) != m_smuflGlyphs.end()) { + return m_smuflGlyphs.at(path).GetRefId(); + } + + int count; + if (m_glyphCodesCounter.find(code) == m_glyphCodesCounter.end()) { + count = 0; + } + else { + count = m_glyphCodesCounter[(code)]; + } + GlyphRef ref(glyph, count, m_glyphPostfixId); + const std::string id = ref.GetRefId(); + m_smuflGlyphs.insert(std::pair(path, ref)); + m_glyphCodesCounter[code] = count + 1; + + return id; +} + void SvgDeviceContext::IncludeTextFont(const std::string &fontname, const Resources *resources) { assert(resources); @@ -95,7 +129,7 @@ void SvgDeviceContext::IncludeTextFont(const std::string &fontname, const Resour std::ifstream cssFontFile(cssFontPath); if (!cssFontFile.is_open()) { LogWarning("The CSS font for '%s' could not be loaded and will not be embedded in the SVG", - resources->GetCurrentFontName().c_str()); + resources->GetCurrentFont().c_str()); } else { std::stringstream cssFontStream; @@ -156,7 +190,7 @@ void SvgDeviceContext::Commit(bool xml_declaration) const Resources *resources = this->GetResources(true); // include the selected font if (m_vrvTextFont && resources) { - this->IncludeTextFont(resources->GetCurrentFontName(), resources); + this->IncludeTextFont(resources->GetCurrentFont(), resources); } // include the Leipzig fallback font if (m_vrvTextFontFallback && resources) { @@ -171,15 +205,14 @@ void SvgDeviceContext::Commit(bool xml_declaration) pugi::xml_document sourceDoc; // for each needed glyph - for (const Glyph *smuflGlyph : m_smuflGlyphs) { + for (const std::pair entry : m_smuflGlyphs) { // load the XML file that contains it as a pugi::xml_document - std::ifstream source(smuflGlyph->GetPath()); + std::ifstream source(entry.first); sourceDoc.load(source); // copy all the nodes inside into the master document for (pugi::xml_node child = sourceDoc.first_child(); child; child = child.next_sibling()) { - std::string id = StringFormat("%s-%s", child.attribute("id").value(), m_glyphPostfixId.c_str()); - child.attribute("id").set_value(id.c_str()); + child.attribute("id").set_value(entry.second.GetRefId().c_str()); defs.append_copy(child); } } @@ -1020,12 +1053,11 @@ void SvgDeviceContext::DrawMusicText(const std::u32string &text, int x, int y, b } // Add the glyph to the array for the - m_smuflGlyphs.insert(glyph); + const std::string id = InsertGlyphRef(glyph); // Write the char in the SVG pugi::xml_node useChild = AddChild("use"); - useChild.append_attribute(hrefAttrib.c_str()) - = StringFormat("#%s-%s", glyph->GetCodeStr().c_str(), m_glyphPostfixId.c_str()).c_str(); + useChild.append_attribute(hrefAttrib.c_str()) = StringFormat("#%s", id.c_str()).c_str(); useChild.append_attribute("x") = x; useChild.append_attribute("y") = y; useChild.append_attribute("height") = StringFormat("%dpx", m_fontStack.top()->GetPointSize()).c_str(); diff --git a/src/toolkit.cpp b/src/toolkit.cpp index 4821605cf8b..cfe9e1bd5b3 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -72,13 +72,13 @@ Toolkit::Toolkit(bool initFont) m_humdrumBuffer = NULL; m_cString = NULL; + m_options = m_doc.GetOptions(); + if (initFont) { Resources &resources = m_doc.GetResourcesForModification(); - resources.InitFonts(); + resources.InitFonts(m_options->m_addCustomFont.GetValue(), m_options->m_font.GetValue()); } - m_options = m_doc.GetOptions(); - m_editorToolkit = NULL; #ifndef NO_RUNTIME @@ -117,13 +117,13 @@ bool Toolkit::SetResourcePath(const std::string &path) { Resources &resources = m_doc.GetResourcesForModification(); resources.SetPath(path); - return resources.InitFonts(); + return resources.InitFonts(m_options->m_addCustomFont.GetValue(), m_options->m_font.GetValue()); } bool Toolkit::SetFont(const std::string &fontName) { Resources &resources = m_doc.GetResourcesForModification(); - const bool ok = resources.SetFont(fontName); + const bool ok = resources.SetCurrentFont(fontName, true); if (!ok) LogWarning("Font '%s' could not be loaded", fontName.c_str()); return ok; } @@ -1129,7 +1129,13 @@ bool Toolkit::SetOptions(const std::string &jsonOptions) m_options->Sync(); // Forcing font resource to be reset if the font is given in the options - if (json.has("font")) this->SetFont(m_options->m_font.GetValue()); + if (json.has("addCustomFont")) { + Resources &resources = m_doc.GetResourcesForModification(); + resources.InitFonts(m_options->m_addCustomFont.GetValue(), m_options->m_font.GetValue()); + } + else if (json.has("font")) { + this->SetFont(m_options->m_font.GetValue()); + } return true; } diff --git a/src/view_element.cpp b/src/view_element.cpp index 82ba0443207..3bd292d45af 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -687,7 +687,12 @@ void View::DrawClef(DeviceContext *dc, LayerElement *element, Layer *layer, Staf dc->StartGraphic(element, "", element->GetID()); - this->DrawSmuflCode(dc, x, y, sym, staff->m_drawingStaffSize, false); + if (clef->HasFontname() && m_doc->GetResources().FontHasGlyphAvailable(clef->GetFontname(), sym)) { + this->DrawSmuflCodeWithCustomFont(dc, clef->GetFontname(), x, y, sym, staff->m_drawingStaffSize, false); + } + else { + this->DrawSmuflCode(dc, x, y, sym, staff->m_drawingStaffSize, false); + } if (m_doc->IsFacs() && element->HasFacs()) { const int noteHeight @@ -1133,10 +1138,15 @@ void View::DrawMeterSig(DeviceContext *dc, MeterSig *meterSig, Staff *staff, int x += m_doc->GetGlyphWidth(enclosingFront, glyphSize, false); } - if (meterSig->HasSym()) { + if (meterSig->HasSym() || meterSig->HasGlyphNum() || meterSig->HasGlyphName()) { const char32_t code = meterSig->GetSymbolGlyph(); - this->DrawSmuflCode(dc, x, y, code, glyphSize, false); - x += m_doc->GetGlyphWidth(code, glyphSize, false); + if (meterSig->HasFontname() && m_doc->GetResources().FontHasGlyphAvailable(meterSig->GetFontname(), code)) { + x += this->DrawSmuflCodeWithCustomFont(dc, meterSig->GetFontname(), x, y, code, glyphSize, false); + } + else { + this->DrawSmuflCode(dc, x, y, code, glyphSize, false); + x += m_doc->GetGlyphWidth(code, glyphSize, false); + } } else if (meterSig->GetForm() == METERFORM_num) { x += this->DrawMeterSigFigures(dc, x, y, meterSig, 0, staff); diff --git a/src/view_graph.cpp b/src/view_graph.cpp index 76bf8ade512..2970293d56a 100644 --- a/src/view_graph.cpp +++ b/src/view_graph.cpp @@ -276,6 +276,25 @@ void View::DrawEnclosingBrackets(DeviceContext *dc, int x, int y, int height, in horizontalThickness, verticalThickness); } +int View::DrawSmuflCodeWithCustomFont(DeviceContext *dc, const std::string &customFont, int x, int y, char32_t code, + int staffSize, bool dimin, bool setBBGlyph) +{ + assert(!customFont.empty()); + + Resources &resources = m_doc->GetResourcesForModification(); + const std::string prevFont = resources.GetCurrentFont(); + + resources.SetCurrentFont(customFont); + + int drawnWidth = m_doc->GetGlyphWidth(code, staffSize, false); + + DrawSmuflCode(dc, x, y, code, staffSize, dimin, setBBGlyph); + + resources.SetCurrentFont(prevFont); + + return drawnWidth; +} + void View::DrawSmuflCode(DeviceContext *dc, int x, int y, char32_t code, int staffSize, bool dimin, bool setBBGlyph) { assert(dc); From 0ac6c60809d1de930a086aca0d845f6da8eecb66 Mon Sep 17 00:00:00 2001 From: Fernando Herrera Date: Fri, 26 Jan 2024 19:45:02 +0100 Subject: [PATCH 176/249] Fix formatting of the previous commit --- include/vrv/svgdevicecontext.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/include/vrv/svgdevicecontext.h b/include/vrv/svgdevicecontext.h index b69471e7e37..cacd7353bbd 100644 --- a/include/vrv/svgdevicecontext.h +++ b/include/vrv/svgdevicecontext.h @@ -29,7 +29,6 @@ class Resources; namespace vrv { - //---------------------------------------------------------------------------- // SvgDeviceContext //---------------------------------------------------------------------------- @@ -335,18 +334,19 @@ class SvgDeviceContext : public DeviceContext { // With multiple font support we need to keep track of: // a) the path to the glyph (to check if is has been already added) // b) the id assigned to glyphs on the (that is has been consumed by the already rendered elements) - // To keep things as similar as possible to previous versions we generate ids with as uuuu-ss (where uuuu is the Smulf code - // for the glyph and ss the per-session suffix) for most of the cases (single font usage). When the same glyph has been used - // from several fonts we use uuuu-n-ss where n indicates the collision count . Maybe we don't need to - // keep this pattern and can simplify this. + // To keep things as similar as possible to previous versions we generate ids with as uuuu-ss (where uuuu is the + // Smulf code for the glyph and ss the per-session suffix) for most of the cases (single font usage). When the same + // glyph has been used from several fonts we use uuuu-n-ss where n indicates the collision count . Maybe we don't + // need to keep this pattern and can simplify this. class GlyphRef { - public: - GlyphRef(const Glyph *glyph, int idx, const std::string &postfix); - const Glyph* GetGlyph() const { return m_glyph; }; - const std::string& GetRefId() const { return m_refId; }; - private: - const Glyph* m_glyph; - std::string m_refId; + public: + GlyphRef(const Glyph *glyph, int idx, const std::string &postfix); + const Glyph *GetGlyph() const { return m_glyph; }; + const std::string &GetRefId() const { return m_refId; }; + + private: + const Glyph *m_glyph; + std::string m_refId; }; const std::string InsertGlyphRef(const Glyph *glyph); std::map m_smuflGlyphs; From 5a93b01272169ad85d1ebd98baa03cdba66844a4 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 30 Jan 2024 08:22:38 +0100 Subject: [PATCH 177/249] Rename option to --font-add-custom --- include/vrv/options.h | 2 +- src/options.cpp | 6 +++--- src/toolkit.cpp | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/vrv/options.h b/include/vrv/options.h index 3ba1c0a7827..547609fab66 100644 --- a/include/vrv/options.h +++ b/include/vrv/options.h @@ -689,7 +689,7 @@ class Options { OptionDbl m_extenderLineMinSpace; OptionDbl m_fingeringScale; OptionString m_font; - OptionArray m_addCustomFont; + OptionArray m_fontAddCustom; OptionDbl m_graceFactor; OptionBool m_graceRhythmAlign; OptionBool m_graceRightAlign; diff --git a/src/options.cpp b/src/options.cpp index afd5e00d881..7f9ea84a41f 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -1290,9 +1290,9 @@ Options::Options() m_font.Init("Leipzig"); this->Register(&m_font, "font", &m_generalLayout); - m_addCustomFont.SetInfo("Add custom font", "Add a custom music font"); - m_addCustomFont.Init(); - this->Register(&m_addCustomFont, "addCustomFont", &m_generalLayout); + m_fontAddCustom.SetInfo("Add custom font", "Add a custom music font"); + m_fontAddCustom.Init(); + this->Register(&m_fontAddCustom, "addCustomFont", &m_generalLayout); m_graceFactor.SetInfo("Grace factor", "The grace size ratio numerator"); m_graceFactor.Init(0.75, 0.5, 1.0); diff --git a/src/toolkit.cpp b/src/toolkit.cpp index cfe9e1bd5b3..e3ea9553a67 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -76,7 +76,7 @@ Toolkit::Toolkit(bool initFont) if (initFont) { Resources &resources = m_doc.GetResourcesForModification(); - resources.InitFonts(m_options->m_addCustomFont.GetValue(), m_options->m_font.GetValue()); + resources.InitFonts(m_options->m_fontAddCustom.GetValue(), m_options->m_font.GetValue()); } m_editorToolkit = NULL; @@ -117,7 +117,7 @@ bool Toolkit::SetResourcePath(const std::string &path) { Resources &resources = m_doc.GetResourcesForModification(); resources.SetPath(path); - return resources.InitFonts(m_options->m_addCustomFont.GetValue(), m_options->m_font.GetValue()); + return resources.InitFonts(m_options->m_fontAddCustom.GetValue(), m_options->m_font.GetValue()); } bool Toolkit::SetFont(const std::string &fontName) @@ -1131,7 +1131,7 @@ bool Toolkit::SetOptions(const std::string &jsonOptions) // Forcing font resource to be reset if the font is given in the options if (json.has("addCustomFont")) { Resources &resources = m_doc.GetResourcesForModification(); - resources.InitFonts(m_options->m_addCustomFont.GetValue(), m_options->m_font.GetValue()); + resources.InitFonts(m_options->m_fontAddCustom.GetValue(), m_options->m_font.GetValue()); } else if (json.has("font")) { this->SetFont(m_options->m_font.GetValue()); From 5e1329805fa88e1e364cf9dc2efb897369c3e32d Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 30 Jan 2024 09:29:42 +0100 Subject: [PATCH 178/249] Fix forgotten renaming --- src/options.cpp | 2 +- src/toolkit.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/options.cpp b/src/options.cpp index 7f9ea84a41f..5b85c016cf8 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -1292,7 +1292,7 @@ Options::Options() m_fontAddCustom.SetInfo("Add custom font", "Add a custom music font"); m_fontAddCustom.Init(); - this->Register(&m_fontAddCustom, "addCustomFont", &m_generalLayout); + this->Register(&m_fontAddCustom, "fontAddCustom", &m_generalLayout); m_graceFactor.SetInfo("Grace factor", "The grace size ratio numerator"); m_graceFactor.Init(0.75, 0.5, 1.0); diff --git a/src/toolkit.cpp b/src/toolkit.cpp index e3ea9553a67..f52653e77a7 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -1129,7 +1129,7 @@ bool Toolkit::SetOptions(const std::string &jsonOptions) m_options->Sync(); // Forcing font resource to be reset if the font is given in the options - if (json.has("addCustomFont")) { + if (json.has("fontAddCustom")) { Resources &resources = m_doc.GetResourcesForModification(); resources.InitFonts(m_options->m_fontAddCustom.GetValue(), m_options->m_font.GetValue()); } From 69516155b02557729188fc43d719fcaae34f0109 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 31 Jan 2024 07:46:59 +0100 Subject: [PATCH 179/249] Update Leipzig font --- data/Leipzig.css | 2 +- data/Leipzig.xml | 3 ++- data/Leipzig/E8F8.xml | 2 +- data/Leipzig/EB9F.xml | 1 + fonts/Leipzig/Leipzig.svg | 8 +++++--- fonts/Leipzig/Leipzig.ttf | Bin 125424 -> 127320 bytes fonts/Leipzig/Leipzig.woff2 | Bin 172349 -> 45096 bytes fonts/Leipzig/leipzig_metadata.json | 16 +++++++++++++--- 8 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 data/Leipzig/EB9F.xml diff --git a/data/Leipzig.css b/data/Leipzig.css index 1c5ceaffd16..3e434c0f8f2 100644 --- a/data/Leipzig.css +++ b/data/Leipzig.css @@ -1,6 +1,6 @@ @font-face { font-family: 'Leipzig'; - src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); + src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/data/Leipzig.xml b/data/Leipzig.xml index e9ec64193a3..fe1e59903e5 100644 --- a/data/Leipzig.xml +++ b/data/Leipzig.xml @@ -776,7 +776,7 @@ - + @@ -792,4 +792,5 @@ + \ No newline at end of file diff --git a/data/Leipzig/E8F8.xml b/data/Leipzig/E8F8.xml index dd25ac4801a..d42573c956c 100644 --- a/data/Leipzig/E8F8.xml +++ b/data/Leipzig/E8F8.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/EB9F.xml b/data/Leipzig/EB9F.xml new file mode 100644 index 00000000000..bfbba5c5de9 --- /dev/null +++ b/data/Leipzig/EB9F.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fonts/Leipzig/Leipzig.svg b/fonts/Leipzig/Leipzig.svg index 5ea289cf111..9672c1539a9 100644 --- a/fonts/Leipzig/Leipzig.svg +++ b/fonts/Leipzig/Leipzig.svg @@ -2,11 +2,11 @@ -Created by FontForge 20220308 at Sun Jul 2 12:58:41 2023 +Created by FontForge 20220308 at Tue Jan 30 18:14:47 2024 By Laurent Pugin Created by Etienne Darbellay, Jean-Francois Marti, Laurent Pugin, and Klaus Rettinghaus. This font is licensed under the SIL Open Font License \(http://scripts.sil.org/OFL\). -Version 5.2.85 +Version 5.2.87 @@ -2402,7 +2402,7 @@ d="M0 375h14v-750h-14v750zM100 375h14v-750h-14v750z" /> +d="M120.146 498.265c0.224774 0 17.1897 -1.82497 17.1897 -14.4827c0 -13.3186 -15.0253 -42.3383 -63.3358 -117.782c-34 -53 -64 -102 -64 -102c-10 6 -3 2 -10 6c74.9234 172.649 99.0583 228.265 120.146 228.265z" /> + diff --git a/fonts/Leipzig/Leipzig.ttf b/fonts/Leipzig/Leipzig.ttf index 5527ea96b9fe5ceacf842b6f3438827cc624d6ec..c674abd7203e3b26399e22ea0ade9812ed358cc6 100644 GIT binary patch delta 7168 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 diff --git a/fonts/Leipzig/Leipzig.woff2 b/fonts/Leipzig/Leipzig.woff2 index e1cfe00239690d99eebd866ffb765c1309c13d08..3f3c9daf924516db943e42317a9cb3a736be4d84 100644 GIT binary patch literal 45096 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 OBjlO?)dlfgss97BHU2#S literal 172349 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

2qU+Ph^*nX^mYhu%L!ZAi&aMgJ<;!(p}3v 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 Date: Wed, 31 Jan 2024 09:08:47 +0100 Subject: [PATCH 180/249] Update xcode deployment target --- Verovio.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index d5ec055fae2..96d420fe72f 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -5072,7 +5072,7 @@ "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ); - MACOSX_DEPLOYMENT_TARGET = 10.9; + MACOSX_DEPLOYMENT_TARGET = 10.15; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = ""; @@ -5124,7 +5124,7 @@ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, ./include/vrv/, ); - MACOSX_DEPLOYMENT_TARGET = 10.9; + MACOSX_DEPLOYMENT_TARGET = 10.15; ONLY_ACTIVE_ARCH = NO; SDKROOT = macosx; USER_HEADER_SEARCH_PATHS = ""; @@ -5140,7 +5140,7 @@ "$(inherited)", NO_HUMDRUM_SUPPORT, ); - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_NAME = "$(TARGET_NAME)"; USER_HEADER_SEARCH_PATHS = ""; }; @@ -5152,7 +5152,7 @@ CODE_SIGN_IDENTITY = "-"; DEAD_CODE_STRIPPING = YES; GCC_PREPROCESSOR_DEFINITIONS = NO_HUMDRUM_SUPPORT; - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_NAME = "$(TARGET_NAME)"; USER_HEADER_SEARCH_PATHS = ""; }; From 444e9a0452f866bf9006eb36eb3d4205783e0448 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 31 Jan 2024 09:09:32 +0100 Subject: [PATCH 181/249] Add --font-fallback and --font-load-all options --- include/vrv/options.h | 5 +++++ src/options.cpp | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/include/vrv/options.h b/include/vrv/options.h index 547609fab66..98a66d74f36 100644 --- a/include/vrv/options.h +++ b/include/vrv/options.h @@ -67,6 +67,8 @@ enum option_ELISION { ELISION_unicode = UNICODE_UNDERTIE }; +enum option_FONT_FALLBACK { FONT_FALLBACK_Leipzig = 0, FONT_FALLBACK_Bravura }; + enum option_FOOTER { FOOTER_none = 0, FOOTER_auto, FOOTER_encoded, FOOTER_always }; enum option_HEADER { HEADER_none = 0, HEADER_auto, HEADER_encoded }; @@ -140,6 +142,7 @@ class Option { static const std::map s_breaks; static const std::map s_condense; static const std::map s_elision; + static const std::map s_fontFallback; static const std::map s_footer; static const std::map s_header; static const std::map s_multiRestStyle; @@ -690,6 +693,8 @@ class Options { OptionDbl m_fingeringScale; OptionString m_font; OptionArray m_fontAddCustom; + OptionIntMap m_fontFallback; + OptionBool m_fontLoadAll; OptionDbl m_graceFactor; OptionBool m_graceRhythmAlign; OptionBool m_graceRightAlign; diff --git a/src/options.cpp b/src/options.cpp index 5b85c016cf8..4dc94e035ca 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -32,6 +32,9 @@ const std::map Option::s_condense const std::map Option::s_elision = { { ELISION_regular, "regular" }, { ELISION_narrow, "narrow" }, { ELISION_wide, "wide" }, { ELISION_unicode, "unicode" } }; +const std::map Option::s_fontFallback + = { { FONT_FALLBACK_Leipzig, "Leipzig" }, { FONT_FALLBACK_Bravura, "Bravura" } }; + const std::map Option::s_footer = { { FOOTER_none, "none" }, { FOOTER_auto, "auto" }, { FOOTER_encoded, "encoded" }, { FOOTER_always, "always" } }; @@ -1294,6 +1297,14 @@ Options::Options() m_fontAddCustom.Init(); this->Register(&m_fontAddCustom, "fontAddCustom", &m_generalLayout); + m_fontFallback.SetInfo("Font fallback", "The music font fallback for missing glyphs"); + m_fontFallback.Init(FONT_FALLBACK_Leipzig, &Option::s_fontFallback); + this->Register(&m_fontFallback, "fontFallback", &m_generalLayout); + + m_fontLoadAll.SetInfo("Font init all", "Load all music fonts"); + m_fontLoadAll.Init(false); + this->Register(&m_fontLoadAll, "fontLoadAll", &m_generalLayout); + m_graceFactor.SetInfo("Grace factor", "The grace size ratio numerator"); m_graceFactor.Init(0.75, 0.5, 1.0); this->Register(&m_graceFactor, "graceFactor", &m_generalLayout); From 0506204d2509390371732413e340f17bb4894358 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 31 Jan 2024 09:22:29 +0100 Subject: [PATCH 182/249] Adjust Resources class with the new options --- include/vrv/resources.h | 37 +++++++++----- src/resources.cpp | 110 +++++++++++++++++++++++++++++++--------- src/toolkit.cpp | 28 +++++++--- 3 files changed, 134 insertions(+), 41 deletions(-) diff --git a/include/vrv/resources.h b/include/vrv/resources.h index bd3e3594c8a..6d1bb1244b8 100644 --- a/include/vrv/resources.h +++ b/include/vrv/resources.h @@ -56,9 +56,18 @@ class Resources { */ ///@{ /** Init the SMufL music and text fonts */ - bool InitFonts(const std::vector &extraFonts, const std::string &defaultFont); + bool InitFonts(); + /** Set the font to be used and loads it if necessary */ + bool SetFont(const std::string &fontName); + /** Add custom (external) fonts */ + bool AddCustom(const std::vector &extraFonts); + /** Load all music fonts available in the resource directory */ + bool LoadAll(); + /** Set the fallback font (Leipzig or Bravura) when some glyphs are missing in the current font */ + bool SetFallback(const std::string &fontName); /** Init the text font (bounding boxes and ASCII only) */ bool InitTextFont(const std::string &fontName, const StyleAttributes &style); + /** Select a particular font */ bool SetCurrentFont(const std::string &fontName, bool allowLoading = false); std::string GetCurrentFont() const { return m_currentFontName; } @@ -82,6 +91,11 @@ class Resources { */ bool IsSmuflFallbackNeeded(const std::u32string &text) const; + /** + * Check if the current font is the fallback font + */ + bool IsCurrentFontFallback() const; + /** * Text fonts */ @@ -103,33 +117,32 @@ class Resources { private: class LoadedFont { public: - // LoadedFont() {}; - LoadedFont( - const std::string &name, const std::string &path, const GlyphTable &glyphTable, bool useFallback = true) - : m_name(name), m_path(path), m_glyphTable(glyphTable), m_useFallback(useFallback){}; + LoadedFont(const std::string &name, bool isFallback) : m_name(name), m_isFallback(isFallback){}; ~LoadedFont(){}; const std::string GetName() const { return m_name; }; - const std::string GetPath() const { return m_path; }; const GlyphTable &GetGlyphTable() const { return m_glyphTable; }; - bool useFallback() const { return m_useFallback; }; + GlyphTable &GetGlyphTableForModification() { return m_glyphTable; }; + bool isFallback() const { return m_isFallback; }; private: std::string m_name; - /** The path to the resources directory (e.g., for the svg/ subdirectory with fonts as XML */ - std::string m_path; /** The loaded SMuFL font */ GlyphTable m_glyphTable; - /** If the font have a fallback when a glyph is not present **/ - const bool m_useFallback; + /** If the font needs to fallback when a glyph is not present **/ + const bool m_isFallback; }; - bool LoadFont(const std::string &fontName, bool withFallback = true, bool buildNameTable = false); + bool LoadFont(const std::string &fontName); + const GlyphTable &GetCurrentGlyphTable() const { return m_loadedFonts.at(m_currentFontName).GetGlyphTable(); }; + const GlyphTable &GetFallbackGlyphTable() const { return m_loadedFonts.at(m_fallbackFontName).GetGlyphTable(); }; std::string m_path; std::string m_defaultFontName; + std::string m_fallbackFontName; std::map m_loadedFonts; std::string m_currentFontName; + /** A text font used for bounding box calculations */ GlyphTextMap m_textFont; mutable StyleAttributes m_currentStyle; diff --git a/src/resources.cpp b/src/resources.cpp index 1730742b5a0..7f82efcb632 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -9,6 +9,7 @@ //---------------------------------------------------------------------------- +#include #include //---------------------------------------------------------------------------- @@ -21,6 +22,9 @@ #include "pugixml.hpp" +#define BRAVURA "Bravura" +#define LEIPZIG "Leipzig" + namespace vrv { //---------------------------------------------------------------------------- @@ -50,26 +54,18 @@ Resources::Resources() m_currentStyle = k_defaultStyle; } -bool Resources::InitFonts(const std::vector &extraFonts, const std::string &defaultFont) +bool Resources::InitFonts() { - // We need to rethink this for handling multiple fonts in an optimal way + m_loadedFonts.clear(); // Font Bravura first. As it is expected to have always all symbols we build the code -> name table from it - if (!LoadFont("Bravura", false, true)) LogError("Bravura font could not be loaded."); + if (!LoadFont(BRAVURA)) LogError("Bravura font could not be loaded."); // Leipzig is our initial default font - if (!LoadFont("Leipzig", false)) LogError("Leipzig font could not be loaded."); - // options supplied fonts - for (const std::string &font : extraFonts) { - if (!LoadFont(font, true)) LogError("Option supplied font %s could not be loaded.", font.c_str()); - } - // and the default font provided in options, if it is not on: of the previous - if (!defaultFont.empty() && !IsFontLoaded(defaultFont)) { - if (!LoadFont(defaultFont, false)) - LogError("%s default font could not be loaded. Fallballing to Leipzig", defaultFont.c_str()); - } + if (!LoadFont(LEIPZIG)) LogError("Leipzig font could not be loaded."); - m_defaultFontName = IsFontLoaded(defaultFont) ? defaultFont : "Leipzig"; + m_defaultFontName = LEIPZIG; m_currentFontName = m_defaultFontName; + m_fallbackFontName = m_defaultFontName; struct TextFontInfo_type { const StyleAttributes m_style; @@ -94,6 +90,57 @@ bool Resources::InitFonts(const std::vector &extraFonts, const std: return true; } +bool Resources::SetFont(const std::string &fontName) +{ + // and the default font provided in options, if it is not one of the previous + if (!fontName.empty() && !IsFontLoaded(fontName)) { + if (!LoadFont(fontName)) { + LogError("%s font could not be loaded.", fontName.c_str()); + return false; + } + } + + m_defaultFontName = IsFontLoaded(fontName) ? fontName : LEIPZIG; + m_currentFontName = m_defaultFontName; + + return true; +} + +bool Resources::AddCustom(const std::vector &extraFonts) +{ + bool success = true; + // options supplied fonts + for (const std::string &fontName : extraFonts) { + success = success && LoadFont(fontName); + if (!success) { + LogError("Option supplied font %s could not be loaded.", fontName.c_str()); + } + } + return success; +} + +bool Resources::LoadAll() +{ + bool success = true; + std::string path = Resources::GetPath() + "/"; + for (const std::filesystem::directory_entry &entry : std::filesystem::directory_iterator(path)) { + const std::filesystem::path path = entry.path(); + if (path.has_extension() && path.has_stem() && path.extension() == ".xml") { + const std::string fontName = path.stem(); + if (!IsFontLoaded(fontName)) { + success = success && LoadFont(fontName); + } + } + } + return success; +} + +bool Resources::SetFallback(const std::string &fontName) +{ + m_fallbackFontName = fontName; + return true; +} + bool Resources::SetCurrentFont(const std::string &fontName, bool allowLoading) { if (IsFontLoaded(fontName)) { @@ -111,12 +158,21 @@ bool Resources::SetCurrentFont(const std::string &fontName, bool allowLoading) const Glyph *Resources::GetGlyph(char32_t smuflCode) const { - return GetCurrentGlyphTable().count(smuflCode) ? &GetCurrentGlyphTable().at(smuflCode) : NULL; + if (GetCurrentGlyphTable().count(smuflCode)) { + return &GetCurrentGlyphTable().at(smuflCode); + } + else if (!this->IsCurrentFontFallback()) { + const GlyphTable &fallbackTable = this->GetFallbackGlyphTable(); + return (fallbackTable.count(smuflCode)) ? &fallbackTable.at(smuflCode) : NULL; + } + else { + return NULL; + } } const Glyph *Resources::GetGlyph(const std::string &smuflName) const { - return m_glyphNameTable.count(smuflName) ? &GetCurrentGlyphTable().at(m_glyphNameTable.at(smuflName)) : NULL; + return (this->GetGlyphCode(smuflName)) ? &GetCurrentGlyphTable().at(this->GetGlyphCode(smuflName)) : NULL; } char32_t Resources::GetGlyphCode(const std::string &smuflName) const @@ -126,7 +182,7 @@ char32_t Resources::GetGlyphCode(const std::string &smuflName) const bool Resources::IsSmuflFallbackNeeded(const std::u32string &text) const { - if (!m_loadedFonts.at(m_currentFontName).useFallback()) { + if (m_loadedFonts.at(m_currentFontName).isFallback()) { return false; } for (char32_t c : text) { @@ -136,6 +192,11 @@ bool Resources::IsSmuflFallbackNeeded(const std::u32string &text) const return false; } +bool Resources::IsCurrentFontFallback() const +{ + return (m_currentFontName == m_fallbackFontName); +} + bool Resources::FontHasGlyphAvailable(const std::string &fontName, char32_t smuflCode) const { if (!IsFontLoaded(fontName)) { @@ -194,7 +255,7 @@ char32_t Resources::GetSmuflGlyphForUnicodeChar(const char32_t unicodeChar) return smuflChar; } -bool Resources::LoadFont(const std::string &fontName, bool withFallback, bool buildNameTable) +bool Resources::LoadFont(const std::string &fontName) { pugi::xml_document doc; const std::string filename = Resources::GetPath() + "/" + fontName + ".xml"; @@ -210,7 +271,13 @@ bool Resources::LoadFont(const std::string &fontName, bool withFallback, bool bu return false; } - GlyphTable glyphTable; + bool buildNameTable = (fontName == BRAVURA) ? true : false; + bool isFallback = ((fontName == BRAVURA) || (fontName == LEIPZIG)) ? true : false; + + m_loadedFonts.insert(std::pair(fontName, Resources::LoadedFont(fontName, isFallback))); + LoadedFont &font = m_loadedFonts.at(fontName); + + GlyphTable &glyphTable = font.GetGlyphTableForModification(); const int unitsPerEm = atoi(root.attribute("units-per-em").value()); @@ -249,14 +316,11 @@ bool Resources::LoadFont(const std::string &fontName, bool withFallback, bool bu } } - if (buildNameTable && glyphTable.size() < SMUFL_COUNT) { + if (isFallback && glyphTable.size() < SMUFL_COUNT) { LogError("Expected %d default SMuFL glyphs but could load only %d.", SMUFL_COUNT, glyphTable.size()); return false; } - m_loadedFonts.insert(std::pair( - fontName, Resources::LoadedFont(fontName, m_path, glyphTable, withFallback))); - return true; } diff --git a/src/toolkit.cpp b/src/toolkit.cpp index f52653e77a7..9de49e5b2ca 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -72,13 +72,13 @@ Toolkit::Toolkit(bool initFont) m_humdrumBuffer = NULL; m_cString = NULL; - m_options = m_doc.GetOptions(); - if (initFont) { Resources &resources = m_doc.GetResourcesForModification(); - resources.InitFonts(m_options->m_fontAddCustom.GetValue(), m_options->m_font.GetValue()); + resources.InitFonts(); } + m_options = m_doc.GetOptions(); + m_editorToolkit = NULL; #ifndef NO_RUNTIME @@ -117,7 +117,15 @@ bool Toolkit::SetResourcePath(const std::string &path) { Resources &resources = m_doc.GetResourcesForModification(); resources.SetPath(path); - return resources.InitFonts(m_options->m_fontAddCustom.GetValue(), m_options->m_font.GetValue()); + bool success = resources.InitFonts(); + success = success && resources.SetFallback(m_options->m_fontFallback.GetStrValue()); + if (m_options->m_fontLoadAll.GetValue()) { + success = success && resources.LoadAll(); + } + if (!m_options->m_fontAddCustom.GetValue().empty()) { + success = success && resources.AddCustom(m_options->m_fontAddCustom.GetValue()); + } + return success; } bool Toolkit::SetFont(const std::string &fontName) @@ -1131,11 +1139,19 @@ bool Toolkit::SetOptions(const std::string &jsonOptions) // Forcing font resource to be reset if the font is given in the options if (json.has("fontAddCustom")) { Resources &resources = m_doc.GetResourcesForModification(); - resources.InitFonts(m_options->m_fontAddCustom.GetValue(), m_options->m_font.GetValue()); + resources.AddCustom(m_options->m_fontAddCustom.GetValue()); } - else if (json.has("font")) { + if (json.has("font")) { this->SetFont(m_options->m_font.GetValue()); } + if (json.has("fontFallback")) { + Resources &resources = m_doc.GetResourcesForModification(); + resources.SetFallback(m_options->m_fontFallback.GetStrValue()); + } + if (json.has("fontLoadAll")) { + Resources &resources = m_doc.GetResourcesForModification(); + resources.LoadAll(); + } return true; } From 1ab043a261a6bdfb6eb06a0205bf5aea090d9dbe Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 31 Jan 2024 09:28:56 +0100 Subject: [PATCH 183/249] Change SVG map key to const Glyph * --- include/vrv/svgdevicecontext.h | 2 +- src/svgdevicecontext.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/vrv/svgdevicecontext.h b/include/vrv/svgdevicecontext.h index cacd7353bbd..58c4b2798ec 100644 --- a/include/vrv/svgdevicecontext.h +++ b/include/vrv/svgdevicecontext.h @@ -349,7 +349,7 @@ class SvgDeviceContext : public DeviceContext { std::string m_refId; }; const std::string InsertGlyphRef(const Glyph *glyph); - std::map m_smuflGlyphs; + std::map m_smuflGlyphs; std::map m_glyphCodesCounter; // pugixml data diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index 8dc8f4184e6..c91e7378264 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -99,8 +99,8 @@ const std::string SvgDeviceContext::InsertGlyphRef(const Glyph *glyph) const std::string code = glyph->GetCodeStr(); const std::string path = glyph->GetPath(); - if (m_smuflGlyphs.find(path) != m_smuflGlyphs.end()) { - return m_smuflGlyphs.at(path).GetRefId(); + if (m_smuflGlyphs.find(glyph) != m_smuflGlyphs.end()) { + return m_smuflGlyphs.at(glyph).GetRefId(); } int count; @@ -112,7 +112,7 @@ const std::string SvgDeviceContext::InsertGlyphRef(const Glyph *glyph) } GlyphRef ref(glyph, count, m_glyphPostfixId); const std::string id = ref.GetRefId(); - m_smuflGlyphs.insert(std::pair(path, ref)); + m_smuflGlyphs.insert(std::pair(glyph, ref)); m_glyphCodesCounter[code] = count + 1; return id; @@ -205,9 +205,9 @@ void SvgDeviceContext::Commit(bool xml_declaration) pugi::xml_document sourceDoc; // for each needed glyph - for (const std::pair entry : m_smuflGlyphs) { + for (const std::pair entry : m_smuflGlyphs) { // load the XML file that contains it as a pugi::xml_document - std::ifstream source(entry.first); + std::ifstream source(entry.first->GetPath()); sourceDoc.load(source); // copy all the nodes inside into the master document From 062e4a19aa2a26bd592149890df3440fe142e80d Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 31 Jan 2024 09:31:13 +0100 Subject: [PATCH 184/249] Fix formatting --- include/vrv/svgdevicecontext.h | 2 +- src/svgdevicecontext.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/vrv/svgdevicecontext.h b/include/vrv/svgdevicecontext.h index 58c4b2798ec..b76ed3a80dc 100644 --- a/include/vrv/svgdevicecontext.h +++ b/include/vrv/svgdevicecontext.h @@ -349,7 +349,7 @@ class SvgDeviceContext : public DeviceContext { std::string m_refId; }; const std::string InsertGlyphRef(const Glyph *glyph); - std::map m_smuflGlyphs; + std::map m_smuflGlyphs; std::map m_glyphCodesCounter; // pugixml data diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index c91e7378264..32b0605d80f 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -112,7 +112,7 @@ const std::string SvgDeviceContext::InsertGlyphRef(const Glyph *glyph) } GlyphRef ref(glyph, count, m_glyphPostfixId); const std::string id = ref.GetRefId(); - m_smuflGlyphs.insert(std::pair(glyph, ref)); + m_smuflGlyphs.insert(std::pair(glyph, ref)); m_glyphCodesCounter[code] = count + 1; return id; From 227d923d8fc1a3a5ae3aba9773e3cf9bf8b31196 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 31 Jan 2024 09:49:05 +0100 Subject: [PATCH 185/249] Remove unused variable --- src/svgdevicecontext.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index 32b0605d80f..e42d4de430b 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -97,7 +97,6 @@ SvgDeviceContext::GlyphRef::GlyphRef(const Glyph *glyph, int idx, const std::str const std::string SvgDeviceContext::InsertGlyphRef(const Glyph *glyph) { const std::string code = glyph->GetCodeStr(); - const std::string path = glyph->GetPath(); if (m_smuflGlyphs.find(glyph) != m_smuflGlyphs.end()) { return m_smuflGlyphs.at(glyph).GetRefId(); From 72d7de65d826a95a68229bfcd3ac0a8a95f2d026 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 31 Jan 2024 09:57:44 +0100 Subject: [PATCH 186/249] Code commenting and renaming --- include/vrv/svgdevicecontext.h | 9 ++++----- src/svgdevicecontext.cpp | 16 ++++++++++------ 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/include/vrv/svgdevicecontext.h b/include/vrv/svgdevicecontext.h index b76ed3a80dc..c00be84fe5f 100644 --- a/include/vrv/svgdevicecontext.h +++ b/include/vrv/svgdevicecontext.h @@ -332,15 +332,14 @@ class SvgDeviceContext : public DeviceContext { // including any glyph for the same code but from different fonts. // They will be added at the end of the file as . // With multiple font support we need to keep track of: - // a) the path to the glyph (to check if is has been already added) + // a) the glyph (to check if is has been already added) // b) the id assigned to glyphs on the (that is has been consumed by the already rendered elements) // To keep things as similar as possible to previous versions we generate ids with as uuuu-ss (where uuuu is the // Smulf code for the glyph and ss the per-session suffix) for most of the cases (single font usage). When the same - // glyph has been used from several fonts we use uuuu-n-ss where n indicates the collision count . Maybe we don't - // need to keep this pattern and can simplify this. + // glyph has been used from several fonts we use uuuu-n-ss where n indicates the collision count. class GlyphRef { public: - GlyphRef(const Glyph *glyph, int idx, const std::string &postfix); + GlyphRef(const Glyph *glyph, int count, const std::string &postfix); const Glyph *GetGlyph() const { return m_glyph; }; const std::string &GetRefId() const { return m_refId; }; @@ -350,7 +349,7 @@ class SvgDeviceContext : public DeviceContext { }; const std::string InsertGlyphRef(const Glyph *glyph); std::map m_smuflGlyphs; - std::map m_glyphCodesCounter; + std::map m_glyphCodeFontCounter; // pugixml data pugi::xml_document m_svgDoc; diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index e42d4de430b..350fab421bb 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -84,13 +84,14 @@ bool SvgDeviceContext::CopyFileToStream(const std::string &filename, std::ostrea return true; } -SvgDeviceContext::GlyphRef::GlyphRef(const Glyph *glyph, int idx, const std::string &postfix) : m_glyph(glyph) +SvgDeviceContext::GlyphRef::GlyphRef(const Glyph *glyph, int count, const std::string &postfix) : m_glyph(glyph) { - if (idx == 0) { + // Add the counter only when necessary (more than one font for that glyph) + if (count == 0) { m_refId = StringFormat("%s-%s", glyph->GetCodeStr().c_str(), postfix.c_str()); } else { - m_refId = StringFormat("%s-%d-%s", glyph->GetCodeStr().c_str(), idx, postfix.c_str()); + m_refId = StringFormat("%s-%d-%s", glyph->GetCodeStr().c_str(), count, postfix.c_str()); } }; @@ -98,21 +99,24 @@ const std::string SvgDeviceContext::InsertGlyphRef(const Glyph *glyph) { const std::string code = glyph->GetCodeStr(); + // We have already used this glyph if (m_smuflGlyphs.find(glyph) != m_smuflGlyphs.end()) { return m_smuflGlyphs.at(glyph).GetRefId(); } int count; - if (m_glyphCodesCounter.find(code) == m_glyphCodesCounter.end()) { + // This is the first time we have a glyph with this code + if (m_glyphCodeFontCounter.find(code) == m_glyphCodeFontCounter.end()) { count = 0; } + // We used it but with another font else { - count = m_glyphCodesCounter[(code)]; + count = m_glyphCodeFontCounter[(code)]; } GlyphRef ref(glyph, count, m_glyphPostfixId); const std::string id = ref.GetRefId(); m_smuflGlyphs.insert(std::pair(glyph, ref)); - m_glyphCodesCounter[code] = count + 1; + m_glyphCodeFontCounter[code] = count + 1; return id; } From dfded424804e388728fb4de1d021d2fe19539263 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 31 Jan 2024 14:39:11 +0100 Subject: [PATCH 187/249] Refactoring of View::DrawSmuflCodeWithCustomFont --- include/vrv/doc.h | 14 +++++++------- include/vrv/resources.h | 7 ++++++- include/vrv/view.h | 2 +- src/doc.cpp | 30 ++++++++++++++++-------------- src/resources.cpp | 12 ++++++++---- src/view_element.cpp | 22 ++++++---------------- src/view_graph.cpp | 11 +++++------ 7 files changed, 49 insertions(+), 49 deletions(-) diff --git a/include/vrv/doc.h b/include/vrv/doc.h index 687f6f068e2..678d215a5fe 100644 --- a/include/vrv/doc.h +++ b/include/vrv/doc.h @@ -176,13 +176,13 @@ class Doc : public Object { * @name Get the height or width for a glyph taking into account the staff and grace sizes */ ///@{ - int GetGlyphHeight(char32_t code, int staffSize, bool graceSize) const; - int GetGlyphWidth(char32_t code, int staffSize, bool graceSize) const; - int GetGlyphLeft(char32_t code, int staffSize, bool graceSize) const; - int GetGlyphRight(char32_t code, int staffSize, bool graceSize) const; - int GetGlyphBottom(char32_t code, int staffSize, bool graceSize) const; - int GetGlyphTop(char32_t code, int staffSize, bool graceSize) const; - int GetGlyphAdvX(char32_t code, int staffSize, bool graceSize) const; + int GetGlyphHeight(char32_t code, int staffSize, bool graceSize, const std::string &fontName = "") const; + int GetGlyphWidth(char32_t code, int staffSize, bool graceSize, const std::string &fontName = "") const; + int GetGlyphLeft(char32_t code, int staffSize, bool graceSize, const std::string &fontName = "") const; + int GetGlyphRight(char32_t code, int staffSize, bool graceSize, const std::string &fontName = "") const; + int GetGlyphBottom(char32_t code, int staffSize, bool graceSize, const std::string &fontName = "") const; + int GetGlyphTop(char32_t code, int staffSize, bool graceSize, const std::string &fontName = "") const; + int GetGlyphAdvX(char32_t code, int staffSize, bool graceSize, const std::string &fontName = "") const; int GetDrawingUnit(int staffSize) const; int GetDrawingDoubleUnit(int staffSize) const; int GetDrawingStaffSize(int staffSize) const; diff --git a/include/vrv/resources.h b/include/vrv/resources.h index 6d1bb1244b8..5caff86d04b 100644 --- a/include/vrv/resources.h +++ b/include/vrv/resources.h @@ -79,7 +79,7 @@ class Resources { */ ///@{ /** Returns the glyph (if exists) for a glyph code in the current SMuFL font */ - const Glyph *GetGlyph(char32_t smuflCode) const; + const Glyph *GetGlyph(char32_t smuflCode, const std::string &fontname = "") const; /** Returns the glyph (if exists) for a glyph name in the current SMuFL font */ const Glyph *GetGlyph(const std::string &smuflName) const; /** Returns the glyph (if exists) for a glyph name in the current SMuFL font */ @@ -134,6 +134,11 @@ class Resources { bool LoadFont(const std::string &fontName); + const bool HasGlyphTableFor(const std::string &fontname) const { return m_loadedFonts.contains(fontname); } + const GlyphTable &GetGlyphTableFor(const std::string &fontname) const + { + return m_loadedFonts.at(fontname).GetGlyphTable(); + } const GlyphTable &GetCurrentGlyphTable() const { return m_loadedFonts.at(m_currentFontName).GetGlyphTable(); }; const GlyphTable &GetFallbackGlyphTable() const { return m_loadedFonts.at(m_fallbackFontName).GetGlyphTable(); }; diff --git a/include/vrv/view.h b/include/vrv/view.h index 7f8c3750def..5ccc22bee77 100644 --- a/include/vrv/view.h +++ b/include/vrv/view.h @@ -567,7 +567,7 @@ class View { DeviceContext *dc, int y1, SegmentedLine &line, int width, int dashLength = 0, int gapLength = 0); void DrawSmuflCode( DeviceContext *dc, int x, int y, char32_t code, int staffSize, bool dimin, bool setBBGlyph = false); - int DrawSmuflCodeWithCustomFont(DeviceContext *dc, const std::string &customFont, int x, int y, char32_t code, + void DrawSmuflCodeWithCustomFont(DeviceContext *dc, const std::string &customFont, int x, int y, char32_t code, int staffSize, bool dimin, bool setBBGlyph = false); void DrawThickBezierCurve( diff --git a/src/doc.cpp b/src/doc.cpp index 5f36ed7264a..2499ee250bb 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -1584,11 +1584,11 @@ void Doc::CollectVisibleScores() } } -int Doc::GetGlyphHeight(char32_t code, int staffSize, bool graceSize) const +int Doc::GetGlyphHeight(char32_t code, int staffSize, bool graceSize, const std::string &fontname) const { int x, y, w, h; const Resources &resources = this->GetResources(); - const Glyph *glyph = resources.GetGlyph(code); + const Glyph *glyph = resources.GetGlyph(code, fontname); assert(glyph); glyph->GetBoundingBox(x, y, w, h); h = h * m_drawingSmuflFontSize / glyph->GetUnitsPerEm(); @@ -1597,11 +1597,11 @@ int Doc::GetGlyphHeight(char32_t code, int staffSize, bool graceSize) const return h; } -int Doc::GetGlyphWidth(char32_t code, int staffSize, bool graceSize) const +int Doc::GetGlyphWidth(char32_t code, int staffSize, bool graceSize, const std::string &fontname) const { int x, y, w, h; const Resources &resources = this->GetResources(); - const Glyph *glyph = resources.GetGlyph(code); + const Glyph *glyph = resources.GetGlyph(code, fontname); assert(glyph); glyph->GetBoundingBox(x, y, w, h); w = w * m_drawingSmuflFontSize / glyph->GetUnitsPerEm(); @@ -1610,10 +1610,10 @@ int Doc::GetGlyphWidth(char32_t code, int staffSize, bool graceSize) const return w; } -int Doc::GetGlyphAdvX(char32_t code, int staffSize, bool graceSize) const +int Doc::GetGlyphAdvX(char32_t code, int staffSize, bool graceSize, const std::string &fontname) const { const Resources &resources = this->GetResources(); - const Glyph *glyph = resources.GetGlyph(code); + const Glyph *glyph = resources.GetGlyph(code, fontname); assert(glyph); int advX = glyph->GetHorizAdvX(); advX = advX * m_drawingSmuflFontSize / glyph->GetUnitsPerEm(); @@ -1640,11 +1640,11 @@ Point Doc::ConvertFontPoint(const Glyph *glyph, const Point &fontPoint, int staf return point; } -int Doc::GetGlyphLeft(char32_t code, int staffSize, bool graceSize) const +int Doc::GetGlyphLeft(char32_t code, int staffSize, bool graceSize, const std::string &fontname) const { int x, y, w, h; const Resources &resources = this->GetResources(); - const Glyph *glyph = resources.GetGlyph(code); + const Glyph *glyph = resources.GetGlyph(code, fontname); assert(glyph); glyph->GetBoundingBox(x, y, w, h); x = x * m_drawingSmuflFontSize / glyph->GetUnitsPerEm(); @@ -1653,16 +1653,17 @@ int Doc::GetGlyphLeft(char32_t code, int staffSize, bool graceSize) const return x; } -int Doc::GetGlyphRight(char32_t code, int staffSize, bool graceSize) const +int Doc::GetGlyphRight(char32_t code, int staffSize, bool graceSize, const std::string &fontname) const { - return this->GetGlyphLeft(code, staffSize, graceSize) + this->GetGlyphWidth(code, staffSize, graceSize); + return this->GetGlyphLeft(code, staffSize, graceSize, fontname) + + this->GetGlyphWidth(code, staffSize, graceSize, fontname); } -int Doc::GetGlyphBottom(char32_t code, int staffSize, bool graceSize) const +int Doc::GetGlyphBottom(char32_t code, int staffSize, bool graceSize, const std::string &fontname) const { int x, y, w, h; const Resources &resources = this->GetResources(); - const Glyph *glyph = resources.GetGlyph(code); + const Glyph *glyph = resources.GetGlyph(code, fontname); assert(glyph); glyph->GetBoundingBox(x, y, w, h); y = y * m_drawingSmuflFontSize / glyph->GetUnitsPerEm(); @@ -1671,9 +1672,10 @@ int Doc::GetGlyphBottom(char32_t code, int staffSize, bool graceSize) const return y; } -int Doc::GetGlyphTop(char32_t code, int staffSize, bool graceSize) const +int Doc::GetGlyphTop(char32_t code, int staffSize, bool graceSize, const std::string &fontname) const { - return this->GetGlyphBottom(code, staffSize, graceSize) + this->GetGlyphHeight(code, staffSize, graceSize); + return this->GetGlyphBottom(code, staffSize, graceSize, fontname) + + this->GetGlyphHeight(code, staffSize, graceSize, fontname); } int Doc::GetTextGlyphHeight(char32_t code, const FontInfo *font, bool graceSize) const diff --git a/src/resources.cpp b/src/resources.cpp index 7f82efcb632..734f9c92e2a 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -156,14 +156,18 @@ bool Resources::SetCurrentFont(const std::string &fontName, bool allowLoading) } } -const Glyph *Resources::GetGlyph(char32_t smuflCode) const +const Glyph *Resources::GetGlyph(char32_t smuflCode, const std::string &fontname) const { - if (GetCurrentGlyphTable().count(smuflCode)) { + if (!fontname.empty() && this->HasGlyphTableFor(fontname)) { + const GlyphTable &fontGlyphTable = this->GetGlyphTableFor(fontname); + if (fontGlyphTable.contains(smuflCode)) return &fontGlyphTable.at(smuflCode); + } + if (GetCurrentGlyphTable().contains(smuflCode)) { return &GetCurrentGlyphTable().at(smuflCode); } else if (!this->IsCurrentFontFallback()) { const GlyphTable &fallbackTable = this->GetFallbackGlyphTable(); - return (fallbackTable.count(smuflCode)) ? &fallbackTable.at(smuflCode) : NULL; + return (fallbackTable.contains(smuflCode)) ? &fallbackTable.at(smuflCode) : NULL; } else { return NULL; @@ -177,7 +181,7 @@ const Glyph *Resources::GetGlyph(const std::string &smuflName) const char32_t Resources::GetGlyphCode(const std::string &smuflName) const { - return m_glyphNameTable.count(smuflName) ? m_glyphNameTable.at(smuflName) : 0; + return m_glyphNameTable.contains(smuflName) ? m_glyphNameTable.at(smuflName) : 0; } bool Resources::IsSmuflFallbackNeeded(const std::u32string &text) const diff --git a/src/view_element.cpp b/src/view_element.cpp index 3bd292d45af..b5b98db094f 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -687,12 +687,7 @@ void View::DrawClef(DeviceContext *dc, LayerElement *element, Layer *layer, Staf dc->StartGraphic(element, "", element->GetID()); - if (clef->HasFontname() && m_doc->GetResources().FontHasGlyphAvailable(clef->GetFontname(), sym)) { - this->DrawSmuflCodeWithCustomFont(dc, clef->GetFontname(), x, y, sym, staff->m_drawingStaffSize, false); - } - else { - this->DrawSmuflCode(dc, x, y, sym, staff->m_drawingStaffSize, false); - } + this->DrawSmuflCodeWithCustomFont(dc, clef->GetFontname(), x, y, sym, staff->m_drawingStaffSize, false); if (m_doc->IsFacs() && element->HasFacs()) { const int noteHeight @@ -1134,19 +1129,14 @@ void View::DrawMeterSig(DeviceContext *dc, MeterSig *meterSig, Staff *staff, int const int glyphSize = staff->GetDrawingStaffNotationSize(); if (enclosingFront) { - this->DrawSmuflCode(dc, x, y, enclosingFront, glyphSize, false); - x += m_doc->GetGlyphWidth(enclosingFront, glyphSize, false); + this->DrawSmuflCodeWithCustomFont(dc, meterSig->GetFontname(), x, y, enclosingFront, glyphSize, false); + x += m_doc->GetGlyphWidth(enclosingFront, glyphSize, false, meterSig->GetFontname()); } if (meterSig->HasSym() || meterSig->HasGlyphNum() || meterSig->HasGlyphName()) { const char32_t code = meterSig->GetSymbolGlyph(); - if (meterSig->HasFontname() && m_doc->GetResources().FontHasGlyphAvailable(meterSig->GetFontname(), code)) { - x += this->DrawSmuflCodeWithCustomFont(dc, meterSig->GetFontname(), x, y, code, glyphSize, false); - } - else { - this->DrawSmuflCode(dc, x, y, code, glyphSize, false); - x += m_doc->GetGlyphWidth(code, glyphSize, false); - } + this->DrawSmuflCodeWithCustomFont(dc, meterSig->GetFontname(), x, y, code, glyphSize, false); + x += m_doc->GetGlyphWidth(code, glyphSize, false, meterSig->GetFontname()); } else if (meterSig->GetForm() == METERFORM_num) { x += this->DrawMeterSigFigures(dc, x, y, meterSig, 0, staff); @@ -1156,7 +1146,7 @@ void View::DrawMeterSig(DeviceContext *dc, MeterSig *meterSig, Staff *staff, int } if (enclosingBack) { - this->DrawSmuflCode(dc, x, y, enclosingBack, glyphSize, false); + this->DrawSmuflCodeWithCustomFont(dc, meterSig->GetFontname(), x, y, enclosingBack, glyphSize, false); } dc->EndGraphic(meterSig, this); diff --git a/src/view_graph.cpp b/src/view_graph.cpp index 2970293d56a..240c9b5e07d 100644 --- a/src/view_graph.cpp +++ b/src/view_graph.cpp @@ -276,23 +276,22 @@ void View::DrawEnclosingBrackets(DeviceContext *dc, int x, int y, int height, in horizontalThickness, verticalThickness); } -int View::DrawSmuflCodeWithCustomFont(DeviceContext *dc, const std::string &customFont, int x, int y, char32_t code, +void View::DrawSmuflCodeWithCustomFont(DeviceContext *dc, const std::string &customFont, int x, int y, char32_t code, int staffSize, bool dimin, bool setBBGlyph) { - assert(!customFont.empty()); + if (customFont.empty()) { + this->DrawSmuflCode(dc, x, y, code, staffSize, dimin, setBBGlyph); + return; + } Resources &resources = m_doc->GetResourcesForModification(); const std::string prevFont = resources.GetCurrentFont(); resources.SetCurrentFont(customFont); - int drawnWidth = m_doc->GetGlyphWidth(code, staffSize, false); - DrawSmuflCode(dc, x, y, code, staffSize, dimin, setBBGlyph); resources.SetCurrentFont(prevFont); - - return drawnWidth; } void View::DrawSmuflCode(DeviceContext *dc, int x, int y, char32_t code, int staffSize, bool dimin, bool setBBGlyph) From 1a40d54ee0c579563f50f2023064b28b1f259420 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 31 Jan 2024 15:03:17 +0100 Subject: [PATCH 188/249] Change font globally DrawClef and DrawMeterSig --- include/vrv/doc.h | 14 +++++++------- include/vrv/resources.h | 7 +------ include/vrv/view.h | 4 ++-- src/doc.cpp | 32 +++++++++++++++----------------- src/resources.cpp | 6 +----- src/view_element.cpp | 36 ++++++++++++++++++++++++++++++------ src/view_graph.cpp | 2 ++ 7 files changed, 58 insertions(+), 43 deletions(-) diff --git a/include/vrv/doc.h b/include/vrv/doc.h index 678d215a5fe..687f6f068e2 100644 --- a/include/vrv/doc.h +++ b/include/vrv/doc.h @@ -176,13 +176,13 @@ class Doc : public Object { * @name Get the height or width for a glyph taking into account the staff and grace sizes */ ///@{ - int GetGlyphHeight(char32_t code, int staffSize, bool graceSize, const std::string &fontName = "") const; - int GetGlyphWidth(char32_t code, int staffSize, bool graceSize, const std::string &fontName = "") const; - int GetGlyphLeft(char32_t code, int staffSize, bool graceSize, const std::string &fontName = "") const; - int GetGlyphRight(char32_t code, int staffSize, bool graceSize, const std::string &fontName = "") const; - int GetGlyphBottom(char32_t code, int staffSize, bool graceSize, const std::string &fontName = "") const; - int GetGlyphTop(char32_t code, int staffSize, bool graceSize, const std::string &fontName = "") const; - int GetGlyphAdvX(char32_t code, int staffSize, bool graceSize, const std::string &fontName = "") const; + int GetGlyphHeight(char32_t code, int staffSize, bool graceSize) const; + int GetGlyphWidth(char32_t code, int staffSize, bool graceSize) const; + int GetGlyphLeft(char32_t code, int staffSize, bool graceSize) const; + int GetGlyphRight(char32_t code, int staffSize, bool graceSize) const; + int GetGlyphBottom(char32_t code, int staffSize, bool graceSize) const; + int GetGlyphTop(char32_t code, int staffSize, bool graceSize) const; + int GetGlyphAdvX(char32_t code, int staffSize, bool graceSize) const; int GetDrawingUnit(int staffSize) const; int GetDrawingDoubleUnit(int staffSize) const; int GetDrawingStaffSize(int staffSize) const; diff --git a/include/vrv/resources.h b/include/vrv/resources.h index 5caff86d04b..6d1bb1244b8 100644 --- a/include/vrv/resources.h +++ b/include/vrv/resources.h @@ -79,7 +79,7 @@ class Resources { */ ///@{ /** Returns the glyph (if exists) for a glyph code in the current SMuFL font */ - const Glyph *GetGlyph(char32_t smuflCode, const std::string &fontname = "") const; + const Glyph *GetGlyph(char32_t smuflCode) const; /** Returns the glyph (if exists) for a glyph name in the current SMuFL font */ const Glyph *GetGlyph(const std::string &smuflName) const; /** Returns the glyph (if exists) for a glyph name in the current SMuFL font */ @@ -134,11 +134,6 @@ class Resources { bool LoadFont(const std::string &fontName); - const bool HasGlyphTableFor(const std::string &fontname) const { return m_loadedFonts.contains(fontname); } - const GlyphTable &GetGlyphTableFor(const std::string &fontname) const - { - return m_loadedFonts.at(fontname).GetGlyphTable(); - } const GlyphTable &GetCurrentGlyphTable() const { return m_loadedFonts.at(m_currentFontName).GetGlyphTable(); }; const GlyphTable &GetFallbackGlyphTable() const { return m_loadedFonts.at(m_fallbackFontName).GetGlyphTable(); }; diff --git a/include/vrv/view.h b/include/vrv/view.h index 5ccc22bee77..c9137403e20 100644 --- a/include/vrv/view.h +++ b/include/vrv/view.h @@ -567,8 +567,8 @@ class View { DeviceContext *dc, int y1, SegmentedLine &line, int width, int dashLength = 0, int gapLength = 0); void DrawSmuflCode( DeviceContext *dc, int x, int y, char32_t code, int staffSize, bool dimin, bool setBBGlyph = false); - void DrawSmuflCodeWithCustomFont(DeviceContext *dc, const std::string &customFont, int x, int y, char32_t code, - int staffSize, bool dimin, bool setBBGlyph = false); + // void DrawSmuflCodeWithCustomFont(DeviceContext *dc, const std::string &customFont, int x, int y, char32_t code, + // int staffSize, bool dimin, bool setBBGlyph = false); void DrawThickBezierCurve( DeviceContext *dc, Point bezier[4], int thickness, int staffSize, int penWidth, int penStyle = AxSOLID); diff --git a/src/doc.cpp b/src/doc.cpp index 2499ee250bb..5b13dd476d7 100644 --- a/src/doc.cpp +++ b/src/doc.cpp @@ -1584,11 +1584,11 @@ void Doc::CollectVisibleScores() } } -int Doc::GetGlyphHeight(char32_t code, int staffSize, bool graceSize, const std::string &fontname) const +int Doc::GetGlyphHeight(char32_t code, int staffSize, bool graceSize) const { int x, y, w, h; const Resources &resources = this->GetResources(); - const Glyph *glyph = resources.GetGlyph(code, fontname); + const Glyph *glyph = resources.GetGlyph(code); assert(glyph); glyph->GetBoundingBox(x, y, w, h); h = h * m_drawingSmuflFontSize / glyph->GetUnitsPerEm(); @@ -1597,11 +1597,11 @@ int Doc::GetGlyphHeight(char32_t code, int staffSize, bool graceSize, const std: return h; } -int Doc::GetGlyphWidth(char32_t code, int staffSize, bool graceSize, const std::string &fontname) const +int Doc::GetGlyphWidth(char32_t code, int staffSize, bool graceSize) const { int x, y, w, h; const Resources &resources = this->GetResources(); - const Glyph *glyph = resources.GetGlyph(code, fontname); + const Glyph *glyph = resources.GetGlyph(code); assert(glyph); glyph->GetBoundingBox(x, y, w, h); w = w * m_drawingSmuflFontSize / glyph->GetUnitsPerEm(); @@ -1610,10 +1610,10 @@ int Doc::GetGlyphWidth(char32_t code, int staffSize, bool graceSize, const std:: return w; } -int Doc::GetGlyphAdvX(char32_t code, int staffSize, bool graceSize, const std::string &fontname) const +int Doc::GetGlyphAdvX(char32_t code, int staffSize, bool graceSize) const { const Resources &resources = this->GetResources(); - const Glyph *glyph = resources.GetGlyph(code, fontname); + const Glyph *glyph = resources.GetGlyph(code); assert(glyph); int advX = glyph->GetHorizAdvX(); advX = advX * m_drawingSmuflFontSize / glyph->GetUnitsPerEm(); @@ -1640,11 +1640,11 @@ Point Doc::ConvertFontPoint(const Glyph *glyph, const Point &fontPoint, int staf return point; } -int Doc::GetGlyphLeft(char32_t code, int staffSize, bool graceSize, const std::string &fontname) const +int Doc::GetGlyphLeft(char32_t code, int staffSize, bool graceSize) const { int x, y, w, h; const Resources &resources = this->GetResources(); - const Glyph *glyph = resources.GetGlyph(code, fontname); + const Glyph *glyph = resources.GetGlyph(code); assert(glyph); glyph->GetBoundingBox(x, y, w, h); x = x * m_drawingSmuflFontSize / glyph->GetUnitsPerEm(); @@ -1653,17 +1653,16 @@ int Doc::GetGlyphLeft(char32_t code, int staffSize, bool graceSize, const std::s return x; } -int Doc::GetGlyphRight(char32_t code, int staffSize, bool graceSize, const std::string &fontname) const +int Doc::GetGlyphRight(char32_t code, int staffSize, bool graceSize) const { - return this->GetGlyphLeft(code, staffSize, graceSize, fontname) - + this->GetGlyphWidth(code, staffSize, graceSize, fontname); + return this->GetGlyphLeft(code, staffSize, graceSize) + this->GetGlyphWidth(code, staffSize, graceSize); } -int Doc::GetGlyphBottom(char32_t code, int staffSize, bool graceSize, const std::string &fontname) const +int Doc::GetGlyphBottom(char32_t code, int staffSize, bool graceSize) const { int x, y, w, h; const Resources &resources = this->GetResources(); - const Glyph *glyph = resources.GetGlyph(code, fontname); + const Glyph *glyph = resources.GetGlyph(code); assert(glyph); glyph->GetBoundingBox(x, y, w, h); y = y * m_drawingSmuflFontSize / glyph->GetUnitsPerEm(); @@ -1672,10 +1671,9 @@ int Doc::GetGlyphBottom(char32_t code, int staffSize, bool graceSize, const std: return y; } -int Doc::GetGlyphTop(char32_t code, int staffSize, bool graceSize, const std::string &fontname) const +int Doc::GetGlyphTop(char32_t code, int staffSize, bool graceSize) const { - return this->GetGlyphBottom(code, staffSize, graceSize, fontname) - + this->GetGlyphHeight(code, staffSize, graceSize, fontname); + return this->GetGlyphBottom(code, staffSize, graceSize) + this->GetGlyphHeight(code, staffSize, graceSize); } int Doc::GetTextGlyphHeight(char32_t code, const FontInfo *font, bool graceSize) const @@ -1845,7 +1843,7 @@ double Doc::GetCueScaling() const FontInfo *Doc::GetDrawingSmuflFont(int staffSize, bool graceSize) { - m_drawingSmuflFont.SetFaceName(m_options->m_font.GetValue().c_str()); + m_drawingSmuflFont.SetFaceName(this->GetResources().GetCurrentFont().c_str()); int value = m_drawingSmuflFontSize * staffSize / 100; if (graceSize) value = value * m_options->m_graceFactor.GetValue(); m_drawingSmuflFont.SetPointSize(value); diff --git a/src/resources.cpp b/src/resources.cpp index 734f9c92e2a..3e0da984487 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -156,12 +156,8 @@ bool Resources::SetCurrentFont(const std::string &fontName, bool allowLoading) } } -const Glyph *Resources::GetGlyph(char32_t smuflCode, const std::string &fontname) const +const Glyph *Resources::GetGlyph(char32_t smuflCode) const { - if (!fontname.empty() && this->HasGlyphTableFor(fontname)) { - const GlyphTable &fontGlyphTable = this->GetGlyphTableFor(fontname); - if (fontGlyphTable.contains(smuflCode)) return &fontGlyphTable.at(smuflCode); - } if (GetCurrentGlyphTable().contains(smuflCode)) { return &GetCurrentGlyphTable().at(smuflCode); } diff --git a/src/view_element.cpp b/src/view_element.cpp index b5b98db094f..f9564730841 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -687,7 +687,14 @@ void View::DrawClef(DeviceContext *dc, LayerElement *element, Layer *layer, Staf dc->StartGraphic(element, "", element->GetID()); - this->DrawSmuflCodeWithCustomFont(dc, clef->GetFontname(), x, y, sym, staff->m_drawingStaffSize, false); + std::string previousFont = ""; + if (clef->HasFontname()) { + Resources &resources = m_doc->GetResourcesForModification(); + previousFont = resources.GetCurrentFont(); + resources.SetCurrentFont(clef->GetFontname()); + } + + this->DrawSmuflCode(dc, x, y, sym, staff->m_drawingStaffSize, false); if (m_doc->IsFacs() && element->HasFacs()) { const int noteHeight @@ -705,6 +712,11 @@ void View::DrawClef(DeviceContext *dc, LayerElement *element, Layer *layer, Staf // Possibly draw enclosing brackets this->DrawClefEnclosing(dc, clef, staff, sym, x, y); + if (!previousFont.empty()) { + Resources &resources = m_doc->GetResourcesForModification(); + resources.SetCurrentFont(previousFont); + } + dc->EndGraphic(element, this); } @@ -1123,20 +1135,27 @@ void View::DrawMeterSig(DeviceContext *dc, MeterSig *meterSig, Staff *staff, int dc->StartGraphic(meterSig, "", meterSig->GetID()); + std::string previousFont; + if (meterSig->HasFontname()) { + Resources &resources = m_doc->GetResourcesForModification(); + previousFont = resources.GetCurrentFont(); + resources.SetCurrentFont(meterSig->GetFontname()); + } + int y = staff->GetDrawingY() - m_doc->GetDrawingUnit(staff->m_drawingStaffSize) * (staff->m_drawingLines - 1); int x = meterSig->GetDrawingX() + horizOffset; const int glyphSize = staff->GetDrawingStaffNotationSize(); if (enclosingFront) { - this->DrawSmuflCodeWithCustomFont(dc, meterSig->GetFontname(), x, y, enclosingFront, glyphSize, false); - x += m_doc->GetGlyphWidth(enclosingFront, glyphSize, false, meterSig->GetFontname()); + this->DrawSmuflCode(dc, x, y, enclosingFront, glyphSize, false); + x += m_doc->GetGlyphWidth(enclosingFront, glyphSize, false); } if (meterSig->HasSym() || meterSig->HasGlyphNum() || meterSig->HasGlyphName()) { const char32_t code = meterSig->GetSymbolGlyph(); - this->DrawSmuflCodeWithCustomFont(dc, meterSig->GetFontname(), x, y, code, glyphSize, false); - x += m_doc->GetGlyphWidth(code, glyphSize, false, meterSig->GetFontname()); + this->DrawSmuflCode(dc, x, y, code, glyphSize, false); + x += m_doc->GetGlyphWidth(code, glyphSize, false); } else if (meterSig->GetForm() == METERFORM_num) { x += this->DrawMeterSigFigures(dc, x, y, meterSig, 0, staff); @@ -1146,7 +1165,12 @@ void View::DrawMeterSig(DeviceContext *dc, MeterSig *meterSig, Staff *staff, int } if (enclosingBack) { - this->DrawSmuflCodeWithCustomFont(dc, meterSig->GetFontname(), x, y, enclosingBack, glyphSize, false); + this->DrawSmuflCode(dc, x, y, enclosingBack, glyphSize, false); + } + + if (!previousFont.empty()) { + Resources &resources = m_doc->GetResourcesForModification(); + resources.SetCurrentFont(previousFont); } dc->EndGraphic(meterSig, this); diff --git a/src/view_graph.cpp b/src/view_graph.cpp index 240c9b5e07d..8165042c2a0 100644 --- a/src/view_graph.cpp +++ b/src/view_graph.cpp @@ -276,6 +276,7 @@ void View::DrawEnclosingBrackets(DeviceContext *dc, int x, int y, int height, in horizontalThickness, verticalThickness); } +/* void View::DrawSmuflCodeWithCustomFont(DeviceContext *dc, const std::string &customFont, int x, int y, char32_t code, int staffSize, bool dimin, bool setBBGlyph) { @@ -293,6 +294,7 @@ void View::DrawSmuflCodeWithCustomFont(DeviceContext *dc, const std::string &cus resources.SetCurrentFont(prevFont); } +*/ void View::DrawSmuflCode(DeviceContext *dc, int x, int y, char32_t code, int staffSize, bool dimin, bool setBBGlyph) { From 0b2bd6f3dff6066468f2586a87dbb951a69e5467 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 31 Jan 2024 15:07:40 +0100 Subject: [PATCH 189/249] Use Resources CurrentFont and FallbackFont --- src/svgdevicecontext.cpp | 4 ++-- src/view_element.cpp | 2 +- src/view_text.cpp | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index 350fab421bb..c5aae440c35 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -195,9 +195,9 @@ void SvgDeviceContext::Commit(bool xml_declaration) if (m_vrvTextFont && resources) { this->IncludeTextFont(resources->GetCurrentFont(), resources); } - // include the Leipzig fallback font + // include the fallback font if (m_vrvTextFontFallback && resources) { - this->IncludeTextFont("Leipzig", resources); + this->IncludeTextFont(resources->GetCurrentFont(), resources); } } diff --git a/src/view_element.cpp b/src/view_element.cpp index f9564730841..88a2d28ec34 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -1816,7 +1816,7 @@ void View::DrawSyl(DeviceContext *dc, LayerElement *element, Layer *layer, Staff FontInfo vrvTxt; assert(dc->HasFont()); vrvTxt.SetPointSize(dc->GetFont()->GetPointSize() * m_doc->GetMusicToLyricFontSizeRatio()); - vrvTxt.SetFaceName(m_doc->GetOptions()->m_font.GetValue()); + vrvTxt.SetFaceName(m_doc->GetResources().GetCurrentFont()); std::u32string str; str.push_back(m_doc->GetOptions()->m_lyricElision.GetValue()); bool isFallbackNeeded = (m_doc->GetResources()).IsSmuflFallbackNeeded(str); diff --git a/src/view_text.cpp b/src/view_text.cpp index 2d2839dd935..ff281247add 100644 --- a/src/view_text.cpp +++ b/src/view_text.cpp @@ -123,7 +123,7 @@ void View::DrawDynamString(DeviceContext *dc, const std::u32string &str, TextDra std::u32string smuflStr = Dynam::GetSymbolStr(token.first, singleGlyphs); FontInfo vrvTxt; vrvTxt.SetPointSize(dc->GetFont()->GetPointSize() * m_doc->GetMusicToLyricFontSizeRatio()); - vrvTxt.SetFaceName(m_doc->GetOptions()->m_font.GetValue()); + vrvTxt.SetFaceName(m_doc->GetResources().GetCurrentFont()); bool isFallbackNeeded = (m_doc->GetResources()).IsSmuflFallbackNeeded(smuflStr); vrvTxt.SetSmuflWithFallback(isFallbackNeeded); vrvTxt.SetStyle(FONTSTYLE_normal); @@ -197,7 +197,7 @@ void View::DrawHarmString(DeviceContext *dc, const std::u32string &str, TextDraw FontInfo vrvTxt; vrvTxt.SetPointSize(dc->GetFont()->GetPointSize() * m_doc->GetMusicToLyricFontSizeRatio()); - vrvTxt.SetFaceName(m_doc->GetOptions()->m_font.GetValue()); + vrvTxt.SetFaceName(m_doc->GetResources().GetCurrentFont()); bool isFallbackNeeded = (m_doc->GetResources()).IsSmuflFallbackNeeded(smuflAccid); vrvTxt.SetSmuflWithFallback(isFallbackNeeded); dc->SetFont(&vrvTxt); @@ -292,7 +292,7 @@ void View::DrawLyricString( FontInfo vrvTxt; vrvTxt.SetPointSize(dc->GetFont()->GetPointSize() * m_doc->GetMusicToLyricFontSizeRatio()); - vrvTxt.SetFaceName(m_doc->GetOptions()->m_font.GetValue()); + vrvTxt.SetFaceName(m_doc->GetResources().GetCurrentFont()); std::u32string elision; elision.push_back(m_doc->GetOptions()->m_lyricElision.GetValue()); bool isFallbackNeeded = (m_doc->GetResources()).IsSmuflFallbackNeeded(elision); @@ -407,7 +407,7 @@ void View::DrawRend(DeviceContext *dc, Rend *rend, TextDrawingParams ¶ms) // Because we do not have the string at this stage we rely only on the selected font // This means fallback will not work for missing glyphs within rendFont.SetSmuflWithFallback(false); - rendFont.SetFaceName(m_doc->GetOptions()->m_font.GetValue()); + rendFont.SetFaceName(m_doc->GetResources().GetCurrentFont()); int pointSize = (rendFont.GetPointSize() != 0) ? rendFont.GetPointSize() : params.m_pointSize; rendFont.SetPointSize(pointSize * m_doc->GetMusicToLyricFontSizeRatio()); customFont = true; @@ -619,7 +619,7 @@ void View::DrawSymbol(DeviceContext *dc, Symbol *symbol, TextDrawingParams ¶ if (symbol->HasGlyphAuth() && symbol->GetGlyphAuth() == "smufl") { bool isFallbackNeeded = (m_doc->GetResources()).IsSmuflFallbackNeeded(str); symbolFont.SetSmuflWithFallback(isFallbackNeeded); - symbolFont.SetFaceName(m_doc->GetOptions()->m_font.GetValue()); + symbolFont.SetFaceName(m_doc->GetResources().GetCurrentFont()); int pointSize = (symbolFont.GetPointSize() != 0) ? symbolFont.GetPointSize() : params.m_pointSize; symbolFont.SetPointSize(pointSize * m_doc->GetMusicToLyricFontSizeRatio()); } From 0f5b36ee6f1898fb22d87e54ec648c55b91bf939 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 31 Jan 2024 15:44:49 +0100 Subject: [PATCH 190/249] Convert path to string --- src/resources.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resources.cpp b/src/resources.cpp index 3e0da984487..bdd7ddeed45 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -126,7 +126,7 @@ bool Resources::LoadAll() for (const std::filesystem::directory_entry &entry : std::filesystem::directory_iterator(path)) { const std::filesystem::path path = entry.path(); if (path.has_extension() && path.has_stem() && path.extension() == ".xml") { - const std::string fontName = path.stem(); + const std::string fontName = path.stem().string(); if (!IsFontLoaded(fontName)) { success = success && LoadFont(fontName); } From e7d6c7bc93b327d89ad11aceceb097ad6f336035 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Feb 2024 08:14:05 +0100 Subject: [PATCH 191/249] Update other builds to 10.15 --- Verovio.xcodeproj/project.pbxproj | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index 96d420fe72f..b1ad229dbd9 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -5003,7 +5003,7 @@ buildSettings = { CODE_SIGN_IDENTITY = "-"; DEAD_CODE_STRIPPING = YES; - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_NAME = "$(TARGET_NAME)"; USER_HEADER_SEARCH_PATHS = ""; }; @@ -5014,7 +5014,7 @@ buildSettings = { CODE_SIGN_IDENTITY = "-"; DEAD_CODE_STRIPPING = YES; - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_NAME = "$(TARGET_NAME)"; USER_HEADER_SEARCH_PATHS = ""; }; @@ -5140,7 +5140,7 @@ "$(inherited)", NO_HUMDRUM_SUPPORT, ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = ""; PRODUCT_NAME = "$(TARGET_NAME)"; USER_HEADER_SEARCH_PATHS = ""; }; @@ -5152,7 +5152,7 @@ CODE_SIGN_IDENTITY = "-"; DEAD_CODE_STRIPPING = YES; GCC_PREPROCESSOR_DEFINITIONS = NO_HUMDRUM_SUPPORT; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = ""; PRODUCT_NAME = "$(TARGET_NAME)"; USER_HEADER_SEARCH_PATHS = ""; }; @@ -5166,7 +5166,7 @@ EXECUTABLE_PREFIX = lib; HEADER_SEARCH_PATHS = ""; MACH_O_TYPE = staticlib; - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; @@ -5180,7 +5180,7 @@ EXECUTABLE_PREFIX = lib; HEADER_SEARCH_PATHS = ""; MACH_O_TYPE = staticlib; - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = 10.15; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; }; @@ -5227,7 +5227,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.rism.VerovioFramework; @@ -5280,7 +5280,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; + MACOSX_DEPLOYMENT_TARGET = 10.15; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.rism.VerovioFramework; From b3752ca14887db8cbf9d1d3ad968676f46aa3765 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Feb 2024 08:14:34 +0100 Subject: [PATCH 192/249] Add ZipFileReader class --- Verovio.xcodeproj/project.pbxproj | 16 ++++ bindings/iOS/all.h | 1 + include/vrv/filereader.h | 82 ++++++++++++++++++++ src/filereader.cpp | 119 ++++++++++++++++++++++++++++++ src/toolkit.cpp | 35 ++++----- 5 files changed, 233 insertions(+), 20 deletions(-) create mode 100644 include/vrv/filereader.h create mode 100644 src/filereader.cpp diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index b1ad229dbd9..e2fda8406a0 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -182,6 +182,12 @@ 4D16945A1E3A44F300569BF4 /* dot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC34BA719BC4A83006175CD /* dot.cpp */; }; 4D16946A1E3A455100569BF4 /* humlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 40CA06581E351161009CFDD7 /* humlib.cpp */; }; 4D1694741E3A455200569BF4 /* humlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 40CA06581E351161009CFDD7 /* humlib.cpp */; }; + 4D1AC9772B6A9BB200434023 /* filereader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1AC9762B6A9BB200434023 /* filereader.cpp */; }; + 4D1AC9782B6A9BB200434023 /* filereader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1AC9762B6A9BB200434023 /* filereader.cpp */; }; + 4D1AC9792B6A9BB200434023 /* filereader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1AC9762B6A9BB200434023 /* filereader.cpp */; }; + 4D1AC97A2B6A9BB200434023 /* filereader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1AC9762B6A9BB200434023 /* filereader.cpp */; }; + 4D1AC97C2B6A9BD000434023 /* filereader.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D1AC97B2B6A9BD000434023 /* filereader.h */; }; + 4D1AC97D2B6A9BD000434023 /* filereader.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D1AC97B2B6A9BD000434023 /* filereader.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4D1BD1B521908D6B000D35B2 /* halfmrpt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1BD1B421908D6B000D35B2 /* halfmrpt.cpp */; }; 4D1BD1B621908D6B000D35B2 /* halfmrpt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1BD1B421908D6B000D35B2 /* halfmrpt.cpp */; }; 4D1BD1B721908D6B000D35B2 /* halfmrpt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1BD1B421908D6B000D35B2 /* halfmrpt.cpp */; }; @@ -1763,6 +1769,8 @@ 4D09D3EC1EA8AD8500A420E6 /* horizontalaligner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = horizontalaligner.cpp; path = src/horizontalaligner.cpp; sourceTree = ""; }; 4D14600F1EA8A913007DB90C /* horizontalaligner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = horizontalaligner.h; path = include/vrv/horizontalaligner.h; sourceTree = ""; }; 4D1694601E3A44F300569BF4 /* Verovio-Humdrum */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Verovio-Humdrum"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4D1AC9762B6A9BB200434023 /* filereader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = filereader.cpp; path = src/filereader.cpp; sourceTree = ""; }; + 4D1AC97B2B6A9BD000434023 /* filereader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = filereader.h; path = include/vrv/filereader.h; sourceTree = ""; }; 4D1BD1B421908D6B000D35B2 /* halfmrpt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = halfmrpt.cpp; path = src/halfmrpt.cpp; sourceTree = ""; }; 4D1BD1B821908D78000D35B2 /* halfmrpt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = halfmrpt.h; path = include/vrv/halfmrpt.h; sourceTree = ""; }; 4D1BE7661C688F5A0086DC0E /* Binasc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Binasc.cpp; path = src/midi/Binasc.cpp; sourceTree = ""; }; @@ -2776,6 +2784,8 @@ 36E0442D2347A9290054F141 /* expansionmap.h */, 4D79643826C6B3520026288B /* featureextractor.cpp */, 4D79643026C6AA720026288B /* featureextractor.h */, + 4D1AC9762B6A9BB200434023 /* filereader.cpp */, + 4D1AC97B2B6A9BD000434023 /* filereader.h */, 4DF28A041A754DF000BA9F7D /* floatingobject.cpp */, 4D95D4F41D7185DE00B2B856 /* floatingobject.h */, 4D09D3EC1EA8AD8500A420E6 /* horizontalaligner.cpp */, @@ -3388,6 +3398,7 @@ E79320642991452100D80975 /* calcstemfunctor.h in Headers */, 4D1BD1B921908D78000D35B2 /* halfmrpt.h in Headers */, 4DACC9F42990F29A00B55913 /* atts_visual.h in Headers */, + 4D1AC97C2B6A9BD000434023 /* filereader.h in Headers */, 4DA0EADD22BB77AF00A7EBEB /* zone.h in Headers */, E71EF3C32975E4DC00D36264 /* resetfunctor.h in Headers */, 4D763EC91987D067003FCAB5 /* metersig.h in Headers */, @@ -3706,6 +3717,7 @@ BBC19FBF22B37CA000100F42 /* all.h in Headers */, 4DA0EAE222BB77AF00A7EBEB /* editortoolkit_mensural.h in Headers */, E79C87C8269440810098FE85 /* lv.h in Headers */, + 4D1AC97D2B6A9BD000434023 /* filereader.h in Headers */, BB4C4B5822A932D7001F6AF0 /* layerelement.h in Headers */, BB4C4B9422A932E5001F6AF0 /* areaposinterface.h in Headers */, ); @@ -3873,6 +3885,7 @@ 4D1693F61E3A44F300569BF4 /* barline.cpp in Sources */, E7901661298BCB2C008FDB4E /* calcalignmentxposfunctor.cpp in Sources */, 400FEDD6206FA74D000D3233 /* gracegrp.cpp in Sources */, + 4D1AC9782B6A9BB200434023 /* filereader.cpp in Sources */, 4D89F90F201771AE00A4D336 /* num.cpp in Sources */, 4D1693F71E3A44F300569BF4 /* bboxdevicecontext.cpp in Sources */, 4D1693F81E3A44F300569BF4 /* beam.cpp in Sources */, @@ -4153,6 +4166,7 @@ files = ( 4DEF8A6421B7AAF90093A76B /* f.cpp in Sources */, 4DB3D89E1F7E7FAA00B5FC2B /* fig.cpp in Sources */, + 4D1AC9772B6A9BB200434023 /* filereader.cpp in Sources */, 4D4FCD121F54570E0009C455 /* staffdef.cpp in Sources */, 8F086EE2188539540037FD8E /* verticalaligner.cpp in Sources */, 4DEC4D9621C81E3B00D1D273 /* expan.cpp in Sources */, @@ -4438,6 +4452,7 @@ 4DB3D8F01F83D1A700B5FC2B /* fig.cpp in Sources */, E790165F298BCB27008FDB4E /* calcalignmentxposfunctor.cpp in Sources */, 8F3DD36718854B410051330C /* verticalaligner.cpp in Sources */, + 4D1AC9792B6A9BB200434023 /* filereader.cpp in Sources */, 4D766F0220ACAD6E006875D8 /* nc.cpp in Sources */, 4DEC4D9821C81E3B00D1D273 /* expan.cpp in Sources */, 4D3C3F0E294B89AF009993E6 /* ornam.cpp in Sources */, @@ -4721,6 +4736,7 @@ BB4C4B9322A932E5001F6AF0 /* areaposinterface.cpp in Sources */, E7901660298BCB27008FDB4E /* calcalignmentxposfunctor.cpp in Sources */, BB4C4AA122A9328F001F6AF0 /* verticalaligner.cpp in Sources */, + 4D1AC97A2B6A9BB200434023 /* filereader.cpp in Sources */, BB4C4B2F22A932CF001F6AF0 /* pedal.cpp in Sources */, 4D2E759222BC2B80004C51F0 /* tuning.cpp in Sources */, BB4C4B4922A932D7001F6AF0 /* clef.cpp in Sources */, diff --git a/bindings/iOS/all.h b/bindings/iOS/all.h index 9698250ef2e..0a5dbb6b62d 100644 --- a/bindings/iOS/all.h +++ b/bindings/iOS/all.h @@ -100,6 +100,7 @@ #import #import #import +#import #import #import #import diff --git a/include/vrv/filereader.h b/include/vrv/filereader.h new file mode 100644 index 00000000000..08a6a068bff --- /dev/null +++ b/include/vrv/filereader.h @@ -0,0 +1,82 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: filereader.h +// Author: Laurent Pugin +// Created: 31/01/2024 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#ifndef __VRV_FILEREADER_H__ +#define __VRV_FILEREADER_H__ + +#include +#include + +namespace miniz_cpp { +class zip_file; +} + +//---------------------------------------------------------------------------- + +namespace vrv { + +//---------------------------------------------------------------------------- +// ZipFileReader +//---------------------------------------------------------------------------- + +/** + * This class is a reader for zip archives. + */ +class ZipFileReader { +public: + /** + * @name Constructors, destructors, and other standard methods + */ + ///@{ + ZipFileReader(); + ~ZipFileReader(); + ///@} + + /** + * Reset a previously loaded file. + */ + void Reset(); + + /** + * Load a file into memory. + */ + bool Load(const std::string &filename); + + /** + * Load a vector into memory + */ + bool Load(const std::vector &bytes); + + /** + * Check if the archive contains the file + */ + bool HasFile(const std::string &filename); + + /** + * Read the text file. + * Return an empty string if the file does not exist. + */ + std::string ReadTextFile(const std::string &filename); + + /** + * Return a list of all files (including directories) + */ + std::list GetFileList(); + +private: + // +public: + // +private: + /** A pointer to the miniz zip file */ + miniz_cpp::zip_file *m_file; + +}; // class ZipFileReader + +} // namespace vrv + +#endif // __VRV_FILEREADER_H__ diff --git a/src/filereader.cpp b/src/filereader.cpp new file mode 100644 index 00000000000..aee33a5d00d --- /dev/null +++ b/src/filereader.cpp @@ -0,0 +1,119 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: filereader.cpp +// Author: Laurent Pugin +// Created: 31/01/2024 +// Copyright (c) Authors and others. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + +#include "filereader.h" + +//---------------------------------------------------------------------------- + +#include + +//---------------------------------------------------------------------------- + +#include "vrv.h" + +//---------------------------------------------------------------------------- + +#include "zip_file.hpp" + +namespace vrv { + +//---------------------------------------------------------------------------- +// ZipFileReader +//---------------------------------------------------------------------------- + +ZipFileReader::ZipFileReader() +{ + m_file = NULL; + + this->Reset(); +} + +ZipFileReader::~ZipFileReader() +{ + this->Reset(); +} + +void ZipFileReader::Reset() +{ + if (m_file) { + delete m_file; + m_file = NULL; + } +} + +bool ZipFileReader::Load(const std::string &filename) +{ + std::ifstream fin(filename.c_str(), std::ios::in | std::ios::binary); + if (!fin.is_open()) { + return false; + } + + fin.seekg(0, std::ios::end); + std::streamsize fileSize = (std::streamsize)fin.tellg(); + fin.clear(); + fin.seekg(0, std::wios::beg); + + std::vector bytes; + bytes.reserve(fileSize + 1); + + unsigned char buffer; + while (fin.read((char *)&buffer, sizeof(unsigned char))) { + bytes.push_back(buffer); + } + return this->Load(bytes); +} + +bool ZipFileReader::Load(const std::vector &bytes) +{ + this->Reset(); + + m_file = new miniz_cpp::zip_file(bytes); + + return true; +} + +std::list ZipFileReader::GetFileList() +{ + assert(m_file); + + std::list list; + for (miniz_cpp::zip_info &member : m_file->infolist()) { + list.push_back(member.filename); + } + return list; +} + +bool ZipFileReader::HasFile(const std::string &filename) +{ + assert(m_file); + + // Look for the file in the zip + for (miniz_cpp::zip_info &member : m_file->infolist()) { + if (member.filename == filename) { + return true; + } + } + + return true; +} + +std::string ZipFileReader::ReadTextFile(const std::string &filename) +{ + assert(m_file); + + // Look for the meta file in the zip + for (miniz_cpp::zip_info &member : m_file->infolist()) { + if (member.filename == filename) { + return m_file->read(member.filename); + } + } + + LogError("No file '%s' to read found in the archive", filename.c_str()); + return ""; +} + +} // namespace vrv diff --git a/src/toolkit.cpp b/src/toolkit.cpp index 9de49e5b2ca..8e7c1bec05d 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -21,6 +21,7 @@ #include "editortoolkit_cmn.h" #include "editortoolkit_mensural.h" #include "editortoolkit_neume.h" +#include "filereader.h" #include "findfunctor.h" #include "ioabc.h" #include "iodarms.h" @@ -48,10 +49,6 @@ #include "crc.h" #include "jsonxx.h" -#ifndef NO_MXL_SUPPORT -#include "zip_file.hpp" -#endif /* NO_MXL_SUPPORT */ - namespace vrv { const char *UTF_16_BE_BOM = "\xFE\xFF"; @@ -431,26 +428,24 @@ bool Toolkit::LoadZipFile(const std::string &filename) bool Toolkit::LoadZipData(const std::vector &bytes) { #ifndef NO_MXL_SUPPORT - miniz_cpp::zip_file file(bytes); - - std::string filename; - // Look for the meta file in the zip - for (miniz_cpp::zip_info &member : file.infolist()) { - if (member.filename == "META-INF/container.xml") { - std::string container = file.read(member.filename); - // Find the file name with an xpath query - pugi::xml_document doc; - doc.load_buffer(container.c_str(), container.size()); - pugi::xml_node root = doc.first_child(); - pugi::xml_node rootfile = root.select_node("/container/rootfiles/rootfile").node(); - filename = rootfile.attribute("full-path").value(); - break; - } + ZipFileReader zipFileReader; + zipFileReader.Load(bytes); + + const std::string metaInf = "META-INF/container.xml"; + if (!zipFileReader.HasFile(metaInf)) { + LogError("No '%s' file to load found in the archive", metaInf.c_str()); + return false; } + std::string containerXml = zipFileReader.ReadTextFile("META-INF/container.xml"); + pugi::xml_document doc; + doc.load_buffer(containerXml.c_str(), containerXml.size()); + pugi::xml_node root = doc.first_child(); + pugi::xml_node rootfile = root.select_node("/container/rootfiles/rootfile").node(); + std::string filename = rootfile.attribute("full-path").value(); if (!filename.empty()) { LogInfo("Loading file '%s' in the archive", filename.c_str()); - return this->LoadData(file.read(filename)); + return this->LoadData(zipFileReader.ReadTextFile(filename)); } else { LogError("No file to load found in the archive"); From bda46f15b4a0ca6b07274afe9cbe807ec32feacb Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Feb 2024 08:43:22 +0100 Subject: [PATCH 193/249] Let the Glyph return the XML from the path --- include/vrv/glyph.h | 5 +++++ src/glyph.cpp | 11 +++++++++++ src/svgdevicecontext.cpp | 5 ++--- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/include/vrv/glyph.h b/include/vrv/glyph.h index 24089f559cf..a1110c8c368 100644 --- a/include/vrv/glyph.h +++ b/include/vrv/glyph.h @@ -106,6 +106,11 @@ class Glyph { */ const Point *GetAnchor(SMuFLGlyphAnchor anchor) const; + /** + * Return the XML (content) of the glyph + */ + std::string GetXML() const; + private: // public: diff --git a/src/glyph.cpp b/src/glyph.cpp index e78b91c0d1f..82fd2439d9c 100644 --- a/src/glyph.cpp +++ b/src/glyph.cpp @@ -11,6 +11,9 @@ #include #include +#include +#include +#include //---------------------------------------------------------------------------- @@ -144,4 +147,12 @@ const Point *Glyph::GetAnchor(SMuFLGlyphAnchor anchor) const return &m_anchors.at(anchor); } +std::string Glyph::GetXML() const +{ + std::ifstream fstream(m_path); + std::stringstream sstream; + sstream << fstream.rdbuf(); + return sstream.str(); +} + } // namespace vrv diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index c5aae440c35..21c31b0e597 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -209,9 +209,8 @@ void SvgDeviceContext::Commit(bool xml_declaration) // for each needed glyph for (const std::pair entry : m_smuflGlyphs) { - // load the XML file that contains it as a pugi::xml_document - std::ifstream source(entry.first->GetPath()); - sourceDoc.load(source); + // load the XML as a pugi::xml_document + sourceDoc.load_string(entry.first->GetXML().c_str()); // copy all the nodes inside into the master document for (pugi::xml_node child = sourceDoc.first_child(); child; child = child.next_sibling()) { From af9825e87dab84f16d8b899003249d16884080b8 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Feb 2024 08:45:23 +0100 Subject: [PATCH 194/249] Add missing include --- include/vrv/filereader.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/vrv/filereader.h b/include/vrv/filereader.h index 08a6a068bff..c6b8f862c7c 100644 --- a/include/vrv/filereader.h +++ b/include/vrv/filereader.h @@ -10,7 +10,11 @@ #include #include +#include +//---------------------------------------------------------------------------- + +/** Forward declaration of the zip_file.hpp class */ namespace miniz_cpp { class zip_file; } From df2c2d714cd64256e7c8e0e80720820f2872e283 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Feb 2024 09:19:55 +0100 Subject: [PATCH 195/249] Add implementation for zip custom fonts --- include/vrv/glyph.h | 11 ++++++++- include/vrv/resources.h | 3 ++- src/glyph.cpp | 13 ++++++---- src/options.cpp | 2 +- src/resources.cpp | 53 ++++++++++++++++++++++++++++++++--------- 5 files changed, 64 insertions(+), 18 deletions(-) diff --git a/include/vrv/glyph.h b/include/vrv/glyph.h index a1110c8c368..dc28607aeeb 100644 --- a/include/vrv/glyph.h +++ b/include/vrv/glyph.h @@ -107,7 +107,14 @@ class Glyph { const Point *GetAnchor(SMuFLGlyphAnchor anchor) const; /** - * Return the XML (content) of the glyph + * Set the XML (content) of the glyph. + * This is used only for glyph added from zip archive custom fonts. + */ + void SetXML(const std::string &xml) { m_xml = xml; } + + /** + * Return the XML (content) of the glyph. + * Return the stored XML or load it from the path. */ std::string GetXML() const; @@ -129,6 +136,8 @@ class Glyph { std::string m_codeStr; /** Path to the glyph XML file */ std::string m_path; + /** XML of the content for files loaded from zip archive custom font */ + std::string m_xml; /** A map of the available anchors */ std::map m_anchors; /** A flag indicating it is a fallback */ diff --git a/include/vrv/resources.h b/include/vrv/resources.h index 6d1bb1244b8..b77f0d1b7d4 100644 --- a/include/vrv/resources.h +++ b/include/vrv/resources.h @@ -12,6 +12,7 @@ //---------------------------------------------------------------------------- +#include "filereader.h" #include "glyph.h" namespace vrv { @@ -132,7 +133,7 @@ class Resources { const bool m_isFallback; }; - bool LoadFont(const std::string &fontName); + bool LoadFont(const std::string &fontName, ZipFileReader *zipFile = NULL); const GlyphTable &GetCurrentGlyphTable() const { return m_loadedFonts.at(m_currentFontName).GetGlyphTable(); }; const GlyphTable &GetFallbackGlyphTable() const { return m_loadedFonts.at(m_fallbackFontName).GetGlyphTable(); }; diff --git a/src/glyph.cpp b/src/glyph.cpp index 82fd2439d9c..2413bf0f8bc 100644 --- a/src/glyph.cpp +++ b/src/glyph.cpp @@ -149,10 +149,15 @@ const Point *Glyph::GetAnchor(SMuFLGlyphAnchor anchor) const std::string Glyph::GetXML() const { - std::ifstream fstream(m_path); - std::stringstream sstream; - sstream << fstream.rdbuf(); - return sstream.str(); + if (!m_xml.empty()) { + return m_xml; + } + else { + std::ifstream fstream(m_path); + std::stringstream sstream; + sstream << fstream.rdbuf(); + return sstream.str(); + } } } // namespace vrv diff --git a/src/options.cpp b/src/options.cpp index 4dc94e035ca..0a24f1c16bd 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -1293,7 +1293,7 @@ Options::Options() m_font.Init("Leipzig"); this->Register(&m_font, "font", &m_generalLayout); - m_fontAddCustom.SetInfo("Add custom font", "Add a custom music font"); + m_fontAddCustom.SetInfo("Add custom font", "Add a custom music font as zip file"); m_fontAddCustom.Init(); this->Register(&m_fontAddCustom, "fontAddCustom", &m_generalLayout); diff --git a/src/resources.cpp b/src/resources.cpp index bdd7ddeed45..4947b290e79 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -110,10 +110,13 @@ bool Resources::AddCustom(const std::vector &extraFonts) { bool success = true; // options supplied fonts - for (const std::string &fontName : extraFonts) { - success = success && LoadFont(fontName); + for (const std::string &fontFile : extraFonts) { + std::filesystem::path path(fontFile); + ZipFileReader zipFile; + zipFile.Load(fontFile); + success = success && path.has_stem() && LoadFont(path.stem().string(), &zipFile); if (!success) { - LogError("Option supplied font %s could not be loaded.", fontName.c_str()); + LogError("Option supplied font %s could not be loaded.", fontFile.c_str()); } } return success; @@ -255,15 +258,33 @@ char32_t Resources::GetSmuflGlyphForUnicodeChar(const char32_t unicodeChar) return smuflChar; } -bool Resources::LoadFont(const std::string &fontName) +bool Resources::LoadFont(const std::string &fontName, ZipFileReader *zipFile) { pugi::xml_document doc; - const std::string filename = Resources::GetPath() + "/" + fontName + ".xml"; - pugi::xml_parse_result parseResult = doc.load_file(filename.c_str()); - if (!parseResult) { - // File not found, default bounding boxes will be used - LogError("Failed to load font and glyph bounding boxes"); - return false; + // For zip archive custom font, load the data from the zipFile + if (zipFile) { + const std::string filename = fontName + ".xml"; + if (!zipFile->HasFile(filename)) { + // File not found, default bounding boxes will be used + LogError("Failed to load font and glyph bounding boxes"); + return false; + } + pugi::xml_parse_result parseResult = doc.load_string(zipFile->ReadTextFile(filename).c_str()); + if (!parseResult) { + // File not found, default bounding boxes will be used + LogError("Failed to load font and glyph bounding boxes"); + return false; + } + } + // Other wise use the resource directory + else { + const std::string filename = Resources::GetPath() + "/" + fontName + ".xml"; + pugi::xml_parse_result parseResult = doc.load_file(filename.c_str()); + if (!parseResult) { + // File not found, default bounding boxes will be used + LogError("Failed to load font and glyph bounding boxes"); + return false; + } } pugi::xml_node root = doc.first_child(); if (!root.attribute("units-per-em")) { @@ -295,7 +316,17 @@ bool Resources::LoadFont(const std::string &fontName) if (current.attribute("w")) width = current.attribute("w").as_float(); if (current.attribute("h")) height = current.attribute("h").as_float(); glyph.SetBoundingBox(x, y, width, height); - glyph.SetPath(Resources::GetPath() + "/" + fontName + "/" + c_attribute.value() + ".xml"); + + std::string glyphFilename = fontName + "/" + c_attribute.value() + ".xml"; + // Store the XML in the glyph for fonts loaded from zip files + if (zipFile) { + glyph.SetXML(zipFile->ReadTextFile(glyphFilename)); + } + // Otherwise only store the path + else { + glyph.SetPath(Resources::GetPath() + "/" + glyphFilename); + } + if (current.attribute("h-a-x")) glyph.SetHorizAdvX(current.attribute("h-a-x").as_float()); // load anchors From e2385fd5102d52eb252bcc760c495fc1d01010e1 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 1 Feb 2024 13:16:36 +0100 Subject: [PATCH 196/249] Retrieve the CSS font string from the Resource class --- include/vrv/resources.h | 18 ++++++++++++++++++ include/vrv/svgdevicecontext.h | 2 -- src/resources.cpp | 32 ++++++++++++++++++++++++++++++++ src/svgdevicecontext.cpp | 12 +----------- 4 files changed, 51 insertions(+), 13 deletions(-) diff --git a/include/vrv/resources.h b/include/vrv/resources.h index b77f0d1b7d4..25426cc491b 100644 --- a/include/vrv/resources.h +++ b/include/vrv/resources.h @@ -109,6 +109,12 @@ class Resources { bool FontHasGlyphAvailable(const std::string &fontName, char32_t smuflCode) const; ///@} + /** + * Get the CSS font string for the corresponding font. + * Return an empty string if the font has not been loaded. + */ + std::string GetCSSFontFor(const std::string &fontName) const; + /** * Static method that converts unicode music code points to SMuFL equivalent. * Return the parameter char if nothing can be converted. @@ -116,7 +122,12 @@ class Resources { static char32_t GetSmuflGlyphForUnicodeChar(const char32_t unicodeChar); private: + //---------------------------------------------------------------------------- + // LoadedFont + //---------------------------------------------------------------------------- + class LoadedFont { + public: LoadedFont(const std::string &name, bool isFallback) : m_name(name), m_isFallback(isFallback){}; ~LoadedFont(){}; @@ -125,14 +136,21 @@ class Resources { GlyphTable &GetGlyphTableForModification() { return m_glyphTable; }; bool isFallback() const { return m_isFallback; }; + void SetCSSFont(const std::string &css) { m_css = css; } + std::string GetCSSFont(const std::string &path) const; + private: std::string m_name; /** The loaded SMuFL font */ GlyphTable m_glyphTable; /** If the font needs to fallback when a glyph is not present **/ const bool m_isFallback; + /** CSS font for font loaded as zip archive */ + std::string m_css; }; + //---------------------------------------------------------------------------- + bool LoadFont(const std::string &fontName, ZipFileReader *zipFile = NULL); const GlyphTable &GetCurrentGlyphTable() const { return m_loadedFonts.at(m_currentFontName).GetGlyphTable(); }; diff --git a/include/vrv/svgdevicecontext.h b/include/vrv/svgdevicecontext.h index c00be84fe5f..0139e26ed8b 100644 --- a/include/vrv/svgdevicecontext.h +++ b/include/vrv/svgdevicecontext.h @@ -9,10 +9,8 @@ #define __VRV_SVG_DC_H__ #include -#include #include #include -#include #include #include diff --git a/src/resources.cpp b/src/resources.cpp index 4947b290e79..152a7a42a11 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -10,6 +10,9 @@ //---------------------------------------------------------------------------- #include +#include +#include +#include #include //---------------------------------------------------------------------------- @@ -215,6 +218,16 @@ bool Resources::FontHasGlyphAvailable(const std::string &fontName, char32_t smuf } } +std::string Resources::GetCSSFontFor(const std::string &fontName) const +{ + if (!IsFontLoaded(fontName)) { + return ""; + } + + const LoadedFont &font = m_loadedFonts.at(fontName); + return font.GetCSSFont(m_path); +} + void Resources::SelectTextFont(data_FONTWEIGHT fontWeight, data_FONTSTYLE fontStyle) const { if (fontWeight == FONTWEIGHT_NONE) { @@ -298,6 +311,11 @@ bool Resources::LoadFont(const std::string &fontName, ZipFileReader *zipFile) m_loadedFonts.insert(std::pair(fontName, Resources::LoadedFont(fontName, isFallback))); LoadedFont &font = m_loadedFonts.at(fontName); + // For zip archive custom font also store the CSS + if (zipFile) { + font.SetCSSFont(zipFile->ReadTextFile(fontName + ".css")); + } + GlyphTable &glyphTable = font.GetGlyphTableForModification(); const int unitsPerEm = atoi(root.attribute("units-per-em").value()); @@ -403,4 +421,18 @@ bool Resources::InitTextFont(const std::string &fontName, const StyleAttributes return true; } +std::string Resources::LoadedFont::GetCSSFont(const std::string &path) const +{ + if (!m_css.empty()) { + return m_css; + } + else { + const std::string cssFontPath = StringFormat("%s/%s.css", path.c_str(), m_name.c_str()); + std::ifstream fstream(cssFontPath); + std::stringstream sstream; + sstream << fstream.rdbuf(); + return sstream.str(); + } +} + } // namespace vrv diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index 21c31b0e597..3722ff299e8 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -128,17 +128,7 @@ void SvgDeviceContext::IncludeTextFont(const std::string &fontname, const Resour std::string cssContent; if (m_smuflTextFont == SMUFLTEXTFONT_embedded) { - const std::string cssFontPath = StringFormat("%s/%s.css", resources->GetPath().c_str(), fontname.c_str()); - std::ifstream cssFontFile(cssFontPath); - if (!cssFontFile.is_open()) { - LogWarning("The CSS font for '%s' could not be loaded and will not be embedded in the SVG", - resources->GetCurrentFont().c_str()); - } - else { - std::stringstream cssFontStream; - cssFontStream << cssFontFile.rdbuf(); - cssContent = cssFontStream.str(); - } + cssContent = resources->GetCSSFontFor(fontname); } else { std::string versionPath From 33f819475769b32eaf32d088348f1da342baa7cf Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 2 Feb 2024 09:38:09 +0100 Subject: [PATCH 197/249] Fix json types in font options --- src/toolkit.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/toolkit.cpp b/src/toolkit.cpp index 8e7c1bec05d..6496423907a 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -1139,11 +1139,11 @@ bool Toolkit::SetOptions(const std::string &jsonOptions) if (json.has("font")) { this->SetFont(m_options->m_font.GetValue()); } - if (json.has("fontFallback")) { + if (json.has("fontFallback")) { Resources &resources = m_doc.GetResourcesForModification(); resources.SetFallback(m_options->m_fontFallback.GetStrValue()); } - if (json.has("fontLoadAll")) { + if (json.has("fontLoadAll")) { Resources &resources = m_doc.GetResourcesForModification(); resources.LoadAll(); } From c8fd967b94495d4597b6aa66010f8ac3ef830c18 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 2 Feb 2024 09:38:57 +0100 Subject: [PATCH 198/249] Implement reading base64 zip archive for passing custom font in the JS toolkit --- include/vrv/resources.h | 5 +++++ src/filereader.cpp | 10 ++++++++++ src/resources.cpp | 30 ++++++++++++++++++++++++++---- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/include/vrv/resources.h b/include/vrv/resources.h index 25426cc491b..42dc7a8afea 100644 --- a/include/vrv/resources.h +++ b/include/vrv/resources.h @@ -115,6 +115,11 @@ class Resources { */ std::string GetCSSFontFor(const std::string &fontName) const; + /** + * Retrieve the font name either from the filename path or from the zipFile content. + */ + std::string GetCustomFontname(const std::string &filename, const ZipFileReader &zipFile); + /** * Static method that converts unicode music code points to SMuFL equivalent. * Return the parameter char if nothing can be converted. diff --git a/src/filereader.cpp b/src/filereader.cpp index aee33a5d00d..579ad5fa655 100644 --- a/src/filereader.cpp +++ b/src/filereader.cpp @@ -47,6 +47,15 @@ void ZipFileReader::Reset() bool ZipFileReader::Load(const std::string &filename) { +#ifdef __EMSCRIPTEN__ + std::string data = filename; + if (data.starts_with("data:")) { + data = data.substr(data.find("base64,") + 7); + } + LogWarning("%s", data.c_str()); + std::vector bytes = Base64Decode(data); + return this->Load(bytes); +#else std::ifstream fin(filename.c_str(), std::ios::in | std::ios::binary); if (!fin.is_open()) { return false; @@ -65,6 +74,7 @@ bool ZipFileReader::Load(const std::string &filename) bytes.push_back(buffer); } return this->Load(bytes); +#endif } bool ZipFileReader::Load(const std::vector &bytes) diff --git a/src/resources.cpp b/src/resources.cpp index 152a7a42a11..dab27538a7b 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -114,12 +114,15 @@ bool Resources::AddCustom(const std::vector &extraFonts) bool success = true; // options supplied fonts for (const std::string &fontFile : extraFonts) { - std::filesystem::path path(fontFile); ZipFileReader zipFile; zipFile.Load(fontFile); - success = success && path.has_stem() && LoadFont(path.stem().string(), &zipFile); + std::string fontName = GetCustomFontname("", zipFile); + if (fontName.empty() || IsFontLoaded(fontName)) { + continue; + } + success = success && LoadFont(fontName, &zipFile); if (!success) { - LogError("Option supplied font %s could not be loaded.", fontFile.c_str()); + LogError("Option supplied font %s could not be loaded.", fontName.c_str()); } } return success; @@ -228,6 +231,23 @@ std::string Resources::GetCSSFontFor(const std::string &fontName) const return font.GetCSSFont(m_path); } +std::string Resources::GetCustomFontname(const std::string &filename, const ZipFileReader &zipFile) +{ +#ifdef __EMSCRIPTEN__ + for (auto &s : zipFile->GetFileList()) { + std::filesystem::path path(s); + if (!path.has_parent_path() && path.has_extension() && path.extension() == ".xml") { + return path.stem(); + } + } + LogWarning("The font name could not be extracted from the archive"); + return ""; +#else + std::filesystem::path path(filename); + return (path.has_stem()) ? path.stem().string() : ""; +#endif +} + void Resources::SelectTextFont(data_FONTWEIGHT fontWeight, data_FONTSTYLE fontStyle) const { if (fontWeight == FONTWEIGHT_NONE) { @@ -271,11 +291,13 @@ char32_t Resources::GetSmuflGlyphForUnicodeChar(const char32_t unicodeChar) return smuflChar; } -bool Resources::LoadFont(const std::string &fontName, ZipFileReader *zipFile) +bool Resources::LoadFont(const std::string &fontname, ZipFileReader *zipFile) { + std::string fontName = fontname; pugi::xml_document doc; // For zip archive custom font, load the data from the zipFile if (zipFile) { + fontName = "GoldenAge"; const std::string filename = fontName + ".xml"; if (!zipFile->HasFile(filename)) { // File not found, default bounding boxes will be used From bd53e2d88370531289dc9d0ab946652bcafb1df6 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 2 Feb 2024 09:39:30 +0100 Subject: [PATCH 199/249] Add JS option preprocessing functions (experimental) --- emscripten/npm/src/verovio-toolkit.js | 46 ++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/emscripten/npm/src/verovio-toolkit.js b/emscripten/npm/src/verovio-toolkit.js index 68714185384..3b598e84408 100644 --- a/emscripten/npm/src/verovio-toolkit.js +++ b/emscripten/npm/src/verovio-toolkit.js @@ -1,6 +1,49 @@ import { createEmscriptenProxy } from "./emscripten-proxy.js"; +async function solve(options) { + const res = await fetch( + `https://raw.githubusercontent.com/lpugin/test-font/main/GoldenAge.zip`, + { + method: "GET", + } + ); + const data = await res.blob(); + console.log( res ); + console.log( options ); + return options; +} + +const convertToBase64 = (blob) => new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = (event) => resolve(event.target.result); + reader.onerror = reject; + reader.readAsDataURL(blob); +}); + +async function preprocessOptions(options) +{ + // Nothing to do if we do not have 'fontAddCustom' set + if (!Object.hasOwn(options, 'fontAddCustom')) { + return options; + } + const filenames = options['fontAddCustom']; + let filesInBase64 = []; + // Get all the files and convert them to a base64 string + for ( let i = 0; i < filenames.length; i++ ) { + const res = await fetch(filenames[i], { + method: "GET", + } + ); + const data = await res.blob(); + const fileInBase64 = await convertToBase64(data); + filesInBase64.push(fileInBase64); + } + options["fontAddCustom"] = filesInBase64; + //console.log( options ); + return options; +}; + export class VerovioToolkit { constructor(VerovioModule) { @@ -182,7 +225,8 @@ export class VerovioToolkit { return this.proxy.select(this.ptr, JSON.stringify(selection)); } - setOptions(options) { + async setOptions(options) { + options = await preprocessOptions(options); return this.proxy.setOptions(this.ptr, JSON.stringify(options)); } From 241f8650343c19df461bc7f5b949f7f4787b8c8e Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 2 Feb 2024 11:42:51 +0100 Subject: [PATCH 200/249] Fix const missing and remove hardcoded fontname --- include/vrv/filereader.h | 2 +- src/filereader.cpp | 4 ++-- src/resources.cpp | 6 ++---- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/include/vrv/filereader.h b/include/vrv/filereader.h index c6b8f862c7c..ea17d92de86 100644 --- a/include/vrv/filereader.h +++ b/include/vrv/filereader.h @@ -69,7 +69,7 @@ class ZipFileReader { /** * Return a list of all files (including directories) */ - std::list GetFileList(); + std::list GetFileList() const; private: // diff --git a/src/filereader.cpp b/src/filereader.cpp index 579ad5fa655..2a3de8bb94a 100644 --- a/src/filereader.cpp +++ b/src/filereader.cpp @@ -49,10 +49,10 @@ bool ZipFileReader::Load(const std::string &filename) { #ifdef __EMSCRIPTEN__ std::string data = filename; + // Remove the mimetype prefix if any if (data.starts_with("data:")) { data = data.substr(data.find("base64,") + 7); } - LogWarning("%s", data.c_str()); std::vector bytes = Base64Decode(data); return this->Load(bytes); #else @@ -86,7 +86,7 @@ bool ZipFileReader::Load(const std::vector &bytes) return true; } -std::list ZipFileReader::GetFileList() +std::list ZipFileReader::GetFileList() const { assert(m_file); diff --git a/src/resources.cpp b/src/resources.cpp index dab27538a7b..174b80aa8d3 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -234,7 +234,7 @@ std::string Resources::GetCSSFontFor(const std::string &fontName) const std::string Resources::GetCustomFontname(const std::string &filename, const ZipFileReader &zipFile) { #ifdef __EMSCRIPTEN__ - for (auto &s : zipFile->GetFileList()) { + for (auto &s : zipFile.GetFileList()) { std::filesystem::path path(s); if (!path.has_parent_path() && path.has_extension() && path.extension() == ".xml") { return path.stem(); @@ -291,13 +291,11 @@ char32_t Resources::GetSmuflGlyphForUnicodeChar(const char32_t unicodeChar) return smuflChar; } -bool Resources::LoadFont(const std::string &fontname, ZipFileReader *zipFile) +bool Resources::LoadFont(const std::string &fontName, ZipFileReader *zipFile) { - std::string fontName = fontname; pugi::xml_document doc; // For zip archive custom font, load the data from the zipFile if (zipFile) { - fontName = "GoldenAge"; const std::string filename = fontName + ".xml"; if (!zipFile->HasFile(filename)) { // File not found, default bounding boxes will be used From bf078a8b73f6ee1ef52c48506a896fe30004c6f7 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 2 Feb 2024 14:57:31 +0100 Subject: [PATCH 201/249] Adjust JS option preprocessing --- emscripten/npm/src/verovio-toolkit.js | 58 ++++++++++++--------------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/emscripten/npm/src/verovio-toolkit.js b/emscripten/npm/src/verovio-toolkit.js index 3b598e84408..6ee8b347c42 100644 --- a/emscripten/npm/src/verovio-toolkit.js +++ b/emscripten/npm/src/verovio-toolkit.js @@ -14,36 +14,6 @@ async function solve(options) { return options; } -const convertToBase64 = (blob) => new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onload = (event) => resolve(event.target.result); - reader.onerror = reject; - reader.readAsDataURL(blob); -}); - -async function preprocessOptions(options) -{ - // Nothing to do if we do not have 'fontAddCustom' set - if (!Object.hasOwn(options, 'fontAddCustom')) { - return options; - } - const filenames = options['fontAddCustom']; - let filesInBase64 = []; - // Get all the files and convert them to a base64 string - for ( let i = 0; i < filenames.length; i++ ) { - const res = await fetch(filenames[i], { - method: "GET", - } - ); - const data = await res.blob(); - const fileInBase64 = await convertToBase64(data); - filesInBase64.push(fileInBase64); - } - options["fontAddCustom"] = filesInBase64; - //console.log( options ); - return options; -}; - export class VerovioToolkit { constructor(VerovioModule) { @@ -225,8 +195,8 @@ export class VerovioToolkit { return this.proxy.select(this.ptr, JSON.stringify(selection)); } - async setOptions(options) { - options = await preprocessOptions(options); + setOptions(options) { + options = this.preprocessOptions(options); return this.proxy.setOptions(this.ptr, JSON.stringify(options)); } @@ -237,6 +207,30 @@ export class VerovioToolkit { return JSON.parse(this.proxy.validatePAE(this.ptr, data)); } + preprocessOptions(options) { + // Nothing to do if we do not have 'fontAddCustom' set + if (!Object.hasOwn(options, 'fontAddCustom')) { + return options; + } + const filenames = options['fontAddCustom']; + let filesInBase64 = []; + // Get all the files and convert them to a base64 string + for (let i = 0; i < filenames.length; i++ ) { + const request = new XMLHttpRequest(); + request.open("GET", filenames[i], false); // `false` makes the request synchronous + request.send(null); + + if (request.status === 200) { + filesInBase64.push(request.responseText); + } + else { + console.error(`${filenames[i]} could not be retrieved`); + } + } + options["fontAddCustom"] = filesInBase64; + //console.log( options ); + return options; + } } // A pointer to the object - only one instance can be created for now From 78046a7aac836739def4c47caeb77c6332defd81 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 7 Feb 2024 08:23:27 +0100 Subject: [PATCH 202/249] Adjust font loading from the command line --- src/filereader.cpp | 1 + src/resources.cpp | 6 ++++-- src/toolkit.cpp | 15 ++++++++++----- tools/main.cpp | 6 ------ 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/filereader.cpp b/src/filereader.cpp index 2a3de8bb94a..4703dd56a44 100644 --- a/src/filereader.cpp +++ b/src/filereader.cpp @@ -58,6 +58,7 @@ bool ZipFileReader::Load(const std::string &filename) #else std::ifstream fin(filename.c_str(), std::ios::in | std::ios::binary); if (!fin.is_open()) { + LogError("File archive '%s' could not be open.", filename.c_str()); return false; } diff --git a/src/resources.cpp b/src/resources.cpp index 174b80aa8d3..3feb2880202 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -115,8 +115,10 @@ bool Resources::AddCustom(const std::vector &extraFonts) // options supplied fonts for (const std::string &fontFile : extraFonts) { ZipFileReader zipFile; - zipFile.Load(fontFile); - std::string fontName = GetCustomFontname("", zipFile); + if (!zipFile.Load(fontFile)) { + continue; + } + std::string fontName = GetCustomFontname(fontFile, zipFile); if (fontName.empty() || IsFontLoaded(fontName)) { continue; } diff --git a/src/toolkit.cpp b/src/toolkit.cpp index 6496423907a..3552ff2279f 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -115,13 +115,18 @@ bool Toolkit::SetResourcePath(const std::string &path) Resources &resources = m_doc.GetResourcesForModification(); resources.SetPath(path); bool success = resources.InitFonts(); - success = success && resources.SetFallback(m_options->m_fontFallback.GetStrValue()); - if (m_options->m_fontLoadAll.GetValue()) { - success = success && resources.LoadAll(); - } - if (!m_options->m_fontAddCustom.GetValue().empty()) { + if (m_options->m_fontAddCustom.IsSet()) { success = success && resources.AddCustom(m_options->m_fontAddCustom.GetValue()); } + if (m_options->m_font.IsSet()) { + success = success && this->SetFont(m_options->m_font.GetValue()); + } + if (m_options->m_fontFallback.IsSet()) { + success = success && resources.SetFallback(m_options->m_fontFallback.GetStrValue()); + } + if (m_options->m_fontLoadAll.IsSet()) { + success = success && resources.LoadAll(); + } return success; } diff --git a/tools/main.cpp b/tools/main.cpp index ab9593f207f..d30a41fca43 100644 --- a/tools/main.cpp +++ b/tools/main.cpp @@ -293,12 +293,6 @@ int main(int argc, char **argv) exit(1); } - // Load a specified font - if (!toolkit.SetOptions(vrv::StringFormat("{\"font\": \"%s\" }", options->m_font.GetValue().c_str()))) { - std::cerr << "Font '" << options->m_font.GetValue() << "' could not be loaded." << std::endl; - exit(1); - } - const std::vector outformats = { "mei", "mei-basic", "mei-pb", "mei-facs", "svg", "midi", "timemap", "expansionmap", "humdrum", "hum", "pae" }; if (std::find(outformats.begin(), outformats.end(), outformat) == outformats.end()) { From 7607b265fc4527e1e8be619571fd28127fffeb32 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 7 Feb 2024 09:14:22 +0100 Subject: [PATCH 203/249] Use fallback for text fonts --- include/vrv/resources.h | 2 ++ src/resources.cpp | 3 +-- src/svgdevicecontext.cpp | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/vrv/resources.h b/include/vrv/resources.h index 42dc7a8afea..7988fb1faf4 100644 --- a/include/vrv/resources.h +++ b/include/vrv/resources.h @@ -66,6 +66,8 @@ class Resources { bool LoadAll(); /** Set the fallback font (Leipzig or Bravura) when some glyphs are missing in the current font */ bool SetFallback(const std::string &fontName); + /** Get the fallback font name */ + std::string GetFallbackFont() const { return m_defaultFontName; } /** Init the text font (bounding boxes and ASCII only) */ bool InitTextFont(const std::string &fontName, const StyleAttributes &style); diff --git a/src/resources.cpp b/src/resources.cpp index 3feb2880202..d2f5774be50 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -197,8 +197,7 @@ bool Resources::IsSmuflFallbackNeeded(const std::u32string &text) const return false; } for (char32_t c : text) { - const Glyph *glyph = this->GetGlyph(c); - if (glyph == NULL) return true; + if (!GetCurrentGlyphTable().contains(c)) return true; } return false; } diff --git a/src/svgdevicecontext.cpp b/src/svgdevicecontext.cpp index 3722ff299e8..1769f1f138d 100644 --- a/src/svgdevicecontext.cpp +++ b/src/svgdevicecontext.cpp @@ -187,7 +187,7 @@ void SvgDeviceContext::Commit(bool xml_declaration) } // include the fallback font if (m_vrvTextFontFallback && resources) { - this->IncludeTextFont(resources->GetCurrentFont(), resources); + this->IncludeTextFont(resources->GetFallbackFont(), resources); } } From 0a82570145717346c42e04e4c0cf85183fa3eae0 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 7 Feb 2024 09:47:10 +0100 Subject: [PATCH 204/249] Add support for meterSig@color --- include/vrv/metersig.h | 1 + src/iomei.cpp | 2 ++ src/metersig.cpp | 3 +++ 3 files changed, 6 insertions(+) diff --git a/include/vrv/metersig.h b/include/vrv/metersig.h index 610458329b1..585c259b9c4 100644 --- a/include/vrv/metersig.h +++ b/include/vrv/metersig.h @@ -25,6 +25,7 @@ class ScoreDefInterface; * This class models the MEI element. */ class MeterSig : public LayerElement, + public AttColor, public AttEnclosingChars, public AttExtSymNames, public AttMeterSigLog, diff --git a/src/iomei.cpp b/src/iomei.cpp index ad9afa02d92..aa139f99077 100644 --- a/src/iomei.cpp +++ b/src/iomei.cpp @@ -2629,6 +2629,7 @@ void MEIOutput::WriteMeterSig(pugi::xml_node currentNode, MeterSig *meterSig) } this->WriteLayerElement(currentNode, meterSig); + meterSig->WriteColor(currentNode); meterSig->WriteEnclosingChars(currentNode); meterSig->WriteMeterSigLog(currentNode); meterSig->WriteMeterSigVis(currentNode); @@ -6689,6 +6690,7 @@ bool MEIInput::ReadMeterSig(Object *parent, pugi::xml_node meterSig) this->UpgradeMeterSigTo_5_0(meterSig, vrvMeterSig); } + vrvMeterSig->ReadColor(meterSig); vrvMeterSig->ReadEnclosingChars(meterSig); vrvMeterSig->ReadExtSymNames(meterSig); vrvMeterSig->ReadMeterSigLog(meterSig); diff --git a/src/metersig.cpp b/src/metersig.cpp index ccd59b25e93..f3df8054d23 100644 --- a/src/metersig.cpp +++ b/src/metersig.cpp @@ -31,6 +31,7 @@ static const ClassRegistrar s_factory("meterSig", METERSIG); MeterSig::MeterSig() : LayerElement(METERSIG, "msig-") + , AttColor() , AttEnclosingChars() , AttExtSymNames() , AttMeterSigLog() @@ -38,6 +39,7 @@ MeterSig::MeterSig() , AttTypography() , AttVisibility() { + this->RegisterAttClass(ATT_COLOR); this->RegisterAttClass(ATT_ENCLOSINGCHARS); this->RegisterAttClass(ATT_EXTSYMNAMES); this->RegisterAttClass(ATT_METERSIGLOG); @@ -53,6 +55,7 @@ MeterSig::~MeterSig() {} void MeterSig::Reset() { LayerElement::Reset(); + this->ResetColor(); this->ResetEnclosingChars(); this->ResetExtSymNames(); this->ResetMeterSigLog(); From 3ce970896f424d8708e0d14e2ae88901fe796285 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 7 Feb 2024 10:22:55 +0100 Subject: [PATCH 205/249] Remove citation.cff for now until Zenodo pulls contributor names [skip-ci] --- CITATION.cff | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff deleted file mode 100644 index 02a863d452f..00000000000 --- a/CITATION.cff +++ /dev/null @@ -1,29 +0,0 @@ -cff-version: 1.2.0 -title: Verovio -message: 'If you use this software, please cite it as below.' -type: software -repository-code: 'https://github.com/rism-digital/verovio' -url: 'https://www.verovio.org' -repository: 'https://github.com/rism-digital/verovio.org' -abstract: >- - Verovio is a fast, portable and lightweight open-source - library for engraving Music Encoding Initiative (MEI) - music scores into SVG. -license: LGPL-3.0 -date-released: '2023-12-15' - -preferred-citation: - type: conference-paper - authors: - - given-names: Laurent - family-names: Pugin - - given-names: Rodolfo - family-names: Zitellini - - given-names: Perry - family-names: Roland - collection-title: "Proceedings of the 15th International Society for Music Information Retrieval Conference (ISMIR 2014)" - month: 10 - start: 107 # First page number - end: 112 # Last page number - title: "Verovio: A Library for Engraving MEI Music Notation into SVG" - year: 2014 From 84e0ab239502821ec1baf65183d5dc3a0a1d2efa Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 9 Feb 2024 12:05:57 +0100 Subject: [PATCH 206/249] Update cibuildwheel to 2.16.5 --- .github/workflows/python-ci-wheel.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-ci-wheel.yml b/.github/workflows/python-ci-wheel.yml index 219ed29ce00..f425bef5845 100644 --- a/.github/workflows/python-ci-wheel.yml +++ b/.github/workflows/python-ci-wheel.yml @@ -82,7 +82,7 @@ jobs: #===============================================# # wheels - name: Build wheels - uses: pypa/cibuildwheel@v2.16.1 + uses: pypa/cibuildwheel@v2.16.5 with: output-dir: wheelhouse env: From 105641f384bfed1390cf5dc7ff77beba6666670f Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Fri, 9 Feb 2024 13:03:14 +0100 Subject: [PATCH 207/249] Set macos deployment target [skip-ci] --- .github/workflows/python-ci-wheel.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/python-ci-wheel.yml b/.github/workflows/python-ci-wheel.yml index f425bef5845..ee9ee651098 100644 --- a/.github/workflows/python-ci-wheel.yml +++ b/.github/workflows/python-ci-wheel.yml @@ -89,6 +89,8 @@ jobs: CIBW_SKIP: cp37-macosx_arm64 CIBW_BUILD: ${{ env.CIBW_BUILD_IDENTIFIER }} CIBW_ARCHS_MACOS: x86_64 arm64 + CIBW_ENVIRONMENT_MACOS: + MACOSX_DEPLOYMENT_TARGET=10.15 CIBW_TEST_SKIP: cp*-macosx_arm64 CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014 CIBW_MANYLINUX_I686_IMAGE: manylinux2014 From e1f3a07190649fcf1e0a0bc56816747e922949fc Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Fri, 16 Feb 2024 10:25:30 +0100 Subject: [PATCH 208/249] import breaksec --- src/iomusxml.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index e7501b40ae1..cab02b71ddf 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -3625,6 +3625,10 @@ void MusicXmlInput::ReadMusicXmlNote( TabGrp *tabGrp = vrv_cast(element); tabGrp->SetBreaksec(breakSec); } + if (element->Is(REST)) { + Rest *rest = vrv_cast(element); + rest->SetBreaksec(breakSec); + } } else { if (IsInStack(BEAM, layer)) { From 5757ff9272ca2a6efa1597987c60915c9d583104 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Fri, 16 Feb 2024 12:54:01 +0100 Subject: [PATCH 209/249] fix doubled graphic --- src/view_tab.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/view_tab.cpp b/src/view_tab.cpp index ecd12728cae..c1172885fb7 100644 --- a/src/view_tab.cpp +++ b/src/view_tab.cpp @@ -98,8 +98,6 @@ void View::DrawTabNote(DeviceContext *dc, LayerElement *element, Layer *layer, S // TabGrp *tabGrp = note->IsTabGrpNote(); // assert(tabGrp); - dc->StartGraphic(note, "", note->GetID()); - int x = element->GetDrawingX(); int y = element->GetDrawingY(); @@ -152,8 +150,6 @@ void View::DrawTabNote(DeviceContext *dc, LayerElement *element, Layer *layer, S // Draw children (nothing yet) this->DrawLayerChildren(dc, note, layer, staff, measure); - - dc->EndGraphic(note, this); } void View::DrawTabDurSym(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure) From 7e54f758677039b24953acb4720c25d7a3f9482f Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 20 Feb 2024 15:51:01 +0100 Subject: [PATCH 210/249] Fix missing parameter in JS proxy --- emscripten/npm/src/emscripten-proxy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emscripten/npm/src/emscripten-proxy.js b/emscripten/npm/src/emscripten-proxy.js index 3f0c7669b5b..d7991c57b7f 100644 --- a/emscripten/npm/src/emscripten-proxy.js +++ b/emscripten/npm/src/emscripten-proxy.js @@ -109,7 +109,7 @@ function getToolkitFunction(VerovioModule, method) { mapping.renderToMIDI = VerovioModule.cwrap("vrvToolkit_renderToMIDI", "string", ["number", "string"]); // char *renderToPAE(Toolkit *ic) - mapping.renderToPAE = VerovioModule.cwrap("vrvToolkit_renderToPAE", "string"); + mapping.renderToPAE = VerovioModule.cwrap("vrvToolkit_renderToPAE", "string", ["number"]); // char *renderToSvg(Toolkit *ic, int pageNo, int xmlDeclaration) mapping.renderToSVG = VerovioModule.cwrap("vrvToolkit_renderToSVG", "string", ["number", "number", "number"]); From 7ce8b6d578958ccca81ad527fc52cc3538ff1e45 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 20 Feb 2024 15:54:07 +0100 Subject: [PATCH 211/249] Add PAEOutput::HasFermata helper --- include/vrv/iopae.h | 1 + src/iopae.cpp | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/include/vrv/iopae.h b/include/vrv/iopae.h index bb70c151677..7c1eb5c76d5 100644 --- a/include/vrv/iopae.h +++ b/include/vrv/iopae.h @@ -166,6 +166,7 @@ class PAEOutput : public Output { ///@{ void WriteDur(DurationInterface *interface); void WriteGrace(AttGraced *attGraced); + bool HasFermata(Object *object); ///@} public: diff --git a/src/iopae.cpp b/src/iopae.cpp index 306c96c4d6b..6fc7fa27d76 100644 --- a/src/iopae.cpp +++ b/src/iopae.cpp @@ -454,9 +454,7 @@ void PAEOutput::WriteNote(Note *note) m_streamStringOutput << accid; } - PointingToComparison pointingToComparisonFermata(FERMATA, note); - Fermata *fermata - = vrv_cast(m_currentMeasure->FindDescendantByComparison(&pointingToComparisonFermata, 1)); + bool fermata = this->HasFermata(note); if (fermata) m_streamStringOutput << "("; std::string pname = note->AttPitch::PitchnameToStr(note->GetPname()); @@ -583,6 +581,14 @@ void PAEOutput::WriteGrace(AttGraced *attGraced) } } +bool PAEOutput::HasFermata(Object *object) +{ + PointingToComparison pointingToComparisonFermata(FERMATA, object); + Fermata *fermata + = vrv_cast(m_currentMeasure->FindDescendantByComparison(&pointingToComparisonFermata, 1)); + return (fermata); +} + //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- #ifdef USE_PAE_OLD_PARSER From 383dcaf54fade21ceb206565a61b446edfa01ee4 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 20 Feb 2024 15:56:36 +0100 Subject: [PATCH 212/249] Write fermata for rest and mRest in PAE output --- src/iopae.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/iopae.cpp b/src/iopae.cpp index 6fc7fa27d76..938efd8d54f 100644 --- a/src/iopae.cpp +++ b/src/iopae.cpp @@ -401,7 +401,12 @@ void PAEOutput::WriteMRest(MRest *mRest) if (m_skip) return; + bool fermata = this->HasFermata(mRest); + if (fermata) m_streamStringOutput << "("; + m_streamStringOutput << "="; + + if (fermata) m_streamStringOutput << ")"; } void PAEOutput::WriteMultiRest(MultiRest *multiRest) @@ -479,7 +484,13 @@ void PAEOutput::WriteRest(Rest *rest) if (m_skip) return; this->WriteDur(rest); + + bool fermata = this->HasFermata(rest); + if (fermata) m_streamStringOutput << "("; + m_streamStringOutput << "-"; + + if (fermata) m_streamStringOutput << ")"; } void PAEOutput::WriteSpace(Space *space) From 00a53e54887df58215828b363452db99f5eb2189 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Sat, 24 Feb 2024 22:54:52 +0100 Subject: [PATCH 213/249] add filled half note --- data/Bravura.css | 2 +- data/Bravura.xml | 1 + data/Bravura/E0FB.xml | 1 + data/Gootville.css | 2 +- data/Leipzig.css | 2 +- data/Leipzig.xml | 8 ++++++- data/Leipzig/E0FA.xml | 2 +- data/Leipzig/E0FB.xml | 1 + data/Leland.css | 2 +- data/Petaluma.css | 2 +- data/Petaluma.xml | 1 + data/Petaluma/E0FB.xml | 1 + fonts/Leipzig/Leipzig.svg | 10 +++++---- fonts/Leipzig/Leipzig.ttf | Bin 127320 -> 127396 bytes fonts/Leipzig/Leipzig.woff2 | Bin 45096 -> 45060 bytes fonts/Leipzig/leipzig_metadata.json | 32 ++++++++++++++++++++++++++-- fonts/supported.xml | 2 +- include/vrv/smufl.h | 3 ++- 18 files changed, 57 insertions(+), 15 deletions(-) create mode 100644 data/Bravura/E0FB.xml create mode 100644 data/Leipzig/E0FB.xml create mode 100644 data/Petaluma/E0FB.xml diff --git a/data/Bravura.css b/data/Bravura.css index c4c899e374f..135c1441c3e 100644 --- a/data/Bravura.css +++ b/data/Bravura.css @@ -1,6 +1,6 @@ @font-face { font-family: 'Bravura'; - src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); + src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/data/Bravura.xml b/data/Bravura.xml index 6c8403f057e..bc11153a139 100644 --- a/data/Bravura.xml +++ b/data/Bravura.xml @@ -137,6 +137,7 @@ + diff --git a/data/Bravura/E0FB.xml b/data/Bravura/E0FB.xml new file mode 100644 index 00000000000..d31a94c6fb4 --- /dev/null +++ b/data/Bravura/E0FB.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Gootville.css b/data/Gootville.css index 68ce50f6a2c..c40a0ed2167 100644 --- a/data/Gootville.css +++ b/data/Gootville.css @@ -1,6 +1,6 @@ @font-face { font-family: 'Gootville'; - src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); + src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/data/Leipzig.css b/data/Leipzig.css index 3e434c0f8f2..ddea8607924 100644 --- a/data/Leipzig.css +++ b/data/Leipzig.css @@ -1,6 +1,6 @@ @font-face { font-family: 'Leipzig'; - src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); + src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/data/Leipzig.xml b/data/Leipzig.xml index fe1e59903e5..31e33ecb8ae 100644 --- a/data/Leipzig.xml +++ b/data/Leipzig.xml @@ -89,7 +89,7 @@ - + @@ -793,4 +793,10 @@ + + + + + + \ No newline at end of file diff --git a/data/Leipzig/E0FA.xml b/data/Leipzig/E0FA.xml index abace349678..804cced5bf6 100644 --- a/data/Leipzig/E0FA.xml +++ b/data/Leipzig/E0FA.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/data/Leipzig/E0FB.xml b/data/Leipzig/E0FB.xml new file mode 100644 index 00000000000..416d896d8e9 --- /dev/null +++ b/data/Leipzig/E0FB.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/Leland.css b/data/Leland.css index 35db26c5b3a..c94c3c4eb2b 100644 --- a/data/Leland.css +++ b/data/Leland.css @@ -1,6 +1,6 @@ @font-face { font-family: 'Leland'; - src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); + src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/data/Petaluma.css b/data/Petaluma.css index f0a19c22553..fcf2a0f807f 100644 --- a/data/Petaluma.css +++ b/data/Petaluma.css @@ -1,6 +1,6 @@ @font-face { font-family: 'Petaluma'; - src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); + src: url(data:application/font-woff2;charset=utf-8;base64,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) format('woff2'); font-weight: normal; font-style: normal; } \ No newline at end of file diff --git a/data/Petaluma.xml b/data/Petaluma.xml index fcc6082e623..6e4e06c1935 100644 --- a/data/Petaluma.xml +++ b/data/Petaluma.xml @@ -645,6 +645,7 @@ + diff --git a/data/Petaluma/E0FB.xml b/data/Petaluma/E0FB.xml new file mode 100644 index 00000000000..32346ea6de5 --- /dev/null +++ b/data/Petaluma/E0FB.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fonts/Leipzig/Leipzig.svg b/fonts/Leipzig/Leipzig.svg index 9672c1539a9..533fab01983 100644 --- a/fonts/Leipzig/Leipzig.svg +++ b/fonts/Leipzig/Leipzig.svg @@ -2,11 +2,11 @@ -Created by FontForge 20220308 at Tue Jan 30 18:14:47 2024 - By Laurent Pugin +Created by FontForge 20230101 at Sat Feb 24 19:01:45 2024 + By Klaus Rettinghaus Created by Etienne Darbellay, Jean-Francois Marti, Laurent Pugin, and Klaus Rettinghaus. This font is licensed under the SIL Open Font License \(http://scripts.sil.org/OFL\). -Version 5.2.87 +Version 5.2.88 @@ -182,7 +182,7 @@ d="M0 0c0 0 40 320 300 320s300 -320 300 -320h-32s-38 227 -268 227s-268 -227 -268 +d="M198 133c102 0 207 -45 207 -133c0 -92 -118 -133 -227 -133c-101 0 -178 46 -178 133c0 88 93 133 198 133z" /> @@ -2435,5 +2435,7 @@ d="M120.146 498.265c0.224774 0 17.1897 -1.82497 17.1897 -14.4827c0 -13.3186 -15. /> + diff --git a/fonts/Leipzig/Leipzig.ttf b/fonts/Leipzig/Leipzig.ttf index c674abd7203e3b26399e22ea0ade9812ed358cc6..8eafdf58bb892464610ba28c3e88d11d445bbb33 100644 GIT binary patch delta 3793 zcmZWs2~-qUy1xId-q>1bn`V)vfd&Zz_OyU)gV^jy*i?ow#1M(7ga8smq6TS$1W8LA zrGP?2WNB6n0;M!TMQxE7C5osWHAG2X!t*eWgNlYn7@ca2IdjgdTXnvF`|eVAslV?0 z%+>r4SA_r}#7Dakf!2qIC&V0dUm1qrNeN@MiwF%1N0vy)=otn*Zp~s@b^hitgdmO4 z*Kf#7$$lP_a0wx^NQ8{aH{|7tkrUp5kZ6?gvo@z}&3^TYsTrQ6GCFT_#*R%V<@A?K zRT=~*t@8b!g5Xvi)2ME4 zu!(Of_?Y-|1pAFEHyfP+wmQ{K$iR2W-_!t}+oCi_BkJ`M1fJe0$Y8*aYR! z1Glg-HpdQFjQ8U{JU}=Q&V&!sUj-3BWDwcJc1A8GG=z>AATAT5#5gg-lCajX`dMSF zan=hqhZ(z!9mtMir?GR{RqS^56bEtm2yqmgP)-zs%!9adZS#;3GDarI6q%9L^L{cj zOe8{?C<|>t*`(ThAt18T+=^Q~XGi2U^AL8cK_*2OTi9cBlG?)F;$H>{O`<30DS9?% z?X_6T0x?3=D$YVIyqJ^s7b>d$=(;*5DxPgpbJmmTqFke;wbzBlsr1g>Pd${vO}Kckw;^10Kcq z@dJ9;k_+TrQKV|bm}R0g-OgvtW10Jzk60YH7!!yEW%GN5C6>veK+$T^CQ+wo+Ukn6 z#ztu~U>mtWxS-q4&92x!z&_o+*#2h+ABSXz8i#R5sbitzpjaTz5*Laq#Ts#sSSKEJ z!cOi^X-=)qJm)~?Jm*^HZl?U=f?Q%kfOt_l6%3N2wrn%<3mbx~( z_Pgrc{M<6!n%zd-UM!R?Y;c#lkG|FFQM_osXR~Lo=b-1P=d_odSEN^>SGrfRSG$+q zTj(wIUh7@ztzXPrEMHu>__9uvYl2NLW$0;`oXQrLi(V8LeEW%u?=FRw~<-I^~#hCP)zE5abc02#N~Y6jT^g z8`Kvx5;PHvgKdNTg5!hpf@^|@Ls%iUst{>NYDiVc%h2_qb)ome1Ywb3HDQzCvhbYn zs__2shvBmkf(S`OXheKOZbV5$O+-(`aHJwKH}d>S=}KKx^4reQ4l!;q(J`B1a$`zk z24f~-jblAx^JDwsP+VeMZd_4ZL)_FV(Q3sS`I^pznZ(e#xeLR%2du#bN zylvtW>Gr%GraSaICU+X|lce|r;qcK@&|UIUD3Nbc1`Y@EeJ1IU9i2Nu3$nH zrRr48?k@Yx_OpS)+&ySd!X8~wVA1){Jyf3;fBvvItys6$d2dyTuq3Bs`isIZ#=n?R zOVk1CX!SaEmbyS)tsYcQ?z7t`-50$teP2hZur#=I-Is;?9sbTbka%F=VCcc#gZIl= zW#MHdWyi~gNgk;r*O7T-4XG<w@JTI+`E9@S0PbLwsDz3Zdu*Vbp$@2;<| zZ?5mFAF97!|Fi)$m^Ropcr-*cq%{<)8k!r18lEZ`py|~NYDP6rn{bnDle9_Mw6-a$N!?W2q-)YQJ!)n(OPWKQ zvzb!c+}Esc{-t@gMbP5j;?tsRiEdfjlG>8rQrXhoGTbuS@~~y96}75NTSHq@Tlcq4 zwz1mG+w9uh+kD!TZSigE+w$7_+Gg9W+kM*O+cVlr+BNMx?c>J;$0Cmv9UDIO@Hp>y z!tvJQFTYCus`jgg9jp%bj`)s_j@c7QC)!WkJMpwr+!@)K(OJ@|>C|hjyt?N!FRInjNg^sjW)iUcDM5G z@I6z6=o-5lJm#3Ex3~&8c(sJ|S8TFiy?Qmf2N$#aQ7h7-v*<^1W>Fo;$ZF3XjDcL` z^{yeZ!|SgGjqNR`k1BoxgQ+SYldhMFu(^eWmyiJA@}#hNF{#SAYQ5+w*+Pt+tVw&{ zSSFax^sT_W)eOZ^xm&2pVcyPR#77;LP5Po1k9uG}J$coMZ6rl1bOg1blYbEAld(4{7}BpdY7C^Jks{jY<`XW# z;uG}0?`6*~oAjWm$3xg|nd94QOy$-hI~%w8jxLr~7M5b8C5|jJf@902RZmU=IrzJf zj(B#>AS|XspO0cjh@#V{eR*W&W8SG2_!SI7MGLIa{x60oj7=6-)WdvjI2$bRpRR5$ zlS{qPC?;^3c7-ua|7p^enL@ll^U#{|A$Crp7|B7~Fb_V))I%ZgsnPjhru7y;9bgVu zJ3Jq(nJM6CCxq}T=1URs^$EmFWLCaQEM?TF6}-i4LW*Mz5(9c#gN-)C8sgcofm-VX zKGbDx+rkh)<5LTaT1mK#WWB@k`=rfMU$_JIV_0lOP%-*$rvbLPCFQsuBjYq=C+m|cps zjMf2s%)!id1Cx1dM*-iCst*LIHeLa$dDz@fdt)VpVk|JzT1CT!2!g;^`vVD81h!>S z+bDR2}+%q`>tmpN>_ne%~4InRt`Z$IP^T+TA;_kQryzI6_katIR+huUxnVsMPHw)+yK z64=Q~YyB;(A+QCP${d2fVMm^Ja0o1b`Hi9Oeg{EJ2ClWc276f`r!*tb&%mpjU`y?~ z3DH~`@M(qIUYnrw2BB6QE8;s zGRPnz@(52AkwM}E5b;rqR8dnzODXkuE!WGnN|o#NwDe5S_OzMI_pg7g_3yoB@0r=#hKnU?r9wJbJTD>arvt1c+2%ZNrUU7KXQZ=$cLWWC>eEG`xUgg>AM-hS) zh9`Wuacz3{w!#>MEW;2oE&gy@rUW_T9SDhrm^f?w+AZn7{>ror&+Qm)vOaZ3a^%Xc z9;T@Z1oUXiy0y7UBJ-C4OmLhz{Zbf@Whn84=|IMCS<1%D?JF<*=)myn2$^T6Zu)R7 z=fLI&rh{RG*gYH9ZciuN;06-=}ZdlBqmidIf+7@M_h!@;$A{bNC+m2P!a*e1|p5v#@Je-hUg)BiEG3I z;t}zRC1u63I$0yEN30iY7BeFXb|5=~oy^W)m$GLxvM1P691DavN=_(;nIKLCskM4J zJ*rf+5v8F`C>W$Pui*dTHG}_x zpWzn#1O6Hh;(K@q-^UN|H~3pTLJ!(-f&50aEO)>Rn+IEL<6$ez_u&s%H(QSg90dnw zbO`s_#EAk$(V`?#i)hmJx?PQZuzjzCdZu7zt5_y3m=!Q9WmdtgQAaPwILC6wM^2tj zc}`a(d`YS#Pf{YOk+e&CBoCaCv)nn^xn9bV21+xf71CDbcqpBkt(mQzZIFp_WvgWc zGM#M9h3BGhiFVoGlI2q3a>C_`Tqci|m&p6%kLF0`9CUSb?VDTbmN_rWz1Usn-sXPY z{gH=>hmS|7M~p{?N2y1zC-M|~hIwxH?Dc#xUp7B&e!D`f$Xmc#u-D7g>za3gkIL7< zchYa%|DjT#bW^TY<|zjk$`|I=FB}VS4ag3t4CoHH88Es?z9?}~{-T;iLxH?NRbWQo zK#*6EIw&?s8}u+32dje%gU<#(TP#_uTAa4HZ1LdYNtLTgsftj=s!~0`Rcbb=} z-!;>4B6*QMkx`Lxk(rS#k#`~|q6AS%Q8iIx%Y&E4El*vpT|ONBdWGXk@ye1_BQdTq zBdb&XHW4d~^?BbfF8+huYw@c1<~3exHmvDc^EzR5VnI^Oy8h(H>jzSb{~otNvZ3=I zm8pibr1Vvr?KZb%ByY*e9NRkZk!X9|_K6*xI|g?=%QDL<%zCjiai<|$mED~Ec$e3% zl3j*fqd9IlemQYD1vxi!J#$NPNAtGjO?}*$zdHZXZsqR!0%?J64{y(g+&%q!HGAv# zarR~JdsP@yIQ&WSCw-rcXic;dtwO8PuFxiGbF|G`!+x}1xL>h9YJc(mS4Hw7)u+h^ z@PV;|0S6mDcm2HL^WM+LirtD+iw_pJ7mt%NQbop+d1O5~R^nQcS<+KtC>c8>Ka_Z= z;?TgMiP9CNy3%3Fk1C{c2h04*3d-8by36{?2Fsot<{frDJW{SHFDUORA3x%Hq~OSC zMPNmF#jB%|qrpehjjd?SEg20R^F_fI;K39e60T1WR+J{SXEM0QB`}@K-F;7 zld7p|LA7UfV0CnLQgu$Xwz{&qwYs-@u=-K;v+AiDUX5psre;HpHn*m=X0YaUtz)gC zHncXjHlsGLwzT#{?fKe)+Q+q%I-X9Z^U-N^iMn*%UR{N*S=XZ*)IHWs)d}llb%Av& z>eA}+>+0*y*A3K-)tl72)~{lY{QAoJ^Yz#3N9!jWEE?<@WDSajz=nv1godn!(uVei zo`(L0p@v5d&l+=G8zUMs8V!wOjW3!|lSPwVldQ?7DXb~Bsj_Lb>E~vvk$5W2CAMZatenNSo=)}X5p(pcC_MaSUv1svWDQ+1(6@2QzsqRyQt*ln} z*67yM*232M)+?>!t*=j;oED!}oDMska60QhNA7>jKUpoOhud&lRNHkrww>Re+1_ym zpGi2=*WuQo)7$AY^*^7DJv(wvc`onV$oZ)AhVxG^$S)*csK4;IQ`6blWzwbT%Iccx zUe;aOJ$BLIV%o*hi-sPbp2D8NZVdM?>+kqV`c>Lj z=Wn{-th~j$m2+!kKscZt$QdXf7`m;#edo^hy8(A64gFsaeLX%X7>ph)AAEc-;9l{) z@ge!ps-eF7!uyK*8qWQ!`|bCi(K_*M6U+wsBNqV&ubfS)6hiXYyf|(H>Oh@nn8fZ? zWUYG#5ajzF?;8`&di;gi7f35lC4DmBB`_{prPz)6e1V6M0AWz;Tvh|ASVvy1L?J-QZU29(Ufa~0XUco0OoQw z{cwq|CB`PS{d>#Un8l^n#c)_yWJzy~eQe=siIA;yj@-xJ&&yV1Bjj?fMJhv7{*{ZC zE>-T4$nssBB(e~-bQXPNeLe>hJlZMkQ!rx7CRwgekLC^2oax1v3r`=E!8e7WS^T zE*7)x2oB3SflS@9ioUev9v3?~(B(U2z##eYZaaD?yX~!QPuJy$@EgAaeJ}4_z~1v{ zS^oRRIQ{YNqtjfnr*=AjnRZdzz6{`c&$AEr!so~ZML~2&Ve#8okWuo9Hg8&DUUYzO zJ$q}IlN;^kaojz=Gv0d9lpEb#u}%PqB>$8RRuJUeQ)}S|^1!K8_?JNXhf`W}Wq5UNh0dT$sGr&4;R`kCc~J}s(xj^!c+{uoVJ7)sT_qqTcXh9%Z+EZ4<_pj| zrV2WO8c-XlxFn&X^dKZZyi`iQYp^1@z5B`I_XK2Z?i>mh zx_~L1Dp4~!^PA9yJaD^YTBx}5*|c!r&Q?0??gW=0cr1G1H|aAdM;^G*cc1oStdx+| z&us~=1Bbrwyd4-$Z~kf2h-CaL4?6GVurY^@f3?em418unUi_C0)yjony&o{e&(O~> z=5qA!3E&(s2E`cml#394rIrhTr}wgf``B_mLcTu1*xSq2*V~4&w}ZJrP+@i;vj;5j z_7k)CrsiykwVSupv%D2Ap6AY$>37>fG#e7BGH39iOdMe*^`kQcQ;Ck?#E7G$;D&)i zonojRU=|T?#))TYHm2G`XzDWC0?Sd}8?Buac)ro@VV;DyS{87?oBCD;O7lOc_3je* z2SBn>7-Q6Y@Q1Flq~QFgWStZ~1NeaQk-=gtpF>$YfRNJ4AczrtDFcngZ!McLC8yrW z1vUVlW2WCPheLekEk)^+;I03QKSTn<^bBhO9&j=9^ntk*+eyF^Q{M-J*m!5?a|7U@ z6}I-(TQ7q!jIDY4ziQx8IKjf8pIHKB1fEGyXDE1zSwPj5K^C?&(>ouA!{#`^R^O?E zFdjA&>M;#n1oguikm|qhfDW$MA2BsA2ze|k5Q=62^A|E>;LMhKf)BYlT}WN;h78P8 zQb8BN9gsfdA}Be81&2-5UWG`kG1pIAg(Lz?Mf%lW!b$@3O{kOo@K@|;s^@$K)_|>n zvcCx-m;?H_o3M`s{?wy8(9OVN12|A!cR|DTMhfJC7EpWx$XVVBj|EhK0Tx>OBNVeP zW6R$+rAd4}y*!m~C6xx44d3Z|4baWj=RW`sLa+Z8T4qq|pTk_?h~}s1?~Xryz5N?; C?mL?R diff --git a/fonts/Leipzig/Leipzig.woff2 b/fonts/Leipzig/Leipzig.woff2 index 3f3c9daf924516db943e42317a9cb3a736be4d84..174d3b074450ed34b0a1f3d3c6a9ad5414227368 100644 GIT binary patch literal 45060 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

?0wt zp#gy|Dnq4-1hoXAGX2i1T;s(CmC2uq$4Fe9%CRa33yYNFL$~ktgi2EIrzSH za8}?*B!EaoBYRX&`2Z?_5$bPhShH3F)6lyXB|H{mE_-tpMLP~XOP8W~O6I*ExrX6b z38PCZ=Qp#ddKad;dG9Afgr}b8e~->W6`P|z(IM;m9hf$*zRY7HkRK1pV8Y}^6?%CF zt7G72(hJfmEiy$PI)VKRf#-$#a715l_Fc2k}sn|LL06Gsr1 zQ>OE@gvVa;k z<|79#T_CQ{i2UzccueQ3ezF*wA8JzItUoDpII#*()5(yge4ngp#OTyQ)yEeWjRz)PZDh}GUXQN5ZBbCVYG#{K=5r)=l zp`_e9-hQMQ7XjJu|Dw$C-MUi)2>yb1A@sa1G)Krqk#J+V+%&eJK@CW3U&*qJoP~Pv zB4&T=RqG7@e9YNh7==h()0gQX?z5ef&8qW)=Xq%%@A(ScFzPNrf%Q90#Ken6S zr|=@-1AV?q4rn*saXkM${21ppKw(cn+4UDA4-RC61byT436k;p*mvx66=xNucmX+Z z1cVY^P8d-%MiwVO5^_o4r;gFYYXyOgzm%V+L{?^@9= zbQ`A(pzPtB_}2UDx7#rURs(v{q+|7xa=%|h`7jUns-1#Ucy!`9Oxy=kp&!sCWo_I? zk=nO5mu-ogVFtyT3<1+>-;*ZHq8}V?t_I{yExMl+p3av9;im$(@I{|*iDpx1C_fBt zVR=L$4)Sl@Y*kX))FS2m0|fd&8RR-I6z#!Ao0{rAcUNE>-2B{VOPu>11KcTRV#C=a zm?`h^Bm~hnC@&Q%hTKQA_1Y)3RJ?WgbqQ9{qs+{W^+~45JLqyNZEOq-^m4f8Sd2PX zyK7Fh(DC^WJMkL27nGHjkBucm3h9YC+8*`CW?YAnBMwc#NGn3ekA$HCEv{qH>ME|U z0@|2i8yt`UQp*EQ7&KPlJj;s__?MWgdjp2~1>mDQI%|Y>EZa^OXF;h=JTPci=u7tyzpSP>Y5iZOuy(wU!CujHY*s zS~Px(EjYjP!F|JvKr^l(2MW7SpfU0?dpoAiBywHsB@6?H`YDo@W9TCBv(-{?u^#Gr z;)U=iq&1w0nj=kRAC%hMaVkYP{j`S<;kk>*1At(uQ-5#OjYZ%kzL@^5H)GV7K9ofF zL zkFzY0+2;s+@dQ~Ra0OJ*=vz1^u?RlJ4&oaC(YXTi)sbTSxzS5OsGqFY_fMFQ?`n;C z=XW$lj;Fh~CPs7nWZhkr_lbgcx@tS2jG=XfV@C!V+e5HeylkG1!|2E0f(eJaqM$$v z;Wz}L4I9NtCK!p;?AxOlA8VC@j)$xk84;5wihr`@6<+^^>$y2w;+|;VTX1Hk<+a7g z%fe=Pdpe8^5*0@u!K zwy;J{LK%}LN+aeW{vHRT=f>_#|3Wo;e@Cx>jD}zt^WW2N0xu+$HK=UECX8(D)zEf4 zezgWH`Q1OP#b&Qgr2nY~DtX74@~HDU+fTdltel-Qsr@0E3Y>Vv)r^i>>*&;|o6H}h2**fsbJ>x8xC z(ECyFD&N_G*5t^$L%k}zU^Lm^CR-6-`%3GRCZd%6of)_-8D#t2-x@YPd}+HI1wS|% z|DA$99D1_Ilx#9!_8cF3sj9C}<9z=C#s@+><>Dvkkq<`yh>C+dBX`=+kg?t_#&x6W zEzl9WhhToKvar5sPP0&i+&Vo*=VRhTxP15>dt1xJC`@SU(C|V=br>-F03gR6hG;7E zj_O9wJR?EZ^JPMD-}|?LcmQc?ERNPih}u!@APgb}GZwBq>>j*BbwVPF{FpkS9idlc zFdm^8%gB-1poK+SfJ0{sp;wyT8hi-QC-7uP%)qnpMBok*9VNEfpUEl!A8-zt_SJx^~8&U2X4rb|Mn13jP16 z4;h#{Oz{tX|a!Lx~-;1?y-&f{>2jT@4D*@LY1cPEBI`%-6? zqGO8!PVG0>a)OL<_W{#dd1`%d4tRPv$K+jO-!KK#tSbkev>W|4Q zL-~6H2P5xbB(bAO!;TqTGb?GK1n7W8vvF2;pzXXfpVgm>w`v`-P_2C^aIP*4m&6x`G!_dqvVwM$Ag^bBUb9q zDrcx+n~;OMkrtBGDLbj}lJCU$>{MO~O@43dCGj0ktTC*_udLq6=Sa|rrm=neR&4*; z4uO9Z3meNcn;d_Q)%bB4$8$ReUryUdbEJCCkvELhy^@oVk!VQLUi{r6%Yh$guCauq zLO=0!*?cSkF++rz_NS-b3!1**C`(El#5Ofb*@%8%=o6bOV@}B@=QgDg#f^Q5kcH{vjzUo>+| zPiycbwsHJ4(}owFEJ8P1blfr$QCZmeS{^h;jT3gkmY`d#6%E)D-AS;<(4CzszVC%j za_*Rah;S5+KHZrhJVek>a@siju07w3A=+=ZzsVraefmyV8PYe+?T`=0;^z}np4ne; zU`@V)_|@h-Pz;q@ut^L1JR5!LSY#ta-v_MD%H5{agB216&c!-k@P*zg5g2*eq50m( z6T;*>1xBU?5P|&elq&K^yVzLl>0eITypkEgQ&O;OFHHB}A+mSmc#mhur>*!9Nh=@v zDuZ9jM8^5vr2bN~y3J#$fc=PV0lO_04pnYQIiM75#6!mKa^%|emcz3($JVhk*sR%4 zzVv%X1o&j4i5o9uiZD3X=8H+;Zy)^n0VtwCih=BKUkS$2!A^gZL7gIR&EO=s`UVyXohfwo~+Pp4mFZiXR?jgqQ%YVnR{HP0DwqijJ3^&*s^r5ry?Vu)I@M|+yk@18 zyrAlC&@>SfvOc`qH&XLhks^^my(db<{7H)iZE6NF#!9~$ibHgbpO033(VMWYdPhUw+%RE&K{9C#vwDb+WAZa+u;BVojfILKu&y_ z!v)7xb?3MjYORvUk;ZzBLK_cDwp#ak8g$pe;FKnEcYD-+Xb8NQcughyB%JHNb^$y% zDlo_rYav)FueXdFpA!hz!&9`E`XDWtYLk^A=yFhLDm{CQ)WSZ9=t)x;GQLn9(DgXYoya`x!RJ>)heVu5k8 zSB})`wv6>uxba8L|8pGS2;n+w!>8PmSi^LQgRpph!K>z)jif&5kf4)+htM=<^afL1 zS4uAN5T7dRDtl9E!pD#$NP=V#ufjcIXG`d5X=K5Z-!mmnZu3(xoUx%AhQR;o1$ zSwX4Dz*xdc`rrKwU`CeFJY@(z6V+CYpJkWj@_4gDB%!spkcTd9H=#o)15^B@qTa`7msyQ6X92q;^deAq`==E zUCq4S__6+_$rl+kUR+XEuMRtT5HkRWbVi7(7>Vn5k2CtR{!RpI%Mg{sPinzpjD^e? zS9I2yQY~FCW)0WGG`6g?N^Wf$(x{l0YEl&+R$>~aWb~ATc0xa*D~?!;dUiXIOU%GG zuemjyksUei88lq8vPbDSqr$6ZLOWVMxB(TTF>*LMv;y~>E?+WMORo8>oj5&}o!16; zl`n_Cl2Ncqya>IzKin$abUsR7u9yavxa=xX6j~$>vLt>H>rH6PYWzFXpATuUCU6$t zKxl%4?w$Ab*ZYbKlza47C%-sjGUUR7aL>4+v^Ak zksa1Dx*PapT3kAh7}35>MEajRUL$#LyK2(;KEwNg^26Qt!!%)y0ZFLBt$h$r*o?P4 z4k}U)1a?f2$hqP69mM3`WG7$Fa8K9cE!YQ#!&nQtj;_w9e@>pxt|h%Mf_g6H$S=bQ zHa_ZrD?iq|v`KAW8?iFBIkc^nvPX5HKT1F*3%e12<$)lt4yB_$azwdPdFjc$@-ak( zu)HvfY(o7Gk9UxptZK=jKz{a7=?vYuU4M4nAD2 z++^9+XC8887eqsI9Yh;6A&C>LWl(}_KUz!3&Pb9Mak9Z`1fiJ(~Q@(LzpxK765q zU;=hhB440g&Q>nUf0KQSL~3$1+(d>_w^cUuL-o^@m`$!NzJnWs0?9cgyYV&j{Z;d+ zs&>Od`#q07q0hIjSYpkiU$lgNY9d|>7~?HJXgSP`0|Tfo;0bS^claXb)CJ&D@B|p2 z2il}DCw}k>fGI(U5cRHUNUUmw=KQ4HEm0>kMCbNrp~wkoBuMl8EJ>On%!`+}Wd@)= z;x!#XA9s0A&O-DHIn9IgSrTJ68*!$2QMEO|h@7)XTS=4T3+T?B z9>o|p%tW5f*bL=5Z0{|tjhUj83H+3GFBKs^N)<6Y$2t6=+Gh@p?38Tzh8w*Gsi~`sYmu{h(E=za(UlAnb-V!heDU#3rz^ z!$V=pVU)@ZT#0v%iR7?(qXRctq* zaooFrF0SXF3Yly>e^IzO2AR2YpUap2;=BRLZ#h!8!!ztyaSq2Co_#jDqvUfO5%=}i z@CgpYyq7Ph25HO8bKnsFSlsK0W*gT>y0tyZY`Z>YyE6%;aLwTvhK}A&BcPBswx^VX zUZ!SIQm|EVsD56zii{;V ze=8Rf@8}N;KInJPE~y*#0gT@D*{+4y2SuikN{iY1a}ND|@$e0Tc$x$UDej&(Om0Z7 zLq27YR}Zckv0)l-C2t_`Oc&7)iDwyq3de8t&_B*I19-6K#Y#DhqtSXWas{^0oV{xO zaye%Ry($rkqyOHT2a-Nts`9gZ+CV7Qa!)8F8AgkMj}lf}QAtYu&YpIUW}u)Np<~=j zAe_lB6(ESt^3baYM$>SDqrTDRlFIEL(bH#tk2V6>ORiBg^rI;;>NIUC*(d&}A)^7HFDyiMkeT!(MV2v5^}HK&lqGyDPW z2}vCQPcM&XkX)t|RI~N8a$HCI#H75gNbW1?fN#cDXdK$Joq&LwR*a>&Q^lDh-^W|X zO1wv&TO~LLO#kQ#Y5|G_>g#VbNkC6G;l*|c-o5=NEFQmVB*HNMi$Cb|A=UF)(^R22>;s*aiEHqd4-=2yU`J(v(~zc+V+~YXEN!V z1_L7=ot!Mv({Le>oQ*0x3q(QC20|$yZ`5zkC-RyooU=|X|HgAW;x7-Pki&O_sgj1# zVh(?77cEBFmlyzq*36ILwD}j_5xj3VYtfP4&0GI>gFq4oQ5GWzv4MXPjs{1p^hC9N_<-1%+3XV? z3utB0Zij}E;auPhkp+8x6ccaLRYpre-Rcka8GQfKGR5mgFQoxRa(~5!e0^-z23?VD zZ_KEU7f&XvXs{c!eB+7H+m)!n7kHIgjQ23}q*-n>e{~Ra=ohPJC-^ra|GF)_*qnbG zk5g?@4tPnMcIeJavzxh#CD)1yS+m#@;v$}T+Y@|y$nw{?C0pQOT?RuYB3NE}-Q|}j z0nH6Q$F7%f*Pxl%#+XSxwA#ItJAl*~r2t0pdE3}|08U_U1E;@Q<>c_yQ@M7hnKi>Y zH2^vUsA+0zzz%}9Z_yfbC5TMteyzdcC0l%Xn&{t+Y*AiYVS6YdLC^@3&!G)s-fS(o z8J<5`6^NVc`#MrmJSOW+{zQJ6W8oERSx^Q&_c9Hn7O-bQ5RDK zK9P*28=Mcw0nO%f0kP(Itm@L&7lVJH7r(QonB04BXO|N+;aL}|hP~auW$q&0iKg9? zHw+X7HuLQ( zPkYkt=lcc)6)$Mr0K`VHW)T(cT;hz5g?+m-nMYPegyGi~e~l{!9?vxUO3h_ZB;(Hodf1a+LbAud8-xz=!=5xDwPAi12sAPNtRs z`Hm24j`a2)#aM3^WXX1n3kz;?gl4b`%u-h#@LdB{_>}@`-ji{3WS_N-gmFS9%9+*Re(+}EB|Tp4ba=y^<;vT3B19TF_}&sSiL0`Vav{fq*VWta#`gw)`-z2F9PDJW2=8L zsk1Hx;qfl?ZnzzjAZz@pv}uGs4_XBE+%;}5(zJqnqgUjEk$#5GWlyXtL_m<@()rYB^M6WI_nCom1FqZ=EUP(q(7Y-4bC4hZCSEtKcb0*NYiVz7OvJl zvRea?T{E?%a8n1)Y;Ogp)6LeaqYoMKqyM!89EXHQPpS(8XkvJaKh{FD*H<(7Rxm`hZGas{0?H;<_cdS-t#qCkml*!3y+?gBkym7%&;F~=HRwA>Y`$0tVKyADv1Hm z{CRs0D));Hvg?Wte|PkIT)=;8xsx>UinKD8Jw-hvd-g6tF7de?7lEHB^2YGf4hiZp zb}V8|(=|&4zs811_8ajA?m@~|AW@!-YeU6!t~QCJf4o9@+>$8%z1FXa%Qu=eft!slNM$CJWg;um3$}_s z7rSVN@OPm2g0)ed%Bx<7q^OC~tsS^&rJJpFRnv?1=U*>fj!1WC|C^Wz36#F*Aq^Ft zdLtZwk5A{Y-|FzVKgyZMM~HMU%$j*aUw{QbBM}PvgMfkoq%F-8&hLKpNw%s+W=fpz z-+Bl9T;Q$ueCoO#5D`s8SDS~Qug6;k7lam9grks*oHD3i!KII5K#CkdDU+>MEMLH> zlDB8foWQ7kfE7s6CX5}x7E4#n zo;^VR9<`}kyNH#aqOZ2Q!vFuh5TSJZ^7iQ#UYIe^h*Kz&PCaXLx5y&&&|N6mWbm+h zf4Dm+{JnU3v;8wq;t2&_r7svPX;Cm;(LhJCIOftU7zSb}wjGQAIvihD(uD0d^lr4e9S-dKa6$N97O-Tqc55p z;;s=O`>*N7(l@&C|Nfh%Rk`E&)^4gI>W>Z3_QM2d)SE|A_Gz%~;UW5-EdO(%Wb=Pz%URw=mVf%6M7%C|Mf@MEhGRj?x~g&M zzmLn~Bb9%AuaW=Q#9IGFf;!gn6-q_ZrSU!dFWKy%`-6fUUvK#x)8D#aARzxAPpvKC literal 45096 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 OBjlO?)dlfgss97BHU2#S diff --git a/fonts/Leipzig/leipzig_metadata.json b/fonts/Leipzig/leipzig_metadata.json index c0a32252cc8..ee909e258c6 100644 --- a/fonts/Leipzig/leipzig_metadata.json +++ b/fonts/Leipzig/leipzig_metadata.json @@ -30,7 +30,7 @@ "tupletBracketThickness": 0.16 }, "fontName": "Leipzig", - "fontVersion": "5.2.87", + "fontVersion": "5.2.88", "glyphBBoxes": { "4stringTabClef": { "bBoxNE": [ @@ -4972,6 +4972,16 @@ -0.528 ] }, + "noteheadHalfFilled": { + "bBoxNE": [ + 1.256, + 0.552 + ], + "bBoxSW": [ + 0.0, + -0.528 + ] + }, "noteheadHalfWithX": { "bBoxNE": [ 1.256, @@ -7766,6 +7776,24 @@ 0.164 ] }, + "noteheadHalfFilled": { + "cutOutNW": [ + 0.14, + 0.24 + ], + "cutOutSE": [ + 1.076, + -0.24 + ], + "stemDownNW": [ + 0.0, + -0.144 + ], + "stemUpSE": [ + 1.256, + 0.164 + ] + }, "noteheadHalfWithX": { "cutOutNW": [ 0.14, @@ -7860,7 +7888,7 @@ 0.4 ], "cutOutSE": [ - 1.42, + 1.4, -0.4 ] }, diff --git a/fonts/supported.xml b/fonts/supported.xml index ccd9a8d22d7..695b187c50b 100644 --- a/fonts/supported.xml +++ b/fonts/supported.xml @@ -269,7 +269,7 @@ - + U+E0FF U+E0A0 diff --git a/include/vrv/smufl.h b/include/vrv/smufl.h index 5e70fa53c69..300b9559819 100644 --- a/include/vrv/smufl.h +++ b/include/vrv/smufl.h @@ -106,6 +106,7 @@ enum { SMUFL_E0F5_noteheadParenthesisLeft = 0xE0F5, SMUFL_E0F6_noteheadParenthesisRight = 0xE0F6, SMUFL_E0FA_noteheadWholeFilled = 0xE0FA, + SMUFL_E0FB_noteheadHalfFilled = 0xE0FB, SMUFL_E101_noteheadSlashHorizontalEnds = 0xE101, SMUFL_E102_noteheadSlashWhiteWhole = 0xE102, SMUFL_E103_noteheadSlashWhiteHalf = 0xE103, @@ -644,7 +645,7 @@ enum { }; /** The number of glyphs for verification **/ -#define SMUFL_COUNT 619 +#define SMUFL_COUNT 620 } // namespace vrv From cdd3b0d37e14dd2bd6fc3c9b525360e3e6b3f281 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Mon, 26 Feb 2024 14:37:59 +0100 Subject: [PATCH 214/249] Add library installation paths [skip-ci] --- cmake/CMakeLists.txt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 0c865ce37df..817cbad031a 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -242,8 +242,15 @@ if (BUILD_AS_ANDROID_LIBRARY) target_link_libraries(verovio ${log-lib}) endif() -install( - TARGETS verovio DESTINATION bin +install(TARGETS verovio + # for executables and dll on Win + RUNTIME DESTINATION bin + # shared libraries + LIBRARY DESTINATION lib + # for static libraries + ARCHIVE DESTINATION lib + # public headers + INCLUDES DESTINATION include ) install( DIRECTORY ../data/ From 43e44f84fdfd9178867ebc10e9478af896e4317a Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Tue, 27 Feb 2024 18:38:18 +0100 Subject: [PATCH 215/249] add CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS [skip-ci] --- cmake/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 817cbad031a..19a3028ccad 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -175,6 +175,9 @@ set(all_SRC if (BUILD_AS_LIBRARY OR BUILD_AS_ANDROID_LIBRARY) message(STATUS "***** Building Verovio as shared library *****") + if(WIN32) + add_definitions(-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS) + endif() add_library(verovio SHARED ../tools/c_wrapper.cpp ${all_SRC}) ########### From 3260a7cb433c245c8418f8559f7d1879f6aee90f Mon Sep 17 00:00:00 2001 From: andre2007 Date: Tue, 27 Feb 2024 20:41:16 +0100 Subject: [PATCH 216/249] Include info how to build verovio.dll on Windows using MS Build Tools --- bindings/c/README.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/bindings/c/README.md b/bindings/c/README.md index c25a089845b..118a10a3edf 100644 --- a/bindings/c/README.md +++ b/bindings/c/README.md @@ -1,6 +1,9 @@ ## C function interface -To use Verovio with any language that supports a plain C function interface you will first need to build Verovio as a library +To use Verovio with any language that supports a plain C function interface you will first need to build Verovio as a library. +The compiled library (`libverovio.so`/`verovio.dll`) will contain callable C symbols. These wrapper symbols are defined in `./tools/c_wrapper.h` + +### Building libverovio.so on Linux ```sh cd tools @@ -8,7 +11,18 @@ cmake -DBUILD_AS_LIBRARY=ON . make ``` -The compiled library (`libverovio.so`) will contain callable C symbols. These wrapper symbols are defined in `./tools/c_wrapper.h` +### Building verovio.dll on Windows using Microsoft Visual Studio Build Tools 2022 + +In addition to Microsoft Visual Studio Build Tools 2022, also [Make](https://gnuwin32.sourceforge.net/packages/make.htm) is used. + +Open `x64 Native Tools Command Prompt for VS 2022` and enter: + +``` +cd cmake +cmake -G "Unix Makefiles" -DBUILD_AS_LIBRARY=ON -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE . +make +``` + ## Complete example in C From f8f4c113aae629de9071e69ae4c3edbcb0f051b4 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 28 Feb 2024 14:27:59 +0100 Subject: [PATCH 217/249] Add cmake instruction for copying header files --- cmake/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 19a3028ccad..66030ba8155 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -179,6 +179,8 @@ if (BUILD_AS_LIBRARY OR BUILD_AS_ANDROID_LIBRARY) add_definitions(-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS) endif() add_library(verovio SHARED ../tools/c_wrapper.cpp ${all_SRC}) + # list all headers to be copied for all installation + file(GLOB_RECURSE all_HEADERS "../include/*/*.h*" "../libmei/*/*.h*") ########### # WASM BC # @@ -260,3 +262,7 @@ install( DESTINATION share/verovio FILES_MATCHING PATTERN "*.xml" PATTERN "*.svg" PATTERN "*.css" ) +# install all headers in /usr/local/include/verovio +if (BUILD_AS_LIBRARY) + install(FILES ${all_HEADERS} DESTINATION include/verovio) +endif() From 10c6ef3a2724bc73e90796e7b0954ff1fe255f43 Mon Sep 17 00:00:00 2001 From: Amedeo Sorpreso Date: Wed, 28 Feb 2024 16:59:39 +0100 Subject: [PATCH 218/249] Update vrv.cpp To ensure correct code formatting for floating-point values, two lines of code have been added to the "StringFormat" method, temporarily resetting the compiler's std::locale configurations. This prevents formatting issues stemming from specific OS or development environment settings, ensuring consistent and accurate numerical representation in the C++ source code during program execution. (At least, they do on my machine; I hope it's the same on yours... :) ) --- src/vrv.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vrv.cpp b/src/vrv.cpp index 8e4353b086c..f4ac75c2d33 100644 --- a/src/vrv.cpp +++ b/src/vrv.cpp @@ -211,12 +211,14 @@ void EnableLogToBuffer(bool value) std::string StringFormat(const char *fmt, ...) { + std::locale previousLocale = std::locale::global(std::locale("C")); std::string str(STRING_FORMAT_MAX_LEN, 0); va_list args; va_start(args, fmt); vsnprintf(&str[0], STRING_FORMAT_MAX_LEN, fmt, args); va_end(args); str.resize(strlen(str.data())); + std::locale::global(previousLocale); return str; } From c708a89ea0cca6d392bd79d28aec2222d5f548ed Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 29 Feb 2024 09:01:02 +0100 Subject: [PATCH 219/249] Add c_wrapper.h to the library headers [skip-ci] --- cmake/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 66030ba8155..5d2b688547a 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -178,9 +178,9 @@ if (BUILD_AS_LIBRARY OR BUILD_AS_ANDROID_LIBRARY) if(WIN32) add_definitions(-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS) endif() - add_library(verovio SHARED ../tools/c_wrapper.cpp ${all_SRC}) + add_library(verovio SHARED "../tools/c_wrapper.cpp" ${all_SRC}) # list all headers to be copied for all installation - file(GLOB_RECURSE all_HEADERS "../include/*/*.h*" "../libmei/*/*.h*") + file(GLOB_RECURSE all_HEADERS "../include/*/*.h*" "../libmei/*/*.h*" "../tools/c_wrapper.h") ########### # WASM BC # From 4055bc7c6d6a90fecd511d2830249fc2fdf8d3e3 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 29 Feb 2024 09:48:44 +0100 Subject: [PATCH 220/249] Update README.md for Android [skip-ci] --- bindings/android/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/bindings/android/README.md b/bindings/android/README.md index d4d42bd7f94..bd9a2d5719a 100644 --- a/bindings/android/README.md +++ b/bindings/android/README.md @@ -1,4 +1,7 @@ -## About +## Documentation for Android + +> [!WARNING] +> This documentation has not been updated and might be obsolete This allows verovio to be built as a native library for Android. It does not include any Java bindings. @@ -50,4 +53,4 @@ Java_com_example_myapplication_MainActivity_stringFromJNI(JNIEnv* env, jobject / std::string hello = "Hello from Verovio " + tk.GetVersion(); return env->NewStringUTF(hello.c_str()); } -``` \ No newline at end of file +``` From 6f72343aab11abfbe5401feaf637df1539305465 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 29 Feb 2024 09:50:06 +0100 Subject: [PATCH 221/249] Update README.md for Qt [skip-ci] --- bindings/qt/README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/bindings/qt/README.md b/bindings/qt/README.md index cdfa3858604..192cbb79066 100644 --- a/bindings/qt/README.md +++ b/bindings/qt/README.md @@ -1,4 +1,9 @@ -## Build instructions +## Documentation for the Qt binding + +> [!WARNING] +> This documentation has not been updated and might be obsolete + +### Build instructions Building the demo for Qt involves following steps: @@ -30,7 +35,7 @@ Building the demo for Qt involves following steps: make -j8 ``` -## Start Qt Demo +### Start Qt Demo To start the Qt demo add the directories for the CPP and Qt libraries to LD_LIBRARY_PATH @@ -38,7 +43,7 @@ To start the Qt demo add the directories for the CPP and Qt libraries to LD_LIBR LD_LIBRARY_PATH=../../../tools/:../build-library ./verovio-qt-demo ``` -## Android +### Android The demo can also be compiled for Android. This requires following steps: From 05b107209d013238173e0e12180518fe65531bd8 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Thu, 29 Feb 2024 09:51:45 +0100 Subject: [PATCH 222/249] Remove the C binding directory [skip-ci] * Now documented in https://book.verovio.org/installing-or-building-from-sources/library.html --- bindings/c/README.md | 39 --------------------------------------- bindings/c/main.c | 14 -------------- 2 files changed, 53 deletions(-) delete mode 100644 bindings/c/README.md delete mode 100644 bindings/c/main.c diff --git a/bindings/c/README.md b/bindings/c/README.md deleted file mode 100644 index 118a10a3edf..00000000000 --- a/bindings/c/README.md +++ /dev/null @@ -1,39 +0,0 @@ -## C function interface - -To use Verovio with any language that supports a plain C function interface you will first need to build Verovio as a library. -The compiled library (`libverovio.so`/`verovio.dll`) will contain callable C symbols. These wrapper symbols are defined in `./tools/c_wrapper.h` - -### Building libverovio.so on Linux - -```sh -cd tools -cmake -DBUILD_AS_LIBRARY=ON . -make -``` - -### Building verovio.dll on Windows using Microsoft Visual Studio Build Tools 2022 - -In addition to Microsoft Visual Studio Build Tools 2022, also [Make](https://gnuwin32.sourceforge.net/packages/make.htm) is used. - -Open `x64 Native Tools Command Prompt for VS 2022` and enter: - -``` -cd cmake -cmake -G "Unix Makefiles" -DBUILD_AS_LIBRARY=ON -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=TRUE . -make -``` - - -## Complete example in C - -To run the `main.c` example you can use gcc to compile the example and link to the pre-built library. - -```sh -gcc main.c -o main -L../../tools -lverovio -``` - -Run (without changing your default LD LIBRARY PATH): - -```sh -LD_LIBRARY_PATH=../../tools ./main -``` diff --git a/bindings/c/main.c b/bindings/c/main.c deleted file mode 100644 index be1d8f2bef9..00000000000 --- a/bindings/c/main.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "stdbool.h" -#include "stdio.h" - -// include the header with the C functions -#include "../../tools/c_wrapper.h" - -int main() -{ - printf("Calling constructor\n"); - void *pointer = vrvToolkit_constructorResourcePath("../../data"); - printf("Pointer value %p\n", pointer); - const char *options = vrvToolkit_getAvailableOptions(pointer); - printf("%s", options); -} From b2f9dc79924d89d31594f9ffbb28b65e98b86874 Mon Sep 17 00:00:00 2001 From: Andre Pany Date: Sun, 3 Mar 2024 21:11:08 +0100 Subject: [PATCH 223/249] Add toolkit functions to c_wrapper --- tools/c_wrapper.cpp | 101 +++++++++++++++++++++++++++++++++++++++++++- tools/c_wrapper.h | 20 ++++++++- 2 files changed, 119 insertions(+), 2 deletions(-) diff --git a/tools/c_wrapper.cpp b/tools/c_wrapper.cpp index a4023388046..10e32fd86b2 100644 --- a/tools/c_wrapper.cpp +++ b/tools/c_wrapper.cpp @@ -115,6 +115,19 @@ const char *vrvToolkit_getHumdrum(void *tkPtr) return buffer; } +bool vrvToolkit_getHumdrumFile(void *tkPtr, const char *filename) +{ + Toolkit *tk = static_cast(tkPtr); + return tk->GetHumdrumFile(filename); +} + +const char *vrvToolkit_getID(void *tkPtr) +{ + Toolkit *tk = static_cast(tkPtr); + tk->SetCString(tk->GetID()); + return tk->GetCString(); +} + const char *vrvToolkit_convertHumdrumToHumdrum(void *tkPtr, const char *humdrumData) { Toolkit *tk = static_cast(tkPtr); @@ -192,6 +205,19 @@ int vrvToolkit_getPageWithElement(void *tkPtr, const char *xmlId) return tk->GetPageWithElement(xmlId); } +const char *vrvToolkit_getResourcePath(void *tkPtr) +{ + Toolkit *tk = static_cast(tkPtr); + tk->SetCString(tk->GetResourcePath()); + return tk->GetCString(); +} + +int vrvToolkit_getScale(void *tkPtr) +{ + Toolkit *tk = static_cast(tkPtr); + return tk->GetScale(); +} + double vrvToolkit_getTimeForElement(void *tkPtr, const char *xmlId) { Toolkit *tk = static_cast(tkPtr); @@ -218,6 +244,12 @@ bool vrvToolkit_loadData(void *tkPtr, const char *data) return tk->LoadData(data); } +bool vrvToolkit_loadFile(void *tkPtr, const char *filename) +{ + Toolkit *tk = static_cast(tkPtr); + return tk->LoadFile(filename); +} + bool vrvToolkit_loadZipDataBase64(void *tkPtr, const char *data) { Toolkit *tk = static_cast(tkPtr); @@ -256,13 +288,25 @@ const char *vrvToolkit_renderToExpansionMap(void *tkPtr) return tk->GetCString(); } -const char *vrvToolkit_renderToMIDI(void *tkPtr, const char *c_options) +bool vrvToolkit_renderToExpansionMapFile(void *tkPtr, const char *filename) +{ + Toolkit *tk = static_cast(tkPtr); + return tk->RenderToExpansionMapFile(filename); +} + +const char *vrvToolkit_renderToMIDI(void *tkPtr) { Toolkit *tk = static_cast(tkPtr); tk->SetCString(tk->RenderToMIDI()); return tk->GetCString(); } +bool vrvToolkit_renderToMIDIFile(void *tkPtr, const char *filename) +{ + Toolkit *tk = static_cast(tkPtr); + return tk->RenderToMIDIFile(filename); +} + const char *vrvToolkit_renderToPAE(void *tkPtr) { Toolkit *tk = static_cast(tkPtr); @@ -270,6 +314,12 @@ const char *vrvToolkit_renderToPAE(void *tkPtr) return tk->GetCString(); } +bool vrvToolkit_renderToPAEFile(void *tkPtr, const char *filename) +{ + Toolkit *tk = static_cast(tkPtr); + return tk->RenderToPAEFile(filename); +} + const char *vrvToolkit_renderToSVG(void *tkPtr, int page_no, bool xmlDeclaration) { Toolkit *tk = static_cast(tkPtr); @@ -277,6 +327,12 @@ const char *vrvToolkit_renderToSVG(void *tkPtr, int page_no, bool xmlDeclaration return tk->GetCString(); } +bool vrvToolkit_renderToSVGFile(void *tkPtr, const char *filename, int pageNo) +{ + Toolkit *tk = static_cast(tkPtr); + return tk->RenderToSVGFile(filename, pageNo); +} + const char *vrvToolkit_renderToTimemap(void *tkPtr, const char *c_options) { Toolkit *tk = static_cast(tkPtr); @@ -284,6 +340,12 @@ const char *vrvToolkit_renderToTimemap(void *tkPtr, const char *c_options) return tk->GetCString(); } +bool vrvToolkit_renderToTimemapFile(void *tkPtr, const char *filename, const char *c_options) +{ + Toolkit *tk = static_cast(tkPtr); + return tk->RenderToTimemapFile(filename, c_options); +} + void vrvToolkit_resetOptions(void *tkPtr) { Toolkit *tk = static_cast(tkPtr); @@ -296,18 +358,48 @@ void vrvToolkit_resetXmlIdSeed(void *tkPtr, int seed) tk->ResetXmlIdSeed(seed); } +bool vrvToolkit_saveFile(void *tkPtr, const char *filename, const char *c_options) +{ + Toolkit *tk = static_cast(tkPtr); + return tk->SaveFile(filename, c_options); +} + bool vrvToolkit_select(void *tkPtr, const char *selection) { Toolkit *tk = static_cast(tkPtr); return tk->Select(selection); } +bool vrvToolkit_setInputFrom(void *tkPtr, const char *inputFrom) +{ + Toolkit *tk = static_cast(tkPtr); + return tk->SetInputFrom(inputFrom); +} + bool vrvToolkit_setOptions(void *tkPtr, const char *options) { Toolkit *tk = static_cast(tkPtr); return tk->SetOptions(options); } +bool vrvToolkit_setOutputTo(void *tkPtr, const char *outputTo) +{ + Toolkit *tk = static_cast(tkPtr); + return tk->SetOutputTo(outputTo); +} + +bool vrvToolkit_setResourcePath(void *tkPtr, const char *path) +{ + Toolkit *tk = static_cast(tkPtr); + return tk->SetResourcePath(path); +} + +bool vrvToolkit_setScale(void *tkPtr, int scale) +{ + Toolkit *tk = static_cast(tkPtr); + return tk->SetScale(scale); +} + const char *vrvToolkit_validatePAE(void *tkPtr, const char *data) { Toolkit *tk = static_cast(tkPtr); @@ -315,4 +407,11 @@ const char *vrvToolkit_validatePAE(void *tkPtr, const char *data) return tk->GetCString(); } +const char *vrvToolkit_validatePAEFile(void *tkPtr, const char *filename) +{ + Toolkit *tk = static_cast(tkPtr); + tk->SetCString(tk->ValidatePAEFile(filename)); + return tk->GetCString(); +} + } // extern C diff --git a/tools/c_wrapper.h b/tools/c_wrapper.h index 21ef1b7db7b..9b221a59828 100644 --- a/tools/c_wrapper.h +++ b/tools/c_wrapper.h @@ -21,6 +21,7 @@ void *vrvToolkit_constructorResourcePath(const char *resourcePath); void vrvToolkit_destructor(void *tkPtr); bool vrvToolkit_edit(void *tkPtr, const char *editorAction); +const char *vrvToolkit_editInfo(void *tkPtr); const char *vrvToolkit_getAvailableOptions(void *tkPtr); const char *vrvToolkit_getDefaultOptions(void *tkPtr); const char *vrvToolkit_getDescriptiveFeatures(void *tkPtr, const char *options); @@ -28,6 +29,8 @@ const char *vrvToolkit_getElementAttr(void *tkPtr, const char *xmlId); const char *vrvToolkit_getElementsAtTime(void *tkPtr, int millisec); const char *vrvToolkit_getExpansionIdsForElement(void *tkPtr, const char *xmlId); const char *vrvToolkit_getHumdrum(void *tkPtr); +bool vrvToolkit_getHumdrumFile(void *tkPtr, const char *filename); +const char *vrvToolkit_getID(void *tkPtr); const char *vrvToolkit_convertHumdrumToHumdrum(void *tkPtr, const char *humdrumData); const char *vrvToolkit_convertHumdrumToMIDI(void *tkPtr, const char *humdrumData); const char *vrvToolkit_convertMEIToHumdrum(void *tkPtr, const char *meiData); @@ -39,24 +42,39 @@ const char *vrvToolkit_getOptions(void *tkPtr); const char *vrvToolkit_getOptionUsageString(void *tkPtr); int vrvToolkit_getPageCount(void *tkPtr); int vrvToolkit_getPageWithElement(void *tkPtr, const char *xmlId); +const char *vrvToolkit_getResourcePath(void *tkPtr); +int vrvToolkit_getScale(void *tkPtr); double vrvToolkit_getTimeForElement(void *tkPtr, const char *xmlId); +const char *vrvToolkit_getTimesForElement(void *tkPtr, const char *xmlId); const char *vrvToolkit_getVersion(void *tkPtr); bool vrvToolkit_loadData(void *tkPtr, const char *data); +bool vrvToolkit_loadFile(void *tkPtr, const char *filename); bool vrvToolkit_loadZipDataBase64(void *tkPtr, const char *data); bool vrvToolkit_loadZipDataBuffer(void *tkPtr, const unsigned char *data, int length); void vrvToolkit_redoLayout(void *tkPtr, const char *c_options); void vrvToolkit_redoPagePitchPosLayout(void *tkPtr); const char *vrvToolkit_renderData(void *tkPtr, const char *data, const char *options); const char *vrvToolkit_renderToExpansionMap(void *tkPtr); -const char *vrvToolkit_renderToMIDI(void *tkPtr, const char *c_options); +bool vrvToolkit_renderToExpansionMapFile(void *tkPtr, const char *filename); +const char *vrvToolkit_renderToMIDI(void *tkPtr); +bool vrvToolkit_renderToMIDIFile(void *tkPtr, const char *filename); const char *vrvToolkit_renderToPAE(void *tkPtr); +bool vrvToolkit_renderToPAEFile(void *tkPtr, const char *filename); const char *vrvToolkit_renderToSVG(void *tkPtr, int page_no, bool xmlDeclaration); +bool vrvToolkit_renderToSVGFile(void *tkPtr, const char *filename, int pageNo); const char *vrvToolkit_renderToTimemap(void *tkPtr, const char *c_options); +bool vrvToolkit_renderToTimemapFile(void *tkPtr, const char *filename, const char *c_options); void vrvToolkit_resetOptions(void *tkPtr); void vrvToolkit_resetXmlIdSeed(void *tkPtr, int seed); +bool vrvToolkit_saveFile(void *tkPtr, const char *filename, const char *c_options); bool vrvToolkit_select(void *tkPtr, const char *selection); +bool vrvToolkit_setInputFrom(void *tkPtr, const char *inputFrom); bool vrvToolkit_setOptions(void *tkPtr, const char *options); +bool vrvToolkit_setOutputTo(void *tkPtr, const char *outputTo); +bool vrvToolkit_setResourcePath(void *tkPtr, const char *path); +bool vrvToolkit_setScale(void *tkPtr, int scale); const char *vrvToolkit_validatePAE(void *tkPtr, const char *data); +const char *vrvToolkit_validatePAEFile(void *tkPtr, const char *filename); #ifdef __cplusplus } // extern C From 653fab84305e587f02ad643efc0e96eb8c3fca28 Mon Sep 17 00:00:00 2001 From: Fernando Herrera Date: Wed, 6 Mar 2024 18:15:29 +0100 Subject: [PATCH 224/249] Fix issue #3605: draw colored notes and dur="2" with empty note head --- src/view_element.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/view_element.cpp b/src/view_element.cpp index 88a2d28ec34..3c698c7add7 100644 --- a/src/view_element.cpp +++ b/src/view_element.cpp @@ -1488,8 +1488,6 @@ void View::DrawNote(DeviceContext *dc, LayerElement *element, Layer *layer, Staf } drawingDur = DUR_4; } - drawingDur = ((note->GetColored() == BOOLEAN_true) && drawingDur > DUR_1) ? (drawingDur + 1) : drawingDur; - if (drawingDur < DUR_BR) { this->DrawMaximaToBrevis(dc, noteY, element, layer, staff); } @@ -1497,7 +1495,15 @@ void View::DrawNote(DeviceContext *dc, LayerElement *element, Layer *layer, Staf // Whole notes char32_t fontNo; if (note->GetColored() == BOOLEAN_true) { - fontNo = (drawingDur == DUR_1) ? SMUFL_E0FA_noteheadWholeFilled : SMUFL_E0A3_noteheadHalf; + if (DUR_1 == drawingDur) { + fontNo = SMUFL_E0FA_noteheadWholeFilled; + } + else if (DUR_2 == drawingDur) { + fontNo = SMUFL_E0FB_noteheadHalfFilled; + } + else { + fontNo = SMUFL_E0A3_noteheadHalf; + } } else { fontNo = note->GetNoteheadGlyph(drawingDur); From e1415cb1a9577a7d69e61ba1932422b8f093c048 Mon Sep 17 00:00:00 2001 From: Matthew Williams Date: Wed, 6 Mar 2024 13:09:05 -0700 Subject: [PATCH 225/249] Added ClearCoords call when editing a beam --- src/editortoolkit_cmn.cpp | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/editortoolkit_cmn.cpp b/src/editortoolkit_cmn.cpp index 6d8f85f49a8..3369563c761 100644 --- a/src/editortoolkit_cmn.cpp +++ b/src/editortoolkit_cmn.cpp @@ -213,7 +213,7 @@ bool EditorToolkitCMN::Delete(std::string &elementId) { Object *element = this->GetElement(elementId); if (!element) return false; - + if (element->Is(NOTE)) { return this->DeleteNote(vrv_cast(element)); } @@ -247,15 +247,15 @@ bool EditorToolkitCMN::KeyDown(std::string &elementId, int key, bool shiftKey, b // For elements whose y-position corresponds to a certain pitch if (element->HasInterface(INTERFACE_PITCH)) { - PitchInterface *interface = element->GetPitchInterface(); - assert(interface); + PitchInterface* pitch_interface = element->GetPitchInterface(); + assert(pitch_interface); int step; switch (key) { case KEY_UP: step = 1; break; case KEY_DOWN: step = -1; break; default: step = 0; } - interface->AdjustPitchByOffset(step); + pitch_interface->AdjustPitchByOffset(step); return true; } return false; @@ -301,11 +301,11 @@ bool EditorToolkitCMN::Insert(std::string &elementType, std::string const &start } assert(element); - TimeSpanningInterface *interface = element->GetTimeSpanningInterface(); - assert(interface); + TimeSpanningInterface *timespan_interface = element->GetTimeSpanningInterface(); + assert(timespan_interface); measure->AddChild(element); - interface->SetStartid("#" + startid); - interface->SetEndid("#" + endid); + timespan_interface->SetStartid("#" + startid); + timespan_interface->SetEndid("#" + endid); m_chainedId = element->GetID(); m_editInfo.import("uuid", element->GetID()); @@ -512,7 +512,7 @@ bool EditorToolkitCMN::DeleteNote(Note *note) Chord *chord = note->IsChordTone(); Beam *beam = note->GetAncestorBeam(); - + if (chord) { if (chord->HasEditorialContent()) { LogInfo("Deleting a note in a chord that has editorial content is not possible"); @@ -560,6 +560,7 @@ bool EditorToolkitCMN::DeleteNote(Note *note) } } else if (beam) { + // If the beam has exactly 2 notes (take apart and leave a single note and a rest) if ((int)beam->m_beamSegment.GetElementCoordRefs()->size() == 2) { bool insertBefore = true; LayerElement *otherElement = beam->m_beamSegment.GetElementCoordRefs()->back()->m_element; @@ -584,7 +585,8 @@ bool EditorToolkitCMN::DeleteNote(Note *note) m_chainedId = rest->GetID(); return true; } - if (beam->IsFirstIn(note)) { + // If the beam has more than 2 and this is first + else if (beam->IsFirstIn(note)) { Rest *rest = new Rest(); rest->DurationInterface::operator=(*note); Object *parent = beam->GetParent(); @@ -592,8 +594,8 @@ bool EditorToolkitCMN::DeleteNote(Note *note) parent->InsertBefore(beam, rest); beam->DeleteChild(note); m_chainedId = rest->GetID(); - return true; } + // If the beam has more than 2 and this is last else if (beam->IsLastIn(note)) { Rest *rest = new Rest(); rest->DurationInterface::operator=(*note); @@ -602,18 +604,26 @@ bool EditorToolkitCMN::DeleteNote(Note *note) parent->InsertAfter(beam, rest); beam->DeleteChild(note); m_chainedId = rest->GetID(); - return true; } + // If the beam has more than 2 and this in the middle else { - Rest *rest = new Rest(); + Rest *rest = new Rest(); rest->DurationInterface::operator=(*note); beam->ReplaceChild(note, rest); delete note; m_chainedId = rest->GetID(); - return true; } + + // All but the first IF statement branches lead here + + // Clearing the coords here fixes an error where the children get updated, but the + // internal m_beamElementCoordRefs does not. By clearing it, the system is forced + // to update that structure to reflect the current children. + beam->ClearCoords(); + return true; } else { + // Deal with just a single note (Not in beam or chord) Rest *rest = new Rest(); rest->DurationInterface::operator=(*note); Object *parent = note->GetParent(); From bd1e3c7c28c6960ca5c08c9330f28266118c1943 Mon Sep 17 00:00:00 2001 From: Matthew Williams Date: Wed, 6 Mar 2024 15:47:57 -0700 Subject: [PATCH 226/249] Adjusted to meet some existing comments --- src/editortoolkit_cmn.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/editortoolkit_cmn.cpp b/src/editortoolkit_cmn.cpp index 3369563c761..0ab3d479c20 100644 --- a/src/editortoolkit_cmn.cpp +++ b/src/editortoolkit_cmn.cpp @@ -213,7 +213,6 @@ bool EditorToolkitCMN::Delete(std::string &elementId) { Object *element = this->GetElement(elementId); if (!element) return false; - if (element->Is(NOTE)) { return this->DeleteNote(vrv_cast(element)); } @@ -348,10 +347,10 @@ bool EditorToolkitCMN::Insert(std::string &elementType, std::string const &start } assert(element); - TimeSpanningInterface *interface = element->GetTimeSpanningInterface(); - assert(interface); + TimeSpanningInterface *timespan_interface = element->GetTimeSpanningInterface(); + assert(timespan_interface); measure->AddChild(element); - interface->SetStartid("#" + startid); + timespan_interface->SetStartid("#" + startid); m_chainedId = element->GetID(); m_editInfo.import("uuid", element->GetID()); @@ -512,7 +511,6 @@ bool EditorToolkitCMN::DeleteNote(Note *note) Chord *chord = note->IsChordTone(); Beam *beam = note->GetAncestorBeam(); - if (chord) { if (chord->HasEditorialContent()) { LogInfo("Deleting a note in a chord that has editorial content is not possible"); @@ -581,6 +579,8 @@ bool EditorToolkitCMN::DeleteNote(Note *note) } beam->DetachChild(otherElement->GetIdx()); parent->ReplaceChild(beam, otherElement); + otherElement-> + // Here delete beam; m_chainedId = rest->GetID(); return true; From 2c669becca1a83092a426113b7a5a2328aeff7e1 Mon Sep 17 00:00:00 2001 From: Matthew Williams Date: Wed, 6 Mar 2024 15:53:35 -0700 Subject: [PATCH 227/249] fixed indentation --- src/editortoolkit_cmn.cpp | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/editortoolkit_cmn.cpp b/src/editortoolkit_cmn.cpp index 0ab3d479c20..38b5f77eb74 100644 --- a/src/editortoolkit_cmn.cpp +++ b/src/editortoolkit_cmn.cpp @@ -558,7 +558,7 @@ bool EditorToolkitCMN::DeleteNote(Note *note) } } else if (beam) { - // If the beam has exactly 2 notes (take apart and leave a single note and a rest) + // If the beam has exactly 2 notes (take apart and leave a single note and a rest) if ((int)beam->m_beamSegment.GetElementCoordRefs()->size() == 2) { bool insertBefore = true; LayerElement *otherElement = beam->m_beamSegment.GetElementCoordRefs()->back()->m_element; @@ -579,13 +579,11 @@ bool EditorToolkitCMN::DeleteNote(Note *note) } beam->DetachChild(otherElement->GetIdx()); parent->ReplaceChild(beam, otherElement); - otherElement-> - // Here delete beam; m_chainedId = rest->GetID(); return true; } - // If the beam has more than 2 and this is first + // If the beam has more than 2 and this is first else if (beam->IsFirstIn(note)) { Rest *rest = new Rest(); rest->DurationInterface::operator=(*note); @@ -595,7 +593,7 @@ bool EditorToolkitCMN::DeleteNote(Note *note) beam->DeleteChild(note); m_chainedId = rest->GetID(); } - // If the beam has more than 2 and this is last + // If the beam has more than 2 and this is last else if (beam->IsLastIn(note)) { Rest *rest = new Rest(); rest->DurationInterface::operator=(*note); @@ -605,25 +603,25 @@ bool EditorToolkitCMN::DeleteNote(Note *note) beam->DeleteChild(note); m_chainedId = rest->GetID(); } - // If the beam has more than 2 and this in the middle + // If the beam has more than 2 and this in the middle else { - Rest *rest = new Rest(); + Rest *rest = new Rest(); rest->DurationInterface::operator=(*note); beam->ReplaceChild(note, rest); delete note; m_chainedId = rest->GetID(); } - - // All but the first IF statement branches lead here - - // Clearing the coords here fixes an error where the children get updated, but the - // internal m_beamElementCoordRefs does not. By clearing it, the system is forced - // to update that structure to reflect the current children. - beam->ClearCoords(); - return true; + + // All but the first IF statement branches lead here + + // Clearing the coords here fixes an error where the children get updated, but the + // internal m_beamElementCoordRefs does not. By clearing it, the system is forced + // to update that structure to reflect the current children. + beam->ClearCoords(); + return true; } else { - // Deal with just a single note (Not in beam or chord) + // Deal with just a single note (Not in beam or chord) Rest *rest = new Rest(); rest->DurationInterface::operator=(*note); Object *parent = note->GetParent(); From a5e4e80fdbcbe1f6ae2cafb6c78428a726bb5fdd Mon Sep 17 00:00:00 2001 From: Matthew Williams Date: Wed, 6 Mar 2024 15:59:23 -0700 Subject: [PATCH 228/249] fixed known clang issues --- src/editortoolkit_cmn.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/editortoolkit_cmn.cpp b/src/editortoolkit_cmn.cpp index 38b5f77eb74..4fd5b498a38 100644 --- a/src/editortoolkit_cmn.cpp +++ b/src/editortoolkit_cmn.cpp @@ -246,7 +246,7 @@ bool EditorToolkitCMN::KeyDown(std::string &elementId, int key, bool shiftKey, b // For elements whose y-position corresponds to a certain pitch if (element->HasInterface(INTERFACE_PITCH)) { - PitchInterface* pitch_interface = element->GetPitchInterface(); + PitchInterface *pitch_interface = element->GetPitchInterface(); assert(pitch_interface); int step; switch (key) { @@ -613,10 +613,9 @@ bool EditorToolkitCMN::DeleteNote(Note *note) } // All but the first IF statement branches lead here - - // Clearing the coords here fixes an error where the children get updated, but the - // internal m_beamElementCoordRefs does not. By clearing it, the system is forced - // to update that structure to reflect the current children. + /* Clearing the coords here fixes an error where the children get updated, but the + * internal m_beamElementCoordRefs does not. By clearing it, the system is forced + * to update that structure to reflect the current children. */ beam->ClearCoords(); return true; } From 31178e06bf454ae85486cf7b601d8756019785ed Mon Sep 17 00:00:00 2001 From: Matthew Williams Date: Wed, 6 Mar 2024 16:08:08 -0700 Subject: [PATCH 229/249] Fixed clang problem --- src/editortoolkit_cmn.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/editortoolkit_cmn.cpp b/src/editortoolkit_cmn.cpp index 4fd5b498a38..ed7ebd5fa03 100644 --- a/src/editortoolkit_cmn.cpp +++ b/src/editortoolkit_cmn.cpp @@ -611,7 +611,6 @@ bool EditorToolkitCMN::DeleteNote(Note *note) delete note; m_chainedId = rest->GetID(); } - // All but the first IF statement branches lead here /* Clearing the coords here fixes an error where the children get updated, but the * internal m_beamElementCoordRefs does not. By clearing it, the system is forced From 633158f77895a77311358e5006a92d3c2fc4726c Mon Sep 17 00:00:00 2001 From: Matthew Williams Date: Wed, 6 Mar 2024 16:32:38 -0700 Subject: [PATCH 230/249] final clang push --- src/editortoolkit_cmn.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/editortoolkit_cmn.cpp b/src/editortoolkit_cmn.cpp index ed7ebd5fa03..114e0c989b4 100644 --- a/src/editortoolkit_cmn.cpp +++ b/src/editortoolkit_cmn.cpp @@ -451,7 +451,8 @@ bool EditorToolkitCMN::InsertNote(Object *object) } if (currentNote->HasEditorialContent()) { - LogInfo("Inserting a note where a note has editorial content is not possible"); + LogInfo("Inserting a note where a note has editorial content is not " + "possible"); return false; } @@ -513,7 +514,8 @@ bool EditorToolkitCMN::DeleteNote(Note *note) Beam *beam = note->GetAncestorBeam(); if (chord) { if (chord->HasEditorialContent()) { - LogInfo("Deleting a note in a chord that has editorial content is not possible"); + LogInfo("Deleting a note in a chord that has editorial content is not " + "possible"); return false; } int count = chord->GetChildCount(NOTE, UNLIMITED_DEPTH); @@ -558,7 +560,8 @@ bool EditorToolkitCMN::DeleteNote(Note *note) } } else if (beam) { - // If the beam has exactly 2 notes (take apart and leave a single note and a rest) + // If the beam has exactly 2 notes (take apart and leave a single note and a + // rest) if ((int)beam->m_beamSegment.GetElementCoordRefs()->size() == 2) { bool insertBefore = true; LayerElement *otherElement = beam->m_beamSegment.GetElementCoordRefs()->back()->m_element; @@ -612,9 +615,10 @@ bool EditorToolkitCMN::DeleteNote(Note *note) m_chainedId = rest->GetID(); } // All but the first IF statement branches lead here - /* Clearing the coords here fixes an error where the children get updated, but the - * internal m_beamElementCoordRefs does not. By clearing it, the system is forced - * to update that structure to reflect the current children. */ + /* Clearing the coords here fixes an error where the children get updated, + * but the internal m_beamElementCoordRefs does not. By clearing it, the + * system is forced to update that structure to reflect the current + * children. */ beam->ClearCoords(); return true; } From f5c2e3e3ff82cf9a778b8541e3746847c567659f Mon Sep 17 00:00:00 2001 From: Matthew Williams Date: Thu, 7 Mar 2024 09:19:27 -0700 Subject: [PATCH 231/249] Reset interface variable name --- src/editortoolkit_cmn.cpp | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/editortoolkit_cmn.cpp b/src/editortoolkit_cmn.cpp index ed7ebd5fa03..18cbed036a5 100644 --- a/src/editortoolkit_cmn.cpp +++ b/src/editortoolkit_cmn.cpp @@ -246,15 +246,15 @@ bool EditorToolkitCMN::KeyDown(std::string &elementId, int key, bool shiftKey, b // For elements whose y-position corresponds to a certain pitch if (element->HasInterface(INTERFACE_PITCH)) { - PitchInterface *pitch_interface = element->GetPitchInterface(); - assert(pitch_interface); + PitchInterface *interface = element->GetPitchInterface(); + assert(interface); int step; switch (key) { case KEY_UP: step = 1; break; case KEY_DOWN: step = -1; break; default: step = 0; } - pitch_interface->AdjustPitchByOffset(step); + interface->AdjustPitchByOffset(step); return true; } return false; @@ -300,11 +300,11 @@ bool EditorToolkitCMN::Insert(std::string &elementType, std::string const &start } assert(element); - TimeSpanningInterface *timespan_interface = element->GetTimeSpanningInterface(); - assert(timespan_interface); + TimeSpanningInterface *interface = element->GetTimeSpanningInterface(); + assert(interface); measure->AddChild(element); - timespan_interface->SetStartid("#" + startid); - timespan_interface->SetEndid("#" + endid); + interface->SetStartid("#" + startid); + interface->SetEndid("#" + endid); m_chainedId = element->GetID(); m_editInfo.import("uuid", element->GetID()); @@ -347,10 +347,10 @@ bool EditorToolkitCMN::Insert(std::string &elementType, std::string const &start } assert(element); - TimeSpanningInterface *timespan_interface = element->GetTimeSpanningInterface(); - assert(timespan_interface); + TimeSpanningInterface *interface = element->GetTimeSpanningInterface(); + assert(interface); measure->AddChild(element); - timespan_interface->SetStartid("#" + startid); + interface->SetStartid("#" + startid); m_chainedId = element->GetID(); m_editInfo.import("uuid", element->GetID()); @@ -451,7 +451,8 @@ bool EditorToolkitCMN::InsertNote(Object *object) } if (currentNote->HasEditorialContent()) { - LogInfo("Inserting a note where a note has editorial content is not possible"); + LogInfo("Inserting a note where a note has editorial content is not " + "possible"); return false; } @@ -513,7 +514,8 @@ bool EditorToolkitCMN::DeleteNote(Note *note) Beam *beam = note->GetAncestorBeam(); if (chord) { if (chord->HasEditorialContent()) { - LogInfo("Deleting a note in a chord that has editorial content is not possible"); + LogInfo("Deleting a note in a chord that has editorial content is not " + "possible"); return false; } int count = chord->GetChildCount(NOTE, UNLIMITED_DEPTH); @@ -558,7 +560,8 @@ bool EditorToolkitCMN::DeleteNote(Note *note) } } else if (beam) { - // If the beam has exactly 2 notes (take apart and leave a single note and a rest) + // If the beam has exactly 2 notes (take apart and leave a single note and a + // rest) if ((int)beam->m_beamSegment.GetElementCoordRefs()->size() == 2) { bool insertBefore = true; LayerElement *otherElement = beam->m_beamSegment.GetElementCoordRefs()->back()->m_element; @@ -612,9 +615,10 @@ bool EditorToolkitCMN::DeleteNote(Note *note) m_chainedId = rest->GetID(); } // All but the first IF statement branches lead here - /* Clearing the coords here fixes an error where the children get updated, but the - * internal m_beamElementCoordRefs does not. By clearing it, the system is forced - * to update that structure to reflect the current children. */ + /* Clearing the coords here fixes an error where the children get updated, + * but the internal m_beamElementCoordRefs does not. By clearing it, the + * system is forced to update that structure to reflect the current + * children. */ beam->ClearCoords(); return true; } From 8f2e4ec5a4d97ef86f8fd9c560a4e8788c683b16 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Mon, 11 Mar 2024 17:36:34 +0100 Subject: [PATCH 232/249] Refactor PAE Duration handling This change extracts the PAE duration handling into a static method that can be used to convert durations to their PAE representations. It also adds a new feature to the feature extractor that includes the note duration on the PAE note. --- include/vrv/featureextractor.h | 1 + include/vrv/iopae.h | 4 +++ src/featureextractor.cpp | 13 +++++++- src/iopae.cpp | 57 ++++++++++++++++++++-------------- 4 files changed, 50 insertions(+), 25 deletions(-) diff --git a/include/vrv/featureextractor.h b/include/vrv/featureextractor.h index 0c049af5ec3..21a74630489 100644 --- a/include/vrv/featureextractor.h +++ b/include/vrv/featureextractor.h @@ -55,6 +55,7 @@ class FeatureExtractor { std::list m_previousNotes; jsonxx::Array m_pitchesChromatic; + jsonxx::Array m_pitchesChromaticWithDuration; jsonxx::Array m_pitchesDiatonic; jsonxx::Array m_pitchesIds; diff --git a/include/vrv/iopae.h b/include/vrv/iopae.h index 7c1eb5c76d5..7d40d7db64e 100644 --- a/include/vrv/iopae.h +++ b/include/vrv/iopae.h @@ -91,6 +91,10 @@ class PAEOutput : public Output { */ bool WriteObjectEnd(Object *object) override; + /** + * Helper method to return a string representation of the PAE duration. + */ + static std::string GetPaeDur(data_DURATION dur, int ndots); private: /** * @name Methods for writing containers (measures, staff, etc) scoreDef and related. diff --git a/src/featureextractor.cpp b/src/featureextractor.cpp index bf9ccfc8cf7..cc0854ce3dd 100644 --- a/src/featureextractor.cpp +++ b/src/featureextractor.cpp @@ -17,6 +17,7 @@ #include "chord.h" #include "doc.h" #include "gracegrp.h" +#include "iopae.h" #include "layer.h" #include "mdiv.h" #include "measure.h" @@ -70,10 +71,16 @@ void FeatureExtractor::Extract(const Object *object) } std::stringstream pitch; + std::stringstream pitchWithDuration; + + pitchWithDuration << PAEOutput::GetPaeDur(note->GetDur(), note->GetDots()); + data_OCTAVE oct = note->GetOct(); char octSign = (oct > 3) ? '\'' : ','; int signCount = (oct > 3) ? (oct - 3) : (4 - oct); - pitch << std::string(signCount, octSign); + std::string octaves = std::string(signCount, octSign); + pitch << octaves; + pitchWithDuration << octaves; const Accid *accid = vrv_cast(note->FindDescendantByType(ACCID)); if (accid) { @@ -98,13 +105,16 @@ void FeatureExtractor::Extract(const Object *object) default: accidStr = accidStrWritten; } pitch << accidStr; + pitchWithDuration << accidStr; } std::string pname = note->AttPitch::PitchnameToStr(note->GetPname()); std::transform(pname.begin(), pname.end(), pname.begin(), ::toupper); pitch << pname; + pitchWithDuration << pname; m_pitchesChromatic << pitch.str(); + m_pitchesChromaticWithDuration << pitchWithDuration.str(); m_pitchesDiatonic << pname; jsonxx::Array pitchesIds; pitchesIds << note->GetID(); @@ -145,6 +155,7 @@ void FeatureExtractor::ToJson(std::string &output) { jsonxx::Object o; + o << "pitchesChromaticWithDuration" << m_pitchesChromaticWithDuration; o << "pitchesChromatic" << m_pitchesChromatic; o << "pitchesDiatonic" << m_pitchesDiatonic; o << "pitchesIds" << m_pitchesIds; diff --git a/src/iopae.cpp b/src/iopae.cpp index 938efd8d54f..0c730ac9eb1 100644 --- a/src/iopae.cpp +++ b/src/iopae.cpp @@ -542,6 +542,38 @@ void PAEOutput::WriteTupletEnd(Tuplet *tuplet) m_streamStringOutput << ";" << tuplet->GetNum() << ")"; } +std::string PAEOutput::GetPaeDur(data_DURATION ndur, int ndots) +{ + std::string dur; + switch (ndur) { + case (DURATION_long): dur = "0"; break; + case (DURATION_breve): dur = "9"; break; + case (DURATION_1): dur = "1"; break; + case (DURATION_2): dur = "2"; break; + case (DURATION_4): dur = "4"; break; + case (DURATION_8): dur = "8"; break; + case (DURATION_16): dur = "6"; break; + case (DURATION_32): dur = "3"; break; + case (DURATION_64): dur = "5"; break; + case (DURATION_128): dur = "7"; break; + case (DURATION_maxima): dur = "0"; break; + case (DURATION_longa): dur = "0"; break; + case (DURATION_brevis): dur = "9"; break; + case (DURATION_semibrevis): dur = "1"; break; + case (DURATION_minima): dur = "2"; break; + case (DURATION_semiminima): dur = "4"; break; + case (DURATION_fusa): dur = "8"; break; + case (DURATION_semifusa): dur = "6"; break; + default: LogWarning("Unsupported duration"); dur = "4"; + } + + if (ndots > 0) { + dur += std::string(ndots, '.'); + } + + return dur; +} + void PAEOutput::WriteDur(DurationInterface *interface) { assert(interface); @@ -550,30 +582,7 @@ void PAEOutput::WriteDur(DurationInterface *interface) if ((interface->GetDur() != m_currentDur) || (ndots != m_currentDots)) { m_currentDur = interface->GetDur(); m_currentDots = ndots; - std::string dur; - switch (m_currentDur) { - case (DURATION_long): dur = "0"; break; - case (DURATION_breve): dur = "9"; break; - case (DURATION_1): dur = "1"; break; - case (DURATION_2): dur = "2"; break; - case (DURATION_4): dur = "4"; break; - case (DURATION_8): dur = "8"; break; - case (DURATION_16): dur = "6"; break; - case (DURATION_32): dur = "3"; break; - case (DURATION_64): dur = "5"; break; - case (DURATION_128): dur = "7"; break; - case (DURATION_maxima): dur = "0"; break; - case (DURATION_longa): dur = "0"; break; - case (DURATION_brevis): dur = "9"; break; - case (DURATION_semibrevis): dur = "1"; break; - case (DURATION_minima): dur = "2"; break; - case (DURATION_semiminima): dur = "4"; break; - case (DURATION_fusa): dur = "8"; break; - case (DURATION_semifusa): dur = "6"; break; - default: LogWarning("Unsupported duration"); dur = "4"; - } - m_streamStringOutput << dur; - m_streamStringOutput << std::string(m_currentDots, '.'); + m_streamStringOutput << GetPaeDur(interface->GetDur(), m_currentDots); } } From 67da74adb01f0384b831309a4a4cb29db0e35968 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Mon, 11 Mar 2024 17:43:30 +0100 Subject: [PATCH 233/249] Formatting --- include/vrv/iopae.h | 1 + src/featureextractor.cpp | 4 ++-- src/iopae.cpp | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/vrv/iopae.h b/include/vrv/iopae.h index 7d40d7db64e..77313365e15 100644 --- a/include/vrv/iopae.h +++ b/include/vrv/iopae.h @@ -95,6 +95,7 @@ class PAEOutput : public Output { * Helper method to return a string representation of the PAE duration. */ static std::string GetPaeDur(data_DURATION dur, int ndots); + private: /** * @name Methods for writing containers (measures, staff, etc) scoreDef and related. diff --git a/src/featureextractor.cpp b/src/featureextractor.cpp index cc0854ce3dd..fad1e07b47b 100644 --- a/src/featureextractor.cpp +++ b/src/featureextractor.cpp @@ -72,9 +72,9 @@ void FeatureExtractor::Extract(const Object *object) std::stringstream pitch; std::stringstream pitchWithDuration; - + pitchWithDuration << PAEOutput::GetPaeDur(note->GetDur(), note->GetDots()); - + data_OCTAVE oct = note->GetOct(); char octSign = (oct > 3) ? '\'' : ','; int signCount = (oct > 3) ? (oct - 3) : (4 - oct); diff --git a/src/iopae.cpp b/src/iopae.cpp index 0c730ac9eb1..2c8f098e8a2 100644 --- a/src/iopae.cpp +++ b/src/iopae.cpp @@ -566,7 +566,7 @@ std::string PAEOutput::GetPaeDur(data_DURATION ndur, int ndots) case (DURATION_semifusa): dur = "6"; break; default: LogWarning("Unsupported duration"); dur = "4"; } - + if (ndots > 0) { dur += std::string(ndots, '.'); } From b0092bfa28d5d3b1c48fed4593587ae082f41df8 Mon Sep 17 00:00:00 2001 From: Fernando Herrera Date: Mon, 11 Mar 2024 22:59:11 +0100 Subject: [PATCH 234/249] Fix lyrics position in midi output for in notes <= quarter --- src/midifunctor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/midifunctor.cpp b/src/midifunctor.cpp index 5bf7f6246e8..8e19d336ed8 100644 --- a/src/midifunctor.cpp +++ b/src/midifunctor.cpp @@ -798,7 +798,7 @@ FunctorCode GenerateMIDIFunctor::VisitStaffDef(const StaffDef *staffDef) FunctorCode GenerateMIDIFunctor::VisitSyl(const Syl *syl) { - const int startTime = m_totalTime + m_lastNote->GetScoreTimeOnset(); + const double startTime = m_totalTime + m_lastNote->GetScoreTimeOnset(); const std::string sylText = UTF32to8(syl->GetText()); m_midiFile->addLyric(m_midiTrack, startTime * m_midiFile->getTPQ(), sylText); From 267c0239cf8fb0b6b8bd961df577bcd466843074 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Tue, 12 Mar 2024 12:00:13 +0100 Subject: [PATCH 235/249] Update src/iopae.cpp Co-authored-by: Laurent Pugin --- src/iopae.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/iopae.cpp b/src/iopae.cpp index 2c8f098e8a2..1e844d31a06 100644 --- a/src/iopae.cpp +++ b/src/iopae.cpp @@ -582,7 +582,7 @@ void PAEOutput::WriteDur(DurationInterface *interface) if ((interface->GetDur() != m_currentDur) || (ndots != m_currentDots)) { m_currentDur = interface->GetDur(); m_currentDots = ndots; - m_streamStringOutput << GetPaeDur(interface->GetDur(), m_currentDots); + m_streamStringOutput << PAEOutput::GetPaeDur(interface->GetDur(), m_currentDots); } } From 6a790ffacd81532a386675a70e5fd3debed6791e Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Sun, 17 Mar 2024 18:29:36 +0100 Subject: [PATCH 236/249] Update Verovio.podspec to c++20 [skip-ci] --- Verovio.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Verovio.podspec b/Verovio.podspec index e401987e0fa..93b69a5ae10 100644 --- a/Verovio.podspec +++ b/Verovio.podspec @@ -17,7 +17,7 @@ Pod::Spec.new do |s| s.ios.deployment_target = '14.0' s.osx.deployment_target = '10.15' s.pod_target_xcconfig = { - "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", + "CLANG_CXX_LANGUAGE_STANDARD" => "c++20", "CLANG_CXX_LIBRARY" => "libc++", "GCC_C_LANGUAGE_STANDARD" => "gnu11", "GCC_DYNAMIC_NO_PIC" => "NO", From 057ce1c6628c4b93a22179511f127a2847499a8a Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Tue, 19 Mar 2024 18:23:52 +0100 Subject: [PATCH 237/249] fix ties from Dorico --- src/iomusxml.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index cab02b71ddf..2117e0e7510 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -3148,7 +3148,7 @@ void MusicXmlInput::ReadMusicXmlNote( } // ties - ReadMusicXmlTies(notations.node(), layer, note, measureNum); + ReadMusicXmlTies(node, layer, note, measureNum); // articulation std::vector artics; @@ -3834,7 +3834,8 @@ void MusicXmlInput::ReadMusicXmlBeamStart(const pugi::xml_node &node, const pugi void MusicXmlInput::ReadMusicXmlTies( const pugi::xml_node &node, Layer *layer, Note *note, const std::string &measureNum) { - for (pugi::xml_node xmlTie : node.children("tied")) { + pugi::xpath_node ties = node.select_node("notations[tied]"); + for (pugi::xml_node xmlTie : ties.node().children("tied")) { std::string tieType = xmlTie.attribute("type").as_string(); if (tieType.empty()) { From 0f834f1d70fca05cf2d8cd8285123cc757c264e2 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Wed, 20 Mar 2024 10:32:01 +0100 Subject: [PATCH 238/249] iterate over node set --- src/iomusxml.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/iomusxml.cpp b/src/iomusxml.cpp index 2117e0e7510..667e4d99a68 100644 --- a/src/iomusxml.cpp +++ b/src/iomusxml.cpp @@ -3834,8 +3834,9 @@ void MusicXmlInput::ReadMusicXmlBeamStart(const pugi::xml_node &node, const pugi void MusicXmlInput::ReadMusicXmlTies( const pugi::xml_node &node, Layer *layer, Note *note, const std::string &measureNum) { - pugi::xpath_node ties = node.select_node("notations[tied]"); - for (pugi::xml_node xmlTie : ties.node().children("tied")) { + pugi::xpath_node_set xmlTies = node.select_nodes("notations/tied"); + for (pugi::xpath_node_set::const_iterator it = xmlTies.begin(); it != xmlTies.end(); ++it) { + pugi::xml_node xmlTie = (*it).node(); std::string tieType = xmlTie.attribute("type").as_string(); if (tieType.empty()) { From f55d7bd4dec030813e522c057f3d0407f98e2508 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Mar 2024 16:45:18 +0000 Subject: [PATCH 239/249] Bump black from 22.12.0 to 24.3.0 in /fonts Bumps [black](https://github.com/psf/black) from 22.12.0 to 24.3.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/22.12.0...24.3.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- fonts/poetry.lock | 60 ++++++++++++++++++++++++++++++-------------- fonts/pyproject.toml | 2 +- 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/fonts/poetry.lock b/fonts/poetry.lock index bd9153bf74d..53c2a8f35ed 100644 --- a/fonts/poetry.lock +++ b/fonts/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "astroid" @@ -39,36 +39,47 @@ test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "black" -version = "22.12.0" +version = "24.3.0" description = "The uncompromising code formatter." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, + {file = "black-24.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395"}, + {file = "black-24.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995"}, + {file = "black-24.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7"}, + {file = "black-24.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0"}, + {file = "black-24.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9"}, + {file = "black-24.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597"}, + {file = "black-24.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d"}, + {file = "black-24.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5"}, + {file = "black-24.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f"}, + {file = "black-24.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11"}, + {file = "black-24.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4"}, + {file = "black-24.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5"}, + {file = "black-24.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837"}, + {file = "black-24.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd"}, + {file = "black-24.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213"}, + {file = "black-24.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959"}, + {file = "black-24.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb"}, + {file = "black-24.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7"}, + {file = "black-24.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7"}, + {file = "black-24.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f"}, + {file = "black-24.3.0-py3-none-any.whl", hash = "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93"}, + {file = "black-24.3.0.tar.gz", hash = "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f"}, ] [package.dependencies] click = ">=8.0.0" mypy-extensions = ">=0.4.3" +packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] @@ -389,6 +400,17 @@ files = [ {file = "numpy-1.26.2.tar.gz", hash = "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea"}, ] +[[package]] +name = "packaging" +version = "24.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, +] + [[package]] name = "parso" version = "0.8.3" @@ -767,4 +789,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "8990a11839baa27daa52ec96424fdaf96f294140034d66d66d7fde50197b0749" +content-hash = "13dc88eb6e57ab4192765ec4d46f48aa0091403e19806d5c3ed58ffe35a76464" diff --git a/fonts/pyproject.toml b/fonts/pyproject.toml index 3bd27e61a62..6c68d206a6d 100644 --- a/fonts/pyproject.toml +++ b/fonts/pyproject.toml @@ -12,7 +12,7 @@ svgpathtools = "^1.6.0" [tool.poetry.group.dev.dependencies] ipython = "^8.10.0" -black = "^22.8.0" +black = "^24.3.0" mypy = "^0.971" pylint = "^2.15.3" From 2a8f0b0b345b614c177601c7fca470d665f8b382 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 21 Mar 2024 14:51:17 +0100 Subject: [PATCH 240/249] Set locale in toolkit --- include/vrv/toolkit.h | 2 ++ src/toolkit.cpp | 5 +++++ src/vrv.cpp | 2 -- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/include/vrv/toolkit.h b/include/vrv/toolkit.h index 14a5499baeb..e607b0d4ba6 100644 --- a/include/vrv/toolkit.h +++ b/include/vrv/toolkit.h @@ -790,6 +790,8 @@ class Toolkit { Options *m_options; + std::locale m_previousLocale; + /** * The C buffer string. */ diff --git a/src/toolkit.cpp b/src/toolkit.cpp index 3552ff2279f..9f82ee8004c 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -69,6 +69,9 @@ Toolkit::Toolkit(bool initFont) m_humdrumBuffer = NULL; m_cString = NULL; + // Required for proper formatting, e.g., in StringFormat (see vrv.cpp) + m_previousLocale = std::locale::global(std::locale::classic()); + if (initFont) { Resources &resources = m_doc.GetResourcesForModification(); resources.InitFonts(); @@ -85,6 +88,8 @@ Toolkit::Toolkit(bool initFont) Toolkit::~Toolkit() { + std::locale::global(m_previousLocale); + if (m_humdrumBuffer) { free(m_humdrumBuffer); m_humdrumBuffer = NULL; diff --git a/src/vrv.cpp b/src/vrv.cpp index f4ac75c2d33..8e4353b086c 100644 --- a/src/vrv.cpp +++ b/src/vrv.cpp @@ -211,14 +211,12 @@ void EnableLogToBuffer(bool value) std::string StringFormat(const char *fmt, ...) { - std::locale previousLocale = std::locale::global(std::locale("C")); std::string str(STRING_FORMAT_MAX_LEN, 0); va_list args; va_start(args, fmt); vsnprintf(&str[0], STRING_FORMAT_MAX_LEN, fmt, args); va_end(args); str.resize(strlen(str.data())); - std::locale::global(previousLocale); return str; } From ce8273db41760cd9eda288e1d9ca23b2d3de223c Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 21 Mar 2024 16:30:44 +0100 Subject: [PATCH 241/249] Add option --set-locale --- include/vrv/options.h | 1 + include/vrv/toolkit.h | 2 +- src/options.cpp | 4 ++++ src/toolkit.cpp | 12 ++++++++---- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/include/vrv/options.h b/include/vrv/options.h index 98a66d74f36..0e9160240a7 100644 --- a/include/vrv/options.h +++ b/include/vrv/options.h @@ -652,6 +652,7 @@ class Options { OptionBool m_preserveAnalyticalMarkup; OptionBool m_removeIds; OptionBool m_scaleToPageSize; + OptionBool m_setLocale; OptionBool m_showRuntime; OptionBool m_shrinkToFit; OptionIntMap m_smuflTextFont; diff --git a/include/vrv/toolkit.h b/include/vrv/toolkit.h index e607b0d4ba6..718df09219a 100644 --- a/include/vrv/toolkit.h +++ b/include/vrv/toolkit.h @@ -790,7 +790,7 @@ class Toolkit { Options *m_options; - std::locale m_previousLocale; + std::optional m_previousLocale; /** * The C buffer string. diff --git a/src/options.cpp b/src/options.cpp index 0a24f1c16bd..a873af78cd4 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -1135,6 +1135,10 @@ Options::Options() m_scaleToPageSize.Init(false); this->Register(&m_scaleToPageSize, "scaleToPageSize", &m_general); + m_setLocale.SetInfo("Set the global locale", "Changes the global locale to C (this is not thread-safe)"); + m_setLocale.Init(false); + this->Register(&m_setLocale, "setLocale", &m_general); + m_showRuntime.SetInfo("Show runtime on CLI", "Display the total runtime on command-line"); m_showRuntime.Init(false); this->Register(&m_showRuntime, "showRuntime", &m_general); diff --git a/src/toolkit.cpp b/src/toolkit.cpp index 9f82ee8004c..85a35c88f54 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -69,9 +69,6 @@ Toolkit::Toolkit(bool initFont) m_humdrumBuffer = NULL; m_cString = NULL; - // Required for proper formatting, e.g., in StringFormat (see vrv.cpp) - m_previousLocale = std::locale::global(std::locale::classic()); - if (initFont) { Resources &resources = m_doc.GetResourcesForModification(); resources.InitFonts(); @@ -88,7 +85,9 @@ Toolkit::Toolkit(bool initFont) Toolkit::~Toolkit() { - std::locale::global(m_previousLocale); + if (m_previousLocale) { + std::locale::global(*m_previousLocale); + } if (m_humdrumBuffer) { free(m_humdrumBuffer); @@ -1158,6 +1157,11 @@ bool Toolkit::SetOptions(const std::string &jsonOptions) resources.LoadAll(); } + if (m_options->m_setLocale.GetValue() && !m_previousLocale) { + // Required for proper formatting, e.g., in StringFormat (see vrv.cpp) + m_previousLocale = std::locale::global(std::locale::classic()); + } + return true; } From 478a7c77c9c9fa766c5da5aefb07d34108d0444a Mon Sep 17 00:00:00 2001 From: David Bauer Date: Thu, 21 Mar 2024 18:24:35 +0100 Subject: [PATCH 242/249] Add proper methods and apply option in CLI --- include/vrv/toolkit.h | 8 ++++++++ src/toolkit.cpp | 26 ++++++++++++++++++-------- tools/main.cpp | 2 ++ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/include/vrv/toolkit.h b/include/vrv/toolkit.h index 718df09219a..8ec0376e71d 100644 --- a/include/vrv/toolkit.h +++ b/include/vrv/toolkit.h @@ -732,6 +732,14 @@ class Toolkit { */ int GetOutputTo() { return m_outputTo; } + /** + * Setting the global locale. + */ + ///@{ + void SetLocale(); + void ResetLocale(); + ///@} + /** * Measuring runtime. * diff --git a/src/toolkit.cpp b/src/toolkit.cpp index 85a35c88f54..2ae7b97c19b 100644 --- a/src/toolkit.cpp +++ b/src/toolkit.cpp @@ -85,9 +85,7 @@ Toolkit::Toolkit(bool initFont) Toolkit::~Toolkit() { - if (m_previousLocale) { - std::locale::global(*m_previousLocale); - } + this->ResetLocale(); if (m_humdrumBuffer) { free(m_humdrumBuffer); @@ -1140,6 +1138,8 @@ bool Toolkit::SetOptions(const std::string &jsonOptions) m_options->Sync(); + this->SetLocale(); + // Forcing font resource to be reset if the font is given in the options if (json.has("fontAddCustom")) { Resources &resources = m_doc.GetResourcesForModification(); @@ -1157,11 +1157,6 @@ bool Toolkit::SetOptions(const std::string &jsonOptions) resources.LoadAll(); } - if (m_options->m_setLocale.GetValue() && !m_previousLocale) { - // Required for proper formatting, e.g., in StringFormat (see vrv.cpp) - m_previousLocale = std::locale::global(std::locale::classic()); - } - return true; } @@ -2160,6 +2155,21 @@ std::string Toolkit::ConvertHumdrumToMIDI(const std::string &humdrumData) #endif } +void Toolkit::SetLocale() +{ + if (m_options->m_setLocale.GetValue() && !m_previousLocale) { + // Required for proper formatting, e.g., in StringFormat (see vrv.cpp) + m_previousLocale = std::locale::global(std::locale::classic()); + } +} + +void Toolkit::ResetLocale() +{ + if (m_previousLocale) { + std::locale::global(*m_previousLocale); + } +} + void Toolkit::InitClock() { #ifndef NO_RUNTIME diff --git a/tools/main.cpp b/tools/main.cpp index d30a41fca43..a57880eccb3 100644 --- a/tools/main.cpp +++ b/tools/main.cpp @@ -259,6 +259,8 @@ int main(int argc, char **argv) } options->Sync(); + toolkit.SetLocale(); + if (show_version) { display_version(); exit(0); From 24737009c5ebdc009cd41644da5f2e3a26964279 Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Fri, 22 Mar 2024 10:30:37 +0100 Subject: [PATCH 243/249] Update clang-format-check.yml --- .github/workflows/clang-format-check.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/clang-format-check.yml b/.github/workflows/clang-format-check.yml index e00c94d00fa..f79013e8515 100644 --- a/.github/workflows/clang-format-check.yml +++ b/.github/workflows/clang-format-check.yml @@ -18,8 +18,8 @@ jobs: steps: - uses: actions/checkout@v4 - name: Run clang-format style check for C/C++ programs. - uses: jidicula/clang-format-action@v4.9.0 + uses: jidicula/clang-format-action@v4.11.0 with: - clang-format-version: "15" + clang-format-version: "18" check-path: ${{ matrix.path['check'] }} exclude-regex: ${{ matrix.path['exclude'] }} From b541da849a6092625978f9ac2b303cb236c0955a Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Fri, 22 Mar 2024 10:34:33 +0100 Subject: [PATCH 244/249] formatting --- include/vrv/bboxdevicecontext.h | 6 +++--- include/vrv/devicecontext.h | 10 +++++----- include/vrv/layerelement.h | 2 +- include/vrv/lb.h | 2 +- include/vrv/view.h | 2 +- src/beam.cpp | 10 ++++------ src/options.cpp | 18 ++++++------------ 7 files changed, 21 insertions(+), 29 deletions(-) diff --git a/include/vrv/bboxdevicecontext.h b/include/vrv/bboxdevicecontext.h index 05b63b990ba..1c6ee4f9274 100644 --- a/include/vrv/bboxdevicecontext.h +++ b/include/vrv/bboxdevicecontext.h @@ -50,7 +50,7 @@ class BBoxDeviceContext : public DeviceContext { */ ///@{ void SetBackground(int color, int style = AxSOLID) override; - void SetBackgroundImage(void *image, double opacity = 1.0) override{}; + void SetBackgroundImage(void *image, double opacity = 1.0) override {}; void SetBackgroundMode(int mode) override; void SetTextForeground(int color) override; void SetTextBackground(int color) override; @@ -87,7 +87,7 @@ class BBoxDeviceContext : public DeviceContext { void DrawSpline(int n, Point points[]) override; void DrawGraphicUri(int x, int y, int width, int height, const std::string &uri) override; void DrawSvgShape(int x, int y, int width, int height, double scale, pugi::xml_node svg) override; - void DrawBackgroundImage(int x = 0, int y = 0) override{}; + void DrawBackgroundImage(int x = 0, int y = 0) override {}; ///@} /** @@ -150,7 +150,7 @@ class BBoxDeviceContext : public DeviceContext { * @name Method for adding description element */ ///@{ - void AddDescription(const std::string &text) override{}; + void AddDescription(const std::string &text) override {}; ///@} private: diff --git a/include/vrv/devicecontext.h b/include/vrv/devicecontext.h index e493d38b611..b319c835a1a 100644 --- a/include/vrv/devicecontext.h +++ b/include/vrv/devicecontext.h @@ -207,7 +207,7 @@ class DeviceContext { * Special method for forcing bounding boxes to be updated * Used for invisible elements (e.g., ) that needs to be take into account in spacing */ - virtual void DrawPlaceholder(int x, int y){}; + virtual void DrawPlaceholder(int x, int y) {}; /** * @name Method for starting and ending a text @@ -258,14 +258,14 @@ class DeviceContext { * For example, the method can be used for grouping shapes in in SVG */ ///@{ - virtual void StartCustomGraphic(const std::string &name, std::string gClass = "", std::string gId = ""){}; - virtual void EndCustomGraphic(){}; + virtual void StartCustomGraphic(const std::string &name, std::string gClass = "", std::string gId = "") {}; + virtual void EndCustomGraphic() {}; ///@} /** * Method for changing the color of a custom graphic */ - virtual void SetCustomGraphicColor(const std::string &color){}; + virtual void SetCustomGraphicColor(const std::string &color) {}; /** * @name Methods for re-starting and ending a graphic for objects drawn in separate steps @@ -308,7 +308,7 @@ class DeviceContext { * @name Method for adding description element */ ///@{ - virtual void AddDescription(const std::string &text){}; + virtual void AddDescription(const std::string &text) {}; ///@} /** diff --git a/include/vrv/layerelement.h b/include/vrv/layerelement.h index 085fa811845..cf8a7af9e32 100644 --- a/include/vrv/layerelement.h +++ b/include/vrv/layerelement.h @@ -296,7 +296,7 @@ class LayerElement : public Object, /** * Helper function to set shortening for elements with beam interface */ - virtual void SetElementShortening(int shortening){}; + virtual void SetElementShortening(int shortening) {}; /** * Get the stem mod for the element (if any) diff --git a/include/vrv/lb.h b/include/vrv/lb.h index 9b044f6d25b..52c97896da4 100644 --- a/include/vrv/lb.h +++ b/include/vrv/lb.h @@ -37,7 +37,7 @@ class Lb : public TextElement { /** * Lb is an empty element */ - void AddChild(Object *object) override{}; + void AddChild(Object *object) override {}; /** * Interface for class functor visitation diff --git a/include/vrv/view.h b/include/vrv/view.h index c9137403e20..2f59e4c6657 100644 --- a/include/vrv/view.h +++ b/include/vrv/view.h @@ -122,7 +122,7 @@ class View { virtual void DoRefresh() {} virtual void DoResize() {} virtual void DoReset() {} - virtual void OnPageChange(){}; + virtual void OnPageChange() {}; ///@} /** diff --git a/src/beam.cpp b/src/beam.cpp index 775ccb9f55a..5e30dfde1c5 100644 --- a/src/beam.cpp +++ b/src/beam.cpp @@ -333,9 +333,8 @@ std::pair BeamSegment::GetMinimalStemLength(const BeamDrawingInterface const auto [topOffset, bottomOffset] = this->GetVerticalOffset(beamInterface); // lambda check whether coord has element set and whether that element is CHORD or NOTE - const auto isNoteOrChord = [](BeamElementCoord *coord) { - return (coord->m_element && coord->m_element->Is({ CHORD, NOTE })); - }; + const auto isNoteOrChord + = [](BeamElementCoord *coord) { return (coord->m_element && coord->m_element->Is({ CHORD, NOTE })); }; using CoordIt = ArrayOfBeamElementCoords::const_iterator; for (CoordIt it = m_beamElementCoordRefs.begin(); it != m_beamElementCoordRefs.end(); ++it) { @@ -460,9 +459,8 @@ void BeamSegment::AdjustBeamToFrenchStyle(const BeamDrawingInterface *beamInterf // set to store durations of relevant notes (it's ordered, so min duration is going to be first) std::set noteDurations; // lambda check whether coord has element set and whether that element is CHORD or NOTE - const auto isNoteOrChord = [](BeamElementCoord *coord) { - return (coord->m_element && coord->m_element->Is({ CHORD, NOTE })); - }; + const auto isNoteOrChord + = [](BeamElementCoord *coord) { return (coord->m_element && coord->m_element->Is({ CHORD, NOTE })); }; // iterators using CoordIt = ArrayOfBeamElementCoords::iterator; using CoordReverseIt = ArrayOfBeamElementCoords::reverse_iterator; diff --git a/src/options.cpp b/src/options.cpp index 0a24f1c16bd..08de0de092d 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -111,13 +111,11 @@ jsonxx::Object Option::ToJson() const const OptionBool *optBool = dynamic_cast(this); if (optBool) { - opt << "type" - << "bool"; + opt << "type" << "bool"; opt << "default" << optBool->GetDefault(); } else if (optDbl) { - opt << "type" - << "double"; + opt << "type" << "double"; jsonxx::Value value(optDbl->GetDefault()); value.precision_ = 2; opt << "default" << value; @@ -129,20 +127,17 @@ jsonxx::Object Option::ToJson() const opt << "max" << value; } else if (optInt) { - opt << "type" - << "int"; + opt << "type" << "int"; opt << "default" << optInt->GetDefault(); opt << "min" << optInt->GetMin(); opt << "max" << optInt->GetMax(); } else if (optString) { - opt << "type" - << "std::string"; + opt << "type" << "std::string"; opt << "default" << optString->GetDefault(); } else if (optArray) { - opt << "type" - << "array"; + opt << "type" << "array"; std::vector strValues = optArray->GetDefault(); std::vector::iterator strIter; jsonxx::Array values; @@ -152,8 +147,7 @@ jsonxx::Object Option::ToJson() const opt << "default" << values; } else if (optIntMap) { - opt << "type" - << "std::string-list"; + opt << "type" << "std::string-list"; opt << "default" << optIntMap->GetDefaultStrValue(); std::vector strValues = optIntMap->GetStrValues(false); std::vector::iterator strIter; From ff4649d3194b25599e607db0489d3f208fb0d4e3 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Mon, 8 Apr 2024 21:15:06 +0200 Subject: [PATCH 245/249] Fix HasFile implementation --- src/filereader.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/filereader.cpp b/src/filereader.cpp index 4703dd56a44..2ae6dfc9659 100644 --- a/src/filereader.cpp +++ b/src/filereader.cpp @@ -58,7 +58,7 @@ bool ZipFileReader::Load(const std::string &filename) #else std::ifstream fin(filename.c_str(), std::ios::in | std::ios::binary); if (!fin.is_open()) { - LogError("File archive '%s' could not be open.", filename.c_str()); + LogError("File archive '%s' could not be opened.", filename.c_str()); return false; } @@ -92,7 +92,7 @@ std::list ZipFileReader::GetFileList() const assert(m_file); std::list list; - for (miniz_cpp::zip_info &member : m_file->infolist()) { + for (const miniz_cpp::zip_info &member : m_file->infolist()) { list.push_back(member.filename); } return list; @@ -103,13 +103,9 @@ bool ZipFileReader::HasFile(const std::string &filename) assert(m_file); // Look for the file in the zip - for (miniz_cpp::zip_info &member : m_file->infolist()) { - if (member.filename == filename) { - return true; - } - } - - return true; + const std::vector &fileInfoList = m_file->infolist(); + return std::any_of(fileInfoList.cbegin(), fileInfoList.cend(), + [&filename](const auto &info) { return info.filename == filename; }); } std::string ZipFileReader::ReadTextFile(const std::string &filename) @@ -117,7 +113,7 @@ std::string ZipFileReader::ReadTextFile(const std::string &filename) assert(m_file); // Look for the meta file in the zip - for (miniz_cpp::zip_info &member : m_file->infolist()) { + for (const miniz_cpp::zip_info &member : m_file->infolist()) { if (member.filename == filename) { return m_file->read(member.filename); } From f6d5828dda8e974d62c6bd8158eabf34976574da Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Mon, 15 Apr 2024 09:45:15 +0200 Subject: [PATCH 246/249] only draw extender if set explicitly --- src/system.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/system.cpp b/src/system.cpp index 2a070dba54f..cbf3e6748f3 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -341,7 +341,7 @@ void System::AddToDrawingListIfNecessary(Object *object) else if (object->Is(DYNAM)) { Dynam *dynam = vrv_cast(object); assert(dynam); - if (dynam->GetEnd() || (dynam->GetNextLink() && (dynam->GetExtender() == BOOLEAN_true))) { + if ((dynam->GetEnd() || dynam->GetNextLink()) && (dynam->GetExtender() == BOOLEAN_true)) { this->AddToDrawingList(dynam); } } From 859852762723a61af2b7f9fcda6200b89342c04c Mon Sep 17 00:00:00 2001 From: Klaus Rettinghaus Date: Tue, 23 Apr 2024 09:18:31 +0200 Subject: [PATCH 247/249] update midifile --- include/midi/Binasc.h | 8 ++- include/midi/MidiEvent.h | 7 ++ include/midi/MidiEventList.h | 2 + include/midi/MidiFile.h | 23 ++++--- include/midi/MidiMessage.h | 11 +++ src/midi/Binasc.cpp | 31 ++++++++- src/midi/MidiEvent.cpp | 16 ++++- src/midi/MidiEventList.cpp | 43 ++++++------ src/midi/MidiFile.cpp | 78 ++++++++++----------- src/midi/MidiMessage.cpp | 127 ++++++++++++++++++++++++++++------- 10 files changed, 248 insertions(+), 98 deletions(-) diff --git a/include/midi/Binasc.h b/include/midi/Binasc.h index 6aa57f09478..686cc407c7c 100644 --- a/include/midi/Binasc.h +++ b/include/midi/Binasc.h @@ -13,11 +13,11 @@ #ifndef _BINASC_H_INCLUDED #define _BINASC_H_INCLUDED -#include +#include #include +#include #include -#include -#include /* needed for MinGW */ + namespace smf { @@ -149,6 +149,8 @@ class Binasc { int getWord (std::string& word, const std::string& input, const std::string& terminators, int index); + static const char *GMinstrument[128]; + }; } // end of namespace smf diff --git a/include/midi/MidiEvent.h b/include/midi/MidiEvent.h index 39f141ee9b1..f8141d17bba 100644 --- a/include/midi/MidiEvent.h +++ b/include/midi/MidiEvent.h @@ -15,8 +15,11 @@ #define _MIDIEVENT_H_INCLUDED #include "MidiMessage.h" + +#include #include + namespace smf { class MidiEvent : public MidiMessage { @@ -63,6 +66,10 @@ class MidiEvent : public MidiMessage { }; + +std::ostream& operator<<(std::ostream& out, MidiEvent& event); + + } // end of namespace smf #endif /* _MIDIEVENT_H_INCLUDED */ diff --git a/include/midi/MidiEventList.h b/include/midi/MidiEventList.h index e3bfb13cf5b..f9b1e8538e2 100644 --- a/include/midi/MidiEventList.h +++ b/include/midi/MidiEventList.h @@ -14,8 +14,10 @@ #define _MIDIEVENTLIST_H_INCLUDED #include "MidiEvent.h" + #include + namespace smf { class MidiEventList { diff --git a/include/midi/MidiFile.h b/include/midi/MidiFile.h index 4a363da5658..4972218f627 100644 --- a/include/midi/MidiFile.h +++ b/include/midi/MidiFile.h @@ -16,19 +16,24 @@ #include "MidiEventList.h" -#include -#include -#include #include +#include +#include +#include -#define TIME_STATE_DELTA 0 -#define TIME_STATE_ABSOLUTE 1 - -#define TRACK_STATE_SPLIT 0 -#define TRACK_STATE_JOINED 1 namespace smf { +enum { + TRACK_STATE_SPLIT = 0, // Tracks are separated into separate vector postions. + TRACK_STATE_JOINED = 1 // Tracks are merged into a single vector position, +}; // like a Type-0 MIDI file, but reversible. + +enum { + TIME_STATE_DELTA = 0, // MidiMessage::ticks are in delta time format (like MIDI file). + TIME_STATE_ABSOLUTE = 1 // MidiMessage::ticks are in absolute time format (0=start time). +}; + class _TickTime { public: int tick; @@ -217,7 +222,7 @@ class MidiFile { MidiEvent* addTempo (int aTrack, int aTick, double aTempo); MidiEvent* addKeySignature (int aTrack, int aTick, - int key, bool mode = 0); + int fifths, bool mode = 0); MidiEvent* addTimeSignature (int aTrack, int aTick, int top, int bottom, int clocksPerClick = 24, diff --git a/include/midi/MidiMessage.h b/include/midi/MidiMessage.h index 49bd88a73e7..b298e15b9a0 100644 --- a/include/midi/MidiMessage.h +++ b/include/midi/MidiMessage.h @@ -14,10 +14,12 @@ #ifndef _MIDIMESSAGE_H_INCLUDED #define _MIDIMESSAGE_H_INCLUDED +#include #include #include #include + namespace smf { typedef unsigned char uchar; @@ -122,6 +124,12 @@ class MidiMessage : public std::vector { void makePatchChange (int channel, int patchnum); void makeTimbre (int channel, int patchnum); void makeController (int channel, int num, int value); + void makePitchBend (int channel, int lsb, int msb); + void makePitchBend (int channel, int value); + void makePitchBendDouble (int channel, double value); + void makePitchbend (int channel, int lsb, int msb) { makePitchBend(channel, lsb, msb); } + void makePitchbend (int channel, int value) { makePitchBend(channel, value); } + void makePitchbendDouble (int channel, double value) { makePitchBendDouble(channel, value); } // helper functions to create various continuous controller messages: void makeSustain (int channel, int value); @@ -199,6 +207,9 @@ class MidiMessage : public std::vector { }; +std::ostream& operator<<(std::ostream& out, MidiMessage& event); + + } // end of namespace smf diff --git a/src/midi/Binasc.cpp b/src/midi/Binasc.cpp index f49aa563201..446dc03b9b0 100644 --- a/src/midi/Binasc.cpp +++ b/src/midi/Binasc.cpp @@ -11,12 +11,37 @@ #include "Binasc.h" +#include #include -#include namespace smf { +const char* Binasc::GMinstrument[128] = { + "acoustic grand piano", "bright acoustic piano", "electric grand piano", "honky-tonk piano", "rhodes piano", "chorused piano", + "harpsichord", "clavinet", "celeste", "glockenspiel", "music box", "vibraphone", + "marimba", "xylophone", "tubular bells", "dulcimer", "hammond organ", "percussive organ", + "rock organ", "church organ", "reed organ", "accordion", "harmonica", "tango accordion", + "nylon guitar", "steel guitar", "jazz guitar", "clean guitar", "muted guitar", "overdriven guitar", + "distortion guitar", "guitar harmonics", "acoustic bass", "fingered electric bass", "picked electric bass", "fretless bass", + "slap bass 1", "slap bass 2", "synth bass 1", "synth bass 2", "violin", "viola", + "cello", "contrabass", "tremolo strings", "pizzcato strings", "orchestral harp", "timpani", + "string ensemble 1", "string ensemble 2", "synth strings 1", "synth strings 1", "choir aahs", "voice oohs", + "synth voices", "orchestra hit", "trumpet", "trombone", "tuba", "muted trumpet", + "frenc horn", "brass section", "syn brass 1", "synth brass 2", "soprano sax", "alto sax", + "tenor sax", "baritone sax", "oboe", "english horn", "bassoon", "clarinet", + "piccolo", "flute", "recorder", "pan flute", "bottle blow", "shakuhachi", + "whistle", "ocarina", "square wave", "saw wave", "calliope lead", "chiffer lead", + "charang lead", "voice lead", "fifths lead", "brass lead", "newage pad", "warm pad", + "polysyn pad", "choir pad", "bowed pad", "metallic pad", "halo pad", "sweep pad", + "rain", "soundtrack", "crystal", "atmosphere", "brightness", "goblins", + "echoes", "sci-fi", "sitar", "banjo", "shamisen", "koto", + "kalimba", "bagpipes", "fiddle", "shanai", "tinkle bell", "agogo", + "steel drums", "woodblock", "taiko drum", "melodoc tom", "synth drum", "reverse cymbal", + "guitar fret noise", "breath noise", "seashore", "bird tweet", "telephone ring", "helicopter", + "applause", "gunshot" +}; + ////////////////////////////// // // Binasc::Binasc -- Constructor: set the default option values. @@ -717,7 +742,9 @@ int Binasc::readMidiEvent(std::ostream& out, std::istream& infile, output << " '" << std::dec << (int)byte1; if (m_commentsQ) { output << "\t"; - comment += "patch-change"; + comment += "patch-change ("; + comment += GMinstrument[byte1 & 0x7f]; + comment += ")"; } break; case 0xD0: // channel pressure: 1 bytes diff --git a/src/midi/MidiEvent.cpp b/src/midi/MidiEvent.cpp index 945e3c532eb..0cf590d8c97 100644 --- a/src/midi/MidiEvent.cpp +++ b/src/midi/MidiEvent.cpp @@ -13,7 +13,7 @@ #include "MidiEvent.h" -#include +#include namespace smf { @@ -278,6 +278,20 @@ double MidiEvent::getDurationInSeconds(void) const { } + +////////////////////////////// +// +// operator<<(MidiMessage) -- Print tick value followed by MIDI bytes for event. +// The tick value will be either relative or absolute depending on the state +// of the MidiFile object containing it. +// + +std::ostream& operator<<(std::ostream& out, MidiEvent& event) { + out << event.tick << '(' << static_cast(event) << ')'; + return out; +} + + } // end namespace smf diff --git a/src/midi/MidiEventList.cpp b/src/midi/MidiEventList.cpp index 52749c5d837..f38fefbc2ca 100644 --- a/src/midi/MidiEventList.cpp +++ b/src/midi/MidiEventList.cpp @@ -10,15 +10,14 @@ // Description: A class which stores a MidiEvents for a MidiFile track. // - #include "MidiEventList.h" -#include #include +#include #include #include +#include -#include namespace smf { @@ -54,8 +53,8 @@ MidiEventList::MidiEventList(const MidiEventList& other) { // MidiEventList::MidiEventList(MidiEventList&& other) { - list = std::move(other.list); - other.list.clear(); + list = std::move(other.list); + other.list.clear(); } @@ -124,12 +123,12 @@ const MidiEvent& MidiEventList::last(void) const { // MidiEvent& MidiEventList::getEvent(int index) { - return *list[index]; + return *list[index]; } const MidiEvent& MidiEventList::getEvent(int index) const { - return *list[index]; + return *list[index]; } @@ -141,10 +140,10 @@ const MidiEvent& MidiEventList::getEvent(int index) const { // void MidiEventList::clear(void) { - for (int i=0; i<(int)list.size(); i++) { - if (list[i] != NULL) { - delete list[i]; - list[i] = NULL; + for (auto& item : list) { + if (item != NULL) { + delete item; + item = NULL; } } list.resize(0); @@ -245,10 +244,10 @@ int MidiEventList::push_back(MidiEvent& event) { void MidiEventList::removeEmpties(void) { int count = 0; - for (int i=0; i<(int)list.size(); i++) { - if (list[i]->empty()) { - delete list[i]; - list[i] = NULL; + for (auto& item : list) { + if (item->empty()) { + delete item; + item = NULL; count++; } } @@ -257,9 +256,9 @@ void MidiEventList::removeEmpties(void) { } std::vector newlist; newlist.reserve(list.size() - count); - for (int i=0; i<(int)list.size(); i++) { - if (list[i]) { - newlist.push_back(list[i]); + for (auto& item : list) { + if (item) { + newlist.push_back(item); } } list.swap(newlist); @@ -292,8 +291,8 @@ int MidiEventList::linkNotePairs(void) { // dimension 3: List of active note-ons or note-offs. std::vector>> noteons; noteons.resize(16); - for (int i=0; i<(int)noteons.size(); i++) { - noteons[i].resize(128); + for (auto& noteon : noteons) { + noteon.resize(128); } // Controller linking: The following General MIDI controller numbers are @@ -433,7 +432,7 @@ void MidiEventList::clearLinks(void) { ////////////////////////////// // -// MidiEventList::clearSequence -- Remove any seqence serial numbers from +// MidiEventList::clearSequence -- Remove any sequence serial numbers from // MidiEvents in the list. This will cause the default ordering by // sortTracks() to be used, in which case the ordering of MidiEvents // occurring at the same tick may switch their ordering. @@ -454,7 +453,7 @@ void MidiEventList::clearSequence(void) { // to preseve the order of MIDI messages in a track when they occur // at the same tick time. Particularly for use with joinTracks() // or sortTracks(). markSequence will be done automatically when -// a MIDI file is read, in case the ordering of events occuring at +// a MIDI file is read, in case the ordering of events occurring at // the same time is important. Use clearSequence() to use the // default sorting behavior of sortTracks() when events occur at the // same time. Returns the next serial number that has not yet been diff --git a/src/midi/MidiFile.cpp b/src/midi/MidiFile.cpp index fa1534d79df..55956c8ce79 100644 --- a/src/midi/MidiFile.cpp +++ b/src/midi/MidiFile.cpp @@ -15,14 +15,14 @@ #include "MidiFile.h" #include "Binasc.h" -#include -#include -#include -#include +#include #include -#include +#include +#include #include -#include +#include +#include +#include namespace smf { @@ -71,21 +71,21 @@ const char* MidiFile::GMinstrument[128] = { ////////////////////////////// // -// MidiFile::MidiFile -- Constuctor. +// MidiFile::MidiFile -- Constructor. // MidiFile::MidiFile(void) { m_events.resize(1); - for (int i=0; i<(int)m_events.size(); i++) { - m_events[i] = new MidiEventList; + for (auto &event : m_events) { + event = new MidiEventList; } } MidiFile::MidiFile(const std::string& filename) { m_events.resize(1); - for (int i=0; i<(int)m_events.size(); i++) { - m_events[i] = new MidiEventList; + for (auto &event : m_events) { + event = new MidiEventList; } read(filename); } @@ -93,8 +93,8 @@ MidiFile::MidiFile(const std::string& filename) { MidiFile::MidiFile(std::istream& input) { m_events.resize(1); - for (int i=0; i<(int)m_events.size(); i++) { - m_events[i] = new MidiEventList; + for (auto &event : m_events) { + event = new MidiEventList; } read(input); } @@ -507,7 +507,7 @@ bool MidiFile::readSmf(std::istream& input) { m_events[i]->clear(); // Read MIDI events in the track, which are pairs of VLV values - // and then the bytes for the MIDI message. Running status messags + // and then the bytes for the MIDI message. Running status messages // will be filled in with their implicit command byte. // The timestamps are converted from delta ticks to absolute ticks, // with the absticks variable accumulating the VLV tick values. @@ -597,7 +597,7 @@ bool MidiFile::write(std::ostream& out) { shortdata = static_cast(getNumTracks()); writeBigEndianUShort(out, shortdata); - // 5. write out the number of ticks per quarternote. (avoiding SMTPE for now) + // 5. write out the number of ticks per quarternote. (avoiding SMPTE for now) shortdata = static_cast(getTicksPerQuarterNote()); writeBigEndianUShort(out, shortdata); @@ -774,7 +774,7 @@ bool MidiFile::writeHex(std::ostream& out, int width) { int wordcount = 1; int linewidth = width >= 0 ? width : 25; for (int i=0; iremoveEmpties(); + for (auto &event : m_events) { + event->removeEmpties(); } } @@ -954,7 +954,7 @@ void MidiFile::removeEmpties(void) { // a track when they occur at the same tick time. Particularly // for use with joinTracks() or sortTracks(). markSequence will // be done automatically when a MIDI file is read, in case the -// ordering of m_events occuring at the same time is important. +// ordering of m_events occurring at the same time is important. // Use clearSequence() to use the default sorting behavior of // sortTracks(). // @@ -982,7 +982,7 @@ void MidiFile::markSequence(int track, int sequence) { ////////////////////////////// // -// MidiFile::clearSequence -- Remove any seqence serial numbers from +// MidiFile::clearSequence -- Remove any sequence serial numbers from // MidiEvents in the MidiFile. This will cause the default ordering by // sortTracks() to be used, in which case the ordering of MidiEvents // occurring at the same tick may switch their ordering. @@ -1311,7 +1311,7 @@ void MidiFile::deltaTicks(void) { // absolute time, which means that the time field // in the MidiEvent struct represents the exact tick // time to play the event rather than the time since -// the last event to wait untill playing the current +// the last event to wait until playing the current // event. // @@ -1422,7 +1422,7 @@ int MidiFile::getFileDurationInTicks(void) { // in units of quarter notes. If the MidiFile is in delta tick mode, // then temporarily got into absolute tick mode to do the calculations. // Note that this is expensive, so you should normally call this function -// while in aboslute tick (default) mode. +// while in absolute tick (default) mode. // double MidiFile::getFileDurationInQuarters(void) { @@ -1434,7 +1434,7 @@ double MidiFile::getFileDurationInQuarters(void) { ////////////////////////////// // // MidiFile::getFileDurationInSeconds -- returns the duration of the -// logest track in the file. The tracks must be sorted before +// longest track in the file. The tracks must be sorted before // calling this function, since this function assumes that the // last MidiEvent in the track has the highest timestamp. // The file state can be in delta ticks since this function @@ -1906,7 +1906,7 @@ MidiEvent* MidiFile::addTimeSignature(int aTrack, int aTick, int top, int bottom // // MidiFile::addCompoundTimeSignature -- Add a time signature meta message // (meta #0x58), where the clocksPerClick parameter is set to three -// eighth notes for compount meters such as 6/8 which represents +// eighth notes for compound meters such as 6/8 which represents // two beats per measure. // // Default values: @@ -2347,7 +2347,7 @@ int MidiFile::getTicksPerQuarterNote(void) const { // setting for 25 frames a second with 40 subframes // which means one tick per millisecond. When SMPTE is // being used, there is no real concept of the quarter note, - // so presume 60 bpm as a simiplification here. + // so presume 60 bpm as a simplification here. // return 1000; } return m_ticksPerQuarterNote; @@ -2696,7 +2696,7 @@ double MidiFile::linearSecondInterpolationAtTick(int ticktime) { // MidiFile::buildTimeMap -- build an index of the absolute tick values // found in a MIDI file, and their corresponding time values in // seconds, taking into consideration tempo change messages. If no -// tempo messages are given (or untill they are given, then the +// tempo messages are given (or until they are given, then the // tempo is set to 120 beats per minute). If SMPTE time code is // used, then ticks are actually time values. So don't build // a time map for SMPTE ticks, and just calculate the time in @@ -2956,15 +2956,17 @@ int MidiFile::extractMidiData(std::istream& input, std::vector& array, ulong MidiFile::readVLValue(std::istream& input) { uchar b[5] = {0}; - for (int i=0; i<5; i++) { - b[i] = readByte(input); - if (!status()) { return m_rwstatus; } - if (b[i] < 0x80) { - break; - } - } + for (uchar &item : b) { + item = readByte(input); + if (!status()) { + return m_rwstatus; + } + if (item < 0x80) { + break; + } + } - return unpackVLV(b[0], b[1], b[2], b[3], b[4]); + return unpackVLV(b[0], b[1], b[2], b[3], b[4]); } @@ -3005,7 +3007,7 @@ ulong MidiFile::unpackVLV(uchar a, uchar b, uchar c, uchar d, uchar e) { // // MidiFile::writeVLValue -- write a number to the midifile // as a variable length value which segments a file into 7-bit -// values and adds a contination bit to each. Maximum size of input +// values and adds a continuation bit to each. Maximum size of input // aValue is 0x0FFFffff. // @@ -3392,7 +3394,7 @@ std::string MidiFile::base64Encode(const std::string& input) { output.reserve(((input.size()/3) + (input.size() % 3 > 0)) * 4); int vala = 0; int valb = -6; - for (unsigned char c : input) { + for (uchar c : input) { vala = (vala << 8) + c; valb += 8; while (valb >=0) { @@ -3423,7 +3425,7 @@ std::string MidiFile::base64Decode(const std::string& input) { std::string output; int vala = 0; int valb = -8; - for (unsigned char c : input) { + for (uchar c : input) { if (c == '=') { break; } else if (MidiFile::decodeLookup[c] == -1) { diff --git a/src/midi/MidiMessage.cpp b/src/midi/MidiMessage.cpp index 7b9eb33c289..5b19a36eb8a 100644 --- a/src/midi/MidiMessage.cpp +++ b/src/midi/MidiMessage.cpp @@ -14,10 +14,10 @@ #include "MidiMessage.h" #include +#include +#include #include #include -#include - namespace smf { @@ -315,11 +315,13 @@ bool MidiMessage::isMetaMessage(void) const { // bool MidiMessage::isNoteOff(void) const { - if (size() != 3) { + const MidiMessage& message = *this; + const vector& chars = message; + if (message.size() != 3) { return false; - } else if (((*this)[0] & 0xf0) == 0x80) { + } else if ((chars[0] & 0xf0) == 0x80) { return true; - } else if ((((*this)[0] & 0xf0) == 0x90) && ((*this)[2] == 0)) { + } else if (((chars[0] & 0xf0) == 0x90) && (chars[2] == 0x00)) { return true; } else { return false; @@ -676,7 +678,7 @@ bool MidiMessage::isInstrumentName(void) const { ////////////////////////////// // // MidiMessage::isLyricText -- Returns true if message is a meta message -// describing some lyric text (for karakoke MIDI files) +// describing some lyric text (for karaoke MIDI files) // (meta message type 0x05). // @@ -857,7 +859,7 @@ int MidiMessage::getKeyNumber(void) const { ////////////////////////////// // -// MidiMessage::getVelocity -- Return the key veolocity. If the message +// MidiMessage::getVelocity -- Return the key velocity. If the message // is not a note-on or a note-off, then return -1. If the value is // out of the range 0-127, then chop off the high-bits. // @@ -961,7 +963,7 @@ void MidiMessage::setP1(int value) { ////////////////////////////// // -// MidiMessage::setP2 -- Set the second paramter value. +// MidiMessage::setP2 -- Set the second paramater value. // If the MidiMessage is too short, add extra spaces // to allow for P2. The command byte and/or the P1 value // will be undefined if extra space needs to be added and @@ -980,7 +982,7 @@ void MidiMessage::setP2(int value) { ////////////////////////////// // -// MidiMessage::setP3 -- Set the third paramter value. +// MidiMessage::setP3 -- Set the third paramater value. // If the MidiMessage is too short, add extra spaces // to allow for P3. The command byte and/or the P1/P2 values // will be undefined if extra space needs to be added and @@ -1364,7 +1366,7 @@ void MidiMessage::setSpelling(int base7, int accidental) { // pc + octave * 7 // where pc is the numbers 0 through 6 representing the pitch classes // C through B, the octave is MIDI octave (not the scientific pitch -// octave which is one less than the MIDI ocatave, such as C4 = middle C). +// octave which is one less than the MIDI octave, such as C4 = middle C). // The second number is the accidental for the base-7 pitch. // @@ -1544,8 +1546,8 @@ void MidiMessage::setMetaContent(const std::string& content) { // add the size of the meta message data (VLV) int dsize = (int)content.size(); std::vector vlv = intToVlv(dsize); - for (int i=0; i<(int)vlv.size(); i++) { - this->push_back(vlv[i]); + for (uchar item : vlv) { + this->push_back(item); } std::copy(content.begin(), content.end(), std::back_inserter(*this)); } @@ -1764,6 +1766,61 @@ void MidiMessage::makeController(int channel, int num, int value) { +///////////////////////////// +// +// MidiMessage::makePitchBend -- Create a pitch-bend message. lsb is +// least-significant 7 bits of the 14-bit range, and msb is the +// most-significant 7 bits of the 14-bit range. The range depth +// is determined by a setting in the synthesizer. Typically it is +// +/- two semitones by default. See MidiFile::setPitchBendRange() +// to change the default (or change to the typical default). +// + +void MidiMessage::makePitchBend(int channel, int lsb, int msb) { + resize(0); + push_back(0xe0 | (0x0e & channel)); + push_back(0x7f & lsb); + push_back(0x7f & msb); +} + +// +// value is a 14-bit number, where 0 is the lowest pitch of the range, and +// 2^15-1 is the highest pitch of the range. +// + +void MidiMessage::makePitchBend(int channel, int value) { + resize(0); + int lsb = value & 0x7f; + int msb = (value >> 7) & 0x7f; + push_back(0xe0 | (0x7f & channel)); + push_back(lsb); + push_back(msb); +} + +// +// Input value is a number between -1.0 and +1.0. +// + +void MidiMessage::makePitchBendDouble(int channel, double value) { + // value is in the range from -1 for minimum and 2^18 - 1 for the maximum + resize(0); + double dvalue = (value + 1.0) * (pow(2.0, 15.0)); + if (dvalue < 0.0) { + dvalue = 0.0; + } + if (dvalue > pow(2.0, 15.0) - 1.0) { + dvalue = pow(2.0, 15.0) - 1.0; + } + ulong uivalue = (ulong)dvalue; + uchar lsb = uivalue & 0x7f; + uchar msb = (uivalue >> 7) & 0x7f; + push_back(0xe0 | (0x7f & channel)); + push_back(lsb); + push_back(msb); +} + + + ///////////////////////////// // // MidiMessage::makeSustain -- Create a sustain pedal message. @@ -1999,8 +2056,8 @@ void MidiMessage::makeSysExMessage(const std::vector& data) { int msize = endindex - startindex + 2; std::vector vlv = intToVlv(msize); - for (int i=0; i<(int)vlv.size(); i++) { - this->push_back(vlv[i]); + for (uchar item : vlv) { + this->push_back(item); } for (int i=startindex; i<=endindex; i++) { this->push_back(data.at(i)); @@ -2095,18 +2152,18 @@ void MidiMessage::makeMts2_KeyTuningsBySemitone(std::vector vlv = intToVlv((int)mapping.size()); - for (int i=0; i<(int)vlv.size(); i++) { - data.push_back(vlv[i]); + for (uchar item : vlv) { + data.push_back(item); } - for (int i=0; i<(int)mapping.size(); i++) { - int keynum = mapping[i].first; + for (auto &item : mapping) { + int keynum = item.first; if (keynum < 0) { keynum = 0; } else if (keynum > 127) { keynum = 127; } data.push_back((uchar)keynum); - double semitones = mapping[i].second; + double semitones = item.second; int sint = (int)semitones; if (sint < 0) { sint = 0; @@ -2120,8 +2177,8 @@ void MidiMessage::makeMts2_KeyTuningsBySemitone(std::vector> 7) & 0x7f; data.push_back(msb); data.push_back(lsb); - } - this->makeSysExMessage(data); + } + this->makeSysExMessage(data); } @@ -2204,8 +2261,8 @@ void MidiMessage::makeTemperamentBad(double maxDeviationCents, int referencePitc maxDeviationCents = 100.0; } std::vector temperament(12); - for (int i=0; i<(int)temperament.size(); i++) { - temperament[i] = ((rand() / (double)RAND_MAX) * 2.0 - 1.0) * maxDeviationCents; + for (double &item : temperament) { + item = ((rand() / (double)RAND_MAX) * 2.0 - 1.0) * maxDeviationCents; } this->makeMts9_TemperamentByCentsDeviationFromET(temperament, referencePitchClass, channelMask); } @@ -2294,6 +2351,30 @@ void MidiMessage::makeTemperamentMeantoneCommaHalf(int referencePitchClass, int } + +////////////////////////////// +// +// operator<<(MidiMessage) -- Print MIDI messages as text. 0x80 and above +// are printed as hex, below as dec (will look strange for meta messages +// and system exclusives which could be dealt with later). +// + +std::ostream& operator<<(std::ostream& out, MidiMessage& message) { + for (int i=0; i<(int)message.size(); i++) { + if (message[i] >= 0x80) { + out << "0x" << std::hex << std::setw(2) << std::setfill('0') << (int)message[i]; + out << std::dec << std::setw(0) << std::setfill(' '); + } else { + out << (int)message[i]; + } + if (i<(int)message.size() - 1) { + out << ' '; + } + } + return out; +} + + } // end namespace smf From ed140f4db15d8ecaf87dc4511310ce251f4254d3 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 1 May 2024 08:28:11 +0200 Subject: [PATCH 248/249] Rename io.h/cpp to iobase to avoid conflicts. Closes #3662 --- Verovio.xcodeproj/project.pbxproj | 32 +++++++++++++++---------------- bindings/iOS/all.h | 2 +- include/vrv/ioabc.h | 2 +- include/vrv/{io.h => iobase.h} | 6 +++--- include/vrv/iodarms.h | 2 +- include/vrv/iohumdrum.h | 2 +- include/vrv/iomei.h | 2 +- include/vrv/iomusxml.h | 2 +- include/vrv/iopae.h | 2 +- src/{io.cpp => iobase.cpp} | 4 ++-- src/object.cpp | 2 +- 11 files changed, 29 insertions(+), 29 deletions(-) rename include/vrv/{io.h => iobase.h} (97%) rename src/{io.cpp => iobase.cpp} (95%) diff --git a/Verovio.xcodeproj/project.pbxproj b/Verovio.xcodeproj/project.pbxproj index e2fda8406a0..9d46f1aadd8 100644 --- a/Verovio.xcodeproj/project.pbxproj +++ b/Verovio.xcodeproj/project.pbxproj @@ -103,7 +103,7 @@ 4D1693FF1E3A44F300569BF4 /* durationinterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EBE188539540037FD8E /* durationinterface.cpp */; }; 4D1694001E3A44F300569BF4 /* toolkit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EBF188539540037FD8E /* toolkit.cpp */; }; 4D1694011E3A44F300569BF4 /* MidiEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D1BE7671C688F5A0086DC0E /* MidiEvent.cpp */; }; - 4D1694021E3A44F300569BF4 /* io.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC0188539540037FD8E /* io.cpp */; }; + 4D1694021E3A44F300569BF4 /* iobase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC0188539540037FD8E /* iobase.cpp */; }; 4D1694031E3A44F300569BF4 /* harm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D796B5D1D78641900A15238 /* harm.cpp */; }; 4D1694041E3A44F300569BF4 /* space.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DB3072E1AC9ED2500EE0982 /* space.cpp */; }; 4D1694051E3A44F300569BF4 /* iodarms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC1188539540037FD8E /* iodarms.cpp */; }; @@ -926,7 +926,7 @@ 8F086EE9188539540037FD8E /* doc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EBD188539540037FD8E /* doc.cpp */; }; 8F086EEA188539540037FD8E /* durationinterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EBE188539540037FD8E /* durationinterface.cpp */; }; 8F086EEB188539540037FD8E /* toolkit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EBF188539540037FD8E /* toolkit.cpp */; }; - 8F086EEC188539540037FD8E /* io.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC0188539540037FD8E /* io.cpp */; }; + 8F086EEC188539540037FD8E /* iobase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC0188539540037FD8E /* iobase.cpp */; }; 8F086EED188539540037FD8E /* iodarms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC1188539540037FD8E /* iodarms.cpp */; }; 8F086EEE188539540037FD8E /* iomei.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC2188539540037FD8E /* iomei.cpp */; }; 8F086EEF188539540037FD8E /* iomusxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC3188539540037FD8E /* iomusxml.cpp */; }; @@ -960,7 +960,7 @@ 8F3DD31E18854AFB0051330C /* bboxdevicecontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EB9188539540037FD8E /* bboxdevicecontext.cpp */; }; 8F3DD32018854AFB0051330C /* devicecontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EBC188539540037FD8E /* devicecontext.cpp */; }; 8F3DD32218854AFB0051330C /* svgdevicecontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086ED5188539540037FD8E /* svgdevicecontext.cpp */; }; - 8F3DD32418854B090051330C /* io.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC0188539540037FD8E /* io.cpp */; }; + 8F3DD32418854B090051330C /* iobase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC0188539540037FD8E /* iobase.cpp */; }; 8F3DD32618854B090051330C /* iodarms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC1188539540037FD8E /* iodarms.cpp */; }; 8F3DD32818854B090051330C /* iomei.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC2188539540037FD8E /* iomei.cpp */; }; 8F3DD32A18854B090051330C /* iomusxml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC3188539540037FD8E /* iomusxml.cpp */; }; @@ -1006,7 +1006,7 @@ 8F59293B18854BF800FE51AD /* doc.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F59291418854BF800FE51AD /* doc.h */; }; 8F59293C18854BF800FE51AD /* durationinterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F59291518854BF800FE51AD /* durationinterface.h */; }; 8F59293D18854BF800FE51AD /* toolkit.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F59291618854BF800FE51AD /* toolkit.h */; }; - 8F59293E18854BF800FE51AD /* io.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F59291718854BF800FE51AD /* io.h */; }; + 8F59293E18854BF800FE51AD /* iobase.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F59291718854BF800FE51AD /* iobase.h */; }; 8F59293F18854BF800FE51AD /* iodarms.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F59291818854BF800FE51AD /* iodarms.h */; }; 8F59294018854BF800FE51AD /* iomei.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F59291918854BF800FE51AD /* iomei.h */; }; 8F59294118854BF800FE51AD /* iomusxml.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F59291A18854BF800FE51AD /* iomusxml.h */; }; @@ -1068,8 +1068,8 @@ BB4C4AAA22A932A0001F6AF0 /* devicecontextbase.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D797B041A67C55F007637BD /* devicecontextbase.h */; settings = {ATTRIBUTES = (Public, ); }; }; BB4C4AAB22A932A0001F6AF0 /* svgdevicecontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086ED5188539540037FD8E /* svgdevicecontext.cpp */; }; BB4C4AAC22A932A0001F6AF0 /* svgdevicecontext.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F59292C18854BF800FE51AD /* svgdevicecontext.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BB4C4AAD22A932A6001F6AF0 /* io.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC0188539540037FD8E /* io.cpp */; }; - BB4C4AAE22A932A6001F6AF0 /* io.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F59291718854BF800FE51AD /* io.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BB4C4AAD22A932A6001F6AF0 /* iobase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC0188539540037FD8E /* iobase.cpp */; }; + BB4C4AAE22A932A6001F6AF0 /* iobase.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F59291718854BF800FE51AD /* iobase.h */; settings = {ATTRIBUTES = (Public, ); }; }; BB4C4AAF22A932A6001F6AF0 /* ioabc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 402197931F2E09DA00182DF1 /* ioabc.cpp */; }; BB4C4AB022A932A6001F6AF0 /* ioabc.h in Headers */ = {isa = PBXBuildFile; fileRef = 402197921F2E09CB00182DF1 /* ioabc.h */; settings = {ATTRIBUTES = (Public, ); }; }; BB4C4AB122A932A6001F6AF0 /* iodarms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8F086EC1188539540037FD8E /* iodarms.cpp */; }; @@ -2093,7 +2093,7 @@ 8F086EBD188539540037FD8E /* doc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = doc.cpp; path = src/doc.cpp; sourceTree = ""; }; 8F086EBE188539540037FD8E /* durationinterface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = durationinterface.cpp; path = src/durationinterface.cpp; sourceTree = ""; }; 8F086EBF188539540037FD8E /* toolkit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = toolkit.cpp; path = src/toolkit.cpp; sourceTree = ""; }; - 8F086EC0188539540037FD8E /* io.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = io.cpp; path = src/io.cpp; sourceTree = ""; }; + 8F086EC0188539540037FD8E /* iobase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = iobase.cpp; path = src/iobase.cpp; sourceTree = ""; }; 8F086EC1188539540037FD8E /* iodarms.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = iodarms.cpp; path = src/iodarms.cpp; sourceTree = ""; }; 8F086EC2188539540037FD8E /* iomei.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; name = iomei.cpp; path = src/iomei.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; 8F086EC3188539540037FD8E /* iomusxml.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = iomusxml.cpp; path = src/iomusxml.cpp; sourceTree = ""; }; @@ -2134,7 +2134,7 @@ 8F59291418854BF800FE51AD /* doc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = doc.h; path = include/vrv/doc.h; sourceTree = ""; }; 8F59291518854BF800FE51AD /* durationinterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = durationinterface.h; path = include/vrv/durationinterface.h; sourceTree = ""; }; 8F59291618854BF800FE51AD /* toolkit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = toolkit.h; path = include/vrv/toolkit.h; sourceTree = ""; }; - 8F59291718854BF800FE51AD /* io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = io.h; path = include/vrv/io.h; sourceTree = ""; }; + 8F59291718854BF800FE51AD /* iobase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iobase.h; path = include/vrv/iobase.h; sourceTree = ""; }; 8F59291818854BF800FE51AD /* iodarms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iodarms.h; path = include/vrv/iodarms.h; sourceTree = ""; }; 8F59291918854BF800FE51AD /* iomei.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = iomei.h; path = include/vrv/iomei.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 8F59291A18854BF800FE51AD /* iomusxml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iomusxml.h; path = include/vrv/iomusxml.h; sourceTree = ""; }; @@ -2833,8 +2833,8 @@ 8F086F37188539C50037FD8E /* io */ = { isa = PBXGroup; children = ( - 8F086EC0188539540037FD8E /* io.cpp */, - 8F59291718854BF800FE51AD /* io.h */, + 8F086EC0188539540037FD8E /* iobase.cpp */, + 8F59291718854BF800FE51AD /* iobase.h */, 402197931F2E09DA00182DF1 /* ioabc.cpp */, 402197921F2E09CB00182DF1 /* ioabc.h */, 8F086EC1188539540037FD8E /* iodarms.cpp */, @@ -3194,7 +3194,7 @@ 4DEC4DD621C8295700D1D273 /* del.h in Headers */, 4DB726C81B8BB0F30040231B /* text.h in Headers */, 4D308101203DB69D00BC44F6 /* ref.h in Headers */, - 8F59293E18854BF800FE51AD /* io.h in Headers */, + 8F59293E18854BF800FE51AD /* iobase.h in Headers */, 4DF092A22497706600239195 /* phrase.h in Headers */, 8F59293F18854BF800FE51AD /* iodarms.h in Headers */, 4DDBBB571C7AE43E00054AFF /* hairpin.h in Headers */, @@ -3442,7 +3442,7 @@ 4DACC9E92990F29A00B55913 /* atts_fingering.h in Headers */, BB4C4A9422A9328F001F6AF0 /* doc.h in Headers */, BB4C4A9922A9328F001F6AF0 /* horizontalaligner.h in Headers */, - BB4C4AAE22A932A6001F6AF0 /* io.h in Headers */, + BB4C4AAE22A932A6001F6AF0 /* iobase.h in Headers */, BB4C4BAA22A932EB001F6AF0 /* view.h in Headers */, 4DACC9DD2990F29A00B55913 /* atts_header.h in Headers */, BB4C4BC422A9330D001F6AF0 /* pugixml.hpp in Headers */, @@ -3920,7 +3920,7 @@ E722106828F85981002CD6E9 /* findlayerelementsfunctor.cpp in Sources */, 4D1694011E3A44F300569BF4 /* MidiEvent.cpp in Sources */, 4DA0EAEF22BB77C300A7EBEB /* editortoolkit_cmn.cpp in Sources */, - 4D1694021E3A44F300569BF4 /* io.cpp in Sources */, + 4D1694021E3A44F300569BF4 /* iobase.cpp in Sources */, 4D1694031E3A44F300569BF4 /* harm.cpp in Sources */, 4D79641926C1522B0026288B /* pageelement.cpp in Sources */, 4DB3D8DE1F83D15200B5FC2B /* btrem.cpp in Sources */, @@ -4214,7 +4214,7 @@ 4D1BE76D1C688F5A0086DC0E /* MidiEvent.cpp in Sources */, E75EA9FD29CC3A88003A97A7 /* calcarticfunctor.cpp in Sources */, 35FDEBD124B6DC5B00AC1696 /* fing.cpp in Sources */, - 8F086EEC188539540037FD8E /* io.cpp in Sources */, + 8F086EEC188539540037FD8E /* iobase.cpp in Sources */, E75A69A029CCF8A200414819 /* adjustbeamsfunctor.cpp in Sources */, 4DACC9762990F29A00B55913 /* atts_neumes.cpp in Sources */, 4D796B5E1D78641900A15238 /* harm.cpp in Sources */, @@ -4638,7 +4638,7 @@ E7E9C11729B0A20400CFCE2F /* adjustaccidxfunctor.cpp in Sources */, 8F3DD33818854B250051330C /* system.cpp in Sources */, 4D72A5E1208A37F0009DEC1E /* mnum.cpp in Sources */, - 8F3DD32418854B090051330C /* io.cpp in Sources */, + 8F3DD32418854B090051330C /* iobase.cpp in Sources */, 4DACC9D62990F29A00B55913 /* atts_pagebased.cpp in Sources */, 4DA0EACD22BB779400A7EBEB /* zone.cpp in Sources */, 4DEC4DBC21C8288900D1D273 /* choice.cpp in Sources */, @@ -4791,7 +4791,7 @@ BB4C4A9322A9328F001F6AF0 /* doc.cpp in Sources */, 4D8135212322C41800F59C01 /* keyaccid.cpp in Sources */, BB4C4B9922A932E5001F6AF0 /* linkinginterface.cpp in Sources */, - BB4C4AAD22A932A6001F6AF0 /* io.cpp in Sources */, + BB4C4AAD22A932A6001F6AF0 /* iobase.cpp in Sources */, E74A806A28BC9843005274E7 /* functorinterface.cpp in Sources */, 4DD7C0FD27A55CEA00B9C017 /* timemap.cpp in Sources */, E78833632994EC7E00D44B01 /* calcchordnoteheadsfunctor.cpp in Sources */, diff --git a/bindings/iOS/all.h b/bindings/iOS/all.h index 0a5dbb6b62d..d99cbd442f9 100644 --- a/bindings/iOS/all.h +++ b/bindings/iOS/all.h @@ -121,7 +121,7 @@ #import #import #import -#import +#import #import #import #import diff --git a/include/vrv/ioabc.h b/include/vrv/ioabc.h index 4e830c11bba..f29892b0549 100644 --- a/include/vrv/ioabc.h +++ b/include/vrv/ioabc.h @@ -13,7 +13,7 @@ //---------------------------------------------------------------------------- -#include "io.h" +#include "iobase.h" #include "pugixml.hpp" #include "vrvdef.h" diff --git a/include/vrv/io.h b/include/vrv/iobase.h similarity index 97% rename from include/vrv/io.h rename to include/vrv/iobase.h index f07c2bf1448..e5cfc903acc 100644 --- a/include/vrv/io.h +++ b/include/vrv/iobase.h @@ -1,12 +1,12 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: io.h +// Name: iobase.h // Author: Laurent Pugin // Created: 2012 // Copyright (c) Authors and others. All rights reserved. ///////////////////////////////////////////////////////////////////////////// -#ifndef __VRV_IO_H__ -#define __VRV_IO_H__ +#ifndef __VRV_IOBASE_H__ +#define __VRV_IOBASE_H__ #include #include diff --git a/include/vrv/iodarms.h b/include/vrv/iodarms.h index ad3ad31820a..bd1f4bb8d56 100644 --- a/include/vrv/iodarms.h +++ b/include/vrv/iodarms.h @@ -11,7 +11,7 @@ //---------------------------------------------------------------------------- #include "attdef.h" -#include "io.h" +#include "iobase.h" namespace vrv { diff --git a/include/vrv/iohumdrum.h b/include/vrv/iohumdrum.h index f5ac61083e2..8a1cccb114d 100644 --- a/include/vrv/iohumdrum.h +++ b/include/vrv/iohumdrum.h @@ -25,7 +25,7 @@ #include "fing.h" #include "ftrem.h" #include "harm.h" -#include "io.h" +#include "iobase.h" #include "keysig.h" #include "label.h" #include "metersig.h" diff --git a/include/vrv/iomei.h b/include/vrv/iomei.h index 6b0d7800119..12f530bdacf 100644 --- a/include/vrv/iomei.h +++ b/include/vrv/iomei.h @@ -14,7 +14,7 @@ //---------------------------------------------------------------------------- #include "doc.h" -#include "io.h" +#include "iobase.h" //---------------------------------------------------------------------------- diff --git a/include/vrv/iomusxml.h b/include/vrv/iomusxml.h index 2d6decc245c..946f0d95b74 100644 --- a/include/vrv/iomusxml.h +++ b/include/vrv/iomusxml.h @@ -17,7 +17,7 @@ //---------------------------------------------------------------------------- #include "attdef.h" -#include "io.h" +#include "iobase.h" #include "metersig.h" #include "vrvdef.h" diff --git a/include/vrv/iopae.h b/include/vrv/iopae.h index 77313365e15..b02f0620adc 100644 --- a/include/vrv/iopae.h +++ b/include/vrv/iopae.h @@ -27,7 +27,7 @@ #include "atts_cmn.h" #include "clef.h" -#include "io.h" +#include "iobase.h" #include "keysig.h" #include "mensur.h" #include "metersig.h" diff --git a/src/io.cpp b/src/iobase.cpp similarity index 95% rename from src/io.cpp rename to src/iobase.cpp index 87c27c38159..3071a1c5599 100644 --- a/src/io.cpp +++ b/src/iobase.cpp @@ -1,11 +1,11 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: io.cpp +// Name: iobase.cpp // Author: Laurent Pugin // Created: 2012 // Copyright (c) Laurent Pugin. All rights reserved. ///////////////////////////////////////////////////////////////////////////// -#include "io.h" +#include "iobase.h" //---------------------------------------------------------------------------- diff --git a/src/object.cpp b/src/object.cpp index 086e4589db2..d23e54181bf 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -28,7 +28,7 @@ #include "editorial.h" #include "featureextractor.h" #include "findfunctor.h" -#include "io.h" +#include "iobase.h" #include "keysig.h" #include "layer.h" #include "linkinginterface.h" From a83cf81fad785c5c18b740935359b9dab9315509 Mon Sep 17 00:00:00 2001 From: Laurent Pugin Date: Wed, 1 May 2024 12:34:16 +0200 Subject: [PATCH 249/249] Update xcode versions --- .github/workflows/ci_build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_build.yml b/.github/workflows/ci_build.yml index f6bbe77946c..ca515fa61ad 100644 --- a/.github/workflows/ci_build.yml +++ b/.github/workflows/ci_build.yml @@ -100,11 +100,11 @@ jobs: - os: macos-latest compiler: xcode - version: "13.1" + version: "14.3" - os: macos-latest compiler: xcode - version: "14.2" + version: "15.3" - os: macos-11 compiler: g++