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