#define HB_WASM_INTERFACE(ret_t, name) __attribute__((export_name(#name))) ret_t name #include extern "C" { void abort (); void debugprint (const char *s); void debugprint1 (const char *s, int32_t); void debugprint2 (const char *s, int32_t, int32_t); } bool_t shape (void *shape_plan, font_t *font, buffer_t *buffer, const feature_t *features, uint32_t num_features) { face_t *face = font_get_face (font); blob_t blob = BLOB_INIT; if (!face_copy_table (face, TAG ('c','m','a','p'), &blob)) abort (); debugprint1 ("cmap length", blob.length); blob_free (&blob); buffer_contents_t contents = BUFFER_CONTENTS_INIT; if (!buffer_copy_contents (buffer, &contents)) return false; debugprint1 ("buffer length", contents.length); for (unsigned i = 0; i < contents.length; i++) { char name[64]; font_glyph_to_string (font, contents.info[i].codepoint, name, sizeof (name)); debugprint (name); contents.info[i].codepoint = font_get_glyph (font, contents.info[i].codepoint, 0); contents.pos[i].x_advance = font_get_glyph_h_advance (font, contents.info[i].codepoint); glyph_outline_t outline; font_copy_glyph_outline (font, contents.info[i].codepoint, &outline); debugprint1 ("num outline contours", outline.n_contours); } bool_t ret = buffer_set_contents (buffer, &contents); buffer_contents_free (&contents); return ret; }