#pragma once // TrueType outlines, as a font provider for include/text.h. // // Scope, and why it is this and not "TTF and OTF": // // .ttf and .otf are both sfnt containers -- the same table directory, the same // cmap, the same hmtx. What differs is how outlines are stored. TrueType puts // quadratic B-spline contours in a `glyf` table; OpenType/PostScript puts cubic // béziers in a `CFF ` table encoded as Type 2 charstrings, which is a // stack-based interpreted format and a separate project. // // Checked before writing any of it: JetBrains Mono and Roboto -- the two fonts // this system is going to use -- both ship `glyf` and neither ships `CFF `. So // CFF support would buy nothing today, and the honest thing is to implement the // format the fonts actually use and say so, rather than half-implement two. // // Everything here is from Apple's TrueType Reference Manual and the OpenType // specification, both public documents. struct ttf { const unsigned char *data; uint32 len; uint32 glyf, glyf_len; uint32 loca, loca_len; uint32 cmap4; // offset of the format 4 subtable, 0 if none uint32 hmtx; int num_glyphs; int num_hmetrics; int units_per_em; int long_loca; // indexToLocFormat: 0 = 16-bit offsets, 1 = 32 int ascent, descent; // Rasterisation target size, in pixels per em. Set by ttf_open. int px; }; // Parse a font already in memory. Returns 0, or -1 if it is not a TrueType // font this can read. `data` must outlive the struct -- nothing is copied. int ttf_open(struct ttf *, const void *data, uint32 len, int pixels_per_em); // Rasterise one codepoint into `cov`. Returns 0, or -1 if the font has no such // glyph or it will not fit. Exposed because the host harness uses it directly. int ttf_render(struct ttf *, uint32 cp, struct glyph *out, unsigned char *cov, int covcap, int *ox, int *oy); // A font provider over it, for text.h. The struct must outlive the font. struct font *ttf_font(struct ttf *);