Skip to content

Commit

Permalink
more fixes&tests for mm rests
Browse files Browse the repository at this point in the history
  • Loading branch information
wschweer committed Sep 19, 2013
1 parent 750c75f commit 5800ba4
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 18 deletions.
24 changes: 20 additions & 4 deletions libmscore/layout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -623,14 +623,11 @@ void Score::doLayout()
return;
}

// compute note head lines and accidentals:
for (Measure* m = firstMeasure(); m; m = m->nextMeasure())
m->layoutStage1();

if (styleB(ST_createMultiMeasureRests))
createMMRests();


layoutStage2(); // beam notes, finally decide if chord is up/down
layoutStage3(); // compute note head horizontal positions

Expand Down Expand Up @@ -913,7 +910,8 @@ void Score::createMMRests()
Fraction len;
while (nm->isEmpty()) {
MeasureBase* mb = _showVBox ? nm->next() : nm->nextMeasure();
if (nm->breakMultiMeasureRest() && n)
// if (nm->breakMultiMeasureRest() && n)
if (nm->breakMultiMeasureRest())
break;
++n;
len += nm->len();
Expand Down Expand Up @@ -980,6 +978,24 @@ void Score::createMMRests()
}
}
}
//
// check for key signature
//
cs = m->findSegment(Segment::SegKeySig, m->tick());
if (cs) {
Segment* ns = mmr->getSegment(Segment::SegKeySig, m->tick());
for (int staffIdx = 0; staffIdx < _staves.size(); ++staffIdx) {
int track = staffIdx * VOICES;
KeySig* ts = static_cast<KeySig*>(cs->element(track));
if (ts) {
if (ns->element(track) == 0)
ns->add(ts->clone());
else {
//TODO: check if same key signature
}
}
}
}
mmr->setNext(nm);
mmr->setPrev(m->prev());
m->setMMRest(mmr);
Expand Down
31 changes: 18 additions & 13 deletions libmscore/measure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3252,13 +3252,16 @@ void Measure::layoutX(qreal stretch)
// center multi measure rest
//
qreal x1 = 0.0, x2;
Segment* ss = first();
for (; ss->segmentType() != Segment::SegChordRest; ss = ss->next())
;
if (s != first()) {
Segment* ps;
for (ps = s->prev(); ps && !ps->element(track) ; ps = ps->prev())
;
if (ps) {
Element* ee = ps->element(track);
x1 = ps->x() + ee->x() + ee->width();
ss = ss->prev();
for (int staffIdx = 0; staffIdx < score()->nstaves(); ++staffIdx) {
int track = staffIdx * VOICES;
Element* e = ss->element(track);
if (e)
x1 = qMax(x1, ss->x() + e->x() + e->width());
}
}
Segment* ns = s->next();
Expand Down Expand Up @@ -3372,18 +3375,20 @@ void Measure::layoutX(qreal stretch)

//---------------------------------------------------------
// layoutStage1
// compute multi measure rest break
// call layoutChords0
//---------------------------------------------------------

void Measure::layoutStage1()
{
setDirty();

setBreakMMRest(false);
for (int staffIdx = 0; staffIdx < score()->nstaves(); ++staffIdx) {
setBreakMMRest(false);
if (score()->styleB(ST_createMultiMeasureRests)) {
if ((repeatFlags() & RepeatStart) || (prevMeasure() && (prevMeasure()->repeatFlags() & RepeatEnd)))
setBreakMMRest(true);
else if (!breakMMRest()) {
else if (!breakMultiMeasureRest()) {
for (Segment* s = first(); s; s = s->next()) {
int n = s->annotations().size();
for (int i = 0; i < n; ++i) {
Expand All @@ -3393,7 +3398,7 @@ void Measure::layoutStage1()
break;
}
}
if (breakMMRest()) // optimize
if (breakMultiMeasureRest()) // optimize
break;
}
}
Expand All @@ -3404,25 +3409,25 @@ void Measure::layoutStage1()
for (Segment* segment = first(); segment; segment = segment->next()) {
Element* e = segment->element(track);

if (segment->segmentType() & (Segment::SegKeySig | Segment::SegStartRepeatBarLine | Segment::SegTimeSig)) {
if (segment->segmentType() & (Segment::SegClef | Segment::SegKeySig | Segment::SegStartRepeatBarLine | Segment::SegTimeSig)) {
if (e && !e->generated())
setBreakMMRest(true);
}

if (segment->segmentType() & Segment::SegChordRest)
if (segment->segmentType() == Segment::SegChordRest)
layoutChords0(segment, staffIdx * VOICES);
}
}

if (!breakMMRest()) {
if (!breakMultiMeasureRest()) {
for (auto i = score()->spanner().lower_bound(tick()); i != score()->spanner().upper_bound(tick()); ++i) {
Spanner* sp = i->second;
if (sp->type() == Element::VOLTA)
setBreakMMRest(true);
break;
}
}
if (!breakMMRest() && this != score()->lastMeasure()) {
if (!breakMultiMeasureRest() && this != score()->lastMeasure()) {
auto i = score()->spanner().upper_bound(tick());
std::reverse_iterator<std::map<int,Spanner*>::const_iterator> revit (i);
for (; revit != score()->spanner().rend(); revit++) {
Expand Down
3 changes: 2 additions & 1 deletion vtest/gen
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
#
# "compare" - image magick compare program
#
SRC="mmrest-1 fmrest-1 fmrest-2 fmrest-3 fmrest-4 fmrest-5 measure-repeat-1"
SRC="mmrest-1 mmrest-2 mmrest-4\
fmrest-1 fmrest-2 fmrest-3 fmrest-4 fmrest-5 measure-repeat-1"

MSCORE=../build.debug/mscore/mscore
DPI=130
Expand Down
Binary file added vtest/mmrest-2-ref.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added vtest/mmrest-2.mscz
Binary file not shown.
Binary file added vtest/mmrest-4-ref.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added vtest/mmrest-4.mscz
Binary file not shown.

0 comments on commit 5800ba4

Please sign in to comment.