Issue #18124: Crash on import of capella file
This commit is contained in:
parent
8e8ddd7bbe
commit
f16d1a2c39
1 changed files with 71 additions and 4 deletions
|
@ -72,6 +72,58 @@ static void addDynamic(Score* score, Segment* s, int track, const char* name)
|
||||||
s->add(d);
|
s->add(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------
|
||||||
|
// levelofGraceSeg
|
||||||
|
//---------------------------------------------------------
|
||||||
|
|
||||||
|
static int levelofGraceSeg(Measure* m,int tick)
|
||||||
|
{
|
||||||
|
int nGraces = 1;
|
||||||
|
Segment* seglist = m->findSegment(Segment::SegGrace,tick);
|
||||||
|
// count SegGrace segments
|
||||||
|
for (Segment* ss = seglist; ss && ss->tick() == tick; ss = ss->prev()) {
|
||||||
|
if ((ss->subtype() == Segment::SegGrace) && (ss->tick() == tick))
|
||||||
|
nGraces++;
|
||||||
|
}
|
||||||
|
return nGraces;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------
|
||||||
|
// SetCapGraceDuration
|
||||||
|
//---------------------------------------------------------
|
||||||
|
|
||||||
|
static void SetCapGraceDuration(Chord* chord,ChordObj* o)
|
||||||
|
{
|
||||||
|
NoteType nt = NOTE_APPOGGIATURA;
|
||||||
|
((Chord*)chord)->setNoteType(nt);
|
||||||
|
if (o->t == D4) {
|
||||||
|
((Chord*)chord)->setNoteType(NOTE_GRACE4);
|
||||||
|
chord->setDurationType(TDuration::V_QUARTER);
|
||||||
|
}
|
||||||
|
else if (o->t == D_BREVE)
|
||||||
|
((Chord*)chord)->setDurationType(TDuration::V_BREVE);
|
||||||
|
else if (o->t == D1)
|
||||||
|
((Chord*)chord)->setDurationType(TDuration::V_WHOLE);
|
||||||
|
else if (o->t == D2)
|
||||||
|
((Chord*)chord)->setDurationType(TDuration::V_HALF);
|
||||||
|
else if (o->t == D16) {
|
||||||
|
((Chord*)chord)->setNoteType(NOTE_GRACE16);
|
||||||
|
chord->setDurationType(TDuration::V_16TH);
|
||||||
|
}
|
||||||
|
else if (o->t == D32) {
|
||||||
|
((Chord*)chord)->setNoteType(NOTE_GRACE32);
|
||||||
|
chord->setDurationType(TDuration::V_32ND);
|
||||||
|
}
|
||||||
|
else if (o->t == D64)
|
||||||
|
((Chord*)chord)->setDurationType(TDuration::V_64TH);
|
||||||
|
else if (o->t == D128)
|
||||||
|
((Chord*)chord)->setDurationType(TDuration::V_128TH);
|
||||||
|
else if (o->t == D256)
|
||||||
|
((Chord*)chord)->setDurationType(TDuration::V_256TH);
|
||||||
|
else
|
||||||
|
((Chord*)chord)->setDurationType(TDuration::V_EIGHT);
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------
|
//---------------------------------------------------------
|
||||||
// processBasicDrawObj
|
// processBasicDrawObj
|
||||||
//---------------------------------------------------------
|
//---------------------------------------------------------
|
||||||
|
@ -215,6 +267,9 @@ qDebug("readCapVoice 1\n");
|
||||||
Measure* m = score->getCreateMeasure(tick);
|
Measure* m = score->getCreateMeasure(tick);
|
||||||
RestObj* o = static_cast<RestObj*>(no);
|
RestObj* o = static_cast<RestObj*>(no);
|
||||||
int ticks = o->ticks();
|
int ticks = o->ticks();
|
||||||
|
if (o->invisible && ticks == 0) { // get rid of placeholders
|
||||||
|
break;
|
||||||
|
}
|
||||||
TDuration d;
|
TDuration d;
|
||||||
d.setVal(ticks);
|
d.setVal(ticks);
|
||||||
if (o->count) {
|
if (o->count) {
|
||||||
|
@ -280,11 +335,17 @@ qDebug("readCapVoice 1\n");
|
||||||
//qDebug(" <Chord>\n");
|
//qDebug(" <Chord>\n");
|
||||||
ChordObj* o = static_cast<ChordObj*>(no);
|
ChordObj* o = static_cast<ChordObj*>(no);
|
||||||
int ticks = o->ticks();
|
int ticks = o->ticks();
|
||||||
|
if (o->invisible && ticks == 0) { // get rid of placeholders
|
||||||
|
break;
|
||||||
|
}
|
||||||
TDuration d;
|
TDuration d;
|
||||||
d.setVal(ticks);
|
d.setVal(ticks);
|
||||||
Measure* m = score->getCreateMeasure(tick);
|
Measure* m = score->getCreateMeasure(tick);
|
||||||
Segment* s = m->getSegment(Segment::SegChordRest, tick);
|
int gl = levelofGraceSeg(m,tick);
|
||||||
|
bool isgracenote = (!(o->invisible) && (ticks==0));
|
||||||
|
Segment* s = (isgracenote) ? m->getGraceSegment(tick, gl) : m->getSegment(Segment::SegChordRest, tick);
|
||||||
|
if (isgracenote)
|
||||||
|
s = m->getGraceSegment(tick,1);
|
||||||
if (o->count) {
|
if (o->count) {
|
||||||
if (tuplet == 0) {
|
if (tuplet == 0) {
|
||||||
tupletCount = o->count;
|
tupletCount = o->count;
|
||||||
|
@ -312,8 +373,14 @@ qDebug("readCapVoice 1\n");
|
||||||
|
|
||||||
Chord* chord = new Chord(score);
|
Chord* chord = new Chord(score);
|
||||||
chord->setTuplet(tuplet);
|
chord->setTuplet(tuplet);
|
||||||
chord->setDurationType(d);
|
if (isgracenote) { // grace notes
|
||||||
chord->setDuration(d.fraction());
|
SetCapGraceDuration(chord,o);
|
||||||
|
chord->setDuration(chord->durationType().fraction());
|
||||||
|
}
|
||||||
|
else { // normal notes
|
||||||
|
chord->setDurationType(d);
|
||||||
|
chord->setDuration(d.fraction());
|
||||||
|
}
|
||||||
chord->setTrack(track);
|
chord->setTrack(track);
|
||||||
switch (o->stemDir) {
|
switch (o->stemDir) {
|
||||||
case -1: // down
|
case -1: // down
|
||||||
|
|
Loading…
Reference in a new issue