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
|