MuseScore/libmscore/stemslash.cpp
anatoly-os 4facafc468 fix #271529: incorrect stem position for some noteheads in layout
Implemented correct notehead bbox width and origin calculations. Fixed
note and chord stems, ledger lines, beams, dots, articulation, slur and chord positions.
2018-05-05 10:34:45 +02:00

70 lines
1.9 KiB
C++

//=============================================================================
// MuseScore
// Music Composition & Notation
//
// Copyright (C) 2013 Werner Schweer
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation and appearing in
// the file LICENCE.GPL
//=============================================================================
#include "stemslash.h"
#include "score.h"
#include "chord.h"
namespace Ms {
//---------------------------------------------------------
// draw
//---------------------------------------------------------
void StemSlash::draw(QPainter* painter) const
{
qreal lw = score()->styleP(Sid::stemWidth);
painter->setPen(QPen(curColor(), lw, Qt::SolidLine, Qt::FlatCap));
painter->drawLine(line);
}
//---------------------------------------------------------
// setLine
//---------------------------------------------------------
void StemSlash::setLine(const QLineF& l)
{
line = l;
qreal w = score()->styleP(Sid::stemWidth) * .5;
setbbox(QRectF(line.p1(), line.p2()).normalized().adjusted(-w, -w, 2.0*w, 2.0*w));
}
//---------------------------------------------------------
// layout
//---------------------------------------------------------
void StemSlash::layout()
{
Stem* stem = chord()->stem();
qreal h2;
qreal _spatium = spatium();
qreal l = chord()->up() ? _spatium : -_spatium;
QPointF p(stem->hookPos());
qreal x = p.x() + _spatium * .1;
qreal y = p.y();
if (chord()->beam()) {
y += l * .3;
h2 = l * .8;
}
else {
y += l * 1.2;
h2 = l * .4;
}
qreal w = chord()->upNote()->bboxRightPos() * .7;
setLine(QLineF(QPointF(x + w, y - h2), QPointF(x - w, y + h2)));
}
}