1 /* This file is part of the KDE project
2  * Copyright (C) 2007 Marijn Kruisselbrink <mkruisselbrink@kde.org>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19 #include "MusicStyle.h"
20 
21 #include <QPainterPath>
22 
23 using namespace MusicCore;
24 
MusicStyle()25 MusicStyle::MusicStyle()
26 #ifdef Q_WS_MAC
27     : m_font("Emmentaler 14")
28 #else
29     : m_font("Emmentaler")
30 #endif
31     , m_textAsPath(false)
32 {
33     m_font.setPixelSize(20);
34     m_staffLinePen.setWidthF(0.5);
35     m_staffLinePen.setCapStyle(Qt::RoundCap);
36     m_staffLinePen.setColor(Qt::black);
37     m_stemPen.setWidthF(0.7);
38     m_stemPen.setCapStyle(Qt::FlatCap);
39     m_stemPen.setColor(Qt::black);
40     m_noteDotPen.setWidthF(1.9);
41     m_noteDotPen.setCapStyle(Qt::RoundCap);
42     m_noteDotPen.setColor(Qt::black);
43 }
44 
~MusicStyle()45 MusicStyle::~MusicStyle()
46 {
47 }
48 
staffLinePen(const QColor & color)49 QPen MusicStyle::staffLinePen(const QColor& color)
50 {
51     m_staffLinePen.setColor(color);
52     return m_staffLinePen;
53 }
54 
stemPen(const QColor & color)55 QPen MusicStyle::stemPen(const QColor& color)
56 {
57     m_stemPen.setColor(color);
58     return m_stemPen;
59 }
60 
noteDotPen(const QColor & color)61 QPen MusicStyle::noteDotPen(const QColor& color)
62 {
63     m_noteDotPen.setColor(color);
64     return m_noteDotPen;
65 }
66 
beamLineWidth()67 qreal MusicStyle::beamLineWidth()
68 {
69     return 3.0;
70 }
71 
renderText(QPainter & painter,qreal x,qreal y,const QString & text)72 void MusicStyle::renderText(QPainter& painter, qreal x, qreal y, const QString& text)
73 {
74     QPointF p(x, y);
75     if(m_textAsPath) {
76         QPainterPath textPath;
77         textPath.setFillRule(Qt::OddEvenFill);
78         textPath.addText(p, m_font, text);
79         painter.save();
80         painter.setBrush(painter.pen().brush().color());
81         painter.drawPath(textPath);
82         painter.restore();
83     }
84     else {
85         painter.drawText(p, text);
86     }
87 }
88 
textAsPath() const89 bool MusicStyle::textAsPath() const
90 {
91     return m_textAsPath;
92 }
93 
setTextAsPath(bool drawTextAsPath)94 void MusicStyle::setTextAsPath(bool drawTextAsPath)
95 {
96     m_textAsPath = drawTextAsPath;
97 }
98 
renderNoteHead(QPainter & painter,qreal x,qreal y,Duration duration,const QColor & color)99 void MusicStyle::renderNoteHead(QPainter& painter, qreal x, qreal y, Duration duration, const QColor& color)
100 {
101     painter.setPen(QPen(color, 0));
102     painter.setFont(m_font);
103     switch (duration) {
104         case HundredTwentyEighthNote:
105         case SixtyFourthNote:
106         case ThirtySecondNote:
107         case SixteenthNote:
108         case EighthNote:
109         case QuarterNote:
110             renderText(painter, x, y, QString(0xE125));
111             break;
112         case HalfNote:
113             renderText(painter, x, y, QString(0xE124));
114             break;
115         case WholeNote:
116             renderText(painter, x, y, QString(0xE123));
117             break;
118         case BreveNote:
119             renderText(painter, x, y, QString(0xE122));
120             break;
121     }
122 }
123 
renderRest(QPainter & painter,qreal x,qreal y,Duration duration,const QColor & color)124 void MusicStyle::renderRest(QPainter& painter, qreal x, qreal y, Duration duration, const QColor& color)
125 {
126     painter.setPen(QPen(color, 0));
127     painter.setFont(m_font);
128     QPointF p(x, y);
129     switch (duration) {
130         case HundredTwentyEighthNote:
131             renderText(painter, x, y, QString(0xE10D));
132             break;
133         case SixtyFourthNote:
134             renderText(painter, x, y, QString(0xE10C));
135             break;
136         case ThirtySecondNote:
137             renderText(painter, x, y, QString(0xE10B));
138             break;
139         case SixteenthNote:
140             renderText(painter, x, y, QString(0xE10A));
141             break;
142         case EighthNote:
143             renderText(painter, x, y, QString(0xE109));
144             break;
145         case QuarterNote:
146             renderText(painter, x, y, QString(0xE107));
147             break;
148         case HalfNote:
149             renderText(painter, x, y, QString(0xE101));
150             break;
151         case WholeNote:
152             renderText(painter, x, y, QString(0xE100));
153             break;
154         case BreveNote:
155             renderText(painter, x, y, QString(0xE106));
156             break;
157     }
158 }
159 
renderClef(QPainter & painter,qreal x,qreal y,Clef::ClefShape shape,const QColor & color)160 void MusicStyle::renderClef(QPainter& painter, qreal x, qreal y, Clef::ClefShape shape, const QColor& color)
161 {
162     painter.setPen(QPen(color, 0));
163     painter.setFont(m_font);
164     QPointF p(x, y);
165     switch (shape) {
166         case Clef::GClef:
167             renderText(painter, x, y, QString(0xE195));
168             break;
169         case Clef::FClef:
170             renderText(painter, x, y, QString(0xE193));
171             break;
172         case Clef::CClef:
173             renderText(painter, x, y, QString(0xE191));
174             break;
175     }
176 }
177 
renderAccidental(QPainter & painter,qreal x,qreal y,int accidental,const QColor & color)178 void MusicStyle::renderAccidental(QPainter& painter, qreal x, qreal y, int accidental, const QColor& color)
179 {
180     painter.setPen(QPen(color, 0));
181     painter.setFont(m_font);
182     QPointF p(x, y);
183     switch (accidental) {
184         case 0:
185             renderText(painter, x, y, QString(0xE111));
186             break;
187         case 1:
188             renderText(painter, x, y, QString(0xE10E));
189             break;
190         case 2:
191             renderText(painter, x, y, QString(0xE116));
192             break;
193         case -1:
194             renderText(painter, x, y, QString(0xE112));
195             break;
196         case -2:
197             renderText(painter, x, y, QString(0xE114));
198             break;
199     }
200 }
201 
renderTimeSignatureNumber(QPainter & painter,qreal x,qreal y,qreal w,int number,const QColor & color)202 void MusicStyle::renderTimeSignatureNumber(QPainter& painter, qreal x, qreal y, qreal w, int number, const QColor& color)
203 {
204     painter.setPen(QPen(color, 0));
205     painter.setFont(m_font);
206     QFontMetricsF m(m_font);
207     QString txt = QString::number(number);
208 
209     renderText(painter, x + (w - m.width(txt))/2, y, txt);
210 }
211 
renderNoteFlags(QPainter & painter,qreal x,qreal y,Duration duration,bool stemsUp,const QColor & color)212 void MusicStyle::renderNoteFlags(QPainter& painter, qreal x, qreal y, Duration duration, bool stemsUp, const QColor& color)
213 {
214     painter.setPen(QPen(color, 0));
215     painter.setFont(m_font);
216     QPointF p(x + 0.4, y);
217     switch (duration) {
218         case HundredTwentyEighthNote:
219             // no 128 flag in emmentaler, so stack 16th and 32nd on top of each other...
220             renderText(painter, x, y, QString(stemsUp ? 0xE189 : 0xE18F));
221             renderText(painter, p.x(), p.y() + (stemsUp ? 13 : -13), QString(stemsUp ? 0xE188 : 0xE18E));
222             break;
223         case SixtyFourthNote:
224             renderText(painter, x, y, QString(stemsUp ? 0xE18A : 0xE190));
225             break;
226         case ThirtySecondNote:
227             renderText(painter, x, y, QString(stemsUp ? 0xE189 : 0xE18F));
228             break;
229         case SixteenthNote:
230             renderText(painter, x, y, QString(stemsUp ? 0xE188 : 0xE18E));
231             break;
232         case EighthNote:
233             renderText(painter, x, y, QString(stemsUp ? 0xE187 : 0xE18B));
234             break;
235         default:
236             // no flags
237             break;
238     }
239 }
240