4coder/4ed_font.h

155 lines
4.1 KiB
C

/*
* Mr. 4th Dimention - Allen Webster
*
* 11.03.2017
*
* Font system interface.
*
*/
// TOP
#if !defined(FCODER_FONT_H)
#define FCODER_FONT_H
// NOTE(allen): A description of an available font.
struct Font_Loadable_Stub{
b32 load_from_path;
i32 len;
char name[256];
};
struct Font_Loadable_Description{
b32 valid;
Font_Loadable_Stub stub;
i32 display_len;
char display_name[64];
};
// NOTE(allen): Settings that the are specified that determine how a font should be loaded and rendered.
struct Font_Settings{
Font_Loadable_Stub stub;
i32 pt_size;
b32 use_hinting;
};
// NOTE(allen): Results about the font true for the entire font as a whole.
struct Font_Metrics{
i32 name_len;
char name[256];
i32 height;
i32 ascent;
i32 descent;
i32 line_skip;
i32 advance;
f32 byte_advance;
f32 sub_advances[3];
};
// NOTE(allen): The pages of glyph data.
#define GLYPHS_PER_PAGE 256
struct Glyph_Bounds{
f32 x0, x1;
f32 y0, y1;
f32 xoff, yoff;
f32 xoff2, yoff2;
};
global_const Glyph_Bounds null_glyph_bounds = {0};
struct Glyph_Page{
u32 page_number;
b32 has_layout;
f32 advance[GLYPHS_PER_PAGE];
Glyph_Bounds glyphs[GLYPHS_PER_PAGE];
i32 tex_width, tex_height;
b32 has_gpu_setup;
u32 gpu_tex;
};
#define FONT_PAGE_EMPTY ((Glyph_Page*)0)
#define FONT_PAGE_DELETED ((Glyph_Page*)(1))
#define FONT_PAGE_MAX 0x1100
struct Font_Page_Storage{
Glyph_Page **pages;
u32 page_count;
u32 page_max;
// Hack optimizations
struct Page_Cache{
u32 page_number;
Glyph_Page *page;
};
Page_Cache cache[16];
};
// NOTE(allen): Types of refernces fonts.
struct Font_Pointers{
b32 valid;
Font_Settings *settings;
Font_Metrics *metrics;
Font_Page_Storage *pages;
};
typedef u32 Font_ID;
// NOTE(allen): Platform layer calls - implemented in a "font provider"
#define Sys_Font_Get_Loadable_Count_Sig(n) i32 (n)(void)
typedef Sys_Font_Get_Loadable_Count_Sig(Font_Get_Loadable_Count_Function);
#define Sys_Font_Get_Loadable_Sig(n,i,o) void (n)(i32 i, Font_Loadable_Description *o)
typedef Sys_Font_Get_Loadable_Sig(Font_Get_Loadable_Function, index, out);
#define Sys_Font_Load_New_Font_Sig(n,s) Font_ID (n)(Font_Loadable_Stub *s)
typedef Sys_Font_Load_New_Font_Sig(Font_Load_New_Font_Function, stub);
#define Sys_Font_Change_Settings_Sig(n,id,s) b32 (n)(Font_ID id, Font_Settings *s)
typedef Sys_Font_Change_Settings_Sig(Font_Change_Settings_Function, font_id, new_settings);
#define Sys_Font_Get_Largest_ID_Sig(n) Font_ID (n)(void)
typedef Sys_Font_Get_Largest_ID_Sig(Font_Get_Largest_ID_Function);
#define Sys_Font_Get_Count_Sig(n) i32 (n)(void)
typedef Sys_Font_Get_Count_Sig(Font_Get_Count_Function);
#define Sys_Font_Get_Name_By_ID_Sig(n, font_id, out, cap) i32 (n)(Font_ID font_id, char *out, u32 cap)
typedef Sys_Font_Get_Name_By_ID_Sig(Font_Get_Name_By_ID_Function, font_id, out, cap);
#define Sys_Font_Get_Pointers_By_ID_Sig(n, font_id) Font_Pointers (n)(Font_ID font_id)
typedef Sys_Font_Get_Pointers_By_ID_Sig(Font_Get_Pointers_By_ID_Function, font_id);
#define Sys_Font_Load_Page_Sig(n,s,m,p,pn) void (n)(Font_Settings *s, Font_Metrics *m, Glyph_Page *p, u32 pn)
typedef Sys_Font_Load_Page_Sig(Font_Load_Page_Function, settings, metrics, page, page_number);
#define Sys_Font_Allocate_Sig(n,size) void* (n)(i32 size)
typedef Sys_Font_Allocate_Sig(Font_Allocate_Function,size);
#define Sys_Font_Free_Sig(n,ptr) void (n)(void *ptr)
typedef Sys_Font_Free_Sig(Font_Free_Function,ptr);
struct Font_Functions{
Font_Get_Loadable_Count_Function *get_loadable_count;
Font_Get_Loadable_Function *get_loadable;
Font_Load_New_Font_Function *load_new_font;
Font_Change_Settings_Function *change_settings;
Font_Get_Largest_ID_Function *get_largest_id;
Font_Get_Count_Function *get_count;
Font_Get_Name_By_ID_Function *get_name_by_id;
Font_Get_Pointers_By_ID_Function *get_pointers_by_id;
Font_Load_Page_Function *load_page;
Font_Allocate_Function *allocate;
Font_Free_Function *free;
};
#endif
// BOTTOM