power_play/src/glyph_cache/glyph_cache.h

164 lines
2.8 KiB
C

////////////////////////////////////////////////////////////
//~ Key types
Struct(GC_FontKey)
{
ResourceKey r;
};
////////////////////////////////////////////////////////////
//~ Atlas types
Struct(GC_Atlas)
{
GC_Atlas *next;
Vec2I32 dims;
G_ResourceHandle tex;
G_Texture2DRef tex_ref;
Vec2I32 cur_pos;
i32 cur_row_height;
};
////////////////////////////////////////////////////////////
//~ Glyph types
Struct(GC_GlyphDesc)
{
GC_FontKey font;
f32 font_size;
u32 codepoint;
};
Struct(GC_Glyph)
{
GC_Glyph *next;
GC_GlyphDesc desc;
u64 hash;
Atomic64 async_copy_completion_target;
/* Font info */
f32 font_size;
f32 font_ascent;
f32 font_descent;
f32 font_cap;
/* Layout info */
f32 advance;
Rng2 bounds;
/* Atlas info */
GC_Atlas *atlas;
Rng2I32 tex_slice;
Rng2 tex_slice_uv;
};
Struct(GC_GlyphBin)
{
GC_Glyph *first;
};
////////////////////////////////////////////////////////////
//~ Run types
Struct(GC_RunRect)
{
Rng2 bounds; /* Visual bounds in relation to the baseline */
f32 baseline_pos; /* Horizontal distance from start of baseline */
f32 advance;
G_Texture2DRef tex;
Rng2I32 tex_slice;
Rng2 tex_slice_uv;
};
Struct(GC_Run)
{
/* Run data */
Rng2 bounds; /* Visual bounds of the run in relation to the baseline */
f32 baseline_length;
u64 rects_count;
GC_RunRect *rects;
/* Font info */
f32 font_size;
f32 font_ascent;
f32 font_descent;
f32 font_cap;
b32 ready;
};
////////////////////////////////////////////////////////////
//~ Cmd types
Struct(GC_Cmd)
{
GC_Glyph *glyph;
/* Async temporary data */
TTF_GlyphResult rasterized;
};
Struct(GC_CmdNode)
{
GC_CmdNode *next;
GC_Cmd cmd;
};
////////////////////////////////////////////////////////////
//~ Context types
Struct(GC_AsyncCtx)
{
struct
{
u64 count;
GC_Cmd *v;
} cmds;
};
Struct(GC_Ctx)
{
Mutex glyphs_mutex;
GC_GlyphBin glyph_bins[16384];
u64 atlases_count;
GC_Atlas *first_atlas;
struct
{
Mutex mutex;
u64 count;
GC_CmdNode *first;
GC_CmdNode *last;
GC_CmdNode *first_free;
} submit;
GC_AsyncCtx async_ctx;
};
extern GC_Ctx GC;
////////////////////////////////////////////////////////////
//~ Bootstrap
void GC_Bootstrap(void);
////////////////////////////////////////////////////////////
//~ Key helpers
GC_FontKey GC_FontKeyFromResource(ResourceKey resource);
u64 GC_HashFromGlyphDesc(GC_GlyphDesc desc);
////////////////////////////////////////////////////////////
//~ Run
GC_Run GC_RunFromString(Arena *arena, String str, GC_FontKey font, f32 font_size);
////////////////////////////////////////////////////////////
//~ Async
void GC_TickAsync(WaveLaneCtx *lane, AsyncTickCtx *ctx);