Fix more font issues

This commit is contained in:
David Gonzalez Martin 2024-11-15 09:21:19 -06:00 committed by David
parent 4268284ede
commit 52c4b40cff
3 changed files with 21 additions and 17 deletions

View File

@ -5,7 +5,6 @@
TextureAtlas font_create_texture_atlas(Arena* arena, String font_path) TextureAtlas font_create_texture_atlas(Arena* arena, String font_path)
{ {
auto font_file = file_read(arena, font_path); auto font_file = file_read(arena, font_path);
stbtt_fontinfo font_info; stbtt_fontinfo font_info;
if (!stbtt_InitFont(&font_info, font_file.pointer, stbtt_GetFontOffsetForIndex(font_file.pointer, 0))) if (!stbtt_InitFont(&font_info, font_file.pointer, stbtt_GetFontOffsetForIndex(font_file.pointer, 0)))
@ -14,37 +13,39 @@ TextureAtlas font_create_texture_atlas(Arena* arena, String font_path)
} }
TextureAtlas result = {}; TextureAtlas result = {};
u32 char_count = 256;
result.characters = arena_allocate(arena, FontCharacter, char_count);
result.character_height = 64; result.character_height = 64;
result.character_width = result.character_height; result.character_width = result.character_height;
result.height = 1024; result.height = 1024;
result.width = result.height; result.width = result.height;
auto atlas_size = result.width * result.height; auto atlas_size = result.width * result.height;
result.pointer = arena_allocate(arena, u8, atlas_size); result.pointer = arena_allocate(arena, u8, atlas_size);
result.scale = stbtt_ScaleForPixelHeight(&font_info, result.character_height);
float scale_x = 0.0f;
float scale_y = stbtt_ScaleForPixelHeight(&font_info, result.character_height);
// Starting position in the atlas // Starting position in the atlas
u32 x = 0; u32 x = 0;
u32 y = 0; u32 y = 0;
u32 char_count = 256;
for (u32 i = 0; i < char_count; ++i) for (u32 i = 0; i < char_count; ++i)
{ {
u32 width; u32 width;
u32 height; u32 height;
u32 x_offset; int x_offset;
u32 y_offset; int y_offset;
auto ch = (u8)i; auto ch = (u8)i;
u8* bitmap = stbtt_GetCodepointBitmap(&font_info, scale_x, scale_y, ch, (int*)&width, (int*)&height, (int*)&x_offset, (int*)&y_offset); auto* character = &result.characters[i];
if (bitmap) stbtt_GetCodepointHMetrics(&font_info, ch, (int*)&character->advance, (int*)&character->left_bearing);
u8* bitmap = stbtt_GetCodepointBitmap(&font_info, 0.0f, result.scale, ch, (int*)&width, (int*)&height, &x_offset, &y_offset);
if (width > 0 && height > 0)
{ {
for (u32 j = 0; j < height; ++j) for (u32 j = 0; j < height; ++j)
{ {
for (u32 i = 0; i < width; ++i) for (u32 i = 0; i < width; ++i)
{ {
auto atlas_index = (y + j) * result.width + (x + i); auto atlas_index = (y + j) * result.width + (x + i ) + 1;
auto bitmap_index = (height - j - 1) * width + i; auto bitmap_index = (height - j - 1) * width + i;
assert(atlas_index < atlas_size); assert(atlas_index < atlas_size);
result.pointer[atlas_index] = bitmap[bitmap_index]; result.pointer[atlas_index] = bitmap[bitmap_index];

View File

@ -1241,17 +1241,16 @@ strlit("/usr/share/fonts/TTF/FiraSans-Regular.ttf")
Vec4 color = {1, 1, 1, 1}; Vec4 color = {1, 1, 1, 1};
static_assert(sizeof(color) == 4 * sizeof(float)); static_assert(sizeof(color) == 4 * sizeof(float));
auto width_float = (f32)initial_width;
auto height_float = (f32)initial_height;
auto string = strlit("abc"); auto string = strlit("abcdefghi");
VirtualBuffer(Vertex) vertices = {}; VirtualBuffer(Vertex) vertices = {};
VirtualBuffer(u32) indices = {}; VirtualBuffer(u32) indices = {};
u32 index_offset = 0; u32 index_offset = 0;
u32 x_offset = width_float / 2; f32 x_offset = initial_width / 2.0f;
u32 y_offset = height_float / 2; f32 y_offset = initial_height / 2.0f;
f32 font_scale = texture_atlas.scale;
for (u64 i = 0; i < string.length; i += 1, index_offset += 4, x_offset += texture_atlas.character_width) for (u64 i = 0; i < string.length; i += 1, index_offset += 4)
{ {
auto ch = string.pointer[i]; auto ch = string.pointer[i];
auto character_count_per_row = texture_atlas.width / texture_atlas.character_width; auto character_count_per_row = texture_atlas.width / texture_atlas.character_width;
@ -1297,6 +1296,8 @@ strlit("/usr/share/fonts/TTF/FiraSans-Regular.ttf")
*vb_add(&indices, 1) = index_offset + 1; *vb_add(&indices, 1) = index_offset + 1;
*vb_add(&indices, 1) = index_offset + 3; *vb_add(&indices, 1) = index_offset + 3;
*vb_add(&indices, 1) = index_offset + 2; *vb_add(&indices, 1) = index_offset + 2;
x_offset += texture_atlas.characters[i].advance * font_scale;
} }
auto vertex_buffer_size = sizeof(*vertices.pointer) * vertices.length; auto vertex_buffer_size = sizeof(*vertices.pointer) * vertices.length;

View File

@ -3,7 +3,8 @@
STRUCT(FontCharacter) STRUCT(FontCharacter)
{ {
int advance; u32 advance;
u32 left_bearing;
}; };
STRUCT(TextureAtlas) STRUCT(TextureAtlas)
@ -14,6 +15,7 @@ STRUCT(TextureAtlas)
u32 height; u32 height;
u32 character_width; u32 character_width;
u32 character_height; u32 character_height;
f32 scale;
}; };
EXPORT TextureAtlas font_create_texture_atlas(Arena* arena, String font_path); EXPORT TextureAtlas font_create_texture_atlas(Arena* arena, String font_path);