From 23c3129c3e9e6390fbfbcf712675c5948a45da76 Mon Sep 17 00:00:00 2001 From: AntonioBL Date: Sun, 1 Apr 2018 21:35:37 +0200 Subject: [PATCH] fix #270634 crash when importing file with fermata --- libmscore/read114.cpp | 6 +++-- libmscore/read206.cpp | 8 +++++- .../compat114/articulations-ref.mscx | 18 +++++++++++-- mtest/libmscore/compat114/articulations.mscx | 15 ++++++++++- .../compat206/articulations-ref.mscx | 26 +++++++++++++++++++ mtest/libmscore/compat206/articulations.mscx | 26 +++++++++++++++++++ 6 files changed, 93 insertions(+), 6 deletions(-) diff --git a/libmscore/read114.cpp b/libmscore/read114.cpp index e214715d866ee..c9a493fa1f219 100644 --- a/libmscore/read114.cpp +++ b/libmscore/read114.cpp @@ -1106,8 +1106,9 @@ static void readMeasure(Measure* m, int staffIdx, XmlReader& e) else if (tag == "Chord") { Chord* chord = new Chord(m->score()); chord->setTrack(e.track()); - readChord(chord, e); segment = m->getSegment(SegmentType::ChordRest, e.tick()); + chord->setParent(segment); + readChord(chord, e); if (chord->noteType() != NoteType::NORMAL) { graceNotes.push_back(chord); if (chord->tremolo() && chord->tremolo()->tremoloType() < TremoloType::R8) { @@ -1196,8 +1197,9 @@ static void readMeasure(Measure* m, int staffIdx, XmlReader& e) rest->setDurationType(TDuration::DurationType::V_MEASURE); rest->setDuration(m->timesig()/timeStretch); rest->setTrack(e.track()); - readRest(rest, e); segment = m->getSegment(SegmentType::ChordRest, e.tick()); + rest->setParent(segment); + readRest(rest, e); segment->add(rest); if (!rest->duration().isValid()) // hack diff --git a/libmscore/read206.cpp b/libmscore/read206.cpp index b594bdb5671dd..a830a26a0ed01 100644 --- a/libmscore/read206.cpp +++ b/libmscore/read206.cpp @@ -1482,6 +1482,11 @@ Element* readArticulation(ChordRest* cr, XmlReader& e) e.unknown(); } } + // Special case for "no type" = ufermata, with missing subtype tag + if (!el) { + el = new Fermata(sym, cr->score()); + setFermataPlacement(el, anchor, direction); + } el->setTrack(cr->staffIdx() * VOICES); return el; } @@ -1634,8 +1639,9 @@ static void readMeasure(Measure* m, int staffIdx, XmlReader& e) rest->setDurationType(TDuration::DurationType::V_MEASURE); rest->setDuration(m->timesig()/timeStretch); rest->setTrack(e.track()); - readRest(rest, e); segment = m->getSegment(SegmentType::ChordRest, e.tick()); + rest->setParent(segment); + readRest(rest, e); segment->add(rest); if (!rest->duration().isValid()) // hack diff --git a/mtest/libmscore/compat114/articulations-ref.mscx b/mtest/libmscore/compat114/articulations-ref.mscx index 0fb314c7f5210..6214d22e05b41 100644 --- a/mtest/libmscore/compat114/articulations-ref.mscx +++ b/mtest/libmscore/compat114/articulations-ref.mscx @@ -538,12 +538,26 @@ + + fermataAbove + - measure - 4/4 + quarter + + + quarter + + + quarter + + + quarter + + fermataAbove + measure 4/4 diff --git a/mtest/libmscore/compat114/articulations.mscx b/mtest/libmscore/compat114/articulations.mscx index 08d0a2f03c62d..ea21085d1549a 100644 --- a/mtest/libmscore/compat114/articulations.mscx +++ b/mtest/libmscore/compat114/articulations.mscx @@ -460,12 +460,25 @@ - measure + quarter + + + + + quarter + + + quarter + + + quarter measure + + diff --git a/mtest/libmscore/compat206/articulations-ref.mscx b/mtest/libmscore/compat206/articulations-ref.mscx index acf7ea1d73411..362407510a08b 100644 --- a/mtest/libmscore/compat206/articulations-ref.mscx +++ b/mtest/libmscore/compat206/articulations-ref.mscx @@ -1829,6 +1829,32 @@ 14 + + + + fermataAbove + + + quarter + + + fermataShortAbove + + + quarter + + + fermataLongAbove + + + quarter + + + fermataVeryLongAbove + + + quarter + diff --git a/mtest/libmscore/compat206/articulations.mscx b/mtest/libmscore/compat206/articulations.mscx index 59915be8fa856..ea07dd3cb3c41 100644 --- a/mtest/libmscore/compat206/articulations.mscx +++ b/mtest/libmscore/compat206/articulations.mscx @@ -1834,6 +1834,32 @@ 14 + + + + quarter + + fermata + + + + quarter + + shortfermata + + + + quarter + + longfermata + + + + quarter + + verylongfermata + + end 1