An x86-64 operating system built from xv6, now largely rewritten: SMP, a copy-on-write root filesystem (SchFS), PCI/USB/virtio drivers, a TTF rasteriser, and a Linux-numbered syscall ABI. No history before this point -- the tree was never under version control. This commit exists so the rename that follows has something to undo to.
49 lines
2 KiB
C
49 lines
2 KiB
C
#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 *);
|