diff --git a/src/engraving/layout/layoutpage.cpp b/src/engraving/layout/layoutpage.cpp index a5d3b01292df..a275e2170413 100644 --- a/src/engraving/layout/layoutpage.cpp +++ b/src/engraving/layout/layoutpage.cpp @@ -102,7 +102,8 @@ void LayoutPage::collectPage(const LayoutOptions& options, LayoutContext& ctx) { const qreal slb = ctx.score()->styleP(Sid::staffLowerBorder); bool breakPages = ctx.score()->layoutMode() != LayoutMode::SYSTEM; - qreal footerExtension = qMax(0.0, ctx.page->footerHeight() - ctx.score()->styleP(Sid::footerOffset)); // how much the footer extends above the margin + qreal footerExtension = qMax(0.0, ctx.page->footerHeight() - ctx.score()->styleV(Sid::footerOffset).value().y()); // how much the footer extends above the margin + qreal headerExtension = qMax(0.0, ctx.page->headerHeight() - ctx.score()->styleV(Sid::headerOffset).value().y()); // how much the header extends below the margin qreal endY = ctx.page->height() - ctx.page->bm() - footerExtension; qreal y = 0.0; @@ -116,7 +117,7 @@ void LayoutPage::collectPage(const LayoutOptions& options, LayoutContext& ctx) ctx.page->system(0)->restoreLayout2(); y = ctx.page->system(0)->y() + ctx.page->system(0)->height(); } else { - y = ctx.page->tm(); + y = ctx.page->tm() + headerExtension; } for (int i = 1; i < pSystems; ++i) { System* cs = ctx.page->system(i); diff --git a/src/engraving/libmscore/page.cpp b/src/engraving/libmscore/page.cpp index 4ff84d5a1c57..9ed0336e8392 100644 --- a/src/engraving/libmscore/page.cpp +++ b/src/engraving/libmscore/page.cpp @@ -265,9 +265,9 @@ qreal Page::headerHeight() const Text* headerCenter = layoutHeaderFooter(1, s2); Text* headerRight = layoutHeaderFooter(2, s3); - qreal headerLeftHeight = headerLeft ? headerLeft->height() : 0.0; - qreal headerCenterHeight = headerCenter ? headerCenter->height() : 0.0; - qreal headerRightHeight = headerRight ? headerRight->height() : 0.0; + qreal headerLeftHeight = headerLeft ? headerLeft->visibleHeight() : 0.0; + qreal headerCenterHeight = headerCenter ? headerCenter->visibleHeight() : 0.0; + qreal headerRightHeight = headerRight ? headerRight->visibleHeight() : 0.0; return qMax(headerLeftHeight, qMax(headerCenterHeight, headerRightHeight)); } @@ -304,9 +304,9 @@ qreal Page::footerHeight() const Text* footerCenter = layoutHeaderFooter(4, s2); Text* footerRight = layoutHeaderFooter(5, s3); - qreal footerLeftHeight = footerLeft ? footerLeft->height() : 0.0; - qreal footerCenterHeight = footerCenter ? footerCenter->height() : 0.0; - qreal footerRightHeight = footerRight ? footerRight->height() : 0.0; + qreal footerLeftHeight = footerLeft ? footerLeft->visibleHeight() : 0.0; + qreal footerCenterHeight = footerCenter ? footerCenter->visibleHeight() : 0.0; + qreal footerRightHeight = footerRight ? footerRight->visibleHeight() : 0.0; qreal footerHeight = qMax(footerLeftHeight, qMax(footerCenterHeight, footerRightHeight)); diff --git a/src/engraving/libmscore/textbase.cpp b/src/engraving/libmscore/textbase.cpp index 714a39edc41d..76b2721a4025 100644 --- a/src/engraving/libmscore/textbase.cpp +++ b/src/engraving/libmscore/textbase.cpp @@ -2013,15 +2013,12 @@ void TextBase::layout1() for (int i = 0; i < rows(); ++i) { TextBlock* t = &_layout[i]; t->layout(this); - // if the text block is empty, ignore it const RectF* r = &t->boundingRect(); if (r->height() == 0) { r = &_layout[i - i].boundingRect(); } - if (t->columns() != 0) { - y += t->lineSpacing(); - } + y += t->lineSpacing(); t->setY(y); bb |= r->translated(0.0, y); } @@ -2135,6 +2132,34 @@ qreal TextBase::lineHeight() const return fontMetrics().height(); } +//--------------------------------------------------------- +// visibleHeight +//--------------------------------------------------------- + +qreal TextBase::visibleHeight() +{ + RectF bb; + qreal y = 0; + + // adjust the bounding box for the text item + for (int i = 0; i < rows(); ++i) { + TextBlock* t = &_layout[i]; + if (t->columns() == 0 && i != rows() - 1) { + continue; + } + t->layout(this); + const RectF* r = &t->boundingRect(); + + if (r->height() == 0) { + r = &_layout[i - i].boundingRect(); + } + y += t->lineSpacing(); + t->setY(y); + bb |= r->translated(0.0, y); + } + return bb.height(); +} + //--------------------------------------------------------- // baseLine //--------------------------------------------------------- diff --git a/src/engraving/libmscore/textbase.h b/src/engraving/libmscore/textbase.h index 12b85e18abbe..62734903b284 100644 --- a/src/engraving/libmscore/textbase.h +++ b/src/engraving/libmscore/textbase.h @@ -340,6 +340,7 @@ class TextBase : public EngravingItem qreal lineSpacing() const; qreal lineHeight() const; virtual qreal baseLine() const override; + qreal visibleHeight(); bool empty() const { return xmlText().isEmpty(); } void clear() { setXmlText(QString()); }