Skip to content

Commit

Permalink
Correction to vertical placement and autoplace behavior
Browse files Browse the repository at this point in the history
  • Loading branch information
mike-spa committed Apr 19, 2024
1 parent 358f157 commit 5765fdb
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 29 deletions.
25 changes: 10 additions & 15 deletions src/engraving/dom/lyrics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,16 @@ void Lyrics::triggerLayout() const
}
}

double Lyrics::yRelativeToStaff() const
{
return pos().y() + chordRest()->pos().y();
}

void Lyrics::setYRelativeToStaff(double y)
{
mutldata()->setPosY(y - chordRest()->pos().y());
}

//---------------------------------------------------------
// forAllLyrics
//---------------------------------------------------------
Expand Down Expand Up @@ -525,21 +535,6 @@ void Lyrics::undoChangeProperty(Pid id, const PropertyValue& v, PropertyFlags ps
}
TextBase::undoChangeProperty(id, v, ps);
return;
} else if (id == Pid::AUTOPLACE && v.toBool() != autoplace()) {
if (v.toBool()) {
// setting autoplace
// reset offset
undoResetProperty(Pid::OFFSET);
} else {
// unsetting autoplace
// rebase offset
PointF off = offset();
double y = pos().y() - propertyDefault(Pid::OFFSET).value<PointF>().y();
off.ry() = placeAbove() ? y : y - staff()->staffHeight();
undoChangeProperty(Pid::OFFSET, off, PropertyFlags::UNSTYLED);
}
TextBase::undoChangeProperty(id, v, ps);
return;
}

TextBase::undoChangeProperty(id, v, ps);
Expand Down
3 changes: 3 additions & 0 deletions src/engraving/dom/lyrics.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,9 @@ class Lyrics final : public TextBase
PropertyValue propertyDefault(Pid id) const override;
void triggerLayout() const override;

double yRelativeToStaff() const;
void setYRelativeToStaff(double y);

protected:
int m_no = 0; // row index
bool m_even = false;
Expand Down
44 changes: 30 additions & 14 deletions src/engraving/rendering/dev/lyricslayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ void LyricsLayout::layout(Lyrics* item, LayoutContext& ctx)
}

ldata->setPosX(x);
item->setYRelativeToStaff(0.0);

if (item->ticks().isNotZero()) {
// set melisma end
Expand Down Expand Up @@ -612,7 +613,7 @@ void LyricsLayout::setDefaultPositions(staff_idx_t staffIdx, LyricsVersesMap& ly
LyricsVerse& lyricsVerse = pair.second;
for (Lyrics* lyrics : lyricsVerse.lyrics()) {
double y = -(totVersesAbove - verse) * lyrics->lineHeight() * lyricsLineHeightFactor;
lyrics->mutldata()->setPosY(y);
lyrics->setYRelativeToStaff(y);
}
for (LyricsLineSegment* lyricsLineSegment : lyricsVerse.lines()) {
Lyrics* lyrics = lyricsLineSegment->lyricsLine()->lyrics();
Expand All @@ -626,7 +627,7 @@ void LyricsLayout::setDefaultPositions(staff_idx_t staffIdx, LyricsVersesMap& ly
LyricsVerse& lyricsVerse = pair.second;
for (Lyrics* lyrics : lyricsVerse.lyrics()) {
double y = staffHeight + verse * lyrics->lineHeight() * lyricsLineHeightFactor;
lyrics->mutldata()->setPosY(y);
lyrics->setYRelativeToStaff(y);
}
for (LyricsLineSegment* lyricsLineSegment : lyricsVerse.lines()) {
Lyrics* lyrics = lyricsLineSegment->lyricsLine()->lyrics();
Expand Down Expand Up @@ -678,11 +679,15 @@ SkylineLine LyricsLayout::createSkylineForVerse(int verse, bool north, LyricsVer
if (lyricsVerses.count(verse) > 0) {
LyricsVerse& lyricsVerse = lyricsVerses[verse];
for (Lyrics* lyrics : lyricsVerse.lyrics()) {
Shape lyricsShape = lyrics->highResShape().translated(PointF(lyrics->pageX() - systemX, lyrics->pos().y()));
lyricsSkyline.add(lyricsShape);
if (lyrics->addToSkyline()) {
Shape lyricsShape = lyrics->highResShape().translated(PointF(lyrics->pageX() - systemX, lyrics->yRelativeToStaff()));
lyricsSkyline.add(lyricsShape);
}
}
for (LyricsLineSegment* lyricsLineSeg : lyricsVerse.lines()) {
lyricsSkyline.add(lyricsLineSeg->shape().translate(lyricsLineSeg->pos()));
if (lyricsLineSeg->lyricsLine()->lyrics()->addToSkyline()) {
lyricsSkyline.add(lyricsLineSeg->shape().translate(lyricsLineSeg->pos()));
}
}
}

Expand Down Expand Up @@ -718,28 +723,39 @@ void LyricsLayout::addToSkyline(System* system, staff_idx_t staffIdx, LayoutCont
LyricsVersesMap& lyricsVersesBelow)
{
double systemX = system->pageX();
double lyricsVerticalPadding = ctx.conf().styleMM(Sid::lyricsMinBottomDistance);
// HACK: subtract minVerticalDistance here because it's added later during staff distance calculations. Needs a better solution.
double lyricsVerticalPadding = ctx.conf().styleMM(Sid::lyricsMinBottomDistance) - ctx.conf().styleMM(Sid::minVerticalDistance);
Skyline& skyline = system->staff(staffIdx)->skyline();
for (auto& pair : lyricsVersesAbove) {
LyricsVerse& lyricsVerse = pair.second;
for (Lyrics* lyrics : lyricsVerse.lyrics()) {
Shape lyricsShape = lyrics->highResShape().translated(PointF(lyrics->pageX() - systemX, lyrics->pos().y()));
skyline.north().add(lyricsShape.adjust(0.0, -lyricsVerticalPadding, 0.0, 0.0));
if (lyrics->addToSkyline()) {
Shape lyricsShape
= lyrics->highResShape().translated(PointF(lyrics->pageX() - systemX, lyrics->yRelativeToStaff()));
skyline.north().add(lyricsShape.adjust(0.0, -lyricsVerticalPadding, 0.0, 0.0));
}
}
for (LyricsLineSegment* lyricsLineSeg : lyricsVerse.lines()) {
Shape lineShape = lyricsLineSeg->shape().translate(lyricsLineSeg->pos());
skyline.north().add(lineShape.adjust(0.0, -lyricsVerticalPadding, 0.0, 0.0));
if (lyricsLineSeg->lyricsLine()->lyrics()->addToSkyline()) {
Shape lineShape = lyricsLineSeg->shape().translate(lyricsLineSeg->pos());
skyline.north().add(lineShape.adjust(0.0, -lyricsVerticalPadding, 0.0, 0.0));
}
}
}
for (auto& pair : lyricsVersesBelow) {
LyricsVerse& lyricsVerse = pair.second;
for (Lyrics* lyrics : lyricsVerse.lyrics()) {
Shape lyricsShape = lyrics->highResShape().translated(PointF(lyrics->pageX() - systemX, lyrics->pos().y()));
skyline.south().add(lyricsShape.adjust(0.0, 0.0, 0.0, lyricsVerticalPadding));
if (lyrics->addToSkyline()) {
Shape lyricsShape
= lyrics->highResShape().translated(PointF(lyrics->pageX() - systemX, lyrics->yRelativeToStaff()));
skyline.south().add(lyricsShape.adjust(0.0, 0.0, 0.0, lyricsVerticalPadding));
}
}
for (LyricsLineSegment* lyricsLineSeg : lyricsVerse.lines()) {
Shape lineShape = lyricsLineSeg->shape().translate(lyricsLineSeg->pos());
skyline.south().add(lineShape.adjust(0.0, 0.0, 0.0, lyricsVerticalPadding));
if (lyricsLineSeg->lyricsLine()->lyrics()->addToSkyline()) {
Shape lineShape = lyricsLineSeg->shape().translate(lyricsLineSeg->pos());
skyline.south().add(lineShape.adjust(0.0, 0.0, 0.0, lyricsVerticalPadding));
}
}
}
}

0 comments on commit 5765fdb

Please sign in to comment.