diff options
Diffstat (limited to 'text/layout.h')
| -rw-r--r-- | text/layout.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/text/layout.h b/text/layout.h new file mode 100644 index 0000000..9282536 --- /dev/null +++ b/text/layout.h @@ -0,0 +1,38 @@ +#ifndef VEGA_LAYOUT_H +#define VEGA_LAYOUT_H +#include "shape.h" + +/* A paragraph set into lines (docs/design/004-text.md): its bidi levels + * (UAX #9), lines broken where UAX #14 allows and they fit (spaces at a + * line's end hang past it), and each line's runs (one level, one script) + * shaped and put in visual order. Positions are in the font's units: x + * from the paragraph's left edge, y up from the line's baseline. */ +typedef struct { + uint32_t glyph; /* the font's: its symbol is VEGA_GLYPH_SYMBOLS + glyph */ + uint32_t cluster; /* the paragraph index of the first character it came from */ + int32_t x, y, advance; +} VegaPlaced; +typedef struct { + size_t first, count; /* its glyphs, left to right */ + size_t start, end; /* the characters it holds, [start, end) */ + int32_t left, width; /* where it starts and how far what shows goes */ +} VegaLine; +typedef struct { + VegaLine *lines; + size_t line_count; + VegaPlaced *glyphs; + size_t glyph_count; + int level; /* the paragraph's: odd is right to left, and its lines align right */ + int32_t width; /* the widest line's */ + /* what setting the paragraph works in, kept for the next */ + void *work; + size_t work_size, lines_allocated, glyphs_allocated; +} VegaLayout; + +/* Set count characters in lines of at most width (0: no limit) with the + * font's shaping; direction is VEGA_BIDI_AUTO, _LTR or _RTL. The layout + * holds the result until it is set again; false without memory. */ +bool vega_layout(VegaLayout *, VegaShaper *, const VegaShaping *, const uint32_t *codes, size_t count, int direction, + int32_t width); +void vega_layout_free(VegaLayout *); +#endif |
