From c668486eee714ea2439884fe8348f54bbddb12c6 Mon Sep 17 00:00:00 2001 From: Michele Spagnolo Date: Mon, 27 Jan 2025 13:24:41 +0100 Subject: [PATCH 1/6] MASKING --- src/engraving/dom/engravingitem.h | 5 + src/engraving/dom/lyrics.cpp | 8 + src/engraving/dom/lyrics.h | 4 + src/engraving/dom/textbase.cpp | 24 - src/engraving/dom/textbase.h | 1 - src/engraving/infrastructure/shape.cpp | 30 + src/engraving/infrastructure/shape.h | 3 + .../rendering/score/horizontalspacing.cpp | 66 +- .../rendering/score/horizontalspacing.h | 1 + .../rendering/score/lyricslayout.cpp | 3 +- src/engraving/rendering/score/masklayout.cpp | 300 ++++++++ src/engraving/rendering/score/masklayout.h | 49 ++ src/engraving/rendering/score/pagelayout.cpp | 3 + .../rendering/score/paintdebugger.cpp | 5 + src/engraving/rendering/score/paintdebugger.h | 1 + src/engraving/rendering/score/rendering.cmake | 2 + src/engraving/rendering/score/tdraw.cpp | 57 +- src/engraving/rendering/score/tdraw.h | 2 + src/engraving/rendering/score/tlayout.cpp | 31 + src/engraving/rendering/score/tlayout.h | 1 + src/engraving/style/styledef.cpp | 2 + src/engraving/style/styledef.h | 2 + src/framework/draw/bufferedpaintprovider.cpp | 6 + src/framework/draw/bufferedpaintprovider.h | 1 + .../draw/internal/qpainterprovider.cpp | 21 + .../draw/internal/qpainterprovider.h | 1 + src/framework/draw/ipaintprovider.h | 1 + src/framework/draw/painter.cpp | 5 + src/framework/draw/painter.h | 1 + src/framework/draw/types/geometry.h | 3 + .../notation/lyrics/lyricssettingsmodel.cpp | 8 + .../notation/lyrics/lyricssettingsmodel.h | 3 + .../notation/lyrics/LyricsSettings.qml | 10 + src/notation/view/widgets/editstyle.cpp | 2 + src/notation/view/widgets/editstyle.ui | 649 +++++++++--------- 35 files changed, 952 insertions(+), 359 deletions(-) create mode 100644 src/engraving/rendering/score/masklayout.cpp create mode 100644 src/engraving/rendering/score/masklayout.h diff --git a/src/engraving/dom/engravingitem.h b/src/engraving/dom/engravingitem.h index 2c19459f8171e..d78c4764e19fd 100644 --- a/src/engraving/dom/engravingitem.h +++ b/src/engraving/dom/engravingitem.h @@ -513,6 +513,7 @@ class EngravingItem : public EngravingObject virtual void reset() { m_shape.reset(); + m_mask.reset(); //! NOTE Temporary removed, have problems, need investigation //m_pos.reset(); } @@ -582,6 +583,9 @@ class EngravingItem : public EngravingObject setBbox(r); } + void setMask(const Shape& m) { m_mask.set_value(m); } + const Shape& mask() const { return m_mask.value(); } + OffsetChange offsetChanged() const { return autoplace.offsetChanged; } void connectItemSnappedBefore(EngravingItem* itemBefore); @@ -633,6 +637,7 @@ class EngravingItem : public EngravingObject double m_mag = 1.0; // standard magnification (derived value) ld_field m_pos = "pos"; // Reference position, relative to _parent, set by autoplace ld_field m_shape = "shape"; + ld_field m_mask = "mask"; EngravingItem* m_itemSnappedBefore = nullptr; EngravingItem* m_itemSnappedAfter = nullptr; diff --git a/src/engraving/dom/lyrics.cpp b/src/engraving/dom/lyrics.cpp index 96f74f5e42d29..8179a18637e3f 100644 --- a/src/engraving/dom/lyrics.cpp +++ b/src/engraving/dom/lyrics.cpp @@ -46,6 +46,7 @@ namespace mu::engraving { static const ElementStyle lyricsElementStyle { { Sid::lyricsPlacement, Pid::PLACEMENT }, + { Sid::lyricsAvoidBarlines, Pid::AVOID_BARLINES }, }; //--------------------------------------------------------- @@ -388,6 +389,8 @@ PropertyValue Lyrics::getProperty(Pid propertyId) const return m_ticks; case Pid::VERSE: return m_no; + case Pid::AVOID_BARLINES: + return m_avoidBarlines; default: return TextBase::getProperty(propertyId); } @@ -447,6 +450,9 @@ bool Lyrics::setProperty(Pid propertyId, const PropertyValue& v) } m_no = v.toInt(); break; + case Pid::AVOID_BARLINES: + m_avoidBarlines = v.toBool(); + break; default: if (!TextBase::setProperty(propertyId, v)) { return false; @@ -474,6 +480,8 @@ PropertyValue Lyrics::propertyDefault(Pid id) const return Fraction(0, 1); case Pid::VERSE: return 0; + case Pid::AVOID_BARLINES: + return style().styleB(Sid::lyricsAvoidBarlines); case Pid::ALIGN: if (isMelisma()) { return style().styleV(Sid::lyricsMelismaAlign); diff --git a/src/engraving/dom/lyrics.h b/src/engraving/dom/lyrics.h index 9dfbb846c326a..7134a2963fce8 100644 --- a/src/engraving/dom/lyrics.h +++ b/src/engraving/dom/lyrics.h @@ -101,6 +101,9 @@ class Lyrics final : public TextBase double yRelativeToStaff() const; void setYRelativeToStaff(double y); + bool avoidBarlines() const { return m_avoidBarlines; } + void setAvoidBarlines(bool v) { m_avoidBarlines = v; } + protected: int m_no = 0; // row index @@ -116,6 +119,7 @@ class Lyrics final : public TextBase LyricsSyllabic m_syllabic = LyricsSyllabic::SINGLE; LyricsLine* m_separator = nullptr; bool m_needRemoveInvalidSegments = false; + bool m_avoidBarlines = true; }; //--------------------------------------------------------- diff --git a/src/engraving/dom/textbase.cpp b/src/engraving/dom/textbase.cpp index ff373f983ab5a..aac107ebcaad4 100644 --- a/src/engraving/dom/textbase.cpp +++ b/src/engraving/dom/textbase.cpp @@ -2347,30 +2347,6 @@ RectF TextBase::pageRectangle() const return pageBoundingRect(); } -void TextBase::computeHighResShape(const FontMetrics& fontMetrics) -{ - Shape& highResShape = mutldata()->highResShape.mut_value(); - highResShape.clear(); - highResShape.elements().reserve(m_text.size()); - - for (const TextBlock& block : ldata()->blocks) { - double x = 0; - for (const TextFragment& fragment : block.fragments()) { - x += fragment.pos.x(); - size_t textSize = fragment.text.size(); - for (size_t i = 0; i < textSize; ++i) { - Char character = fragment.text.at(i); - RectF characterBoundingRect = fontMetrics.tightBoundingRect(fragment.text.at(i)); - characterBoundingRect.translate(x, 0.0); - highResShape.add(characterBoundingRect); - if (i + 1 < textSize) { - x += fontMetrics.horizontalAdvance(character); - } - } - } - } -} - //--------------------------------------------------------- // dragTo //--------------------------------------------------------- diff --git a/src/engraving/dom/textbase.h b/src/engraving/dom/textbase.h index 25632b665c60a..0c3f12e97aa55 100644 --- a/src/engraving/dom/textbase.h +++ b/src/engraving/dom/textbase.h @@ -367,7 +367,6 @@ class TextBase : public EngravingItem RectF pageRectangle() const; const Shape& highResShape() const { return ldata()->highResShape.value(); } - void computeHighResShape(const muse::draw::FontMetrics& fontMetrics); void dragTo(EditData&); diff --git a/src/engraving/infrastructure/shape.cpp b/src/engraving/infrastructure/shape.cpp index 9a384d63eb389..86a675452befe 100644 --- a/src/engraving/infrastructure/shape.cpp +++ b/src/engraving/infrastructure/shape.cpp @@ -144,6 +144,24 @@ Shape Shape::adjusted(double xp1, double yp1, double xp2, double yp2) const return s; } +Shape& Shape::pad(double p) +{ + for (ShapeElement& el : m_elements) { + el.pad(p); + } + return *this; +} + +Shape Shape::padded(double p) const +{ + Shape s; + s.m_elements.reserve(m_elements.size()); + for (const ShapeElement& el : m_elements) { + s.add(el.padded(p)); + } + return s; +} + void Shape::invalidateBBox() { m_bbox = RectF(); @@ -492,6 +510,18 @@ void Shape::remove(const Shape& s) invalidateBBox(); } +std::vector Shape::toRects() const +{ + std::vector rects; + rects.reserve(m_elements.size()); + + for (const RectF& shapeEl : m_elements) { + rects.push_back(shapeEl); + } + + return rects; +} + void Shape::removeInvisibles() { muse::remove_if(m_elements, [](ShapeElement& shapeElement) { diff --git a/src/engraving/infrastructure/shape.h b/src/engraving/infrastructure/shape.h index e6174620f0a87..f09fe50393091 100644 --- a/src/engraving/infrastructure/shape.h +++ b/src/engraving/infrastructure/shape.h @@ -128,6 +128,7 @@ class Shape const std::vector& elements() const { return m_elements; } std::vector& elements() { return m_elements; } + std::vector toRects() const; std::optional find_if(const std::function& func) const; std::optional find_first(ElementType type) const; @@ -146,6 +147,8 @@ class Shape Shape scaled(const SizeF&) const; Shape& adjust(double xp1, double yp1, double xp2, double yp2); Shape adjusted(double xp1, double yp1, double xp2, double yp2) const; + Shape& pad(double p); + Shape padded(double p) const; const RectF& bbox() const; double minVerticalDistance(const Shape&, double minHorizontalClearance = 0.0) const; diff --git a/src/engraving/rendering/score/horizontalspacing.cpp b/src/engraving/rendering/score/horizontalspacing.cpp index c61ee9eeae588..f652cbab9c148 100644 --- a/src/engraving/rendering/score/horizontalspacing.cpp +++ b/src/engraving/rendering/score/horizontalspacing.cpp @@ -44,6 +44,7 @@ double HorizontalSpacing::computeSpacingForFullSystem(System* system, double str bool overrideMinMeasureWidth) { HorizontalSpacingContext ctx; + ctx.system = system; ctx.spatium = system->spatium(); ctx.stretchReduction = stretchReduction; @@ -78,6 +79,7 @@ double HorizontalSpacing::computeSpacingForFullSystem(System* system, double str double HorizontalSpacing::updateSpacingForLastAddedMeasure(System* system) { HorizontalSpacingContext ctx; + ctx.system = system; ctx.spatium = system->spatium(); ctx.xLeftBarrier = system->leftMargin(); @@ -345,7 +347,9 @@ void HorizontalSpacing::spaceAgainstPreviousSegments(Segment* segment, std::vect } else if (timeSigAboveKeySigCase) { x = xPrevSeg + segment->minLeft(); // align to the preceding keySig } else { - double xNonCollision = xPrevSeg + minHorizontalDistance(prevSeg, segment, ctx.squeezeFactor); + double minHorDist = minHorizontalDistance(prevSeg, segment, ctx.squeezeFactor); + minHorDist = std::max(minHorDist, spaceLyricsAgainstBarlines(prevSeg, segment, ctx)); + double xNonCollision = xPrevSeg + minHorDist; x = std::max(x, xNonCollision); } @@ -449,6 +453,7 @@ void HorizontalSpacing::checkLyricsAgainstRightMargin(std::vector 1; --i) { double systemEdge = segPositions.back().xPosInSystemCoords + segPositions.back().segment->minRight(); + SegmentPosition& segPos = segPositions[i - 1]; double x = segPos.xPosInSystemCoords; Segment* seg = segPos.segment; @@ -483,6 +488,65 @@ void HorizontalSpacing::checkLyricsAgainstRightMargin(std::vectorisType(SegmentType::ChordRest) && secondSeg->isType(SegmentType::BarLineType)) + && !(firstSeg->isType(SegmentType::BarLineType) && secondSeg->isType(SegmentType::ChordRest))) { + return 0.0; + } + + double w = 0.0; + + bool crSegIsBefore = firstSeg->isChordRestType(); + Segment* crSegment = crSegIsBefore ? firstSeg : secondSeg; + Segment* barlineSegment = crSegIsBefore ? secondSeg : firstSeg; + + staff_idx_t nstaves = crSegment->score()->nstaves(); + + for (staff_idx_t staffIdx = 0; staffIdx < nstaves; ++staffIdx) { + if (!ctx.system->staff(staffIdx)->show()) { + continue; + } + + staff_idx_t nextStaff = ctx.system->nextVisibleStaff(staffIdx); + if (nextStaff == muse::nidx) { + continue; + } + + BarLine* barline = toBarLine(barlineSegment->element(staff2track(staffIdx))); + if (!barline || barline->spanStaff() == 0) { + continue; + } + + Shape barlineShape = barline->shape().translate(barline->pos()); + + track_idx_t startTrack = staff2track(staffIdx); + track_idx_t endTrack = staff2track(nextStaff) + VOICES; + for (track_idx_t track = startTrack; track < endTrack; ++track) { + ChordRest* chordRest = toChordRest(crSegment->element(track)); + if (!chordRest) { + continue; + } + + for (Lyrics* lyrics : chordRest->lyrics()) { + if (!(lyrics->avoidBarlines() && lyrics->visible() && lyrics->autoplace())) { + continue; + } + staff_idx_t lyricsStaffIdx = lyrics->staffIdx(); + if ((lyricsStaffIdx == staffIdx && lyrics->placeBelow()) || (lyricsStaffIdx == nextStaff && lyrics->placeAbove())) { + Shape lyricsShape = lyrics->shape().translate(lyrics->pos()); + double minDist = crSegIsBefore ? lyricsShape.right() + barlineShape.left() : lyricsShape.left() + barlineShape.right(); + const double padding = 0.3 * lyrics->fontMetrics().xHeight(); + minDist += padding; + w = std::max(w, minDist); + } + } + } + } + + return w; +} + void HorizontalSpacing::checkLargeTimeSigAgainstRightMargin(std::vector& segPositions) { SegmentPosition& cautionaryTSSegPos = segPositions.back(); diff --git a/src/engraving/rendering/score/horizontalspacing.h b/src/engraving/rendering/score/horizontalspacing.h index 89667f31844ba..0dd08038eae82 100644 --- a/src/engraving/rendering/score/horizontalspacing.h +++ b/src/engraving/rendering/score/horizontalspacing.h @@ -108,6 +108,7 @@ class HorizontalSpacing static bool stopCheckingPreviousSegments(const SegmentPosition& prev, const SegmentPosition& curSegPos); static void checkLyricsAgainstLeftMargin(Segment* segment, double& x, HorizontalSpacingContext& ctx); static void checkLyricsAgainstRightMargin(std::vector& segPositions); + static double spaceLyricsAgainstBarlines(Segment* firstSeg, Segment* secondSeg, const HorizontalSpacingContext& ctx); static void checkLargeTimeSigAgainstRightMargin(std::vector& segPositions); static void moveRightAlignedSegments(std::vector& placedSegments, const HorizontalSpacingContext& ctx); diff --git a/src/engraving/rendering/score/lyricslayout.cpp b/src/engraving/rendering/score/lyricslayout.cpp index 22dee8f3f2d2b..2f5b81f0694db 100644 --- a/src/engraving/rendering/score/lyricslayout.cpp +++ b/src/engraving/rendering/score/lyricslayout.cpp @@ -156,8 +156,7 @@ void LyricsLayout::layout(Lyrics* item, LayoutContext& ctx) double x = o.x() - cr->x(); TLayout::layoutBaseTextBase1(item, ctx); - - item->computeHighResShape(item->fontMetrics()); + TLayout::computeTextHighResShape(item, ldata); double centerAdjust = 0.0; double leftAdjust = 0.0; diff --git a/src/engraving/rendering/score/masklayout.cpp b/src/engraving/rendering/score/masklayout.cpp new file mode 100644 index 0000000000000..9c620fa577440 --- /dev/null +++ b/src/engraving/rendering/score/masklayout.cpp @@ -0,0 +1,300 @@ +/* + * SPDX-License-Identifier: GPL-3.0-only + * MuseScore-Studio-CLA-applies + * + * MuseScore Studio + * Music Composition & Notation + * + * Copyright (C) 2023 MuseScore Limited + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "masklayout.h" + +#include "dom/barline.h" +#include "dom/chord.h" +#include "dom/lyrics.h" +#include "dom/measure.h" +#include "dom/note.h" +#include "dom/segment.h" +#include "dom/staff.h" +#include "dom/stafflines.h" +#include "dom/system.h" +#include "dom/page.h" +#include "dom/textlinebase.h" + +using namespace mu::engraving; +using namespace mu::engraving::rendering::score; + +void MaskLayout::computeMasks(LayoutContext& ctx, Page* page) +{ + std::vector tabStaves; + for (staff_idx_t staffIdx = 0; staffIdx < ctx.dom().nstaves(); ++staffIdx) { + const Staff* staff = ctx.dom().staff(staffIdx); + if (staff->isTabStaff(Fraction())) { + tabStaves.push_back(staffIdx); + } + } + + bool maskBarlines = ctx.conf().styleB(Sid::maskBarlinesForText); + + for (const System* system : page->systems()) { + for (MeasureBase* mb : system->measures()) { + if (!mb->isMeasure()) { + continue; + } + Measure* measure = toMeasure(mb); + + for (staff_idx_t staffIdx : tabStaves) { + maskTABStringLinesForFrets(measure, staffIdx, ctx); + } + + if (maskBarlines) { + for (const Segment& seg : measure->segments()) { + if (seg.isType(SegmentType::BarLineType)) { + computeBarlineMasks(&seg, system, ctx); + } + } + } + } + } +} + +void MaskLayout::computeBarlineMasks(const Segment* barlineSement, const System* system, LayoutContext& ctx) +{ + if (barlineSement->measure()->isLastInSystem() && barlineSement == barlineSement->measure()->lastEnabled()) { + return; + } + + staff_idx_t nstaves = ctx.dom().nstaves(); + + std::vector barlines; + barlines.reserve(nstaves); + + for (staff_idx_t staffIdx = 0; staffIdx < ctx.dom().nstaves(); ++staffIdx) { + if (!system->staff(staffIdx)->show()) { + continue; + } + BarLine* barline = toBarLine(barlineSement->element(staff2track(staffIdx))); + if (!barline || barline->spanStaff() == 0) { + continue; + } + maskBarlineForText(barline, staffIdx, barlineSement, system); + } +} + +void MaskLayout::maskBarlineForText(BarLine* barline, staff_idx_t staffIdx, const Segment* segment, const System* system) +{ + std::vector possibleIntersectingText = collectPossibleIntersectingText(staffIdx, segment, system); + + PointF barlinePos = barline->pagePos(); + Shape barlineShape = barline->shape().translated(barlinePos); + + Shape mask; + const double spatium = barline->spatium(); + + for (TextBase* text : possibleIntersectingText) { + const double xHeight = text->fontMetrics().xHeight(); + const double collisionPadding = 0.25 * xHeight; + const double maskPadding = std::clamp(0.5 * xHeight, 0.1 * spatium, spatium); + + PointF textPos = text->pagePos(); + Shape textShape = (text->isDynamic() ? text->ldata()->shape() : text->ldata()->highResShape()).translated(textPos); + + Shape filteredTextShape; + filteredTextShape.elements().reserve(textShape.elements().size()); + for (const ShapeElement& el : textShape.elements()) { + if (barlineShape.intersects(el.padded(collisionPadding))) { + filteredTextShape.add(el); + } + } + if (filteredTextShape.empty()) { + continue; + } + + filteredTextShape = filteredTextShape.bbox(); + filteredTextShape.pad(maskPadding); + + mask.add(filteredTextShape.translate(-barlinePos)); + } + + // Ensure that we don't leave tiny barline fragments. If two masking + // elements are too close to each other we extend them to join. + barlineShape.translate(-barlinePos); + const double minFragmentLengh = 0.5 * spatium; + cleanupMask(barlineShape, mask, minFragmentLengh); + + barline->mutldata()->setMask(mask); +} + +void MaskLayout::cleanupMask(const Shape& itemShape, Shape& mask, double minFragmentLength) +{ + for (int i = 0; i < mask.size(); ++i) { + ShapeElement& el = mask.elements()[i]; + + if (el.top() - itemShape.top() < minFragmentLength) { + el.adjust(0.0, -minFragmentLength, 0.0, 0.0); + } + if (itemShape.bottom() - el.bottom() < minFragmentLength) { + el.adjust(0.0, 0.0, 0.0, minFragmentLength); + } + + if (el.left() + itemShape.left() < minFragmentLength) { + el.adjust(-minFragmentLength, 0.0, 0.0, 0.0); + } + if (itemShape.right() - el.right() < minFragmentLength) { + el.adjust(0.0, 0.0, minFragmentLength, 0.0); + } + + for (int j = i + 1; j < mask.size(); ++j) { + ShapeElement& otherEl = mask.elements()[j]; + if (intersects(el.left(), el.right(), otherEl.left(), otherEl.right())) { + bool otherIsBelow = otherEl.y() > el.y(); + double vertClearance = otherIsBelow ? otherEl.top() - el.bottom() : el.top() - otherEl.bottom(); + if (vertClearance < minFragmentLength) { + (otherIsBelow ? el : otherEl).adjust(0.0, 0.0, 0.0, minFragmentLength); + } + } + if (intersects(el.top(), el.bottom(), otherEl.top(), el.bottom())) { + bool otherIsRight = otherEl.x() > el.x(); + double horClearance = otherIsRight ? otherEl.left() - el.right() : el.left() - otherEl.right(); + if (horClearance < minFragmentLength) { + (otherIsRight ? el : otherEl).adjust(0.0, 0.0, minFragmentLength, 0.0); + } + } + } + } +} + +std::vector MaskLayout::collectPossibleIntersectingText(staff_idx_t staffIdx, const Segment* segment, const System* system) +{ + std::vector possibleIntersectingText; + + Measure* thisMeasure = segment->measure(); + + Measure* prevMeasure = thisMeasure->prevMeasure(); + Measure* startMeasure = prevMeasure && prevMeasure->system() == system ? prevMeasure : thisMeasure; + + Measure* nextMeasure = thisMeasure->nextMeasure(); + Measure* endMeasure = nextMeasure && nextMeasure->system() == system ? nextMeasure : thisMeasure; + + staff_idx_t nextStaff = system->nextVisibleStaff(staffIdx); + track_idx_t startTrack = staff2track(staffIdx); + track_idx_t endTrack = nextStaff != muse::nidx ? staff2track(nextStaff) + VOICES : startTrack + VOICES; + + for (Segment* s = segment->prev1(Segment::CHORD_REST_OR_TIME_TICK_TYPE); s && s->measure()->isAfterOrEqual(startMeasure); + s = s->prev1(Segment::CHORD_REST_OR_TIME_TICK_TYPE)) { + for (EngravingItem* annotation : s->annotations()) { + if (annotation->isTextBase() && annotation->visible() + && annotation->track() >= startTrack && annotation->track() < endTrack) { + possibleIntersectingText.push_back(toTextBase(annotation)); + } + } + if (!s->isChordRestType()) { + continue; + } + for (track_idx_t track = startTrack; track < endTrack; ++track) { + ChordRest* cr = toChordRest(s->element(track)); + if (!cr) { + continue; + } + for (Lyrics* lyr : cr->lyrics()) { + if (lyr->visible()) { + possibleIntersectingText.push_back(lyr); + } + } + } + } + + for (Segment* s = segment->next1(Segment::CHORD_REST_OR_TIME_TICK_TYPE); s && s->measure()->isBeforeOrEqual(endMeasure); + s = s->next1(Segment::CHORD_REST_OR_TIME_TICK_TYPE)) { + for (EngravingItem* annotation : s->annotations()) { + if (annotation->isTextBase() && annotation->visible() + && annotation->track() >= startTrack && annotation->track() < endTrack) { + possibleIntersectingText.push_back(toTextBase(annotation)); + } + } + if (!s->isChordRestType()) { + continue; + } + for (track_idx_t track = startTrack; track < endTrack; ++track) { + ChordRest* cr = toChordRest(s->element(track)); + if (!cr) { + continue; + } + for (Lyrics* lyr : cr->lyrics()) { + if (lyr->visible()) { + possibleIntersectingText.push_back(lyr); + } + } + } + } + + for (SpannerSegment* spannerSegment : system->spannerSegments()) { + if (!spannerSegment->isTextLineBaseSegment()) { + continue; + } + TextLineBaseSegment* textLineBaseSegment = static_cast(spannerSegment); + Text* beginText = textLineBaseSegment->text(); + Text* endText = textLineBaseSegment->endText(); + if (beginText && !beginText->empty()) { + possibleIntersectingText.push_back(beginText); + } + if (endText && !endText->empty()) { + possibleIntersectingText.push_back(endText); + } + } + + return possibleIntersectingText; +} + +void MaskLayout::maskTABStringLinesForFrets(Measure* measure, staff_idx_t staffIdx, const LayoutContext& ctx) +{ + bool linesThrough = ctx.dom().staff(staffIdx)->staffType(Fraction())->linesThrough(); + + StaffLines* staffLines = measure->staffLines(staffIdx); + PointF staffLinesPos = staffLines->pagePos(); + + double padding = ctx.conf().styleMM(Sid::tabFretPadding); + + track_idx_t startTrack = staff2track(staffIdx); + track_idx_t endTrack = startTrack + VOICES; + + Shape mask; + + auto maskFret = [&mask, linesThrough, padding, staffLinesPos] (Chord* chord) { + for (Note* note : chord->notes()) { + if (note->visible() && !note->shouldHideFret() && (!linesThrough || note->fretConflict())) { + RectF noteShape = note->ldata()->bbox().translated(note->pagePos()); + noteShape.pad(padding); + mask.add(noteShape.translated(-staffLinesPos)); + } + } + }; + + for (Segment* seg = measure->first(SegmentType::ChordRest); seg; seg = seg->next(SegmentType::ChordRest)) { + for (track_idx_t track = startTrack; track < endTrack; ++track) { + EngravingItem* el = seg->element(track); + if (!el || !el->isChord()) { + continue; + } + maskFret(toChord(el)); + for (Chord* grace : toChord(el)->graceNotes()) { + maskFret(grace); + } + } + } + + staffLines->mutldata()->setMask(mask); +} diff --git a/src/engraving/rendering/score/masklayout.h b/src/engraving/rendering/score/masklayout.h new file mode 100644 index 0000000000000..da66ace1d40a6 --- /dev/null +++ b/src/engraving/rendering/score/masklayout.h @@ -0,0 +1,49 @@ +/* + * SPDX-License-Identifier: GPL-3.0-only + * MuseScore-Studio-CLA-applies + * + * MuseScore Studio + * Music Composition & Notation + * + * Copyright (C) 2023 MuseScore Limited + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "layoutcontext.h" + +namespace mu::engraving { +class BarLine; +class Page; +class System; +class TextBase; +} + +namespace mu::engraving::rendering::score { +class MaskLayout +{ +public: + static void computeMasks(LayoutContext& ctx, Page* page); + +private: + static void computeBarlineMasks(const Segment* barlineSement, const System* system, LayoutContext& ctx); + static void maskBarlineForText(BarLine* barline, staff_idx_t staffIdx, const Segment* segment, const System* system); + static std::vector collectPossibleIntersectingText(staff_idx_t staffIdx, const Segment* segment, const System* system); + + static void cleanupMask(const Shape& itemShape, Shape& mask, double minFragmentLength); + + static void maskTABStringLinesForFrets(Measure* measure, staff_idx_t staffIdx, const LayoutContext& ctx); +}; +} // namespace mu::engraving::rendering::score diff --git a/src/engraving/rendering/score/pagelayout.cpp b/src/engraving/rendering/score/pagelayout.cpp index 740a3060e3b74..8ed8fe5a85560 100644 --- a/src/engraving/rendering/score/pagelayout.cpp +++ b/src/engraving/rendering/score/pagelayout.cpp @@ -52,6 +52,7 @@ #include "arpeggiolayout.h" #include "beamlayout.h" #include "chordlayout.h" +#include "masklayout.h" #include "measurelayout.h" #include "slurtielayout.h" #include "systemlayout.h" @@ -402,6 +403,8 @@ void PageLayout::collectPage(LayoutContext& ctx) } } + MaskLayout::computeMasks(ctx, page); + page->invalidateBspTree(); } diff --git a/src/engraving/rendering/score/paintdebugger.cpp b/src/engraving/rendering/score/paintdebugger.cpp index 47c1762e61f19..d068f71344860 100644 --- a/src/engraving/rendering/score/paintdebugger.cpp +++ b/src/engraving/rendering/score/paintdebugger.cpp @@ -229,6 +229,11 @@ void PaintDebugger::setClipRect(const RectF& rect) m_real->setClipRect(rect); } +void PaintDebugger::setMask(const RectF& background, const std::vector& maskRects) +{ + m_real->setMask(background, maskRects); +} + void PaintDebugger::setClipping(bool enable) { m_real->setClipping(enable); diff --git a/src/engraving/rendering/score/paintdebugger.h b/src/engraving/rendering/score/paintdebugger.h index 325bc3862eb5c..9b2e16975dcd4 100644 --- a/src/engraving/rendering/score/paintdebugger.h +++ b/src/engraving/rendering/score/paintdebugger.h @@ -83,6 +83,7 @@ class PaintDebugger : public muse::draw::IPaintProvider bool hasClipping() const override; void setClipRect(const muse::RectF& rect) override; + void setMask(const muse::RectF& background, const std::vector& maskRects) override; void setClipping(bool enable) override; private: diff --git a/src/engraving/rendering/score/rendering.cmake b/src/engraving/rendering/score/rendering.cmake index bbe31506f3a5b..34645448870af 100644 --- a/src/engraving/rendering/score/rendering.cmake +++ b/src/engraving/rendering/score/rendering.cmake @@ -63,6 +63,8 @@ set(RENDERING_SCORE_SRC ${CMAKE_CURRENT_LIST_DIR}/modifydom.h ${CMAKE_CURRENT_LIST_DIR}/alignmentlayout.cpp ${CMAKE_CURRENT_LIST_DIR}/alignmentlayout.h + ${CMAKE_CURRENT_LIST_DIR}/masklayout.cpp + ${CMAKE_CURRENT_LIST_DIR}/masklayout.h ${CMAKE_CURRENT_LIST_DIR}/passbase.cpp ${CMAKE_CURRENT_LIST_DIR}/passbase.h diff --git a/src/engraving/rendering/score/tdraw.cpp b/src/engraving/rendering/score/tdraw.cpp index 0efa70dbf5764..57d61f78a2d96 100644 --- a/src/engraving/rendering/score/tdraw.cpp +++ b/src/engraving/rendering/score/tdraw.cpp @@ -680,6 +680,9 @@ void TDraw::draw(const BarLine* item, Painter* painter) { TRACE_DRAW_ITEM; + painter->save(); + setMask(item, painter); + const BarLine::LayoutData* data = item->ldata(); IF_ASSERT_FAILED(data) { return; @@ -853,6 +856,8 @@ void TDraw::draw(const BarLine* item, Painter* painter) painter->drawText(-r.width(), 0.0, ch); } } + + painter->restore(); } void TDraw::draw(const Beam* item, Painter* painter) @@ -2274,33 +2279,15 @@ void TDraw::draw(const Note* item, Painter* painter) } const Staff* st = item->staff(); const StaffType* tab = st->staffTypeForElement(item); - // draw background, if required (to hide a segment of string line or to show a fretting conflict) - if (!tab->linesThrough() || item->fretConflict()) { - double d = item->style().styleS(Sid::tabFretPadding).val() * item->spatium(); - RectF bb = RectF(ldata->bbox().x() - d, - tab->fretMaskY() * item->magS(), - ldata->bbox().width() + 2 * d, - tab->fretMaskH() * item->magS() - ); - - // we do not know which viewer did this draw() call - // so update all: - if (!item->score()->getViewer().empty()) { - for (MuseScoreView* view : item->score()->getViewer()) { - view->drawBackground(painter, bb); - } - } else { - painter->fillRect(bb, config->noteBackgroundColor()); - } - if (item->fretConflict() && !item->score()->printing() && item->score()->showUnprintable()) { //on fret conflict, draw on red background - painter->save(); - painter->setPen(config->criticalColor()); - painter->setBrush(config->criticalColor()); - painter->drawRect(bb); - painter->restore(); - } + if (item->fretConflict() && item->score()->printing() && item->score()->showUnprintable()) { //on fret conflict, draw on red background + painter->save(); + painter->setPen(config->criticalColor()); + painter->setBrush(config->criticalColor()); + painter->drawRect(ldata->bbox()); + painter->restore(); } + Font f(tab->fretFont()); f.setPointSizeF(f.pointSizeF() * item->magS() * MScore::pixelRatio); painter->setFont(f); @@ -2663,8 +2650,14 @@ void TDraw::draw(const Spacer* item, Painter* painter) void TDraw::draw(const StaffLines* item, Painter* painter) { TRACE_DRAW_ITEM; + painter->save(); + + setMask(item, painter); + painter->setPen(Pen(item->curColor(), item->lw(), PenStyle::SolidLine, PenCapStyle::FlatCap)); painter->drawLines(item->lines()); + + painter->restore(); } void TDraw::draw(const StaffState* item, Painter* painter) @@ -3269,6 +3262,20 @@ void TDraw::draw(const WhammyBarSegment* item, Painter* painter) drawTextLineBaseSegment(item, painter); } +void TDraw::setMask(const EngravingItem* item, Painter* painter) +{ + const EngravingItem::LayoutData* ldata = item->ldata(); + + const Shape& mask = ldata->mask(); + if (mask.empty()) { + return; + } + + RectF background = ldata->bbox().padded(item->spatium()); + + painter->setMask(background, mask.toRects()); +} + // dev void TDraw::draw(const System* item, Painter* painter) { diff --git a/src/engraving/rendering/score/tdraw.h b/src/engraving/rendering/score/tdraw.h index 909193680c467..2bec4beb4d228 100644 --- a/src/engraving/rendering/score/tdraw.h +++ b/src/engraving/rendering/score/tdraw.h @@ -316,5 +316,7 @@ class TDraw static void draw(const Measure* item, muse::draw::Painter* painter); static void draw(const Segment* item, muse::draw::Painter* painter); static void draw(const Chord* item, muse::draw::Painter* painter); + + static void setMask(const EngravingItem* item, muse::draw::Painter* painter); }; } diff --git a/src/engraving/rendering/score/tlayout.cpp b/src/engraving/rendering/score/tlayout.cpp index f6b3476d331f9..4bba16b754b8b 100644 --- a/src/engraving/rendering/score/tlayout.cpp +++ b/src/engraving/rendering/score/tlayout.cpp @@ -5886,6 +5886,37 @@ void TLayout::layoutBaseTextBase1(const TextBase* item, TextBase::LayoutData* ld if (item->hasFrame()) { item->layoutFrame(ldata); } + + if (!item->isDynamic() && !(item->explicitParent() && item->parent()->isBox())) { + computeTextHighResShape(item, ldata); + } +} + +void TLayout::computeTextHighResShape(const TextBase* item, TextBase::LayoutData* ldata) +{ + Shape& shape = ldata->highResShape.mut_value(); + shape.clear(); + shape.elements().reserve(item->xmlText().size()); + + for (const TextBlock& block : ldata->blocks) { + double y = block.y(); + for (const TextFragment& fragment : block.fragments()) { + FontMetrics fontMetrics = FontMetrics(fragment.font(item)); + double x = fragment.pos.x(); + size_t textSize = fragment.text.size(); + for (size_t i = 0; i < textSize; ++i) { + Char character = fragment.text.at(i); + RectF characterBoundingRect = fontMetrics.tightBoundingRect(fragment.text.at(i)); + characterBoundingRect.translate(x, y); + shape.add(characterBoundingRect); + if (i + 1 < textSize) { + x += fontMetrics.horizontalAdvance(character); + } + } + } + } + + ldata->highResShape = shape; } void TLayout::layoutBaseTextBase1(TextBase* item, const LayoutContext&) diff --git a/src/engraving/rendering/score/tlayout.h b/src/engraving/rendering/score/tlayout.h index 67f0849ccdaee..2dfb5ca1d7cb6 100644 --- a/src/engraving/rendering/score/tlayout.h +++ b/src/engraving/rendering/score/tlayout.h @@ -336,6 +336,7 @@ class TLayout static void layoutBaseTextBase(TextBase* item, LayoutContext& ctx); // base class static void layoutBaseTextBase1(TextBase* item, const LayoutContext& ctx); // base class static void layoutBaseTextBase1(const TextBase* item, TextBase::LayoutData* data); + static void computeTextHighResShape(const TextBase* item, TextBase::LayoutData* ldata); static void layoutText(const Text* item, Text::LayoutData* ldata); diff --git a/src/engraving/style/styledef.cpp b/src/engraving/style/styledef.cpp index 933fc5607fe07..505965e01ccaa 100644 --- a/src/engraving/style/styledef.cpp +++ b/src/engraving/style/styledef.cpp @@ -99,6 +99,7 @@ const std::array StyleDef::styleValue styleDef(lyricsMelismaForce, false), styleDef(lyricsMelismaMinLength, Spatium(1.0)), styleDef(lyricsDashPosAtStartOfSystem, int(LyricsDashSystemStart::STANDARD)), + styleDef(lyricsAvoidBarlines, true), styleDef(lyricsOddFontFace, "Edwin"), styleDef(lyricsOddFontSize, 10.0), @@ -148,6 +149,7 @@ const std::array StyleDef::styleValue styleDef(repeatBarTips, false), styleDef(startBarlineSingle, false), styleDef(startBarlineMultiple, true), + styleDef(maskBarlinesForText, true), styleDef(bracketWidth, Spatium(0.45)), styleDef(bracketDistance, Spatium(0.45)), diff --git a/src/engraving/style/styledef.h b/src/engraving/style/styledef.h index 4ee0e003ebf69..5b1d32600fb4c 100644 --- a/src/engraving/style/styledef.h +++ b/src/engraving/style/styledef.h @@ -115,6 +115,7 @@ enum class Sid { lyricsMelismaForce, lyricsMelismaMinLength, lyricsDashPosAtStartOfSystem, + lyricsAvoidBarlines, lyricsOddFontFace, lyricsOddFontSize, @@ -163,6 +164,7 @@ enum class Sid { repeatBarTips, startBarlineSingle, startBarlineMultiple, + maskBarlinesForText, bracketWidth, bracketDistance, diff --git a/src/framework/draw/bufferedpaintprovider.cpp b/src/framework/draw/bufferedpaintprovider.cpp index 0974ac30fcb57..800a003dfe469 100644 --- a/src/framework/draw/bufferedpaintprovider.cpp +++ b/src/framework/draw/bufferedpaintprovider.cpp @@ -344,6 +344,12 @@ void BufferedPaintProvider::setClipRect(const RectF& rect) UNUSED(rect); } +void BufferedPaintProvider::setMask(const RectF& background, const std::vector& maskRects) +{ + UNUSED(background); + UNUSED(maskRects); +} + void BufferedPaintProvider::setClipping(bool enable) { UNUSED(enable); diff --git a/src/framework/draw/bufferedpaintprovider.h b/src/framework/draw/bufferedpaintprovider.h index 21745c76554ea..8426b14015152 100644 --- a/src/framework/draw/bufferedpaintprovider.h +++ b/src/framework/draw/bufferedpaintprovider.h @@ -85,6 +85,7 @@ class BufferedPaintProvider : public IPaintProvider bool hasClipping() const override; void setClipRect(const RectF& rect) override; + void setMask(const RectF& background, const std::vector& maskRects) override; void setClipping(bool enable) override; // --- diff --git a/src/framework/draw/internal/qpainterprovider.cpp b/src/framework/draw/internal/qpainterprovider.cpp index 69e2a891c45c0..4416bb073764c 100644 --- a/src/framework/draw/internal/qpainterprovider.cpp +++ b/src/framework/draw/internal/qpainterprovider.cpp @@ -357,6 +357,27 @@ void QPainterProvider::setClipRect(const RectF& rect) m_painter->setClipRect(rect.toQRectF()); } +void QPainterProvider::setMask(const RectF& background, const std::vector& maskRects) +{ + if (maskRects.empty()) { + m_painter->setClipPath(QPainterPath(), Qt::NoClip); + return; + } + + QPainterPath backgroundPath; + backgroundPath.addRect(background.toQRectF()); + + QPainterPath exclusionRegion; + exclusionRegion.setFillRule(Qt::WindingFill); + for (const RectF& rect : maskRects) { + exclusionRegion.addRect(rect.toQRectF()); + } + + QPainterPath mask = backgroundPath.subtracted(exclusionRegion); + + m_painter->setClipPath(mask); +} + void QPainterProvider::setClipping(bool enable) { m_painter->setClipping(enable); diff --git a/src/framework/draw/internal/qpainterprovider.h b/src/framework/draw/internal/qpainterprovider.h index 0fe7421f1aa57..bd9b14ba95f79 100644 --- a/src/framework/draw/internal/qpainterprovider.h +++ b/src/framework/draw/internal/qpainterprovider.h @@ -87,6 +87,7 @@ class QPainterProvider : public IPaintProvider bool hasClipping() const override; void setClipRect(const RectF& rect) override; + void setMask(const RectF& background, const std::vector& maskRects) override; void setClipping(bool enable) override; protected: diff --git a/src/framework/draw/ipaintprovider.h b/src/framework/draw/ipaintprovider.h index 5882aa87fe8cf..95a1467bec23e 100644 --- a/src/framework/draw/ipaintprovider.h +++ b/src/framework/draw/ipaintprovider.h @@ -89,6 +89,7 @@ class IPaintProvider virtual bool hasClipping() const = 0; virtual void setClipRect(const RectF& rect) = 0; + virtual void setMask(const RectF& background, const std::vector& maskRects) = 0; virtual void setClipping(bool enable) = 0; }; diff --git a/src/framework/draw/painter.cpp b/src/framework/draw/painter.cpp index e6dad87368685..1af1ca85e30a4 100644 --- a/src/framework/draw/painter.cpp +++ b/src/framework/draw/painter.cpp @@ -543,6 +543,11 @@ void Painter::setClipRect(const RectF& rect) m_provider->setClipRect(rect); } +void Painter::setMask(const RectF& background, const std::vector& maskRects) +{ + m_provider->setMask(background, maskRects); +} + void Painter::setClipping(bool enable) { m_provider->setClipping(enable); diff --git a/src/framework/draw/painter.h b/src/framework/draw/painter.h index 5a2d2340e3236..6848589fb1e74 100644 --- a/src/framework/draw/painter.h +++ b/src/framework/draw/painter.h @@ -169,6 +169,7 @@ class Painter bool hasClipping() const; void setClipRect(const RectF& rect); + void setMask(const RectF& background, const std::vector& maskRects); void setClipping(bool enable); //! NOTE Provider for tests. diff --git a/src/framework/draw/types/geometry.h b/src/framework/draw/types/geometry.h index 83395a4d44832..e970a8b040c0b 100644 --- a/src/framework/draw/types/geometry.h +++ b/src/framework/draw/types/geometry.h @@ -356,6 +356,9 @@ class RectX inline void adjust(double xp1, double yp1, double xp2, double yp2) { m_x += xp1; m_y += yp1; m_w += xp2 - xp1; m_h += yp2 - yp1; } inline RectX adjusted(T xp1, T yp1, T xp2, T yp2) const { return RectX(m_x + xp1, m_y + yp1, m_w + xp2 - xp1, m_h + yp2 - yp1); } + inline void pad(double p) { adjust(-p, -p, p, p); } + inline RectX padded(double p) const { return adjusted(-p, -p, p, p); } + inline RectX& scale(const SizeX& mag) { m_x *= mag.width(); diff --git a/src/inspector/models/notation/lyrics/lyricssettingsmodel.cpp b/src/inspector/models/notation/lyrics/lyricssettingsmodel.cpp index d18f057529105..24bd33eeef47c 100644 --- a/src/inspector/models/notation/lyrics/lyricssettingsmodel.cpp +++ b/src/inspector/models/notation/lyrics/lyricssettingsmodel.cpp @@ -37,6 +37,7 @@ LyricsSettingsModel::LyricsSettingsModel(QObject* parent, IElementRepositoryServ void LyricsSettingsModel::createProperties() { m_verse = buildPropertyItem(mu::engraving::Pid::VERSE); + m_avoidBarlines = buildPropertyItem(mu::engraving::Pid::AVOID_BARLINES); } void LyricsSettingsModel::requestElements() @@ -47,14 +48,21 @@ void LyricsSettingsModel::requestElements() void LyricsSettingsModel::loadProperties() { loadPropertyItem(m_verse); + loadPropertyItem(m_avoidBarlines); } void LyricsSettingsModel::resetProperties() { m_verse->resetToDefault(); + m_avoidBarlines->resetToDefault(); } PropertyItem* LyricsSettingsModel::verse() const { return m_verse; } + +PropertyItem* LyricsSettingsModel::avoidBarlines() const +{ + return m_avoidBarlines; +} diff --git a/src/inspector/models/notation/lyrics/lyricssettingsmodel.h b/src/inspector/models/notation/lyrics/lyricssettingsmodel.h index 21c67435b4226..34e14e3ea41ee 100644 --- a/src/inspector/models/notation/lyrics/lyricssettingsmodel.h +++ b/src/inspector/models/notation/lyrics/lyricssettingsmodel.h @@ -30,6 +30,7 @@ class LyricsSettingsModel : public AbstractInspectorModel Q_OBJECT Q_PROPERTY(PropertyItem * verse READ verse CONSTANT) + Q_PROPERTY(PropertyItem * avoidBarlines READ avoidBarlines CONSTANT) public: explicit LyricsSettingsModel(QObject* parent, IElementRepositoryService* repository); @@ -39,9 +40,11 @@ class LyricsSettingsModel : public AbstractInspectorModel void resetProperties() override; PropertyItem* verse() const; + PropertyItem* avoidBarlines() const; private: PropertyItem* m_verse = nullptr; + PropertyItem* m_avoidBarlines = nullptr; }; } diff --git a/src/inspector/view/qml/MuseScore/Inspector/notation/lyrics/LyricsSettings.qml b/src/inspector/view/qml/MuseScore/Inspector/notation/lyrics/LyricsSettings.qml index 6f5a89f9668d1..7e735aec6917c 100644 --- a/src/inspector/view/qml/MuseScore/Inspector/notation/lyrics/LyricsSettings.qml +++ b/src/inspector/view/qml/MuseScore/Inspector/notation/lyrics/LyricsSettings.qml @@ -57,4 +57,14 @@ Column { navigationPanel: root.navigationPanel navigationRowStart: root.navigationRowStart } + + PropertyCheckBox { + navigation.name: "Avoid barlines" + navigation.panel: root.navigationPanel + navigation.row: setVerse.navigationRowEnd + 1 + + text: qsTrc("inspector", "Avoid barlines") + + propertyItem: root.model ? root.model.avoidBarlines : null + } } diff --git a/src/notation/view/widgets/editstyle.cpp b/src/notation/view/widgets/editstyle.cpp index 3f917e2fda9d3..cbd99b23db410 100644 --- a/src/notation/view/widgets/editstyle.cpp +++ b/src/notation/view/widgets/editstyle.cpp @@ -372,6 +372,7 @@ EditStyle::EditStyle(QWidget* parent) { StyleId::lyricsMelismaMinLength, false, minMelismaLength, resetMinMelismaLength }, { StyleId::lyricsMelismaForce, false, lyricsMelismaForce, resetLyricsMelismaForce }, { StyleId::lyricsDashPosAtStartOfSystem, false, lyricsDashStartSystemPlacement, resetLyricsDashStartSystemPlacement }, + { StyleId::lyricsAvoidBarlines, false, lyricsAvoidBarlines, resetLyricsAvoidBarlines }, { StyleId::systemFrameDistance, false, systemFrameDistance, resetSystemFrameDistance }, { StyleId::frameSystemDistance, false, frameSystemDistance, resetFrameSystemDistance }, @@ -554,6 +555,7 @@ EditStyle::EditStyle(QWidget* parent) { StyleId::repeatBarTips, false, showRepeatBarTips, resetShowRepeatBarTips }, { StyleId::startBarlineSingle, false, showStartBarlineSingle, resetShowStartBarlineSingle }, { StyleId::startBarlineMultiple, false, showStartBarlineMultiple, resetShowStartBarlineMultiple }, + { StyleId::maskBarlinesForText, false, maskBarlines, resetMaskBarlines }, { StyleId::dividerLeftSym, false, dividerLeftSym, 0 }, { StyleId::dividerRightSym, false, dividerRightSym, 0 }, diff --git a/src/notation/view/widgets/editstyle.ui b/src/notation/view/widgets/editstyle.ui index dfa037b89b6d9..a54ee056e1edc 100644 --- a/src/notation/view/widgets/editstyle.ui +++ b/src/notation/view/widgets/editstyle.ui @@ -289,7 +289,7 @@ 0 0 - 409 + 591 523 @@ -4939,8 +4939,8 @@ 0 0 - 249 - 485 + 595 + 508 @@ -4950,18 +4950,18 @@ Barlines - - + + - Double barline thickness: + Double barline distance: - doubleBarWidth + doubleBarDistance - - + + false @@ -4973,7 +4973,20 @@ - + + + + Reset to default + + + Reset 'Double barline distance' value + + + + + + + Reset to default @@ -4986,7 +4999,40 @@ - + + + + false + + + sp + + + 0.010000000000000 + + + + + + + false + + + sp + + + 0.010000000000000 + + + + + + + Barline at start of single staff + + + + Reset to default @@ -4999,23 +5045,26 @@ - - - - Thin barline thickness: + + + + Reset to default - - barWidth + + Reset 'Double barline thickness' value + + + - - + + Reset to default - Reset 'Barline at start of multiple staves' value + Reset 'Thick barline thickness' value @@ -5032,7 +5081,7 @@ - + false @@ -5045,16 +5094,13 @@ - - - - false - - - sp + + + + Thick barline thickness: - - 0.010000000000000 + + endBarWidth @@ -5071,66 +5117,33 @@ - - - - false - - - sp - - - 0.010000000000000 - - - - - + + Reset to default - Reset 'Repeat barline to dots distance' value + Reset 'Barline at start of single staff' value - - - - Show repeat barline tips (“winged” repeats) - - - - - + + Reset to default - Reset 'Thick barline distance' value + Reset 'Scale barlines to staff size' value - - - - false - - - sp - - - 0.010000000000000 - - - - + Thick barline distance: @@ -5140,54 +5153,61 @@ - - + + - Scale barlines to staff size + Repeat barline to dots distance: + + + repeatBarlineDotSeparation - - - - Reset to default + + + + Thin barline thickness: - - Reset 'Double barline distance' value + + barWidth + + + + - + Scale barlines to staff size - + Reset to default - Reset 'Barline at start of single staff' value + Reset 'Barline at start of multiple staves' value - - + + Reset to default - Reset 'Scale barlines to staff size' value + Reset 'Repeat barline to dots distance' value - - + + false @@ -5199,66 +5219,63 @@ - - - - Reset to default - - - Reset 'Double barline thickness' value - + + - + Show repeat barline tips (“winged” repeats) - - - - Thick barline thickness: - - - endBarWidth + + + + false - - - - - - Repeat barline to dots distance: + + sp - - repeatBarlineDotSeparation + + 0.010000000000000 - + - Double barline distance: + Double barline thickness: - doubleBarDistance + doubleBarWidth - - + + Reset to default - Reset 'Thick barline thickness' value + Reset 'Thick barline distance' value - - + + + + Mask barlines + - Barline at start of single staff + Mask barlines when intersecting text + + + + + + + @@ -11570,7 +11587,7 @@ 0 0 469 - 461 + 484 @@ -11594,17 +11611,86 @@ - - - - - sp + + + + + + 0 + 0 + + + + false + + + sp + + + 1 - -99.989999999999995 + -100.000000000000000 - 0.100000000000000 + 0.500000000000000 + + + + + + + + 0 + 0 + + + + false + + + sp + + + 1 + + + -100.000000000000000 + + + 0.500000000000000 + + + + + + + + 120 + 16777215 + + + + Reset to default + + + Reset 'Align verse number' value + + + + + + + + + + Reset to default + + + Reset 'Min. distance' value + + + @@ -11631,48 +11717,78 @@ - - + + + + + 0 + 0 + + + + Position below: + + + + + Reset to default - Reset 'Line height' value + Reset 'Min. top margin' value - - - - - 0 - 0 - + + + + Reset to default + + + Reset 'Placement' value - Position below: + - - - - false + + + + Min. margin to other staves: - - sp + + lyricsMinBottomDistance - - 2 + + + + + + Reset to default - - -100.000000000000000 + + Reset 'Position below' value - - 0.050000000000000 + + + + + + + + + Reset to default + + + Reset 'Line height' value + + + @@ -11698,16 +11814,38 @@ - - - - Reset to default + + + + false - - Reset 'Position below' value + + % + + + 50.000000000000000 + + + 1000.000000000000000 + + + + + + + + 0 + 0 + + + + + 0 + 0 + - + Align verse number @@ -11730,39 +11868,8 @@ - - - - - 0 - 0 - - - - false - - - sp - - - 1 - - - -100.000000000000000 - - - 0.500000000000000 - - - - - - - - 0 - 0 - - + + false @@ -11770,41 +11877,34 @@ sp - 1 + 2 -100.000000000000000 - 0.500000000000000 - - - - - - - Min. margin to other staves: - - - lyricsMinBottomDistance + 0.050000000000000 - - - - Reset to default + + + + Qt::Horizontal - - Reset 'Placement' value + + QSizePolicy::Minimum - - + + + 16 + 20 + - + - - + + 0 @@ -11818,7 +11918,10 @@ - Align verse number + Line height (% of text size): + + + lyricsLineHeight @@ -11854,19 +11957,16 @@ - - - - false - + + - % + sp - 50.000000000000000 + -99.989999999999995 - - 1000.000000000000000 + + 0.100000000000000 @@ -11883,112 +11983,49 @@ - - - - - 0 - 0 - + + + + Reset to default - - Position: + + Reset 'Min. bottom margin' value - - lyricsPlacement + + - - - - Qt::Horizontal - - - QSizePolicy::Minimum - - - - 16 - 20 - - - - - - + + 0 0 - - - 0 - 0 - - - Line height (% of text size): + Position: - lyricsLineHeight - - - - - - - - 120 - 16777215 - - - - Reset to default - - - Reset 'Align verse number' value - - - - - - - - - - Reset to default - - - Reset 'Min. top margin' value - - - + lyricsPlacement - - - - Reset to default - + + - Reset 'Min. distance' value + Avoid barlines - + Avoid barlines - - - - Reset to default - + + - Reset 'Min. bottom margin' value + Reset avoid barlines From 4f30359afccd3b7ebea4e827680626dcc0c0ae71 Mon Sep 17 00:00:00 2001 From: Michele Spagnolo Date: Mon, 27 Jan 2025 13:26:05 +0100 Subject: [PATCH 2/6] add debug paint mask option --- src/appshell/view/appmenumodel.cpp | 1 + src/engraving/iengravingconfiguration.h | 2 ++ src/engraving/rendering/score/debugpaint.cpp | 14 ++++++++++++++ src/notation/internal/notationactioncontroller.cpp | 1 + src/notation/internal/notationuiactions.cpp | 6 ++++++ 5 files changed, 24 insertions(+) diff --git a/src/appshell/view/appmenumodel.cpp b/src/appshell/view/appmenumodel.cpp index 00f66d284ba6d..ef7a3f400095c 100644 --- a/src/appshell/view/appmenumodel.cpp +++ b/src/appshell/view/appmenumodel.cpp @@ -460,6 +460,7 @@ MenuItem* AppMenuModel::makeDiagnosticsMenu() makeMenuItem("color-segment-shapes"), makeMenuItem("show-skylines"), makeMenuItem("show-system-bounding-rects"), + makeMenuItem("show-element-masks"), makeMenuItem("show-corrupted-measures") }; diff --git a/src/engraving/iengravingconfiguration.h b/src/engraving/iengravingconfiguration.h index d19f3c6447fbe..17d2466ce421c 100644 --- a/src/engraving/iengravingconfiguration.h +++ b/src/engraving/iengravingconfiguration.h @@ -101,6 +101,7 @@ class IEngravingConfiguration : MODULE_EXPORT_INTERFACE bool colorSegmentShapes = false; bool showSkylines = false; bool showSystemBoundingRects = false; + bool showElementMasks = false; bool showCorruptedMeasures = true; bool anyEnabled() const @@ -111,6 +112,7 @@ class IEngravingConfiguration : MODULE_EXPORT_INTERFACE || colorSegmentShapes || showSkylines || showSystemBoundingRects + || showElementMasks #ifndef NDEBUG || showCorruptedMeasures #endif diff --git a/src/engraving/rendering/score/debugpaint.cpp b/src/engraving/rendering/score/debugpaint.cpp index a0a9ed4426b69..73aadcddf5838 100644 --- a/src/engraving/rendering/score/debugpaint.cpp +++ b/src/engraving/rendering/score/debugpaint.cpp @@ -96,6 +96,20 @@ void DebugPaint::paintElementDebug(Painter& painter, const EngravingItem* item) painter.drawPath(path); } + if (item->configuration()->debuggingOptions().showElementMasks) { + PainterPath path; + path.setFillRule(PainterPath::FillRule::WindingFill); + for (const ShapeElement& el : item->ldata()->mask().elements()) { + path.addRect(el); + } + + painter.setPen(Color::BLACK); + Brush brush(Color::BLACK); + brush.setStyle(BrushStyle::BDiagPattern); + painter.setBrush(brush); + painter.drawPath(path); + } + // Draw bbox if (isDiagnosticSelected || item->configuration()->debuggingOptions().showElementBoundingRects) { double scaling = painter.worldTransform().m11() / item->configuration()->guiScaling(); diff --git a/src/notation/internal/notationactioncontroller.cpp b/src/notation/internal/notationactioncontroller.cpp index 82f6865b81fe1..9f50fa1a2aaf6 100644 --- a/src/notation/internal/notationactioncontroller.cpp +++ b/src/notation/internal/notationactioncontroller.cpp @@ -69,6 +69,7 @@ const std::unordered_map Notation { "color-segment-shapes", &EngravingDebuggingOptions::colorSegmentShapes }, { "show-skylines", &EngravingDebuggingOptions::showSkylines }, { "show-system-bounding-rects", &EngravingDebuggingOptions::showSystemBoundingRects }, + { "show-element-masks", &EngravingDebuggingOptions::showElementMasks }, { "show-corrupted-measures", &EngravingDebuggingOptions::showCorruptedMeasures } }; diff --git a/src/notation/internal/notationuiactions.cpp b/src/notation/internal/notationuiactions.cpp index c75f9a43fa902..2f275d67a6e8b 100644 --- a/src/notation/internal/notationuiactions.cpp +++ b/src/notation/internal/notationuiactions.cpp @@ -2588,6 +2588,12 @@ const UiActionList NotationUiActions::m_engravingDebuggingActions = { TranslatableString("action", "Show system bounding rectangles"), Checkable::Yes ), + UiAction("show-element-masks", + mu::context::UiCtxProjectOpened, + mu::context::CTX_NOTATION_OPENED, + TranslatableString("action", "Show element masks"), + Checkable::Yes + ), UiAction("show-corrupted-measures", mu::context::UiCtxProjectOpened, mu::context::CTX_NOTATION_OPENED, From b2ed37430196d28bb1c4d5246a87f11b7c991c74 Mon Sep 17 00:00:00 2001 From: Michele Spagnolo Date: Tue, 28 Jan 2025 10:44:57 +0100 Subject: [PATCH 3/6] Style compatibility --- src/engraving/style/style.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/engraving/style/style.cpp b/src/engraving/style/style.cpp index 78c552ab3eb26..31a3a26568691 100644 --- a/src/engraving/style/style.cpp +++ b/src/engraving/style/style.cpp @@ -539,8 +539,9 @@ void MStyle::read(XmlReader& e, compat::ReadChordListHook* readChordListHook) } if (m_version < 450) { - // Doesn't exist before 4.5. Default to false for compatibility. + // Didn't exist before 4.5. Default to false for compatibility. set(Sid::scaleRythmicSpacingForSmallNotes, false); + set(Sid::maskBarlinesForText, false); } if (m_version < 420 && !MScore::testMode) { From 0d64400308f6dcad1488fdb6e294632a8dcaea54 Mon Sep 17 00:00:00 2001 From: Michele Spagnolo Date: Tue, 28 Jan 2025 15:17:56 +0100 Subject: [PATCH 4/6] Fix unit tests for new style --- src/engraving/tests/beam_data/Beam-A.mscx | 1 + src/engraving/tests/beam_data/Beam-B.mscx | 1 + src/engraving/tests/beam_data/Beam-C.mscx | 1 + src/engraving/tests/beam_data/Beam-D.mscx | 1 + src/engraving/tests/beam_data/Beam-E.mscx | 1 + src/engraving/tests/beam_data/Beam-F.mscx | 1 + src/engraving/tests/beam_data/Beam-G.mscx | 1 + src/engraving/tests/beam_data/beamNoSlope.mscx | 1 + src/engraving/tests/beam_data/beamPositions.mscx | 1 + src/engraving/tests/beam_data/beamStemDir-01-ref.mscx | 1 + src/engraving/tests/beam_data/flatBeams-ref.mscx | 1 + src/engraving/tests/beam_data/flipBeamStemDir-01-ref.mscx | 1 + src/engraving/tests/beam_data/flippedDirection.mscx | 1 + src/engraving/tests/beam_data/wideBeams.mscx | 1 + src/engraving/tests/box_data/undoRemoveVBox1-ref.mscx | 1 + src/engraving/tests/box_data/undoRemoveVBox2-ref.mscx | 1 + src/engraving/tests/breath_data/breath01-ref.mscx | 1 + src/engraving/tests/breath_data/breath02-ref.mscx | 1 + src/engraving/tests/chordsymbol_data/add-link-ref.mscx | 1 + src/engraving/tests/chordsymbol_data/add-part-ref.mscx | 2 ++ src/engraving/tests/chordsymbol_data/clear-ref.mscx | 1 + src/engraving/tests/chordsymbol_data/extend-ref.mscx | 1 + src/engraving/tests/chordsymbol_data/no-system-ref.mscx | 1 + src/engraving/tests/chordsymbol_data/realize-3note-ref.mscx | 1 + src/engraving/tests/chordsymbol_data/realize-4note-ref.mscx | 1 + src/engraving/tests/chordsymbol_data/realize-6note-ref.mscx | 1 + src/engraving/tests/chordsymbol_data/realize-close-ref.mscx | 1 + .../tests/chordsymbol_data/realize-concert-pitch-ref.mscx | 1 + src/engraving/tests/chordsymbol_data/realize-drop2-ref.mscx | 1 + src/engraving/tests/chordsymbol_data/realize-duration-ref.mscx | 1 + src/engraving/tests/chordsymbol_data/realize-jazz-ref.mscx | 1 + src/engraving/tests/chordsymbol_data/realize-override-ref.mscx | 1 + .../tests/chordsymbol_data/realize-transpose-ref.mscx | 1 + src/engraving/tests/chordsymbol_data/realize-triplet-ref.mscx | 1 + src/engraving/tests/chordsymbol_data/transpose-part-ref.mscx | 2 ++ src/engraving/tests/chordsymbol_data/transpose-ref.mscx | 1 + .../tests/clef_courtesy_data/clef_courtesy01-ref.mscx | 1 + .../tests/clef_courtesy_data/clef_courtesy02-ref.mscx | 1 + .../tests/clef_courtesy_data/clef_courtesy03-ref.mscx | 1 + .../tests/clef_courtesy_data/clef_courtesy04-ref.mscx | 1 + src/engraving/tests/clef_data/clef-1-ref.mscx | 1 + src/engraving/tests/clef_data/clef-2-ref.mscx | 1 + src/engraving/tests/clef_data/clef-3-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste01-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste02-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste03-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste04-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste05-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste06-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste08-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste09-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste10-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste11-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste12-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste13-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste17-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste18-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste19-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste20-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste22-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste23-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste24-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste25-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste26-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypaste50-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypasteNote01-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypasteNote02-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypasteNote03-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypasteNote04-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypasteNote05-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypasteNote06-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypasteNote07-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypasteNote08-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypasteNote09-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypasteNote10-ref.mscx | 1 + src/engraving/tests/copypaste_data/copypasteNote11-ref.mscx | 1 + .../tests/copypaste_data/copypaste_partial_01-ref.mscx | 1 + .../tests/copypaste_data/copypaste_tuplet_01-ref.mscx | 1 + .../tests/copypaste_data/copypaste_tuplet_02-ref.mscx | 1 + .../copypastesymbollist-articulation-ref.mscx | 1 + .../copypastesymbollist-articulation-rest-ref.mscx | 1 + .../copypastesymbollist-chordnames-01-ref.mscx | 1 + .../copypastesymbollist-chordnames-ref.mscx | 1 + .../copypastesymbollist-lyrics-ref.mscx | 1 + .../copypastesymbollist-range-01-ref.mscx | 1 + .../copypastesymbollist-range-ref.mscx | 1 + .../copypastesymbollist-stafftext-ref.mscx | 1 + .../copypastesymbollist-sticking-ref.mscx | 1 + src/engraving/tests/earlymusic_data/mensurstrich01-ref.mscx | 1 + src/engraving/tests/earlymusic_data/mensurstrich01.mscx | 1 + .../tests/exchangevoices_data/exchangevoices-gliss-ref.mscx | 1 + .../tests/exchangevoices_data/exchangevoices-slurs-ref.mscx | 1 + .../tests/exchangevoices_data/undoChangeVoice01-ref.mscx | 2 ++ .../tests/exchangevoices_data/undoChangeVoice02-ref.mscx | 2 ++ src/engraving/tests/harpdiagrams_data/textdiagram01-ref.mscx | 1 + src/engraving/tests/harpdiagrams_data/textdiagram02.mscx | 1 + .../tests/implode_explode_data/implodeScore01-ref.mscx | 1 + .../tests/implode_explode_data/implodeScore02-ref.mscx | 1 + .../tests/implode_explode_data/undoExplode01-ref.mscx | 1 + .../tests/implode_explode_data/undoExplode02-ref.mscx | 1 + .../tests/implode_explode_data/undoImplode01-ref.mscx | 1 + .../tests/implode_explode_data/undoImplode02-ref.mscx | 1 + .../tests/implode_explode_data/undoImplodeVoice01-ref.mscx | 1 + .../tests/implode_explode_data/undoImplodeVoice02-ref.mscx | 1 + src/engraving/tests/instrumentchange_data/add-ref.mscx | 1 + src/engraving/tests/instrumentchange_data/change-ref.mscx | 1 + src/engraving/tests/instrumentchange_data/copy-ref.mscx | 1 + src/engraving/tests/instrumentchange_data/delete-ref.mscx | 1 + src/engraving/tests/instrumentchange_data/mixer-ref.mscx | 1 + src/engraving/tests/join_data/join01-ref.mscx | 1 + src/engraving/tests/join_data/join02-ref.mscx | 1 + src/engraving/tests/join_data/join03-ref.mscx | 1 + src/engraving/tests/join_data/join04-ref.mscx | 1 + src/engraving/tests/join_data/join05-ref.mscx | 1 + src/engraving/tests/join_data/join06-ref.mscx | 1 + src/engraving/tests/join_data/join07-ref.mscx | 1 + src/engraving/tests/keysig_data/concert-pitch-01-ref.mscx | 1 + src/engraving/tests/keysig_data/concert-pitch-02-ref.mscx | 1 + src/engraving/tests/keysig_data/keysig.mscx | 1 + src/engraving/tests/keysig_data/keysig01-ref.mscx | 1 + src/engraving/tests/keysig_data/keysig02-ref.mscx | 1 + src/engraving/tests/keysig_data/keysig03-ref.mscx | 1 + src/engraving/tests/keysig_data/preferSharpFlat-1-ref.mscx | 1 + src/engraving/tests/keysig_data/preferSharpFlat-2-ref.mscx | 1 + src/engraving/tests/measure_data/measure-10-ref.mscx | 1 + src/engraving/tests/measure_data/measure-4-ref.mscx | 1 + src/engraving/tests/measure_data/measure-5-ref.mscx | 1 + src/engraving/tests/measure_data/measure-6-ref.mscx | 1 + src/engraving/tests/measure_data/measure-7-ref.mscx | 1 + src/engraving/tests/measure_data/measure-8-ref.mscx | 1 + src/engraving/tests/measure_data/measure-9-ref.mscx | 1 + .../tests/measure_data/measure-insert_beginning-ref.mscx | 1 + .../tests/measure_data/measure-insert_bf_clef-2-ref.mscx | 1 + .../tests/measure_data/measure-insert_bf_clef-ref.mscx | 1 + src/engraving/tests/measure_data/measure-insert_bf_clef.mscx | 1 + .../tests/measure_data/measure-insert_bf_key-2-ref.mscx | 1 + .../tests/measure_data/measure-insert_bf_key-ref.mscx | 1 + .../tests/measure_data/measure-insert_bf_key_undo-ref.mscx | 1 + src/engraving/tests/measure_data/measurenumber-1-ref.mscx | 1 + src/engraving/tests/measure_data/measurenumber-2-ref.mscx | 1 + src/engraving/tests/measure_data/measurenumber-3-ref.mscx | 1 + src/engraving/tests/measure_data/measurenumber-4-ref.mscx | 1 + src/engraving/tests/measure_data/measurenumber-5-ref.mscx | 1 + src/engraving/tests/measure_data/measurenumber-6-ref.mscx | 1 + src/engraving/tests/measure_data/measurenumber-7-ref.mscx | 1 + src/engraving/tests/measure_data/mmrest-ref.mscx | 1 + .../tests/measure_data/undoDelInitialVBox_269919-ref.mscx | 1 + src/engraving/tests/note_data/grace-ref.mscx | 1 + src/engraving/tests/note_data/notelimits-ref.mscx | 1 + src/engraving/tests/note_data/tpc-ref.mscx | 1 + src/engraving/tests/note_data/tpc-transpose-ref.mscx | 1 + src/engraving/tests/note_data/tpc-transpose2-ref.mscx | 1 + src/engraving/tests/parts_data/part-54346-parts.mscx | 1 + src/engraving/tests/parts_data/part-54346.mscx | 1 + src/engraving/tests/parts_data/part-all-appendmeasures.mscx | 1 + src/engraving/tests/parts_data/part-all-insertmeasures.mscx | 1 + src/engraving/tests/parts_data/part-all-parts.mscx | 1 + src/engraving/tests/parts_data/part-all-uappendmeasures.mscx | 1 + src/engraving/tests/parts_data/part-all-uinsertmeasures.mscx | 1 + src/engraving/tests/parts_data/part-all.mscx | 1 + src/engraving/tests/parts_data/part-breath-add.mscx | 3 +++ src/engraving/tests/parts_data/part-breath-del.mscx | 3 +++ src/engraving/tests/parts_data/part-breath-parts.mscx | 1 + src/engraving/tests/parts_data/part-breath-uadd.mscx | 3 +++ src/engraving/tests/parts_data/part-breath-udel.mscx | 3 +++ src/engraving/tests/parts_data/part-breath-uradd.mscx | 3 +++ src/engraving/tests/parts_data/part-breath-urdel.mscx | 3 +++ src/engraving/tests/parts_data/part-breath.mscx | 1 + src/engraving/tests/parts_data/part-chordline-add.mscx | 3 +++ src/engraving/tests/parts_data/part-chordline-del.mscx | 3 +++ src/engraving/tests/parts_data/part-chordline-parts.mscx | 1 + src/engraving/tests/parts_data/part-chordline-uadd.mscx | 3 +++ src/engraving/tests/parts_data/part-chordline-udel.mscx | 3 +++ src/engraving/tests/parts_data/part-chordline-uradd.mscx | 3 +++ src/engraving/tests/parts_data/part-chordline-urdel.mscx | 3 +++ src/engraving/tests/parts_data/part-chordline.mscx | 1 + src/engraving/tests/parts_data/part-empty-parts.mscx | 1 + src/engraving/tests/parts_data/part-empty.mscx | 1 + src/engraving/tests/parts_data/part-fingering-add.mscx | 3 +++ src/engraving/tests/parts_data/part-fingering-del.mscx | 3 +++ src/engraving/tests/parts_data/part-fingering-parts.mscx | 1 + src/engraving/tests/parts_data/part-fingering-uadd.mscx | 3 +++ src/engraving/tests/parts_data/part-fingering-udel.mscx | 3 +++ src/engraving/tests/parts_data/part-fingering-uradd.mscx | 3 +++ src/engraving/tests/parts_data/part-fingering-urdel.mscx | 3 +++ src/engraving/tests/parts_data/part-fingering.mscx | 1 + src/engraving/tests/parts_data/part-image-add.mscx | 3 +++ src/engraving/tests/parts_data/part-image-del.mscx | 3 +++ src/engraving/tests/parts_data/part-image-parts.mscx | 1 + src/engraving/tests/parts_data/part-image-uadd.mscx | 3 +++ src/engraving/tests/parts_data/part-image-udel.mscx | 3 +++ src/engraving/tests/parts_data/part-image-uradd.mscx | 3 +++ src/engraving/tests/parts_data/part-image-urdel.mscx | 3 +++ src/engraving/tests/parts_data/part-image.mscx | 1 + src/engraving/tests/parts_data/part-measure-repeat-add.mscx | 3 +++ src/engraving/tests/parts_data/part-measure-repeat-uadd.mscx | 3 +++ src/engraving/tests/parts_data/part-measure-repeat-uradd.mscx | 3 +++ src/engraving/tests/parts_data/part-stemless-parts.mscx | 1 + src/engraving/tests/parts_data/part-stemless.mscx | 1 + src/engraving/tests/parts_data/part-symbol-add.mscx | 3 +++ src/engraving/tests/parts_data/part-symbol-del.mscx | 3 +++ src/engraving/tests/parts_data/part-symbol-parts.mscx | 1 + src/engraving/tests/parts_data/part-symbol-uadd.mscx | 3 +++ src/engraving/tests/parts_data/part-symbol-udel.mscx | 3 +++ src/engraving/tests/parts_data/part-symbol-uradd.mscx | 3 +++ src/engraving/tests/parts_data/part-symbol-urdel.mscx | 3 +++ src/engraving/tests/parts_data/part-symbol.mscx | 1 + .../tests/parts_data/part-visible-tracks-part-ref.mscx | 1 + .../tests/parts_data/part-visible-tracks-score-ref.mscx | 1 + src/engraving/tests/parts_data/partStyle-score-ref.mscx | 1 + src/engraving/tests/parts_data/partStyle-score-reload-ref.mscx | 3 +++ src/engraving/tests/parts_data/voices-ref.mscx | 1 + src/engraving/tests/readwriteundoreset_data/barlines.mscx | 1 + .../mmrestBarlineTextLinks-disable-mmrest-ref.mscx | 1 + .../mmrestBarlineTextLinks-recreate-mmrest-ref.mscx | 1 + .../tests/readwriteundoreset_data/mmrestBarlineTextLinks.mscx | 1 + src/engraving/tests/readwriteundoreset_data/slurs.mscx | 1 + .../tests/rhythmicGrouping_data/group8ths4-4-ref.mscx | 1 + .../tests/rhythmicGrouping_data/group8thsCompound-ref.mscx | 1 + .../tests/rhythmicGrouping_data/group8thsSimple-ref.mscx | 1 + .../rhythmicGrouping_data/groupArticulationsTies-ref.mscx | 1 + .../tests/rhythmicGrouping_data/groupConflicts-ref.mscx | 1 + .../tests/rhythmicGrouping_data/groupShortenNotes-ref.mscx | 1 + .../tests/rhythmicGrouping_data/groupSubbeats-ref.mscx | 1 + src/engraving/tests/rhythmicGrouping_data/groupVoices-ref.mscx | 1 + .../selectionrangedelete_data/selectionrangedelete03-ref.mscx | 1 + .../selectionrangedelete_data/selectionrangedelete04-ref.mscx | 1 + .../selectionrangedelete_data/selectionrangedelete05-ref.mscx | 1 + .../selectionrangedelete06_partialnestedtuplets-ref.mscx | 1 + src/engraving/tests/spanners_data/glissando-cloning01-ref.mscx | 1 + src/engraving/tests/spanners_data/glissando-cloning03-ref.mscx | 1 + src/engraving/tests/spanners_data/glissando-cloning04-ref.mscx | 2 ++ .../tests/spanners_data/glissando-crossstaff01-ref.mscx | 1 + src/engraving/tests/spanners_data/glissando-graces01-ref.mscx | 1 + src/engraving/tests/spanners_data/glissando01-ref.mscx | 1 + src/engraving/tests/spanners_data/linecolor01-ref.mscx | 1 + src/engraving/tests/spanners_data/lyricsline02-ref.mscx | 1 + src/engraving/tests/spanners_data/lyricsline02.mscx | 1 + src/engraving/tests/spanners_data/lyricsline03-ref.mscx | 1 + src/engraving/tests/spanners_data/lyricsline03.mscx | 1 + src/engraving/tests/spanners_data/lyricsline04-ref.mscx | 1 + src/engraving/tests/spanners_data/lyricsline04.mscx | 1 + src/engraving/tests/spanners_data/lyricsline05-ref.mscx | 1 + src/engraving/tests/spanners_data/lyricsline05.mscx | 1 + src/engraving/tests/spanners_data/smallstaff01-ref.mscx | 1 + src/engraving/tests/split_data/split01-ref.mscx | 1 + src/engraving/tests/split_data/split02-ref.mscx | 1 + src/engraving/tests/split_data/split03-ref.mscx | 1 + src/engraving/tests/split_data/split04-ref.mscx | 1 + src/engraving/tests/split_data/split05-ref.mscx | 1 + src/engraving/tests/split_data/split06-ref.mscx | 1 + src/engraving/tests/split_data/split07-ref.mscx | 1 + src/engraving/tests/split_data/split08-ref.mscx | 1 + .../split184061-keep-tie-before-break-voice-4-ref.mscx | 1 + src/engraving/tests/split_data/split184061-keep-tie-ref.mscx | 1 + src/engraving/tests/split_data/split184061-no-tie-ref.mscx | 1 + .../split_data/split184061-other-inst-only-one-tie-ref.mscx | 1 + src/engraving/tests/split_data/split295207-ref.mscx | 1 + src/engraving/tests/splitstaff_data/splitstaff01-ref.mscx | 1 + src/engraving/tests/splitstaff_data/splitstaff02-ref.mscx | 1 + src/engraving/tests/splitstaff_data/splitstaff03-ref.mscx | 1 + src/engraving/tests/splitstaff_data/splitstaff04-ref.mscx | 1 + src/engraving/tests/splitstaff_data/splitstaff05-ref.mscx | 1 + src/engraving/tests/splitstaff_data/splitstaff06-ref.mscx | 1 + src/engraving/tests/staffmove_data/hiddenStaff-ref.mscx | 1 + src/engraving/tests/staffmove_data/hiddenStaff.mscx | 1 + src/engraving/tests/staffmove_data/linkedStaff-ref.mscx | 1 + src/engraving/tests/staffmove_data/linkedStaff.mscx | 1 + src/engraving/tests/timesig_data/timesig-02-ref.mscx | 1 + src/engraving/tests/timesig_data/timesig-03-ref.mscx | 1 + src/engraving/tests/timesig_data/timesig-04-ref.mscx | 1 + src/engraving/tests/timesig_data/timesig-05-ref.mscx | 1 + src/engraving/tests/timesig_data/timesig-06-ref.mscx | 1 + src/engraving/tests/timesig_data/timesig-07-ref.mscx | 1 + src/engraving/tests/timesig_data/timesig-10-ref.mscx | 1 + src/engraving/tests/timesig_data/timesig01-ref.mscx | 1 + src/engraving/tests/tools_data/undoResequenceAlpha01-ref.mscx | 1 + src/engraving/tests/tools_data/undoResequenceAlpha02-ref.mscx | 1 + .../tests/tools_data/undoResequenceMeasure01-ref.mscx | 1 + .../tests/tools_data/undoResequenceMeasure02-ref.mscx | 1 + .../tests/tools_data/undoResequenceNumeric01-ref.mscx | 1 + .../tests/tools_data/undoResequenceNumeric02-ref.mscx | 1 + src/engraving/tests/tools_data/undoResequencePart01-ref.mscx | 2 ++ src/engraving/tests/tools_data/undoResequencePart02-ref.mscx | 2 ++ src/engraving/tests/tools_data/undoSlashFill01-ref.mscx | 1 + src/engraving/tests/tools_data/undoSlashFill02-ref.mscx | 1 + src/engraving/tests/tools_data/undoSlashRhythm01-ref.mscx | 1 + src/engraving/tests/tools_data/undoSlashRhythm02-ref.mscx | 1 + .../tests/transpose_data/undoDiatonicTranspose01-ref.mscx | 1 + .../tests/transpose_data/undoDiatonicTranspose02-ref.mscx | 1 + src/engraving/tests/transpose_data/undoTranspose01-ref.mscx | 1 + src/engraving/tests/transpose_data/undoTranspose02-ref.mscx | 1 + .../tests/tuplet_data/nestedTuplets_addStaff-ref.mscx | 1 + src/engraving/tests/tuplet_data/save-load.mscx | 1 + src/engraving/tests/tuplet_data/split1-ref.mscx | 1 + src/engraving/tests/tuplet_data/split2-ref.mscx | 1 + src/engraving/tests/tuplet_data/split3-ref.mscx | 1 + src/engraving/tests/tuplet_data/split4-ref.mscx | 1 + src/engraving/tests/tuplet_data/tuplet1-ref.mscx | 1 + 299 files changed, 374 insertions(+) diff --git a/src/engraving/tests/beam_data/Beam-A.mscx b/src/engraving/tests/beam_data/Beam-A.mscx index 1e53f922f4b9c..44fd4347c971f 100644 --- a/src/engraving/tests/beam_data/Beam-A.mscx +++ b/src/engraving/tests/beam_data/Beam-A.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/beam_data/Beam-B.mscx b/src/engraving/tests/beam_data/Beam-B.mscx index 44db4a42b9661..3686def9bd3c3 100644 --- a/src/engraving/tests/beam_data/Beam-B.mscx +++ b/src/engraving/tests/beam_data/Beam-B.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/beam_data/Beam-C.mscx b/src/engraving/tests/beam_data/Beam-C.mscx index 0ae52d4fe6aea..9cd5d10dd08f8 100644 --- a/src/engraving/tests/beam_data/Beam-C.mscx +++ b/src/engraving/tests/beam_data/Beam-C.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/beam_data/Beam-D.mscx b/src/engraving/tests/beam_data/Beam-D.mscx index e3da2b495583b..798fca55f3722 100644 --- a/src/engraving/tests/beam_data/Beam-D.mscx +++ b/src/engraving/tests/beam_data/Beam-D.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/beam_data/Beam-E.mscx b/src/engraving/tests/beam_data/Beam-E.mscx index a940937bd4620..ef8f9aed18e91 100644 --- a/src/engraving/tests/beam_data/Beam-E.mscx +++ b/src/engraving/tests/beam_data/Beam-E.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/beam_data/Beam-F.mscx b/src/engraving/tests/beam_data/Beam-F.mscx index 52f9e41999720..e4edcfd560c1a 100644 --- a/src/engraving/tests/beam_data/Beam-F.mscx +++ b/src/engraving/tests/beam_data/Beam-F.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/beam_data/Beam-G.mscx b/src/engraving/tests/beam_data/Beam-G.mscx index eb1febc22e040..16f7db8178201 100644 --- a/src/engraving/tests/beam_data/Beam-G.mscx +++ b/src/engraving/tests/beam_data/Beam-G.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/beam_data/beamNoSlope.mscx b/src/engraving/tests/beam_data/beamNoSlope.mscx index b16971d245ae7..76f0191fd11fc 100644 --- a/src/engraving/tests/beam_data/beamNoSlope.mscx +++ b/src/engraving/tests/beam_data/beamNoSlope.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/beam_data/beamStemDir-01-ref.mscx b/src/engraving/tests/beam_data/beamStemDir-01-ref.mscx index 7ec66fd8cafb4..6d55ab65f62b9 100644 --- a/src/engraving/tests/beam_data/beamStemDir-01-ref.mscx +++ b/src/engraving/tests/beam_data/beamStemDir-01-ref.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/beam_data/wideBeams.mscx b/src/engraving/tests/beam_data/wideBeams.mscx index c1fb911a17c67..194634b464fc0 100644 --- a/src/engraving/tests/beam_data/wideBeams.mscx +++ b/src/engraving/tests/beam_data/wideBeams.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/exchangevoices_data/exchangevoices-gliss-ref.mscx b/src/engraving/tests/exchangevoices_data/exchangevoices-gliss-ref.mscx index 0847368112246..a0b815879eedb 100644 --- a/src/engraving/tests/exchangevoices_data/exchangevoices-gliss-ref.mscx +++ b/src/engraving/tests/exchangevoices_data/exchangevoices-gliss-ref.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/implode_explode_data/implodeScore01-ref.mscx b/src/engraving/tests/implode_explode_data/implodeScore01-ref.mscx index de043731bf1f2..002597241c729 100644 --- a/src/engraving/tests/implode_explode_data/implodeScore01-ref.mscx +++ b/src/engraving/tests/implode_explode_data/implodeScore01-ref.mscx @@ -4,6 +4,7 @@ 480 diff --git a/src/engraving/tests/keysig_data/keysig01-ref.mscx b/src/engraving/tests/keysig_data/keysig01-ref.mscx index 54cf76f839ea9..60b884f0b5738 100644 --- a/src/engraving/tests/keysig_data/keysig01-ref.mscx +++ b/src/engraving/tests/keysig_data/keysig01-ref.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/keysig_data/keysig02-ref.mscx b/src/engraving/tests/keysig_data/keysig02-ref.mscx index 28d4d1a1ccc48..975189f659d24 100644 --- a/src/engraving/tests/keysig_data/keysig02-ref.mscx +++ b/src/engraving/tests/keysig_data/keysig02-ref.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/keysig_data/keysig03-ref.mscx b/src/engraving/tests/keysig_data/keysig03-ref.mscx index 652f9d1cac50f..cda51ece5293c 100644 --- a/src/engraving/tests/keysig_data/keysig03-ref.mscx +++ b/src/engraving/tests/keysig_data/keysig03-ref.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/measure_data/measure-insert_bf_clef-ref.mscx b/src/engraving/tests/measure_data/measure-insert_bf_clef-ref.mscx index f83d0055372c2..7bd3630845930 100644 --- a/src/engraving/tests/measure_data/measure-insert_bf_clef-ref.mscx +++ b/src/engraving/tests/measure_data/measure-insert_bf_clef-ref.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/measure_data/measure-insert_bf_clef.mscx b/src/engraving/tests/measure_data/measure-insert_bf_clef.mscx index b4cd333af4e9e..6eb66954547d4 100644 --- a/src/engraving/tests/measure_data/measure-insert_bf_clef.mscx +++ b/src/engraving/tests/measure_data/measure-insert_bf_clef.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/measure_data/measure-insert_bf_key-2-ref.mscx b/src/engraving/tests/measure_data/measure-insert_bf_key-2-ref.mscx index d4cf8193e799e..4d1b6a01fd317 100644 --- a/src/engraving/tests/measure_data/measure-insert_bf_key-2-ref.mscx +++ b/src/engraving/tests/measure_data/measure-insert_bf_key-2-ref.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-all-insertmeasures.mscx b/src/engraving/tests/parts_data/part-all-insertmeasures.mscx index 6a6e7a02d8de4..5b898f90815dd 100644 --- a/src/engraving/tests/parts_data/part-all-insertmeasures.mscx +++ b/src/engraving/tests/parts_data/part-all-insertmeasures.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-all-parts.mscx b/src/engraving/tests/parts_data/part-all-parts.mscx index e4a5bc93149b3..0ecc3702910bb 100644 --- a/src/engraving/tests/parts_data/part-all-parts.mscx +++ b/src/engraving/tests/parts_data/part-all-parts.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-all-uappendmeasures.mscx b/src/engraving/tests/parts_data/part-all-uappendmeasures.mscx index e4a5bc93149b3..0ecc3702910bb 100644 --- a/src/engraving/tests/parts_data/part-all-uappendmeasures.mscx +++ b/src/engraving/tests/parts_data/part-all-uappendmeasures.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-all-uinsertmeasures.mscx b/src/engraving/tests/parts_data/part-all-uinsertmeasures.mscx index e4a5bc93149b3..0ecc3702910bb 100644 --- a/src/engraving/tests/parts_data/part-all-uinsertmeasures.mscx +++ b/src/engraving/tests/parts_data/part-all-uinsertmeasures.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-all.mscx b/src/engraving/tests/parts_data/part-all.mscx index e262ef2936748..752261373bd4a 100644 --- a/src/engraving/tests/parts_data/part-all.mscx +++ b/src/engraving/tests/parts_data/part-all.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-breath-add.mscx b/src/engraving/tests/parts_data/part-breath-add.mscx index 213cf5829cb9e..75494218f283e 100644 --- a/src/engraving/tests/parts_data/part-breath-add.mscx +++ b/src/engraving/tests/parts_data/part-breath-add.mscx @@ -3,6 +3,7 @@ 480 @@ -777,6 +778,7 @@ 1 480 @@ -1223,6 +1225,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-breath-del.mscx b/src/engraving/tests/parts_data/part-breath-del.mscx index b6a2118cfff58..7c6eb4b6b94b2 100644 --- a/src/engraving/tests/parts_data/part-breath-del.mscx +++ b/src/engraving/tests/parts_data/part-breath-del.mscx @@ -3,6 +3,7 @@ 480 @@ -773,6 +774,7 @@ 1 480 @@ -1214,6 +1216,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-breath-parts.mscx b/src/engraving/tests/parts_data/part-breath-parts.mscx index 6b4c37273ac6d..889a3a76d8886 100644 --- a/src/engraving/tests/parts_data/part-breath-parts.mscx +++ b/src/engraving/tests/parts_data/part-breath-parts.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-breath-uadd.mscx b/src/engraving/tests/parts_data/part-breath-uadd.mscx index b6a2118cfff58..7c6eb4b6b94b2 100644 --- a/src/engraving/tests/parts_data/part-breath-uadd.mscx +++ b/src/engraving/tests/parts_data/part-breath-uadd.mscx @@ -3,6 +3,7 @@ 480 @@ -773,6 +774,7 @@ 1 480 @@ -1214,6 +1216,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-breath-udel.mscx b/src/engraving/tests/parts_data/part-breath-udel.mscx index 213cf5829cb9e..75494218f283e 100644 --- a/src/engraving/tests/parts_data/part-breath-udel.mscx +++ b/src/engraving/tests/parts_data/part-breath-udel.mscx @@ -3,6 +3,7 @@ 480 @@ -777,6 +778,7 @@ 1 480 @@ -1223,6 +1225,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-breath-uradd.mscx b/src/engraving/tests/parts_data/part-breath-uradd.mscx index 213cf5829cb9e..75494218f283e 100644 --- a/src/engraving/tests/parts_data/part-breath-uradd.mscx +++ b/src/engraving/tests/parts_data/part-breath-uradd.mscx @@ -3,6 +3,7 @@ 480 @@ -777,6 +778,7 @@ 1 480 @@ -1223,6 +1225,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-breath-urdel.mscx b/src/engraving/tests/parts_data/part-breath-urdel.mscx index b6a2118cfff58..7c6eb4b6b94b2 100644 --- a/src/engraving/tests/parts_data/part-breath-urdel.mscx +++ b/src/engraving/tests/parts_data/part-breath-urdel.mscx @@ -3,6 +3,7 @@ 480 @@ -773,6 +774,7 @@ 1 480 @@ -1214,6 +1216,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-breath.mscx b/src/engraving/tests/parts_data/part-breath.mscx index e89532d3f1f92..3cf5a9bcbc838 100644 --- a/src/engraving/tests/parts_data/part-breath.mscx +++ b/src/engraving/tests/parts_data/part-breath.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-chordline-add.mscx b/src/engraving/tests/parts_data/part-chordline-add.mscx index b923b0be7c443..93bd8851981f6 100644 --- a/src/engraving/tests/parts_data/part-chordline-add.mscx +++ b/src/engraving/tests/parts_data/part-chordline-add.mscx @@ -3,6 +3,7 @@ 480 @@ -777,6 +778,7 @@ 1 480 @@ -1223,6 +1225,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-chordline-del.mscx b/src/engraving/tests/parts_data/part-chordline-del.mscx index d88c5ae3cc964..829de800ad555 100644 --- a/src/engraving/tests/parts_data/part-chordline-del.mscx +++ b/src/engraving/tests/parts_data/part-chordline-del.mscx @@ -3,6 +3,7 @@ 480 @@ -768,6 +769,7 @@ 1 480 @@ -1203,6 +1205,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-chordline-parts.mscx b/src/engraving/tests/parts_data/part-chordline-parts.mscx index 56d5b90564784..9799aedf7a583 100644 --- a/src/engraving/tests/parts_data/part-chordline-parts.mscx +++ b/src/engraving/tests/parts_data/part-chordline-parts.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-chordline-uadd.mscx b/src/engraving/tests/parts_data/part-chordline-uadd.mscx index b6a2118cfff58..7c6eb4b6b94b2 100644 --- a/src/engraving/tests/parts_data/part-chordline-uadd.mscx +++ b/src/engraving/tests/parts_data/part-chordline-uadd.mscx @@ -3,6 +3,7 @@ 480 @@ -773,6 +774,7 @@ 1 480 @@ -1214,6 +1216,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-chordline-udel.mscx b/src/engraving/tests/parts_data/part-chordline-udel.mscx index 039d26c9f834f..6a41cc69ce61b 100644 --- a/src/engraving/tests/parts_data/part-chordline-udel.mscx +++ b/src/engraving/tests/parts_data/part-chordline-udel.mscx @@ -3,6 +3,7 @@ 480 @@ -772,6 +773,7 @@ 1 480 @@ -1212,6 +1214,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-chordline-uradd.mscx b/src/engraving/tests/parts_data/part-chordline-uradd.mscx index b923b0be7c443..93bd8851981f6 100644 --- a/src/engraving/tests/parts_data/part-chordline-uradd.mscx +++ b/src/engraving/tests/parts_data/part-chordline-uradd.mscx @@ -3,6 +3,7 @@ 480 @@ -777,6 +778,7 @@ 1 480 @@ -1223,6 +1225,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-chordline-urdel.mscx b/src/engraving/tests/parts_data/part-chordline-urdel.mscx index d88c5ae3cc964..829de800ad555 100644 --- a/src/engraving/tests/parts_data/part-chordline-urdel.mscx +++ b/src/engraving/tests/parts_data/part-chordline-urdel.mscx @@ -3,6 +3,7 @@ 480 @@ -768,6 +769,7 @@ 1 480 @@ -1203,6 +1205,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-chordline.mscx b/src/engraving/tests/parts_data/part-chordline.mscx index 4a580e57991c7..a64e7b7cc12dc 100644 --- a/src/engraving/tests/parts_data/part-chordline.mscx +++ b/src/engraving/tests/parts_data/part-chordline.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-empty-parts.mscx b/src/engraving/tests/parts_data/part-empty-parts.mscx index 5f6bc65a9066c..3950eedb4f48d 100644 --- a/src/engraving/tests/parts_data/part-empty-parts.mscx +++ b/src/engraving/tests/parts_data/part-empty-parts.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-empty.mscx b/src/engraving/tests/parts_data/part-empty.mscx index 646c10f0d54d7..e478bfd2f0321 100644 --- a/src/engraving/tests/parts_data/part-empty.mscx +++ b/src/engraving/tests/parts_data/part-empty.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-fingering-add.mscx b/src/engraving/tests/parts_data/part-fingering-add.mscx index 536deebb678ec..fe055c9b5c04b 100644 --- a/src/engraving/tests/parts_data/part-fingering-add.mscx +++ b/src/engraving/tests/parts_data/part-fingering-add.mscx @@ -3,6 +3,7 @@ 480 @@ -777,6 +778,7 @@ 1 480 @@ -1223,6 +1225,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-fingering-del.mscx b/src/engraving/tests/parts_data/part-fingering-del.mscx index 6bba5db209378..802ad32a635c7 100644 --- a/src/engraving/tests/parts_data/part-fingering-del.mscx +++ b/src/engraving/tests/parts_data/part-fingering-del.mscx @@ -3,6 +3,7 @@ 480 @@ -778,6 +779,7 @@ 1 480 @@ -1225,6 +1227,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-fingering-parts.mscx b/src/engraving/tests/parts_data/part-fingering-parts.mscx index d782c2c818575..28266111a78af 100644 --- a/src/engraving/tests/parts_data/part-fingering-parts.mscx +++ b/src/engraving/tests/parts_data/part-fingering-parts.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-fingering-uadd.mscx b/src/engraving/tests/parts_data/part-fingering-uadd.mscx index b6a2118cfff58..7c6eb4b6b94b2 100644 --- a/src/engraving/tests/parts_data/part-fingering-uadd.mscx +++ b/src/engraving/tests/parts_data/part-fingering-uadd.mscx @@ -3,6 +3,7 @@ 480 @@ -773,6 +774,7 @@ 1 480 @@ -1214,6 +1216,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-fingering-udel.mscx b/src/engraving/tests/parts_data/part-fingering-udel.mscx index a4d560bdce2f4..a150cdc372d5a 100644 --- a/src/engraving/tests/parts_data/part-fingering-udel.mscx +++ b/src/engraving/tests/parts_data/part-fingering-udel.mscx @@ -3,6 +3,7 @@ 480 @@ -783,6 +784,7 @@ 1 480 @@ -1236,6 +1238,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-fingering-uradd.mscx b/src/engraving/tests/parts_data/part-fingering-uradd.mscx index 536deebb678ec..fe055c9b5c04b 100644 --- a/src/engraving/tests/parts_data/part-fingering-uradd.mscx +++ b/src/engraving/tests/parts_data/part-fingering-uradd.mscx @@ -3,6 +3,7 @@ 480 @@ -777,6 +778,7 @@ 1 480 @@ -1223,6 +1225,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-fingering-urdel.mscx b/src/engraving/tests/parts_data/part-fingering-urdel.mscx index 6bba5db209378..802ad32a635c7 100644 --- a/src/engraving/tests/parts_data/part-fingering-urdel.mscx +++ b/src/engraving/tests/parts_data/part-fingering-urdel.mscx @@ -3,6 +3,7 @@ 480 @@ -778,6 +779,7 @@ 1 480 @@ -1225,6 +1227,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-fingering.mscx b/src/engraving/tests/parts_data/part-fingering.mscx index 52669b52ec971..3c5f2334027ec 100644 --- a/src/engraving/tests/parts_data/part-fingering.mscx +++ b/src/engraving/tests/parts_data/part-fingering.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-image-add.mscx b/src/engraving/tests/parts_data/part-image-add.mscx index d2674fb15ffc9..290535f9af5a0 100644 --- a/src/engraving/tests/parts_data/part-image-add.mscx +++ b/src/engraving/tests/parts_data/part-image-add.mscx @@ -3,6 +3,7 @@ 480 @@ -778,6 +779,7 @@ 1 480 @@ -1225,6 +1227,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-image-del.mscx b/src/engraving/tests/parts_data/part-image-del.mscx index 17a881b8f2f78..3bfe860a565b2 100644 --- a/src/engraving/tests/parts_data/part-image-del.mscx +++ b/src/engraving/tests/parts_data/part-image-del.mscx @@ -3,6 +3,7 @@ 480 @@ -773,6 +774,7 @@ 1 480 @@ -1213,6 +1215,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-image-parts.mscx b/src/engraving/tests/parts_data/part-image-parts.mscx index 3e6f7099ab9e6..4adb03911a5ca 100644 --- a/src/engraving/tests/parts_data/part-image-parts.mscx +++ b/src/engraving/tests/parts_data/part-image-parts.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-image-uadd.mscx b/src/engraving/tests/parts_data/part-image-uadd.mscx index b6a2118cfff58..7c6eb4b6b94b2 100644 --- a/src/engraving/tests/parts_data/part-image-uadd.mscx +++ b/src/engraving/tests/parts_data/part-image-uadd.mscx @@ -3,6 +3,7 @@ 480 @@ -773,6 +774,7 @@ 1 480 @@ -1214,6 +1216,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-image-udel.mscx b/src/engraving/tests/parts_data/part-image-udel.mscx index eb31f40fa4276..6035a09fb7f39 100644 --- a/src/engraving/tests/parts_data/part-image-udel.mscx +++ b/src/engraving/tests/parts_data/part-image-udel.mscx @@ -3,6 +3,7 @@ 480 @@ -784,6 +785,7 @@ 1 480 @@ -1236,6 +1238,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-image-uradd.mscx b/src/engraving/tests/parts_data/part-image-uradd.mscx index d2674fb15ffc9..290535f9af5a0 100644 --- a/src/engraving/tests/parts_data/part-image-uradd.mscx +++ b/src/engraving/tests/parts_data/part-image-uradd.mscx @@ -3,6 +3,7 @@ 480 @@ -778,6 +779,7 @@ 1 480 @@ -1225,6 +1227,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-image-urdel.mscx b/src/engraving/tests/parts_data/part-image-urdel.mscx index 17a881b8f2f78..3bfe860a565b2 100644 --- a/src/engraving/tests/parts_data/part-image-urdel.mscx +++ b/src/engraving/tests/parts_data/part-image-urdel.mscx @@ -3,6 +3,7 @@ 480 @@ -773,6 +774,7 @@ 1 480 @@ -1213,6 +1215,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-image.mscx b/src/engraving/tests/parts_data/part-image.mscx index 1234210e81ff4..9c1bb060d0bc1 100644 --- a/src/engraving/tests/parts_data/part-image.mscx +++ b/src/engraving/tests/parts_data/part-image.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-measure-repeat-add.mscx b/src/engraving/tests/parts_data/part-measure-repeat-add.mscx index b3553766a7fc9..2a5ce98a5a4ea 100644 --- a/src/engraving/tests/parts_data/part-measure-repeat-add.mscx +++ b/src/engraving/tests/parts_data/part-measure-repeat-add.mscx @@ -3,6 +3,7 @@ 480 @@ -787,6 +788,7 @@ 1 480 @@ -1233,6 +1235,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-measure-repeat-uadd.mscx b/src/engraving/tests/parts_data/part-measure-repeat-uadd.mscx index b6a2118cfff58..7c6eb4b6b94b2 100644 --- a/src/engraving/tests/parts_data/part-measure-repeat-uadd.mscx +++ b/src/engraving/tests/parts_data/part-measure-repeat-uadd.mscx @@ -3,6 +3,7 @@ 480 @@ -773,6 +774,7 @@ 1 480 @@ -1214,6 +1216,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-measure-repeat-uradd.mscx b/src/engraving/tests/parts_data/part-measure-repeat-uradd.mscx index b3553766a7fc9..2a5ce98a5a4ea 100644 --- a/src/engraving/tests/parts_data/part-measure-repeat-uradd.mscx +++ b/src/engraving/tests/parts_data/part-measure-repeat-uradd.mscx @@ -3,6 +3,7 @@ 480 @@ -787,6 +788,7 @@ 1 480 @@ -1233,6 +1235,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-stemless-parts.mscx b/src/engraving/tests/parts_data/part-stemless-parts.mscx index 0bc950dd6b986..dcbe4d6048a1e 100644 --- a/src/engraving/tests/parts_data/part-stemless-parts.mscx +++ b/src/engraving/tests/parts_data/part-stemless-parts.mscx @@ -6,6 +6,7 @@ 8.27 11.69 7.4826 + 0 0 1.76389 diff --git a/src/engraving/tests/parts_data/part-stemless.mscx b/src/engraving/tests/parts_data/part-stemless.mscx index c0dfb8edc40fe..e4d1bdaed07f3 100644 --- a/src/engraving/tests/parts_data/part-stemless.mscx +++ b/src/engraving/tests/parts_data/part-stemless.mscx @@ -6,6 +6,7 @@ 8.27 11.69 7.4826 + 0 0 1.76389 diff --git a/src/engraving/tests/parts_data/part-symbol-add.mscx b/src/engraving/tests/parts_data/part-symbol-add.mscx index a3b2eb99850a0..9fefd8562c7bd 100644 --- a/src/engraving/tests/parts_data/part-symbol-add.mscx +++ b/src/engraving/tests/parts_data/part-symbol-add.mscx @@ -3,6 +3,7 @@ 480 @@ -777,6 +778,7 @@ 1 480 @@ -1223,6 +1225,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-symbol-del.mscx b/src/engraving/tests/parts_data/part-symbol-del.mscx index b6a2118cfff58..7c6eb4b6b94b2 100644 --- a/src/engraving/tests/parts_data/part-symbol-del.mscx +++ b/src/engraving/tests/parts_data/part-symbol-del.mscx @@ -3,6 +3,7 @@ 480 @@ -773,6 +774,7 @@ 1 480 @@ -1214,6 +1216,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-symbol-parts.mscx b/src/engraving/tests/parts_data/part-symbol-parts.mscx index cfc762e06582d..c587e64de0cf7 100644 --- a/src/engraving/tests/parts_data/part-symbol-parts.mscx +++ b/src/engraving/tests/parts_data/part-symbol-parts.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-symbol-uadd.mscx b/src/engraving/tests/parts_data/part-symbol-uadd.mscx index b6a2118cfff58..7c6eb4b6b94b2 100644 --- a/src/engraving/tests/parts_data/part-symbol-uadd.mscx +++ b/src/engraving/tests/parts_data/part-symbol-uadd.mscx @@ -3,6 +3,7 @@ 480 @@ -773,6 +774,7 @@ 1 480 @@ -1214,6 +1216,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-symbol-udel.mscx b/src/engraving/tests/parts_data/part-symbol-udel.mscx index 278cd4ddf8147..c2e23774584d8 100644 --- a/src/engraving/tests/parts_data/part-symbol-udel.mscx +++ b/src/engraving/tests/parts_data/part-symbol-udel.mscx @@ -3,6 +3,7 @@ 480 @@ -777,6 +778,7 @@ 1 480 @@ -1223,6 +1225,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-symbol-uradd.mscx b/src/engraving/tests/parts_data/part-symbol-uradd.mscx index a3b2eb99850a0..9fefd8562c7bd 100644 --- a/src/engraving/tests/parts_data/part-symbol-uradd.mscx +++ b/src/engraving/tests/parts_data/part-symbol-uradd.mscx @@ -3,6 +3,7 @@ 480 @@ -777,6 +778,7 @@ 1 480 @@ -1223,6 +1225,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-symbol-urdel.mscx b/src/engraving/tests/parts_data/part-symbol-urdel.mscx index b6a2118cfff58..7c6eb4b6b94b2 100644 --- a/src/engraving/tests/parts_data/part-symbol-urdel.mscx +++ b/src/engraving/tests/parts_data/part-symbol-urdel.mscx @@ -3,6 +3,7 @@ 480 @@ -773,6 +774,7 @@ 1 480 @@ -1214,6 +1216,7 @@ 2 480 diff --git a/src/engraving/tests/parts_data/part-symbol.mscx b/src/engraving/tests/parts_data/part-symbol.mscx index d97d39ee0c213..7eb8cb59b2b4e 100644 --- a/src/engraving/tests/parts_data/part-symbol.mscx +++ b/src/engraving/tests/parts_data/part-symbol.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/parts_data/part-visible-tracks-part-ref.mscx b/src/engraving/tests/parts_data/part-visible-tracks-part-ref.mscx index d3ed0e70644c1..ce220384f711c 100644 --- a/src/engraving/tests/parts_data/part-visible-tracks-part-ref.mscx +++ b/src/engraving/tests/parts_data/part-visible-tracks-part-ref.mscx @@ -23,6 +23,7 @@ 0.8 0.1 0.6 + 0 1 1.3 0.22 diff --git a/src/engraving/tests/parts_data/part-visible-tracks-score-ref.mscx b/src/engraving/tests/parts_data/part-visible-tracks-score-ref.mscx index 22aee48a19688..60b4f8be35efe 100644 --- a/src/engraving/tests/parts_data/part-visible-tracks-score-ref.mscx +++ b/src/engraving/tests/parts_data/part-visible-tracks-score-ref.mscx @@ -216,6 +216,7 @@ 0.8 0.1 0.6 + 0 1 1.3 0.22 diff --git a/src/engraving/tests/parts_data/partStyle-score-ref.mscx b/src/engraving/tests/parts_data/partStyle-score-ref.mscx index 3f8d76bd8e382..e37fca18d1d14 100644 --- a/src/engraving/tests/parts_data/partStyle-score-ref.mscx +++ b/src/engraving/tests/parts_data/partStyle-score-ref.mscx @@ -4,6 +4,7 @@ 480 diff --git a/src/engraving/tests/readwriteundoreset_data/mmrestBarlineTextLinks-disable-mmrest-ref.mscx b/src/engraving/tests/readwriteundoreset_data/mmrestBarlineTextLinks-disable-mmrest-ref.mscx index 89bbc253aee65..f6b34b3ce4a2f 100644 --- a/src/engraving/tests/readwriteundoreset_data/mmrestBarlineTextLinks-disable-mmrest-ref.mscx +++ b/src/engraving/tests/readwriteundoreset_data/mmrestBarlineTextLinks-disable-mmrest-ref.mscx @@ -6,6 +6,7 @@ 8.27 11.69 7.4826 + 0 0 1.76389 diff --git a/src/engraving/tests/readwriteundoreset_data/mmrestBarlineTextLinks-recreate-mmrest-ref.mscx b/src/engraving/tests/readwriteundoreset_data/mmrestBarlineTextLinks-recreate-mmrest-ref.mscx index fd7c7096ea1f8..be7e5e86d7a08 100644 --- a/src/engraving/tests/readwriteundoreset_data/mmrestBarlineTextLinks-recreate-mmrest-ref.mscx +++ b/src/engraving/tests/readwriteundoreset_data/mmrestBarlineTextLinks-recreate-mmrest-ref.mscx @@ -6,6 +6,7 @@ 8.27 11.69 7.4826 + 0 0 1 1.76389 diff --git a/src/engraving/tests/readwriteundoreset_data/mmrestBarlineTextLinks.mscx b/src/engraving/tests/readwriteundoreset_data/mmrestBarlineTextLinks.mscx index 4e397bbdddec0..02ab45891dfd9 100644 --- a/src/engraving/tests/readwriteundoreset_data/mmrestBarlineTextLinks.mscx +++ b/src/engraving/tests/readwriteundoreset_data/mmrestBarlineTextLinks.mscx @@ -6,6 +6,7 @@ 8.27 11.69 7.4826 + 0 0 1 1.76389 diff --git a/src/engraving/tests/readwriteundoreset_data/slurs.mscx b/src/engraving/tests/readwriteundoreset_data/slurs.mscx index 7a411084f910d..578f6215237d4 100644 --- a/src/engraving/tests/readwriteundoreset_data/slurs.mscx +++ b/src/engraving/tests/readwriteundoreset_data/slurs.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/rhythmicGrouping_data/group8ths4-4-ref.mscx b/src/engraving/tests/rhythmicGrouping_data/group8ths4-4-ref.mscx index 3e114ee9f3f56..23088dce37960 100644 --- a/src/engraving/tests/rhythmicGrouping_data/group8ths4-4-ref.mscx +++ b/src/engraving/tests/rhythmicGrouping_data/group8ths4-4-ref.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/spanners_data/lyricsline03.mscx b/src/engraving/tests/spanners_data/lyricsline03.mscx index 892545dcd7d56..2884eaacb4c89 100644 --- a/src/engraving/tests/spanners_data/lyricsline03.mscx +++ b/src/engraving/tests/spanners_data/lyricsline03.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/spanners_data/lyricsline04-ref.mscx b/src/engraving/tests/spanners_data/lyricsline04-ref.mscx index 299bf64ad551f..f8f8b1906945b 100644 --- a/src/engraving/tests/spanners_data/lyricsline04-ref.mscx +++ b/src/engraving/tests/spanners_data/lyricsline04-ref.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/spanners_data/lyricsline04.mscx b/src/engraving/tests/spanners_data/lyricsline04.mscx index 77b668014dbca..1bb072ef03864 100644 --- a/src/engraving/tests/spanners_data/lyricsline04.mscx +++ b/src/engraving/tests/spanners_data/lyricsline04.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/spanners_data/lyricsline05-ref.mscx b/src/engraving/tests/spanners_data/lyricsline05-ref.mscx index c2f516af4c5ba..b60b3a3a5db01 100644 --- a/src/engraving/tests/spanners_data/lyricsline05-ref.mscx +++ b/src/engraving/tests/spanners_data/lyricsline05-ref.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/spanners_data/lyricsline05.mscx b/src/engraving/tests/spanners_data/lyricsline05.mscx index 96111954cbebd..3c61e41c844dc 100644 --- a/src/engraving/tests/spanners_data/lyricsline05.mscx +++ b/src/engraving/tests/spanners_data/lyricsline05.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/spanners_data/smallstaff01-ref.mscx b/src/engraving/tests/spanners_data/smallstaff01-ref.mscx index 6ef7dac0a6589..9e67e5b665ad2 100644 --- a/src/engraving/tests/spanners_data/smallstaff01-ref.mscx +++ b/src/engraving/tests/spanners_data/smallstaff01-ref.mscx @@ -6,6 +6,7 @@ 8.27 11.69 7.4826 + 0 0 9 0 diff --git a/src/engraving/tests/split_data/split01-ref.mscx b/src/engraving/tests/split_data/split01-ref.mscx index 86f4f21fd20fc..fd3c476673553 100644 --- a/src/engraving/tests/split_data/split01-ref.mscx +++ b/src/engraving/tests/split_data/split01-ref.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/staffmove_data/hiddenStaff.mscx b/src/engraving/tests/staffmove_data/hiddenStaff.mscx index 9e4daac1c2c85..230db6f39f938 100644 --- a/src/engraving/tests/staffmove_data/hiddenStaff.mscx +++ b/src/engraving/tests/staffmove_data/hiddenStaff.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/staffmove_data/linkedStaff-ref.mscx b/src/engraving/tests/staffmove_data/linkedStaff-ref.mscx index 3d5cc5b4c25f7..35831a034323c 100644 --- a/src/engraving/tests/staffmove_data/linkedStaff-ref.mscx +++ b/src/engraving/tests/staffmove_data/linkedStaff-ref.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/staffmove_data/linkedStaff.mscx b/src/engraving/tests/staffmove_data/linkedStaff.mscx index 4c82f7e175cd4..ac2b388cc0223 100644 --- a/src/engraving/tests/staffmove_data/linkedStaff.mscx +++ b/src/engraving/tests/staffmove_data/linkedStaff.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/timesig_data/timesig-02-ref.mscx b/src/engraving/tests/timesig_data/timesig-02-ref.mscx index 5ff703ce51414..f80c11b2d9402 100644 --- a/src/engraving/tests/timesig_data/timesig-02-ref.mscx +++ b/src/engraving/tests/timesig_data/timesig-02-ref.mscx @@ -3,6 +3,7 @@ 480 diff --git a/src/engraving/tests/tuplet_data/split1-ref.mscx b/src/engraving/tests/tuplet_data/split1-ref.mscx index 85f1ecc059d3e..8125e6b54cc5a 100644 --- a/src/engraving/tests/tuplet_data/split1-ref.mscx +++ b/src/engraving/tests/tuplet_data/split1-ref.mscx @@ -4,6 +4,7 @@ 480