1
#include "sfont.h"
2
3
typedef struct {
4
/* 8x14 */
5
unsigned char bitmap[14];
6
} egachar;
7
8
typedef struct {
9
egachar charset[256];
10
} egafont;
11
12
13
sdlfont *read_ega_sdlfont(SDL_Renderer *renderer, const char *filename) {
14
egafont font;
15
FILE *f = fopen(filename, "r");
16
fread(&font, sizeof(egafont), 1, f);
17
fclose(f);
18
19
sdlfont *sfont = malloc(sizeof(*sfont));
20
21
for (int i = 0; i < 256; ++i) {
22
egachar c = font.charset[i];
23
SDL_Texture *t = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB24, SDL_TEXTUREACCESS_TARGET, 8, 14);
24
SDL_SetRenderTarget(renderer, t);
25
SDL_RenderClear(renderer);
26
27
for (int row = 0; row < 14; ++row) {
28
unsigned char rowdata = c.bitmap[row],
29
mask = 0x80;
30
for (int offset = 0; offset < 8; ++offset) {
31
if (rowdata & mask) {
32
SDL_RenderDrawPoint(renderer, offset, row);
33
}
34
mask /= 2;
35
}
36
}
37
38
sfont->charset[i] = t;
39
}
40
41
SDL_SetRenderTarget(renderer, NULL);
42
43
return sfont;
44
}
45
46
void render_sfont(SDL_Renderer *renderer, sdlfont *sfont, int character, int x, int y) {
47
SDL_Rect src = { 0, 0, 8, 14 };
48
SDL_Rect dest = { x, y, 8, 14 };
49
SDL_RenderCopy(renderer, sfont->charset[character], &src, &dest);
50
}
51
52
void free_sdlfont(sdlfont *sfont) {
53
for (int i = 0; i < 256; ++i) {
54
SDL_DestroyTexture(sfont->charset[i]);
55
}
56
free(sfont);
57
}
58
59
/* vim: set sw=4 et: */
60