scummvm/graphics/fonts/scummfont.cpp

316 lines
13 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* $URL$
* $Id$
*/
#include "graphics/font.h"
namespace Graphics {
// Built-in font
static const byte guifont[] = {
// Header
0, 0, 99, 1, 226, 8,
// Character width table
4, 8, 6, 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
8, 2, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4, 3, 7, 8, 7, 7, 8, 4, 5, 5, 8, 7, 4, 7, 3, 8,
7, 7, 7, 7, 8, 7, 7, 7, 7, 7, 3, 4, 7, 5, 7, 7,
8, 7, 7, 7, 7, 7, 7, 7, 7, 5, 7, 7, 7, 8, 7, 7,
7, 7, 7, 7, 7, 7, 7, 8, 7, 7, 7, 5, 8, 5, 8, 8,
7, 7, 7, 6, 7, 7, 7, 7, 7, 5, 6, 7, 5, 8, 7, 7,
7, 7, 7, 7, 7, 7, 7, 8, 7, 7, 7, 5, 3, 5, 7, 8,
7, 7, 7, 7, 7, 7, 0, 6, 7, 7, 7, 5, 5, 5, 7, 0,
6, 8, 8, 7, 7, 7, 7, 7, 0, 7, 7, 0, 0, 0, 0, 0,
7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 7,
// Character table
0, 0, 0, 0, 0, 0, 0, 0, // 0
1, 3, 6, 12, 24, 62, 3, 0, // 1
128, 192, 96, 48, 24, 124, 192, 0, // 2
0, 3, 62, 24, 12, 6, 3, 1, // 3
0, 192, 124, 24, 48, 96, 192, 128, // 4
0, 0, 0, 0, 0, 0, 0, 0, // 5
0, 0, 0, 0, 0, 0, 0, 0, // 6
0, 0, 0, 0, 0, 0, 0, 0, // 7
0, 0, 0, 0, 0, 0, 0, 0, // 8
0, 0, 0, 0, 0, 0, 0, 0, // 9
0, 0, 0, 0, 0, 0, 0, 0, // 10
0, 0, 0, 0, 0, 0, 0, 0, // 11
0, 0, 0, 0, 0, 0, 0, 0, // 12
0, 0, 0, 0, 0, 0, 0, 0, // 13
0, 0, 0, 0, 0, 0, 0, 0, // 14
0, 0, 0, 0, 0, 0, 0, 0, // 15
237, 74, 72, 0, 0, 0, 0, 0, // 16
128, 128, 128, 0, 0, 0, 0, 0, // 17
0, 0, 0, 0, 0, 0, 0, 0, // 18
60, 66, 153, 161, 161, 153, 66, 60, // 19
0, 0, 0, 0, 0, 0, 0, 0, // 20
0, 0, 0, 0, 0, 0, 0, 0, // 21
0, 0, 0, 0, 0, 0, 0, 0, // 22
0, 0, 0, 0, 0, 0, 0, 0, // 23
0, 0, 0, 0, 0, 0, 0, 0, // 24
0, 0, 0, 0, 0, 0, 0, 0, // 25
0, 0, 0, 0, 0, 0, 0, 0, // 26
0, 0, 0, 0, 0, 0, 0, 0, // 27
0, 0, 0, 0, 0, 0, 0, 0, // 28
0, 0, 0, 0, 0, 0, 0, 0, // 29
0, 0, 0, 0, 0, 0, 0, 0, // 30
0, 0, 0, 0, 0, 0, 0, 0, // 31
0, 0, 0, 0, 0, 0, 0, 0, // 32
96, 96, 96, 96, 0, 0, 96, 0, // 33
102, 102, 102, 0, 0, 0, 0, 0, // 34
102, 102, 255, 102, 255, 102, 102, 0, // 35
24, 62, 96, 60, 6, 124, 24, 0, // 36
98, 102, 12, 24, 48, 102, 70, 0, // 37
60, 102, 60, 56, 103, 102, 63, 0, // 38
96, 48, 16, 0, 0, 0, 0, 0, // 39
24, 48, 96, 96, 96, 48, 24, 0, // 40
96, 48, 24, 24, 24, 48, 96, 0, // 41
0, 102, 60, 255, 60, 102, 0, 0, // 42
0, 24, 24, 126, 24, 24, 0, 0, // 43
0, 0, 0, 0, 0, 48, 48, 96, // 44
0, 0, 0, 126, 0, 0, 0, 0, // 45
0, 0, 0, 0, 0, 96, 96, 0, // 46
0, 3, 6, 12, 24, 48, 96, 0, // 47
60, 102, 102, 102, 102, 102, 60, 0, // 48
24, 24, 56, 24, 24, 24, 126, 0, // 49
60, 102, 6, 12, 48, 96, 126, 0, // 50
60, 102, 6, 28, 6, 102, 60, 0, // 51
6, 14, 30, 102, 127, 6, 6, 0, // 52
126, 96, 124, 6, 6, 102, 60, 0, // 53
60, 102, 96, 124, 102, 102, 60, 0, // 54
126, 102, 12, 24, 24, 24, 24, 0, // 55
60, 102, 102, 60, 102, 102, 60, 0, // 56
60, 102, 102, 62, 6, 102, 60, 0, // 57
0, 0, 96, 0, 0, 96, 0, 0, // 58
0, 0, 48, 0, 0, 48, 48, 96, // 59
14, 24, 48, 96, 48, 24, 14, 0, // 60
0, 0, 120, 0, 120, 0, 0, 0, // 61
112, 24, 12, 6, 12, 24, 112, 0, // 62
60, 102, 6, 12, 24, 0, 24, 0, // 63
0, 0, 0, 255, 255, 0, 0, 0, // 64
24, 60, 102, 126, 102, 102, 102, 0, // 65
124, 102, 102, 124, 102, 102, 124, 0, // 66
60, 102, 96, 96, 96, 102, 60, 0, // 67
120, 108, 102, 102, 102, 108, 120, 0, // 68
126, 96, 96, 120, 96, 96, 126, 0, // 69
126, 96, 96, 120, 96, 96, 96, 0, // 70
60, 102, 96, 110, 102, 102, 60, 0, // 71
102, 102, 102, 126, 102, 102, 102, 0, // 72
120, 48, 48, 48, 48, 48, 120, 0, // 73
30, 12, 12, 12, 12, 108, 56, 0, // 74
102, 108, 120, 112, 120, 108, 102, 0, // 75
96, 96, 96, 96, 96, 96, 126, 0, // 76
99, 119, 127, 107, 99, 99, 99, 0, // 77
102, 118, 126, 126, 110, 102, 102, 0, // 78
60, 102, 102, 102, 102, 102, 60, 0, // 79
124, 102, 102, 124, 96, 96, 96, 0, // 80
60, 102, 102, 102, 102, 60, 14, 0, // 81
124, 102, 102, 124, 120, 108, 102, 0, // 82
60, 102, 96, 60, 6, 102, 60, 0, // 83
126, 24, 24, 24, 24, 24, 24, 0, // 84
102, 102, 102, 102, 102, 102, 60, 0, // 85
102, 102, 102, 102, 102, 60, 24, 0, // 86
99, 99, 99, 107, 127, 119, 99, 0, // 87
102, 102, 60, 24, 60, 102, 102, 0, // 88
102, 102, 102, 60, 24, 24, 24, 0, // 89
126, 6, 12, 24, 48, 96, 126, 0, // 90
120, 96, 96, 96, 96, 96, 120, 0, // 91
3, 6, 12, 24, 48, 96, 192, 0, // 92
120, 24, 24, 24, 24, 24, 120, 0, // 93
0, 0, 0, 0, 0, 219, 219, 0, // 94
0, 0, 0, 0, 0, 0, 0, 255, // 95
102, 102, 102, 0, 0, 0, 0, 0, // 96
0, 0, 60, 6, 62, 102, 62, 0, // 97
0, 96, 96, 124, 102, 102, 124, 0, // 98
0, 0, 60, 96, 96, 96, 60, 0, // 99
0, 6, 6, 62, 102, 102, 62, 0, // 100
0, 0, 60, 102, 126, 96, 60, 0, // 101
0, 14, 24, 62, 24, 24, 24, 0, // 102
0, 0, 62, 102, 102, 62, 6, 124, // 103
0, 96, 96, 124, 102, 102, 102, 0, // 104
0, 48, 0, 112, 48, 48, 120, 0, // 105
0, 12, 0, 12, 12, 12, 12, 120, // 106
0, 96, 96, 108, 120, 108, 102, 0, // 107
0, 112, 48, 48, 48, 48, 120, 0, // 108
0, 0, 102, 127, 127, 107, 99, 0, // 109
0, 0, 124, 102, 102, 102, 102, 0, // 110
0, 0, 60, 102, 102, 102, 60, 0, // 111
0, 0, 124, 102, 102, 124, 96, 96, // 112
0, 0, 62, 102, 102, 62, 6, 6, // 113
0, 0, 124, 102, 96, 96, 96, 0, // 114
0, 0, 62, 96, 60, 6, 124, 0, // 115
0, 24, 126, 24, 24, 24, 14, 0, // 116
0, 0, 102, 102, 102, 102, 62, 0, // 117
0, 0, 102, 102, 102, 60, 24, 0, // 118
0, 0, 99, 107, 127, 62, 54, 0, // 119
0, 0, 102, 60, 24, 60, 102, 0, // 120
0, 0, 102, 102, 102, 62, 12, 120, // 121
0, 0, 126, 12, 24, 48, 126, 0, // 122
24, 48, 48, 96, 48, 48, 24, 0, // 123
96, 96, 96, 0, 96, 96, 96, 0, // 124
96, 48, 48, 24, 48, 48, 96, 0, // 125
0, 0, 97, 153, 134, 0, 0, 0, // 126
8, 12, 14, 255, 255, 14, 12, 8, // 127
60, 102, 96, 96, 102, 60, 24, 56, // 128
102, 0, 102, 102, 102, 102, 62, 0, // 129
12, 24, 60, 102, 126, 96, 60, 0, // 130
24, 36, 60, 6, 62, 102, 62, 0, // 131
102, 0, 60, 6, 62, 102, 62, 0, // 132
48, 24, 60, 6, 62, 102, 62, 0, // 133
0, 0, 0, 0, 0, 0, 0, 0, // 134
0, 60, 96, 96, 96, 60, 24, 56, // 135
24, 36, 60, 102, 126, 96, 60, 0, // 136
102, 0, 60, 102, 126, 96, 60, 0, // 137
48, 24, 60, 102, 126, 96, 60, 0, // 138
0, 216, 0, 112, 48, 48, 120, 0, // 139
48, 72, 0, 112, 48, 48, 120, 0, // 140
96, 48, 0, 112, 48, 48, 120, 0, // 141
102, 24, 60, 102, 126, 102, 102, 0, // 142
0, 0, 0, 0, 0, 0, 0, 0, // 143
24, 48, 124, 96, 120, 96, 124, 0, // 144
0, 0, 108, 26, 126, 216, 110, 0, // 145
30, 40, 40, 126, 72, 136, 142, 0, // 146
24, 36, 60, 102, 102, 102, 60, 0, // 147
102, 0, 60, 102, 102, 102, 60, 0, // 148
48, 24, 60, 102, 102, 102, 60, 0, // 149
24, 36, 0, 102, 102, 102, 62, 0, // 150
48, 24, 102, 102, 102, 102, 62, 0, // 151
0, 0, 0, 0, 0, 0, 0, 0, // 152
102, 60, 102, 102, 102, 102, 60, 0, // 153
102, 0, 102, 102, 102, 102, 60, 0, // 154
0, 0, 0, 0, 0, 0, 0, 0, // 155
0, 0, 0, 0, 0, 0, 0, 0, // 156
0, 0, 0, 0, 0, 0, 0, 0, // 157
0, 0, 0, 0, 0, 0, 0, 0, // 158
0, 0, 0, 0, 0, 0, 0, 0, // 159
12, 24, 60, 6, 62, 102, 62, 0, // 160
0, 0, 0, 0, 0, 0, 0, 0, // 161
0, 0, 0, 0, 0, 0, 0, 0, // 162
0, 0, 0, 0, 0, 0, 0, 0, // 163
0, 0, 0, 0, 0, 0, 0, 0, // 164
0, 0, 0, 0, 0, 0, 0, 0, // 165
0, 0, 0, 0, 0, 0, 0, 0, // 166
0, 0, 0, 0, 0, 0, 0, 0, // 167
0, 0, 0, 0, 0, 0, 0, 0, // 168
0, 0, 0, 0, 0, 0, 0, 0, // 169
0, 0, 0, 0, 0, 0, 0, 0, // 170
0, 0, 0, 0, 0, 0, 0, 0, // 171
0, 0, 0, 0, 0, 0, 0, 0, // 172
0, 0, 0, 0, 0, 0, 0, 0, // 173
0, 0, 0, 0, 0, 0, 0, 0, // 174
0, 0, 0, 0, 0, 0, 0, 0, // 175
0, 0, 0, 0, 0, 0, 0, 0, // 176
0, 0, 0, 0, 0, 0, 0, 0, // 177
0, 0, 0, 0, 0, 0, 0, 0, // 178
0, 0, 0, 0, 0, 0, 0, 0, // 179
0, 0, 0, 0, 0, 0, 0, 0, // 180
0, 0, 0, 0, 0, 0, 0, 0, // 181
0, 0, 0, 0, 0, 0, 0, 0, // 182
0, 0, 0, 0, 0, 0, 0, 0, // 183
0, 0, 0, 0, 0, 0, 0, 0, // 184
0, 0, 0, 0, 0, 0, 0, 0, // 185
0, 0, 0, 0, 0, 0, 0, 0, // 186
0, 0, 0, 0, 0, 0, 0, 0, // 187
0, 0, 0, 0, 0, 0, 0, 0, // 188
0, 0, 0, 0, 0, 0, 0, 0, // 189
0, 0, 0, 0, 0, 0, 0, 0, // 190
0, 0, 0, 0, 0, 0, 0, 0, // 191
0, 0, 0, 0, 0, 0, 0, 0, // 192
0, 0, 0, 0, 0, 0, 0, 0, // 193
0, 0, 0, 0, 0, 0, 0, 0, // 194
0, 0, 0, 0, 0, 0, 0, 0, // 195
0, 0, 0, 0, 0, 0, 0, 0, // 196
0, 0, 0, 0, 0, 0, 0, 0, // 197
0, 0, 0, 0, 0, 0, 0, 0, // 198
0, 0, 0, 0, 0, 0, 0, 0, // 199
0, 0, 0, 0, 0, 0, 0, 0, // 200
0, 0, 0, 0, 0, 0, 0, 0, // 201
0, 0, 0, 0, 0, 0, 0, 0, // 202
0, 0, 0, 0, 0, 0, 0, 0, // 203
0, 0, 0, 0, 0, 0, 0, 0, // 204
0, 0, 0, 0, 0, 0, 0, 0, // 205
0, 0, 0, 0, 0, 0, 0, 0, // 206
0, 0, 0, 0, 0, 0, 0, 0, // 207
0, 0, 0, 0, 0, 0, 0, 0, // 208
0, 0, 0, 0, 0, 0, 0, 0, // 209
0, 0, 0, 0, 0, 0, 0, 0, // 210
0, 0, 0, 0, 0, 0, 0, 0, // 211
0, 0, 0, 0, 0, 0, 0, 0, // 212
0, 0, 0, 0, 0, 0, 0, 0, // 213
0, 0, 0, 0, 0, 0, 0, 0, // 214
0, 0, 0, 0, 0, 0, 0, 0, // 215
0, 0, 0, 0, 0, 0, 0, 0, // 216
0, 0, 0, 0, 0, 0, 0, 0, // 217
0, 0, 0, 0, 0, 0, 0, 0, // 218
0, 0, 0, 0, 0, 0, 0, 0, // 219
0, 0, 0, 0, 0, 0, 0, 0, // 220
0, 0, 0, 0, 0, 0, 0, 0, // 221
0, 0, 0, 0, 0, 0, 0, 0, // 222
0, 0, 0, 0, 0, 0, 0, 0, // 223
0, 0, 0, 0, 0, 0, 0, 0, // 224
28, 54, 54, 124, 102, 102, 124, 64, // 225
0, 0, 0 // ???
};
int ScummFont::getCharWidth(byte chr) const {
return guifont[chr+6];
}
void ScummFont::drawChar(Surface *dst, byte chr, int tx, int ty, uint32 color) const {
assert(dst != 0);
byte *ptr = (byte *)dst->getBasePtr(tx, ty);
const byte *tmp = guifont + 6 + guifont[4] + chr * 8;
uint buffer = 0;
uint mask = 0;
for (int y = 0; y < 8; y++) {
if (ty + y < 0 || ty + y >= dst->h)
continue;
for (int x = 0; x < 8; x++) {
if (tx + x < 0 || tx + x >= dst->w)
continue;
unsigned char c;
mask >>= 1;
if (mask == 0) {
buffer = *tmp++;
mask = 0x80;
}
c = ((buffer & mask) != 0);
if (c) {
if (dst->bytesPerPixel == 1)
ptr[x] = color;
else if (dst->bytesPerPixel == 2)
((uint16 *)ptr)[x] = color;
}
}
ptr += dst->pitch;
}
}
} // End of namespace Graphics