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
bootstrap
bloat-buster
include/bloat-buster

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

@ -1241,17 +1241,16 @@ strlit("/usr/share/fonts/TTF/FiraSans-Regular.ttf")
Vec4 color = {1, 1, 1, 1};
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(u32) indices = {};
u32 index_offset = 0;
u32 x_offset = width_float / 2;
u32 y_offset = height_float / 2;
f32 x_offset = initial_width / 2.0f;
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 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 + 3;
*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;

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