simplify font structures
This commit is contained in:
parent
fc824c4191
commit
988270db0b
34
fonts.d
34
fonts.d
@ -10,15 +10,9 @@ import std.math.traits : isNaN;
|
|||||||
struct FontAtlas
|
struct FontAtlas
|
||||||
{
|
{
|
||||||
Glyph[128] glyphs;
|
Glyph[128] glyphs;
|
||||||
FontMetrics metrics;
|
u8[] data;
|
||||||
u32 size;
|
u32 size;
|
||||||
UVec2 dimensions;
|
UVec2 dimensions;
|
||||||
|
|
||||||
alias metrics this;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct FontMetrics
|
|
||||||
{
|
|
||||||
f32 ascent;
|
f32 ascent;
|
||||||
f32 descent;
|
f32 descent;
|
||||||
f32 line_gap;
|
f32 line_gap;
|
||||||
@ -43,12 +37,6 @@ struct Glyph
|
|||||||
__gshared FT_Library FT_LIB;
|
__gshared FT_Library FT_LIB;
|
||||||
alias FontFace = FT_Face;
|
alias FontFace = FT_Face;
|
||||||
|
|
||||||
struct FontAtlasBuf
|
|
||||||
{
|
|
||||||
u8[] data;
|
|
||||||
FontAtlas atlas;
|
|
||||||
}
|
|
||||||
|
|
||||||
shared static this()
|
shared static this()
|
||||||
{
|
{
|
||||||
FT_Init_FreeType(&FT_LIB);
|
FT_Init_FreeType(&FT_LIB);
|
||||||
@ -99,15 +87,13 @@ TextSize(f32 s)
|
|||||||
return cast(u32)((96.0f/72.0f) * s);
|
return cast(u32)((96.0f/72.0f) * s);
|
||||||
}
|
}
|
||||||
|
|
||||||
FontAtlasBuf
|
FontAtlas
|
||||||
CreateAtlas(Arena* arena, FontFace font, u32 size, UVec2 atlas_dim)
|
CreateAtlas(Arena* arena, FontFace font, u32 size, UVec2 atlas_dim)
|
||||||
{
|
{
|
||||||
FontAtlasBuf abuf = {
|
FontAtlas atlas = {
|
||||||
data: Alloc!(u8)(arena, atlas_dim.x * atlas_dim.y * 4),
|
data: Alloc!(u8)(arena, atlas_dim.x * atlas_dim.y * 4),
|
||||||
atlas: {
|
|
||||||
size: size,
|
size: size,
|
||||||
dimensions: atlas_dim,
|
dimensions: atlas_dim,
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: proper packing algorithm
|
// TODO: proper packing algorithm
|
||||||
@ -121,8 +107,8 @@ CreateAtlas(Arena* arena, FontFace font, u32 size, UVec2 atlas_dim)
|
|||||||
u64 baseline = font.size.metrics.ascender >> 6;
|
u64 baseline = font.size.metrics.ascender >> 6;
|
||||||
u64 line_height = (font.size.metrics.height >> 6)+1;
|
u64 line_height = (font.size.metrics.height >> 6)+1;
|
||||||
|
|
||||||
abuf.atlas.line_height = line_height;
|
atlas.line_height = line_height;
|
||||||
abuf.atlas.max_advance = font.size.metrics.max_advance >> 6;
|
atlas.max_advance = font.size.metrics.max_advance >> 6;
|
||||||
|
|
||||||
u32 max_w, max_h, count;
|
u32 max_w, max_h, count;
|
||||||
|
|
||||||
@ -194,7 +180,7 @@ CreateAtlas(Arena* arena, FontFace font, u32 size, UVec2 atlas_dim)
|
|||||||
u8 p_r = bmp.buffer[offset+2];
|
u8 p_r = bmp.buffer[offset+2];
|
||||||
u8 p_a = bmp.buffer[offset+3];
|
u8 p_a = bmp.buffer[offset+3];
|
||||||
|
|
||||||
abuf.data[offset .. offset+4] = [DeMultiply(p_r, p_a), DeMultiply(p_b, p_a), DeMultiply(p_g, p_a), p_a];
|
atlas.data[offset .. offset+4] = [DeMultiply(p_r, p_a), DeMultiply(p_b, p_a), DeMultiply(p_g, p_a), p_a];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
@ -219,7 +205,7 @@ CreateAtlas(Arena* arena, FontFace font, u32 size, UVec2 atlas_dim)
|
|||||||
x = max_w + c;
|
x = max_w + c;
|
||||||
u64 offset = (y*atlas_dim.y + x) * 4;
|
u64 offset = (y*atlas_dim.y + x) * 4;
|
||||||
|
|
||||||
abuf.data[offset .. offset+4] = [255, 255, 255, bits & 0x80 ? 255 : 0];
|
atlas.data[offset .. offset+4] = [255, 255, 255, bits & 0x80 ? 255 : 0];
|
||||||
bits <<= 1;
|
bits <<= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -237,7 +223,7 @@ CreateAtlas(Arena* arena, FontFace font, u32 size, UVec2 atlas_dim)
|
|||||||
x = max_w + c;
|
x = max_w + c;
|
||||||
u64 offset = (y*atlas_dim.y + x) * 4;
|
u64 offset = (y*atlas_dim.y + x) * 4;
|
||||||
|
|
||||||
abuf.data[offset .. offset+4] = [255, 255, 255, bmp.buffer[r*bmp.pitch + c]];
|
atlas.data[offset .. offset+4] = [255, 255, 255, bmp.buffer[r*bmp.pitch + c]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
@ -246,7 +232,7 @@ CreateAtlas(Arena* arena, FontFace font, u32 size, UVec2 atlas_dim)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Glyph* g = abuf.atlas.glyphs.ptr + char_code;
|
Glyph* g = atlas.glyphs.ptr + char_code;
|
||||||
|
|
||||||
f32 height = glyph.metrics.height >> 6;
|
f32 height = glyph.metrics.height >> 6;
|
||||||
f32 width = glyph.metrics.width >> 6;
|
f32 width = glyph.metrics.width >> 6;
|
||||||
@ -271,7 +257,7 @@ CreateAtlas(Arena* arena, FontFace font, u32 size, UVec2 atlas_dim)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return abuf;
|
return atlas;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user