From 8635098b75f63d0ee3c0e8dc0cc613b7a1c4609a Mon Sep 17 00:00:00 2001 From: ws Date: Mon, 27 May 2013 19:07:03 +0200 Subject: [PATCH] fix #21249 --- libmscore/beam.cpp | 11 +++-- libmscore/groups.cpp | 10 ++--- libmscore/layout.cpp | 95 ++++++++++++++------------------------------ 3 files changed, 40 insertions(+), 76 deletions(-) diff --git a/libmscore/beam.cpp b/libmscore/beam.cpp index 68ef10c78b..1b900f5777 100644 --- a/libmscore/beam.cpp +++ b/libmscore/beam.cpp @@ -1492,20 +1492,20 @@ void Beam::layout2(QListcrl, SpannerSegmentType, int frag) int baseLevel = 0; for (int beamLevel = 0; beamLevel < beamLevels; ++beamLevel) { bool growDown = _up || cross; - for (int i = 0; i < n; ++i) { + for (int i = 0; i < n;) { ChordRest* cr1 = crl[i]; int l = cr1->durationType().hooks() - 1; - if ((cr1->type() == REST) || l < beamLevel) + if ((cr1->type() == REST) || l < beamLevel) { + ++i; continue; + } int c1 = i; ++i; for (; i < n; ++i) { ChordRest* c = crl[i]; int l = c->durationType().hooks() - 1; - BeamMode bm = c->beamMode(); - if (bm == BeamMode::AUTO) - bm = Groups::endBeam(c); + BeamMode bm = Groups::endBeam(c); bool b32 = (beamLevel >= 1) && (bm == BeamMode::BEGIN32); bool b64 = (beamLevel >= 2) && (bm == BeamMode::BEGIN64); if ((l >= beamLevel && (b32 || b64)) || (l < beamLevel)) @@ -1611,7 +1611,6 @@ void Beam::layout2(QListcrl, SpannerSegmentType, int frag) else { beamSegments.push_back(new QLineF(x2, ly1, x3, ly2)); } - --i; } } diff --git a/libmscore/groups.cpp b/libmscore/groups.cpp index 0d8b8ce50a..5546306d11 100644 --- a/libmscore/groups.cpp +++ b/libmscore/groups.cpp @@ -46,19 +46,19 @@ static std::vector noteGroups { BeamMode Groups::endBeam(ChordRest* cr) { + if (cr->beamMode() != BeamMode::AUTO) + return cr->beamMode(); Q_ASSERT(cr->staff()); if (cr->tuplet() && !cr->tuplet()->elements().isEmpty()) { - if (cr->tuplet()->elements().front() == cr) // end beam at tuplet + if (cr->tuplet()->elements().front() == cr) // end beam at new tuplet return BeamMode::BEGIN; + if (cr->tuplet()->elements().back() == cr) // end beam at tuplet end + return BeamMode::END; return BeamMode::AUTO; } TDuration d = cr->durationType(); -/* int type = int(d.type()) - int(TDuration::DurationType::V_EIGHT); - if (type < 0 || type > 3) - return BeamMode::AUTO; - */ const Groups& g = cr->staff()->group(cr->tick()); return g.beamMode(cr->rtick(), d.type()); } diff --git a/libmscore/layout.cpp b/libmscore/layout.cpp index 72b98eed21..2312120885 100644 --- a/libmscore/layout.cpp +++ b/libmscore/layout.cpp @@ -382,13 +382,14 @@ void Score::layoutStage2() continue; // set up for cross-measure values as soon as possible // to have all computations (stems, hooks, ...) consistent with it - if(cr->type() == Element::CHORD && segment->segmentType() == Segment::SegChordRest) + if (cr->type() == Element::CHORD && segment->segmentType() == Segment::SegChordRest) ((Chord*)cr)->crossMeasureSetup(crossMeasure); - bm = cr->beamMode(); - if (bm == BeamMode::AUTO) - bm = Groups::endBeam(cr); + + bm = Groups::endBeam(cr); + // if chord has hooks and is 2nd element of a cross-measure value // set beam mode to NONE (do not combine with following chord beam/hook, if any) + if (cr->durationType().hooks() > 0 && cr->crossMeasure() == CROSSMEASURE_SECOND) bm = BeamMode::NONE; if (cr->measure() != measure) { @@ -450,6 +451,7 @@ void Score::layoutStage2() } continue; } + if ((cr->durationType().type() <= TDuration::V_QUARTER) || (bm == BeamMode::NONE)) { if (beam) { beam->layout1(); @@ -462,85 +464,48 @@ void Score::layoutStage2() cr->removeDeleteBeam(); continue; } - bool beamEnd = false; + if (beam) { - ChordRest* le = beam->elements().back(); - if ((!beamModeMid(bm) && (le->tuplet() != cr->tuplet())) || (bm == BeamMode::BEGIN)) { - beamEnd = true; - } - else if (!beamModeMid(bm)) { - if (le->tick() + le->actualTicks() < cr->tick()) - beamEnd = true; + bool beamEnd = bm == BeamMode::BEGIN; + if (!beamEnd) { + cr->removeDeleteBeam(); + beam->add(cr); + cr = 0; + beamEnd = (bm == BeamMode::END); } if (beamEnd) { beam->layout1(); beam = 0; } - else { - cr->removeDeleteBeam(); - beam->add(cr); - cr = 0; - - // is cr the last beam element? - if (bm == BeamMode::END) { - beam->layout1(); - beam = 0; - } - } } - if (cr && cr->tuplet() && (cr->tuplet()->elements().back() == cr)) { - if (beam) { - beam->layout1(); - beam = 0; - cr->removeDeleteBeam(); + if (!cr) + continue; + + if (a1 == 0) + a1 = cr; + else { + if (!beamModeMid(bm) + && + (bm == BeamMode::BEGIN + || (a1->segment()->segmentType() != cr->segment()->segmentType()) + || (a1->tick() + a1->actualTicks() < cr->tick()) + ) + ) { + a1->removeDeleteBeam(); + a1 = cr; } - else if (a1) { + else { beam = a1->beam(); if (beam == 0 || beam->elements().front() != a1) { beam = new Beam(this); - beam->setTrack(track); beam->setGenerated(true); + beam->setTrack(track); a1->removeDeleteBeam(); beam->add(a1); } cr->removeDeleteBeam(); beam->add(cr); a1 = 0; - beam->layout1(); - beam = 0; - } - else { - //cr->setBeam(0); - cr->removeDeleteBeam(); - } - } - else if (cr) { - if (a1 == 0) - a1 = cr; - else { - if (!beamModeMid(bm) - && - (bm == BeamMode::BEGIN - || (a1->segment()->segmentType() != cr->segment()->segmentType()) - || (a1->tick() + a1->actualTicks() < cr->tick()) - ) - ) { - a1->removeDeleteBeam(); - a1 = cr; - } - else { - beam = a1->beam(); - if (beam == 0 || beam->elements().front() != a1) { - beam = new Beam(this); - beam->setGenerated(true); - beam->setTrack(track); - a1->removeDeleteBeam(); - beam->add(a1); - } - cr->removeDeleteBeam(); - beam->add(cr); - a1 = 0; - } } } }