Skip to content

Commit 9508b7a

Browse files
Merge pull request #24819 from miiizen/443-ports
4.4.3 ports
2 parents dea206e + 08b5521 commit 9508b7a

File tree

13 files changed

+91
-42
lines changed

13 files changed

+91
-42
lines changed

src/engraving/dom/gradualtempochange.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ TempoText* GradualTempoChangeSegment::findElementToSnapAfter() const
359359
// It is the next tempoChange which looks for a tempoChange before.
360360
Fraction refTick = tempoChange()->tick2();
361361
Measure* measure = score()->tick2measure(refTick);
362+
measure = style().styleB(Sid::createMultiMeasureRests) && measure->hasMMRest() ? measure->mmRest() : measure;
362363
if (!measure) {
363364
return nullptr;
364365
}

src/engraving/rendering/dev/beamlayout.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -644,8 +644,6 @@ void BeamLayout::beamGraceNotes(LayoutContext& ctx, Chord* mainNote, bool after)
644644

645645
void BeamLayout::createBeams(LayoutContext& ctx, Measure* measure)
646646
{
647-
bool crossMeasure = ctx.conf().styleB(Sid::crossMeasureValues);
648-
649647
for (track_idx_t track = 0; track < ctx.dom().ntracks(); ++track) {
650648
const Staff* stf = ctx.dom().staff(track2staff(track));
651649

@@ -738,17 +736,12 @@ void BeamLayout::createBeams(LayoutContext& ctx, Measure* measure)
738736
cr->removeDeleteBeam(false);
739737
}
740738

741-
// handle grace notes and cross-measure beaming
739+
// handle grace notes
742740
// (tied chords?)
743741
if (cr->isChord()) {
744742
Chord* chord = toChord(cr);
745743
beamGraceNotes(ctx, chord, false); // grace before
746744
beamGraceNotes(ctx, chord, true); // grace after
747-
// set up for cross-measure values as soon as possible
748-
// to have all computations (stems, hooks, ...) consistent with it
749-
if (!chord->isGrace()) {
750-
ChordLayout::crossMeasureSetup(chord, crossMeasure, ctx);
751-
}
752745
}
753746

754747
if (cr->isRest() && cr->beamMode() == BeamMode::AUTO) {

src/engraving/rendering/dev/lyricslayout.cpp

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -451,8 +451,18 @@ void LyricsLayout::createOrRemoveLyricsLine(Lyrics* item, LayoutContext& ctx)
451451
EngravingItem* endSegmentElement = endSegment->element(track);
452452
if (endSegment->tick() == endTick && endSegmentElement && endSegmentElement->type() == ElementType::CHORD) {
453453
// everything is OK if we have reached a chord at right tick on right track
454-
// advance to next CR, or last segment if no next CR
455-
endSegment = endSegment->nextCR(track, false);
454+
// advance to next CR after duration of note, or last segment if no next CR
455+
const Segment* endChordSeg = endSegment;
456+
const Chord* endChord = toChord(endSegmentElement);
457+
458+
endSegment = endChordSeg->nextCR(track, false);
459+
460+
if (!endSegment) {
461+
endSegment = endChordSeg;
462+
while (endSegment && endSegment->tick() < endChord->tick() + endChord->ticks()) {
463+
endSegment = endSegment->nextCR(muse::nidx, true);
464+
}
465+
}
456466
} else {
457467
// FIXUP - lyrics tick count not valid
458468
// this happens if edits to score have removed the original end segment
@@ -609,18 +619,17 @@ void LyricsLayout::setDefaultPositions(staff_idx_t staffIdx, const LyricsVersesM
609619
double staffHeight = ctx.dom().staff(staffIdx)->staffHeight();
610620
double lyricsLineHeightFactor = ctx.conf().styleD(Sid::lyricsLineHeight);
611621

612-
int totVersesAbove = int(lyricsVersesAbove.size()) - 1;
613-
622+
int maxVerseAbove = !lyricsVersesAbove.empty() ? lyricsVersesAbove.crbegin()->first : 0;
614623
for (auto& pair : lyricsVersesAbove) {
615624
int verse = pair.first;
616625
const LyricsVerse& lyricsVerse = pair.second;
617626
for (Lyrics* lyrics : lyricsVerse.lyrics()) {
618-
double y = -(totVersesAbove - verse) * lyrics->lineSpacing() * lyricsLineHeightFactor;
627+
double y = -(maxVerseAbove - verse) * lyrics->lineSpacing() * lyricsLineHeightFactor;
619628
lyrics->setYRelativeToStaff(y);
620629
}
621630
for (LyricsLineSegment* lyricsLineSegment : lyricsVerse.lines()) {
622631
Lyrics* lyrics = lyricsLineSegment->lyricsLine()->lyrics();
623-
double y = -(totVersesAbove - verse) * lyrics->lineSpacing() * lyricsLineHeightFactor;
632+
double y = -(maxVerseAbove - verse) * lyrics->lineSpacing() * lyricsLineHeightFactor;
624633
lyricsLineSegment->move(PointF(0.0, y + lyricsLineSegment->baseLineShift()));
625634
}
626635
}
@@ -651,10 +660,13 @@ void LyricsLayout::checkCollisionsWithStaffElements(System* system, staff_idx_t
651660
SkylineLine& staffSkylineNorth = systemStaff->skyline().north();
652661
SkylineLine& staffSkylineSouth = systemStaff->skyline().south();
653662

654-
int maxVerseAbove = int(lyricsVersesAbove.size());
655-
int maxVerseBelow = int(lyricsVersesBelow.size());
663+
int maxVerseAbove = !lyricsVersesAbove.empty() ? lyricsVersesAbove.crbegin()->first : 0;
664+
int maxVerseBelow = !lyricsVersesBelow.empty() ? lyricsVersesBelow.crbegin()->first : 0;
656665

657-
for (int verse = maxVerseAbove - 1; verse >= 0; --verse) {
666+
for (int verse = maxVerseAbove; verse >= 0; --verse) {
667+
if (lyricsVersesAbove.count(verse) == 0) {
668+
continue;
669+
}
658670
SkylineLine verseSkyline = createSkylineForVerse(verse, false, lyricsVersesAbove, system);
659671
double minDistance = -verseSkyline.minDistance(staffSkylineNorth);
660672
if (minDistance < lyricsMinDist) {
@@ -663,7 +675,10 @@ void LyricsLayout::checkCollisionsWithStaffElements(System* system, staff_idx_t
663675
}
664676
}
665677

666-
for (int verse = 0; verse < maxVerseBelow; ++verse) {
678+
for (int verse = 0; verse <= maxVerseBelow; ++verse) {
679+
if (lyricsVersesBelow.count(verse) == 0) {
680+
continue;
681+
}
667682
SkylineLine verseSkyline = createSkylineForVerse(verse, true, lyricsVersesBelow, system);
668683
double minDistance = -staffSkylineSouth.minDistance(verseSkyline);
669684
if (minDistance < lyricsMinDist) {

src/engraving/rendering/dev/measurelayout.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,7 @@ void MeasureLayout::layoutMeasure(MeasureBase* currentMB, LayoutContext& ctx)
869869
checkStaffMoveValidity(measure, ctx);
870870

871871
// ---- Modify DOM ----
872+
ModifyDom::setCrossMeasure(measure, ctx);
872873
ModifyDom::connectTremolo(measure);
873874
ModifyDom::cmdUpdateNotes(measure, ctx.dom());
874875
ModifyDom::createStems(measure, ctx);

src/engraving/rendering/dev/modifydom.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,44 @@
3232
#include "dom/keysig.h"
3333
#include "dom/hook.h"
3434
#include "dom/part.h"
35+
#include "rendering/dev/chordlayout.h"
3536

3637
using namespace mu::engraving::rendering::dev;
3738

39+
void ModifyDom::setCrossMeasure(const Measure* measure, LayoutContext& ctx)
40+
{
41+
bool crossMeasure = ctx.conf().styleB(Sid::crossMeasureValues);
42+
const DomAccessor& dom = ctx.dom();
43+
for (staff_idx_t staffIdx = 0; staffIdx < dom.nstaves(); ++staffIdx) {
44+
const Staff* staff = dom.staff(staffIdx);
45+
if (!staff->show()) {
46+
continue;
47+
}
48+
49+
track_idx_t startTrack = staffIdx * VOICES;
50+
track_idx_t endTrack = startTrack + VOICES;
51+
52+
for (const Segment& segment : measure->segments()) {
53+
if (!segment.isJustType(SegmentType::ChordRest)) {
54+
continue;
55+
}
56+
57+
for (track_idx_t t = startTrack; t < endTrack; ++t) {
58+
ChordRest* cr = segment.cr(t);
59+
if (!cr) {
60+
continue;
61+
}
62+
if (cr->isChord()) {
63+
Chord* chord = toChord(cr);
64+
if (!chord->isGrace()) {
65+
ChordLayout::crossMeasureSetup(chord, crossMeasure, ctx);
66+
}
67+
}
68+
}
69+
}
70+
}
71+
}
72+
3873
void ModifyDom::connectTremolo(Measure* m)
3974
{
4075
m->connectTremolo();

src/engraving/rendering/dev/modifydom.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class ModifyDom
3636
{
3737
public:
3838

39+
static void setCrossMeasure(const Measure* measure, LayoutContext& ctx);
3940
static void connectTremolo(Measure* m);
4041
static void cmdUpdateNotes(const Measure* measure, const DomAccessor& dom);
4142
static void createStems(const Measure* measure, LayoutContext& ctx);

src/engraving/rendering/dev/systemlayout.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,6 +1134,9 @@ void SystemLayout::layoutSystemElements(System* system, LayoutContext& ctx)
11341134
if (!sp->systemFlag() && sp->staff() && !sp->staff()->show()) {
11351135
continue;
11361136
}
1137+
if (sp->systemFlag() && sp->staffIdxOrNextVisible() == muse::nidx) {
1138+
continue;
1139+
}
11371140

11381141
if (sp->tick2() == stick && sp->isPedal() && toPedal(sp)->connect45HookToNext()) {
11391142
pedal.push_back(sp);

src/framework/global/serialization/xmlstreamreader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ static std::pair<XMLNode*, XmlStreamReader::TokenType> resolveNode(XMLNode* curr
157157
}
158158

159159
XMLNode* sibling = currentNode->NextSibling();
160-
if (!sibling || sibling->ToElement() || sibling->ToText()) {
160+
if (!sibling || sibling->ToElement() || sibling->ToText() || sibling->ToComment()) {
161161
return { currentNode, XmlStreamReader::TokenType::EndElement };
162162
}
163163
}

src/notation/view/widgets/editstafftype.cpp

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -442,30 +442,30 @@ void EditStaffType::setFromDlg()
442442
staffType.setShowLedgerLines(showLedgerLinesPercussion->isChecked());
443443
staffType.setStemless(stemlessPercussion->isChecked());
444444
}
445-
staffType.setDurationFontName(durFontName->currentText());
446-
staffType.setDurationFontSize(durFontSize->value());
447-
staffType.setDurationFontUserY(durY->value());
448-
staffType.setFretFontName(fretFontName->currentText());
449-
staffType.setFretFontSize(fretFontSize->value());
450-
staffType.setFretFontUserY(fretY->value());
451-
staffType.setLinesThrough(linesThroughRadio->isChecked());
452-
staffType.setMinimStyle(minimNoneRadio->isChecked() ? mu::engraving::TablatureMinimStyle::NONE
453-
: (minimShortRadio->isChecked() ? mu::engraving::TablatureMinimStyle::SHORTER : mu::engraving::
454-
TablatureMinimStyle::
455-
SLASHED));
456-
staffType.setSymbolRepeat(valuesRepeatNever->isChecked() ? mu::engraving::TablatureSymbolRepeat::NEVER
457-
: (valuesRepeatSystem->isChecked() ? mu::engraving::TablatureSymbolRepeat::SYSTEM
458-
: valuesRepeatMeasure->isChecked() ? mu::engraving::TablatureSymbolRepeat::MEASURE
459-
: mu::engraving::TablatureSymbolRepeat::ALWAYS));
460-
staffType.setOnLines(onLinesRadio->isChecked());
461-
staffType.setShowRests(showRests->isChecked());
462-
staffType.setUpsideDown(upsideDown->isChecked());
463-
staffType.setShowTabFingering(showTabFingering->isChecked());
464-
staffType.setUseNumbers(numbersRadio->isChecked());
465-
//note values
466-
staffType.setStemsDown(stemBelowRadio->isChecked());
467-
staffType.setStemsThrough(stemThroughRadio->isChecked());
468445
if (staffType.group() == mu::engraving::StaffGroup::TAB) {
446+
staffType.setDurationFontName(durFontName->currentText());
447+
staffType.setDurationFontSize(durFontSize->value());
448+
staffType.setDurationFontUserY(durY->value());
449+
staffType.setFretFontName(fretFontName->currentText());
450+
staffType.setFretFontSize(fretFontSize->value());
451+
staffType.setFretFontUserY(fretY->value());
452+
staffType.setLinesThrough(linesThroughRadio->isChecked());
453+
staffType.setMinimStyle(minimNoneRadio->isChecked() ? mu::engraving::TablatureMinimStyle::NONE
454+
: (minimShortRadio->isChecked() ? mu::engraving::TablatureMinimStyle::SHORTER : mu::engraving::
455+
TablatureMinimStyle::
456+
SLASHED));
457+
staffType.setSymbolRepeat(valuesRepeatNever->isChecked() ? mu::engraving::TablatureSymbolRepeat::NEVER
458+
: (valuesRepeatSystem->isChecked() ? mu::engraving::TablatureSymbolRepeat::SYSTEM
459+
: valuesRepeatMeasure->isChecked() ? mu::engraving::TablatureSymbolRepeat::MEASURE
460+
: mu::engraving::TablatureSymbolRepeat::ALWAYS));
461+
staffType.setOnLines(onLinesRadio->isChecked());
462+
staffType.setShowRests(showRests->isChecked());
463+
staffType.setUpsideDown(upsideDown->isChecked());
464+
staffType.setShowTabFingering(showTabFingering->isChecked());
465+
staffType.setUseNumbers(numbersRadio->isChecked());
466+
//note values
467+
staffType.setStemsDown(stemBelowRadio->isChecked());
468+
staffType.setStemsThrough(stemThroughRadio->isChecked());
469469
staffType.setGenKeysig(false);
470470
staffType.setStemless(true); // assume no note values
471471
staffType.setGenDurations(false); // " "

vtest/scores/cross-measure-1.mscz

17.7 KB
Binary file not shown.

0 commit comments

Comments
 (0)