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