void TrillSegment::symbolLine(SymId start, SymId fill) { qreal x1 = 0; qreal x2 = pos2().x(); qreal w = x2 - x1; qreal mag = magS(); ScoreFont* f = score()->scoreFont(); _symbols.clear(); _symbols.append(f->toString(start)); qreal w1 = f->bbox(start, mag).width(); qreal w2 = f->width(fill, mag); int n = lrint((w - w1) / w2); for (int i = 0; i < n; ++i) _symbols.append(f->toString(fill)); QRectF r(f->bbox(_symbols, mag)); setbbox(r); }
void VibratoSegment::symbolLine(SymId start, SymId fill, SymId end) { qreal x1 = 0; qreal x2 = pos2().x(); qreal w = x2 - x1; qreal mag = magS(); ScoreFont* f = score()->scoreFont(); _symbols.clear(); _symbols.push_back(start); qreal w1 = f->bbox(start, mag).width(); qreal w2 = f->width(fill, mag); qreal w3 = f->width(end, mag); int n = lrint((w - w1 - w3) / w2); for (int i = 0; i < n; ++i) _symbols.push_back(fill); _symbols.push_back(end); QRectF r(f->bbox(_symbols, mag)); setbbox(r); }
void Arpeggio::symbolLine(SymId end, SymId fill) { qreal y1 = -_userLen1; qreal y2 = _height + _userLen2; qreal w = y2 - y1; qreal mag = magS(); ScoreFont* f = score()->scoreFont(); const QString& fillString = f->toString(fill); symbols.clear(); symbols.append(f->toString(end)); qreal w1 = f->bbox(end, mag).width(); qreal w2 = f->width(fill, mag); int n = lrint((w - w1) / w2); for (int i = 0; i < n; ++i) symbols.prepend(fillString); }
void TrillSegment::symbolLine(SymId start, SymId fill) { qreal x1 = 0; qreal x2 = pos2().x(); qreal w = x2 - x1; qreal mag = magS(); ScoreFont* f = score()->scoreFont(); _symbols.clear(); _symbols.push_back(start); qreal w1 = f->advance(start, mag); qreal w2 = f->advance(fill, mag); int n = lrint((w - w1) / w2); for (int i = 0; i < n; ++i) _symbols.push_back(fill); QRectF r(f->bbox(_symbols, mag)); setbbox(r); }
void TimeSig::layout() { setPos(0.0, 0.0); qreal _spatium = spatium(); setbbox(QRectF()); // prepare for an empty time signature pointLargeLeftParen = QPointF(); pz = QPointF(); pn = QPointF(); pointLargeRightParen = QPointF(); qreal lineDist; int numOfLines; TimeSigType sigType = timeSigType(); Staff* _staff = staff(); if (_staff) { // if staff is without time sig, format as if no text at all if (!_staff->staffType(tick())->genTimesig() ) { // reset position and box sizes to 0 // qDebug("staff: no time sig"); pointLargeLeftParen.rx() = 0.0; pn.rx() = 0.0; pz.rx() = 0.0; pointLargeRightParen.rx() = 0.0; setbbox(QRectF()); // leave everything else as it is: // draw() will anyway skip any drawing if staff type has no time sigs return; } numOfLines = _staff->lines(tick()); lineDist = _staff->lineDistance(tick()); } else { // assume dimensions of a standard staff lineDist = 1.0; numOfLines = 5; } // if some symbol // compute vert. displacement to center in the staff height // determine middle staff position: qreal yoff = _spatium * (numOfLines-1) *.5 * lineDist; // C and Ccut are placed at the middle of the staff: use yoff directly if (sigType == TimeSigType::FOUR_FOUR) { pz = QPointF(0.0, yoff); setbbox(symBbox(SymId::timeSigCommon).translated(pz)); ns.clear(); ns.push_back(SymId::timeSigCommon); ds.clear(); } else if (sigType == TimeSigType::ALLA_BREVE) { pz = QPointF(0.0, yoff); setbbox(symBbox(SymId::timeSigCutCommon).translated(pz)); ns.clear(); ns.push_back(SymId::timeSigCutCommon); ds.clear(); } else { ns = toTimeSigString(_numeratorString.isEmpty() ? QString::number(_sig.numerator()) : _numeratorString); ds = toTimeSigString(_denominatorString.isEmpty() ? QString::number(_sig.denominator()) : _denominatorString); ScoreFont* font = score()->scoreFont(); QSizeF mag(magS() * _scale); QRectF numRect = font->bbox(ns, mag); QRectF denRect = font->bbox(ds, mag); // position numerator and denominator; vertical displacement: // number of lines is odd: 0.0 (strings are directly above and below the middle line) // number of lines even: 0.05 (strings are moved up/down to leave 1/10sp between them) qreal displ = (numOfLines & 1) ? 0.0 : (0.05 * _spatium); //align on the wider qreal pzY = yoff - (denRect.width() < 0.01 ? 0.0 : (displ + numRect.height() * .5)); qreal pnY = yoff + displ + denRect.height() * .5; if (numRect.width() >= denRect.width()) { // numerator: one space above centre line, unless denomin. is empty (if so, directly centre in the middle) pz = QPointF(0.0, pzY); // denominator: horiz: centred around centre of numerator | vert: one space below centre line pn = QPointF((numRect.width() - denRect.width())*.5, pnY); } else { // numerator: one space above centre line, unless denomin. is empty (if so, directly centre in the middle) pz = QPointF((denRect.width() - numRect.width())*.5, pzY); // denominator: horiz: centred around centre of numerator | vert: one space below centre line pn = QPointF(0.0, pnY); } // centering of parenthesis so the middle of the parenthesis is at the divisor marking level int centerY = yoff/2 + _spatium; int widestPortion = numRect.width() > denRect.width() ? numRect.width() : denRect.width(); pointLargeLeftParen = QPointF(-_spatium, centerY); pointLargeRightParen = QPointF(widestPortion + _spatium, centerY); setbbox(numRect.translated(pz)); // translate bounding boxes to actual string positions addbbox(denRect.translated(pn)); if (_largeParentheses) { addbbox(QRect(pointLargeLeftParen.x(), pointLargeLeftParen.y() - denRect.height(), _spatium / 2, numRect.height() + denRect.height())); addbbox(QRect(pointLargeRightParen.x(), pointLargeRightParen.y() - denRect.height(), _spatium / 2, numRect.height() + denRect.height())); } } }