LCOV - code coverage report
Current view: top level - src/importexport/mei/internal - meiconverter.h Coverage Total Hit
Test: filtered_coverage.info Lines: 100.0 % 4 4
Test Date: 2026-11-05 04:07:02

            Line data    Source code
       1              : /*
       2              :  * SPDX-License-Identifier: GPL-3.0-only
       3              :  * MuseScore-Studio-CLA-applies
       4              :  *
       5              :  * MuseScore Studio
       6              :  * Music Composition & Notation
       7              :  *
       8              :  * Copyright (C) 2021 MuseScore Limited and others
       9              :  *
      10              :  * This program is free software: you can redistribute it and/or modify
      11              :  * it under the terms of the GNU General Public License version 3 as
      12              :  * published by the Free Software Foundation.
      13              :  *
      14              :  * This program is distributed in the hope that it will be useful,
      15              :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      16              :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      17              :  * GNU General Public License for more details.
      18              :  *
      19              :  * You should have received a copy of the GNU General Public License
      20              :  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
      21              :  */
      22              : 
      23              : #pragma once
      24              : 
      25              : #include "engraving/dom/articulation.h"
      26              : #include "engraving/dom/accidental.h"
      27              : #include "engraving/dom/chordline.h"
      28              : #include "engraving/dom/harppedaldiagram.h"
      29              : #include "engraving/dom/interval.h"
      30              : #include "engraving/dom/timesig.h"
      31              : #include "engraving/dom/tremolotwochord.h"
      32              : #include "engraving/dom/tremolosinglechord.h"
      33              : #include "engraving/dom/volta.h"
      34              : 
      35              : #include "thirdparty/libmei/cmn.h"
      36              : #include "thirdparty/libmei/cmnornaments.h"
      37              : #include "thirdparty/libmei/fingering.h"
      38              : #include "thirdparty/libmei/harmony.h"
      39              : #include "thirdparty/libmei/shared.h"
      40              : 
      41              : namespace mu::iex::mei {
      42              : enum TextCell {
      43              :     TopLeft = 0,
      44              :     TopCenter,
      45              :     TopRight,
      46              :     MiddleLeft,
      47              :     MiddleCenter,
      48              :     MiddleRight,
      49              :     BottomLeft,
      50              :     BottomCenter,
      51              :     BottomRight,
      52              :     CellCount
      53              : };
      54              : 
      55              : enum ElisionType {
      56              :     ElisionNone = 0,
      57              :     ElisionFirst,
      58              :     ElisionMiddle,
      59              :     ElisionLast
      60              : };
      61              : 
      62              : // SMuFL in @glyph.auth
      63              : #define SMUFL_AUTH "smufl"
      64              : 
      65              : // The @type attribute for <pb> and <sb>
      66              : #define BREAK_TYPE "mscore-manual"
      67              : // The @type attribute prefix for indicating beam in <chord>, <note> or <rest>
      68              : #define BEAM_ELEMENT_TYPE "mscore-beam"
      69              : // The @type attribute prefix for expression and playtechannotation type in <dir>
      70              : #define DIR_TYPE "mscore-"
      71              : // The @type attribute prefix for volta repeat ending in <ending>
      72              : #define ENDING_REPEAT_TYPE "mscore-ending-"
      73              : // The @type attribute prefix for harmony type in <harm>
      74              : #define HARMONY_TYPE "mscore-"
      75              : // The @type attribute prefix for jump type in <repeatMark>
      76              : #define JUMP_TYPE "mscore-jump-"
      77              : // The @type attribute prefix for measure repeat count in <measure>
      78              : #define MEASURE_REPEAT_TYPE "mscore-repeat-"
      79              : // The @type attribute prefix for marker type in <repeatMark>
      80              : #define MARKER_TYPE "mscore-marker-"
      81              : // The @type attribute prefix for tempo inferring type in <tempo>
      82              : #define TEMPO_INFER_FROM_TEXT "mscore-infer-from-text"
      83              : // The @type attribute prefix for chordline type in <artic>
      84              : #define CHORDLINE_TYPE "mscore-"
      85              : // The @type attribute prefixes for ornament interval (above/below)
      86              : #define INTERVAL_ABOVE "mscore-above-"
      87              : #define INTERVAL_BELOW "mscore-below-"
      88              : 
      89              : class Convert
      90              : {
      91              :     // The fallback font is used to convert smufl codes (char32_t) to engraving::SymId
      92              :     static muse::GlobalInject<engraving::IEngravingFontsProvider> engravingFonts;
      93              :     static muse::GlobalInject<engraving::IEngravingConfiguration> engravingConfiguration;
      94              : public:
      95              : 
      96              :     /**
      97              :      * Structures for methods needing to return a group of variables
      98              :      */
      99              : 
     100              :     struct BracketStruct {
     101              :         engraving::BracketType bracketType = engraving::BracketType::NO_BRACKET;
     102              :         int barLineSpan = 0;
     103              :     };
     104              : 
     105              :     struct MeasureStruct {
     106              :         bool irregular = false;
     107              :         int n = 0;
     108              :         bool repeatStart = false;
     109              :         engraving::BarLineType endBarLineType = engraving::BarLineType::NORMAL;
     110              :         bool repeatEnd = false;
     111              :         int repeatCount = 0;
     112              :     };
     113              : 
     114              :     struct OrnamStruct {
     115              :         engraving::AccidentalType accidTypeAbove = engraving::AccidentalType::NONE;
     116              :         engraving::AccidentalType accidTypeBelow = engraving::AccidentalType::NONE;
     117              :     };
     118              : 
     119              :     struct StaffStruct {
     120              :         int lines;
     121              :         bool invisible;
     122              :         double scale;
     123              :         engraving::Color color;
     124              :         engraving::Interval interval;
     125              :     };
     126              : 
     127              :     struct PitchStruct {
     128              :         int pitch = 0;
     129              :         int tpc2 = 0;
     130              :         engraving::AccidentalType accidType = engraving::AccidentalType::NONE;
     131              :         engraving::AccidentalBracket accidBracket = engraving::AccidentalBracket::NONE;
     132              :         engraving::AccidentalRole accidRole = engraving::AccidentalRole::AUTO;
     133              :     };
     134              : 
     135              :     /**
     136              :      * Methods for checking which element to create depending on some attribute values of the MuseScore or MEI element
     137              :      */
     138              :     static engraving::ElementType elementTypeForDir(const libmei::Element& meiElement);
     139              :     static engraving::ElementType elementTypeForDirWithExt(const libmei::Element& meiElement);
     140              :     static engraving::ElementType elementTypeFor(const libmei::RepeatMark& meiRepeatMark);
     141              :     static bool isDirWithExt(const libmei::Dir& meiDir);
     142              :     static bool isMordent(const engraving::Ornament* ornament);
     143              :     static bool isTrill(const engraving::Ornament* ornament);
     144              :     static bool isTurn(const engraving::Ornament* ornament);
     145              : 
     146              :     /**
     147              :      * Methods for converting from and to MEI
     148              :      */
     149              : 
     150              :     static engraving::AccidentalType accidFromMEI(const libmei::data_ACCIDENTAL_WRITTEN meiAccid, bool& warning);
     151              :     static libmei::data_ACCIDENTAL_WRITTEN accidToMEI(const engraving::AccidentalType accid);
     152              : 
     153              :     static engraving::AccidentalVal accidGesFromMEI(const libmei::data_ACCIDENTAL_GESTURAL meiAccid, bool& warning);
     154              :     static libmei::data_ACCIDENTAL_GESTURAL accidGesToMEI(const engraving::AccidentalVal accid);
     155              : 
     156              :     static engraving::ArticulationAnchor anchorFromMEI(const libmei::data_STAFFREL meiPlace, bool& warning);
     157              :     static libmei::data_STAFFREL anchorToMEI(engraving::ArticulationAnchor anchor);
     158              : 
     159              :     static void arpegFromMEI(engraving::Arpeggio* arpeggio, const libmei::Arpeg& meiArpeg, bool& warning);
     160              :     static libmei::Arpeg arpegToMEI(const engraving::Arpeggio* arpeggio);
     161              : 
     162              :     static void articFromMEI(engraving::Articulation* articulation, const libmei::Artic& meiArtic, bool& warning);
     163              :     static void articFromMEI(engraving::ChordLine* chordline, const libmei::Artic& meiArtic, bool& warning);
     164              :     static libmei::Artic articToMEI(const engraving::Articulation* articulation);
     165              :     static libmei::Artic articToMEI(const engraving::ChordLine* chordline);
     166              : 
     167              :     static engraving::BarLineType barlineFromMEI(const libmei::data_BARRENDITION meiBarline, bool& warning);
     168              :     static libmei::data_BARRENDITION barlineToMEI(engraving::BarLineType barline);
     169              : 
     170              :     static engraving::BeamMode beamFromMEI(const std::string& typeAtt, const std::string& prefix, bool& warning);
     171              :     static std::string beamToMEI(engraving::BeamMode beamMode, const std::string& prefix);
     172              : 
     173              :     static engraving::BeamMode breaksecFromMEI(int breaksec, bool& warning);
     174              :     static int breaksecToMEI(engraving::BeamMode beamMode);
     175              : 
     176              :     static void breathFromMEI(engraving::Breath* breath, const libmei::Breath& meiBreath, bool& warning);
     177              :     static libmei::Breath breathToMEI(const engraving::Breath* breath);
     178              : 
     179              :     static void caesuraFromMEI(engraving::Breath* breath, const libmei::Caesura& meiCeasura, bool& warning);
     180              :     static libmei::Caesura caesuraToMEI(const engraving::Breath* breath);
     181              : 
     182              :     static engraving::ClefType clefFromMEI(const libmei::Clef& meiClef, bool& warning);
     183              :     static libmei::Clef clefToMEI(engraving::ClefType clef);
     184              : 
     185              :     static engraving::ClefType clefFromMEI(const libmei::StaffDef& meiStaffDef, bool& warning);
     186              : 
     187              :     static void colorFromMEI(engraving::EngravingItem* item, const libmei::Element& meiElement);
     188              :     static void colorToMEI(const engraving::EngravingItem* item, libmei::Element& meiElement);
     189              : 
     190              :     static void colorlineFromMEI(engraving::SLine* line, const libmei::Element& meiElement);
     191              :     static void colorlineToMEI(const engraving::SLine* line, libmei::Element& meiElement);
     192              : 
     193              :     static void dirFromMEI(engraving::TextBase* textBase, const muse::StringList& meiLines, const libmei::Dir& meiDir, bool& warning);
     194              :     static void dirFromMEI(engraving::TextLineBase* textLineBase, const muse::StringList& meiLines, const libmei::Dir& meiDir,
     195              :                            bool& warning);
     196              :     static libmei::Dir dirToMEI(const engraving::TextBase* textBase, muse::StringList& meiLines);
     197              :     static libmei::Dir dirToMEI(const engraving::TextLineBase* textLineBase, muse::StringList& meiLines);
     198              : 
     199              :     static engraving::DirectionV curvedirFromMEI(const libmei::curvature_CURVEDIR meiCurvedir, bool& warning);
     200              :     static libmei::curvature_CURVEDIR curvedirToMEI(engraving::DirectionV curvedir);
     201              : 
     202              :     static engraving::DurationType durFromMEI(const libmei::data_DURATION meiDuration, bool& warning);
     203              :     static libmei::data_DURATION durToMEI(const engraving::DurationType duration);
     204              : 
     205              :     static engraving::TremoloType unitdurFromMEI(const libmei::FTrem& meiFTrem, bool& warning);
     206              :     static libmei::data_DURATION unitdurToMEI(const engraving::TremoloTwoChord* tremolo);
     207              : 
     208              :     static void dynamFromMEI(engraving::Dynamic* dynamic, const muse::StringList& meiLines, const libmei::Dynam& meiDynam, bool& warning);
     209              :     static libmei::Dynam dynamToMEI(const engraving::Dynamic* dynamic, muse::StringList& meiLines);
     210              : 
     211              :     static void endingFromMEI(engraving::Volta* volta, const libmei::Ending& meiEnding, bool& warning);
     212              :     static libmei::Ending endingToMEI(const engraving::Volta* volta);
     213              : 
     214              :     static void fFromMEI(engraving::FiguredBassItem* figuredBassItem, const muse::StringList& meiLines, const libmei::F& meiF,
     215              :                          bool& warning);
     216              :     static libmei::F fToMEI(const engraving::FiguredBassItem* figuredBassItem, muse::StringList& meiLines);
     217              : 
     218              :     static void fbFromMEI(engraving::FiguredBass* figuredBass, const libmei::Harm& meiHarm, const libmei::Fb& meiFb, bool& warning);
     219              :     static std::pair<libmei::Harm, libmei::Fb> fbToMEI(const engraving::FiguredBass* figuredBass);
     220              : 
     221              :     static void fermataFromMEI(engraving::Fermata* fermata, const libmei::Fermata& meiFermata, bool& warning);
     222              :     static libmei::Fermata fermataToMEI(const engraving::Fermata* fermata);
     223              : 
     224              :     static void fingFromMEI(engraving::Fingering* fing, const muse::StringList& meiLines, const libmei::Fing& meiFing, bool& warning);
     225              :     static libmei::Fing fingToMEI(const engraving::Fingering* fing, muse::StringList& meiLines);
     226              : 
     227              :     static void glissFromMEI(engraving::Glissando* gliss, const libmei::Gliss& meiGliss, bool& warning);
     228              :     static libmei::Gliss glissToMEI(const engraving::Glissando* gliss);
     229              : 
     230              :     static std::pair<bool, engraving::NoteType> gracegrpFromMEI(const libmei::graceGrpLog_ATTACH meiAttach,
     231              :                                                                 const libmei::data_GRACE meiGrace, bool& warning);
     232              :     static std::pair<libmei::graceGrpLog_ATTACH, libmei::data_GRACE> gracegrpToMEI(bool isAfter, engraving::NoteType noteType);
     233              : 
     234              :     static void hairpinFromMEI(engraving::Hairpin* haipin, const libmei::Hairpin& meiHairpin, bool& warning);
     235              :     static libmei::Hairpin hairpinToMEI(const engraving::Hairpin* hairpin);
     236              : 
     237              :     static void harmFromMEI(engraving::Harmony* harmony, const muse::StringList& meiLines, const libmei::Harm& meiHarm, bool& warning);
     238              :     static libmei::Harm harmToMEI(const engraving::Harmony* harmony, muse::StringList& meiLines);
     239              : 
     240              :     static void harpPedalFromMEI(engraving::HarpPedalDiagram* harpPedalDiagram, const libmei::HarpPedal& meiHarpPedal, bool& warning);
     241              :     static libmei::HarpPedal harpPedalToMEI(const engraving::HarpPedalDiagram* harpPedalDiagram);
     242              : 
     243              :     static engraving::PedalPosition harpPedalPositionFromMEI(const libmei::data_HARPPEDALPOSITION& pedalPosition);
     244              :     static libmei::data_HARPPEDALPOSITION harpPedalPositionToMEI(const engraving::PedalPosition& pedalPosition);
     245              : 
     246              :     static void layerIdentFromMEI(engraving::EngravingItem* item, const libmei::Element& meiElement);
     247              :     static void layerIdentToMEI(const engraving::EngravingItem* item, libmei::Element& meiElement);
     248              : 
     249              :     static void lvFromMEI(engraving::LaissezVib* lv, const libmei::Lv& meiLv, bool& warning);
     250              : 
     251              :     static void jumpFromMEI(engraving::Jump* jump, const libmei::RepeatMark& meiRepeatMark, bool& warning);
     252              :     static libmei::RepeatMark jumpToMEI(const engraving::Jump* jump, muse::String& text);
     253              : 
     254              :     static engraving::Key keyFromMEI(const libmei::data_KEYSIGNATURE& meiKeysig, bool& warning);
     255              :     static libmei::data_KEYSIGNATURE keyToMEI(const engraving::Key key);
     256              : 
     257              :     static engraving::LineType lineFromMEI(const libmei::data_LINEFORM meiLine, bool& warning);
     258              :     static libmei::data_LINEFORM lineToMEI(engraving::LineType line);
     259              : 
     260              :     static void markerFromMEI(engraving::Marker* marker, const libmei::RepeatMark& meiRepeatMark, bool& warning);
     261              :     static libmei::RepeatMark markerToMEI(const engraving::Marker* marker, muse::String& text);
     262              : 
     263              :     static MeasureStruct measureFromMEI(const libmei::Measure& meiMeasure, bool& warning);
     264              :     static libmei::Measure measureToMEI(const engraving::Measure* measure, int& measureN, bool& isLastExcludedFromNumbering);
     265              : 
     266              :     static std::pair<engraving::Fraction, engraving::TimeSigType> meterFromMEI(const libmei::ScoreDef& meiScoreDef, bool& warning);
     267              :     static std::pair<engraving::Fraction, engraving::TimeSigType> meterFromMEI(const libmei::StaffDef& meiStaffDef, bool& warning);
     268              :     static libmei::StaffDef meterToMEI(const engraving::Fraction& fraction, engraving::TimeSigType tsType);
     269              : 
     270              :     static OrnamStruct mordentFromMEI(engraving::Ornament* ornament, const libmei::Mordent& meiMordent, bool& warning);
     271              :     static libmei::Mordent mordentToMEI(const engraving::Ornament* ornament);
     272              : 
     273              :     static void octaveFromMEI(engraving::Ottava* ottava, const libmei::Octave& meiOctave, bool& warning);
     274              :     static libmei::Octave octaveToMEI(const engraving::Ottava* ottava);
     275              : 
     276              :     static OrnamStruct ornamFromMEI(engraving::Ornament* ornament, const libmei::Element& meiElement, bool& warning);
     277              :     static libmei::Ornam ornamToMEI(const engraving::Ornament* ornament);
     278              :     static void ornamToMEI(const engraving::Ornament* ornament, libmei::Element& meiElement);
     279              : 
     280              :     static void ornamintervaleFromMEI(engraving::Ornament* ornament, const std::string& meiType);
     281              :     static muse::String ornamintervalToMEI(const engraving::Ornament* ornament);
     282              : 
     283              :     static void pedalFromMEI(engraving::Pedal* pedal, const libmei::Pedal& meiPedal, bool& warning);
     284              :     static libmei::Pedal pedalToMEI(const engraving::Pedal* pedal);
     285              : 
     286              :     static PitchStruct pitchFromMEI(const libmei::Note& meiNote, const libmei::Accid& meiAccid, const engraving::Interval& interval,
     287              :                                     bool& warning);
     288              :     static std::pair<libmei::Note, libmei::Accid> pitchToMEI(const engraving::Note* note, const engraving::Accidental* accid,
     289              :                                                              const engraving::Interval& interval);
     290              : 
     291              :     static engraving::PlacementV placeFromMEI(const libmei::data_STAFFREL meiPlace, bool& warning);
     292              :     static libmei::data_STAFFREL placeToMEI(engraving::PlacementV place);
     293              : 
     294              :     static engraving::DirectionV directionFromMEI(const libmei::data_STAFFREL meiPlace);
     295              :     static libmei::data_STAFFREL directionToMEI(engraving::DirectionV direction);
     296              : 
     297              :     static void slurFromMEI(engraving::SlurTie* slur, const libmei::Slur& meiSlur, bool& warning);
     298              :     static libmei::Slur slurToMEI(const engraving::SlurTie* slur);
     299              : 
     300              :     static engraving::SlurStyleType slurstyleFromMEI(const libmei::data_LINEFORM meiLine, bool& warning);
     301              :     static libmei::data_LINEFORM slurstyleToMEI(engraving::SlurStyleType slurstyle);
     302              : 
     303              :     static StaffStruct staffFromMEI(const libmei::StaffDef& meiStaffDef, bool& warning);
     304              :     static libmei::StaffDef staffToMEI(const engraving::Staff* staff);
     305              : 
     306              :     static BracketStruct staffGrpFromMEI(const libmei::StaffGrp& meiStaffGrp);
     307              :     static libmei::StaffGrp staffGrpToMEI(const engraving::BracketType, bool barLineSpan);
     308              : 
     309              :     static void staffIdentToMEI(const engraving::EngravingItem* item, libmei::Element& meiElement);
     310              : 
     311              :     static std::pair<engraving::DirectionV, bool> stemFromMEI(const libmei::AttStems& meiStemsAtt, bool& warning);
     312              :     static std::pair<libmei::data_STEMDIRECTION, double> stemToMEI(const engraving::DirectionV direction, bool noStem);
     313              : 
     314              :     static engraving::TremoloType stemModFromMEI(const libmei::data_STEMMODIFIER meiStemMod);
     315              :     static libmei::data_STEMMODIFIER stemModToMEI(const engraving::TremoloSingleChord* tremolo);
     316              : 
     317              :     static void sylFromMEI(engraving::Lyrics* lyrics, const libmei::Syl& meiSyl, ElisionType elision, bool& warning);
     318              :     static libmei::Syl sylToMEI(const engraving::Lyrics* lyrics, ElisionType elision);
     319              : 
     320              :     static engraving::BracketType symbolFromMEI(const libmei::staffGroupingSym_SYMBOL meiGrpSym);
     321              :     static libmei::staffGroupingSym_SYMBOL symbolToMEI(const engraving::BracketType bracket);
     322              : 
     323              :     static void tempoFromMEI(engraving::TempoText* tempo, const muse::StringList& meiLines, const libmei::Tempo& meiTempo, bool& warning);
     324              :     static libmei::Tempo tempoToMEI(const engraving::TempoText* tempoText, muse::StringList& meiLines);
     325              : 
     326              :     static engraving::TextStyleType textFromMEI(const libmei::Rend& meiRend, bool& warning);
     327              :     static std::tuple<libmei::Rend, TextCell, muse::String> textToMEI(const engraving::Text* text);
     328              : 
     329              :     using textWithSmufl = std::vector<std::pair<bool, muse::String> >;
     330              : 
     331              :     static void textFromMEI(muse::String& text, const textWithSmufl& textBlocks);
     332              :     static void textToMEI(textWithSmufl& textBlocks, const muse::String& text);
     333              : 
     334              :     static void tieFromMEI(engraving::SlurTie* tie, const libmei::Tie& meiTie, bool& warning);
     335              :     static libmei::Tie tieToMEI(const engraving::SlurTie* tie);
     336              : 
     337              :     static OrnamStruct trillFromMEI(engraving::Ornament* ornament, const libmei::Trill& meiTrill, bool& warning);
     338              :     static libmei::Trill trillToMEI(const engraving::Ornament* ornament);
     339              : 
     340              :     static void tupletFromMEI(engraving::Tuplet* tuplet, const libmei::Tuplet& meiTuplet, bool& warning);
     341              :     static libmei::Tuplet tupletToMEI(const engraving::Tuplet* tuplet);
     342              : 
     343              :     static OrnamStruct turnFromMEI(engraving::Ornament* ornament, const libmei::Turn& meiTurn, bool& warning);
     344              :     static libmei::Turn turnToMEI(const engraving::Ornament* ornament);
     345              : 
     346              :     /**
     347              :      * Helper methods
     348              :      */
     349              :     static bool hasTypeValue(const std::string& typeStr, const std::string& value);
     350              :     static bool getTypeValueWithPrefix(const std::string& typeStr, const std::string& prefix, std::string& value);
     351              :     static std::list<std::string> getTypeValuesWithPrefix(const std::string& typeStr, const std::string& prefix);
     352              :     static double tstampFromFraction(const engraving::Fraction& fraction, const engraving::Fraction& timesig);
     353              :     static engraving::Fraction tstampToFraction(double tstamp, const engraving::Fraction& timesig);
     354              : 
     355              :     static muse::StringList logs;
     356              : 
     357              : private:
     358              :     static inline std::map<engraving::MarkerType, std::string> s_markerTypes = {
     359              :         { engraving::MarkerType::VARSEGNO, "segno-variation" },
     360              :         { engraving::MarkerType::VARCODA, "varied-coda" },
     361              :         { engraving::MarkerType::TOCODA, "to-coda" },
     362              :         { engraving::MarkerType::TOCODASYM, "to-coda-symbol" },
     363              :         { engraving::MarkerType::DA_CODA, "da-coda" },
     364              :         { engraving::MarkerType::DA_DBLCODA, "da-double-coda" }
     365              :     };
     366              : 
     367              :     static inline std::map<engraving::JumpType, std::string> s_jumpTypes = {
     368              :         { engraving::JumpType::DC_AL_FINE, "dc-al-fine" },
     369              :         { engraving::JumpType::DC_AL_CODA, "dc-al-coda" },
     370              :         { engraving::JumpType::DS_AL_CODA, "ds-al-coda" },
     371              :         { engraving::JumpType::DS_AL_FINE, "ds-al-fine" },
     372              :         { engraving::JumpType::DC_AL_DBLCODA, "dc-al-double-coda" },
     373              :         { engraving::JumpType::DS_AL_DBLCODA, "ds-al-double-coda" },
     374              :         { engraving::JumpType::DSS, "dal-segno-segno" },
     375              :         { engraving::JumpType::DSS_AL_CODA, "dss-al-coda" },
     376              :         { engraving::JumpType::DSS_AL_DBLCODA, "dss-al-double-coda" },
     377              :         { engraving::JumpType::DSS_AL_FINE, "dss-al-fine" }
     378              :     };
     379              : 
     380              :     /** Since MuseScore uses composed glyph - see EngravingFont::loadComposedGlyphs */
     381              :     static inline std::map<engraving::SymId, std::string> s_mordentGlyphs = {
     382              :         { engraving::SymId::ornamentPrallMordent, "ornamentPrecompTrillWithMordent" },
     383              :         { engraving::SymId::ornamentUpPrall, "ornamentPrecompSlideTrillDAnglebert" },
     384              :         { engraving::SymId::ornamentUpMordent, "ornamentPrecompSlideTrillBach" },
     385              :         { engraving::SymId::ornamentPrallDown, "ornamentPrecompTrillLowerSuffix" },
     386              :         { engraving::SymId::ornamentDownMordent, "ornamentPrecompTurnTrillBach" },
     387              :         { engraving::SymId::ornamentPrallUp, "ornamentPrecompTrillSuffixDandrieu" },
     388              :         { engraving::SymId::ornamentLinePrall, "ornamentPrecompAppoggTrill" },
     389              :         { engraving::SymId::ornamentPrecompSlide, "ornamentSchleifer" }
     390              :     };
     391              : };
     392              : 
     393              : /**
     394              :  * A class with a static instance for registering MEI xml:ids.
     395              :  * When objects are created from the MeiImporter the mapping is registered there.
     396              :  * It is re-used in the MeiExporter to preserved xml:ids for imported objects.
     397              :  */
     398              : 
     399              : class UIDRegister
     400              : {
     401              : public:
     402              : 
     403              :     static UIDRegister* instance();
     404              : 
     405         5197 :     void reg(const engraving::EngravingItem* item, const std::string& meiUID) { m_uids[reinterpret_cast<uintptr_t>(item)] = meiUID; }
     406         3545 :     bool hasUid(const engraving::EngravingItem* item) const { return m_uids.count(reinterpret_cast<uintptr_t>(item)) > 0; }
     407         3545 :     std::string uid(const engraving::EngravingItem* item) const { return m_uids.at(reinterpret_cast<uintptr_t>(item)); }
     408           64 :     void clear() { m_uids.clear(); }
     409              : 
     410              : private:
     411              :     std::unordered_map<uintptr_t, std::string> m_uids;
     412              : };
     413              : } // namespace
        

Generated by: LCOV version 2.0-1