forked from seppd/qmmp-modern
-
Notifications
You must be signed in to change notification settings - Fork 0
/
bitmapfont.cpp
118 lines (104 loc) · 3.82 KB
/
bitmapfont.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
* This file is based on qmmp source file
* src/plugins/Ui/skinned/skin.cpp
* which is
* Copyright (C) 2007-2016 by Ilya Kotov
* forkotov02@hotmail.ru
*/
#include <QVariant>
#include "bitmapfont.h"
#include "bitmap.h"
#include "skin.h"
BitmapFont::BitmapFont(const QXmlStreamAttributes &attributes, QObject *parent) : QObject(parent)
{
QString name, value;
Q_FOREACH (const QXmlStreamAttribute &i, attributes) {
name = i.name().toString().toLower();
value = i.value().toString();
if (!setProperty(qPrintable(name), QVariant(value))) {
if (dynamicPropertyNames().contains(qPrintable(name))) {
qWarning("%s: unknown property '%s'", Q_FUNC_INFO, qUtf8Printable(name));
setProperty(qPrintable(name), QVariant());
}
qWarning("%s: failed to set '%s' to '%s'", Q_FUNC_INFO, qUtf8Printable(name), qUtf8Printable(value));
}
}
if (m_letters.isEmpty())
setFile(attributes.value("file").toString());
}
void BitmapFont::setFile(const QString &file)
{
if (m_charWidth == 0 || m_charHeight == 0)
return;
QPixmap fontpm;
QString path = Skin::instance()->findFile(file);
if (!path.isEmpty()) {
fontpm.load(path);
if (fontpm.isNull()) {
qWarning("%s: could not load file '%s'", Q_FUNC_INFO, qUtf8Printable(path));
return;
}
} else {
//Bitmap *b = qobject_cast<Bitmap *>(Skin::instance()->getGuiObject(file));
Bitmap *b = Skin::instance()->bitmap(file);
if (b == Q_NULLPTR) {
qWarning("%s: could not find bitmap '%s'", Q_FUNC_INFO, qUtf8Printable(file));
return;
}
fontpm = b->pixmap();
if (fontpm.isNull()) {
qWarning("%s: bitmap '%s' is null", Q_FUNC_INFO, qUtf8Printable(file));
return;
}
}
m_file = file;
QList<QList<QPixmap>> letters;
for (int i = 0; i < 3; i++) {
QList<QPixmap> l;
for (int j = 0; j < 31; j++)
l.append(fontpm.copy(j * m_charWidth - m_hSpacing, i * m_charHeight - m_vSpacing, m_charWidth, m_charHeight));
letters.append(l);
}
/* alphabet */
for (uint i = 97; i < 123; i++)
m_letters.insert(i, letters[0][i - 97]);
/* digits */
for (uint i = 0; i <= 9; i++)
m_letters.insert(i + 48, letters[1][i]);
/* special characters */
m_letters.insert('"', letters[0][27]);
m_letters.insert('@', letters[0][28]);
m_letters.insert(':', letters[1][12]);
m_letters.insert('(', letters[1][13]);
m_letters.insert(')', letters[1][14]);
m_letters.insert('-', letters[1][15]);
m_letters.insert('\'', letters[1][16]);
m_letters.insert('`', letters[1][16]);
m_letters.insert('!', letters[1][17]);
m_letters.insert('_', letters[1][18]);
m_letters.insert('+', letters[1][19]);
m_letters.insert('\\', letters[1][20]);
m_letters.insert('/', letters[1][21]);
m_letters.insert('[', letters[1][22]);
m_letters.insert(']', letters[1][23]);
m_letters.insert('^', letters[1][24]);
m_letters.insert('&', letters[1][25]);
m_letters.insert('%', letters[1][26]);
m_letters.insert('.', letters[1][27]);
m_letters.insert(',', letters[1][27]);
m_letters.insert('=', letters[1][28]);
m_letters.insert('$', letters[1][29]);
m_letters.insert('#', letters[1][30]);
m_letters.insert(229, letters[2][0]);
m_letters.insert(246, letters[2][1]);
m_letters.insert(228, letters[2][2]);
m_letters.insert('?', letters[2][3]);
m_letters.insert('*', letters[2][4]);
m_letters.insert(' ', letters[2][5]);
}
const QPixmap BitmapFont::getLetter(const QChar &ch) const
{ return m_letters[ch]; }
int BitmapFont::width() const
{ return m_charWidth; }
int BitmapFont::height() const
{ return m_charHeight; }