diff options
Diffstat (limited to 'gfx/harfbuzz/src/wasm/sample/c/shape-fallback.cc')
-rw-r--r-- | gfx/harfbuzz/src/wasm/sample/c/shape-fallback.cc | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/gfx/harfbuzz/src/wasm/sample/c/shape-fallback.cc b/gfx/harfbuzz/src/wasm/sample/c/shape-fallback.cc new file mode 100644 index 0000000000..7787bbae7a --- /dev/null +++ b/gfx/harfbuzz/src/wasm/sample/c/shape-fallback.cc @@ -0,0 +1,60 @@ +#define HB_WASM_INTERFACE(ret_t, name) __attribute__((export_name(#name))) ret_t name + +#include <hb-wasm-api.h> + +extern "C" { +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; + face_copy_table (face, TAG ('c','m','a','p'), &blob); + + 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); + + glyph_outline_t outline = GLYPH_OUTLINE_INIT; + + for (unsigned i = 0; i < contents.length; i++) + { + char name[64]; + + debugprint1 ("glyph at", i); + + 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); + + font_copy_glyph_outline (font, contents.info[i].codepoint, &outline); + debugprint1 ("num outline points", outline.n_points); + debugprint1 ("num outline contours", outline.n_contours); + } + + glyph_outline_free (&outline); + + bool_t ret = buffer_set_contents (buffer, &contents); + + buffer_contents_free (&contents); + + return ret; +} |