diff --git a/libmscore/layout.cpp b/libmscore/layout.cpp index f965ac8ac8..12a92a9637 100644 --- a/libmscore/layout.cpp +++ b/libmscore/layout.cpp @@ -83,6 +83,18 @@ void Score::rebuildBspTree() page->rebuildBspTree(); } +//--------------------------------------------------------- +// layoutSegmentElements +//--------------------------------------------------------- + +static void layoutSegmentElements(Segment* segment, int startTrack, int endTrack) + { + for (int track = startTrack; track < endTrack; ++track) { + if (Element* e = segment->element(track)) + e->layout(); + } + } + //--------------------------------------------------------- // layoutChords1 // - layout upstem and downstem chords @@ -92,16 +104,18 @@ void Score::rebuildBspTree() void Score::layoutChords1(Segment* segment, int staffIdx) { const Staff* staff = Score::staff(staffIdx); + const int startTrack = staffIdx * VOICES; + const int endTrack = startTrack + VOICES; - if (staff->isTabStaff(segment->tick())) + if (staff->isTabStaff(segment->tick())) { + layoutSegmentElements(segment, startTrack, endTrack); return; + } std::vector upStemNotes; std::vector downStemNotes; int upVoices = 0; int downVoices = 0; - int startTrack = staffIdx * VOICES; - int endTrack = startTrack + VOICES; qreal nominalWidth = noteHeadWidth() * staff->mag(segment->tick()); qreal maxUpWidth = 0.0; qreal maxDownWidth = 0.0; @@ -510,11 +524,7 @@ void Score::layoutChords1(Segment* segment, int staffIdx) layoutChords3(notes, staff, segment); } - for (int track = startTrack; track < endTrack; ++track) { - Element* e = segment->element(track); - if (e) - e->layout(); - } + layoutSegmentElements(segment, startTrack, endTrack); } //--------------------------------------------------------- diff --git a/mtest/libmscore/layout_elements/layout_elements.mscx b/mtest/libmscore/layout_elements/layout_elements.mscx index 6ec1055dae..bb6967fd9b 100644 --- a/mtest/libmscore/layout_elements/layout_elements.mscx +++ b/mtest/libmscore/layout_elements/layout_elements.mscx @@ -531,7 +531,14 @@ 480 - Figured_bass + + + 5 + + + + 3 + quarter diff --git a/mtest/libmscore/layout_elements/layout_elements_tab.mscx b/mtest/libmscore/layout_elements/layout_elements_tab.mscx new file mode 100644 index 0000000000..8c2f2867ed --- /dev/null +++ b/mtest/libmscore/layout_elements/layout_elements_tab.mscx @@ -0,0 +1,960 @@ + + + + + 0 + 480 + + 1 + 1 + 1 + 0 + + + + + + + + + + + Tablature layout test + + + + tab6StrFull + 6 + 1.5 + 0 + MuseScore Tab Modern + 15 + 0 + MuseScore Tab Serif + 9 + 0 + 0 + 2 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + + G8vb + + + + tab6StrCommon + 6 + 1.5 + 0 + 0 + MuseScore Tab Modern + 15 + 0 + MuseScore Tab Serif + 9 + 0 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 1 + + G8vb + + Guitar [Tablature] + + Guitar + Guit. + Classical Guitar [Tablature] + 40 + 83 + 40 + 83 + pluck.guitar.nylon-string + G8vb + + 19 + 40 + 45 + 50 + 55 + 59 + 64 + + + 100 + 100 + + + 100 + 33 + + + 100 + 50 + + + 100 + 67 + + + 100 + 100 + + + 120 + 67 + + + 120 + 100 + + + + + + + + + 10 + + + Tablature layout test + + + + + + 4 + 4 + + + + 0 + + + + 1 + + + + + quarter + + + + + + 1 + + + + + 61 + 21 + 2 + 1 + + + gliss. + 1 + 1 + 3 + + + + 1/4 + + + + + + + quarter + + 63 + 23 + 4 + 1 + + + + -1/4 + + + + + + + quarter + + 64 + 18 + 0 + 0 + + + + quarter + + 66 + 20 + 2 + 0 + + + + + + + + Staff Text + + + f + 96 + + + + + -1 + + + + + 2 + 3 + eighth + + + 3 + + + + 24 + 24 + + + eighth + + + + -1 + + + + + 61 + 21 + 2 + 1 + + + + eighth + + 63 + 23 + 4 + 1 + + + + eighth + + 64 + 18 + 0 + 0 + + + + + 1 + half + + + + + + + 1 + -1/4 + + + + 68 + 22 + 4 + 0 + + + + + + + + + Expression + + + + 0 + <sym>dynamicMezzo</sym><sym>dynamicForte</sym> + left,center + + + + 1 + + + + + quarter + + + + + -1 + 1/4 + + + + 68 + 22 + 4 + 0 + + + + half + + 68 + 22 + 4 + 0 + + + + 18 + 18 + + + eighth + + 69 + 17 + 5 + 0 + + + + eighth + + 71 + 19 + 7 + 0 + + + + + + + + fermataAbove + + + + + -1 + + + + + eighth + + + 67 + 15 + 3 + 0 + + + + whole + + 67 + 27 + 3 + 0 + + + + + + + + quarter + + + noteheadParenthesisLeft + + + noteheadParenthesisRight + + 69 + 17 + 5 + 0 + + + + quarter + + 71 + 19 + 7 + 0 + + + + quarter + + 73 + 21 + 9 + 0 + + + r8 + + + + breathMarkTick + + + quarter + + + + + + + measure + 4/4 + + + + + + + quarter + + + 1 + + 48 + 14 + 3 + 4 + + + + 3 + + 52 + 18 + 2 + 3 + + + + 5 + + 55 + 15 + 0 + 2 + + + 0 + + + + quarter + + 48 + 14 + 3 + 4 + + + gliss. + 1 + 3 + + + + 1/4 + + + + + + + 480 + + + 5 + + + + 3 + + + + quarter + + 55 + 15 + 0 + 2 + + + + -1/4 + + + + + + + 0 + 480 + + + + quarter + + + + + + + half + + + half + + + + + + + whole + + + + + + + + + 0 + + + 4 + 4 + + + + 88 + + + 3 + + + 2 + + + 79 + + + 1 + + + 79 + + + + + 1 + <sym>keyboardPedalPed</sym> + + + + 1 + + + + + 32nd + + + 66 + 20 + 2 + 0 + + + + quarter + + 64 + 18 + 0 + 0 + + + + quarter + + + half + + + + + + + + + -1 + + + + + quarter + + begin + Ly + + + 73 + 21 + 9 + 0 + + + + quarter + + end + 480 + rics + + + 76 + 18 + 12 + 0 + + + + quarter + + 78 + 20 + 14 + 0 + + + + quarter + + begin + ly + + + 76 + 18 + 12 + 0 + + + + + + + + quarter + + 73 + 21 + 9 + 0 + + + + quarter + + middle + left,baseline + rics + + + 76 + 18 + 12 + 0 + + + + half + + end + ly + + + 64 + 18 + 0 + 0 + + + + + + + + measure + 4/4 + + + + + + + measure + 4/4 + + + + + + + measure + 4/4 + + + + + + + + 8va + + + + 1/4 + + + + + quarter + + 69 + 17 + 5 + 0 + + + + + + -1/4 + + + + + quarter + + 70 + 12 + 6 + 0 + + + + quarter + + 72 + 14 + 8 + 0 + + + + quarter + + 74 + 16 + 10 + 0 + + + + + + + + quarter + + 76 + 18 + 12 + 0 + + + + + + + + + quarter + + 77 + 13 + 13 + 0 + + + + 14 + + + half + + + + + + + 1 + -1/2 + + + + 69 + 17 + 14 + 2 + + + + + + + + 1 + -1/2 + + + + 72 + 14 + 13 + 1 + + + + + + + + 1 + -1/2 + + + + 76 + 18 + 12 + 0 + + + + -1/8 + + + 16 + + + + + + + half + + + + + -1 + 1/2 + + + + 69 + 17 + 14 + 2 + + + + + + -1 + 1/2 + + + + 72 + 14 + 13 + 1 + + + + + + -1 + 1/2 + + + + 76 + 18 + 12 + 0 + + + + half + + + + + + diff --git a/mtest/libmscore/layout_elements/tst_layout_elements.cpp b/mtest/libmscore/layout_elements/tst_layout_elements.cpp index d7fafcbeb9..97ce7a014f 100644 --- a/mtest/libmscore/layout_elements/tst_layout_elements.cpp +++ b/mtest/libmscore/layout_elements/tst_layout_elements.cpp @@ -15,6 +15,7 @@ #include "libmscore/measure.h" #include "libmscore/page.h" #include "libmscore/score.h" +#include "libmscore/staff.h" #include "libmscore/system.h" #include "libmscore/tuplet.h" @@ -22,10 +23,6 @@ using namespace Ms; -//namespace Ms { -//extern void dumpTags(); -//}; - //--------------------------------------------------------- // TestBechmark //--------------------------------------------------------- @@ -41,6 +38,7 @@ class TestLayoutElements : public QObject, public MTest private slots: void initTestCase(); void tstLayoutElements() { tstLayoutAll("layout_elements.mscx"); } + void tstLayoutTablature() { tstLayoutAll("layout_elements_tab.mscx"); } void tstLayoutMoonlight() { tstLayoutAll("moonlight.mscx"); } // FIXME goldberg.mscx does not pass the test because of some // TimeSig and Clef elements. Need to check it later! @@ -74,6 +72,14 @@ static void isLayoutDone(void* data, Element* e) // TODO: how to check this case? return; } + if (e->isTimeSig()) { + const Staff* st = e->staff(); + if (!st->staffType(e->tick())->genTimesig()) { + // Some staff types require not to have a time + // signature displayed. This is a valid exception. + return; + } + } // If layout of element is done it (usually?) has a valid // bounding box (bbox). if (e->visible() && !e->bbox().isValid()) {