struct v2 { int x; int y; }; struct v2u32 { u32 x; u32 y; }; struct v2f { f32 x; f32 y; }; struct line { struct v2f a; struct v2f b; }; struct line_contour { int ncontours; int from[MAX_CONTOURS]; struct line *data; }; struct intersection { f32 x; int dir; }; enum rgb_channel { RED = 0x000000FF, GREEN = 0x0000FF00, BLUE = 0x00FF0000, }; struct font_buffer { u8 *data; u64 offset; u64 size; }; struct font_directory { u32 cmap_offset; u32 head_offset; u32 hhea_offset; u32 loca_offset; u32 glyf_offset; u32 hmtx_offset; u32 maxp_offset; u32 post_offset; u32 cvt_offset; u32 cvt_size; u32 prep_offset; u32 prep_size; u32 fpgm_offset; u32 fpgm_size; }; union glyph_flag { struct { u8 on_curve : 1; u8 x_short : 1; u8 y_short : 1; u8 repeat : 1; u8 x_short_pos : 1; u8 y_short_pos : 1; u8 reserved1 : 1; u8 reserved2 : 1; }; u8 flag; }; enum compund_glyph_flag { ARG_1_AND_2_ARE_WORDS = 0x1, ARGS_ARE_XY_VALUES = 0x2, ROUND_XY_TO_GRID = 0x4, WE_HAVE_A_SCALE = 0x8, MORE_COMPONENTS = 0x20, WE_HAVE_AN_X_AND_Y_SCALE = 0x40, WE_HAVE_A_TWO_BY_TWO = 0x80, WE_HAVE_INSTRUCTIONS = 0x100, USE_MY_METRICS = 0x200, OVERLAP_COMPOUND = 0x400 }; struct maxp_table { u16 max_component_points; u16 max_component_contours; u16 max_storage; u16 max_fdefs; }; struct head_table { int itl_format; int units_per_em; }; struct hhea_table { int ascent; int descent; int line_gap; int max_advance; }; struct glyph_point { s16 x; s16 y; bool on_curve; }; struct glyph_segment { bool is_curve; struct v2f p0; struct v2f p1; struct v2f p2; }; struct glyph { s16 xmin, ymin; s16 xmax, ymax; s32 baseline; u16 advance; s16 lsb; u16 ncontours; u16 *end_pts_of_contours; struct glyph_point *points; }; struct ttf_font { struct font_buffer file; struct maxp_table maxp; struct head_table head; struct hhea_table hhea; s16 *cvt; int cmap_format; int is_monospace; struct font_directory dir; struct ttf_function *functions; u32 *storage; char *name; };