Fix more font issues
This commit is contained in:
parent
4268284ede
commit
52c4b40cff
@ -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];
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user