OXYGENHUB
◆ main x16-emulator / src / rendertext.c
7.1 KiB · C · last changed chore(): initial commit 15 days ago source blame history raw
1
#include <string.h>
2
#include <SDL.h>
3
#ifdef __MINGW32__
4
#include <ctype.h>
5
#endif
6
#include "rendertext.h"
7
8
#define CHARACTER_WIDTH 5
9
#define CHARACTER_HEIGHT 7
10
#define TEXTURE_HEIGHT (CHARACTER_HEIGHT * 1)
11
#define TEXTURE_WIDTH (CHARACTER_WIDTH * 0x60)
12
13
// Text Area origin => debug area
14
int xPos = 0;
15
int yPos = 0;
16
17
// font texture
18
SDL_Texture *fontTexture;
19
int textureInitialized = 0;
20
21
// *******************************************************************************************
22
// left trim string
23
//
24
char *ltrim(char *s)
25
{
26
	while(isspace((unsigned char)*s)) s++;
27
	return s;
28
}
29
30
// *******************************************************************************************
31
//
32
//										Simple 5 x 7 Font
33
//
34
// *******************************************************************************************
35
36
static unsigned char fontdata[] = {
37
	0x00, 0x00, 0x00, 0x00, 0x00,   // 0x20 (space)
38
	0x00, 0x00, 0x5F, 0x00, 0x00,   // 0x21 '!'
39
	0x00, 0x07, 0x00, 0x07, 0x00,   // 0x22 '"'
40
	0x14, 0x7F, 0x14, 0x7F, 0x14,   // 0x23 '#'
41
	0x24, 0x2A, 0x7F, 0x2A, 0x12,   // 0x24 '$'
42
	0x23, 0x13, 0x08, 0x64, 0x62,   // 0x25 '%'
43
	0x36, 0x49, 0x55, 0x22, 0x50,   // 0x26 '&'
44
	0x00, 0x05, 0x03, 0x00, 0x00,   // 0x27 '''
45
	0x00, 0x1C, 0x22, 0x41, 0x00,   // 0x28 '('
46
	0x00, 0x41, 0x22, 0x1C, 0x00,   // 0x29 ')'
47
	0x08, 0x2A, 0x1C, 0x2A, 0x08,   // 0x2A '*'
48
	0x08, 0x08, 0x3E, 0x08, 0x08,   // 0x2B '+'
49
	0x00, 0x50, 0x30, 0x00, 0x00,   // 0x2C ','
50
	0x08, 0x08, 0x08, 0x08, 0x08,   // 0x2D '-'
51
	0x00, 0x60, 0x60, 0x00, 0x00,   // 0x2E '.'
52
	0x20, 0x10, 0x08, 0x04, 0x02,   // 0x2F '/'
53
	0x3E, 0x51, 0x49, 0x45, 0x3E,   // 0x30 '0'
54
	0x00, 0x42, 0x7F, 0x40, 0x00,   // 0x31 '1'
55
	0x42, 0x61, 0x51, 0x49, 0x46,   // 0x32 '2'
56
	0x21, 0x41, 0x45, 0x4B, 0x31,   // 0x33 '3'
57
	0x18, 0x14, 0x12, 0x7F, 0x10,   // 0x34 '4'
58
	0x27, 0x45, 0x45, 0x45, 0x39,   // 0x35 '5'
59
	0x3C, 0x4A, 0x49, 0x49, 0x30,   // 0x36 '6'
60
	0x01, 0x71, 0x09, 0x05, 0x03,   // 0x37 '7'
61
	0x36, 0x49, 0x49, 0x49, 0x36,   // 0x38 '8'
62
	0x06, 0x49, 0x49, 0x29, 0x1E,   // 0x39 '9'
63
	0x00, 0x36, 0x36, 0x00, 0x00,   // 0x3A ':'
64
	0x00, 0x56, 0x36, 0x00, 0x00,   // 0x3B ';'
65
	0x00, 0x08, 0x14, 0x22, 0x41,   // 0x3C '<'
66
	0x14, 0x14, 0x14, 0x14, 0x14,   // 0x3D '='
67
	0x41, 0x22, 0x14, 0x08, 0x00,   // 0x3E '>'
68
	0x02, 0x01, 0x51, 0x09, 0x06,   // 0x3F '?'
69
	0x32, 0x49, 0x79, 0x41, 0x3E,   // 0x40 '@'
70
	0x7E, 0x11, 0x11, 0x11, 0x7E,   // 0x41 'A'
71
	0x7F, 0x49, 0x49, 0x49, 0x36,   // 0x42 'B'
72
	0x3E, 0x41, 0x41, 0x41, 0x22,   // 0x43 'C'
73
	0x7F, 0x41, 0x41, 0x22, 0x1C,   // 0x44 'D'
74
	0x7F, 0x49, 0x49, 0x49, 0x41,   // 0x45 'E'
75
	0x7F, 0x09, 0x09, 0x01, 0x01,   // 0x46 'F'
76
	0x3E, 0x41, 0x41, 0x51, 0x32,   // 0x47 'G'
77
	0x7F, 0x08, 0x08, 0x08, 0x7F,   // 0x48 'H'
78
	0x00, 0x41, 0x7F, 0x41, 0x00,   // 0x49 'I'
79
	0x20, 0x40, 0x41, 0x3F, 0x01,   // 0x4A 'J'
80
	0x7F, 0x08, 0x14, 0x22, 0x41,   // 0x4B 'K'
81
	0x7F, 0x40, 0x40, 0x40, 0x40,   // 0x4C 'L'
82
	0x7F, 0x02, 0x04, 0x02, 0x7F,   // 0x4D 'M'
83
	0x7F, 0x04, 0x08, 0x10, 0x7F,   // 0x4E 'N'
84
	0x3E, 0x41, 0x41, 0x41, 0x3E,   // 0x4F 'O'
85
	0x7F, 0x09, 0x09, 0x09, 0x06,   // 0x50 'P'
86
	0x3E, 0x41, 0x51, 0x21, 0x5E,   // 0x51 'Q'
87
	0x7F, 0x09, 0x19, 0x29, 0x46,   // 0x52 'R'
88
	0x46, 0x49, 0x49, 0x49, 0x31,   // 0x53 'S'
89
	0x01, 0x01, 0x7F, 0x01, 0x01,   // 0x54 'T'
90
	0x3F, 0x40, 0x40, 0x40, 0x3F,   // 0x55 'U'
91
	0x1F, 0x20, 0x40, 0x20, 0x1F,   // 0x56 'V'
92
	0x7F, 0x20, 0x18, 0x20, 0x7F,   // 0x57 'W'
93
	0x63, 0x14, 0x08, 0x14, 0x63,   // 0x58 'X'
94
	0x03, 0x04, 0x78, 0x04, 0x03,   // 0x59 'Y'
95
	0x61, 0x51, 0x49, 0x45, 0x43,   // 0x5A 'Z'
96
	0x00, 0x00, 0x7F, 0x41, 0x41,   // 0x5B '['
97
	0x02, 0x04, 0x08, 0x10, 0x20,   // 0x5C '\'
98
	0x41, 0x41, 0x7F, 0x00, 0x00,   // 0x5D ']'
99
	0x04, 0x02, 0x01, 0x02, 0x04,   // 0x5E '^'
100
	0x40, 0x40, 0x40, 0x40, 0x40,   // 0x5F '_'
101
	0x00, 0x01, 0x02, 0x04, 0x00,   // 0x60 '`'
102
	0x20, 0x54, 0x54, 0x54, 0x78,   // 0x61 'a'
103
	0x7F, 0x48, 0x44, 0x44, 0x38,   // 0x62 'b'
104
	0x38, 0x44, 0x44, 0x44, 0x20,   // 0x63 'c'
105
	0x38, 0x44, 0x44, 0x48, 0x7F,   // 0x64 'd'
106
	0x38, 0x54, 0x54, 0x54, 0x18,   // 0x65 'e'
107
	0x08, 0x7E, 0x09, 0x01, 0x02,   // 0x66 'f'
108
	0x08, 0x14, 0x54, 0x54, 0x3C,   // 0x67 'g'
109
	0x7F, 0x08, 0x04, 0x04, 0x78,   // 0x68 'h'
110
	0x00, 0x44, 0x7D, 0x40, 0x00,   // 0x69 'i'
111
	0x20, 0x40, 0x44, 0x3D, 0x00,   // 0x6A 'j'
112
	0x00, 0x7F, 0x10, 0x28, 0x44,   // 0x6B 'k'
113
	0x00, 0x41, 0x7F, 0x40, 0x00,   // 0x6C 'l'
114
	0x7C, 0x04, 0x18, 0x04, 0x78,   // 0x6D 'm'
115
	0x7C, 0x08, 0x04, 0x04, 0x78,   // 0x6E 'n'
116
	0x38, 0x44, 0x44, 0x44, 0x38,   // 0x6F 'o'
117
	0x7C, 0x14, 0x14, 0x14, 0x08,   // 0x70 'p'
118
	0x08, 0x14, 0x14, 0x18, 0x7C,   // 0x71 'q'
119
	0x7C, 0x08, 0x04, 0x04, 0x08,   // 0x72 'r'
120
	0x48, 0x54, 0x54, 0x54, 0x20,   // 0x73 's'
121
	0x04, 0x3F, 0x44, 0x40, 0x20,   // 0x74 't'
122
	0x3C, 0x40, 0x40, 0x20, 0x7C,   // 0x75 'u'
123
	0x1C, 0x20, 0x40, 0x20, 0x1C,   // 0x76 'v'
124
	0x3C, 0x40, 0x30, 0x40, 0x3C,   // 0x77 'w'
125
	0x44, 0x28, 0x10, 0x28, 0x44,   // 0x78 'x'
126
	0x0C, 0x50, 0x50, 0x50, 0x3C,   // 0x79 'y'
127
	0x44, 0x64, 0x54, 0x4C, 0x44,   // 0x7A 'z'
128
	0x00, 0x08, 0x36, 0x41, 0x00,   // 0x7B '{'
129
	0x00, 0x00, 0x7F, 0x00, 0x00,   // 0x7C '|'
130
	0x00, 0x41, 0x36, 0x08, 0x00,   // 0x7D '}'
131
	0x08, 0x08, 0x2A, 0x1C, 0x08,   // 0x7E ->'
132
	0x08, 0x1C, 0x2A, 0x08, 0x08,   // 0x7F <-'
133
};
134
135
// *******************************************************************************************
136
//
137
//										Initialize charset
138
//
139
// *******************************************************************************************
140
141
void DEBUGInitChars(SDL_Renderer *renderer) {
142
	uint16_t textureData[TEXTURE_WIDTH * TEXTURE_HEIGHT];
143
	memset(textureData, 0, sizeof textureData);
144
145
	SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "nearest");
146
	fontTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA4444, SDL_TEXTUREACCESS_STATIC, TEXTURE_WIDTH, TEXTURE_HEIGHT);
147
	for (int ch =0x00; ch<0x60; ch++){
148
		int rcx = 0;
149
		for (int x1 = 0; x1 < 5; x1++) {
150
			int rcy = 0;
151
			int pixData = fontdata[ch * 5 + x1];
152
			while (pixData != 0) {
153
				textureData[ch*CHARACTER_WIDTH + rcy*TEXTURE_WIDTH + rcx] = (pixData & 1) ? 0xFFFF : 0x0000;
154
				pixData = pixData >> 1;
155
				rcy++;
156
			}
157
			rcx++;
158
		}
159
	}
160
	SDL_UpdateTexture(fontTexture, NULL, &textureData, TEXTURE_WIDTH*2);
161
	textureInitialized = 1;
162
}
163
164
// *******************************************************************************************
165
//
166
//										Write character
167
//
168
// *******************************************************************************************
169
170
void DEBUGWrite(SDL_Renderer *renderer, int x, int y, int ch, SDL_Color colour) {
171
	if (!textureInitialized) {
172
		DEBUGInitChars(renderer);
173
	}
174
	SDL_SetTextureColorMod(fontTexture, colour.r, colour.g, colour.b);
175
	ch-=0x20;
176
	SDL_Rect srcRect = {
177
		ch* CHARACTER_WIDTH,
178
		0,
179
		CHARACTER_WIDTH,
180
		CHARACTER_HEIGHT
181
	};
182
	SDL_Rect dstRect = {
183
		x*(CHARACTER_WIDTH+1) + xPos,
184
		y*(CHARACTER_HEIGHT+1) + yPos,
185
		CHARACTER_WIDTH,
186
		CHARACTER_HEIGHT
187
	};
188
	SDL_RenderCopy(renderer, fontTexture, &srcRect, &dstRect);
189
}
190
191
// *******************************************************************************************
192
//
193
//										Write String
194
//
195
// *******************************************************************************************
196
197
void DEBUGString(SDL_Renderer *renderer, int x, int y, char *s, SDL_Color colour) {
198
	while (*s != '\0') {
199
		DEBUGWrite(renderer, x++, y, *s++, colour);
200
	}
201
}