diff --git a/libmscore/slur.cpp b/libmscore/slur.cpp index 5503b0da28e9e..14ecffbcd44ba 100644 --- a/libmscore/slur.cpp +++ b/libmscore/slur.cpp @@ -1434,7 +1434,7 @@ void Slur::layout() // case 3: middle segment else if (i != 0 && system != sPos.system2) { segment->setSpannerSegmentType(SpannerSegmentType::MIDDLE); - qreal x1 = firstNoteRestSegmentX(system) - _spatium; + qreal x1 = firstNoteRestSegmentX(system); qreal x2 = system->bbox().width(); qreal y = system->staff(staffIdx())->y(); segment->layout(QPointF(x1, y), QPointF(x2, y)); @@ -1442,7 +1442,7 @@ void Slur::layout() // case 4: end segment else { segment->setSpannerSegmentType(SpannerSegmentType::END); - qreal x = firstNoteRestSegmentX(system) - _spatium; + qreal x = firstNoteRestSegmentX(system); segment->layout(QPointF(x, sPos.p2.y()), sPos.p2); } if (system == sPos.system2) @@ -1454,6 +1454,7 @@ void Slur::layout() //--------------------------------------------------------- // firstNoteRestSegmentX // in System() coordinates +// returns the position just after the last non-chordrest segment //--------------------------------------------------------- qreal SlurTie::firstNoteRestSegmentX(System* system) @@ -1463,7 +1464,23 @@ qreal SlurTie::firstNoteRestSegmentX(System* system) const Measure* measure = static_cast(mb); for (const Segment* seg = measure->first(); seg; seg = seg->next()) { if (seg->segmentType() == Segment::Type::ChordRest) { - return seg->pos().x() + seg->measure()->pos().x(); + // first CR found; back up to previous segment + seg = seg->prev(); + if (seg) { + // find maximum width + qreal width = 0.0; + int n = score()->nstaves(); + for (int i = 0; i < n; ++i) { + if (!system->staff(i)->show()) + continue; + Element* e = seg->element(i * VOICES); + if (e) + width = qMax(width, e->width()); + } + return seg->measure()->pos().x() + seg->pos().x() + width; + } + else + return 0.0; } } } diff --git a/libmscore/tie.cpp b/libmscore/tie.cpp index ca6fb302b3a5b..656452dec0bc7 100644 --- a/libmscore/tie.cpp +++ b/libmscore/tie.cpp @@ -314,8 +314,6 @@ void Tie::calculateDirection() void Tie::layout() { - qreal _spatium = spatium(); - // // show short bow // @@ -405,7 +403,7 @@ void Tie::layout() } // case 4: end segment else { - qreal x = firstNoteRestSegmentX(system) - 2 * _spatium; + qreal x = firstNoteRestSegmentX(system); segment->layout(QPointF(x, sPos.p2.y()), sPos.p2); segment->setSpannerSegmentType(SpannerSegmentType::END); diff --git a/vtest/gen b/vtest/gen index fecc3043b0adf..58a40cb7dfb46 100755 --- a/vtest/gen +++ b/vtest/gen @@ -38,7 +38,7 @@ else chord-layout-11 chord-layout-12 chord-layout-13 chord-layout-14 cross-1\ accidental-1 accidental-2 accidental-3 accidental-4 accidental-5\ accidental-6 accidental-7 accidental-8 accidental-9\ - tie-1 tie-2 grace-1 grace-2 grace-3 harmony-1 harmony-2 harmony-3 harmony-4 beams-1 beams-2\ + tie-1 tie-2 tie-3 grace-1 grace-2 grace-3 harmony-1 harmony-2 harmony-3 harmony-4 beams-1 beams-2\ user-offset-1 user-offset-2 chord-space-1 tablature-1 image-1\ lyrics-1 lyrics-2 lyrics-3 voice-1" fi diff --git a/vtest/gen.bat b/vtest/gen.bat index 24918bd5be102..02b9cd5cdee1c 100644 --- a/vtest/gen.bat +++ b/vtest/gen.bat @@ -19,7 +19,7 @@ set SRC=mmrest-1,bravura-mmrest,gonville-mmrest,mmrest-2,mmrest-4,mmrest-5,mmres chord-layout-11,chord-layout-12,chord-layout-13,chord-layout-14,cross-1, ^ accidental-1,accidental-2,accidental-3,accidental-4,accidental-5, ^ accidental-6,accidental-7,accidental-8,accidental-9, ^ - tie-1,tie-2,grace-1,grace-2,grace-3,harmony-1,harmony-2,harmony-3,harmony-4,beams-1,beams-2, ^ + tie-1,tie-2,tie-3,grace-1,grace-2,grace-3,harmony-1,harmony-2,harmony-3,harmony-4,beams-1,beams-2, ^ user-offset-1,user-offset-2,chord-space-1,tablature-1,image-1, ^ lyrics-1,lyrics-2,lyrics-3,voice-1 diff --git a/vtest/tie-3-ref.png b/vtest/tie-3-ref.png new file mode 100644 index 0000000000000..dfe1e0108d602 Binary files /dev/null and b/vtest/tie-3-ref.png differ diff --git a/vtest/tie-3.mscz b/vtest/tie-3.mscz new file mode 100644 index 0000000000000..4592116774deb Binary files /dev/null and b/vtest/tie-3.mscz differ