summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-08-29 07:11:23 +0200
committerBad Diode <bd@badd10de.dev>2022-08-29 07:11:23 +0200
commitd2a2381066a5aafc71b4c930afa5a473b3bd629b (patch)
treebcac84ab3358dd03fdd70639d4cc5fdb7632e956
parent107b03f9019ec79324e9ef23b5ec9f4aa7e04f75 (diff)
downloadogl-monotext-d2a2381066a5aafc71b4c930afa5a473b3bd629b.tar.gz
ogl-monotext-d2a2381066a5aafc71b4c930afa5a473b3bd629b.zip
Add unpack function for 1bb font encoding to gl texture
-rw-r--r--src/bd-font.c141
-rw-r--r--src/main.c69
2 files changed, 197 insertions, 13 deletions
diff --git a/src/bd-font.c b/src/bd-font.c
new file mode 100644
index 0000000..5276735
--- /dev/null
+++ b/src/bd-font.c
@@ -0,0 +1,141 @@
1/*
2Copyright (c) 2021 Bad Diode
3
4Permission to use, copy, modify, and distribute this software for any
5purpose with or without fee is hereby granted, provided that the above
6copyright notice and this permission notice appear in all copies.
7
8THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9WITH REGARD TO THIS SOFTWARE.
10*/
11
12static const u32 bd_font[] = {
13 0x00000000, 0x00000000, 0x00002400, 0x423c0000,
14 0x00002400, 0x3c420000, 0x0000363e, 0x3e1c0800,
15 0x00081c3e, 0x3e1c0800, 0x001c1c3e, 0x363e081c,
16 0x00081c3e, 0x3e3e081c, 0x00000018, 0x18000000,
17 0x7e7e7e66, 0x667e7e7e, 0x00001824, 0x24180000,
18 0x7e7e665a, 0x5a667e7e, 0x00081c3e, 0x081c221c,
19 0x001c221c, 0x08083e08, 0x00183828, 0x08080c0c,
20 0x003c2424, 0x24343606, 0x00082208, 0x1c082208,
21 0x040c1c3c, 0x1c0c0400, 0x2030383c, 0x38302000,
22 0x081c3e08, 0x083e1c08, 0x00141414, 0x14140014,
23 0x003c2a2a, 0x2c282828, 0x0038043c, 0x423c201e,
24 0x00000000, 0x7e000000, 0x081c3e08, 0x3e1c083e,
25 0x081c3e08, 0x08080800, 0x00080808, 0x083e1c08,
26 0x00001030, 0x7e301000, 0x0000080c, 0x7e0c0800,
27 0x00000000, 0x0002023e, 0x00002466, 0xff662400,
28 0x0008081c, 0x1c3e3e00, 0x003e3e1c, 0x1c080800,
29 0x00000000, 0x00000000, 0x00080808, 0x08080008,
30 0x14141400, 0x00000000, 0x0000143e, 0x143e1400,
31 0x00081c02, 0x1c201e08, 0x00002616, 0x08343200,
32 0x00081408, 0x34122c00, 0x08080800, 0x00000000,
33 0x08040404, 0x04040408, 0x08101010, 0x10101008,
34 0x00001408, 0x3e081400, 0x00000808, 0x3e080800,
35 0x00000000, 0x000c0804, 0x00000000, 0x3e000000,
36 0x00000000, 0x000c0c00, 0x00203018, 0x0c060200,
37 0x00001c22, 0x2a221c00, 0x00000c0a, 0x08083e00,
38 0x00001c20, 0x1c023e00, 0x00001c22, 0x18221c00,
39 0x00001018, 0x143e1000, 0x00003e02, 0x1e201e00,
40 0x00001c02, 0x1e221c00, 0x00003e20, 0x10080400,
41 0x00001c22, 0x1c221c00, 0x00001c22, 0x3c201c00,
42 0x00000c0c, 0x000c0c00, 0x00000c0c, 0x000c0804,
43 0x00100804, 0x04081000, 0x0000003e, 0x003e0000,
44 0x00040810, 0x10080400, 0x001c2220, 0x10080008,
45 0x001c322a, 0x1a021c00, 0x001c2222, 0x3e222200,
46 0x001e221e, 0x22221e00, 0x001c2202, 0x02221c00,
47 0x000e1222, 0x22120e00, 0x003e021e, 0x02023e00,
48 0x003e021e, 0x02020200, 0x001c2202, 0x32221c00,
49 0x00222222, 0x3e222200, 0x003e0808, 0x08083e00,
50 0x00202020, 0x22221c00, 0x0022120a, 0x0e122200,
51 0x00020202, 0x02023e00, 0x0022362a, 0x22222200,
52 0x0022262a, 0x32222200, 0x001c2222, 0x22221c00,
53 0x001e2222, 0x1e020200, 0x001c2222, 0x2a122c00,
54 0x001e2222, 0x1e122200, 0x001c021c, 0x20221c00,
55 0x003e0808, 0x08080800, 0x00222222, 0x22221c00,
56 0x00222222, 0x22140800, 0x0022222a, 0x2a2a1400,
57 0x00221408, 0x08142200, 0x00222214, 0x08080800,
58 0x003e1008, 0x04023e00, 0x1c040404, 0x0404041c,
59 0x0002060c, 0x18302000, 0x1c101010, 0x1010101c,
60 0x08142200, 0x00000000, 0x00000000, 0x00003e00,
61 0x00040810, 0x00000000, 0x00001c20, 0x3c223c00,
62 0x0002021e, 0x22221e00, 0x00001c22, 0x02221c00,
63 0x0020203c, 0x22223c00, 0x00001c22, 0x1e023c00,
64 0x00003c02, 0x021e0202, 0x00003c22, 0x223c201c,
65 0x0002021e, 0x22222200, 0x0008000c, 0x08083e00,
66 0x00200020, 0x2020221c, 0x0002120a, 0x060a3200,
67 0x000c0808, 0x08083e00, 0x0000162a, 0x2a2a2a00,
68 0x00000e32, 0x22222200, 0x00001c22, 0x22221c00,
69 0x00001e22, 0x221e0202, 0x00003c22, 0x223c2070,
70 0x00001a26, 0x02020200, 0x00001c02, 0x1c201e00,
71 0x00043e04, 0x04041800, 0x00002222, 0x22221c00,
72 0x00002222, 0x22140800, 0x00002222, 0x2a2a1400,
73 0x00002214, 0x08142200, 0x00002222, 0x223c201c,
74 0x00003e10, 0x08043e00, 0x18040402, 0x02040418,
75 0x00080808, 0x08080808, 0x0c101020, 0x2010100c,
76 0x00002c1a, 0x00000000, 0x00000814, 0x22223e00,
77 0x001c2202, 0x221c080e, 0x00140022, 0x2222221c,
78 0x1008001c, 0x221e023c, 0x0814001c, 0x203c223c,
79 0x0014001c, 0x203c223c, 0x0408001c, 0x203c223c,
80 0x0814081c, 0x203c223c, 0x00001c02, 0x221c080e,
81 0x0814001c, 0x221e023c, 0x0014001c, 0x221e023c,
82 0x0408001c, 0x221e023c, 0x0014000c, 0x0808083e,
83 0x0014000c, 0x0808083e, 0x0408000c, 0x0808083e,
84 0x0014001c, 0x223e2222, 0x0814081c, 0x223e2222,
85 0x1008003e, 0x021e023e, 0x00001628, 0x1c0a3400,
86 0x003c0a1a, 0x0e0a3a00, 0x0814001c, 0x2222221c,
87 0x0014001c, 0x2222221c, 0x0408001c, 0x2222221c,
88 0x08140022, 0x2222221c, 0x04080022, 0x2222221c,
89 0x00140022, 0x223c201c, 0x14001c22, 0x2222221c,
90 0x14002222, 0x2222221c, 0x00081c22, 0x02221c08,
91 0x0018240e, 0x04043e00, 0x00221408, 0x1c081c08,
92 0x0038041e, 0x041e0438, 0x0030081c, 0x08080806,
93 0x1008001c, 0x203c223c, 0x1008000c, 0x0808083e,
94 0x1008001c, 0x2222221c, 0x10080022, 0x2222221c,
95 0x2c1a000e, 0x32222222, 0x2c1a0022, 0x262a3222,
96 0x001c122c, 0x001e0000, 0x000c120c, 0x001e0000,
97 0x08000804, 0x02221c00, 0x0000003e, 0x02020000,
98 0x0000003e, 0x20200000, 0x06241468, 0x4422f000,
99 0x06241468, 0x54f24000, 0x08000808, 0x08080800,
100 0x00482412, 0x24480000, 0x00122448, 0x24120000,
101 0x00880022, 0x00880022, 0x55885522, 0x55885522,
102 0x55aa55aa, 0x55aa55aa, 0x08080808, 0x08080808,
103 0x0808080f, 0x08080808, 0x08080f08, 0x0f080808,
104 0x14141417, 0x14141414, 0x0000001f, 0x14141414,
105 0x00000f08, 0x0f080808, 0x14141710, 0x17141414,
106 0x14141414, 0x14141414, 0x00001f10, 0x17141414,
107 0x14141710, 0x1f000000, 0x1414141f, 0x00000000,
108 0x08080f08, 0x0f000000, 0x0000000f, 0x08080808,
109 0x080808f8, 0x00000000, 0x080808ff, 0x00000000,
110 0x000000ff, 0x08080808, 0x080808f8, 0x08080808,
111 0x000000ff, 0x00000000, 0x080808ff, 0x08080808,
112 0x0808f808, 0xf8080808, 0x141414f4, 0x14141414,
113 0x1414f404, 0xfc000000, 0x0000fc04, 0xf4141414,
114 0x1414f700, 0xff000000, 0x0000ff00, 0xf7141414,
115 0x1414f404, 0xf4141414, 0x0000ff00, 0xff000000,
116 0x1414f700, 0xf7141414, 0x0808ff00, 0xff000000,
117 0x141414ff, 0x00000000, 0x0000ff00, 0xff080808,
118 0x000000ff, 0x14141414, 0x141414fc, 0x00000000,
119 0x0808f808, 0xf8000000, 0x0000f808, 0xf8080808,
120 0x000000fc, 0x14141414, 0x141414ff, 0x14141414,
121 0x0808ff08, 0xff080808, 0x0808080f, 0x00000000,
122 0x000000f8, 0x08080808, 0xffffffff, 0xffffffff,
123 0x00000000, 0xffffffff, 0x0f0f0f0f, 0x0f0f0f0f,
124 0xf0f0f0f0, 0xf0f0f0f0, 0xffffffff, 0x00000000,
125 0x00002c12, 0x12122c00, 0x000c120a, 0x12223a02,
126 0x003e2202, 0x02020200, 0x00003e14, 0x14141400,
127 0x3e220408, 0x04223e00, 0x00003c12, 0x12120c00,
128 0x00002222, 0x221e0202, 0x002c1a08, 0x08281000,
129 0x1c081c22, 0x221c081c, 0x1c22223e, 0x22221c00,
130 0x1c222222, 0x22143600, 0x1e041824, 0x22221c00,
131 0x0000142a, 0x2a140000, 0x0020142a, 0x2a140200,
132 0x00003c02, 0x1c023c00, 0x001c2222, 0x22222202,
133 0x00003e00, 0x3e003e00, 0x0000081c, 0x08001c00,
134 0x04081008, 0x04001c00, 0x10080408, 0x10001c00,
135 0x30480808, 0x08080808, 0x08080808, 0x08080906,
136 0x00000800, 0x3e000800, 0x00004c32, 0x004c3200,
137 0x00182418, 0x00000000, 0x00001c1c, 0x1c000000,
138 0x00000018, 0x18000000, 0x00f01010, 0x10121418,
139 0x0c342424, 0x00000000, 0x1810083c, 0x00000000,
140 0x00003c3c, 0x3c3c0000, 0x00000000, 0x00000000,
141};
diff --git a/src/main.c b/src/main.c
index 98b9764..4caafc6 100644
--- a/src/main.c
+++ b/src/main.c
@@ -6,8 +6,9 @@
6#include <stdlib.h> 6#include <stdlib.h>
7 7
8#include "shorthand.h" 8#include "shorthand.h"
9#include "bd-font.c"
9 10
10#define TEXT_OVERLAY_SIZE 5 11#define TEXT_OVERLAY_SIZE 100
11 12
12// 13//
13// Callbacks. 14// Callbacks.
@@ -154,6 +155,38 @@ init_context(Context *ctx) {
154 ctx->window = window; 155 ctx->window = window;
155} 156}
156 157
158static inline u32
159unpack_nibble(u8 hex) {
160 const u32 conversion_u32[16] = {
161 0x00000000, 0x00000001, 0x00000100, 0x00000101,
162 0x00010000, 0x00010001, 0x00010100, 0x00010101,
163 0x01000000, 0x01000001, 0x01000100, 0x01000101,
164 0x01010000, 0x01010001, 0x01010100, 0x01010101,
165 };
166 return conversion_u32[hex & 0x0F];
167}
168
169// Unpack N tiles packed at 1bpp.
170static inline void
171unpack_letter(const u32 *src, u32 *dst) {
172 *dst++ = unpack_nibble((src[1] >> 0) & 0x0F);
173 *dst++ = unpack_nibble((src[1] >> 4) & 0x0F);
174 *dst++ = unpack_nibble((src[1] >> 8) & 0x0F);
175 *dst++ = unpack_nibble((src[1] >> 12) & 0x0F);
176 *dst++ = unpack_nibble((src[1] >> 16) & 0x0F);
177 *dst++ = unpack_nibble((src[1] >> 20) & 0x0F);
178 *dst++ = unpack_nibble((src[1] >> 24) & 0x0F);
179 *dst++ = unpack_nibble((src[1] >> 28) & 0x0F);
180 *dst++ = unpack_nibble((src[0] >> 0) & 0x0F);
181 *dst++ = unpack_nibble((src[0] >> 4) & 0x0F);
182 *dst++ = unpack_nibble((src[0] >> 8) & 0x0F);
183 *dst++ = unpack_nibble((src[0] >> 12) & 0x0F);
184 *dst++ = unpack_nibble((src[0] >> 16) & 0x0F);
185 *dst++ = unpack_nibble((src[0] >> 20) & 0x0F);
186 *dst++ = unpack_nibble((src[0] >> 24) & 0x0F);
187 *dst++ = unpack_nibble((src[0] >> 28) & 0x0F);
188}
189
157void 190void
158init_debug_overlay(Context *ctx) { 191init_debug_overlay(Context *ctx) {
159 // Prepare quad rendering. 192 // Prepare quad rendering.
@@ -196,20 +229,29 @@ init_debug_overlay(Context *ctx) {
196 229
197 // Texture atlas. 230 // Texture atlas.
198 // TODO: Full 256 ascii font. 231 // TODO: Full 256 ascii font.
199 u8 texture[] = { 232 u8 texture[256 * 8 * 8] = {0};
200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 233 unpack_letter(&bd_font['A' * 2], (u32*)&texture[0]);
201 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 234 for (size_t i = 0; i < 8; ++i) {
202 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 235 printf("%02x %02x %02x %02x %02x %02x %02x %02x\n",
203 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 236 texture[0 + i * 8],
204 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 237 texture[1 + i * 8],
205 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 238 texture[2 + i * 8],
206 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 239 texture[3 + i * 8],
207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 240 texture[4 + i * 8],
208 }; 241 texture[5 + i * 8],
242 texture[6 + i * 8],
243 texture[7 + i * 8]);
244 }
209 glGenTextures(1, &ctx->text_overlay.tex_id); 245 glGenTextures(1, &ctx->text_overlay.tex_id);
210 glBindTexture(GL_TEXTURE_2D, ctx->text_overlay.tex_id); 246 glBindTexture(GL_TEXTURE_2D, ctx->text_overlay.tex_id);
211 glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, 8 * 3, 8, 0, GL_RED, 247 glTexImage2D(GL_TEXTURE_2D, 0,
248 GL_R8,
249 8, // Width
250 1 * 8, // Height
251 0, GL_RED,
212 GL_UNSIGNED_BYTE, &texture); 252 GL_UNSIGNED_BYTE, &texture);
253 // glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, sizeof(bd_font), 8, 0, GL_RED,
254 // GL_UNSIGNED_BYTE, &bd_font);
213 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 255 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
214 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 256 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
215 glBindTexture(GL_TEXTURE_2D, 0); 257 glBindTexture(GL_TEXTURE_2D, 0);
@@ -249,7 +291,8 @@ init_debug_overlay(Context *ctx) {
249" pos += scalar * offset.xy;\n" 291" pos += scalar * offset.xy;\n"
250" pos = mix(vec2(-1.0), vec2(1.0), pos);\n" 292" pos = mix(vec2(-1.0), vec2(1.0), pos);\n"
251" gl_Position = vec4(pos, 0.0, 1.0);\n" 293" gl_Position = vec4(pos, 0.0, 1.0);\n"
252" tex = tex_coords * vec2(m, 1.0) + vec2(k, 0.0);\n" 294// " tex = tex_coords * vec2(1.0, m) + vec2(0.0, k);\n"
295" tex = tex_coords;\n"
253"}"; 296"}";
254 297
255 // Fragment shader. 298 // Fragment shader.